An open-source, self-contained, single-binary feature flag server for micro-SaaS and indie developers.
Sits between a config file and the giants (Unleash / ConfigCat / LaunchDarkly). More than env vars, less than a platform.
You want to change a flag without a redeploy. That's the entire value proposition. If you don't need that, use env vars. If you need experimentation, team collaboration, and governance, use one of the giants.
SafeLaunch is a young, actively-developed project — not yet tagged, packaged, or ready for production use. There is no release binary, no CLI, no SDK, and no auth yet. What exists today:
- A Go API server (Gin) backed by embedded SQLite, with CRUD endpoints for boolean feature flags
- A small React + Vite dashboard, built and embedded into the Go binary via
//go:embed - A
Dockerfile+docker-compose.yamlfor running the server in a container
Not yet built: authentication, targeting rules / percentage rollouts / variants, the Python CLI, SDKs, observability, and the event pipeline. See roadmap.md for the full phased plan and current phase status.
Who it's for: solo/indie developers and 1–5 person teams self-hosting on a small VPS who want to flip a flag without a redeploy.
Who it's not for: teams that need experimentation platforms (→ Statsig, GrowthBook), enterprise governance / SOC 2 (→ LaunchDarkly), or a hosted SaaS (SafeLaunch is self-hosted only).
| Layer | Today | Planned |
|---|---|---|
| Server | Go, Gin, embedded SQLite (modernc.org/sqlite) |
Same, plus API-key auth, evaluation engine, event pipeline |
| Dashboard | React + Vite, embedded via //go:embed |
- |
| CLI | — | Python (Typer + rich), separate distributable |
| SDKs | — | TypeScript (MVP), Python + Ruby (post-MVP) |
| Cache | — | In-process (sync.Map / Ristretto), no Redis |
| Deploy | Docker (docker-compose up) |
+ Linux binary via GitHub Releases, multi-arch Docker via goreleaser |
- Go 1.26+
- Node.js + pnpm (only if you're rebuilding the frontend)
git clone https://github.com/epi-dev/safelaunch.git
cd safelaunch
# create a local env file (not committed)
echo "ENV=development" > .env
go run .The server starts on http://localhost:8080. SQLite data is stored at ./db/feature_flags.db (created automatically on first run).
docker compose up --buildThe dashboard is pre-built into frontend/dist and embedded into the Go binary. To make frontend changes take effect in the binary:
cd frontend
pnpm install
pnpm build # writes frontend/dist
cd ..
go run . # re-embeds the fresh dist/ outputFor live frontend development against a running Go server, use pnpm dev inside frontend/ (Vite dev server on :5173, proxied CORS is enabled when ENV=development).
//go:embed frontend/dist bakes in whatever is at that path at compile time, so the dashboard has to be built before the Go binary:
cd frontend
pnpm install
pnpm build # writes frontend/dist
cd ..CGO_ENABLED=0 go build -o safelaunch .Run the app:
./safelaunchFrom macOS or any non-Linux dev machine, target Linux directly:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o safelaunch-linux-amd64 .
# Apple Silicon / arm64 servers:
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o safelaunch-linux-arm64 .Copy the resulting file to the server, chmod +x, and run it.
If you'd rather ship a container than a bare binary — see Run with Docker above.
roadmap.md— the 10-phase plan this project follows, gated on outcomes not deadlines
See CONTRIBUTING.md.
Apache License 2.0 — see LICENSE.
