The plan's last open line was "Piper pt-PT voice instance on parodia", and it hid two things. A language was still a code change — read-aloud knew exactly two, named in the Config struct. It discovers them from the environment now, so fr and es cost a compose service and two .env lines. And the voice repeated the phase's own lesson in a new place: pt_PT-tugão-medium is the only European Portuguese voice Piper ships, and its own downloader cannot fetch it — the ã goes into the HTTP request line and http.client encodes ASCII. Deploying is also what finally ran the reverse lookup against the real 550 MB dict.db, which the previous session left open because this laptop has none: data → "date", comum → "common; usual", tarde → "evening", with think, computer and garden correctly silent. think glossing to pensar first confirms Phase 20's sense-agreement ordering on real data rather than on a fixture. Still owed, both said plainly in the phase: no pt-PT speaker has read the pack, and no pt-PT account exists — both writers are on the zh pair, so nothing she sees changed today.
🌸 Petal
A self-hosted, privacy-first writing editor with warm bubbly design, auto-save, and
local-LLM grammar/ESL suggestions. See petal-spec.md for the full
design spec and BUILD_PLAN.md for build progress.
Stack
Go + chi backend · SQLite (modernc, pure Go) · React + Vite + Tiptap + Tailwind v4 frontend ·
local vLLM/Ollama for AI suggestions. Single-binary deployment (frontend embedded via go:embed).
Local development
Two processes during development:
# 1. Backend (serves /api on :8080)
go run ./cmd/server
# 2. Frontend dev server (HMR on :5173, proxies /api → :8080)
cd web && npm install && npm run dev
Open http://localhost:5173 while developing.
Production build (single binary)
cd web && npm run build # emits web/dist (embedded by the Go binary)
cd .. && go build -o petal ./cmd/server
./petal # serves UI + API on :8080
Configuration is via environment variables — copy .env.example to .env.
Deployment
docker compose up -d --build # petal + the two Piper read-aloud sidecars
Behind Traefik on the parodia.dev VPS; vLLM stays on millenia over headscale.
Full runbook — first deploy, the LLM link, backups and restore — in
deploy/README.md.
Status
Early build, multi-session. Auth (Authentik OIDC) is next; Copyleaks plagiarism is
still parked — see BUILD_PLAN.md.