The overlap test read the badge's own box, which bobs, shrinks 10% when it yields, and grows 4% on hover — so the mascot's answer to "is a card in my way" depended on what it was currently doing. Against the live build, with three cards up and no bubble, it flipped between drawn widths of 293 and 264 on its own: the 0.9 yield scale, cycling. Measure a probe span instead. It sits exactly where the badge sits, never animates, and moves the size variable to .petal-corner so both are sized from the same number. Nothing the mascot does can now change what it yields to. Cards also settle a pixel from the corner routinely — a rail re-pack, a resize, a browser bar appearing — so hold a yield until the card has retreated 24px rather than deciding on the exact edge. Verified in a real browser over CDP: seven overlap depths against the mascot's top edge, each settling once and holding, drawn width steady where it used to swing. 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.