K7

Self-hosted media server for movies, series and music, for family and friends

  • ghcr.io/hsinghhira/k7:latest
  • v1.17.2
  • Updated 7 Nov 2026
  • port 6186
  • amd64 · arm64
  • Media
  • 344 stars

Screenshots

K7 screenshot 1: HomeK7 screenshot 2: Movie detailsK7 screenshot 3: MoviesK7 screenshot 4: SeriesK7 screenshot 5: Music albumK7 screenshot 6: Explore

Open the app

Web App

http://localhost:6186/

About K7

K7 is a media server you host yourself, like Plex, Jellyfin or Emby, made for a small circle of family and friends. Watch your movies and series and play your music in the browser, on Android and Android TV, Windows, iOS and Mac. This is K7 in a single container, with PostgreSQL inside, one port and one data folder. Secret keys and the admin account are made for you on first start.

Features

  • Movies, series and music libraries with artwork and editable details
  • Transcoding with ffmpeg, with Intel and AMD hardware acceleration when the box has a GPU
  • Playlists, smart playlists, collections, history and statistics
  • Sync Play, shared profiles, remote control and Chromecast
  • Two-factor sign-in, guest mode and optional OIDC single sign-on
  • Works with OpenSubsonic music apps
  • Import from Plex, Jellyfin and Spotify; share with friends' K7 servers (federation)

How to use

  1. Open K7 from your dashboard.
  2. Sign in with the admin user name and password.
  3. Go to Administration, Content, Library, New library. Pick a folder under /media.

Before you install

Put your movies, series and music in /DATA/Media (in folders like Movies, Series and Music), or change the /media folder in the app settings to where they are. Leave ADMIN_PASSWORD blank to get a random one, shown in the app log as "admin password is", or type your own with 10 or more characters, an uppercase letter, a lowercase letter and a number. Watching works from every device with the default PUBLIC_URL; for OIDC sign-in or federation, set it to http://[ZIMAOS-IP-ADDRESS]:6186, like http://192.168.1.20:6186, or your https address. Every other setting is optional and listed in the Variables tab. To use one, add it in the app settings with your value; a setting you leave out keeps its default. The first start takes about 3 minutes. Hardware transcoding works on its own when the box has an Intel or AMD GPU; check it in Administration, Transcoding.

The settings in the first table are already in the app settings. To use any other one, open the app settings, add the variable with your value, save, and the app restarts with it. A setting you leave out uses its default.

In the app settings

VariableDefault valueDescription
TZ$TZYour time zone. It is filled in from your ZimaOS time zone. Leave it unless you need another.
PUID$PUIDThe user that reads your media files. It is filled in by ZimaOS. Leave it unless your media folder belongs to another user.
PGID$PGIDThe group that reads your media files. It is filled in by ZimaOS. Leave it unless your media folder belongs to another group.
PUBLIC_URLhttp://localhost:6186The address of K7. Watching works from every device with the default. For sign-in with OIDC or sharing with other K7 servers, change it to http://[ZIMAOS-IP-ADDRESS]:6186 or your https address. Keep the port at 6186.
ADMIN_USERNAMEadminThe user name of the admin account made on first start.
ADMIN_PASSWORD—The admin password, used only on first start. Leave it blank and the app makes a random one, shown in the app log and saved in the data folder. Your own needs 10 or more characters with an uppercase letter, a lowercase letter and a number. Change it later in K7's account settings.

Sign-up and accounts

VariableDefault valueDescription
ADMIN_EMAIL—An email for the admin account made on first start. Leave it out to make the admin without an email.
Authentication__Local__RegistrationEnabledfalseSet to true to let anyone make an account at /sign-up. Otherwise the admin adds users.
Authentication__Local__SignInEnabledtrueSet to false to turn off user name and password sign-in, so people sign in with OIDC only. Turn on OIDC first.

Sign in with OIDC

VariableDefault valueDescription
Authentication__Oidc__EnabledfalseSet to true to sign in with Authentik, Pocket ID, Authelia, Keycloak or another OIDC server. Set PUBLIC_URL to your real address first.
Authentication__Oidc__Authority—The issuer URL of your OIDC server, like https://auth.example.com/application/o/k7/.
Authentication__Oidc__ClientId—The client ID from your OIDC server.
Authentication__Oidc__ClientSecret—The client secret from your OIDC server. Its redirect URI is PUBLIC_URL followed by /api/authentication/callback/login/oidc.
Authentication__Oidc__Scopesopenid,profileScopes asked from the OIDC server, separated by commas.
Authentication__Oidc__DisplayName—The text on the sign-in button, like Authentik.
Authentication__Oidc__AutomaticAccountCreationtrueSet to false so only people who already have a K7 account can sign in with OIDC.
Authentication__Oidc__WebSessionLifetime7.00:00:00How long an OIDC sign-in lasts in the browser, as days.hours:minutes:seconds.

Server

VariableDefault valueDescription
Server__Name—A name for this server, shown in federation invites and in link previews.
Security__ForceHttpsfalseSet to true when K7 is only used through an https reverse proxy. Keep false for http:// addresses, or sign-in fails.
Security__TrustPrivateProxiestrueSet to false to stop trusting reverse proxies on private networks. Then list them in Security__KnownProxies__0, __1 and so on.
Security__KnownProxies__0—The IP or network of a reverse proxy to trust, like 10.0.0.5 or 172.16.0.0/12. Add more as Security__KnownProxies__1 and so on.
AllowedHosts*The host names K7 answers to, separated by semicolons. * answers to all.
Cors__Origins__0—Another web address allowed to call K7's API. Only needed when the web client is hosted somewhere else.

Federation

VariableDefault valueDescription
Security__Federation__AllowInsecurePeerHttpfalseSet to true to share with other K7 servers on plain http:// addresses.
Security__Federation__BlockPrivatePeerUrlsfalseSet to true to refuse K7 servers on private network addresses.

Logs

VariableDefault valueDescription
Serilog__MinimumLevel__DefaultWarningHow much K7 writes to its log: Debug, Information, Warning or Error.
OTEL_EXPORTER_OTLP_ENDPOINT—An OpenTelemetry collector address to send logs and metrics to.
docker-compose.yml
name: k7

services:
  k7:
    image: ghcr.io/hsinghhira/k7:latest
    container_name: k7
    restart: unless-stopped
    stop_grace_period: 90s
    privileged: true
    environment:
      - TZ=$TZ
      - PUID=$PUID
      - PGID=$PGID
      - PUBLIC_URL=http://localhost:6186
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=
    ports:
      - target: 8080
        published: "6186"
        protocol: tcp
    volumes:
      - type: bind
        source: /DATA/AppData/$AppID/data
        target: /data
        bind:
          create_host_path: true
      - type: bind
        source: /DATA/Media
        target: /media
        bind:
          create_host_path: true
    healthcheck:
      test: ["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1:8080/alive"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 180s
    deploy:
      resources:
        limits:
          cpus: "4.00"
          memory: 4096M
        reservations:
          cpus: "0.25"
          memory: 512M
    labels:
      icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/icon.png
    x-casaos:
      id: com.icestore.k7
      envs:
        - container: TZ
          description:
            en_US: >-
              Your time zone. It is filled in from your ZimaOS time zone.
              Leave it unless you need another.
        - container: PUID
          description:
            en_US: >-
              The user that reads your media files. It is filled in by
              ZimaOS. Leave it unless your media folder belongs to another
              user.
        - container: PGID
          description:
            en_US: >-
              The group that reads your media files. It is filled in by
              ZimaOS. Leave it unless your media folder belongs to another
              group.
        - container: PUBLIC_URL
          description:
            en_US: >-
              The address of K7. Watching works from every device with the
              default. For sign-in with OIDC or sharing with other K7
              servers, change it to http://[ZIMAOS-IP-ADDRESS]:6186 or your
              https address. Keep the port at 6186.
        - container: ADMIN_USERNAME
          description:
            en_US: >-
              The user name of the admin account made on first start.
        - container: ADMIN_PASSWORD
          description:
            en_US: >-
              The admin password, used only on first start. Leave it blank
              and the app makes a random one, shown in the app log and saved
              in the data folder. Your own needs 10 or more characters with
              an uppercase letter, a lowercase letter and a number. Change it
              later in K7's account settings.
      ports:
        - container: "8080"
          description:
            en_US: K7 web app, API and video streams, published on host as 6186
      volumes:
        - container: /data
          description:
            en_US: >-
              The database, K7 settings and keys, artwork, logs and the
              transcoding cache.
        - container: /media
          description:
            en_US: >-
              Your movies, series and music. Point it at the folder that holds
              them, like /DATA/Media with Movies, Series and Music inside.

x-casaos:
  id: com.icestore.k7
  architectures:
    - amd64
    - arm64
  main: k7
  author: HSinghHira
  category: Media
  developer: kaybi-gh
  icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/icon.png
  thumbnail: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-1.png
  screenshot_link:
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-1.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-2.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-3.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-4.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-5.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/k7/screenshot-6.png
  title:
    en_US: K7
  tagline:
    en_US: Self-hosted media server for movies, series and music, for family and friends
  description:
    en_US: >-
      K7 is a media server you host yourself, like Plex, Jellyfin or Emby,
      made for a small circle of family and friends. Watch your movies and
      series and play your music in the browser, on Android and Android TV,
      Windows, iOS and Mac. This is K7 in a single container, with
      PostgreSQL inside, one port and one data folder. Secret keys and the
      admin account are made for you on first start.


      **Features**


      - Movies, series and music libraries with artwork and editable
        details

      - Transcoding with ffmpeg, with Intel and AMD hardware acceleration
        when the box has a GPU

      - Playlists, smart playlists, collections, history and statistics

      - Sync Play, shared profiles, remote control and Chromecast

      - Two-factor sign-in, guest mode and optional OIDC single sign-on

      - Works with OpenSubsonic music apps

      - Import from Plex, Jellyfin and Spotify; share with friends' K7
        servers (federation)


      **How to use?**


      1. Open K7 from the Zima OS dashboard.

      2. Sign in with the admin user name and password.

      3. Go to Administration, Content, Library, New library. Pick a folder
         under /media.
  tips:
    before_install:
      en_US: >-
        1. Put your movies, series and music in /DATA/Media, in folders like
           Movies, Series and Music. Or change the /media folder in the app
           settings to where they are.


        2. Leave ADMIN_PASSWORD blank to get a random one. Or type your own,
           with 10 or more characters, an uppercase letter, a lowercase
           letter and a number.


        3. Leave PUBLIC_URL as it is to watch on your home network. For OIDC
           sign-in or sharing with friends' K7 servers, set it to
           http://[ZIMAOS-IP-ADDRESS]:6186, like http://192.168.1.20:6186.


        4. More settings, like sign-up, OIDC and log level, are listed on the
           K7 page at https://icestore.hsinghhira.me/app/k7/ (Variables tab).
           You can add them now or later in the app settings.


        5. Start the installation.


        6. Wait about 3 minutes for K7 to start the first time.


        7. If you left ADMIN_PASSWORD blank, open the app log. Find the box marked CREDENTIALS.


        8. Open K7 from the Zima OS dashboard and sign in as admin.


        9. Go to Administration, Content, Library, New library. Pick a folder
           under /media.


        10. To check hardware transcoding, go to Administration, Transcoding
            and run the encoder test.
  index: /
  port_map: "6186"
  scheme: http
  is_uncontrolled: false
  version: "1.17.2"
  update_at: "2026-11-07"
  release_notes:
    en_US: |-
      - Single-container K7 with one port (6186) and one data folder
      - Secret keys and the first admin are made on first start, so each install gets its own
      - PostgreSQL 18 inside; your media folder is mounted at /media
      - ghcr.io/kaybi-gh/k7 1.17.2
  repo: "https://github.com/kaybi-gh/K7"
  support: "https://github.com/kaybi-gh/K7/issues"
  docs: "https://github.com/kaybi-gh/K7/tree/main/docs"

Install K7

Something not working with K7?

Report it so it gets fixed, or ask for an app that is not here yet.

More Media apps

See all