Rapporteret med et billede af en beskrivelse, der manglede sit første bogstav på hver linje: "hermostat RU0910301440" og "atteries". Det er ikke manglende tegn — det er et felt, der er rullet til højre. Og det ligner ikke rulning; det ligner, at bogstaverne ikke er der. To ting på én skærm. Titlen var et <input>, og et input kan ikke ombryde. "tado°: Your Smart Thermostat needs new batteries" er en almindelig opgavetitel, og på 390 px var feltet 490 px bredt i en kasse på 356 — halvdelen af overskriften stod uden for kanten. Den er nu et <textarea>, der vokser med sin tekst. Retur gemmer frem for at lave en ny linje: en titel er én linje, uanset hvor mange den fylder på skærmen. Trækkehåndtaget er væk, for højden sættes af teksten, og et håndtag ville love noget, det næste bogstav retter tilbage. Beskrivelsen er tit et klippet stykke mail med en URL i. Et <textarea> ombryder ved mellemrum, og en URL har ingen. `break-word` og ikke `anywhere`: den første bryder kun et ord, der ikke kan stå på en linje alene, mens den anden bryder ved først givne lejlighed og delte "GarageRisteriet" midt i en stavelse. Den lektion står allerede ved h1 på projektsiden og er betalt én gang. Prøven måler frem for at beskrive: et felt, der ruller vandret, har en scrollWidth større end sin clientWidth. Kørt mod den gamle komponent fejler den med "Opgavens tekst: 490 > 356". Men kun den ene halvdel. Beskrivelsen løber ikke over i Chromium, heller ikke uden reglen — det var Safari, den blev set i. Prøven måler derfor den regel frem for dens virkning, og det står skrevet i prøven, så den næste ved, hvad den vogter og hvad den ikke gør. Bemærket undervejs: "en delt note tager de noter med, den peger på" fejlede én gang ud af to fulde kørsler med "Delt med Mikkel." uden antallet. Den består alene og i næste fulde kørsel. Den er ikke rørt her, men den flakker. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
web
The SvelteKit PWA. Not written yet — this directory holds its place so the Docker build has something to copy, and so the frontend stage can tell "not built yet" apart from "the build failed".
The Dockerfile builds this directory when it finds a package.json here, and
otherwise emits a placeholder page. So adding the real app is exactly: put a
SvelteKit project in this directory whose npm run build produces build/.
What it needs to be
- SvelteKit,
adapter-static, output inbuild/. The Go binary embeds that directory at compile time and serves it, falling back toindex.htmlso client-side routes survive a reload. - A PWA: installable, offline reading of already-cached lists, swipe gestures for complete and schedule.
- Nordic minimalism. Dark by default, light available. One accent colour, everything else neutral. Runic mark for Verdande.
- Optimistic on every local action. No spinner ever appears for something the browser could already know the answer to.
Talking to the backend
Same origin — the Go binary serves both. /api/v1 for REST, /api/v1/ws for the
live sync. Session cookie is httpOnly, so the frontend never handles the token
itself.
During development, run the backend on 8080 and point the Vite dev server's proxy at it:
VERDANDE_DATA_DIR=./data VERDANDE_DEV=true go run ./cmd/verdande