style(13-03): apply Prettier formatting across repo
Mechanical reformat — no logic changes. 398 files changed, 19125 insertions(+), 16457 deletions(-). Prettier 3.8.4 with .prettierrc (singleQuote:true, semi:true, tabWidth:2, trailingComma:all, printWidth:100). Isolated per D-13-08 for reviewability.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
<!-- generated-by: gsd-doc-writer -->
|
||||
|
||||
# FamilySync
|
||||
|
||||
A self-hosted family organization hub for a two-person household. One color-coded calendar view across all family members' Fastmail calendars, plus shared collaborative lists (groceries, gift ideas) — delivered as a React PWA with no app store required.
|
||||
@@ -32,19 +33,19 @@ cp .env.example .env # then fill in values — see Environment Variables below
|
||||
|
||||
Required environment variables (set in `.env` or your Docker host):
|
||||
|
||||
| Variable | Description |
|
||||
|---|---|
|
||||
| `DB_PASSWORD` | MariaDB password for the `familysync` user |
|
||||
| `DB_ROOT_PASSWORD` | MariaDB root password |
|
||||
| `OIDC_ISSUER` | Authelia OIDC issuer URL |
|
||||
| `OIDC_CLIENT_ID` | OIDC client ID (default: `familysync`) |
|
||||
| `OIDC_CLIENT_SECRET` | OIDC client secret |
|
||||
| `OIDC_REDIRECT_URI` | Callback URL registered in Authelia |
|
||||
| `OIDC_AUTH_SECRET` | Random secret for session cookie signing |
|
||||
| `APP_PASSWORD_ENCRYPTION_KEY` | Key used to encrypt stored Fastmail app passwords |
|
||||
| `VAPID_PUBLIC_KEY` | VAPID public key (`npx web-push generate-vapid-keys --json`) |
|
||||
| `VAPID_PRIVATE_KEY` | VAPID private key (never commit) |
|
||||
| `VAPID_SUBJECT` | VAPID subject (`mailto:you@example.com`) |
|
||||
| Variable | Description |
|
||||
| ----------------------------- | ------------------------------------------------------------ |
|
||||
| `DB_PASSWORD` | MariaDB password for the `familysync` user |
|
||||
| `DB_ROOT_PASSWORD` | MariaDB root password |
|
||||
| `OIDC_ISSUER` | Authelia OIDC issuer URL |
|
||||
| `OIDC_CLIENT_ID` | OIDC client ID (default: `familysync`) |
|
||||
| `OIDC_CLIENT_SECRET` | OIDC client secret |
|
||||
| `OIDC_REDIRECT_URI` | Callback URL registered in Authelia |
|
||||
| `OIDC_AUTH_SECRET` | Random secret for session cookie signing |
|
||||
| `APP_PASSWORD_ENCRYPTION_KEY` | Key used to encrypt stored Fastmail app passwords |
|
||||
| `VAPID_PUBLIC_KEY` | VAPID public key (`npx web-push generate-vapid-keys --json`) |
|
||||
| `VAPID_PRIVATE_KEY` | VAPID private key (never commit) |
|
||||
| `VAPID_SUBJECT` | VAPID subject (`mailto:you@example.com`) |
|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -84,29 +85,29 @@ docker-compose.dev.yml Dev overrides (bind-mount src/, expose DB/Redis ports)
|
||||
|
||||
## Commands
|
||||
|
||||
| Command | What it does |
|
||||
|---|---|
|
||||
| `pnpm dev:api` | Start API in watch mode (`dist/` must be built first) |
|
||||
| `pnpm dev:pwa` | Start Vite dev server with HMR |
|
||||
| `pnpm build` | Build both api and pwa |
|
||||
| `pnpm test` | Run API test suite (vitest) |
|
||||
| `pnpm lint` | Lint all workspaces |
|
||||
| `pnpm typecheck` | Type-check all workspaces |
|
||||
| `pnpm --filter @familysync/api db:generate` | Generate Drizzle migration from schema changes |
|
||||
| `pnpm --filter @familysync/api db:migrate` | Apply pending migrations to MariaDB |
|
||||
| Command | What it does |
|
||||
| ------------------------------------------- | ----------------------------------------------------- |
|
||||
| `pnpm dev:api` | Start API in watch mode (`dist/` must be built first) |
|
||||
| `pnpm dev:pwa` | Start Vite dev server with HMR |
|
||||
| `pnpm build` | Build both api and pwa |
|
||||
| `pnpm test` | Run API test suite (vitest) |
|
||||
| `pnpm lint` | Lint all workspaces |
|
||||
| `pnpm typecheck` | Type-check all workspaces |
|
||||
| `pnpm --filter @familysync/api db:generate` | Generate Drizzle migration from schema changes |
|
||||
| `pnpm --filter @familysync/api db:migrate` | Apply pending migrations to MariaDB |
|
||||
|
||||
## Tech Stack
|
||||
|
||||
| Layer | Technology |
|
||||
|---|---|
|
||||
| Backend runtime | Node.js 22 + TypeScript, Hono 4.12.23 |
|
||||
| Database ORM | Drizzle ORM 0.45.2 on MariaDB 11 (via mysql2) |
|
||||
| Auth | `@hono/oidc-auth` 1.8.3 — authorization code + PKCE against Authelia |
|
||||
| Calendar | tsdav 2.2.2 (CalDAV) + ical.js 2.2.1 against Fastmail |
|
||||
| Push | web-push 3.6.7 (VAPID) |
|
||||
| Live sync | Server-Sent Events + Redis 7 pub/sub |
|
||||
| Frontend | React 19, Vite 8, vite-plugin-pwa 1.3, TanStack Query 5, Zustand 5 |
|
||||
| Calendar UI | Schedule-X 4.6 |
|
||||
| Layer | Technology |
|
||||
| --------------- | -------------------------------------------------------------------- |
|
||||
| Backend runtime | Node.js 22 + TypeScript, Hono 4.12.23 |
|
||||
| Database ORM | Drizzle ORM 0.45.2 on MariaDB 11 (via mysql2) |
|
||||
| Auth | `@hono/oidc-auth` 1.8.3 — authorization code + PKCE against Authelia |
|
||||
| Calendar | tsdav 2.2.2 (CalDAV) + ical.js 2.2.1 against Fastmail |
|
||||
| Push | web-push 3.6.7 (VAPID) |
|
||||
| Live sync | Server-Sent Events + Redis 7 pub/sub |
|
||||
| Frontend | React 19, Vite 8, vite-plugin-pwa 1.3, TanStack Query 5, Zustand 5 |
|
||||
| Calendar UI | Schedule-X 4.6 |
|
||||
|
||||
## Calendar Integration
|
||||
|
||||
@@ -129,6 +130,7 @@ Publishing happens automatically on every push to `main` — i.e. when a PR merg
|
||||
**Image:** `git.bergerhouse.net/luckberg/familysync-api`
|
||||
|
||||
**Tags (two per release):**
|
||||
|
||||
- `:latest` — moving pointer for easy pulls
|
||||
- `:<MILESTONE>-<shortsha>` — immutable, rollback-traceable (e.g. `v1.1-98acff8`)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user