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.
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