{"id":29872409,"url":"https://github.com/tanq16/raikiri","last_synced_at":"2026-04-22T02:03:11.755Z","repository":{"id":305758417,"uuid":"1023857383","full_name":"Tanq16/raikiri","owner":"Tanq16","description":"No nonsense self hosted media and music server","archived":false,"fork":false,"pushed_at":"2026-04-10T05:38:54.000Z","size":47722,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-10T07:43:27.037Z","etag":null,"topics":["catppuccin","docker","go","golang","hls","homelab","image","jellyfin-alternative","markdown-renderer","media","media-server","music","music-player","music-server","self-hosted","selfhosted","spotify-alternative","streaming","tailwindcss","video"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tanq16.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-21T20:00:47.000Z","updated_at":"2026-04-10T05:33:36.000Z","dependencies_parsed_at":"2025-07-21T22:24:14.573Z","dependency_job_id":"6da413c6-0629-4618-bb80-a8d1710d1e55","html_url":"https://github.com/Tanq16/raikiri","commit_stats":null,"previous_names":["tanq16/raikiri"],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/Tanq16/raikiri","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fraikiri","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fraikiri/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fraikiri/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fraikiri/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tanq16","download_url":"https://codeload.github.com/Tanq16/raikiri/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fraikiri/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32117799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T00:31:26.853Z","status":"online","status_checked_at":"2026-04-22T02:00:05.693Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["catppuccin","docker","go","golang","hls","homelab","image","jellyfin-alternative","markdown-renderer","media","media-server","music","music-player","music-server","self-hosted","selfhosted","spotify-alternative","streaming","tailwindcss","video"],"created_at":"2025-07-30T20:11:07.032Z","updated_at":"2026-04-22T02:03:11.727Z","avatar_url":"https://github.com/Tanq16.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\".github/assets/logo.svg\" alt=\"Local Content Share Logo\" width=\"200\"\u003e\n  \u003ch1\u003eRaikiri\u003c/h1\u003e\n\n  \u003ca href=\"https://github.com/tanq16/raikiri/actions/workflows/release.yaml\"\u003e\u003cimg alt=\"Build Workflow\" src=\"https://github.com/tanq16/raikiri/actions/workflows/release.yaml/badge.svg\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://github.com/Tanq16/raikiri/releases\"\u003e\u003cimg alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/tanq16/raikiri\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://hub.docker.com/r/tanq16/raikiri\"\u003e\u003cimg alt=\"Docker Pulls\" src=\"https://img.shields.io/docker/pulls/tanq16/raikiri\"\u003e\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e\n\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e \u0026bull; \u003ca href=\"#screenshots\"\u003eScreenshots\u003c/a\u003e \u0026bull; \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e \u0026bull; \u003ca href=\"#thumbnails\"\u003eThumbnails\u003c/a\u003e \u0026bull; \u003ca href=\"#player-and-playlists\"\u003ePlayer\u003c/a\u003e\n\u003c/div\u003e\n\nA fast, simple, self-hosted, no-nonsense media server. Lightweight alternative to Jellyfin/Plex without complex metadata tagging.\n\nThe aim is to provide an elegant directory listing for images, videos, and audio. It uses folder navigation and predictable thumbnail paths for cover art, thumbnails, etc. Other files are also available to browse and can be directly downloaded.\n\n## Features\n\n- Beautiful Catppuccin Mocha themed application for modern web-based directory listing\n- Dual system with separate Media and Music modes, each with independent directory paths\n- Music navigation is folder-first (Artist → Album → Tracks) with no extra pills\n- Tracks in Music are always shown in list view without thumbnails\n- Intelligent thumbnail system that displays previews when available, else fallback to icons\n- Playlist queue automatically created from media (removable items) in current directory\n- Player bar with expanded player view supporting audio, video, and image playback\n- Image slideshow mode with automatic advancement every 5 seconds\n- Shuffle mode for recursive directory playback (media files only)\n- Queue dialog showing current playlist with ability to jump to any item\n- Video history tracking - stores last 50 video paths in browser local storage\n- Fullscreen player support for videos and images\n- Subtitle support for videos with automatic detection of SRT files and embedded tracks\n- Player with support to switch between multiple available subtitle tracks\n- Search functionality to filter files in the current directory\n- Ability to upload files to the server at specific paths\n- Thumbnail generation mode in CLI for movies, shows, and videos (using `ffmpeg` and TMDB API)\n- Automatic cache cleanup that removes old HLS session files older than 3 days\n- Fully self-hosted with local assets and self-contained binary and container\n- Efficient size for both binary and container, ~15 and ~50 MB resp\n\n## Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\n| | | |\n|:---:|:---:|:---:|\n| \u003cimg src=\".github/assets/01.png\" width=\"100%\"\u003e | \u003cimg src=\".github/assets/02.png\" width=\"100%\"\u003e | \u003cimg src=\".github/assets/03.png\" width=\"100%\"\u003e |\n| \u003cimg src=\".github/assets/04.png\" width=\"100%\"\u003e | \u003cimg src=\".github/assets/05.png\" width=\"100%\"\u003e | \u003cimg src=\".github/assets/06.png\" width=\"100%\"\u003e |\n| \u003cimg src=\".github/assets/07.png\" width=\"100%\"\u003e | \u003cimg src=\".github/assets/08.png\" width=\"100%\"\u003e | \u003cimg src=\".github/assets/09.png\" width=\"100%\"\u003e |\n\n\u003c/div\u003e\n\n## Usage\n\n### Docker (for Homelab)\n\n```bash\nmkdir $HOME/raikiri # you don't need to create this if you already have media in a specific directory\n```\n```bash\ndocker run --rm -d --name raikiri \\\n  -p 8080:8080 \\\n  -v $HOME/raikiri:/app/media \\\n  -v $HOME/music:/app/music \\\n  -v $HOME/raikiri-cache:/app/cache \\\n  tanq16/raikiri:main\n```\n\nAvailable at `http://localhost:8080`. Docker Compose example:\n\n```yaml\nservices:\n  raikiri:\n    image: tanq16/raikiri:main\n    container_name: raikiri\n    volumes:\n      - /home/tanq/raikiri:/app/media # Change as needed\n      - /home/tanq/music:/app/music # Change as needed\n      - /home/tanq/raikiri-cache:/app/cache # HLS segment cache\n    ports:\n      - 8080:8080\n```\n\n### Binary\n\nTo use the binary, simply download the latest version from the project releases and run as follows:\n\n```bash\nraikiri serve --media $YOUR_MEDIA_FOLDER --music $YOUR_MUSIC_FOLDER --cache $YOUR_HLS_CACHE_FOLDER\n```\n\nFlags:\n- `--media`: media directory path (default: `.`)\n- `--music`: music directory path (default: `./music`)\n- `--cache`: HLS cache directory (default: `/tmp`)\n- `--port`: port to listen on (default: `8080`)\n- `--version`: print version information\n\nSwitch between Media and Music modes via interface tabs. Think of it as your own minimal Netflix on the Media tab and your own minimal Spotify on the Music tab.\n\nCache directory stores temporary HLS segments generated during video playback. Auto-cleanup runs daily at 3 AM, removing sessions older than 3 days.\n\nStoring cache in your SSD will yield faster performance (or instant seeks anywhere in the video). However, using HDD is recommended for longevity (lots of segment writes), even though it's not instant when seeking to further ahead right after launching the video.\n\n### Local Development\n\nInstall with Go 1.25+:\n\n```bash\ngo install github.com/tanq16/raikiri@latest\n```\n\nOr build from source:\n\n```bash\ngit clone https://github.com/tanq16/raikiri.git \u0026\u0026 \\\ncd raikiri \u0026\u0026 \\\nmake build\n```\n\n### Additional Notes\n\n#### Requirements\n\nRequires `ffmpeg` (includes `ffprobe`) in PATH for:\n- Video playback (HLS transmuxing; transcodes if audio is a mismatch)\n- Thumbnail generation (`prepare` subcommand)\n\nFor Docker deployments, provided image includes `ffmpeg`.\n\n#### Thumbnails\n\nThumbnails are stored as hidden files (`.filename.thumbnail.jpg`) alongside media. It is displayed in grid view when available.\n\nTo generate thumbnails, use the `prepare` subcommand:\n\n- `thumbnails`: Generate ffmpeg thumbnails recursively for all videos in the current directory\n- `thumbnails --current`: Generate thumbnails for the current directory only (non-recursive)\n- `thumbnails \u003cfile\u003e`: Generate a thumbnail for a single video file\n- `shows`: Auto-match TV shows using TMDB API (requires `TMDB_API_KEY` environment variable); run in the directory containing all show directories\n- `shows --manual`: Interactive TV show matching for a single show directory\n- `movies`: Auto-match movies using TMDB API (requires `TMDB_API_KEY` environment variable); run in the directory containing all movie directories\n- `movies --manual`: Interactive movie matching for a single movie directory\n\n```bash\nraikiri prepare thumbnails\nraikiri prepare thumbnails --current\nraikiri prepare thumbnails path/to/video.mkv\nraikiri prepare shows\nraikiri prepare movies --manual\n```\n\n\u003e [!NOTE]\n\u003e - Video thumbnails are screenshots at 50% of the video duration\n\u003e - For images, the original file is used as a fallback if no thumbnail exists\n\n\u003e [!TIP]\n\u003e In Music mode, album art is considered as the directory thumbnail (`.thumbnail.jpg`), artist cover is considered from artist directory thumbnail. Tracks use list view (no thumbnails).\n\n#### Video Tools\n\nThe `video-info` and `video-encode` commands are standalone CLI tools for inspecting and re-encoding video files.\n\n```bash\nraikiri video-info path/to/video.mkv\nraikiri video-encode path/to/video.mkv\nraikiri video-encode --quality high path/to/video.mkv\nraikiri video-encode --slower path/to/video.mkv\n```\n\n`video-info` displays a table with container info, video/audio/subtitle streams, codecs, resolution, frame rate, bitrate, and languages.\n\n`video-encode` smart-encodes to H.265 with automatic stream selection:\n- Selects the best audio stream (rejects commentary/descriptive tracks)\n- Keeps all subtitle streams, picks MP4 or MKV container based on subtitle type\n- Auto-halves high frame rates to their standard lower counterpart (60→30, 59.94→29.97, 50→25, 48→24)\n- Quality tiers via `--quality`: `very-high`, `high`, `medium` (default), `low`\n- Default preset is `medium`; use `--slower` for preset `slow` (better compression, longer encode)\n- Output file is auto-named as `\u003cbasename\u003e.h265.\u003cmp4|mkv\u003e`\n\n#### Player and Playlists\n\nClicking media auto-creates a playlist from current directory files. Player bar shows current item with controls. Click to expand for seek controls, time display, and queue dialog.\n\nQueue dialog highlights active item; click any item to jump. Shuffle button plays all media recursively in random order (skips non-media).\n\n- Images: auto-advance every 5s\n- Videos/audio: play/pause, prev/next, seek\n- Fullscreen: videos and images only\n\n**History Tracking**\n- Click the Raikiri logo to open a history modal with last 50 videos (not audio/images) played\n- History is stored in browser localStorage and shows full file path as most recent first\n\n**Video Playback**\n- Compatible MP4s (H.264/HEVC + AAC 48kHz stereo) are served directly via HTTP range requests for instant playback\n- All other videos are HLS-segmented to 6s fMP4 segments via `ffmpeg`, with audio transcoded to 48kHz AAC to prevent A/V drift\n- Audio is played back directly in HTML5\n- Unplayable files open in new tab as raw GET\n\n**Subtitles**\n- Auto-detection of SRTs in same directory, `subs/`, or `Subs/`\n- Auto-extraction of embedded subtitle tracks\n- All subtitles are converted to WebVTT and served as options\n- CC button allows selecting across available tracks or disabled\n\n#### Quickie on Playback Sync\n\n- Compatible videos are served directly; others are HLS transmuxed/transcoded via `ffmpeg` (full seekability, format compatibility)\n- Fullscreen player with custom overlay with controls (play/pause, +-10s seek, seek bar, exit)\n- Fullscreen disabled for audio (images/videos only)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Fraikiri","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanq16%2Fraikiri","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Fraikiri/lists"}