Skip to main content
Integrations connect Homarr to your services, enabling widgets to display real-time data and provide interactive controls. Homarr supports over 50 integrations across categories like media management, system monitoring, network security, and more.

How Integrations Work

Integrations in Homarr provide a secure bridge between your boards and external services:
  1. Create Integration: Configure connection details and credentials
  2. Test Connection: Verify connectivity and authentication
  3. Assign to Widgets: Select which widgets can use the integration
  4. Real-Time Updates: Widgets fetch data using the integration
  5. Permission Control: Manage who can use each integration

Integration Architecture

All integrations extend a base class providing common functionality:
// From packages/integrations/src/base/integration.ts:35
abstract class Integration {
  constructor(protected integration: IntegrationInput) {}
  
  // Base properties
  public get publicIntegration() {
    return {
      id: this.integration.id,
      name: this.integration.name,
      url: this.integration.url
    };
  }
  
  // Secret management
  protected getSecretValue(kind: IntegrationSecretKind) {
    const secret = this.integration.decryptedSecrets.find(
      secret => secret.kind === kind
    );
    if (!secret) throw new Error(`No secret of kind ${kind}`);
    return secret.value;
  }
  
  // URL helpers
  protected url(path: `/${string}`) {
    return new URL(`${this.integration.url}${path}`);
  }
  
  // Connection testing
  public async testConnectionAsync(): Promise<TestingResult> {
    // Implements secure connection testing with certificate support
  }
}

Supported Integrations

Homarr supports integrations across multiple categories:

Media Management

Features:
  • Library statistics (movies, TV shows, music)
  • Recently added media
  • Active streams
  • User activity
Required Secrets:
  • Plex: API Key (X-Plex-Token)
  • Jellyfin: Username & Password OR API Key
  • Emby: API Key
Example URL:
http://plex.example.com:32400
http://jellyfin.example.com:8096
Supported Widgets:
  • Media Server
  • Media Releases
Features:
  • Request statistics
  • Pending requests
  • Request management
  • Search functionality
Required Secrets:
  • API Key
Example URL:
http://overseerr.example.com:5055
Supported Widgets:
  • Media Requests (List)
  • Media Requests (Stats)
  • Search (global search integration)
Features:
  • Release calendar
  • Missing episodes/movies
  • Queue management
  • Library statistics
Required Secrets:
  • API Key
Example URL:
http://sonarr.example.com:8989
http://radarr.example.com:7878
Supported Widgets:
  • Calendar
  • Media Server

Download Clients

Features:
  • Active downloads
  • Download/upload speeds
  • Queue management
  • Torrent controls
Required Secrets:
  • qBittorrent: Username & Password
  • Transmission: Username & Password
  • Deluge: Password
Example URL:
http://qbittorrent.example.com:8080
http://transmission.example.com:9091
Supported Widgets:
  • Downloads
Features:
  • Download queue
  • History
  • Speed statistics
  • Pause/resume controls
Required Secrets:
  • SABnzbd: API Key
  • NZBGet: Username & Password
Example URL:
http://sabnzbd.example.com:8080
http://nzbget.example.com:6789
Supported Widgets:
  • Downloads

System Monitoring

Features:
  • CPU usage
  • Memory usage
  • Disk space
  • Network statistics
  • Temperature sensors
Required Secrets:
  • Dash.: None
  • Glances: None
  • Proxmox: Username, Token ID, API Key, Realm
  • TrueNAS: Username & Password
  • Unraid: API Key
Example URL:
http://dashdot.example.com:3001
http://glances.example.com:61208
https://proxmox.example.com:8006
Supported Widgets:
  • System Resources
  • System Disks
  • Health Monitoring
Features:
  • Container status
  • Resource usage
  • Start/stop controls
  • Logs
Required Secrets:
  • Docker: Direct socket access (no secrets)
  • Coolify: API Key
Example URL:
unix:///var/run/docker.sock
http://coolify.example.com:3000
Supported Widgets:
  • Docker Containers
  • Coolify

Network & Security

Features:
  • Query statistics
  • Blocked queries
  • Top domains
  • Enable/disable filtering
Required Secrets:
  • Pi-hole: API Key (optional for read-only)
  • AdGuard Home: Username & Password
Example URL:
http://pihole.example.com
http://adguard.example.com:3000
Supported Widgets:
  • DNS Hole Summary
  • DNS Hole Controls
Features:
  • Firewall rules
  • Traffic statistics
  • System info
  • Gateway status
Required Secrets:
  • API Key
  • API Secret
Example URL:
https://opnsense.example.com
Supported Widgets:
  • Firewall
Features:
  • Connected clients
  • Network usage
  • Device status
  • Site statistics
Required Secrets:
  • Username & Password
Example URL:
https://unifi.example.com:8443
Supported Widgets:
  • Network Controller Summary
  • Network Controller Status

Development & Releases

Features:
  • Latest releases
  • Release notes
  • Download counts
  • Version tracking
Required Secrets:
  • GitHub: None (public) OR Personal Access Token OR GitHub App credentials
  • GitLab: None (public) OR Personal Access Token
  • Docker Hub: None (public) OR Username & Personal Access Token
  • NPM: None
Example URL:
https://api.github.com (default)
https://gitlab.com (default)
https://hub.docker.com (default)
https://registry.npmjs.org (default)
Supported Widgets:
  • Releases

Smart Home

Features:
  • Entity states
  • Service calls
  • Automation triggers
  • Calendar events
Required Secrets:
  • API Key (Long-Lived Access Token)
Example URL:
http://homeassistant.example.com:8123
Supported Widgets:
  • Smart Home Entity State
  • Smart Home Execute Automation
  • Calendar

Other Services

  • Prowlarr: Indexer manager statistics
  • Tdarr: Media transcoding status
  • Nextcloud: Calendar integration
  • ntfy: Notification delivery
  • iCal: Calendar feeds
  • Minecraft: Server status
  • OpenMediaVault: NAS management

Adding Integrations

Step-by-Step Setup

1

Navigate to Integrations

Go to SettingsIntegrations in the Homarr interface.
2

Select Integration Type

Click Add Integration and select the service type from the list.Integrations are organized by category:
  • Media Services
  • Download Clients
  • System Monitoring
  • Network & Security
  • And more…
3

Configure Basic Settings

Enter the basic connection information:
  • Name: Descriptive name for this integration (e.g., “Main Plex Server”)
  • URL: Base URL of the service (e.g., http://plex.example.com:32400)
  • External URL (optional): Public URL if different from internal
4

Add Secrets

Enter authentication credentials based on the integration type:
  • API Key: Single token for authentication
  • Username & Password: Credentials for login
  • Multiple Options: Some integrations support alternative auth methods
Secrets are encrypted at rest and never exposed in the UI after creation.
5

Test Connection

Click Test Connection to verify:
  • Network connectivity
  • Authentication validity
  • SSL/TLS certificate (if HTTPS)
  • API availability
See Testing Connections for troubleshooting.
6

Save Integration

Click Save to create the integration. It’s now available for use in widgets.

Integration Secrets

Homarr supports multiple secret types:
// From packages/definitions/src/integration.ts:6
const integrationSecretKindObject = {
  apiKey: { isPublic: false, multiline: false },
  username: { isPublic: true, multiline: false },
  password: { isPublic: false, multiline: false },
  tokenId: { isPublic: true, multiline: false },
  realm: { isPublic: true, multiline: false },
  personalAccessToken: { isPublic: false, multiline: false },
  topic: { isPublic: true, multiline: false },
  opnsenseApiKey: { isPublic: false, multiline: false },
  opnsenseApiSecret: { isPublic: false, multiline: false },
  url: { isPublic: false, multiline: false },
  privateKey: { isPublic: false, multiline: true },
  githubAppId: { isPublic: true, multiline: false },
  githubInstallationId: { isPublic: true, multiline: false }
};
Secret Properties:
  • isPublic: Whether the secret value is visible to users with view access
  • multiline: Whether the input should be a textarea (e.g., for private keys)
Non-public secrets are encrypted and never sent to the client. Only the server has access to decrypt them.

Testing Connections

Homarr includes comprehensive connection testing:

Test Process

// From packages/integrations/src/base/test-connection/test-connection-service.ts:38
class TestConnectionService {
  async handleAsync(testingCallbackAsync) {
    // Load trusted certificates
    const ca = await getAllTrustedCertificatesAsync();
    const checkServerIdentity = createCustomCheckServerIdentity(
      await getTrustedCertificateHostnamesAsync()
    );
    
    // Test connection with custom certificate support
    const result = await testingCallbackAsync({ ca, checkServerIdentity })
      .catch(error => {
        // Handle certificate errors specially
        if (error.cause?.type === "certificate") {
          return this.fetchCertificateAsync().then(cert => 
            TestConnectionError.CertificateResult(error.cause, cert)
          );
        }
        return TestConnectionError.FromIntegrationError(error);
      });
    
    return result;
  }
}

Test Results

✅ Connection successful
  • Network connectivity verified
  • Authentication accepted
  • API responding correctly
  • Integration ready to use

Custom Certificates

For self-signed or custom CA certificates:
  1. Navigate to SettingsCertificates
  2. Upload CA certificate or server certificate
  3. Assign to hostname
  4. Test connection again
Homarr will use the custom certificate for validation.

Integration Secrets Management

Secret Storage

Secrets are encrypted at rest using AES-256-GCM:
  1. Encryption: Secrets encrypted with master key
  2. Storage: Encrypted values stored in database
  3. Decryption: Only decrypted when needed by server
  4. Never Exposed: Secrets never sent to client

Secret Rotation

Regularly rotate integration secrets:
  1. Generate new API key/credentials in service
  2. Edit integration in Homarr
  3. Update secret values
  4. Test connection
  5. Save changes
  6. Revoke old credentials in service
Widgets automatically use updated credentials on next data fetch.

Secret Permissions

Control who can view and manage integration secrets:
  • View: See integration configuration (public secrets visible)
  • Edit: Update URL and secrets
  • Full: Complete control including deletion

Using Integrations in Widgets

Once configured, integrations can be selected when adding widgets:

Widget Integration Selection

  1. Add widget to board (edit mode)
  2. Select widget type
  3. Choose integration(s) from dropdown
  4. Configure widget options
  5. Save widget

Multiple Integrations

Some widgets support multiple integrations:
// Example: Calendar widget with multiple Sonarr/Radarr instances
integrationIds: [
  "sonarr-1",
  "sonarr-2",
  "radarr-1"
]
The widget combines data from all selected integrations.

Integration Requirements

// From widget definition (packages/widgets/src/calendar/index.ts:34)
supportedIntegrations: getIntegrationKindsByCategory("calendar"),
integrationsRequired: false
  • supportedIntegrations: List of compatible integration types
  • integrationsRequired: Whether widget requires at least one integration

Integration Permissions

Control which users can access integrations:

Permission Levels

View Access

Users can:
  • See integration name and URL
  • Use integration in widgets
  • View data from integration
Cannot:
  • Edit configuration
  • View secrets
  • Delete integration

Full Access

Users can:
  • Everything in View access
  • Edit configuration
  • Update secrets
  • Delete integration
  • Manage permissions

Granting Access

  1. Open integration settings
  2. Click Permissions
  3. Add users or groups
  4. Select permission level
  5. Save changes

Permission Inheritance

Integration permissions work with board permissions:
  • Widget shows data only if user has integration view access
  • Board permissions don’t grant integration access
  • Both board AND integration access required to view widget data

Integration Categories

// From packages/definitions/src/integration.ts:404
const integrationCategories = [
  "dnsHole",
  "mediaService",
  "calendar",
  "mediaSearch",
  "mediaRelease",
  "mediaRequest",
  "downloadClient",
  "usenet",
  "torrent",
  "miscellaneous",
  "smartHomeServer",
  "indexerManager",
  "healthMonitoring",
  "search",
  "mediaTranscoding",
  "networkController",
  "releasesProvider",
  "notifications",
  "firewall"
];
Categories help organize integrations and determine widget compatibility.

Advanced Features

External URLs

Some integrations support separate internal and external URLs:
  • Internal URL: Used by Homarr server to fetch data
  • External URL: Used by browser for direct links
Use case: Service behind reverse proxy with different internal/external addresses.

Custom Headers

Some integrations support custom HTTP headers:
  • Authentication headers
  • Custom user agents
  • Proxy headers
Configure in integration settings under Advanced.

Connection Timeouts

Configure request timeouts for slow services:
  • Default: 30 seconds
  • Configurable per integration
  • Prevents hanging requests

Troubleshooting

Check:
  • Integration type matches widget’s supported types
  • User has view access to integration
  • Integration is saved and active
Solution:
  • Verify integration category matches widget
  • Check integration permissions
  • Test connection to ensure it’s working
Check:
  • Integration connection is successful
  • Service has data to display
  • User has integration permissions
  • Widget configuration is correct
Solution:
  • Test integration connection
  • Check service logs
  • Verify API permissions
  • Review widget configuration
Check:
  • Certificate is valid
  • Hostname matches certificate
  • CA is trusted
Solution:
  • Add custom certificate
  • Use HTTP if acceptable
  • Fix certificate on service
  • Disable certificate validation (not recommended)
Check:
  • Network latency to service
  • Service response time
  • Number of widgets using integration
Solution:
  • Increase connection timeout
  • Optimize service performance
  • Reduce widget update frequency
  • Use fewer widgets per integration

Best Practices

Security

  • Use HTTPS when possible
  • Rotate secrets regularly
  • Grant minimal required permissions
  • Use service accounts, not personal accounts
  • Monitor integration usage

Organization

  • Use descriptive integration names
  • Group similar integrations
  • Document custom configurations
  • Tag integrations by environment (prod/test)
  • Archive unused integrations

Performance

  • Test connections before deploying
  • Monitor response times
  • Use internal URLs when possible
  • Limit concurrent requests
  • Cache where appropriate

Maintenance

  • Review integrations quarterly
  • Update URLs when services move
  • Remove unused integrations
  • Test after service updates
  • Keep documentation current

Next Steps

Add Widgets

Use your integrations in widgets

Configure Permissions

Set up user access to integrations

API Documentation

Integration API reference

Troubleshooting

Common integration issues

Build docs developers (and LLMs) love