What changed
Changelog.
Every change worth noting, newest first. Want to see what is coming next? Look at the roadmap.
Changelog
All notable changes to Kinoku are recorded here. The format is loosely based on Keep a Changelog and the project follows Semantic Versioning where practical. Dates are in YYYY-MM-DD.
Public-facing roadmap lives in ROADMAP.md. Internal planning mapping lives in docs/claude/ROADMAP_INTERNAL.md.
Change categories
- Added — new features
- Changed — changes to existing behavior
- Improved — polish, performance, or UX refinements
- Fixed — bug fixes
- Removed — removed features or deprecated APIs
- Security — privacy- or security-relevant changes
[Unreleased]
Added
- Rate how a run felt. After any GPS run you can log how hard it felt (Easy / Moderate / Hard / Max) — your perception, not just the pace. Kinoku gently notes when your felt effort and the measured intensity disagree (a deceptively hard easy day, or a first run back after time off), and never overrules you. The run summary now leads with your route and stats, and the effort card reads as an observation ("Intensity"), not a verdict. Your felt-effort rating rides export/import too, so it survives a backup restore or a move to a new phone. Free for everyone. (Schema v140 → v141, additive)
- Guided routines just got smart — chapters become exercises. Paste a YouTube link with a chapter list in the description (most fitness videos have them — "0:00 Warm-up, 2:30 Squats, …") and Kinoku detects them automatically and offers to build your exercise list from them with the timestamps pre-pinned. One paste, full routine. Also new: the editor now leads with a friendly "Guided routine (optional)" card on every routine — even on a brand-new one — so the feature is obvious from the moment you create a routine. The create-routine sheet now has its own optional video URL field so a fresh routine can be born as a guided routine. The cached video author / channel and video duration are now stored locally too, surface as a "≈ 22 min" subtitle on routine cards, AND ride export/import/share so they survive ZIP backups and routine deep-link sharing (envelope bumped to v=3, backward-compatible). (Schema v139 → v140, additive)
- In-workout video controls feel native. A 16:9 hero thumbnail now sits at the top of the active-session card on the Today tab — tap it to open the video. Every exercise row with a pinned video moment shows a small ▶ MM:SS chip so you can jump straight to that section. Coming back from the video? Kinoku notices and offers to log the time you watched as a time-only set on the current exercise (or whichever exercise you tapped from), with one tap to confirm or dismiss. The top-bar play icon is gone — the hero on the card is the one place to look.
- Your rest timer follows you everywhere now. While a rest timer is counting down, a compact bar stays docked just above the bottom nav on every screen — Today, Calendar, Body, Coach, Score, settings, anywhere — showing which exercise you're resting for and the live countdown, with pause/resume, +10s, and skip right there in the bar. Tap it to jump straight back to the active workout. It stays out of the way on the workout screen itself, which already shows its own timer. Free for everyone.
Security
- Guided-routine network surfaces hardened. The watch-page HTML fetch (used to detect chapter timestamps when the oEmbed response doesn't include them) now caps response bodies at 5 MB and guards against
OutOfMemoryError. The YouTube/Vimeo host classifier was tightened from substring match (url.contains("youtube.com"), which incorrectly matchedhttps://evil.example.com/?ref=youtube.com) to a strictURI-host parse withendsWithrules. The chapter parser bounds description length (100 KB), line count (2 000), result size (200 chapters), and individual line length (500 chars) so a hostile description can't trigger quadratic-backtracking DoS or unbounded allocations. - YouTube chapter detection is now opt-in. Pasting a YouTube link in a routine fetches the public title, thumbnail, and author (one network call, gated by the existing "Fetch video metadata" toggle). The chapter-detection step makes a second network call to YouTube's public watch page to read chapter timestamps + duration — that step now defaults OFF and is opted in via Settings → Privacy & Data → "Detect chapters from YouTube videos". Privacy policy bumped to v5 to re-fire the in-app re-consent surface so users who accepted v4 explicitly accept the new processor set.
Changed
- Social Bets is taking a short break. The friend-challenge feature (workout-count / streak / volume wagers with QR + deep-link invites) is turned off for the v1.0 launch while its cloud sync gets a final round of testing across more devices. It's fully built and returning in a near-term update — and nothing about it was ever required for the rest of the app, which works entirely offline. If you joined any bets during beta, your data is untouched and you can still leave any bet from Settings → Import & Export → Your Data Rights.
- The Today tab leads with a recommendation now, not a status row. The old "SMART TODAY" header (caps + lightbulb + 3-dot menu + warm-coral muscle-freshness chips) is gone. In its place, every tier sees a calmer "Today" section with a single hero card answering the only question that matters on this screen: what should I do today? FREE users get the rotation step you're due for and a clean CTA. PRO+ users additionally get an anatomical body figure on the right side of the card showing per-muscle recovery state (the same heat-mapped anatomy that's been powering the post-workout summary), plus reasoning-led copy when systemic fatigue warrants it — "A lighter pull day looks right today · shoulders + arms repairing" instead of "Next: pull day". ELITE users additionally get a readiness-aware override: when last night's sleep was short or HRV is down, the hero pivots to an easy-day suggestion with the reasoning right in the headline ("Easy day — sleep was 5h 12m · swap to mobility or a Z2 walk"). Tap the figure to drill into the full Muscle Map. The variant is decided by
BuildTodayRecommendationUseCasefrom the same engine outputs that drove the old cards — same intelligence, new shape that puts the decision first and the evidence right beside it. - The Today tab now adapts to where you are in your training. New installs and users with fewer than ten completed workouts see a simpler Beginner layout — just the recommendation, a Start button, and a streak line — so you're not overwhelmed by chrome on day one. After ten completed workouts the layout automatically upgrades to the full Power view with coach-note chips, persona-tailored stats, body-figure interactions, and a compressed weekly ribbon. A one-time inline tooltip explains the change the first time it happens. You can override the auto-detection anytime in Settings → Appearance → "Today screen detail" (Auto / Beginner / Power) — the toggle is available on every tier. The bottom-line: same intelligence, layered surfaces, no overwhelm on day one.
- The Today hero is now decision-first across both modes. Several intelligence-aware additions ride on top of the Power view: a one-glance state pill ("Looks good" / "Adjusted" / "Easy day") in the hero header that summarises what the recommendation engine concluded before you read the headline; coach notes folded into the hero as a tap-to-expand chip (the standalone "Today's Briefing" card is gone — its top item now appears inline beneath the recommendation subtitle); time-aware copy that greets morning workouts with last night's sleep duration if your wearable shared it ("Slept 7h 20m · Full upper 1 looks right today") and pivots to "Great session — Xkg moved, N PRs · Recovery starts now" for the 30 minutes after you finish; persona-aware stats ribbon that swaps the generic "Pulse Steady · 2 of 3" line for weekly distance when your training history skews heavily endurance; and a compressed weekly stats ribbon that lives one tap away below the hero instead of dominating the top of the screen.
- Pulse Score rings are now free for everyone. All four rings of the Kinoku Score hero — Effort, Consistency, Recovery, Wellness — now render at full opacity for every tier, and the score-history sparkline is unlocked for FREE too. Tapping any ring opens the per-dimension breakdown sheet for every user (Recovery still requires Health Connect data, Wellness still requires the daily-metrics opt-in — both surface their own beginner-friendly "Connect" or "Set up" CTAs from inside the sheet). The mid-stream "Unlock Recovery & Wellness" upgrade nudge is gone; in its place a single world-class Kinoku PRO / Kinoku ELITE card sits at the bottom of the Pulse screen, pitching what each tier actually adds (longer forecasts, more insights, AI narratives for Form curve and patterns, readiness-adjusted suggestions). ELITE users see no upsell card. Tapping the wellness CTA in the body of the screen now opens the breakdown sheet first so beginners get an explainer before landing on Metric Management.
- Training Load moved out of the Running hub. The Fitness / Fatigue / Form curves are computed from your whole training week — gym sessions, runs, and brisk walks all feed the same Banister model — so the entry point now lives where it belongs: at the top of the Analytics → Recovery tab (one tap from the existing Form-curve preview) and as a top-level entry in the side panel. The Running hub keeps the genuinely run-only Race Predictions in a renamed Predictions section. The Coach screen's Form-curve hero still drills into the same screen unchanged.
Added
"New" badge on the Today tab surfaces PRs since you last opened. A small chip in the hero header appears when there are personal records logged since your last open of the Today tab — handy for catching a PR a watch-logged workout earned while you weren't looking. Tap the badge to see the list; tap a row to jump to that exercise's detail. The cursor stays per-device, so backups and restores won't carry a stale "seen" timestamp across phones. PR-only in the MVP; achievement and missed-plan categories are queued for a follow-up.
Hold and drag the body figure to inspect any muscle. The anatomical figure inside the Today hero now responds to long-press + drag — hold for half a second to enter browse mode (a soft haptic confirms entry; the figure lifts), then drag across the anatomy to see any muscle's recovery state, last hit, and recovery percentage live in the card's detail panel. Designed not to interfere with the date-strip swipe: a quick horizontal drag still scrolls between days; only a long-hold enters muscle-inspection mode. Release to exit. A quick tap on the figure still opens the full Muscle Map.
Follow-along videos for routines. Attach a YouTube or Vimeo link to any routine to turn it into a guided session. A play icon appears on the routine card, in the routine detail screen, and in the in-workout top bar — tap to open the video. Bookmark each exercise's moment in the video — handy for reviewing form later (you can verify the timing via the editor's "Preview at X:YY" button without leaving the dialog). Each follow-along workout gets a distinctive "Follow-along: ..." treatment in History with a thumbnail. Auto-open on workout start is per-routine and off by default. The video link, title, and thumbnail stay on your device; the only network call is a single public oEmbed request to fetch the title and thumbnail when you paste the URL — and that fails silently when you're offline. Everything is FREE. (Schema v138 → v139, additive)
Fixed
- Runs with no GPS data no longer strand you on a blank summary screen. Stop a run that auto-paused in your pocket (or never got a GPS lock at all) and the workout now lands in Trash with a clear "Run discarded — no GPS points were recorded. Moved to Trash." toast — instead of dropping you on a dead-end "No run data available" screen with no recovery path. The same policy is applied across the three stop points: phone Stop, process-death recovery, and the analytics-write gate — they used to disagree on the threshold, which is how the bug slipped through. If you re-open the app after a phone reboot and Kinoku recovered an abandoned run without GPS data, you'll see a "Your previous run was moved to Trash" notification on the run-tracking screen rather than the silent disappearance you'd have seen before. The summary screen distinguishes four user-visible states: spinner while loading, "still computing" while the pipeline finishes (never shows a Delete button), "no GPS data" for verified empty runs (shows Delete with a confirmation dialog), and "this run can't be found" for stale deep-links / purged ids / trashed-from-elsewhere rows (back-only, no Delete affordance). Slow devices, chunked watch sync, and missing-workout deep-links all route to the right surface. Both destructive paths — Delete and shoe reassignment — now surface a toast when the underlying write fails (the workout was hard-deleted between the read and the write), so you never see a silent "tap did nothing" outcome. Misclassified discards are recoverable from Trash for the full retention window.
- Watch sets no longer disappear on the phone when an empty session is logged before the watch has synced with the phone. If you opened the Wear app before it had paired with your phone's exercise catalog, started an empty workout, and logged sets against the watch's built-in defaults, the workout used to land on the phone with zero sets — every rep you logged silently lost at the FK boundary because the phone's catalog used different ids than the watch's standalone defaults. Now the phone, watch, and shared catalog stay aligned via a stable, locale-free canonical key derived from the exercise name. The phone receives the sets cleanly via a four-tier identity resolver (id → canonical key → name → synthetic placeholder), so the workout always renders exactly what you logged. Sections whose exercise the phone hasn't reconciled yet surface a "Tap to identify" pill in Workout Detail; a "Re-pair library" action in Settings → Wear OS does the same sweep on demand and auto-binds any pending sets against your latest catalog.
Added
One unified Calendar — plan, edit, drag, recur, and pair workouts all from the bottom-nav tab. The bottom-nav Calendar and the sidebar Training Plan are merging into one surface. Phases 1-5 of the unification ship the foundation:
- Plan workouts directly from the bottom-nav Calendar (PRO). Tap an empty date → "Plan workout" CTA opens the PlanWorkoutSheet preselected to that date. Long-press a planned card → action menu (Edit / Bring to today / Repeat today / Move to date… / Delete with confirm). Long-press a logged session → action menu (Pair with plan… / Unpair / View details).
- Source badges on planned cards distinguish where a plan came from — manual, program-generated, recurring schedule, or AI-suggested. A tiny ambient pip on each day cell signals the same authorship.
- Drag a day's plans onto another day to reschedule. Spring-physics lift on long-press, drop-target highlight, haptic feedback at pickup, hover-tick, and confirm. TalkBack users use the Move to date… menu entry as the accessible alternative.
- Recurring schedules (PRO). New "Repeat" section in PlanWorkoutSheet: Never / Weekly / Custom days / Every N weeks, plus an Until date or open-ended (capped at 26 weeks ahead, transparently re-extended on each cold start). Mon/Wed/Fri yoga, every-other-week running, all the patterns you'd expect from a desktop calendar — now in your gym app.
- Edit-scope dialog routes recurring + program-linked edits with the Google Calendar pattern. Edit one Wednesday → "Only this occurrence" / "This and following" / "All in series" (recurring) or "Only this day (detach)" / "Open program builder" (program). Past-uncompleted catch-up plans are preserved through "This and following" splits.
- Pair workouts to plans retroactively (FREE). Started a workout outside the planned-routine flow? Long-press the logged session → "Pair with plan…" picks one of the day's uncompleted plans and links the two atomically.
- AI suggestions appear as ghosted cards in the day-detail sheet (Phase 6). When today has an active rotation suggestion or an overdue weekly cadence routine, the bottom sheet shows a pale dashed "AI suggestion" card with a one-tap Plan this action that pre-fills the PlanWorkoutSheet. The app never auto-commits — discovery, never coercion (Pillar #4).
- "Off plan" chip + Revert to program (Phase 7). Editing a program-linked day in a way that changes its routine, type, or date now keeps a breadcrumb of the original program reference. The plan card surfaces a small "Off plan" chip; tap → sheet explains the change and offers Revert to program which restores the original linkage (no-op when the program was deleted in the meantime).
- Weekly compliance footer (Phase 7). Above the month grid, a subtle row reads "This week: N/7 planned · M/N logged" — purely observational, no streak counter, no scolding color. Hidden when the week is empty so first-time users see a clean grid.
- Conflict visualization (Phase 8). The day-detail sheet now shows an inline "%d plans on this day" header when a date has multiple uncompleted plans. Day cells with 4+ plans render a tiny "+N" pill at the end of the dots row so dense days are visible at a glance.
- Basic planning is free (Phase 9). FREE users can now create up to 10 active plans up to 14 days ahead without a subscription. The Repeat picker, drag-to-move gesture, day-copy, and unlimited horizon stay PRO. The save-time gate surfaces a clear upgrade pill when limits are hit.
- The legacy sidebar "Training Plan" screen is retired (Phase 10). The side-panel entry, search-catalog row, FAQ feature card, bottom-nav (if present), and active-program "View calendar" button all now route through the unified bottom-nav Calendar. The standalone screen + view-model are removed; the route is decommissioned.
Two new PRO-tier themes — Ironwood and Sakura. Ironwood pairs deep forest green with warm brass and aged copper — refined and grounded, distinct from the existing red/charcoal "grind" palettes. Sakura layers deep plum with rose gold and soft sakura blush — bold and elegant, a richer counterpart to the free Blush theme. Both themes ship with full light/dark color schemes, semantic extended-color tokens (PRs, streaks, scenes, recovery states), and a dedicated motion profile. The theme picker surfaces them with a 🔒 badge for FREE users that links to the PRO upsell; PRO and ELITE subscribers can select them like any other theme. Catalog grows from 19 themes to 21 (17 free, 2 PRO, 2 ELITE).
Watch exercise picker now leads with your most-used exercises and supports voice/keyboard search. Opening the picker on Wear now starts with a "Recent" section listing the top 8 exercises by completed-set count (computed on the phone and sent over Data Layer; refreshes after every workout completion), followed by the full alphabetical list. A search chip at the top opens the Wear system input chooser (voice, keyboard, or scribble depending on watch capability), filters the catalog by substring, and turns into a tap-to-refine pill while a query is active — with a dedicated clear affordance to return to the Recent + All view. The search query resets every time you leave the picker so the next visit always starts clean. Equipment labels under each exercise (barbell, dumbbell, smith machine, etc.) are now localized across all 8 supported languages. Empty until the first sync arrives after upgrade; standalone-mode watches without a paired phone keep the alphabetical-only view.
Subscription Dashboard — one place to see and manage your plan. A new top-level entry in the side panel replaces "Rewards" with "Subscription", landing on a consolidated dashboard that surfaces your paid tier status, every billing action you'd want, and the entire existing rewards stack — all in one scroll. The status hero handles eleven distinct states: Free, Free + reward boost, Trial, Active auto-renew (with renewal-date + price), Pending downgrade, Grace-canceled, On-hold (payment failed), Paused, Lifetime, Lifetime + active sub on top, and Stale (verified > 7 days ago). State-aware action chips give one-tap Manage on Google Play, Restore purchases, Redeem code, Compare plans, plus state-specific variants like Fix payment, Resume, and Reactivate — each routing to the right Play Store deep link. A plan-highlights card shows what your tier currently unlocks. The Boosts & rewards section preserves the old Rewards dashboard verbatim — streak ring, active rewards, milestones, lifetime stats — so no progression context is lost. A 30-day activity log merges subscription state transitions (subscribed / renewed / canceled / paused / on-hold / etc.) with reward grants, sorted chronologically. An opt-in renewal-reminder toggle (default OFF) lets you choose to be notified locally 1/3/7 days before each charge. A privacy reinforcement section explicitly states "your subscription does not include a cloud account; your training data stays on your device" with a quick link to data export. The Settings tier badge now routes here. The legacy
kinoku://rewardsdeep link still works for one release. Closes the in-app subscription-management gap that Google Play policy requires.Run Studio: pinned notes, ultra-zoom map, and shareable MP4 snapshots. ELITE users can now pin their own notes on top of the AI marks — tap any chart to position the cursor, then + Pin a note here in the top bar opens a sheet to write the note and choose one of eight colors. View my notes lists every pinned note for the run; tap any row to edit or remove it. User-pinned notes render as solid colored dots; AI-detected marks render as smaller dotted-outline dots so you can tell at a glance which is which. Ultra-zoom map mode: a small icon in the bottom corner of the map swaps the standard tile view for a tile-free Canvas polyline that supports unlimited zoom on your route geometry — useful for inspecting tight switchbacks or sub-100 m loop sections where raster tiles top out. Tap-to-scrub works in both map modes. Share your run as an MP4 (ELITE): the export button in the replay controls encodes a 10-second 1280×720 H.264 clip showing the run's title, key stats (distance / pace / time), and a miniature route — shareable to any app via the standard Android share sheet. Battery-aware (below 15%, you'll see a "plug in first" hint instead of a degraded encode). Per-frame replay rendering is still on the roadmap; today's MP4 is a static snapshot of the run summary.
Run Studio — the interactive deep-dive surface for a single GPS run. Open any run from history → "Open Run Studio" in the overflow. The screen stacks pace, heart-rate, and elevation timelines on one shared zoom window: pinch a pane and every pane zooms with it; tap or drag for a crosshair that's mirrored on the route map as a "you-are-here" marker; long-press for a range-select band that surfaces aggregate stats (avg pace / HR / elevation gain / distance / time within the range) above the stack. Tap on the map polyline and the crosshair jumps to that exact timestamp, including on self-crossing routes (out-and-backs, figure-8s, loop laps) where nearest-point matchers usually land on the wrong pass. Below the panes sit nine purpose-built visualizations: a peak-performance curve (your fastest sustained pace at every duration from 1 s to the full run), a pace-vs-HR efficiency scatter (counter-clockwise drift signals aerobic decoupling), a 100 m lap pacing matrix (one cell per 100 m bucket, color encodes pace deviation from the run average), a grade-coloured elevation ribbon, a cadence stability arc, an aerobic-decoupling curve, an effort wind-rose (per-compass-octant average pace), a pace-target lane (run-average ±5 s/km band), and a wind profile strip (Phase D headwind/tailwind). AI auto-annotations — HR peak, pacing anomalies, decoupling onset, best 1 km / 5 km / 10 km segments, hills, cadence drops, recovery sprints, sustained head/tail-wind sections — appear as pins on every chart pane the moment you open a run; user-pinned annotations persist alongside (schema v133 adds the
run_annotationstable with FK CASCADE on workouts so they trash with the run). PRO+ unlocks replay playback with 0.25× to 8× speed and loop. ELITE unlocks Compare: pick a recent GPS run from a bottom-sheet, and its trace renders as a dimmed ghost across every chart pane and as a second polyline on the map in the tertiary accent. Zoom window, axis modes, comparison pick, and pane configuration all survive rotation. Treadmill / no-GPS runs gracefully degrade to a single time-aligned pace + HR pane (no map, no map-derived cards); no-HR runs hide the efficiency scatter and form-decay curve cleanly.Tag muscles on guided, follow-along, and cardio sessions to have them count toward your muscle-map recovery. When you log a guided routine (with a follow-along video), a cardio workout, or a mobility session and tag the muscles you worked, those muscles now update the recovery-state overlay on the Muscle Map — so the body heatmap and Smart Today freshness chips reflect what you actually did. On by default; turn it off any time in Workout settings → Before & After → "Guided & cardio sessions affect recovery". This never affects your strength volume, Volume Landmarks (MEV/MAV/MRV), or personal records — recovery axis only. Self-reported muscles are now visibly labelled with a Self-reported chip on the Recovery tab's muscle list, so you can tell at a glance which muscles were tagged versus measured from resistance volume.
Changed
- Archived exercises no longer surface when filtering the Exercise Library by muscle. The Add-Exercise picker's muscle filter chip now hides exercises you've explicitly archived — matching the rest of the Library's filter behavior. Re-activate the exercise from the Library's archived view if you want it back. Your history with archived exercises still counts toward the Muscle Map's "Last Trained" timestamps and recovery state — archive is forward-looking, not retroactive.
Fixed
- Muscle Map and Volume Landmarks no longer count GPS runs as leg-strength workouts. Previously, completing a run would mark Quadriceps, Calves, Glutes, and Hamstrings as "trained" on the Muscle Map — including the per-muscle Volume (in kg, which is meaningless for a run), Intensity, Frequency, "Last Trained", body-overlay recovery state, and the bottom sheet's "exercises that target this muscle" recommendations (which would suggest Running under Quadriceps). The same data leak inflated weekly per-muscle-group counts against MEV/MAV/MRV in Volume Landmarks, making a runner's leg-day MRV unattainable. The Muscle Map and Volume Landmarks are now resistance-only; runs continue to surface in Run Analytics, Pulse, Zone Training, and Training Load. Existing installs auto-recompute their last 26 weeks of muscle-session and per-muscle-group snapshot data on first launch after upgrade. Cardio-aware recovery state is queued as a separate feature (see Cardio + Muscle Load on the public roadmap).
Added
Form Curve hero on the AI Coach screen. The Coach screen now leads with an annotated 8-week Banister fitness/fatigue chart instead of a stack of text cards — a visualization-first hero that turns CTL/ATL/TSB from a hidden number into the screen's anchor. Reads at every level: a beginner sees "PEAKED — race-ready window" and a one-line state pill (Form +9 · Fitness 38 · Fatigue 29); a power user reads the three trace lines (Form/Fitness/Fatigue), tap-to-detail annotation chips for Peak / Deload / Today / Forecast, and the dotted-tail rest-vs-push 7-day projection (PRO+). State taxonomy covers 7 zones (Overreaching, High Strain, Productive, Maintaining, Tapering, Peaked, Detraining) tied to the same training-state language Strava / TrainingPeaks / Garmin use. Cold-start: from day 1, the same hero frame absorbs the workouts-logged progress card and a faded preview projection — no jarring screen-language change as the user accrues data. ⓘ tap opens a reasoning sheet teaching what CTL / ATL / TSB mean and how to read the chart, with an explicit medical disclaimer ("this is a load model, not medical advice — when your body disagrees with the curve, trust your body"). Available to every tier; PRO+ adds the forecast tails and the sleep-on-chart overlay; ELITE adds an AI-narrative read of the curve's recent shape.
Wellness signals layered onto the Form Curve hero (ELITE). When you log sleep, stress, soreness, joint pain, or HRV in Metrics — and optionally enable cycle phase surfacing — those signals appear as personal-baseline-aware chips beneath the state pill. "Stress: above usual (4 of 7 days)" not "Stress: 7.2." The Today's Signals row never blends into the Form score itself — wellness stays separate context that you weigh alongside the curve, never folded into a single number. When the load model and your wellness disagree on a sustained pattern (form trending up while sleep below your usual on 3+ of the last 7 days, or 4+ days of joint-pain logs), the Coach screen surfaces a subtle conflict marker on the affected chip and a hedged AI narrative that names the pattern descriptively — "your data shows form trending up while sleep has been below your usual on 5 of 7 nights — some athletes weigh subjective signals more than the load model in patterns like this." Never directive; never assumes the body's truth. High-stakes load states (Overreaching, sustained High Strain) always surface the safety read with the wellness modifier — the cycle-aware version when you have cycle tracking on, the pain-aware version when you've logged joint pain on 4+ of 7 days, and the generic warning otherwise.
PRO+ sleep-on-chart overlay toggle. New row in Settings → Tips & coaching that lets you hide or show the tiny dot strip above the form curve indicating how each night's sleep compares to your usual range. Default ON for PRO+; tier-aware default applies cleanly when no preference has been set.
First-run wellness hint on the Coach screen. When you have ≥14 days of training data and the Form Curve hero is fully active, but you haven't logged any wellness signal yet, a one-time inline card explains the chips and points you to Metrics. Dismissed permanently with "Got it"; auto-hides if you log your first wellness metric before tapping.
Step history now survives reinstall via Health Connect. Every step Kinoku writes to Health Connect now carries a stable, install-spanning identifier (
clientRecordId), the platform's intended pattern for reinstall-safe writes. After uninstalling and reinstalling on the same device, the Steps screen offers a one-tap Restore from Health Connect card if it detects your past Kinoku-origin records still in HC's store. The restore scans up to a year of history. Run-derived "estimated" steps from cadence × active-time are mirrored to HC the same way, so off-body GPS sessions also gain reinstall safety. Privacy opt-out: Settings → Step Tracking → "Mirror estimated steps to Health Connect" if you'd rather keep inferred data local.CSV/ZIP backup now restores step history. Previously, the manual ZIP export wrote
step_samples.csv+step_daily_rollups.csv+step_goals.csvto the archive — but the importer silently dropped them on restore, so a CSV-round-trip lost every step you'd ever taken. Step CSVs now round-trip cleanly: per-minute samples are de-duplicated against your existing data, daily rollups are recomputed from samples, goal history is preserved with its original effective dates, and any cadence-derived ESTIMATED steps re-link to their imported workout for cascade-cleanup correctness.Run-derived steps re-fire on import. When you import workouts from a backup made before step CSVs existed, the app now re-derives ESTIMATED steps from each imported run/walk's cadence on the next launch, so the daily step total credits those workouts even though their per-minute samples weren't carried in the import.
Backup overdue nudge. Settings → Backup & Restore now shows a small banner when your most recent backup is more than 30 days old, so it's easy to keep a fresh copy before any reinstall. Disappears as soon as you back up; never shown to first-time users.
Search Kinoku — Spotlight-style global search. A new search screen accessible from the side-panel pill, the Settings top-bar magnifier, and the app-launcher long-press shortcut. Indexes every settings row, sidebar entry, theme, scene, FAQ, and feature anchor (~80 catalog rows) plus content (exercises, routines, recent sessions, PRs, achievements). Type "switch to imperial" or "enable dark mode" and the action runs inline with snackbar undo. Tap "heatmap" and locked features show a PRO/ELITE badge that routes to the upgrade screen. Voice mic input prefers on-device speech (Pillar #4 — your audio doesn't leak to a cloud STT when an offline model is available). Pinned shortcuts, last-10 recents, and curated suggestions populate the empty state. Diacritic-insensitive ("café" matches "cafe"), CJK-aware, with English-fallback so a Korean user typing "routine" still finds Routines (루틴), gently flagged with a muted "EN" pill. Acronyms (RIR, RPE, TRIMP, TSS, MEV/MAV/MRV, VDOT) match exactly — never fuzzy. Personalization gently boosts entries you tap from search, capped and decayed to avoid entrenching mistakes. All 8 locales translated.
Progress Gallery overhaul. A complete rebuild of how you capture, organize, and revisit progress photos. The "+" button now opens a new sheet with three paths: Take photo (opens an in-app camera with a 30%-opacity overlay of your last shot at the same pose, so you can match the angle exactly — no more guessing), Choose from library (single photo via the system picker), and Import multiple (up to 20 photos at once via the multi-select picker). After every save, the tag sheet auto-opens with a "Same as last" chip that prefills pose / condition / lighting / time-of-day from your previous photo so consistent shots take one tap to label. Bulk imports get an "Apply these tags to all imported photos" toggle.
Smart compare presets. The Compare tab now suggests one-tap pairings — "Most recent vs 4 weeks ago", "Earliest vs latest", "Same pose, biggest gap" — based on your photo set. The slider gains a swap (↕) button and a Share button. Filling slots no longer requires entering a separate "compare mode"; tap an empty slot and a picker sheet shows your full gallery in a 3-column grid.
In-app camera with pose-anchor ghost overlay. Take photos directly inside Kinoku without leaving for the system camera app. Pose chip selector (Front / Side L / Side R / Back / Other) drives a live ghost overlay of the most recent photo at that pose. For first-timers, a faint silhouette template stands in until they have a previous photo to match.
Progress photo Trash with 30-day retention. Deleted photos move to a recoverable Trash that auto-purges after 30 days, matching the existing workout Trash behavior. The Trash screen now lists workouts AND photos in one merged view sorted by deletion time.
Tag-sheet completeness. Notes (multi-line), editable photo date (DatePickerDialog with future dates disabled), and per-photo body weight (locale-aware kg/lb input that round-trips through the unit-system preference). The body-weight value is automatically captured at save time from your stored body weight setting.
Empty-state hero card for first-time gallery users — explains why progress photos work (one a week, same pose, same lighting, see what you can't day-to-day), with a primary "Take your first photo" CTA and a "Why this matters" link to consistency tips.
Optional Progress Gallery biometric lock. A privacy gate for shared devices: when enabled in Settings, Kinoku prompts for biometric or device PIN every time you open the gallery (or any sibling surface that shows progress photos — Calendar timeline, Log daily strip, or Trash thumbnails). Off by default. Process death re-arms the gate; rotation does not. The gate is "casual privacy" — it does not protect against root or ADB extraction; photos remain in app filesDir.
Per-thumbnail and full-screen action menus. Tap a photo's ⋮ icon for View / Edit Tags / Delete without opening the full-screen viewer. Inside the full-screen viewer, the bottom action bar now has labelled Edit Tags / Delete buttons in addition to the existing top-bar icons.
Locale-aware month grouping. The gallery's monthly section headers now read correctly in Japanese ("2026年4月") and Korean ("2026년 4월"); previously they showed English-formatted "April 2026" or word-order-broken "4月 2026".
Security
- Photos hide from sibling surfaces when the gallery lock is on. The Calendar's photo timeline, the Log screen's daily photo strip, and the Trash screen's photo half all consult a process-scoped unlock state and return empty until the user unlocks the gallery. Eliminates the silent leak where a curious sibling on the unlocked phone could see the entire photo history without ever touching the gallery itself.
Changed
- Tracked walks now count toward your daily step total. Previously, when you tracked a walk with GPS, those steps were excluded from your daily step counter — the opposite of what every other fitness app does, and a quiet way to lose credit for a deliberate workout. Now they roll in alongside ambient walking, the way you'd expect. Existing days with tracked walks are recomputed once on first launch so your history is consistent.
- Run voice cues are now opt-in. Splits, interval prompts, and the cadence/hill coaching cues no longer speak by default — matches the universal norm across Strava, Garmin, Apple Workouts, and Samsung Health, where audio guidance for free runs is something you turn on rather than something the app throws at you mid-run. Heat-stress safety advisory still defaults on (it's a once-per-run health warning, master toggle gates it anyway), and haptic cues remain on as a non-intrusive tactile signal for split completions and auto-pause. Re-enable everything in Settings → Run Tracking → Audio cues (and the Phase I cadence/hill sub-toggles below it) when you want the full coaching loop back.
Added
- Cadence-based step backfill for off-body walks and runs. When the phone or watch wasn't directly counting steps during a tracked GPS session — phone in a backpack, watch left on the charger, kid carrying it for a lap — the app now estimates the steps from your cadence and active time and adds them to the daily total. The estimate only fills minutes where no real sensor data exists, so body-tracked sessions are unaffected. Days that include estimated steps show a small "X estimated" badge below the step counter; tap for a tooltip explaining where the steps came from. Translated in all 8 locales.
Added
- Coach screen now suggests an interval workout on quality days. When Tomorrow's Focus reads as a fresh-form day, the card now picks a built-in interval template that matches your recent training — short fast runners get "400m Repeats", endurance runners get "Long Run Intervals", everyone else gets "Tempo Run". Tap the inline START button to launch the run with the template attached; tap anywhere else on the card for the usual "why?" explainer. Template name is localized in all 8 locales so the suggestion reads naturally regardless of system language.
- Pre-transition countdown for interval workouts. During an active interval session you'll now hear a spoken "5, 4, 3, 2, 1" with a light haptic ramp in the closing window of every step, so you can prepare for the transition without watching the screen. Available on every step type and works for both time-based steps (always) and distance-based steps (whenever the GPS pace estimate is reliable).
- Pace-target voice cues during structured intervals. Steps with a target pace band (custom intervals you've authored) will now speak "Behind pace, pick it up" or "Above target pace, ease off" when you've drifted outside the band for at least 10 seconds, throttled to once per minute so the coach doesn't nag.
Improved
- Active interval workouts get a hero treatment in the run UI. When an interval is running, the progress ring expands to hero size (180dp) and the cumulative distance / elapsed time demote to a compact sub-row — the step state is the focus. The transition animates with spring physics, and the ring's center readout (step type, remaining time/distance) scales up to match. When the workout completes, the original layout returns. Hidden for freeform GPS runs.
- Interval workouts launch instantly with no early-fix race. Previously the first GPS fix after tapping "Start interval workout" could arrive before the engine finished loading the template and would be silently dropped, occasionally making a structured interval feel like a freeform run for the first few seconds. Engine init is now bounded to 2 seconds with graceful freeform fallback if the database is contended.
Added
- Reassign a run to the right shoes after the fact. Phase H runs are silently attributed to your default shoe, but if you wore a different pair, the post-run summary and run-detail screens now show a "Worn shoe" row right below the weather section — tap it to open a picker of every active shoe (and a "No shoe" option) and reassign with one tap. Mileage on both shoes updates immediately. The row only appears when shoe tracking is on AND you have at least one tracked shoe, so non-runners and shoe-tracker-disabled users never see it. Translated into all 8 locales.
Improved
- Body Metrics chart now centers the chip you tap. Selecting a metric on Stats → Body Metrics used to leave the active chip clipped — or completely off-screen — depending on where you tapped in the ribbon. The ribbon now smoothly animates the selected chip to the viewport center, with a single-stage motion when the chip is already on screen and a graceful two-stage scroll when it's far offscreen. The selected chip now gets a theme-accent fill and a subtle spring scale-up, so you can read at a glance which metric is driving the chart below.
- Faster paths into your metric trends. Three new shortcuts land you directly on the Body Metrics chart:
- The PulseOrb pop-out on Today now has a small chart icon next to each metric — tap it to jump straight to that metric's trend. A "View all charts" link at the bottom opens the overview when you want to browse.
- The Pulse score Wellness ring now opens the Body Metrics chart (consistent with the other three rings, which all open analytics). The metric editor remains a long-press on the orb away.
- The Metric editor's "View Analysis" button now opens the same Body Metrics tab — one canonical chart surface instead of two.
- Cleaner internals for analytics navigation. Stats now accepts an optional
tabandmetricIddeep-link, replaced the duplicateMetricAnalyticsScreen, and fixed a handful of latent template-string navigation calls that worked by accident.
Fixed
- Resumed completed workouts no longer trigger the "Finish session?" prompt. Imported workouts (e.g., from FormatA / Strava CSVs without source duration data) and any workout reopened after the OS killed the app could trigger the assisted-finish modal even though the workout had already been finished — a confusing "wrap up?" prompt on what looked like history. Backed by an explicit one-way "ever-completed" flag in the database (
Workout.originalCompletedAt, schema v129) instead of the previous fragile(isCompleted, endTime, lastModified)heuristic. The flag is set on every finish path (manual, voice routine, watch sync, GPS run, post-workout processor) and survives every resume cycle, so the suppression holds even after process death. Existing data is backfilled at upgrade time.
Improved
Finish-session prompt now adapts to what just happened. The modal that appears when every set is logged now picks one of five variants based on the session: a new PR (with the lift name), a streak milestone reached (7 / 14 / 30 / 60 / 100 / 365 days), the longest session this week, the heaviest session by volume, or a default "all sets done — wrap up?" The streak celebration only fires on the day the milestone is actually hit, not for every workout afterward. Two "Keep training" dismissals in a session quietly mute the prompt for the rest of that session, with a snackbar to confirm. Translated into all 8 locales. The icon, border, and motion now respect the active theme's expressive vs. quiet vocabulary, and the dialog respects Android's "Remove animations" accessibility setting.
Watch-tracked runs now attribute mileage to your default shoe. Previously, GPS runs you started from the watch silently arrived on the phone with no shoe attached — your default shoe's km counter sat still while the watch+phone runner was the cohort most likely to use the feature. Phone-side now back-attributes the workout to your default active shoe at sync time. User overrides on existing rows are never overwritten.
Several internal cancellation safety + data-integrity hardenings shipped together. Three new run-feature surfaces (run-start shoe lookup, post-workout shoe insights, Pulse VO₂max band lookup) were silently swallowing cancellation signals — leaving room for orphan workout rows or state writes to a half-cancelled scope. Cancellation is now propagated cleanly. The shoe library's "Delete shoe" button was removed; archive is the only destructive action so historical runs never reference a deleted shoe. The shoe-tracking master toggle is now preserved when restoring another person's backup. The setAsDefault DAO write is now atomic so two rapid taps can't land both shoes on the same sort key.
Imperial users now see miles in shoe replacement reminders. The Coach tip body templates used to hardcode "km" — Imperial users with kilometer numbers in their localized text. Body now passes both displays through the unit converter and shows the correct unit per user preference.
Pulse momentum strip refreshes when Longevity Mode toggles. Flipping Longevity Mode in Settings used to leave the VO₂max band card stale until you pulled to refresh; the card now appears or disappears within a frame.
Improved
- Pulse "Heart fitness" momentum card now fits its slot across all 8 locales. The age-graded VO₂max band was rendered as a long sentence ("Excellent for your age") inside a narrow numeric value slot, breaking layout in DE/JA/KO. Short single-word band labels go in the value slot now; the full descriptive text moves to the subtitle.
- Healthspan Goals card now actually narrates to TalkBack. The localized accessibility description was being computed but never wired to the card — TalkBack users got the inner Texts read out individually with no summary. Now reads as one merged announcement. Status indicator also got a proper capsule pill so reaching the WHO 150-minute weekly goal feels more like a hero moment.
- Tomorrow's Focus card brought into the Coach card family. The card was 28 dp + titleLarge while every sibling Coach card uses 20 dp + titleMedium — the visual outlier was dropped and the typography aligned. Peak-day kind now uses the canonical PR/achievement palette so it's visually distinct from quality-day. Info popup body switches to longevity-aware copy when the mode is on.
- Today's Plan card has a clearer "Start Workout" button. When a routine is scheduled for today (drag-dropped onto the calendar earlier, or generated by an active program), the card on the Today screen now shows a primary "Start Workout" button and a secondary "Skip" button directly on the card — no more tapping through a preview sheet to find the action. REST and CROSS_TRAIN plans are now rendered as informational rows without a button (tapping a non-startable type used to silently no-op). Notes attached at scheduling time now surface inline on the card instead of being hidden behind a preview sheet. Translated into all 8 locales.
Fixed
- Workout start time now reflects when you tapped Start, not the planned day's midnight. Workouts started from the calendar — tapping a planned slot for "today" or backfilling for an earlier day — used to inherit 00:00 from the planned date, so the duration shown on the dashboard ran from midnight, not from the actual start tap. Now the workout's timestamp is captured at the moment you tap Start (or Begin Workout from Today's Plan), regardless of the entry point. Backfills for past days still keep the historical day, with the time-of-day stamped from now. DST transitions resolve to the later offset on fall-back so the timer never under-shoots into an earlier ambiguous instant.
- Active-session message is now generic and translated. Tapping Start Workout on a planned routine while another session is in progress used to flash "Gym Workout Active" — English-only in every locale, and factually wrong for run / circuit / swim plans. The message is now "Finish your active workout to start this one" and translates correctly in all 8 locales.
Security
- Cycle and pregnancy data is now in a separate on-device database excluded from Google Auto Backup. Previously, while the data was technically local, Android's Auto Backup would sync it to your Google Drive alongside the main app database — a gap we closed by splitting it into a dedicated
kinoku_cycle_dband adding explicit exclusion rules. The privacy policy's "stays on your device" claim is now architecturally true, not almost-true. Existing users migrate automatically on first launch after update. The user-initiated ZIP backup (Settings → Backup & Restore) and Android's device-to-device setup-wizard transfer still include cycle data — those are user-controlled paths. A regression test (CycleCloudBackupExclusionTest) asserts the exclusion on every build. - Your Data Rights — a new section in Settings → Data & Privacy gives you one tap to leave every Social Bet on our servers (GDPR Art. 17), navigate to the Privacy Policy, and email privacy@kinoku.app directly. Confirming the action surfaces an accurate count ("Left 3 of 5 bets") if any fail, so partial failures are never silently reported as success.
- Policy v3 covers reproductive-health protections. The in-app Privacy Policy adds §2a (plain-language summary) and §13a (full commitment, including post-Dobbs and Washington MHMDA specifics). A new Health Connect permission
READ_MENSTRUATIONis declared in the manifest — opt-in and PRO-tier, and strictly read-only. We never write menstrual or cycle data to Health Connect under any circumstances. - Age gate harmonized to 16+ across website, in-app policy, and Terms of Service.
Fixed
- Weather conditions on the run summary now translate to your language. Previously the WMO weather code (e.g. "Light rain", "Thunderstorm") was persisted as English text and shown verbatim in every locale. The condition is now stored as a numeric WMO code and resolved to a localized label at render time, with translations across all 8 locales. The post-run weather chip also picks up an info button (ⓘ) explaining the data source, AQI scale, and heat advisory thresholds, and routes temperature + wind through the unit converter so Imperial users see °F + mph.
- Routine sync now remembers your set-type changes. When a workout edits set types (Warmup, Max Effort, Drop, Rest-Pause) and you accept the post-workout review or use Full-Auto routine sync, those types now stick on the routine instead of silently flattening to Working. The undo snackbar also restores the original types correctly.
- Superset pairings made mid-workout sync to your routine. Pair Bench Press + Barbell Row in a workout, finish, and the post-workout review now offers it as a single atomic row ("Pair as superset: Bench Press + Barbell Row") that applies to both exercises together. Re-pairs across multiple groups are clustered into one reorganization row so the routine never ends up with a broken 1-member superset. Reorganization rows now describe each transition explicitly ("Pair as superset: A + B; Break superset: C") instead of an opaque "Reorganize" catch-all.
- Warmups added during a workout sync to the start of the routine. When the post-workout review adds warmup sets, they now land at the front of the routine's set list (existing sets shift down). Drop / Failure / Rest-Pause sets continue to append after working sets. The review row tells you where new sets will land before you tap Apply.
- Diff engine no longer double-emits Failure sets. A failure (Max Effort) set added in a workout used to surface as both "+1 working set" and "+1 max-effort set" in the review sheet — accepting both produced a duplicate row in your routine. Now produces exactly one entry.
Added
- Shoe mileage tracking — a new Shoes screen in the side panel lets you register each pair, set a replacement target (default 800 km, edit per-pair for trail vs. cushioned vs. minimalist), mark one as your default, archive retired pairs, and see live progress bars per shoe. New runs are silently attributed to your default shoe so you don't have to pick before every run; the per-workout attribution is preserved through the binary backup so a phone-to-phone transfer keeps your full mileage history. Two new Coach tips fire when any shoe approaches its target — Approaching replacement at 80% and Replace your shoes at 100% — with the shoe's name, current km, and target km in the body. Shoes are also written into the CSV export so the data is portable to other apps. The whole feature is toggle-able via Settings → Run Tracking → Track shoe mileage — turn it off to hide the Shoes side-panel entry, stop attributing new runs, and silence the Coach tips. Existing shoe data is kept across toggles. FREE. Translated into 8 locales.
- Longevity Mode polish — three new touchpoints, all opt-in via the existing toggle. Healthspan goal card on the Coach screen — surfaces your current week's brisk-walking minutes against the WHO-recommended 150 min/week guideline as a tracked progress bar, sitting just under the Step Intel card so you have today's step context right above. Age-graded VO₂max chip on the Pulse momentum strip — your most recent run's VO₂max compared against ACSM's age-and-sex norms, surfaced as a band label (Superior / Excellent / Good / Fair / Poor for your age) so a 60-year-old hitting VO₂max 35 sees "Excellent" instead of an unframed number that would look low next to a 25-year-old's. Coach copy branching — when Longevity Mode is on, the Tomorrow's Focus card swaps its headline ("Tomorrow's healthspan focus") and softens the kind labels (REST → "Rest", QUALITY → "Heart day", PEAK_OPPORTUNITY → "Strong day") so the framing matches the rest of the longevity surface. None of this changes the underlying numbers — pure presenter, same engine. All three ship in 8 locales. The fourth Plan 05 v2 polish item, a dedicated onboarding fork for users 40+, is documented in FUTURE_CONSIDERATIONS.md and deferred to a future onboarding-redesign session.
- Achievements refresh — 7 new unlocks across runs, Flow, and Longevity Mode. Even Pacer / Negative Splitter reward steady and finish-strong long runs (10 km+) — both FREE, both unlock without any sensors beyond GPS. Smooth Strider / Aerobic Base / Smooth Operator reward consistent stride length, low HR drift on 90+ minute runs, and near-perfect left/right gait symmetry on mounted-phone captures — three PRO endurance achievements that surface the work the Phase E and F engines have been quietly computing post-run. Steady Like a Tree rewards building a Flow practice (5 / 10 / 25 sessions in the new Flow scene) — FREE, MASTERY category. Decade Strong rewards long training streaks specifically while Longevity Mode is on (30 / 90 / 180 days), and only counts streaks for users who have set their date of birth and are 40 or older — so the achievement honours the spirit of the mode rather than backfilling streaks for users who flip the toggle without using the framing. All 7 achievements ship with full 8-locale strings (en/es/fr/de/pt/it/ja/ko) and tier badges where appropriate (PRO 🔒 on the form-analytics ones).
- Camera-Based VBT — foundation shipped. Plan 06's math layer (
BarVelocityCalculator— Mean Concentric Velocity, peak velocity, ROM, concentric-duration, signal-hygiene gates) lands on a tested data model with 21 unit tests pinning every threshold boundary. The companionSetVelocityRoom entity (FK CASCADE onWorkoutSet, unique index onsetId), DAO, repository, and CSV-export row are in place so the upcoming camera service + capture screen can build on a stable contract. ELITE tier. The camera + ML Kit Pose pipeline + capture UI + autoregulator integration land in follow-up sessions — see vbt.md. No user-facing surface yet. - Smart fatigue swap on the Today screen. When tomorrow's planned routine targets muscles that are still recovering, Kinoku scans your saved routines for a fresher alternative and offers a one-tap swap on the Log screen. Accept and the planned slot is rebound to the new routine; an Undo snackbar gives you 6 seconds to take it back. The pre-swap snapshot is restored exactly — same training-max, same volume target — so an accidental tap costs nothing. Programs are protected: when tomorrow sits inside a 5/3/1, GZCLP, or hypertrophy mesocycle, the card stays silent so the program track isn't disturbed. The card also stays silent on days when readiness has already auto-deloaded tomorrow, so the two ELITE adaptation systems never double-propose. If no fresher routine clears the bar (≥75% non-fatigued primary coverage) and you aren't on a program, the card recommends a recovery day instead with a one-tap "Make tomorrow a rest day" action. Triggers when ≥50% of the planned routine's primary muscles are fatigued or repairing — permissive enough to catch real patterns, strict enough on candidates that we never swap you into a routine that's also half-spent. The card carries an inline ⓘ explainer revealing the engine's thresholds + methodology in your language; merged-descendants TalkBack semantics announce the card as a single polite live region. Elite tier. Opt-out: dismiss and the card stays gone for the rest of the day, persisted across app restarts.
- Training Load and Race Predictions — flagship Elite analytics. Two new screens land in the side panel: Training Load charts the Banister fitness-fatigue model (CTL fitness over 42 days, ATL fatigue over 7 days, TSB form) over a rolling 90-day window so you can see exactly when you're peaked, fresh, steady, or overreaching; Race Predictions ensembles VDOT (Daniels) + Riegel for 5K, 10K, half marathon, and full marathon with honest confidence bands that widen when models disagree. A critical-speed (CS) + D' fit also surfaces when you've logged at least two best efforts in the 2–30 minute model-validity window — that's your threshold pace plus the finite distance reserve you can run above it. Per-run you also get Banister TRIMP (HR-based training impulse) when Health Connect HR enrichment is on, TSS (power-based training stress) when you've set your FTP in Profile Settings, and altitude-corrected VO₂max (sea-level equivalent via the Buck/Powers attenuation curve) when a run climbs above 1500 m and the weather snapshot's MSLP is available. Profile Settings gains three new optional inputs — Maximum HR, Resting HR, FTP — that drive these calculations; leave any of them blank to use age-based or static defaults. The Training Load screen replaces the legacy 0.6× pace-zone rescale with proper TSS-based load when the per-run TSS or TRIMP is present (legacy rescale stays as the fallback). All translated into 8 locales. Elite tier.
- Live cadence on every run. The phone's step detector now drives a real-time cadence chip on the run-tracking screen and a stat card on the post-run summary. The Coach screen surfaces your most recent run's cadence next to pace and VO2max. A new "Try a quicker cadence" insight fires once per workout when your average lands between 140–165 spm over a 20+ minute run — short, faster strides reduce impact and injury risk. Cadence is captured locally; nothing leaves your device. FREE.
- Heart rate enrichment from Health Connect. PRO users with HC heart-rate permission can opt in (Settings → Privacy → "Enrich runs with Health Connect heart rate") to have Kinoku read per-run HR samples after each run, surface average and peak HR on the summary, compute HR zones (Z1–Z5 by Karvonen), and refine the VO2max estimate using the Firstbeat formula. Off by default — granting Health Connect access for daily metrics is not consent for an intra-workout per-second background read. When enabled, a background worker re-reads HR up to ~80 minutes after the run finishes (Wear→HC sync can take a few minutes); a "preliminary" badge on the HR card transitions to "final" once samples arrive. Toggle off to wipe HR-enriched fields from existing runs and cancel queued workers.
- Improved elevation accuracy via barometer fusion. On phones with a barometric pressure sensor, elevation gain and loss are now computed by fusing GPS altitude with barometer readings calibrated against the first GPS fix. Cuts over- and under-shoot by ~30% on terrain where GPS altitude wobbles (urban canyons, cloudy skies, indoors). Automatic; no setting required. FREE.
- Grade-Adjusted Pace, Normalized Graded Pace, and pace durability on every run summary. GAP translates your hill-influenced pace into the equivalent flat-ground effort (Strava's most-cited metric) using the Minetti energy-cost-of-running formula. NGP weights the harder splits more so race-pace efforts aren't averaged away by recovery. Pace durability scores how well you held pace through the run (100 = held pace, lower = faded). All computed offline with zero new sensor data — uses pace + elevation you already have. FREE display.
- HR drift on long runs. When HR enrichment is on, the run summary surfaces the percent your heart rate drifted between the first and second half of the run — the precursor to the classic aerobic-fitness "cardiac decoupling" signal. > 5% on a 90-minute aerobic run flags "your aerobic base needs work." We label the metric "HR drift" rather than "decoupling" because true Pa:Hr cardiac decoupling needs both pace and HR drift; we ship the HR side honestly and will layer the pace side in a follow-up. PRO display.
- Stride length and stride consistency. When cadence data is captured, the run summary now shows your average stride length in meters and how consistent your stride was through the run. Recreational runners typically land around 1.0–1.4m; elites around 1.6–1.9m. Variability creeps up when form deteriorates with fatigue. FREE display.
- Wind-aware running power. When weather data is available (Phase D), running power factors in headwind and tailwind via the Skiba/McCormack open model — a 10 km/h headwind costs about 30 W of extra power at typical training speeds. The naive flat-no-wind formula remains as the fallback. FREE display.
- On-device running form analytics from your phone's motion sensors. PRO users with the new "Capture running form on PRO runs" toggle (Settings → Privacy, default ON) get vertical bounce, ground contact time, gait symmetry, and a 0–100 form score on every run with the phone mounted to the body (armband or running belt). Pocket runs still get impact load and stride steadiness. The phone's accelerometer + gyroscope fire at ~50 Hz during the run; processing happens entirely on-device, samples never reach disk. Adaptive position detection means there's no setting to change between mounted and pocket runs — the engine figures it out from the signal. Three new in-workout insights flag high vertical bounce (over 12 cm sustained), persistent left/right asymmetry (over 4%), and impact loads above your same-position 8-week baseline. Form metrics are stored on your phone and included in Google Auto Backup like the rest of your training data. PRO opt-in.
- Weather context on every run, fully optional and offline-respecting. Turn on "Add weather context to runs" in Settings → Privacy and Kinoku will fetch temperature, apparent temperature, wind, conditions, and (sub-toggle) US Air Quality Index from Open-Meteo (a free public API) at run start. A weather chip lands on the post-run summary; PRO users additionally get a heat-stress pace estimate in the Coach card ("apparent 32 °C — your pace will feel ~12% harder than baseline"). Off by default. When enabled the call is fire-and-forget on the first GPS fix, gated four ways: settings toggle, validated internet only (no captive-portal calls), 4-second timeouts, and a 200/day defensive rate limit. Coordinates are rounded to ~1.1 km precision before any URL is built. The same Open-Meteo call also collects pollen index, UV index, and mean sea-level pressure (the latter pre-wired for an upcoming altitude-corrected VO2max — visible only when the data lands). Translated into all 8 locales. Foundation laid for Phase H shoe mileage tracking (database + repository ready; UI in a follow-up).
- Hide and snooze AI Coach tips. The "PLATEAU DETECTED" family of in-workout cards is now controllable per type, per exercise, per activity (running / swimming), or globally. Long-press or tap a tip to open a transparency-first detail sheet that shows the engine's signal, threshold, computation window, and the data the rule consumed — then choose how (and how long) to hide it: indefinitely, snoozed for 7 days, or paused entirely (24 hours / 7 days / 30 days / until you turn them back on). After three dismissals of the same tip in two weeks, a one-tap "Hide PLATEAU tips for High Row Pulse?" snackbar offers the durable mute. The new Settings → Tips & coaching section gives a master switch, snooze status, category-level toggles for all 10 categories, and a Manage hidden tips screen with one-tap restore (sorted by soonest-expiring first, so power-users with 30+ mutes can manage them at scale). Mute rows for cycle-related tips live in the privacy-hardened cycle database (excluded from Auto Backup) so a cycle-tip mute never reveals reproductive-health interaction off-device. Translated into all 8 locales.
- Starter packs can express warmups and supersets. Pre-built routine blueprints can now declare set types and group exercises into supersets via blueprint-local tags — laying the groundwork for richer pre-built programs in future content updates.
- Social Bets now exclude the activity types you choose. When you create a workout-count or tonnage bet you can now opt out of any combination of walks, runs, cycling, swimming, or mistracking sessions — the rule is shared across every participant via the bet's immutable rules document so all progress counts the same way. Existing bets keep counting all activities; new bets default to "everything counts" unless you opt to filter. Server-side bounds (Firestore rules) cap the rule at 200 characters to prevent payload abuse.
- Live audio coaching during runs. Three new voice cues fire over your headphones during GPS runs: a cadence cue when your steps-per-minute drops well below target for 30 seconds, a hill cue on a sustained climb so you can dial in short-quick-steps form, and a one-shot heat advisory at run start if it's hot enough that your pace will feel harder. Each cue is independently toggleable in Settings → Run Tracking → Live coaching cues, with a clear master/sub relationship — turning master Audio cues off suppresses all of them, and the sub-toggles dim to make the dependency visible. Cues respect the 3-minute throttle per type so a long climb doesn't repeat the hill cue every minute (heat is once per run). All translated to 8 locales with imperial-temperature support so US users hear "Fahrenheit" instead of "Celsius." FREE.
- Tomorrow's Focus card on the Coach screen. Daily adaptive workout suggestion based on your fitness/fatigue balance — peaked, fresh, steady, overreaching, or rest day. The engine consumes your Banister CTL/ATL/TSB snapshot plus the last 14 days of training load to pick one of five suggestions with a documented reason ("CTL falling > 10% per week", "TSB +12 with no workout yesterday", etc). The card is tappable: ELITE users drill into the Training Load screen for the full chart; non-ELITE users see a Locked variant with the upgrade flow; ELITE users without a recent snapshot see a "Build your suggestion" pending card so the absence is never silent. Includes a TalkBack-friendly merged content description with the TSB number spelled out, plus an in-card info button explaining the methodology. ELITE.
Improved
- Manage Metrics search now opens from the top bar with fuzzy matching and a guided empty state. Tap the search icon on the Manage Metrics screen and the title morphs into a search field — Gmail-style — so the keyboard never covers your results. Typing surfaces a flat ranked match list (active metrics get an "Active" pill; activate brand-new ones with the "+" chip), and the engine tolerates the typo class users actually make: "strech" finds "Stretching Minutes", "heart var" finds "Heart Rate Variability", "heart-rate" matches "Heart Rate", and a search in Spanish or Japanese still finds metrics by their canonical English name. When nothing matches, an empty state suggests creating a custom metric with the query pre-filled into the create dialog. Active metrics collapse into a compact summary chip while you search so the screen is dedicated to finding, not browsing — full bento returns when you exit. Predictive Back closes search before popping the screen. Translated into all 8 locales with a screen-reader-friendly merged description naming up to 5 active metrics.
- Bodyweight history backfill now supports bigger chunks of history. Long-press any historical set on a bodyweight exercise and the same dialog can now apply your entered weight to just that set, the whole workout, the 30 or 90 days ending on that workout, or the exercise's full history. Every affected set still keeps its own workout date as the measurement timestamp, so freshness badges and provenance stay honest instead of pretending every old set was weighed "today."
- Last Run complication and run summary card on Wear OS now know walk vs. run vs. tracking issue. When the phone classifies a finished GPS session as a walk, the watch face complication relabels itself "walk" and the post-finish summary chip on the watch shows the right copy in your locale (run / walk / tracking issue) within a few seconds of finishing. Sessions classified as tracking issues — broken capture, lost GPS, "kitchen-test" zero-distance accidents — no longer surface in the complication at all instead of crowing about a phantom 0.4 km run. Reclassify on the phone and the watch picks it up immediately. Translated into all 8 wear locales. Wear DB schema bumps to v14; legacy rows preserve their classification through every recompute path (HR enrichment, debounced route recompute, AppInitializer backfill) — none of these silently regress a manual override anymore. The phone-side workout card on the Today tab now mirrors this — a Run logged at walking pace surfaces with the Walk badge (sage green, theme-coordinated across all 19 themes), and a Walk logged at running pace flips the other way. Reclassification from the run summary screen propagates back to the Today card immediately via Room invalidation. Low-confidence classifications get an "Auto-classified · tap to confirm" affordance so you can review a swap in two taps instead of five. The card layout that surfaces the badge also gained: the unit suffix on distance (
1.70 km/miinstead of bare1.70), the start time promoted into the title slot when the workout has no custom name (no more[Run] Runduplication), normalized bullet glyphs across the title and stats rows, an animated cross-fade on the badge swap so the reskin reads as deliberate, and a single coherent TalkBack description ("Completed Walk, started 10:49 AM, 1.70 kilometers in 37:12, pace 21:53 per kilometer") instead of seven disjointed fragments. Translated into all 8 locales. - Reach the side panel from every hub tab. Metrics and Challenges now carry a hamburger so you don't have to back out to Today first; deep-link entries (Pulse → Metrics, Help-FAQ → Challenges) keep a contextual back arrow alongside the hamburger so your in-app drill-down still has a one-tap return. The 7-tap Enso easter egg on the Today brand glyph is more forgiving too — 1.2 s window between taps instead of 0.6 s, so a slightly slower seven-tap sequence still triggers it.
- Cards and sheets are now opaque and crisp; glass kept where it earns its keep. The navigation drawer, full-screen info sheets, exercise / picker / post-workout sheets, Coach cards, weekly recap, BentoQuickStart routine cards, Steps tabs, Bet cards, and rewards card all switched from a translucent frosted-glass treatment to an M3 tonal surface that auto-tints per theme — Cyber stays cool, Vaporwave stays purple, Blush stays pink, no theme defaults to baseline grey. Underlying calendar / log / map content no longer bleeds through behind text. Glass is preserved where it adds value: small action buttons in the top header, FABs and chips, milestone celebration overlays, hero PR cards on the post-workout summary, badges over share-card photos and route-heatmap maps, the in-workout bottom action bar (peek-through aids spatial awareness while content scrolls), and locked-feature ghost cards on the Run Analytics dashboard. Pixel themes (Retro 8-Bit, Terminal) also get a flat-cornered drawer instead of a smooth rounded rect that fought the rest of those themes' shape grammar. Drawer ships with a real shadow elevation so it stands out against the underlying screen even on flat-tonal themes (Greyscale, Obsidian, Aurora).
- "This week" steps chart — redesigned for goal-relative scanning. The 7-bar weekly chart now warms from grey to green as each day approaches its goal, with a dashed line on every bar marking the goal height so over-goal days clearly stick above. Each bar gets a small
+12% / −30%label showing how far above or below the daily target it landed (zero-step days and rest days are exempt to keep "no log" from reading as "100% miss"). Today's bar gets a subtle border and a bold day label so it's findable at a glance. The bars stagger up with a spring on data change (Sunday rollover, fresh sync) — not on every Steps-tab re-entry — and respect the system reduce-motion preference. The "Weekly progress" card just below now anchors its delta with a percentage too: "−55,984 steps · 47% below target" instead of just the raw number. Adaptive-goal users see the dashed line stair-step truthfully across the week. Each column has a merged TalkBack description ("Mon, 8400 steps, +5% vs goal, today") so the new visual encoding is fully accessible. Translated into all 8 locales. - Cycle phases on the Training Calendar — now actually visible, with full context. The previous bottom-of-cell accent was 2 dp tall at half opacity over 60% of the cell width — effectively invisible on most phones, and even when it rendered it gave you a colored hairline with no context. The new design replaces it with three coordinated surfaces: a persistent header row above the month grid showing your current phase + day-in-cycle + predicted next-period date (tap to open Cycle Tracking); a selected-day phase strip in the chrome under any tapped day (e.g. "Luteal · day 12 of cycle · 7 days until next period"); and a confidence-aware bottom accent that's solid 4 dp at near-full alpha for observed bleed days (we know you bled this day), solid 3 dp for predicted phases within your cycle window, and dashed 3 dp at lower alpha for stale projections past your expected cycle end (so the calendar fades honestly instead of going silent). Every accent has a TalkBack content description in plain language — phase, day-in-cycle, and confidence — so cycle context is no longer color-only. The "Irregular cycle" setting is now actually wired: when on, the calendar shows only days you've directly logged and suppresses all forward predictions, matching what the toggle copy promised. A one-time coach mark explains the new encoding the first time you open the calendar with cycle tracking enabled. All 8 locales translated.
- Superset indicator — refreshed for at-a-glance reading. Inside a superset, the active slot now expands into a pill that shows the full exercise name in a blend of the exercise's accent color and your theme's primary (so the slot still reads as "this exercise" instead of "theme primary"). The other slots stay as compact 2-character circles (collision-resolved if two exercises share initials, e.g. "BEN" / "BAR" instead of "BP" / "BP"). The exercise name is now next to your set list — no more glancing up at the TopAppBar to remember which slot you're on. Tapping or swiping a slot also plays the same title-bounce + ring-pulse + focus-pulse-on-next-set animation as the auto-jump-after-set-completion path, so a manual switch and an auto-advance feel identical. Tap-target hits the 48 dp Material accessibility minimum, the active slot's text contrast adapts to the actual visible blend (so light pastel palette colors stay readable), and the active slot is no longer announced as actionable to TalkBack (since tapping it would be a no-op). Glow themes (Cyber, NeonSurge, Aurora, Obsidian, Performance, Solar Flare, Vaporwave) get a soft 1.5 dp border halo on the active slot; Retro 8-Bit drops the smooth capsule for an 8 dp rounded rectangle that matches its blocky shape grammar. Pill expansion springs at 85% of the theme's damping so quieter themes settle softly and bouncier themes overshoot more.
Changed
- Rotation Group editor — redesigned from scratch. The previous screen left most of the mechanics implicit ("why does setting 2 sessions per week with 3 workouts feel weird?"), so the new design answers that question in the UI itself. A live hero preview at the top shows your cycle as a pill chain (Ordered) or ranked list (Free pool) and a caption that answers "how often will this fire?" — e.g. "3 workouts × 2/week · One full cycle every 1.5 weeks." Section headers carry info-icon ⓘ sheets explaining Mode, Weekly target (it's a cap, not a quota), and Members (including drag-to-reorder semantics for Ordered cycles). A one-time intro card dismisses forever once you've read it. Ordered-cycle members now have up/down buttons (keyboard + TalkBack accessible) in place of deferred drag gestures. The screen also gains a frosted bottom Save/Delete bar, spring-animated mode toggle, and semantic color tokens across all 19 themes. The Rotation Groups list picks up the same visual language so the two screens speak the same voice. Under the hood, the save path is hardened with post-save verification (any silent persistence drift now throws instead of corrupting quietly), and the latent
sortOrderclobber — where edits would jump your group in the list — is fixed. New regression tests cover the full save-then-reopen round-trip at both the DAO and repo layers. All 8 locales translated with native-quality copy.
Added
- Longevity Mode — Pulse, Coach, and progress reframed around healthspan. A new toggle in Profile Settings re-skins the Pulse screen's state labels (Strong / Resilient / Steady / At risk in place of Thriving / Building / Steady / Drifting), unlocks an age-graded VO₂max framing (Superior / Excellent / Good / Fair / Below average for your age), and ships a new Longevity Foundations 8-week program template (Mon strength + bone loading, Wed Zone 2 cardio, Fri balance + mobility, with a deload halfway through). Defaults to ON for users 40+ once you've set your date of birth in Profile Settings — with an "On by default for users 40+" hint visible on the toggle so the inference isn't silent. Same data, different framing: nothing about the underlying Pulse score math changes, just the language and the targets that come with it. Toggle is FREE; the program template is PRO. Translated into all 8 locales.
- Flow — a new scene for balance, mobility, and core. An eighth tile lands on the scene picker alongside Strength, Run, and Pool. Tap it and you get 18 hand-curated exercises that the in-app library was missing in any discoverable form: single-leg stands, bird-dogs, dead bugs, Pallof presses, half-kneeling chops, Cossack squats, World's Greatest Stretch, Y-T-W raises, hip CARs, thoracic rotations, bear crawls, side-plank-with-hip-dip, glute bridge marches, wall angels, single-leg calf raises, single-leg RDLs, tall-kneeling overhead presses, and a deep squat hold. Each carries muscle activations, easier/harder progressions, form cues, and common mistakes — same depth as the rest of the library. A new 4-week
Balance, Flow & Core Foundationsprogram template also lands in the template gallery: three full-body sessions per week (Mon flow + balance, Wed mobility + core, Fri full-body integration) for beginners or anyone wanting a gentle on-ramp. No equipment beyond an optional band. Free scene + exercises; the program template is PRO. Translated into all 8 locales. - Rest Day — a first-class, cross-tracker concept. The Steps screen's old "Pause today / Resume" control retires in favour of a Mark rest day / Remove rest day affordance that treats rest as a declaration of intent rather than a suppression. Steps keep recording honestly on rest days; the semantic layer exempts the day from the step-goal streak, excludes it from the adaptive-goal 14-day median, redistributes the Pulse Score's training-dimension weight into wellness + recovery (so a legitimate rest doesn't drag down your score), and flips the step-tracker notification to "Rest day — steps still tracked". Rest days also propagate to the paired Wear watch as a display hint (the flag lives on
SyncSettingsand is stale-guarded across midnight). Completing a workout on an auto-committed rest day automatically clears the row via a new post-workout reconciliation hook (manual + scheduled declarations are preserved). Upgrade-safe: any in-flight "Pause today" state at the time of install migrates cleanly into a MANUAL rest-day row; stale (non-today) paused-day values are skipped rather than rewriting history. Available on all tiers; scheduled-ahead rest days require PRO; automatic readiness-based detection requires ELITE. Translated into all 8 locales. - Today's muscle impact (post-workout body heatmap) — the post-workout summary sheet now shows a body silhouette coloured by how much of this workout's total effort landed on each muscle. Three top-3 pills underneath report each contributor's share of the session's peak (e.g., "Chest 100% · Triceps 33% · Front delts 28%"). Works on every workout — gym, HIIT, circuit — and gracefully shows a one-line empty state for mobility-only or timed sessions without captured muscle impacts. Info button ⓘ opens a full calculation explainer. All eight locales translated.
- Calculation explainers on Muscle Map — every analytical mode of the Muscle Map (Intensity / Frequency / Recovery) now has a ⓘ info button that opens a structured explainer sheet: plain-English intro, formula card with the actual constants, worked example with real numbers, and a collapsible "Edge cases & gotchas" expander. The per-muscle detail sheet gains inline tooltips on every metric (Last trained, Load category, Baseline, Recovery window, Time since hit). The ⓘ breathes gently until first tap, persists forever, and respects the system "Remove animations" setting by switching to a static half-alpha ring. All eight locales translated with native-quality Romance + German + Japanese + Korean copy.
- Run PR celebration on post-workout sheet — workouts that finish via the standard post-workout flow AND have run analytics (watch-synced runs, imported runs) now get a first-class "New best 1 km! 1:22 · 0:04 faster" hero moment when they set a personal best at 1 km / 1 mi / 5 km / 10 km. Previously this celebration only appeared on the dedicated GPS Run Summary screen; hybrid and synced runs could silently miss it. Uses the same
RunInsightEnginedetector the run summary already uses, so the two surfaces never disagree. - Achievements refresh — 39 new achievements covering Pulse Score, Social Bets, Circuit/HIIT, Zone Training (polarized weeks, VO₂max classification, weekly Training Effect), Readiness, Periodization (mesocycle completion), Interval Editor (custom templates), Bodyweight snapshot sets, Run PRs + distance milestones, and Swim multi-stroke sessions. Introduces three new categories: Recovery, Competition, and Archetype (meta-achievements — The Lifter / The Runner / The Athlete / The Devotee, each requiring Gold in multiple prerequisite categories). Also includes 7 new First-Time onboarding achievements for feature discovery. Tier-gated achievements display with a 🔒 PRO / 🔒 ELITE badge instead of being hidden. Translation pass pending for ES/FR/DE/PT/IT/JA/KO.
- Rotation Groups — organize A/B/C workout splits (e.g., Push · Pull · Legs) so Smart Today can pick the next workout for you. Detect existing rotations automatically or build them in the new Rotation Groups screen in the side panel. "2 of 3 per week" now enforced — set a weekly cap on the group and Smart Today stops suggesting from it once you've hit the cap for the week. (FREE)
- Weekly Cadence on Coach + Training Calendar — declare a target weekly frequency per routine role (Main / Accessory / Run / HIIT) and the Coach "Training Architecture" card shows how you're tracking this week. Works hand-in-hand with Rotation Groups. (FREE)
- Training Roles on routines — classify each routine as Main / Accessory / Run / HIIT so rotation picks and cadence math understand your training structure. Auto-classification is now backbone-aware — any routine with a compound lift (squat, deadlift, bench, overhead press) classifies as Main regardless of how many exercises it has, so your 3-exercise Squat+RDL+Lunge day doesn't get tagged as Accessory. Override per-routine in the editor. (FREE)
- Flexible schedule per routine — every routine now has a Schedule section: choose Weekly (N sessions per week), Every N days (anchored to your last completion, great for long runs or heavy lower-body days), or Not scheduled (ad-hoc work that's exempt from cadence rollups). Routines in a rotation group inherit the group's cap instead. (FREE)
- "Add to rotation" from the routine editor — turn any routine into a rotation without waiting for auto-detect. A new sheet in the How Often card lets you join an existing group or create a new one with this routine pre-seeded. Disabled with a lock icon when your library has only one routine. (FREE)
- Intro overlay for the redesigned How Often card — one-time coach-mark on first visit explains the Tracked As / Schedule / Rotation blocks + the info sheet that demystifies auto-classification. Shows in all 8 locales. (FREE)
- Form band tracking (Banister CTL / ATL / TSB) — the industry-standard Fitness-Fatigue model is now computed nightly across gym, run, and brisk-step load. Elite Analytics shows your 90-day Fitness, Fatigue, and Form curve — the same model used by TrainingPeaks and Intervals.icu. (ELITE)
- Forecast insights — Kinoku now anticipates overreach risk, rest-debt buildup, and cycle-phase transitions 1–3 days ahead. Surfaces in the Coach screen alongside existing reactive insights. (PRO base + ELITE overreach forecast)
- Cycle analytics tab (Elite Analytics) — for users who log cycle data, see per-phase volume / RPE / PR-rate correlations, plus (ELITE) per-exercise phase sensitivity. (PRO/ELITE)
- Synthesis insights (Coach meta-layer) — when multiple signals converge (illness + low HRV, gym spike + run spike + overreaching Form, etc.), Kinoku surfaces a single cross-signal insight instead of three separate cards. (ELITE)
- Strength standards (DOTS / IPF GL / Wilks / FFMI) — Elite Analytics Strength tab shows your bodyweight-adjusted strength score against powerlifting reference distributions, plus fat-free mass index. (ELITE)
- Antagonist ratios (H:Q, push:pull, bench:OHP) — surface muscle-group balance ratios on Elite Analytics with "within band / undertrained" risk tags. (ELITE)
- Plateau detection — Elite Analytics flags exercises where your best set, volume, or session count has stagnated over 4–6 weeks, plus a curated list of substitutions to break the plateau. (ELITE)
- Strength trajectory forecast — Elite Analytics shows your current e1RM slope per week plus days until the next round-number milestone (5 kg / 2.5 kg targets). (ELITE)
- RPE creep detection — Elite Analytics alerts when your top-set RPE has been trending up on flat weight — a leading indicator of fatigue. (ELITE)
- DOTS percentile chip — Elite Analytics Strength tab now shows "top X%" next to your DOTS score, benchmarked against the shipped IPF reference distribution. Displayed only when you're in the top half; beginners see the band chip alone. All computation is on-device from bundled tables — no network calls. (ELITE)
- Multi-modal frequency overlay — Intelligence tab gains a card that combines lift sessions, run days, and brisk-step goal days into a single per-muscle weekly stimulus number. Flags combined stimulus above 5/week and 7/week thresholds so runners no longer get "add more hamstring frequency" advice when they're already running 5×. (ELITE)
- Run-augmented muscle balance — Intelligence tab shows measured (lift) vs. estimated (run) volume per posterior-chain muscle (glutes, hamstrings, quadriceps, calves), so runners' posterior chain no longer looks under-trained on the radar chart. Estimated from run distance; elevation boost lands when
RunSummarycarries elevation. (ELITE) - "Why?" panel on synthesis + forecast + cycle insights — tap the info icon on any Coach insight to see the inputs the engine used, the confidence level, and which engine produced it. All snake_case engine keys are localized; raw class names are never shown. (PRO/ELITE)
- Biological sex + body-fat profile fields — opt-in inputs for strength standards (DOTS normalizes to sex) and FFMI computation. Default unspecified; data stays on-device.
- Import from Strava — pick a Strava activity-archive ZIP and Kinoku ingests every row of
activities.csvas a cardio workout (distance, duration, max heart rate) plus decodes every GPX track (including.gpx.gzgzip-compressed variants) into route points for the map..tcxtracks still import as CSV-only for now. Sits alongside the existing FitNotes / Strong / Hevy / Jefit / RepCount / Liftin / Fitbod support under Settings → Data & Storage → Import from CSV. - Payment-issue banner on Today + Settings — if your subscription hits Google Play's payment-retry grace period (card declined, Google retrying), a non-blocking banner now tells you instead of silently dropping access 30 days later. Tap to fix your card in Play Store.
- Pending-downgrade indicator — if you tap a lower tier while on a higher one, the app now renders "Switching to PRO on <date>" so the switch isn't a surprise when your current period ends.
- Staleness banner on Settings — when Kinoku hasn't verified your tier with Google Play in 5+ days, the banner shows "Last verified N days ago" so the 7-day offline-grant window isn't invisible.
- Retry-purchase prompt after ack exhaustion — if Google auto-refunds a purchase that couldn't be acknowledged, a one-shot banner prompts you to retry from the Upgrade screen.
- Promo-access-ended notice — if your F&F promo tier is revoked, a one-shot banner explains why some features re-locked.
- Backup progress bar — the "creating backup" spinner now shows a percentage + determinate ring so 500-photo advanced-user backups don't look hung.
- Legacy-backup confirmation dialog — restoring a backup made by a pre-checksum Kinoku version now asks "This backup can't be verified for tampering. Restore only if you trust the source." before proceeding.
- Specific restore error messages — corrupted archive vs checksum mismatch now show distinct, actionable copy ("The backup file is damaged or incomplete") instead of a generic "unknown error".
- Incomplete-restore detection — if a restore crashed mid-way through the photo file swap, the app now detects the journal marker on next launch and records the failure to crash reporting instead of silently running with half-restored files.
Changed
- Daily step goal floor lowered to 500 + numeric input — the goal slider on Steps onboarding and the in-app goal editor now reaches down to 500 steps/day for users rebuilding a walking habit, recovering from injury, or just starting out. A text field next to the slider accepts direct numeric input; values snap to the nearest 500. Backup/ZIP path preserves the floor; CSV export writes it but is not round-tripped through CSV import (the ZIP path is the full-restore path for any per-day preferences).
- Data & Storage menu clarity — "Backup" now reads "Restore on another device. Full, lossless." and "Export" is labeled "Export to CSV — For importing into other fitness apps. Photos not included.". Import is "Import from CSV". No more confusion about which is which (they were both "ZIP" in the old copy).
- "Start from scratch" button is a proper button — Quick Start's skip affordance is no longer low-contrast small text buried under the analytics toggle; it's now a first-class outlined button.
- First-ever set is no longer flagged as "New PR" — the badge appears only when you actually beat a previous session's best; first-time exercise logs surface as a "First exercise" moment via the Coach flow instead.
Fixed
- Moving a routine between rotation groups no longer reopens your weekly cap — previously, if you had a "2 of 3 per week" rotation and moved one of the routines out of the group mid-week, the group's "2 of 2 done" counter would reset and Smart Today would happily suggest a third session. Each workout now remembers which group it belonged to at the time it was completed, so membership edits can't retroactively release the cap.
- Heavy routines no longer auto-classify as Accessory — an 8-exercise Deadlift routine used to get labelled "Auto: Accessory" until you'd completed it three times (the classifier demanded a usage-history threshold). Gone. Role now reflects what's in the routine, not how recently you've logged it.
- Calendar chips and weekly cadence now respect routine role edits — editing a routine's role chip in the routine editor (Main / Accessory / Run / HIIT) used to leave the Training Calendar day chips and the weekly "Main 3/3" header showing the old role for any session that had been generated by a program — programs stamp a role at plan time and nothing was refreshing it. The cascade now puts your explicit role edit first, so both surfaces update immediately. Deload-week behavior is preserved: program sessions keep their "backbone" role as long as you leave the routine on Auto.
- Post-workout summary never claims someone else's PR — the celebration banner at the top of the post-workout sheet used to pull from the long-lived Coach insights feed, so a legitimate run-best-effort PR from an earlier run could leak onto the summary of the next (unrelated) HIIT / strength workout as if that workout had produced it. The banner is now driven exclusively by highlights detected from the just-finished workout's own data; run best-efforts appear as a first-class hero-moment only on the run that actually set the PR. Insights continue to show on the Coach screen and in the insights drawer unchanged.
- Photos survive a rebrand-upgrade restore — importing a pre-rebrand Kinoku backup (from when the app was
com.example.fittracker) now rewrites the absolute file paths stored inprogress_photos.uri+exercises.customImageUriso your photos show up instead of broken-image placeholders. - European decimal values in imports — CSVs that use
22,5as the decimal separator no longer parse as225(10× error). Locale date formats (dd.MM.yyyy,yyyy年MM月dd日, and others) are recognised alongside ISO and US layouts. - Ambiguous FitNotes weight columns — when a FitNotes CSV has a single
Weight (lbs)column without a separate unit cell, the unit is now read from the column header instead of defaulting to kg (which was silently under-recording by 2.2×). - Equipment-aware exercise matching — "DB Bench Press" now resolves to the dumbbell variant instead of tying with the barbell variant; names carrying
barbell/dumbbell/cable/smith machine/trap bar/kettlebelltokens steer the fuzzy matcher to the correct library exercise. - Liftin' CSV exports now import — previously "unknown file format"; now detected as a FORMAT_A variant via the
setNumberheader alias. - Finishing a workout with zero sets no longer triggers the post-workout sheet or the muscle-imbalance insight. Nothing to analyse means nothing fires.
- Post-restore achievement + PR + Pulse rebuild — restoring a backup now triggers the achievement evaluator + PR-event rebuild + Pulse-score recompute on next launch, so newly-added achievements unlock against your restored historical workouts.
- Vehicle-motion diagnostic rows no longer ship in backups — the
suspected_vehicle_windowstable is cleared before each backup so the ZIP doesn't leak inferred car/bus/train timestamps. - "Personal best: 16 steps" no longer haunts you during your first week — the Personal Best chip and Trends card subtitle now require at least 7 days of step history and a day with at least 500 steps before they'll render, so a freshly-enabled step tracker doesn't immediately trumpet a car-ride artefact as your all-time best. The chip also shows the date next to the number ("Personal best: 14,220 steps on Apr 18") so it's legible at a glance, and today's incomplete count is always excluded from the comparison. Achievements keep using the all-time max — if you hit a new record today, you unlock it today, not tomorrow.
- Bumpy car rides stop getting labelled as "cycling" — the vehicle-motion classifier now uses three signals instead of two: mean cadence, accelerometer variance, AND the per-10-second cadence standard deviation. Real cycling produces stable cadence; bumpy cars produce bursty cadence. Whenever a coalesced ride window has mixed CAR/CYCLING/TRAIN minute-level verdicts, or a CYCLING-like stretch that lasts under 5 minutes, the review card now shows the honest generic "Likely vehicle motion" label instead of asserting a specific subtype it isn't confident about. Existing CAR / CYCLING / TRAIN verdicts still fire when every minute agrees.
- No more congratulatory buzzes while you're sitting in a car — the Steps screen's milestone haptic (the one that buzzes every 1,000 steps) is now suppressed while the sensor manager has an open suspected-vehicle window. If you tap "Remove steps" on the review card, the phantom steps drop out of the count and your next genuine crossing of the milestone still buzzes; if you tap "Keep", the number stays and the buzz fires the first time you cross it for real.
- Steps hero no longer flashes impossible cadences like "660,000 SPM · Run" — the live cadence readout could spike to absurd values (60× or more above any real human pace) whenever Android flushed a buffered batch of step-detector events from doze sleep. The pipeline now reads hardware event timestamps instead of delivery time (so batched events keep their real spacing), computes rate as
(N-1)/spaninstead ofN/span, requires at least 3 events and a 1s measurement window before emitting a rate, drops out-of-order sensor events rather than clamping them, caps every cadence at 250 SPM (elite sprinters top out around 220), and decays the hero to "Idle" after 10s of no-motion regardless of tracking mode. Intensity zone changes also now require two consecutive agreeing samples to prevent one-off spikes from flashing "Run". Removing a suspected vehicle window additionally drops any in-memory sensor state that overlaps the deletion and inline-recomputes the day's rollup in a single transaction, so the hero and intensity-zone minutes update within a frame instead of waiting for the background debounce.
Security
- CSV formula-injection defense on export — cells that start with
=/+/-/@/tab/CR are prefixed with'on export so spreadsheet apps (Excel, Sheets, LibreOffice) don't execute them as formulas. Kinoku's own round-trip strips the prefix back out, so a Kinoku-backup → reimport is lossless. - SHA-256 required on restore — pre-checksum backups are routed through an explicit "Restore anyway?" confirmation instead of silently bypassing verification. Hand-crafted ZIPs with
dbSha256: nullcan no longer bypass the integrity gate. - Silent-refund analytics — Google-initiated refunds are detected via a cold-launch tier-delta check and emit
billing_refund_detected(anonymous, no PII) so ops can correlate support volume. Acknowledgement-retry exhaustion emitsbilling_ack_exhausted+ Crashlytics for the same reason.
- Long-press any bottom-bar tab to open a contextual menu with Rearrange tabs (opens Nav Bar Customization) and Hide bottom bar. Faster than digging through Settings → Appearance. When the bar is hidden, a small chevron-up pill appears in its place — tap it to restore. The pill only shows when you've explicitly hidden the bar, not during the scroll-hide behaviour on the Log screen.
- Trash & Undo for deleted workouts — deleting a workout now moves it to a 30-day Trash instead of destroying it immediately. Every delete comes with an Undo snackbar; anything older is reachable from Settings → Data & Storage → Trash, where you can see how many days each workout has left before permanent deletion, Restore individual workouts, Delete Forever, or Empty Trash. Trashed workouts are excluded from stats, charts, the muscle heatmap, Pulse Score, bet progress, Zone Training, AI Coach insights, challenges, and the calendar — the moment you delete, everything reflects as if the workout was gone. Restore brings all of it back: PRs reappear, your named-program training max rewinds to include the restored session, Health Connect re-writes the session, bet progress updates silently on Firestore, and the training calendar re-marks any planned workout it completed. Workouts sit in Trash for exactly 30 days; a background worker permanently deletes anything older. Imports that you later roll back skip Trash entirely and go straight to permanent delete.
- Bodyweight exercises count honestly now — pull-ups, push-ups, dips, and other bodyweight exercises finally contribute real load to your volume, muscle map, weekly trends, Pulse score, and PRs — not the placeholder "1 rep = 1 unit" proxy the app used before. Set your bodyweight in Profile (or track it via the Body Weight Pulse metric, or a smart scale via Health Connect) and every bodyweight set from that point on records your bodyweight alongside the reps. Biomechanics coefficients apply automatically so a push-up counts as ~64% of your bodyweight, a dip as ~98%, a pull-up at 100%, matching published research. Historical sets logged before you started tracking bodyweight stay exactly as they were — we never retroactively re-value old data. The coefficient used is saved with every set so future research updates never silently rewrite your historical charts, records, or achievement ratios either.
- Opt out of bodyweight recording — a new Record bodyweight on bodyweight sets toggle under Profile Settings (default on). Turning it off stops future captures; every historical set keeps its stored bodyweight, so your Total Load history never disappears. Flip it back on any time and capture resumes immediately.
- Source and age on every bodyweight number — the composition subtitle under the Total Load chart now reads "of which bodyweight: 78 kg · from Profile · 2 weeks ago", so you can tell at a glance whether the reading came from your profile, the Body Weight Pulse metric, a Health Connect scale, or a manual backfill. Subtitle color shifts to a warning tone past 14 days and a stronger warning past 60 days to flag readings that probably need refreshing.
- Profile Settings now shows your current bodyweight provenance — under the bodyweight field you'll see "Currently 78.0 kg · from Profile · 2 weeks ago", colored by freshness. If Health Connect has a newer smart-scale reading than your profile, a "Use it" card appears so one tap pulls the newer value in with its original measurement timestamp.
- Total Load tab shows even before you've logged your first snapshot — if your profile bodyweight is blank, the empty state explains why the chart is empty and one tap takes you to Profile Settings to set it. Previously the tab was hidden until data appeared, which meant users never discovered the feature.
- Info sheet rewritten for clarity — the (ⓘ) on the Total Load tab now walks through the exact formula (bodyweight × biomechanics coefficient + added weight) × reps, explains why your Total Load changes when your bodyweight changes (same reps, different work), and lists the bodyweight sources in priority order (Health Connect < 7d, Pulse metric, Profile, manual backfill).
- Share-card honesty gate — the "Gravity Defier" share preset won't auto-appear on a relative-strength milestone when the bodyweight denominator is older than 45 days. A "1.5× bodyweight" claim printed on a public share should be based on a recent scale reading, not a three-month-old profile value. Update your bodyweight first; the preset returns.
- Gravity Defier caption variants — the existing "{ratio}× bodyweight on Pull-Up" caption stays, and there's now a detailed alternative "{ratio}× my 78 kg on Pull-Up · clean rep" that exposes the denominator for viewers who want to see the underlying numbers.
- CSV backup round-trips coefficient — the
workout_sets.csvexport gains abodyweightCoefficientUsedcolumn. Backups made after this release can be replayed without any coefficient-table drift. Older backups (pre-v105) import cleanly too — the importer tolerates the missing column and falls back to the live table for those historical rows. - Manual bodyweight backfill on any historical set — long-press a set in the History tab of a bodyweight exercise to open a small dialog: "Bodyweight at time of set." Fill in what you actually weighed that day to correct a stale capture, or add bodyweight to a pre-tracking set that would otherwise stay at the legacy "1 rep = 1 unit" proxy. Only the set you edit changes. The workout's own date becomes the measurement timestamp, and the source is labeled "entered manually" so you can see the difference. Clearing a value reverts the set to the legacy proxy. First time you open the History tab on a bodyweight exercise, a small dismissible banner explains the long-press affordance so you don't miss it.
- Relative Strength mode on the Total Load chart — a new Absolute / Relative segmented control above the chart on any bodyweight exercise. Absolute shows raw load moved (kg or lbs); Relative shows it as a multiplier of your own bodyweight (×BW, unitless). Relative mode is resilient to cutting and bulking — if your ratio climbs, relative strength is genuinely improving regardless of which direction the scale moves. The app remembers your choice per exercise so a pull-up can default to Relative while a weighted dip stays on Absolute.
- Total Load chart tooltip shows the formula — tap any point on the chart in Absolute mode and a small line underneath the hero number explains the math: "(78 kg × 0.64 + 10 kg) × 10 = 598.4 kg". No more opaque numbers — you can see exactly how the coefficient turned your pushup session into a kilogram total, and why your history doesn't shift under future coefficient updates.
- Dashed bodyweight trajectory overlay on the Total Load chart — in Absolute mode, a faint dashed line traces your bodyweight across the same sessions so you can see at a glance when a cut or bulk changed the load story. The overlay uses independent y-normalization so a 6-kg range of bodyweight stays visible against a 600-kg range of load, and a small tertiary-colored caption under the chart labels it. Hidden in Relative mode (the ratio already factors out bodyweight).
- PR timeline dual-track labels for bodyweight exercises — the Personal Records timeline on any bodyweight exercise now tags each entry as "Reps track" or "Total Load track" with a small chip under the value. The Total Load track is a new PR type (MAX_TOTAL_LOAD) computed from
(bodyweight × coefficient + added) × repsper session, using only sets that carry a captured snapshot — legacy sets without bodyweight data stay on the Reps track. An info button next to the timeline title opens an explainer for why two tracks exist and how long-press backfill moves a historical set onto the Total Load track. - Snapshot audit on the backfill dialog — opening the long-press backfill dialog on a bodyweight set that already carries a captured snapshot now shows a compact provenance card at the top: bodyweight value, source (Profile / Health Connect / Pulse / manual), age of the measurement, coefficient used at capture, and the per-rep and total load computed from the stored numbers. Pro users can audit a single set end-to-end without leaving the dialog. Legacy null-snapshot rows skip the card — there's nothing to audit — and show only the edit field.
- Biomechanics coefficients now cover every bodyweight exercise in the library — expanded the coefficient table from 73 to 488 entries so every pull-up variant, push-up family member, jump, stretch, and mobility drill has a research-informed
(load % of bodyweight)coefficient. No more silent 0.70 default fallback on exercises the app didn't explicitly know about. Major additions: full TRX / suspended variants, swim strokes (low-load), running/walking cardio (bodyweight-cyclic), stretches and yoga poses (static, ~10% load), and all plural / alias spellings. Build-time CI audit now hard-fails on any bodyweight exercise added without a matching coefficient entry, so this quality bar stays locked in. - "Update bodyweight" nudge on Today's screen — if your profile weight is more than 60 days old, a gentle card on the Today's view reminds you that pull-ups, push-ups, and dips only count real load when your bodyweight is current. One tap takes you to Profile Settings; dismissing hides it for a week. The nudge never appears until your data is genuinely stale, and respects the capture toggle — opt out and the nudge stays silent.
- Per-session bodyweight confirm prompt — when you finish your first bodyweight set of a workout and your profile weight is more than 2 weeks old, a small non-blocking card appears above the action bar: "Still 78 kg? Last measured 3 weeks ago." Tap "Looks right" to dismiss, or "Update" to type your current weight inline. Saving the update writes it to your profile AND retroactively fixes the just-logged set's snapshot — so the single set you just did is counted against your real weight, not the stale value. Only fires once per workout session.
- One-time explainer for warning-tone bodyweight badges — the first time the composition subtitle under the Total Load chart renders in a warning color (14–60 day-old weight, Note tier) or a stronger warning color (60+ days, Stale tier), a brief coach-mark overlay explains why the color is there and how to refresh. Shown once and never again per install.
- Coach weekly recap shows bodyweight contribution — the Weekly Recap card on the Coach screen now has a small sub-line: "Includes 3,240 kg from bodyweight sets." Makes it clear how much of your weekly volume number came from pull-ups, push-ups, dips etc. versus weighted lifts. Silent for weighted-only weeks.
- Total Load chart — on any bodyweight exercise detail view, a new Total Load tab shows
(bodyweight + added weight) × repsper session. Info sheet explains the formula. The composition subtitle under the hero number shows how much of the total was bodyweight at the selected point, so you can see the story: "I cut 4 kg over 3 months, started adding a 10 kg belt, and my Total Load stayed flat — real strength progress." - Optional added-weight chip on bodyweight exercises — when you strap on a belt or vest, tap "+ Add weight" on any bodyweight set to record the extra load. Per-set, not per-exercise, so you can mix pure and weighted sets freely. The next set auto-expands the input as a progression hint; tap × to dismiss and go back to pure bodyweight.
- Gravity Defier achievement — a new Strength-category achievement with three tiers: 1.0× bodyweight (Bronze), 1.5× bodyweight (Silver), 2.0× bodyweight (Gold). Measures the best
(bodyweight + added) / bodyweightratio you've hit on any bodyweight exercise. - Total Load hero share card — when you cross a relative-strength milestone (1.0×, 1.5×, or 2.0× bodyweight) in a session, a new share preset auto-suggests with a Trading-card layout and a caption like "1.5× bodyweight on Pull-Up".
- Real-time step counter — the Steps screen hero number and the lockscreen notification now tick per step as you walk, with a spring-animated transition, cadence-zone colour shift (stroll → walk → brisk → run), and a tappable "SPM · zone" readout beneath the big number that explains what SPM means and the zone thresholds. Pending detector fires render as a faded "+N" badge that reconciles silently at the window flush — the confirmed number never rewinds. While the Steps screen is foregrounded, sensor fidelity is temporarily boosted to per-step reporting regardless of your battery mode (Precision / Balanced / Efficient / Minimal), so the count ticks even in Minimal mode without defeating its battery savings when the screen is not open. Milestone haptics fire at every 1000 steps. Opt out of the expressive extras (keep the tick but lose the colour + haptic) from the Live step feedback card on the Steps screen. Honors the system "Remove animations" accessibility setting automatically.
- Muscle activation prompt — finish a set on a custom exercise that has no muscles tagged and Kinoku asks once per workout whether to fill them in, with AI-suggested muscles pre-filled when the exercise name is recognized. Choose Fill in now (the regular muscle editor), Later (adds it to a session-end wizard), Skip (ignore for this workout), or Turn off prompt (the prompt never shows again). At session end, all deferred prompts appear one-by-one in a compact wizard before the post-workout summary so your heatmap reflects whatever you just tagged. Circuit / EMOM / AMRAP sessions never show the mid-workout dialog — those workouts only see the wizard at the end. Settable from Settings → Workout → Muscle activation prompt (default: on).
- GPS runs recorded on watch — runs tracked with the Wear OS companion app now persist on-device and sync back to your phone when it finishes, so every run shows up in your history with full splits, pace, elevation, heart rate, calories, and route map. Previously the watch-only summary vanished after you tapped Done. If your phone or watch crashes mid-run, a periodic snapshot + recovery system preserves whatever was captured (bounded to the last split boundary or 30 seconds, whichever comes first).
- Two new watch-face complications — Today's Steps (compact count or progress arc toward your goal) and Last Run (distance + time since last run). Tap either to open the Kinoku watch app.
- Step goal on the watch — your daily step goal now syncs to the watch. The Step tile shows "X / Y" progress with a green checkmark once the goal is met.
- Routine selection context — routine cards now display when you last performed each routine, completion count, and estimated duration across all 4 surfaces (LogScreen quick-pick, Load routine dialog, scene suggestions, and Routine Library). New "Next Up" sort mode in Routine Library prioritizes routines you haven't done recently. Smart Today rotation suggestions get a subtle border highlight on matching chips. Tap "Stats" on any routine card to jump directly to Analytics filtered by that routine.
- Calendar indicator legend — new ⓘ button on the Calendar screen opens a visual guide explaining all day-cell indicators: metric ring, scene dot, category dots, routine bar, and planned workout dots. First-time visitors see a red badge drawing attention to the button.
- Enriched day detail — tapping a calendar day now shows named daily metrics with completion status, workout scene badge, and muscle category summary — directly explaining the visual indicators on the day cell.
- Calendar visual polish — scene pip enlarged (6→8dp) with border, planned dots increased (5→6dp) with thicker outline, category dots get dark-theme border, phase bands show phase name labels.
- Interval Editor — build and edit custom interval workout templates with a visual step list. Add warmup, work, recovery, cooldown, and rest steps with distance (m) or time targets. "Add Repeat Block" expands N×work+recovery pairs in one tap. Reorder and delete steps inline. Access via the + button in Interval Library or by duplicating any built-in template.
- Step Tracking Modes — four battery/accuracy profiles selectable from the Steps screen: Precision (10 s batching, live cadence), Balanced (60 s, default), Efficient (2 min, no cadence), Minimal (5 min, maximum battery savings). Mode persists across app restarts.
- Vehicle Motion Filtering — accelerometer + cadence heuristics automatically flag suspected car/cycling/train windows in step data. Flagged windows appear on the Steps screen as "Suspected Ride" cards — tap Remove to delete those step samples or Keep to dismiss the alert.
- Coach Reasoning Transparency — every AI Coach card now carries evidence chips (data sources, recency stamp) and an ⓘ button that opens a detail sheet explaining why the insight was surfaced, what data it used, the suggested next step, and its limitations. Fully on-device, no cloud.
- Run Race Predictions with Confidence — the Predictions tab now shows HIGH / MEDIUM / LOW confidence badges per distance, based on how many qualifying efforts the engine found. Outlier runs are filtered before prediction and the rejected count is shown so you know the signal quality.
- Voice control for timed sets — tap the mic during a timed exercise and say "sixty seconds", "one minute", "set timer to 90", "stop", "add ten seconds", or "reset". The phone speaks the final 3-2-1 so you can keep your eyes on the bar. New "Spoken timer countdown" toggle in Workout Settings (default: on).
- Calendar routine drop & day copy — tap the new drag button on the Training Calendar to pick a routine from your library, then tap any day to plan it instantly. Long-press a day to copy all its plans to another day. Duplicate and past-date drops are blocked with helpful messages.
- Periodization Overhaul — 4-phase system:
- RIR Autoregulation (ELITE): Log RIR per set, engine auto-adjusts next session's load and volume
- Volume Landmarks (PRO): Per-muscle MEV/MAV/MRV tracking with weekly volume bars on the dashboard
- Named Programs (PRO): 5/3/1, GZCLP, nSuns with automatic TM progression and AMRAP tracking
- Readiness Adaptation (ELITE): HRV + sleep driven daily load/volume scaling with override support
- Cycle-Aware Training — Opt-in menstrual cycle tracking with phase indicator, daily symptom logging (13 signals + custom tags), cycle predictions, calendar phase decoration, and coach phase-aware messaging. At ELITE tier, a Correlation Engine analyzes your workout performance across cycle phases after 3+ completed cycles. Privacy-first: all data stays on your device, never synced. (FREE base · PRO predictions + full symptoms · ELITE correlations)
- Cycle Tracking — full fertility tracking (FREE tier) — the cycle feature now includes complete fertility and pregnancy support:
- Tactile symptom input — progressive ring-fill buttons with per-level haptics, long-press detail sheets with semantic labels and optional notes, non-destructive tap-at-max.
- Vertically scrollable multi-month calendar on the dashboard with logged/predicted bleed distinction, fertile-window and ovulation markers, symptom dots, tap-past-day retroactive logging.
- BBT (basal body temperature) tracking — °C/°F input that respects your unit preference, 30-day chart with biphasic thermal-shift detection and coverline overlay.
- Cervical mucus, LH tests, pregnancy tests, and intimacy — optional fertility logs per day, all null-by-default, localized in all 8 languages.
- Multi-method ovulation prediction — DATE, BBT (thermal shift), MUCUS (peak egg-white day), LH (surge), and SYMPTOTHERMAL (pairwise inlier combo). Each prediction is labeled with its method and a 0.0-1.0 confidence score.
- TTC (trying to conceive) mode — opt-in toggle that expands fertility tracking in the UI, adds a "Best days to conceive" dashboard card, and fires a late-period pregnancy-test reminder. Modal disclaimer on first enable.
- Pregnancy foundation — a positive test + late period triggers a one-time "Are you pregnant?" prompt. Confirming it switches to pregnancy mode: cycle-phase pipeline pauses, dashboard shows EDD (LMP + 280 days) and week-of-40, prenatal-care disclaimer. Exit mode with a reason (delivered / loss / other).
- Health Connect menstruation import (PRO, opt-in, read-only) — import period data from other trackers you already use. We never write cycle data back to Health Connect; the contract is enforced by a regression test.
- Delete all cycle data — one-tap purge of periods, symptom logs, BBT readings, fertility logs, and pregnancy records from Profile → Wellness, separate from "disable cycle tracking" which preserves data.
- Disclaimers throughout — "not medical advice," "not for contraception," and "does not replace prenatal care" surfaced in TTC/pregnancy flows. The codebase is audited to contain zero "safe days" / "won't conceive" / "prevent pregnancy" language.
- Step Analytics dashboard — lifetime step stats, monthly and weekly trend charts, and a consistency heatmap showing your step habits over time.
- Quick Share Pager — swipe through full-size card previews directly in the workout share sheet before exporting.
- 3 new sticker templates — Magazine, Neon Sign, and Trading Card join the sticker share collection.
- Retroactive routine history linking — when you create a routine, Kinoku automatically finds and links past workouts with a similar exercise fingerprint so your history starts full, not empty.
- Cycle data in CSV export — cycle log, symptom entries, and correlation snapshots are now included in the ZIP backup and CSV export.
- 3 new achievements: Body Reader (7/14/30 day symptom streak), Full Circle (complete cycle logging), Pattern Finder (first correlation insight)
- 5 new achievements: MEV Across the Board, MRV Survivor, 5/3/1 Graduate, True Strength, Deload Discipline
- Today's Readiness card on Active Program dashboard
- Override composition system for combining multiple prescription sources
Changed
- Timed sets now support countdown: type a target (e.g. 60s for a plank) and tap ▶ to count down — the set saves automatically when it hits zero. Leave the field empty to count up like a stopwatch. Long-press the play button to flip modes.
- Default bottom bar now surfaces Coach in place of Challenges. New order: Today · Calendar · Body · Coach · Pulse. Existing customizations are preserved — tap "Reset to default" in Nav Bar Customization to pick up the new arrangement.
Improved
- Recovery tab now adapts to how hard each muscle was actually hit. Light stimulus (secondary movers on compound lifts, bodyweight pumps) recovers in hours rather than days, while heavy sessions keep a full 72-hour window. A new load pill on each muscle row shows whether the last session was Light, Moderate, Heavy, or Extreme — calibrated against your own trailing 28-day training median, not a fixed threshold. Smart Today stops vetoing lightly-hit muscles from suggestions, and the Muscle Map group chip now picks the most-stressed sub-muscle (not just the most recent) as its representative.
- Manage Metrics screen UX overhaul — taller metric cards (110dp) with 2-line labels to eliminate truncation, trend arrows (TrendingUp/Down) replacing cryptic dots, search bar for filtering available metrics, visible minus icon for deactivation, FAB for "Create Custom" (no longer crowding bottom nav), Tune icon replacing ambiguous gear, and a one-time coach mark explaining card indicators.
- Post-workout summary redesigned — routine sync review and scene insights are now embedded inline rather than shown as separate sheets.
- Muscle map frequency colors now adapt to the active theme color scheme.
- Muscle map period selector — choose a custom lookback window (7d / 30d / 90d / all time) directly on the muscle map screen.
- Pulse ring glow intensity scales with your subscription tier for a more expressive visual hierarchy.
- Share system refactored to a composer shell architecture — cards, stickers, and overlays all compose through a single pipeline.
- CSV import matches more of your history — common abbreviations now resolve to the canonical exercise before fuzzy matching, so "RDL" lands on Romanian Deadlift, "OHP" on Overhead Press, "BB Row" on Bent Over Row (Barbell), and "pullups" / "Pull-Up" / "Weighted Pull Ups" all consolidate onto the single Pull up entry. CSVs from European exports also import cleanly: comma decimals (
22,5 kg), semicolon delimiters, and slash-separated set notation (8/10/12in one cell → three sets) are auto-detected per file. - Safer Import Undo — undoing an import no longer revokes organic achievements you unlocked after the import finished. Kinoku now tracks exactly which achievements the import triggered and only rolls those back; anything you've earned since stays on your shelf. Older imports from before this change fall back to the previous time-window undo.
Fixed
- Nothing yet.
2026-04 — Social Bets, Zone Training, Running Intel
Added
- Social Bets (PRO) — Firebase-backed multiplayer fitness challenges with deep-link and QR-code invites. Three challenge types: workout count, streak, tonnage. Firestore rules + App Check enforced; anonymous auth only.
- Zone Training (PRO) — Pace-based training zones with Training Effect scoring (0.0–5.0), polarized model (70–90% easy target), weekly zone distribution snapshots, and dashboard surfaces on the Run Analytics screen.
- AI Coach Running Intel — New Running Intel card on the Coach screen with pace sparkline, VO2max, pacing score, and recent best efforts.
- Hero Share Presets — Ten auto-detected share card presets (PR Hunter, Volume Bomb, Streak Flame, The Grind, Pulse Check, First Blood, Centurion, Runner's High, Body Map, Week in Review) with 16 caption templates and smart variable resolution.
- Pace-Colored Routes — Per-segment pace gradient overlay on maps and share cards, normalized to the runner's own range.
- Program Templates — Ten pre-built programs (PPL, Upper/Lower, Hypertrophy Block, etc.) with a 3-step activation wizard.
Changed
- AI Coach lookback extended from 2 weeks to 8 weeks — weekly recap now reuses a single run query and includes total runs + distance.
- Smart Today rotation detection — automatic A→B→C cycle detection via routine-ID matching and Jaccard fingerprint similarity.
Improved
- Various improvements to
WeightProgressionEngine,MuscleVolumeCalculator,RunAnalyticsEngine,CelebrationEngine,CircuitTimerEngine(pause/resume + process-death snapshot restore),RewardStreakCalculator,RestTimerService(localized strings),WorkoutViewModel(batch set insertion, thread-safe finish guard, voice unit conversion), andRunTrackingViewModel(cross-locale exercise lookup, elevation replay).
2026-03 — Pulse Dashboard, Calendar, Localization
Added
- Pulse Dashboard — Composite Kinoku Score (0–100) combining Training (45%), Wellness (30%), and Health (25%) with state labels (Thriving / Building / Steady / Drifting), cardio+swim effort blending, and trend detection.
- Training Calendar & Planned Workouts (PRO) —
PlannedWorkoutentity, today's plan card on the log screen with start/skip actions, phase briefing dialog for active programs. - Swim Training — Swim exercise identifier, insight engine, 5 achievements, Pulse scoring integration, Pool scene, and swim challenges.
- Route Heatmap (PRO) — Interactive OpenStreetMap view with time filtering, 5 tile styles, pace coloring, stats panel, and shareable snapshots.
- Scenes system — 7 built-in scenes (Gym, Home, Outdoor, Recover, Quick, Run, Pool) with per-scene rest timers, duration targets, and icon customization.
- Locale-aware defaults — Unit system (metric vs imperial) and first-day-of-week now default based on device locale.
- Pre-commit hook — Runs locale completeness check, debug build, and unit tests before accepting commits.
Changed
- Rebranded from FitTracker to Kinoku — new package (
app.kinoku), database renamed with auto-migration fromfit_tracker_db, deep-link schemekinoku://. - Subscription tiers renamed — PREMIUM → PRO, AI_PLUS → ELITE.
- Number, time, and date formatting — now uses
LocaleFormatter/DateTimeFormatter/getBestDateTimePatternacross all 8 locales.
Security
- Backup integrity verification — SHA-256 checksum and SQLite magic-byte verification on create and restore.
How to maintain this file
- Edit
[Unreleased]as you land work. At release time, rename the section to a dated entry matching the tag/release. - Keep entries user-facing. Internal refactors, dependency bumps, and test-only changes don't belong here — they live in commit messages.
- Group changes under the standard headings (Added / Changed / Improved / Fixed / Removed / Security) for scannability.
- Reference roadmap items by the same name used in ROADMAP.md so users can trace "coming soon" to "shipped" without guessing.
- Never rewrite history. If an item was mis-described, add a new entry fixing it rather than editing the old one.