Open() now creates the parent directory of the database path itself,
so e.g. DB_PATH=/data/app.db works on first start without a prior
mkdir. Open, ping, and migration errors are wrapped with context and
hints about writable directories and Docker bind-mount ownership
(chown 1000:1000 or use a named volume).
Also add a README troubleshooting section for the "database could
not be opened" error.
- Multi-stage build: Node builds the frontend, Go builds a static
CGO-free binary, runtime is Alpine with CA certificates
- Add docker-compose.yml with persistent volume for the SQLite database
- Add .dockerignore to keep the build context slim
- Embed time/tzdata in the Go binary for OS-independent timezones
- Document image build, startup, secrets, and reverse-proxy setup in README
- Add web app manifest, maskable/apple-touch icons, and a production-only
service worker that caches the app shell for offline start
- Improve mobile UX: responsive breakpoints from ~320px, 44px touch
targets, safe-area insets, dvh heights, 16px inputs to avoid iOS zoom
- Serve .webmanifest with correct content type in the Go static handler
- Document PWA behavior and mobile features in the README
- Add ThemeToggle component (Auto / Dark / Light) to all views
- Store preference per browser and detect system preference live
via prefers-color-scheme
- Apply theme before first render in index.html to prevent flash
- Extend CSS with light theme variables and refactor glass styles
Initial project setup for a privacy-focused, self-hosted scheduling app:
- Go backend with JWT auth, SQLite storage, and chi router
- Calendar integrations via Google OAuth (FreeBusy), CalDAV, and ICS links
- Public booking pages with configurable slots and booking requests
- AES-256-GCM encryption for stored provider tokens
- Vue 3 + TypeScript frontend with Vite, Pinia, and Vue Router
- Docs, .gitignore, and .env.example for local development