K7 is a self-hosted media server for a small circle of family and friends.
The name comes from the French pronunciation /ka.sɛt/ (cassette). The idea is to bring back that feeling of a shelf at home: audio tapes, VHS, everything yours and local.
More screenshots: screenshots/README.md.
Access the live demo here. Only guest login is available, so features that require a full account are not accessible.
cp .env.example .env # set POSTGRES_PASSWORD
docker compose up -d # pulls ghcr.io/kaybi-gh/k7:latestOpen http://localhost:7080 and complete first-run setup. Install details: docs/admin/install.md.
Core
- Open source (AGPL-3.0) - your server, your rules, no vendor lock-in
- Simple to deploy - no complex stack required
- Movies, TV series, and music - one shelf for everything you already own locally (more types may come)
- Local auth + optional 2FA + optional OIDC - works offline at home, plug in your identity provider when you need SSO
- Guest mode - optional limited access without a personal account (admin-controlled)
- Transcoding (ffmpeg, HLS) - play anywhere, even when the client or network cannot handle the original file
- Federation - link two K7 instances (yours and a friend's) to share and stream remote media and metadata without duplicating files
Clients
- Web, Android (phone + TV), Windows, iOS, Mac - same UI everywhere (Blazor WASM or MAUI + Blazor)
- Fully keyboard-navigable - spatial navigation across the whole app
- Remote control - drive playback on one device (TV, phone, browser) from another logged-in client on the same server
- Chromecast (Web and Android only) - cast video and music to any supported device
- OpenSubsonic - connect apps like Symfonium or Feishin with an app password (Settings -> External clients)
- iOS and Mac builds exist but are not tested by the maintainer (no Apple hardware)
Personalization
- Server-wide defaults - the admin can set default values for almost all customization (home layout, video player, playback, track selection, and more); each user can override them in their own settings
- Custom home page - pin what matters to you instead of a one-size-fits-all dashboard
- Global media filters - hide content you never want to see, across the whole app
- Playback preferences - quality, subtitles, intro skip, seekbar thumbnails, and more, so each viewing session feels right
- Library and profile restrictions - fine-tune who can access what beyond simple sharing rules
- Editable metadata with field locks - fix or override titles, descriptions and more, lock individual fields so metadata refreshes do not overwrite your changes
Your space
- Playlists, collections, history, stats, reviews - one place for "your" corner of the shelf, not buried in admin screens
- Dynamic playlists - rule-based lists (genre, year, play count, artist, and more) that re-evaluate as your library grows, like a mixtape that updates itself
- Offline downloads - take media on native clients and sync progress when you are back online
Music discovery (AudioMuse AI)
- Optional integration with self-hosted AudioMuse AI - mood radios, similar tracks, sonic paths, and playlists built from a text prompt, plus natural-language search in the library
- Keeps AI-assisted discovery on infrastructure you control; disabled by default until you connect your AudioMuse server
Social
- Sync Play - watch or listen together remotely, as if you were on the same couch
- Shared profiles - follow a series as a couple (or any group) with merged stats and history on each account
- Visibility controls - separate what you share and what you accept to see, per content type (playback history, reviews, collections, playlists, dynamic playlists) from and to whoever you want: nobody, your local server, federated servers, specific people
Administration
- Dashboard, diagnostics, background tasks - see what the server is doing without SSH
- Outgoing notifications - customizable webhook rules (event filters, payload templates) to plug K7 into your own tools
- Import tool - migrate from Plex, Jellyfin, Spotify, and more (tools/K7.Import)
All guides (users, admins, developers): docs/README.md.
This project was built for my own specific needs. While I think it could benefit some people, making it free and open source does not mean I will work on every feature request.
Contributions are welcome:
- Issues - bugs (not security reports; see SECURITY.md)
- Discussions - ideas, feature requests, and questions
- Pull requests - opening a PR does not guarantee a merge
Please read CONTRIBUTING.md for guidelines and to start contributing.
Be respectful and constructive. Harassment and bad-faith behavior are not tolerated. Maintainers may close or remove contributions that violate this.
While a simple thank you is more than enough, I do accept donations. If K7 is useful to you and you feel like chipping in, the Sponsor button on this repository is the simplest way to do that.
K7 also relies on many other open source projects and communities listed below, many of them welcome donations too.
K7 would not exist without the work of many projects and communities, including:
- FFmpeg - transcoding and media processing
- LibVLC - Windows Direct Play video decoding
- OpenIddict - authentication and OIDC
- AudioMuse AI - optional music intelligence
- MusicBrainz - music metadata
- TMDb - movie metadata
- TheTVDB - TV series metadata
- Wikimedia Commons, Wikidata, and Wikipedia - artist images and person metadata
- Chromaprint / AcoustID - audio fingerprinting
- TagLibSharp - reading and writing media tags
- Phosphor Icons - UI icons
See the in-app About page for a fuller list of credits.
K7 is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). If you modify K7 and provide it over a network, you must share your changes under the same license.