— Now

The working log

What I'm building, shipping, reading, and talking about. Updated every couple of weeks.

Aug 2026BUILDVitals: the path for the phone to read health data on its own, opens in new tabBuilt the plumbing for the phone to read health data straight from Android's own health store and send it to the dashboard — the piece that eventually removes the middleman between the watch and the app. Reading that store requires native code, so the app moved onto a custom development build that allows it. Added a translator that converts Android's format into the dashboard's own, with tests behind it; the permission to send data is now separate from the one used for notifications, so each is managed on its own; and there's a diagnostic screen that shows a sync happening step by step. Two design questions go through design review before any of this reaches a user-facing screen. Next up is manual: install the app and confirm the readings land.
Aug 2026BUILDVitals: first installable Android app, opens in new tabThe app stopped being code and became a file you install on a phone: the first Android build came out green. Getting there took four passes over the project's foundations — icons generated with a real tool, the packaging configuration returned to its standard values, missing dependencies declared, and the date-and-time self-check wired so it runs in real builds too, not only in development. With that, the time-zone check now runs inside the installed app, and the risk this phase opened is closed for Android.
Aug 2026BUILDVitals: the phone app begins — Android first, iPhone later, opens in new tabThe phone app is under way. One decision was made and written down up front: Android only for now — there's no iPhone here to test on, so iPhone waits its turn. Before writing the app, the thing that matters most in a health dashboard was tested on a real device: that dates and times are exact. The dashboard shows everything in Panama time, and phones handle time zones through a component that some builds ship trimmed down to save space. Time formatting was rewritten so it doesn't depend on that component at all, and all twelve checks passed on the phone, not a simulator. The app's skeleton is standing: four tabs along the bottom, navigation working.
Jul 2026SHIPVitals: health data now matches the watch, and body measurements come online, opens in new tabA precision pass over the data feeding the dashboard. Sleep readings are now filed under the same day Google uses — it dates them by the morning you wake up, while the dashboard dated them by the night you fell asleep, and the two now speak the same language. The heart-recovery reading now comes from the official daily summary rather than a raw stream, and matches what the watch app shows: 273.6 against 274. Weight and body fat are connected to the sync for the first time. And the Google connection now reports when something doesn't arrive instead of accepting an empty answer as valid — any future gap shows up immediately.
Jul 2026SHIPVitals: foundation ready for native apps — one repository, data with a controlled source, opens in new tabTwo big pieces are done and running in production. First: the entire codebase was reorganized into a monorepo — the web app and the future phone apps now live together and will share logic instead of duplicating it. Second: the front door for health data now recognizes which source each reading comes from and decides what to do with it — write it, observe it in parallel, or discard it — which makes it possible to migrate from web to apps in stages, without losing or duplicating anything. Eleven improvements in total, all verified in production.
Jul 2026SHIPSolaar: model routing pinned to Claude Opus 5 / Sonnet 5, with per-agent effort tuning, opens in new tabEvery agent's model assignment now resolves against the live Claude catalog instead of a stale guess: opus → claude-opus-5, sonnet → claude-sonnet-5, each tuned with its own effort level — xhigh for codegen agents, high for deep-reasoning agents, medium for synthesis and reporting. The Security agent picked up a mandatory refusal fallback, since Opus 5's stronger cybersecurity classifiers can misfire on legitimate threat-modelling work. Caught my own regression in scripts/lint-model-routing.py before merge — a reformatted table broke the pre-push check that cross-references every agent wrapper's tier — then pushed the refreshed routing policy across all 16 enrolled projects.
Jun 2026SHIPSolaar: added a Creative Director agent, split from UX, opens in new tabA new Creative Director agent now runs creative ideation — mood, metaphor, visual direction — before UX operationalizes the chosen direction into tokens and specs. It generates three divergent directions, the Architect runs a feasibility scan, then a new Checkpoint 1.5 locks the direction before UX work starts. Rule 10 now draws a hard boundary: UX must not invent the creative direction from scratch, and the Creative Director must not define tokens or component specs.
Jun 2026SHIPVitals: timeline navigation, system-wide, opens in new tabEvery health metric now moves by date, not just today's snapshot. Sleep, heart rate, activity, body — one navigation model across the whole app.
Jun 2026SHIPSolaar: Rule 19 background-claim-gate, self-hosted Mac mini initiative, opens in new tabRule 19 codified and enforced: a Stop hook reads the turn's transcript and blocks any response that claims work is 'running in the background' when no real task was launched — phantom async claims can no longer ship. Same gate hardened against false-positives on meta-discussion. Also opened the self-hosted Mac mini initiative: strategist adoption plan, multiple architect reviews, and a home-infra starter kit for running an LLM locally with ranked Cloudflare Workers AI / AI Gateway cloud fallbacks.
Jun 2026SHIPVitals: nap tracking, opens in new tabNaps now ingest and display end-to-end. Backend retains them as a sleep.naps[] sibling rather than folding them into the main sleep block, preserving the distinction between nocturnal sleep and daytime naps. UI surfaces them as a tile nap line, a /sleep naps card, and a trend — shipped against a UX verdict that defined how naps should read alongside the night's primary sleep.
Jun 2026SHIPSolaar: worktree-gate hook, labeler v5 migration, opens in new tabA worktree-gate hook now blocks writes that escape a git worktree into the main checkout — closing the 'wrote to main, not the worktree' class of error, which turned out to be an absolute-path rendering issue, not a CWD one. Also migrated labeler.yml to the actions/labeler@v5 schema (label → changed-files → any-glob-to-any-file).
Jun 2026SHIPSolaar: behavioral regression harness, PR auto-labeler, SECRETS registry, Sentinel blast-radius caps, opens in new tabRules became testable. A behavioral regression harness runs scenarios against Rules 10/11/12 so a fix can't silently regress — with cross-platform fixes for Windows hook crashes, stdin prompt piping, and subscription auth. Shipped alongside: a PR auto-labeler by changed-file path, a SECRETS.md registry, stale-bot config, a doc-drift advisory check on pre-push, a rule-specific PR template, and Sentinel blast-radius caps with a new health-all anytime command.
Jun 2026SHIPVitals: on-device snore detection, 3-state Fitbit reconnect, SpO₂ fix, opens in new tabFirst-party snore detection that runs entirely on-device — YAMNet TFLite in the Android watcher classifies audio with no upload (Phase 6), wired through the dashboard as schema, types, ingest, and a morning-briefing signal, then surfaced as a settings toggle and a sleep-tile line. Fitbit reconnect rebuilt as a 3-state connection UI with a morphing reconnect button and token-revocation tracking. SpO₂ corrected to read the daily-oxygen-saturation summary, matching the spec's method support.
Jun 2026SHIPSolaar: pr-push-gate and secret-read-gate PreToolUse hooks, advisory gates for Rules 17/5b/16, opens in new tabThree production-incident rules got mechanical enforcement. pr-push-gate refuses a push to a merged or wrong branch; secret-read-gate blocks reads of .env files before they happen. Advisory gates added for Rule 17 (validate facts against the source), Rule 5b (read before asking), and Rule 16 (plans aren't saved until they're in git), plus a Windows checklist, telemetry, test backfill, and a Python lint pass.
Jun 2026SHIPVitals: evening briefing data-timing fix, 10 metric explainer sheets, opens in new tabThe evening briefing had a data-timing bug — generation ran before health data arrived overnight, producing empty reports; fixed the timing and re-enabled Google Health ingestion. Ten metrics got info-icon explainer bottom sheets so a number like HRV or strain comes with a plain-language explanation of what it means and why it matters. Also wrote the snore-detection spec/plan/tasks that shipped four days later.
Jun 2026SHIPSolaar: design-extractor hardening, lint-wrap CI, opens in new tabDropped the Bash tool from the design-extractor agent — it parses share links and writes tokens, so shell access was unnecessary attack surface — and added a lint-wrap step to CI to standardize how lint runs across the agent fleet.
Jun 2026SHIPVitals: Cycle Journal + Daily Log, third translation pass, locale-aware Coach, opens in new tabNew Journal feature rebuilt faithfully from a ZIP design — Cycle Journal and Daily Log with a phase card, phase banner, Bristol-scale SVG illustrations, a cycle-mood rename, and full API wiring (plus a migration fix dropping a stray public. prefix). The third i18n pass translated nav, trends, cards, recovery, steps/active/calories, strain tiers, and intraday labels — and the Coach now receives the user's locale so it responds in their language. Also wired a dead SettingsSheet Fitbit sync button.
Jun 2026SHIPVitals: Spanish language support — infrastructure + first two translation passes, opens in new tabStood up full Spanish i18n from scratch: infrastructure plus the UI layer, then a second pass covering body, workouts, and insights. QA fixes followed — html lang attribute, heart labels — alongside two reliability fixes: guarding NightSnapshot deltas against non-consecutive nights, and showing the previous night's briefing after midnight instead of a blank state.
Jun 2026SHIPVitals: Recovery Ring, Strain Engine, Stress Monitor, opens in new tabThree days, one transformation. Recovery score (0–100) from HRV, resting HR, and sleep — rendered as a glowing ring on Today. Full strain engine mapping heart rate zone minutes to a 0–21 scale with a live intraday chart updating every 15 minutes. Stress Monitor classifying autonomic state (Optimal / Balanced / Low) from HRV variability and sleep fragmentation. Weekly Assessments: 7-day summary, Healthspan Index, and Correlation Insights. Respiratory rate had three stacked bugs — wrong filter, wrong parser, timezone offset silently dropping Panama 10 PM data from the UTC window. All fixed, two weeks backfilled. Coach rebuilt as a real chat: bottom-anchored, markdown tables.
Jun 2026SHIPSolaar: Rules 16–18, structural routing gate, pr-state-gate.py, lefthook sync fix, opens in new tabThree rules codified from three real incidents: plans not committed to git don't exist for any other tool or machine; never state an API fact by pattern-matching — read the spec; the orchestrator coordinates, it does not implement — now enforced by routing-gate.py, a hook that blocks source file edits if the right specialist agent hasn't been invoked. Also: pr-state-gate.py replaces the bash script in pure Python (no WSL dependency), and the sync script was fixed to stop pushing lefthook.yml into the 14 child repos.
May 2026SHIPVitals: full Claude Design redesign — 50 pull requests, ring+pulse brand, WCAG AA, Coach, Trends, opens in new tabComplete visual rebuild against a Claude Design spec — 22-component audit, 50 pull requests, dark-first token system with WCAG AA across three themes. New ring+pulse logo-mark, 6-keyframe SplashScreen, rebuilt PWA icons, MetricTile with coloured delta arrows, shared PageHeader with day-over-day deltas, SpO₂ reference band on every chart. Coach screen added: streaming Claude responses, markdown rendering, keyboard-safe layout. Trends screen overhauled: period toggle, real 30-day averages, mini-sparklines.
May 2026SHIPVitals: Google Health API — Fitbit ingestion, dual data sources, SpO₂ median pipeline, opens in new tabAdded Fitbit support via Google Health API OAuth2 — second ingestion path alongside the Galaxy Watch companion app, same schema, device-agnostic. Five vital types only support the list endpoint (not dailyRollUp); that's a method-support constraint in the spec, not inferrable from the 400 error body. SpO₂ stored as daily median to resist outlier sensor readings; Samsung and Google Health pipelines de-collided so neither overwrites the other.
May 2026SHIPTrend Intelligence: two verticals, four live data sources, full strategic briefTwo dedicated verticals — food & beverage and pet nutrition — from a single codebase, each with its own search experience and brand-level output. Four data sources run in parallel: Firecrawl (3 simultaneous searches across regional market data, global benchmarks, and industry reports), Google Trends (12-month search interest across 9 countries — CR, GT, DO, PR, PA, SV, HN, NI, JM — with direction signals and rising queries), YouTube (top Spanish-language videos from the last 6 months ranked by views), and Reddit (consumer conversations surfaced via Google Custom Search). Each query produces a full brief in under 3 minutes: three classified trends (Alto Momentum / En Ascenso / Emergente) with global benchmarks, emerging signals with cross-regional context, three key stats plus a consumer quote, strategic recommendations, consumption frequency, use occasions, three to five recipes with regional framing, and one tailored opportunity per brand. Country chips color-coded — green, amber, grey — with a search-term hint when low scores are terminology-driven. One-click print/PDF export. Full search history per vertical.
May 2026SHIPSolaar: from scaffolding tool to continuous delivery partner, opens in new tabNine improvements across three phases. Phase 1 — Foundation: six pipeline archetypes (landing page through full SaaS) let the Strategist skip irrelevant steps automatically; Project Danger Map captures landmines, unconventional conventions, and hard constraints in a cumulative per-project file every agent reads at session open. Phase 2 — Intelligence Layer: Client Knowledge Base replaces one-off design token files with a structured history of stack decisions, approved libraries, risk profile, and accumulated lessons per client; Rule Activation Tracking reviews all 14 production-incident rules at session close; Convention Detection scans commits and agent notes to inherit what was learned without re-discovering it from code. Phase 3 — New Agents: Architect Review (Step 4.5) checks six structural properties before the security review — deployment target conformance, dual code path detection, API contract alignment, env var completeness, and Danger Map violations; Production Sentinel fetches Vercel, Sentry, and Lighthouse state after every deploy and surfaces warnings before any session opens.
May 2026BUILDSolaar: monitoring agent, Android Native scaffold, Feature Sprint, opens in new tabThree new agents this week. The Monitoring agent wires Sentry, error boundaries, and analytics into every scaffold before first deploy — observable and deployable are now the same step. The Android Native agent was forced into existence by six consecutive CI failures during the Balboa Finance kickoff: stale Gradle versions written from memory. It now queries Maven Central live before writing a single dependency version. The Feature Sprint agent runs a spec → plan → tasks loop on 'feature <name>': clarification questions first, session-sized executable tasks after. Also: prompt cache ordering earns 60–80% input-token savings on parallel pipeline steps; Rule 14 treats unchecked checklist items as claims to cross-validate against git log.
May 2026SHIPClaudio AI: voice input, image attachment, six new agentic toolsVoice mic via the system speech recognizer. Image attachment: base64 → Claude multimodal with thumbnail preview and a decode-failure snackbar. Six new tools: create_calendar_event, draft_email, update_task, snooze_task, get_calendar_events, and generate_work_plan. All follow a propose-then-confirm pattern — Claude suggests, you tap Confirm, the app executes. Chat history now persists for 24 hours; previous conversation restores on reopen with a snackbar notification.
May 2026SHIPClaudio Android: backend migrated to SupabaseReplaced the entire Notion data layer with Supabase. Room schema migration v7→8: id columns made nullable, notionLastEditedAt renamed to remoteLastEditedAt, all rows marked PENDING_WRITE. SyncEngine rewired; a MigrationWorker pushes all locally-cached data to Supabase on first login, then cleans up. Credential validation moved to first sync rather than onboarding — live Supabase validation at startup was unreliable.
May 2026BUILDBalboa FinancePersonal finance assistant — native Android rebuild. Kotlin + Compose + supabase-kt 3.6.0 + WorkManager handles offline-first sync natively; n8n skipped in favor of platform-native alternatives throughout. The kickoff through Solaar immediately exposed a gap: the orchestrator was writing Gradle dependency versions from memory, sometimes 6–12 months stale. Six consecutive CI failures drove the Android Native Scaffold agent and AGP 9.x compat matrix back into Solaar the same week. Next: UX/UI design phase.
May 2026SHIPControl TowerPersonal Claude Code usage dashboard built into mariansan.io. Token consumption across all projects — input, output, cache, cost, sessions, turns. Supabase ingest API, HMAC-SHA256 cookie auth, Recharts daily breakdown with range picker, and two sync scripts: Anthropic Admin API for org accounts, local SQLite for everyone else.
May 2026SHIPClaudio AI: Phase 3 — calendar, email, delete toolsAsk Claudio now has all four Phase 3 agentic tools: create_calendar_event (with attendees), draft_email via Gmail OAuth2, delete task, and delete initiative. Plus a daily limit reset button. Sonnet 3.5 handles agentic tool use; Haiku 4.5 handles task parsing.
May 2026BUILDVeggieCorner: image pipeline moved to MCP server, opens in new tabfal.media blocks server-to-server fetches and Vercel was timing out on generate + upload. Moved the full fal.ai → Cloudinary pipeline into a local MCP stdio server. No timeouts, full error visibility, no Vercel env constraints.
May 2026BUILDClaudio Android: duplicate task guardTwo-layer guard for Ask Claudio: system prompt checks existing tasks before calling create_task; ViewModel hard-blocks on a Room DB name match and surfaces a clear message instead of silently duplicating. Also fixed three pre-existing test compilation errors (missing DAO fields, constructor arity).
May 2026SHIPCulinary Intelligence: demo readyAI market intelligence for food and beverage trends in Central America and the Caribbean. Type a category — 'Bebidas Funcionales', 'Snacks Proteicos' — and get a full brief: momentum scoring, emerging signals, consumer insights, strategic recommendations, brand opportunities. Parallel search via Firecrawl + Claude Sonnet. Demoing May 12.
May 2026BUILDSolaar: init / sync / meta-retro loop, opens in new tabAdded 'init' (spin up a project locally without GitHub), 'sync' (add the orchestrator to an existing project), worktree session guards, meta-retro loop for pattern analysis, Rule 12 (check PR state before pushing), and Rule 10 extension (design tokens require UX agent sign-off).
May 2026BUILDClaudio Android: Projects UX fixRemoved Projects from the view mode toggle — it was the only entry point to the Projects screen, so removing it silently hid a key feature. Rewired Projects as a standalone nav destination so it's always reachable regardless of view mode. Fix surfaced by a UX agent consultation that caught the navigation dependency before the toggle change could ship.
May 2026SHIPVitals: rebranded, live refresh, Apple polish, opens in new tabRebranded to 'Vitals by mariansan' — new wordmark, pulse-V ECG logo, PWA manifest, and metadata. Added live data refresh via FCM trigger + Supabase Realtime, time-aware greeting, frosted navbar, hairline cards, and Apple Health tint tokens. FCM closes the loop: dashboard PWA triggers an immediate watcher sync on demand.
May 2026BUILDVitals: n8n replaced with Vercel Cron, generation reliability overhaul, opens in new tabReplaced n8n with Vercel Cron Jobs for scheduled briefing generation — no more external workflow orchestrator. Fixed a generation_lock race condition, added null-guards, moved Claude generation inside after() to survive Vercel's response timeout, hardened RLS on generation_lock, and added an Idempotency-Key header to the watcher's ingest upload.
Apr 2026SHIPVitals, opens in new tabPersonal health dashboard for Galaxy Watch: companion Android app → n8n → Claude Sonnet → Supabase → Next.js PWA. Daily AI briefing with sleep, heart, activity, and body trends.
Apr 2026SHIPClaudio for AndroidPersonal productivity app built on Kotlin + Compose. Notion is the database; Claudio is the mobile interface — AI daily briefs, full task CRUD, project tracking, and a conversational assistant baked in.
Apr 2026BUILDPrototyping a Claude-powered brief generator for personal usageCrawls different news sources and topics and provides a personal briefing.
Apr 2026BUILDWiring a weekly review agent into my calendar stackReads the past week, surfaces patterns I'd miss, drafts Friday summary in my voice.
Apr 2026TALKMasterclass on AI assistant and AI agents.
Apr 2026SHIPVeggie Corner, opens in new tabThe foundation of my personal recipe book is complete.
Apr 2026READEnterprise Design ThinkingTrying to overcome the challenges of innovation within enterprise scale.