A small web app for booking focus pods by the hour. Pick a day, see which pods are free, grab a slot.
Built with Go, Echo, GORM, SQLite, Templ, HTMX, and Goose migrations.
- Day-view booking grid — pods as columns, hourly slots (08:00–17:00) as rows
- One-click booking with an inline HTMX form, no page reloads
- Conflict detection so a slot can't be booked twice
- Cancel bookings straight from the grid
- Pod management: add and list pods
- Single binary: templates compiled in, migrations embedded and applied on startup
Requires Go 1.25+.
make dev # hot-reload development server (air + loggo) on :8080
make run # or: plain run without hot reloadThe SQLite database (roomer.db) is created and migrated automatically on first start, including a few seed pods.
make test # run tests
make lint # vet, staticcheck, golangci-lint, nilaway
make sec # gosec, govulncheck
make build # production binary
make generate # regenerate Go code from .templ files
make migrate-status # migration status
make migrate-down # roll back last migrationTemplates are .templ files that generate *_templ.go — edit the .templ files, never the generated code.
| Method | Route | Purpose |
|---|---|---|
| GET | / |
Booking calendar grid |
| GET | /bookings/form |
Booking creation form |
| POST | /bookings |
Create booking |
| DELETE | /bookings/:id |
Cancel booking (HTMX) |
| GET | /pods |
Pod management |
| POST | /pods |
Create pod |
main.go entry point, embeds migrations, starts server on :8080
migrations/ Goose SQL migrations (embedded at compile time)
internal/
app/ wiring and database setup
bookings/ booking domain, repository, usecase, handlers, templates
pods/ pod domain, repository, usecase, handlers, templates
shared/ layout template and render helpers