Setting this repo up for someone? Follow docs/agent-setup.md, not this file. It is in English, step by step, with a verification after every step and a symptom→fix table. This file is maintainer context for working on the platform, and it is mostly Swedish.
Det här repot är VibePulse: appen som visar Claude Code- och
Codex-kvoter på en Waveshare ESP32-S3-Touch-AMOLED-2.16 (480×480). Appen kör
på Torget, en liten LVGL-appplattform som bor i samma repo och äger
panelen, WiFi, ljuset och launchern — därav alla torget_*-namn i koden och
torget.bin som byggresultat. En skärm = en binär = ett bygge här.
MIT-licens.
En färsk klon utifrån bygger EN app: VibePulse. Det är hela innehållet.
Ser du referenser till Solelkollen eller Vibbe/Buddy i den här filen är det
underhållarens egna sidoprojekt, som bor i egna repon och bara byggs in om
de råkar finnas utcheckade — se ## Status. Du behöver dem inte, och deras
frånvaro är det normala.
Struktur, byggkommandon och hur man skriver en app: README.md.
Designsystemet: spec/ui-spec.md. Hårdvarusanningen routas under
Hardware-aware work nedan; läs den kanoniska femfilslistan där före
hårdvaruarbete.
Plattformen bröts ut ur underhållarens tidigare solcells-firmware (den
historiken ligger i ett privat repo och är inget du behöver) och stöptes om
enligt granskningens tre krav: (1) versionerat appkontrakt
torget_app_t + appregister i main/registry.c som launchern läser;
(2) nätverk/hämtning bor i varje apps egen komponent (net.c), plattformen
äger bara WiFi/SNTP/lås/ljus/rotation; (3) MIT-licens.
Det här repot innehåller EN app: VibePulse (Claude/Codex-användning via tools/tokenserver på Macen, platt JSON över LAN). Den ligger först i registret, så en färsk klon utifrån bygger en binär som startar i VibePulse och ingenting annat.
Solelkollen och Vibbe/Buddy är egna produkter i egna repon och dras in som
companion-inputs när de finns utcheckade — TORGET_SOLELKOLLEN_DIR
(default ~/Solelkollen/components) respektive TORGET_BUDDY_DIR (default
~/Buddy/components). Byggena sätter TORGET_HAVE_SOLELKOLLEN /
TORGET_HAVE_BUDDY och registerposterna i main/registry.c är grindade på
dem. Exakt källrevision för companion-inputen finns i
spec/hardware-sources.yaml. En skärm = en binär: har du båda utcheckade
får du alla tre apparna i samma bygge, växlingsbara i launchern.
Detta repo äger nu glaset. Den första fysiska flashen gjordes 2026-08-13
med användarens uttryckliga tillåtelse, från mergad main; den statiska
fysiska grinden är PASSERAD för kvotsidorna, agentmonitorn och Max Tracker,
och Solceller-kopian är avvecklad som skärmens drivrutin. Evidens:
docs/superpowers/reviews/2026-08-13-max-tracker-physical-static.md.
Fortfarande ogrindat: rörelse/animation — den kräver
interaktionsprotokollet i AMOLED-skillen, mätt på panelen först.
- Bänk/sim först, flash sen. Simulatorn är specen; en obevakad körning dumpar /tmp/torget-*.bmp som pixelfacit.
- Värdlagren är tunna. platform/, components/app_* (utom net.c) och kärnkomponenterna delas byte-identiskt mellan sim och target. UI-beteende hör hemma i appen/platform/, aldrig i main/main.c eller sim/main.c.
- Kontraktet är heligt. Bryts torget_app.h eller torget.h bumpas TORGET_APP_API_VERSION — launchern hoppar över appar med fel version.
- Biblioteksregeln: skörda vid ANDRA användningen, bygg aldrig i förväg (torget_fmt, torget_ticker, torget_net skördades när VibePulse, då kallad Tokenmätaren, blev andra användaren — det är mallen).
- Ärlighetsinvarianten: aldrig påhittade nollor — utan data visas streck; räknare backar aldrig; copyn säger vad siffran faktiskt mäter.
Use .claude/skills/iterating-esp32-amoled-ui/SKILL.md for AMOLED work. Show
exact 480 x 480 output at meaningful stages. Review the static physical AMOLED
before motion. Studio approval never authorizes a flash; obtain explicit user
authorization for the physical install.
docs/observability.md maps every log the system generates (device serial,
tokenserver stdout/launchd file, GET / diagnostics, state files, the screen
itself) and contains the periodic comb routine — follow it when asked to
comb, audit, or investigate logs or odd behavior. Findings go to
docs/observability-backlog.md. Read docs/lessons.md before touching
pollers, parsers, staleness logic, or the launchd setup; fixes with a
root-cause story add an entry there.
bsp_display_lock()LJUGER (esp_err_t genom bool, spegelvänt) — användesp_lv_adapter_lock(-1)direkt (plattformens torget_ui_lock gör rätt), annars heapkorruption och eviga loopar.- LVGL 9.5:
lv_span_set_textritar INTE om — explicitlv_spangroup_refresh. - För IMU-adress och fysisk verifiering gäller capability
sensors.imu-qmi8658; komponentens header deklarerarread_accel_mg, som saknas i källan — användread_accel. - Rotationskalibrering: SG_QUAD_UP 1, SG_QUAD_DIR -1, trösklar med iterationshistorik i rotation.c. Kalibrera fysisk hårdvara med ETT strukturerat flerlägestest, aldrig fotoforensik; en konstant per iteration.
- S3:an är 2,4 GHz-only; bootskanningen i loggen är facit för vilka nät som finns. MADCTL och touch roteras ALLTID i samma grepp.
- ESP-IDF 5.5.2 i
~/esp/esp-idf(. ~/esp/esp-idf/export.sh), LVGL pinnad 9.5.0 i BÅDE sim och target (bump båda i samma commit).
Vibbe/Buddy är underhållarens companion-app via ~/Buddy/components och
ingår inte i en färsk klon. audio.microphones, audio.speaker-output och
usb.device är
firmware-enabled genom det build-inputet; exakt revision och evidens finns i
spec/hardware-sources.yaml. Fysisk mikrofon-/högtalarfunktion är fortfarande
overifierad.
- WiFi-provisionering + OTA + konfig-UI — trigger: första enheten som lämnar huset (kompilerad secrets.h duger inte för sålda enheter; ESP-IDF:s wifi_provisioning finns färdig).
- Responsiv layout för andra Waveshare-storlekar — trigger: andra skärmtypen.
- Butiks-/paketmaskineri och appar i egna repon via Espressifs registry — trigger: bevisad traktion efter open source.
- Röststyrning för befintliga Vibbe/Buddy är kandidat/senare tills privacy-UI, fysisk mikrofon-/högtalarverifiering samt full-duplex-, audio- och nätverksvalidering finns. Kandidatstatus är inte auktoriserat arbete; molntjänst och betalningsmodell är separata produktbeslut.
Before proposing external hardware, declaring a device limitation, or designing
a hardware-dependent feature, read spec/hardware.md,
spec/hardware-capabilities.yaml, spec/hardware-sources.yaml,
spec/device-units.yaml, and spec/hardware-opportunities.md. State whether
the idea is only silicon-capable, board-wired, firmware-enabled, and
physically verified on the named unit. Mention a relevant
unused onboard capability when it materially improves the request.
Never copy secrets or turn an opportunity into authorized implementation work.