bin/hobby-installer/README.md
A TUI (Terminal User Interface) and CI-compatible installer for PostHog self-hosted hobby deployments. Built with Go using Bubbletea.
./hobby-installer
CI mode is automatically enabled when common CI environment variables are detected (CI, GITHUB_ACTIONS, GITLAB_CI, etc.), or can be forced with --ci:
# Explicit CI mode
./hobby-installer --ci --domain posthog.example.com
# With specific version
./hobby-installer --ci --domain posthog.example.com --version latest
# Upgrade (domain read from existing .env)
./hobby-installer --ci
Flags:
--ci - Force non-interactive CI mode--domain - Domain where PostHog will be accessible (required in CI mode unless already in .env)--version - PostHog version to install (default: latest)cd bin/hobby-installer
# Build for development (current arch) and run
make
# Build for specific architecture
make build-darwin
make build-linux
# Build all (development, linux, darwin)
make build-all
Output binaries:
bin/hobby-installer-linux - Linux binarybin/hobby-installer-darwin - macOS binary (gitignored, local testing only)bin/hobby-installer-development - Development binary for current platformbin/hobby-installer-demo - Demo binary for testing UI components# Build and run development binary
make run
# Or for macOS-specific binary
make build-darwin
../hobby-installer-darwin
Run isolated demos of specific UI components:
# Build demo binary only
make build-demo
# Build and run a specific demo
make demo DEMO=checks
Available demos:
checks - System requirements check UImake deps # Download Go dependencies
make clean # Remove build artifacts
make test # Run Go tests
make fmt # Format Go code
make lint # Run golangci-lint
make help # Show all available targets
bin/hobby-installer/
├── main.go # Entry point: parses args, delegates to tui/ or ci/
├── core/ # Business logic (checks, install steps, docker, git, env)
├── tui/ # Interactive TUI mode (Bubbletea)
│ └── steps/ # Step views (welcome, version, domain, checks, install, complete)
├── ci/ # Non-interactive CI mode (console output)
├── ui/ # Shared UI components (styles, ASCII art)
└── demo/ # Demo binary for testing UI components
Both tui/ and ci/ consume the same core.GetChecks() and core.GetInstallSteps() - the logic is defined once, only the presentation differs.
.env)On an Ubuntu server:
# Download and run
curl -L https://github.com/PostHog/posthog/releases/download/hobby-latest/posthog-hobby -o posthog-hobby
chmod +x posthog-hobby
./posthog-hobby
For CI/automated deployments:
curl -L https://github.com/PostHog/posthog/releases/download/hobby-latest/posthog-hobby -o posthog-hobby
chmod +x posthog-hobby
./posthog-hobby --ci --domain your-domain.com
The hobby installer binary is automatically built and released when changes are pushed to master in the bin/hobby-installer/ directory.
The GitHub workflow (.github/workflows/build-hobby-installer.yml) does the following:
make build-linuxhobby-20260108-153045) for historyhobby-latest release with the new binaryThis means:
https://github.com/PostHog/posthog/releases/download/hobby-latest/posthog-hobby always points to the latest buildhttps://github.com/PostHog/posthog/releases?q=hobby-&expanded=true