Reported as "Portuguese docs still use English voices". Not the server: piper-pt is up, has its own model loaded, and synthesizes "Ao fim da tarde fomos ver o mar" into 63KB of RIFF when asked directly. The request never asked it. The word card's pronounce buttons called speak(word) with no locale, which falls back to detectLang — a test that can only tell Han characters from letters. "comum", "carro", "gaivotas" all read as English, so every read-aloud from a word card in a Portuguese document came out in the en_US voice, and Piper's Portuguese sat idle behind a route nothing pointed at. The card was the last surface still guessing. The selection bubble and the garden both pass a locale decided from the document's verdict; WordCard was never given the document, so it had nothing to pass. It takes one now. This is the same mistake the "also in her language" block three elements below it was built to avoid — its comment says so outright, that an English voice reading "comum" is the thing that block exists to prevent — arriving through the button directly above it. A rule held in one place and not the other. Verified by intercepting /api/tts: both paths now ask for pt-PT. Claude-Session: https://claude.ai/code/session_01GJHNvirh7Hzhc9RL3HAvz7
🌸 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.