summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-04-15fix: replace history section-header with fixed title layerv1.0.0Paul Buetow
The MenuLayer section header was inconsistent with every other screen which uses a dedicated title TextLayer. Replace it with a fixed GOTHIC_24_BOLD title ("HISTORY N S:cur/max") above the menu, matching the style of the stats, settings, and other windows. The section header height is now 0 and its draw callback is a no-op. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15feat: blue background during countdown, green only on goal hitPaul Buetow
Timer window now uses three distinct background states: - Idle (no fast running): mint green - Countdown (fast running, goal not reached): vivid cerulean blue with white text - Goal hit: Islamic green with white text Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15chore: switch default emulator to gabbro (Pebble Round 2)Paul Buetow
gabbro is now the primary dev target. Adds -basalt variants for all emulator commands so the old rectangular display is still reachable: just dev-basalt, just debug-dev-basalt just logs-basalt, just screenshot-basalt just reset-flash-basalt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15feat: polish all screens for round display (gabbro/chalk)Paul Buetow
Add a content_rect() helper that computes a safe inset origin and width for the current display shape: - Round platforms (chalk 180px, gabbro 260px): inset = display_width/6 (~30px on chalk, ~43px on gabbro) keeps all text within the circle. - Rectangular platforms: inset = 0, no change in behavior. Apply the inset to every window_load function: - SimpleMenuLayer/MenuLayer windows (menu, presets, history): use inset bounds so items are never clipped by the circular frame. - Menu windows use GColorWhite background on round so the area outside the inset menu rectangle blends seamlessly with the menu cells. - All text-layer windows (timer, goal, edit-running, history-edit, stats, settings, detail): offset all GRect positions by (ox, oy) and use content width cw instead of bounds.size.w. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14fix: show elapsed in seconds when <60s in edit-running windowPaul Buetow
When a fast was just started, DOWN appeared to do nothing because format_duration_hours_minutes rounds to minutes — both 8s and 0s display as "0h 00m". Now the edit window shows the exact seconds (e.g. "Elapsed 8s") for sub-minute elapsed times, giving clear feedback when UP/DOWN adjustments change the value. Also adds 'just reset-flash' recipe to recover from SPI flash corruption that causes the emulator to hang on the boot screen. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14fix: kill stale emulator before dev/debug-dev to prevent boot-racePaul Buetow
pebble install races against the emulator boot animation when no emulator is running, leaving the boot screen up with no app. Killing any stale instance first gives install a clean start. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14chore: update author in package.json and remove stale PLAN.mdPaul Buetow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14fix: debug menu items had NULL callbacks after window appearPaul Buetow
debug_refresh_menu() set all SimpleMenuItem.callback fields to NULL. debug_window_load() then set them to debug_menu_select_callback in a separate loop — but that loop ran *before* the debug_refresh_menu() call that immediately cleared them again. debug_window_appear also calls debug_refresh_menu(), so every re-focus wiped the callbacks. Fix: move the callback assignment into debug_refresh_menu() itself (adding a forward declaration so the function is in scope), and remove the now-redundant loop from debug_window_load(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14fix: move dev-mode indicator from stage text to titlePaul Buetow
Stage names like "DEEP AUTOPHAGY" combined with the "[DEV]" suffix exceeded the 144-px stage layer width and were silently truncated. Move the indicator to the title text as a compact '*' suffix (e.g. "COUNTDOWN*", "GOAL REACHED*", "NO FAST RUNNING*") where the base strings are short enough to always leave room for one char. The stage layer now always shows just "Stage: <name>". Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14fix: use GOTHIC_28_BOLD for timer and green for goal-reached statePaul Buetow
Two display bugs fixed: 1. Timer font: BITHAM_34_MEDIUM_NUMBERS overflows the 144-px display when all digits are wide zeros (e.g. "00:00:00"). Switch the timer layer to GOTHIC_28_BOLD once at creation — it fits both the 8-char "HH:MM:SS" countdown and the 9-char "-HH:MM:SS" overtime without truncation, so the per-refresh font swap is no longer needed. 2. Goal colour: theme_goal_background_color returned GColorOxfordBlue (dark navy) making the GOAL HIT overlay and GOAL REACHED timer state hard to distinguish from a plain dark screen. Changed to GColorIslamicGreen so both the overlay window and the post-goal timer background are vivid green, clearly signalling goal completion. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14fix: move history-edit delete from long-BACK to long-DOWNPaul Buetow
Pebble OS intercepts BACK at the firmware level before long-click handlers can fire, making window_long_click_subscribe(BUTTON_ID_BACK) unreliable. Move the 700 ms delete gesture to DOWN, which has no OS-level conflict. Update hint text accordingly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13u3: show timer window immediately on launch when fast is runningPaul Buetow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13t2: add Resume Last Fast to main menuPaul Buetow
Adds a new "Resume Last Fast" item at index 1 in the main menu that restores the most-recently completed history entry as the running fast (undo accidental stop). Subtitle shows the last fast duration, or "No previous fast" when unavailable or a fast is already running. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13s3: goal auto-continue, 10s test preset, fix overtime font and streak crashPaul Buetow
- Goal window auto-continues the fast; BACK/DOWN dismisses, SELECT stops - 10s dev preset added as last menu item (fires alarm after 10 s) - Switch to GOTHIC_28_BOLD for negative overtime to prevent truncation - Rewrite streak computation with UTC day integers to fix stack overflow Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13fix: detail_window_load must not call set_placeholder_content with selfPaul Buetow
Calling snprintf(buf, n, "%s", buf) is undefined behaviour; Pebble's ARM libc zeroes the buffer, making every placeholder window render blank. Replace the set_placeholder_content call in detail_window_load with direct text_layer_set_text calls since the static buffers are already populated by show_placeholder_window before the window is pushed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13v2: add delete fast from history via long-press BACK in edit windowPaul Buetow
Adds history_delete_entry() in fastforge_core.c which removes an entry at a given index by shifting the tail with memmove, zeroing the vacated slot, recomputing streaks, and persisting. Wires a long-press BACK (700ms) handler in the history edit window that calls it. Updates the hint text to inform the user. Fixed hint text buffer from [40] to [48] to fit the full string. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13u2: add cancel fast option that discards the fast without saving to historyPaul Buetow
Adds fast_cancel() in fastforge_core.c which clears the running fast and saves state without appending to history. Wires a new "Cancel Current Fast" main menu item (index 3) that calls it, showing a confirmation placeholder. Updates sync_main_menu_state() to reflect cancel availability dynamically. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13r2: add About menu item with author credit and source URLPaul Buetow
Adds an About entry at the bottom of the main menu. Selecting it shows a detail window with the author (Paul Buetow) and source code location (codeberg.org/snonux/fastforge). Reuses the existing detail window infrastructure via show_placeholder_window — no new window needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13l2: remove the fasting science screen from the appPaul Buetow
Deleted all science-related code: window, text layers, buffers, callbacks, click handlers, window load/unload/appear functions, menu item, and enum entry. Renumbered main menu enum (8 items → 7). Updated AGENTS.md and PLAN.md to reflect the removal. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13s2: keep timer running negative after goal with reached themePaul Buetow
2026-04-13add CLAUDE.mdPaul Buetow
2026-04-13q2: add host-side unit test harnessPaul Buetow
2026-04-13p2: use stdint.h for SIZE_MAX guardPaul Buetow
2026-04-13p2: guard streak allocation size overflowPaul Buetow
2026-04-13p2: remove silent streak recompute truncationPaul Buetow
2026-04-13p2: extract pure streak recompute APIPaul Buetow
2026-04-13refactor(o2): extract history csv helpers into fastforge_csvPaul Buetow
2026-04-13n2: finalize fastforge_logic time handling seamPaul Buetow
2026-04-13n2: remove stray pebble.h include from fastforge logicPaul Buetow
2026-04-13n2: remove dead time include-guard hack in fastforge_logicPaul Buetow
2026-04-13n2: finalize local_day_start in Pebble-free logic modulePaul Buetow
2026-04-13n2: remove ABI-sensitive local_day_start tm fallbackPaul Buetow
2026-04-13n2: restore local_day_start to pebble-free logic modulePaul Buetow
2026-04-13n2: remove pebble.h dependency from fastforge_logicPaul Buetow
2026-04-13n2: extract Pebble-free fasting logic modulePaul Buetow
2026-04-13Add .cursor and .claude to .gitignorePaul Buetow
2026-04-13m2: split Pebble-free types into separate headerPaul Buetow
2026-04-12joPaul Buetow
2026-04-1222: fix basalt history screen renderingPaul Buetow
2026-04-12j2: add color theme for Pebble color watchesPaul Buetow
2026-04-12i2: split FastForge core and history modulesPaul Buetow
2026-04-12Refactor FastForge C best practices for task 42Paul Buetow
2026-04-1222: fix basalt debug settings footer clippingPaul Buetow
2026-04-1222: polish basalt UI hints and debug layoutPaul Buetow
2026-04-12Task 72: isolate companion export sessionsPaul Buetow
2026-04-12Task 72: remove companion auto export requestPaul Buetow
2026-04-12Task 72: snapshot CSV backup handshakePaul Buetow
2026-04-12Task 72: add CSV AppMessage backupPaul Buetow
2026-04-12Implement task 92 quick-start presetsPaul Buetow
2026-04-1262: add fast notes, tags, and milestone badgesPaul Buetow