{"id":13596772,"url":"https://github.com/fabito/htk8s","last_synced_at":"2026-02-24T01:44:16.095Z","repository":{"id":40412967,"uuid":"174222522","full_name":"fabito/htk8s","owner":"fabito","description":"HTPC services running on Kubernetes","archived":false,"fork":false,"pushed_at":"2026-02-01T03:17:01.000Z","size":216,"stargazers_count":152,"open_issues_count":4,"forks_count":25,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-02-01T13:58:51.316Z","etag":null,"topics":["argo-cd","bazarr","gitops","htpc","jellyfin","k3s","kavita","kubernetes","kustomize","lidarr","prowlarr","radarr","sonarr","transmission"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fabito.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2019-03-06T21:16:30.000Z","updated_at":"2026-01-29T10:01:17.000Z","dependencies_parsed_at":"2024-05-01T22:39:37.777Z","dependency_job_id":"dd8c8668-ea74-4d00-8d2a-fdc3a4a9389e","html_url":"https://github.com/fabito/htk8s","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/fabito/htk8s","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabito%2Fhtk8s","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabito%2Fhtk8s/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabito%2Fhtk8s/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabito%2Fhtk8s/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fabito","download_url":"https://codeload.github.com/fabito/htk8s/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabito%2Fhtk8s/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29767481,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T01:40:24.820Z","status":"ssl_error","status_checked_at":"2026-02-24T01:39:15.130Z","response_time":90,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["argo-cd","bazarr","gitops","htpc","jellyfin","k3s","kavita","kubernetes","kustomize","lidarr","prowlarr","radarr","sonarr","transmission"],"created_at":"2024-08-01T16:02:46.934Z","updated_at":"2026-02-24T01:44:16.066Z","avatar_url":"https://github.com/fabito.png","language":"Shell","funding_links":[],"categories":["Shell"],"sub_categories":[],"readme":"![test](https://github.com/fabito/htk8s/workflows/test/badge.svg)\n\n# HTPC powered by k3s\n\n![htk8s diagrams](https://docs.google.com/drawings/d/e/2PACX-1vSsQfsfgHiHi0l-1w6pZhCYX-xz2xJNVwMrnKclkqYdEd6dIGJY9soY2lgtm1gyOnNSTYRbYkqvYCWU/pub?w=1373\u0026amp;h=612)\n\nThis is my current [HTPC](https://en.wikipedia.org/wiki/Home_theater_PC) setup. It runs on [k3s](https://k3s.io/) - a lightweight and easy to install Kubernetes distribution.\nIt includes the following applications:\n\n* [Sonarr](https://sonarr.tv/) for tv shows\n* [Radarr](https://radarr.video/) for movies\n* [Bazarr](https://github.com/morpheus65535/bazarr) for subtitles\n* Transmission for torrents\n* [Jackett](https://github.com/Jackett/Jackett) for torrent tracker searching\n* [Emby](https://emby.media/)\n\nApplications state (settings / db) and media files are stored in a shared volume of type `hostPath`. It does not use PVC and currently only works if the whole `htpc` namespace is deployed in the same node.\n\n## Getting Started\n\n### Quickstart\n\n```bash\n# for x86_64\nkubectl apply -f https://raw.githubusercontent.com/fabito/htk8s/v0.1/install_x86_64.yaml\n\n# for raspberry pi (ARM)\nkubectl apply -f https://raw.githubusercontent.com/fabito/htk8s/v0.1/install_armhf.yaml\n```\n\n### The Gitops way\n\n![argocd htpc application](https://drive.google.com/uc?id=1KI_7GVcP7QFWhQEiqS9Q4azE7-gpso2M)\n\n\n```bash\n# x86_64 only\nkubectl apply -f https://raw.githubusercontent.com/fabito/htk8s/v0.1/install_argocd.yaml\n```\n\nThis alternate manifest will install [Argo CD](https://github.com/argoproj/argo-cd) along with the [htpc application](argocd/application.yaml). Then it will monitor this repo for changes and apply them to the cluster accordingly (more specifically the `overlays/x86`overlay).\n\nYou can access the ArgoCD UI at: https://localhost/argocd.\n\n### Verifying the installation\n\nAll resources are created in the `htpc` namespace. So if you run:\n\n```bash\nk3s kubectl get all -n htpc\n```\n\nYou should get something similar to:\n\n```bash\nNAME                                READY   STATUS    RESTARTS   AGE\npod/bazarr-795f88c5c9-w75l7         1/1     Running   0          24h\npod/emby-6f457df664-fqbmc           1/1     Running   0          24h\npod/jackett-6bcf6cd8d6-lrh6j        1/1     Running   0          24h\npod/radarr-5c965c7678-zt8sq         1/1     Running   0          24h\npod/sonarr-b65c8956-mxng4           1/1     Running   0          24h\npod/transmission-5f7fdc6cb5-nrtbb   1/1     Running   0          24h\n\nNAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE\nservice/bazarr         ClusterIP   10.43.43.224    \u003cnone\u003e        6767/TCP   24h\nservice/emby           ClusterIP   10.43.212.198   \u003cnone\u003e        8096/TCP   24h\nservice/jackett        ClusterIP   10.43.104.233   \u003cnone\u003e        9117/TCP   24h\nservice/radarr         ClusterIP   10.43.141.101   \u003cnone\u003e        7878/TCP   24h\nservice/sonarr         ClusterIP   10.43.35.98     \u003cnone\u003e        8989/TCP   24h\nservice/transmission   ClusterIP   10.43.184.198   \u003cnone\u003e        9091/TCP   24h\n\nNAME                           READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps/bazarr         1/1     1            1           24h\ndeployment.apps/emby           1/1     1            1           24h\ndeployment.apps/jackett        1/1     1            1           24h\ndeployment.apps/radarr         1/1     1            1           24h\ndeployment.apps/sonarr         1/1     1            1           24h\ndeployment.apps/transmission   1/1     1            1           24h\n\nNAME                                      DESIRED   CURRENT   READY   AGE\nreplicaset.apps/bazarr-795f88c5c9         1         1         1       24h\nreplicaset.apps/emby-6f457df664           1         1         1       24h\nreplicaset.apps/jackett-6bcf6cd8d6        1         1         1       24h\nreplicaset.apps/radarr-5c965c7678         1         1         1       24h\nreplicaset.apps/sonarr-b65c8956           1         1         1       24h\nreplicaset.apps/transmission-5f7fdc6cb5   1         1         1       24h\n```\n\nYou should also be able to reach each component's UI using the links below. Don't forget to replace `localhost` with the IP or the server name running k3s.\n\n|App|URI\n|---|---\n|radarr|http://localhost/radarr\n|sonarr|http://localhost/sonarr\n|bazarr|http://localhost/bazarr\n|jacket|http://localhost/jackett\n|transmission|http://localhost/transmission\n|emby|http://localhost/\n\nCheck the [ingress-route.yaml](base/ingress-route.yaml) for more details.\n\nEach module except for Emby is configured to respond on a custom basepath (check the init containers logic for more details).\n\n## How it works (WIP)\n\nIt uses [LinuxServers](https://www.linuxserver.io/our-images/) images.\n\nIt uses a `hostPath` volume to store configuration and media files. It defaults to the `/opt/htpc` directory\n\n```bash\n/opt/htpc\n├── bazarr\n├── downloads\n├── emby\n├── jackett\n├── media\n│   ├── movies\n│   └── tv\n├── radarr\n├── sonarr\n└── transmission\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabito%2Fhtk8s","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabito%2Fhtk8s","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabito%2Fhtk8s/lists"}