Contributing to HitKeep
HitKeep's easiest contributor setup only needs Docker with Docker Compose support. The dev Compose stack runs the Go backend, Air live reload, Angular, Mailpit, and seeded demo data in containers.
The repository's CONTRIBUTING.md remains the detailed checklist. This page gives the maintained first-run path.
Quick Setup
Section titled “Quick Setup”git clone https://github.com/pascalebeier/hitkeep.gitcd hitkeepmake dev-docker-seedOpen http://localhost:4200 and sign in with:
demo@example.comdemo1234The Docker stack starts:
| Service | URL or port | Purpose |
|---|---|---|
| Backend | http://localhost:8080 | Go API and ingest server with Air live reload |
| Frontend | http://localhost:4200 | Angular dev server with hot reload |
| Mailpit | http://localhost:8025 | Local inbox for invites, password resets, reports, and magic links |
If your environment does not have make, run the same workflow with Docker Compose:
docker compose -f compose.dev.yaml run --rm seeddocker compose -f compose.dev.yaml up --build backend frontend mailpitDaily Commands
Section titled “Daily Commands”# Start the Docker dev stack without reseedingmake dev-docker
# Seed demo data, then start the Docker dev stackmake dev-docker-seed
# Stop dev containersmake dev-docker-down
# Remove dev containers and volumesmake dev-docker-cleanmake dev-docker-clean removes the Docker volumes that hold the dev database, Go caches, npm cache, and node_modules.
Native Development
Section titled “Native Development”Native dev is still available if you prefer to run tools on your host. Install:
| Tool | Version | Purpose |
|---|---|---|
| Go | 1.26+ | Backend build and pinned Go tools |
| C toolchain | system default | DuckDB CGo bindings |
| Node.js and npm | 24+ | Angular dashboard and tracker build |
| Mailpit | latest | Local SMTP inbox |
Air is pinned in the repository and runs through go tool air. You do not need a global Air install.
# Start Mailpit in another terminalmailpit
# Seed demo data, then start backend and frontendmake dev-seedOpen http://localhost:4200. The Angular dev server proxies /api/* and /ingest to the Go backend on :8080.
Backend Development
Section titled “Backend Development”make dev-backendAir is configured by .air.toml in the repository root. It watches *.go, *.sql, *.html, *.tpl, and *.tmpl files, then rebuilds ./cmd/hitkeep/main.go and runs the binary with -log-level=debug.
The native backend target defaults mail to Mailpit on localhost:1025 with no TLS. The Docker backend target uses the mailpit service on the Compose network.
Frontend Development
Section titled “Frontend Development”The dashboard uses Angular 21, PrimeNG, and Tailwind CSS 4.
make dev-frontendOr run it directly:
cd frontend/dashboardnpm startThe Docker frontend service uses proxy.conf.docker.json so requests from the browser-facing Angular dev server reach the backend container.
Production Build
Section titled “Production Build”make buildThis builds the Angular dashboard, minifies the tracker snippets, copies the dashboard output to public/, and compiles the Go binary that embeds those files.
Verification And Tests
Section titled “Verification And Tests”Run the checks that match your change before opening a pull request:
# Backendgo test ./...go test -race ./...golangci-lint run
# Frontendcd frontend/dashboardnpm run fmt:checknpm run lintnpm run test -- --watch=false --no-progressFor browser-level verification, use the Angular CLI entrypoint:
cd frontend/dashboardnpx playwright install --with-deps chromiumnpm run e2enpm run e2e builds the production dashboard bundle, builds the Go binary, seeds realistic demo data, starts a disposable HitKeep instance, and runs the browser journeys against the real app.
For focused iteration:
cd frontend/dashboardnpm run test:e2e -- e2e/auth.seeded.spec.js --workers=1For deployment smoke checks:
cd frontend/dashboardnpm run test:e2e:smokenpm run test:e2e:smoke:subdirectoryProject Structure
Section titled “Project Structure”hitkeep/├── cmd/│ ├── hitkeep/ # Runtime entry point│ └── seed/ # Local and demo data seeding├── internal/│ ├── database/ # DuckDB stores and SQL queries│ ├── server/ # HTTP server, middleware, and handlers│ ├── ingest/ # In-process ingest consumers│ └── worker/ # Background workers├── frontend/│ └── dashboard/ # Angular dashboard and tracker snippets├── public/ # Embedded static files from the dashboard build├── scripts/ # Developer and release scripts├── tests/ # E2E launchers, fixtures, and test harnesses├── compose.dev.yaml # Docker hot-reload development stack├── Makefile└── .air.toml # Air live-reload configCommit Conventions
Section titled “Commit Conventions”HitKeep uses Conventional Commits for automated changelog generation:
feat(scope): add new featurefix(scope): fix a bugchore(deps): update dependencydocs: update contributing guideCommon scopes include analytics, events, tracker, api, auth, teams, cloud, frontend, docs, seed, screenshots, ci, and github.
Submitting A Pull Request
Section titled “Submitting A Pull Request”- Fork the repository and create a branch from
main. - Write your change following existing patterns.
- Run the relevant backend, frontend, and browser verification.
- Commit with a Conventional Commit message.
- Open a pull request against
mainwith a clear description and testing notes.
For repository-specific details and the latest contributor checklist, see the root CONTRIBUTING.md.