You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vibed/.beans/vibed-nf6g--footer-data-tab...

3.1 KiB

title status type priority created_at updated_at
Footer, Data tab with wipe, streak-multiplier rewards, About pixel rules completed feature normal 2026-07-14T23:41:06Z 2026-07-15T00:10:14Z

Four changes to bit-by-bit index.html + DESIGN.md:

  1. Add a page footer disclosing it was written with Claude Code (Sonnet 5, Opus 4.8, Fable 5).
  2. Rename the 'Backup' settings tab to 'Data' and add a 'wipe all data' option there.
  3. Streak becomes a reward multiplier: units per day = streak-on-that-day x triangular(checks). Recalibrate pixelsPerCheck and the finish estimate; update DESIGN.md.
  4. About page: describe specifically how earning pixels works (per-check escalation + streak multiplier), encouraging finishing the whole day.

Summary of Changes

All four changes landed in index.html (+ docs/DESIGN.md, docs/ARCHITECTURE.md, README.md):

  1. Footer — added <footer class="app-footer"> (plain text, no external link) disclosing 'Written with Claude Code · Sonnet 5, Opus 4.8 & Fable 5'.
  2. Data tab + wipe — renamed the 'Backup' settings tab to 'Data' (data-tab/panel id data), added a 'Danger zone' with a double-confirm 'Wipe all data' button that clears the localStorage keys, resets to defaultState(), and returns to first-run onboarding.
  3. Streak multiplier — reveal units per day are now streakOnDay(d) × triangular(checks) (new streakOnDay helper). Recalibrated pixelsPerCheckFor to divide by triangular(30) × triangular(habitCount), and fixed the upload finish-day estimate to solve the triangular streak accumulation.
  4. About page — added two paragraphs describing exactly how pixels are earned (per-check escalation + streak multiplier) and encouraging finishing the whole day's list; updated the version line to name all three models.

Validation

  • grep for http://|https://|fetch( → no external references.
  • Playwright headless run: fresh load shows onboarding + footer; seeded 3-consecutive-day log on a 36px image renders '6 / 36 pixels' (confirms 1+2+3 streak-multiplied units, not the old flat 3); settings tabs are Habits/Artwork/Data/About (no Backup); wipe button clears localStorage and returns to onboarding; zero console errors, zero non-local network requests.

Follow-up: upload during onboarding

The onboarding 'Pick your first picture' step only offered presets — no way to upload an image on first setup (upload previously lived only in Settings → Artwork). Added the upload pipeline to onboarding step 2:

  • New file input + grid-size select + name field + live preview/estimate in #obStep2, reusing downsampleImageFile/renderThumbnail.
  • Generalized the onboarding selection from obSelectedPreset to obSelectedDef (preset or upload) plus obUploadResult; preset and upload selections mutually supersede each other; 'Start painting' commits either.
  • Validated via Playwright: uploading a PNG in onboarding shows the preview + '~N days' estimate, enables Start, and starts a 24×24 source:'upload' artwork named from the field — zero console errors, zero network requests. Preset/footer/data/wipe/streak regression suite still green. Updated DESIGN.md §2.