{"id":48740869,"url":"https://github.com/krbob/stacklab","last_synced_at":"2026-07-07T10:00:57.721Z","repository":{"id":349119543,"uuid":"1200819337","full_name":"krbob/stacklab","owner":"krbob","description":"Compose-first control panel for Docker Compose homelabs on a single Linux host","archived":false,"fork":false,"pushed_at":"2026-07-01T08:00:27.000Z","size":431765,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T10:04:21.339Z","etag":null,"topics":["docker","docker-compose","golang","homelab","linux","react","self-hosted","sqlite","terminal","vite","websocket"],"latest_commit_sha":null,"homepage":null,"language":"Go","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/krbob.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":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-03T21:34:58.000Z","updated_at":"2026-06-29T22:23:44.000Z","dependencies_parsed_at":"2026-07-01T10:01:23.820Z","dependency_job_id":null,"html_url":"https://github.com/krbob/stacklab","commit_stats":null,"previous_names":["krbob/stacklab"],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/krbob/stacklab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krbob%2Fstacklab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krbob%2Fstacklab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krbob%2Fstacklab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krbob%2Fstacklab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krbob","download_url":"https://codeload.github.com/krbob/stacklab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krbob%2Fstacklab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35223385,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"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":["docker","docker-compose","golang","homelab","linux","react","self-hosted","sqlite","terminal","vite","websocket"],"created_at":"2026-04-12T07:07:01.740Z","updated_at":"2026-07-07T10:00:57.703Z","avatar_url":"https://github.com/krbob.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stacklab\n\nStacklab is a host-native, Compose-first control panel for Docker Compose stacks on a single Linux host.\n\nIt is built for a homelab-style environment:\n\n- one managed host\n- Linux `amd64` as the primary target platform\n- Linux `arm64` also supported\n- LAN-only usage\n- Docker Compose as the source of truth\n- filesystem-first management instead of a database-owned stack model\n\n## Status\n\nStacklab is an active pre-stable release candidate for the single-host v1 scope.\n\nImplemented today:\n\n- authentication and session handling\n- stack discovery from the filesystem and Docker runtime\n- stack list, stack detail views, and stack-local auxiliary file editing\n- Compose definition editor with resolved-config preview\n- stack lifecycle actions and job progress\n- live logs, stats, and container terminal\n- stack create/delete flows\n- host overview and Stacklab service log viewer\n- config workspace browsing and editing\n- Git status, diff, per-file commit, and push for managed workspace files\n- workspace permission diagnostics and helper-backed repair\n- maintenance inventory, cleanup, and bulk update workflows\n- Docker daemon config validation and apply workflow\n- notifications, maintenance schedules, and APT-backed self-update\n- audit history, retained job detail, and global activity indicator\n- backend and frontend automated tests\n- manual-on-demand Linux `amd64` and `arm64` release artifact build\n- `.deb` build and published APT channels\n- staging deployment trials on Linux `arm64`, Ubuntu `amd64`, and Debian `amd64`\n\nCurrent focus:\n\n- release hardening and stable sign-off\n- template library and starter catalog\n- background UX polish for long-running operations\n\n## Architecture\n\nRecommended production shape:\n\n- backend: Go\n- frontend: React + Vite + TypeScript\n- runtime: host-native service, not a Docker management container\n- state: filesystem + SQLite operational metadata\n\nSupported install modes:\n\n- Primary: Debian-family hosts via `.deb` and the published APT repository\n- Secondary: generic Linux hosts via manual release tarball install\n- Unsupported: migration between tarball and package-managed installs\n\nCanonical host layout for package-managed installs:\n\n- `/usr/lib/stacklab`\n- `/etc/stacklab/stacklab.env`\n- `/srv/stacklab`\n- `/var/lib/stacklab`\n\nCanonical host layout for tarball installs:\n\n- `/opt/stacklab/app`\n- `/opt/stacklab/stacks`\n- `/opt/stacklab/config`\n- `/opt/stacklab/data`\n- `/var/lib/stacklab`\n\n## Quick Start\n\n### Prerequisites\n\n- Go\n- Node.js + npm\n- Docker Engine\n- Compose v2 available as either `docker compose` or standalone `docker-compose`\n\n### Local development\n\nBackend:\n\n```bash\nSTACKLAB_BOOTSTRAP_PASSWORD=change-me go run ./cmd/stacklab\n```\n\nFrontend dev server:\n\n```bash\ncd frontend\nnpm ci\nnpm run dev\n```\n\nDefault local paths are under `.local/stacklab` and `.local/var/lib/stacklab`.\n\n### Built frontend mode\n\nIf you want the Go backend to serve the production frontend bundle:\n\n```bash\ncd frontend\nnpm ci\nnpm run build\n\ncd ..\nSTACKLAB_BOOTSTRAP_PASSWORD=change-me go run ./cmd/stacklab\n```\n\nThen open:\n\n- `http://127.0.0.1:8080`\n\n### Install from APT\n\nDebian-family hosts should install Stacklab from the published APT repository.\n\nInstall the repository key:\n\n```bash\nsudo mkdir -p /usr/share/keyrings\ncurl -fsSL https://krbob.github.io/stacklab/apt/stacklab-archive-keyring.gpg \\\n  | sudo tee /usr/share/keyrings/stacklab-archive-keyring.gpg \u003e/dev/null\n```\n\nAdd the stable channel:\n\n```bash\narch=\"$(dpkg --print-architecture)\"\necho \"deb [arch=${arch} signed-by=/usr/share/keyrings/stacklab-archive-keyring.gpg] https://krbob.github.io/stacklab/apt stable main\" \\\n  | sudo tee /etc/apt/sources.list.d/stacklab.list\n```\n\nInstall:\n\n```bash\nsudo apt-get update\nsudo apt-get install stacklab\n```\n\nFor the nightly channel and additional notes, see:\n\n- [`docs/ops/install-from-apt.md`](docs/ops/install-from-apt.md)\n\n### Install from tarball\n\nFor other Linux distributions, Stacklab also ships release tarballs with a\nmanual host-native install and upgrade flow.\n\nSee:\n\n- [`docs/ops/install-from-tarball.md`](docs/ops/install-from-tarball.md)\n\n## Tests\n\nBackend:\n\n```bash\ngo test ./...\n```\n\nFrontend:\n\n```bash\ncd frontend\nnpm test\nnpm run typecheck\nnpm run lint\nnpm run build\n```\n\n## Screenshots\n\n| Stacks | Stack Editor |\n| - | - |\n| ![Stacks overview](docs/images/readme/stacks-overview.png) | ![Stack editor](docs/images/readme/stack-editor.png) |\n| Host | Config Workspace |\n| ![Host overview](docs/images/readme/host-overview.png) | ![Config workspace](docs/images/readme/config-workspace.png) |\n| Maintenance | Docker Admin |\n| ![Maintenance update workflow](docs/images/readme/maintenance-update.png) | ![Docker admin](docs/images/readme/docker-admin.png) |\n\nRefresh the README screenshots against a running Stacklab instance:\n\n```bash\ncd frontend\nSTACKLAB_URL=http://127.0.0.1:18080 \\\nSTACKLAB_PASSWORD=change-me \\\nnpm run screenshots:readme\n```\n\n## Documentation\n\nProject documentation lives in [`docs/`](docs/README.md).\n\nGood entry points:\n\n- [`docs/roadmap.md`](docs/roadmap.md)\n- [`docs/product/scope.md`](docs/product/scope.md)\n- [`docs/product/mvp.md`](docs/product/mvp.md)\n- [`docs/product/feature-strategy.md`](docs/product/feature-strategy.md)\n- [`docs/architecture/system-overview.md`](docs/architecture/system-overview.md)\n- [`docs/ops/systemd.md`](docs/ops/systemd.md)\n- [`docs/ops/release-plan.md`](docs/ops/release-plan.md)\n- [`docs/ops/debian-package-plan.md`](docs/ops/debian-package-plan.md)\n- [`docs/ops/install-from-apt.md`](docs/ops/install-from-apt.md)\n- [`docs/ops/install-from-tarball.md`](docs/ops/install-from-tarball.md)\n\n## Current Constraints\n\n- primary production target is Linux `amd64`, with Linux `arm64` also supported\n- Stacklab currently assumes a single local operator model\n- host shell is intentionally deferred beyond the current MVP\n- helper-backed Docker admin, workspace repair, and self-update remain opt-in Linux flows\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrbob%2Fstacklab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrbob%2Fstacklab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrbob%2Fstacklab/lists"}