{"id":50462011,"url":"https://github.com/krishgok/localdevstack","last_synced_at":"2026-06-01T05:01:02.388Z","repository":{"id":361647798,"uuid":"1245210658","full_name":"krishgok/localdevstack","owner":"krishgok","description":"Instantly scaffold a containerised local development environment for any service and database — with a single command.","archived":false,"fork":false,"pushed_at":"2026-05-28T02:39:39.000Z","size":4022,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T17:25:20.386Z","etag":null,"topics":["cli-tool","dev-environment","developer-tools","docker","kotlin"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/krishgok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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-05-21T02:39:08.000Z","updated_at":"2026-05-28T02:40:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/krishgok/localdevstack","commit_stats":null,"previous_names":["krishgok/localdevstack"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/krishgok/localdevstack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishgok%2Flocaldevstack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishgok%2Flocaldevstack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishgok%2Flocaldevstack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishgok%2Flocaldevstack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krishgok","download_url":"https://codeload.github.com/krishgok/localdevstack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishgok%2Flocaldevstack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33760658,"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-06-01T02:00:06.963Z","response_time":115,"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":["cli-tool","dev-environment","developer-tools","docker","kotlin"],"created_at":"2026-06-01T05:01:00.300Z","updated_at":"2026-06-01T05:01:02.379Z","avatar_url":"https://github.com/krishgok.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/banner.svg\" alt=\"LocalDevelopmentStack\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eLocalDevelopmentStack\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eSpin up a production-shaped local stack in 30 seconds.\u003c/strong\u003e\u003cbr\u003e\n  One command generates a Dockerised service + database + hot-reload. Nine languages, eight databases, no JVM required.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/krishgok/LocalDevelopmentStack/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"Build\" src=\"https://img.shields.io/github/actions/workflow/status/krishgok/LocalDevelopmentStack/ci.yml?branch=master\u0026style=flat-square\u0026label=build\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/krishgok/localdevstack/releases/latest\"\u003e\u003cimg alt=\"Latest release\" src=\"https://img.shields.io/github/v/release/krishgok/localdevstack?style=flat-square\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"License: Apache-2.0\" src=\"https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square\"\u003e\u003c/a\u003e\n  \u003cimg alt=\"Platforms\" src=\"https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey?style=flat-square\"\u003e\n  \u003ca href=\"#install\"\u003e\u003cimg alt=\"Homebrew tap\" src=\"https://img.shields.io/badge/brew-tap-orange?style=flat-square\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ccode\u003ebrew install krishgok/localdevstack/localdevstack\u003c/code\u003e \u0026nbsp;·\u0026nbsp; \u003ccode\u003elocaldevstack --service go --database postgres\u003c/code\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eEvery new project means writing \u003ccode\u003edocker-compose.yml\u003c/code\u003e from scratch, picking a hot-reload tool, wiring a DB connection string, and chasing healthcheck timing.\u003cbr\u003e\n  LocalDevelopmentStack does all of that for you — deterministically, across 9 languages and 8 databases.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003c!--\n  The demo GIF is produced from docs/assets/demo.tape. After running\n  `vhs docs/assets/demo.tape` once and committing the resulting GIF,\n  uncomment the block below to embed it.\n--\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"docs/assets/demo.gif\" alt=\"30-second demo: generate a Go + Postgres stack and curl /health\" width=\"100%\"\u003e\n  \u003c/p\u003e\n\n\n---\n\n## Before / After\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth align=\"left\" width=\"50%\"\u003eBefore — hand-roll the stack\u003c/th\u003e\n\u003cth align=\"left\" width=\"50%\"\u003eAfter — one command\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\n\n```yaml\n# docker-compose.yml — write from scratch\nservices:\n  service:\n    build:\n      context: ./service\n      dockerfile: Dockerfile.dev\n    ports: [\"8080:8080\"]\n    environment:\n      DATABASE_URL: postgresql://...\n    volumes: [\".:/app\"]\n    depends_on:\n      db: { condition: service_healthy }\n  db:\n    image: postgres:16\n    # ... env, ports, volume, healthcheck...\n```\n\nPlus: write `Dockerfile.dev` with the right hot-reload tool, manage `.env`, add `.gitignore` rules, debug compose healthcheck timing — repeat for every new project.\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n```bash\nlocaldevstack \\\n  --service go \\\n  --database postgres \\\n  --output ./my-api\n```\n\n```text\nmy-api/\n├── service/\n│   ├── main.go\n│   └── Dockerfile.dev\n├── docker-compose.yml\n├── .env  /  .env.example\n└── .gitignore\n```\n\n```bash\ncd my-api \u0026\u0026 docker-compose up --build\ncurl http://localhost:8080/health\n# → {\"status\":\"ok\"}\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Features\n\n|  |  |\n|---|---|\n| ✦ **Hot-reload, everywhere** | Edit source, see it live — no rebuild |\n| ✦ **9 service generators** | Go · Node · Python · Rust · Java · Spring Boot · .NET · PHP · Ruby |\n| ✦ **8 database generators** | Postgres · MySQL · MongoDB · CockroachDB · Redis · MariaDB · SQL Server · Elasticsearch |\n| ✦ **Optional migrations** | Flyway · Liquibase · migrate-mongo · golang-migrate |\n| ✦ **Optional companions** | MailHog (SMTP catcher) · MinIO (S3-compatible store) |\n| ✦ **Native binary** | No JVM, no Docker-in-Docker — one self-contained executable |\n| ✦ **Battle-tested in CI** | Each release runs `docker compose up --build` + `curl /health` across **72 service × database combinations** before binaries ship |\n\n---\n\n## Quickstart\n\n### Install\n\n\u003cdetails\u003e\u003csummary\u003e\u003cstrong\u003emacOS / Linux — Homebrew\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nbrew tap krishgok/localdevstack\nbrew install localdevstack\n```\n\n\u003e Pre-built bottles for **macOS arm64**, **Linux x64**, and **Windows x64**. Intel macOS users: clone the repo and run `./gradlew nativeCompile` (requires GraalVM 21).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cstrong\u003eWindows — Scoop\u003c/strong\u003e\u003c/summary\u003e\n\n```powershell\nscoop bucket add localdevstack https://github.com/krishgok/localdevstack\nscoop install localdevstack\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cstrong\u003emacOS / Linux — curl\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/krishgok/localdevstack/main/scripts/install.sh | bash\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cstrong\u003eWindows — PowerShell\u003c/strong\u003e\u003c/summary\u003e\n\n```powershell\nirm https://raw.githubusercontent.com/krishgok/localdevstack/main/scripts/install.ps1 | iex\n```\n\n\u003c/details\u003e\n\n### First stack in three steps\n\n```bash\n# 1. Generate\nlocaldevstack --service go --database postgres --output ./my-api --name my-api\n\n# 2. Run\ncd my-api \u0026\u0026 docker-compose up --build\n\n# 3. Verify\ncurl http://localhost:8080/health\n# → {\"status\":\"ok\"}\n```\n\nEdit any file under `service/` — the watcher inside the container picks it up and reloads automatically.\n\n**Two modes:**\n\n```bash\n# New service     — generates source code + Dockerfile.dev + docker-compose.yml\nlocaldevstack --service go --database postgres --output ./my-api\n\n# Existing service — auto-detects language, generates Dockerfile.dev + docker-compose.yml\nlocaldevstack --existing-dir ./my-existing-api --database postgres\n```\n\n**More combinations:**\n\n```bash\n# Python (FastAPI) + MongoDB + migrate-mongo migrations\nlocaldevstack --service python --database mongodb --migration migrate-mongo --output ./api\n\n# Rust (Axum) + Redis + MinIO (S3-compatible object store)\nlocaldevstack --service rust --database redis --with minio --output ./cache-svc\n\n# Spring Boot + SQL Server + Liquibase changelogs + MailHog (SMTP catcher)\nlocaldevstack --service springboot --database sqlserver --migration liquibase --with mailhog --output ./platform-api\n\n# Preview only — print the resolved plan without writing files\nlocaldevstack --service node --database mariadb --with mailhog --output ./api --dry-run\n```\n\n→ Full walkthrough: **[New service](docs/usage-new-service.md)** · **[Existing service](docs/usage-existing-service.md)**\n\n---\n\n## Architecture\n\n```mermaid\nflowchart LR\n    User([Developer]) --\u003e CLI[localdevstack\u003cbr\u003enative binary]\n    CLI --\u003e Gen[Generators\u003cbr\u003eservice · db · migration · companion]\n    Gen --\u003e Out[docker-compose.yml\u003cbr\u003eDockerfile.dev\u003cbr\u003e.env / .env.example]\n    Out --\u003e Run[docker-compose up --build]\n    Run --\u003e Stack[(Running stack:\u003cbr\u003eservice · db · migrate · companions)]\n```\n\n`LocalDevStackCli` dispatches via three registry maps — `SERVICES`, `DATABASES`, `COMPANIONS` — and runs each generator into the chosen output directory. Volume-mounted source means **edits hot-reload without rebuilding**.\n\n---\n\n## Who it's for\n\n- **Solo developers prototyping** — skip the docker-compose boilerplate; get a working stack on a new project in 30 seconds.\n- **Teams onboarding new hires** — commit `docker-compose.yml` + `.env.example`; new joiners run one command and have the full local stack.\n- **Platform / DevEx teams** — standardise local environments across repos without writing a custom CLI or yet-another-internal-template.\n\n---\n\n## Why this over the alternatives\n\n| Tool                                            | Scope                          | Host-side toolchain?         | K8s required? | Hot-reload baked in?      | One command brings up DB + service? |\n|-------------------------------------------------|--------------------------------|------------------------------|---------------|---------------------------|-------------------------------------|\n| **LocalDevelopmentStack**                       | docker-compose dev stacks      | No — service runs in container | No          | Yes — per language        | Yes                                 |\n| Hand-rolled compose                             | docker-compose                 | Up to you                    | No            | DIY per language          | No                                  |\n| `docker init`                                   | single Dockerfile (no DB)      | No                           | No            | Sometimes                 | No                                  |\n| Tilt / Skaffold                                 | Kubernetes dev loops           | Yes (`kubectl`)              | Yes           | Yes                       | Yes (different scope)               |\n| Nix / devbox / mise                             | host-side env management       | Replaces it (no Docker)      | No            | N/A                       | N/A                                 |\n| `create-t3-app`, `cookiecutter`, framework CLIs | language-specific scaffolds    | Yes                          | No            | Varies                    | No (files only; no DB)              |\n\nThe differentiator: **compose-native, no Kubernetes, no host language toolchain required.** The 72-combo CI sweep (noted in [Features](#features) above) means every supported `(language, database)` pair has been built and `/health`-checked at least once per release.\n\n---\n\n## Showcase\n\n### Service support — 9 languages, one CLI\n\n\u003cp\u003e\n  \u003cimg alt=\"Go\"          src=\"https://img.shields.io/badge/Go-00ADD8?style=for-the-badge\u0026logo=go\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Node.js\"     src=\"https://img.shields.io/badge/Node.js-339933?style=for-the-badge\u0026logo=nodedotjs\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Python\"      src=\"https://img.shields.io/badge/Python-3776AB?style=for-the-badge\u0026logo=python\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Rust\"        src=\"https://img.shields.io/badge/Rust-000000?style=for-the-badge\u0026logo=rust\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Java\"        src=\"https://img.shields.io/badge/Java-007396?style=for-the-badge\u0026logo=openjdk\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Spring Boot\" src=\"https://img.shields.io/badge/Spring%20Boot-6DB33F?style=for-the-badge\u0026logo=springboot\u0026logoColor=white\"\u003e\n  \u003cimg alt=\".NET\"        src=\"https://img.shields.io/badge/.NET-512BD4?style=for-the-badge\u0026logo=dotnet\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"PHP\"         src=\"https://img.shields.io/badge/PHP-777BB4?style=for-the-badge\u0026logo=php\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Ruby\"        src=\"https://img.shields.io/badge/Ruby-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\"\u003e\n\u003c/p\u003e\n\nEvery generated service exposes `GET /health` → `{\"status\":\"ok\"}` and ships with the right hot-reload tooling baked in — `air` for Go, `nodemon` for Node, `uvicorn --reload` for Python, `cargo-watch` for Rust, `dotnet watch run` for .NET, and so on.\n\n→ **[Sentinel files, framework details, full table](docs/usage-new-service.md)**\n\n### Database support — 8 engines, zero config\n\n\u003cp\u003e\n  \u003cimg alt=\"PostgreSQL\"    src=\"https://img.shields.io/badge/PostgreSQL-4169E1?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"MySQL\"         src=\"https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge\u0026logo=mysql\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"MongoDB\"       src=\"https://img.shields.io/badge/MongoDB-47A248?style=for-the-badge\u0026logo=mongodb\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"CockroachDB\"   src=\"https://img.shields.io/badge/CockroachDB-6933FF?style=for-the-badge\u0026logo=cockroachlabs\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Redis\"         src=\"https://img.shields.io/badge/Redis-DC382D?style=for-the-badge\u0026logo=redis\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"MariaDB\"       src=\"https://img.shields.io/badge/MariaDB-003545?style=for-the-badge\u0026logo=mariadb\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"SQL Server\"    src=\"https://img.shields.io/badge/SQL%20Server-CC2927?style=for-the-badge\u0026logo=microsoftsqlserver\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Elasticsearch\" src=\"https://img.shields.io/badge/Elasticsearch-005571?style=for-the-badge\u0026logo=elasticsearch\u0026logoColor=white\"\u003e\n\u003c/p\u003e\n\nEvery database container ships with a healthcheck and injects its connection string into your service via a single environment variable. Your code reads one variable; the same code works locally and in production.\n\n→ **[Per-language connection examples](docs/db-connections.md)**\n\n### Migrations — opt-in, one flag\n\n| `--migration`     | Tool             | Best for                                                              |\n|-------------------|------------------|-----------------------------------------------------------------------|\n| `flyway`          | Flyway 10        | Versioned SQL on Postgres, MySQL, MariaDB, SQL Server, CockroachDB    |\n| `liquibase`       | Liquibase 4.27   | Richer changelog format, multiple SQL dialects                        |\n| `migrate-mongo`   | migrate-mongo 11 | MongoDB collection migrations                                         |\n| `golang-migrate`  | migrate v4       | One tool, six engines (incl. MongoDB)                                 |\n\n```bash\nlocaldevstack --service go --database postgres --migration flyway\ndocker-compose run --rm migrate     # manual run — uses the `migrations` compose profile\n```\n\n→ **[docs/migrations.md](docs/migrations.md)**\n\n### Companions — drop-in dev services\n\n| Companion   | What you get                                                                                                  |\n|-------------|---------------------------------------------------------------------------------------------------------------|\n| **MailHog** | SMTP catcher + web UI on `:8025`. Capture outgoing mail. Auto-injects `SMTP_HOST`, `SMTP_PORT`.               |\n| **MinIO**   | S3-compatible object store + console on `:9001`. Auto-injects `S3_ENDPOINT`, `S3_ACCESS_KEY`, `S3_SECRET_KEY`. |\n\n```bash\nlocaldevstack --service node --database postgres --with mailhog,minio\n```\n\n→ **[docs/companions.md](docs/companions.md)**\n\n### Power-user flags\n\n|                          |                                                                                                       |\n|--------------------------|-------------------------------------------------------------------------------------------------------|\n| **Env file management**  | `.env` (gitignored) + `.env.example` (commit-safe) written on every invocation                        |\n| **Dry-run mode**         | `--dry-run` prints the resolved plan and would-be file list without touching the filesystem           |\n| **Multi-database**       | One DB per invocation by default; copy the second `db:` block into your existing compose file         |\n| **`--force`**            | Overwrite existing migrations / compose files when regenerating into the same directory               |\n| **`--port`**             | Pin the service port (default auto-selects 8080 → 8081 → 8082 if lower ports are occupied)            |\n\n→ **[docs/advanced.md](docs/advanced.md)**\n\n---\n\n## Roadmap\n\n- **More companions** — Redis-as-cache, Prometheus + Grafana, OpenTelemetry collector + Jaeger\n- **Vector databases** — pgvector, Qdrant, Weaviate\n- **Bigger bets** — Kubernetes output, multi-service composition, interactive `init` wizard\n\n→ Full list: **[docs/roadmap.md](docs/roadmap.md)**\n\n---\n\n## Contributing \u0026 support\n\n- **Using with an AI assistant?** → see [AGENTS.md](AGENTS.md) for invocation patterns and canned prompts\n- **Issues / feature requests** → [github.com/krishgok/LocalDevelopmentStack/issues](https://github.com/krishgok/LocalDevelopmentStack/issues) (templates for bug reports, feature requests, and new-type requests)\n- **Pull requests** → see [CONTRIBUTING.md](CONTRIBUTING.md)\n- **Security vulnerabilities** → see [SECURITY.md](SECURITY.md) (private reporting via the GitHub Security tab)\n- **Code of Conduct** → see [CONTRIBUTING.md § Code of conduct](CONTRIBUTING.md#code-of-conduct)\n- **Disclaimers \u0026 limitations** → see [docs/disclaimers.md](docs/disclaimers.md)\n\nLicensed under the [Apache License, Version 2.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrishgok%2Flocaldevstack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrishgok%2Flocaldevstack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrishgok%2Flocaldevstack/lists"}