Back to the work

Fitness & liftingExpo · one codebase, three targetsAscend Log

AscendLifting League

A lifting app for training.

Ascend is the lifting app I build for my own training and use in the gym. One codebase compiles to iOS, Android and the web. The point of it is the record it keeps: every set, under load, with no signal.

  • Web

    Live with open signup.

    Visit Ascend
  • iOS

    In TestFlight external beta.

  • Android

    In Play closed testing.

Ascend’s Back Squat exercise page, with front and back muscle diagrams, primary and secondary muscle groups, and training navigation.

Ascend Log · the exercise library

Web live with open signup · iOS on external TestFlight · Android in Play closed testing · Supabase Postgres with row-level security on every app table

HUD · field sampleThree gauges, one record

Readiness · load index7d

Recent load against your own baseline, not a population’s.

Training · one block, one set30d

The brighter the bar, the closer that set was to failure. The bar draws the number you logged and adds nothing.

Volume moved · this period over the last316,144 lb

Drawn in code on the instrument’s own geometry. The arc’s centre, radius, start angle and sweep are the app’s constants. The readings repeat the field sample Ascend’s site publishes; no personal training record appears here.

In the gym

Logging sets

Sets are typed. Load, reps, duration, distance, bodyweight and effort sit under seven kinds of set and six ways of measuring one, so a drop set and a timed carry are both first-class instead of a number in a notes field. The numpad docks, the row you are editing scrolls into view, the plate summary updates as you load the bar, and the calculator remembers the bar and the equipment for that exercise. One completion path serves a solo workout and a shared one.

A hand-transcribed mirror of the database’s own constraints gates completion, because the generated types do not carry them.

Plate math · remembered per exercise45 lb bar · 90 a side

225lb on the bar4525101045251010
A 450 mm plate against a 2,200 mm bar, drawn to the proportions of real equipment. Ascend keeps the bar weight and the available plates per exercise, so the stack it shows you is the stack in front of you.

Afterwards

Reviewing a training block

Each exercise yields three series: estimated one-rep max, volume and best reps. They are derived on the device and free to draw. Records maintain themselves in a sidecar the database keeps up to date. The review at the end of a block reports what was done and refuses to prescribe: no targets, no thresholds, no “you should”. A trend is never carried by colour alone, and up is deliberately not green.

The same formulas exist in TypeScript and in SQL, held to one set of 23 golden vectors: the app suite reads the file, and the server suite restates the same numbers.

Underneath

Saving a workout without signal

A workout needs to keep recording when the connection fails. Every session screen renders from a local SQLite mirror, never from the server, and finishing a set writes the row and its outbox entry inside one transaction, so a row on the screen is provably queued. The outbox is declared never to be dropped. A write is dropped only when Postgres itself returns a deterministic verdict, and then the screen says so; anything short of a verdict (a dead zone, a gateway error) is retried, because a dropped write cannot be recovered. A pull that arrives late can never revert a fresh edit or blank a screen.

The screen distinguishes a saved local edit from a write the server has rejected.

The evidence

Sources behind the knowledge graph

Underneath the app sits a knowledge graph distilled from public recordings by evidence-first researchers and coaches. Every claim in it must carry at least one quote that is a verbatim run of the transcript, with a deep link to the moment it was said; a claim that cannot be anchored does not ship. An audit re-checks every anchor as a string match and fails unless the rate is exactly one hundred per cent.

Recordings admitted
194
Claims in the graph
9,916
Anchored quotations
20,349
Anchor rate demanded
100%

The graph answers a question by returning the claims that bear on it, each with who said it and when. No language model writes an answer anywhere in the system.

Engineering

Storage, retrieval and verification

Ascend has to find the right claim among ten thousand and keep a set logged in a gym with no signal.

Graph

two node tiers by CHECK · eight edge kinds · UNIQUE(source, target, type) · verbatim anchors of 8 to 25 words · audit exits non-zero below 100%

One Postgres table holds both what a source said and what the system synthesised across sources; a constraint keeps the two tiers apart.

How it works

Edges are limited to eight named relations, and constraints rule out self-loops and duplicates. Every claim must carry at least one quote of 8 to 25 words that is a contiguous run of its transcript. A verifier told to default to refute keeps, repairs, salvages or drops each claim (243 of 9,916 were salvaged). A deterministic audit then re-checks every quote as a string match and fails unless the rate is exactly 100%.

Vectors

Voyage voyage-4 · 1024 dimensions · pgvector halfvec(1024) · composite embedding key · content-hash skip

Each claim is embedded by Voyage’s voyage-4 model as one text made of its title, statement, detail, conditions and takeaway, because embedding the statement alone matched headlines.

How it works

The vector lives in Postgres as a half-precision column of 1024 dimensions, and a claim is re-embedded only when the hash of its text changes.

Retrieval

SECURITY DEFINER matcher · title-prefixed chunks · max cosine per node · exact scan behind MATERIALIZED · relevance reranking · answerability flag

In the matcher, a synthesis node scores by its best title-prefixed paragraph, each paragraph with its own vector, and a source claim scores by its single vector.

How it works

The two lists merge into one cosine ranking. The matcher forces an exact scan, because an approximate search filtered by tier once returned no synthesis rows at all; the index stays built for the day the corpus outgrows the scan. A synthesis top-up applies only when the best synthesis score clears a floor calibrated at 0.52. The current knowledge endpoint then reranks candidate claims for relevance to the question and says whether a returned claim directly addresses it. If that stage cannot run, it returns the matcher’s context and marks relevance as unavailable.

Measured

known-item benchmark · n = 379 · MRR · paired 95% CI · reach at depth 50

Three hundred and seventy-nine model-written questions, each with one right claim fixed before retrieval ran, were scored through the deployed database functions.

How it works

Against one vector per node, the matcher’s merged ranking, measured with the synthesis top-up switched off, gains +0.096 in mean reciprocal rank (MRR) overall (95% CI +0.069 to +0.122) and +0.218 on synthesis targets, at a cost of -0.025 on source claims. Targets never reached at depth 50 fell from 19.0% to 9.5%. On the first live run one tier scored exactly 0.000; it was read as a plumbing fault and traced to a quota that had been acting as a cap.

Security

RLS enabled on all 44 tables · forced on 43 · zero-policy vector tables · SECURITY DEFINER, pinned search_path · grants pinned by a CI contract test

Isolation is row-level security: every application table has it enabled, and it is forced on all but the synthesis-run ledger.

How it works

The three vector tables carry no policy at all, so no client role can select a vector. The graph’s vectors are reached only through definer functions with a pinned search path, which return ids and scores and nothing else, and a contract test in CI pins the revoke and grant lines of the migration that set those grants.

Offline sync

SQLite mirror · transactional outbox · rank-ordered drain · idempotent upsert · SQLSTATE classifier · watermark minus 120 s

A set is written to the on-device SQLite mirror and to an outbox row in one transaction, and inserts from the outbox land as idempotent upserts.

How it works

A set is written to the on-device SQLite mirror and to an outbox row in one transaction. The outbox drains parent before child, and inserts land as idempotent upserts on a client-minted or natural key, so a replay after a lost acknowledgement is an update. Only a five-character SQLSTATE counts as a verdict: no code or a gateway error retries, thirteen named transient codes retry, and any other code drops the write and tells the user. Pulls read from two minutes behind the watermark, because commit order is not timestamp order, and apply only rows strictly newer than the local one.

Delivery

CI gate on every PR and main push · live-origin bundle check · 7-component native fingerprint · device-logged update id · SHA-256 migration receipts

Every pull request and every push to main runs TypeScript, lint at zero warnings, the native fingerprint guard, migration lineage and Jest.

How it works

After the web publish, CI fails unless the live origin serves the same content-hashed bundle the commit just exported; that guard was built after the site was found serving a bundle 657 commits stale. An over-the-air update is refused when any of seven native compatibility components has moved, and it counts as shipped only once the Android device logs the exact update id on a second cold launch. Every production migration since the receipt ledger began carries a receipt with SHA-256 hashes of its source and of the statement actually executed.

Paired MRR differences by question slice. The matcher’s merged ranking (top-up off) minus one vector per node, mean reciprocal-rank difference with a 95% confidence interval, on 379 model-written known-item questions scored through the deployed database functions. A value above zero means the matcher ranked the right claim higher. Recomputed from the ranks the project saved. Retrieval has not been re-run since, and the corpus has grown.
  • All questions n = 379+0.096 +0.069 to +0.122
  • Synthesis targets n = 188+0.218 +0.173 to +0.263
  • Synthesis, detail only n = 93+0.261 +0.195 to +0.328
  • Source claims n = 191-0.025 -0.040 to -0.010

Limits. The earlier benchmark shown here used model-written questions on the corpus as it stood then; it measures the matcher before the current relevance reranking stage. This page has not repeated those historical measurements. The matcher uses cosine plus the synthesis top-up, with no lexical leg or reciprocal rank fusion. The current endpoint adds relevance reranking and a flag saying whether a claim addresses the question; no language model generates an answer. A synthesis node scores by its best paragraph, which can lift its score; a later check put the lift near zero, and the reach figure does not depend on it. The retrieval endpoint is built to return a prompt-ready context block, and nothing in the app calls it. The anchor figures are counts from the graph on disk. The audit is a gate the pipeline runs before a claim ships; it was not re-run for this page. The SQL golden tests and the row-level-security red-team run against a database by hand, outside CI. Update proof on a physical device is Android only; iOS update ids are recorded without device proof.

Training and product development

Ascend is my fitness and lifting app. It gives me a sustained product problem to work on: making software that fits around training, with decisions about usefulness and interaction that have to hold together over time.

I approach that work through both the product and its implementation. The interface is part of the experience, and the engineering underneath it needs the same attention.

Customizing the interface

Ascend’s look is customizable. I want the visual experience to feel like something a person can make their own, while keeping the underlying product coherent.

That creates an interesting design constraint: give the app character and allow variation while retaining a clear, readable interface. The appearance is one part of the product, and it deserves deliberate work.

Development and testing

The project has grown into a substantial codebase with a verification workflow. It is a place to practice the less visible parts of product development: maintaining context, checking changes and returning to decisions as the application develops.

Ascend is live on the web with open signup; the iOS build goes out through external TestFlight and the Android one through Play closed testing. I continue to develop the product around the work of training.

Changelog

What shipped, newest first.

27 releases since 19 Jul 2026, the latest on 30 Aug 2026. From Ascend’s in-app release notes.

  1. 2026.08.30.3

    Your first workout, guided

    Sign in with less repetition, choose an optional first-workout guide, and retry exercise loading without losing your place.

    • New When your training history is empty, Home offers a one-time invitation into the existing five-step walkthrough; dismiss it, or replay it anytime from Settings.
    • Improved The required 16+ confirmation still happens before sign-in begins; the email code sheet no longer asks for the same confirmation again.
    • Fixed When no saved exercises are available and the catalog request fails, the picker explains the connection problem and offers Retry without closing the sheet or clearing search and muscle filters.
  2. 2026.08.30.2

    Lift Cards, even without a signal

    Design and share a completed workout's Lift Card while its invitation link, QR, code, and friend-send wait for a connection.

    • New Ascend builds the Lift Card from the completed workout already on your device, so unavailable invitation setup no longer closes the designer or blocks outward sharing.
    • Improved When the connection returns, Retry adds the link to perform the workout, the QR, the code, and Send workout in Ascend; until then, the shared card leaves out its invite footer.
    • Improved When a detailed set list will not fit, Ascend asks for Best set or Counts instead of cropping completed rows.
    • Fixed If the active account changes while friend-send is open or in flight, Ascend expires that share instead of reusing its workout or showing a stale result.
  3. 2026.08.30.1

    Friends, with clear boundaries

    Decline dismisses a request; Block removes the connection and shared workout access, then keeps both people out of each other's Ascend social surfaces.

    • Fixed Not now and Decline remove only the pending request, so either person can reconnect later.
    • Fixed Open social screens stop showing the blocked person immediately while fresh data reloads.
    • Improved Block removes the friendship and both directions of shared workout access, then keeps both people out of each other's requests, profiles, activity, standings, live status, friend workouts, and inbox.
  4. 2026.08.04.1

    The plates are already waiting

    On a plate-loaded exercise, type a working weight and see a live plate summary before you leave the keypad.

    • New On barbell and configured plate-loaded exercises, the keypad turns each working weight into a live plate summary without taking you away from the set row.
    • New Open the plate breakdown to choose barbell or machine, set the bar when one is involved, keep only the plate sizes your gym has, and decide how Ascend should balance and count the load.
    • Improved Tap the target to type an exact weight, tap plus or minus for a small change, or hold either control to move quickly through a larger adjustment.
    • Improved The compact breakdown distinguishes exact from closest loads, states whether counts are per side or total, and keeps every visible plate term readable before you lift.
Earlier releases (23)
  1. 2026.08.01.1

    Your drafts stay put

    Set values now save as you type, whether or not the set is marked complete.

    • Improved Weight, reps, reps left, duration, and distance are saved on your device as drafts with each valid entry, with no Next or checkmark needed to keep them.
    • Improved An unchecked row stays a draft; only the checkmark logs the set and lets it affect volume, records, rest, recovery, and workout timing.
    • Fixed Leaving, backgrounding, or restarting Ascend no longer resets valid values that were still sitting in an unchecked set row.
  2. 2026.07.31.3

    Finish on your time

    Recover forgotten workouts with a considerate reminder, an honest end time, and room to log work you missed.

    • New When an active workout appears forgotten, Ascend gives you a gentle, cardio-aware reminder; opening it never finishes the workout, and you review the end first.
    • New If you trained but forgot to log the last work, enter catch-up mode and add it against the time training actually ended instead of hours of later idle time.
    • Improved Review the last completed set, choose a custom end when needed, and let Finish wait for pending work and server confirmation before the workout closes.
    • Improved Still training, Not now, and reminder taps preserve your place, survive an app restart, and stay scoped to the exact workout and activity moment that created them.
    • Fixed Returning to a forgotten workout no longer forces you to accept an inflated duration or manually reconstruct its end from memory.
  3. 2026.07.31.2

    Picture the work

    See accurate real-world comparisons everywhere your workout volume appears.

    • New The comparison library now spans regulated gym equipment, everyday objects, named vehicles, animals, spacecraft, and landmarks, each with its source recorded.
    • New Your immediate workout recap and web printout now carry the same comparison already available in completed-workout stories and Lift Cards.
    • Improved Every comparison is computed in kilograms, uses named configurations and whole animals, and keeps its rounding error bounded.
    • Improved History, League Activity, the finish recap, Lift Cards, text shares, the volume HUD, and print all render one deterministic shared result.
    • Fixed A 12,000 lb workout now reads as about 2.7 named base Ford F-150 pickups instead of one vague, drastically overweight truck.
  4. 2026.07.31.1

    Every workout tells its story

    Open completed workouts as rich stories of volume, records, and every set.

    • New Completed workouts now lead with centered volume, a fun real-world comparison, tiled stats, and a responsive Training Log for strength and cardio.
    • New The Progress Ledger replaces generic record prose, while exact record labels sit with the sets that earned them whenever that finish-time detail is available.
    • Improved Your workouts and a friend's now share the same rich recap, with only the actions and private details that belong to each viewer.
    • Improved Friend identity and the close control stay visible over patterned and colored Display backgrounds.
    • Fixed Later workouts can no longer erase records genuinely earned in an earlier recap, and incomplete shared data stays unknown instead of being guessed.
  5. 2026.07.30.1

    Rest that stays true

    See a truthful end time and open detailed controls over your workout without stopping the countdown.

    • New Detailed rest controls now open in a layered panel above the active workout, keeping the next set and previous performance within reach.
    • Improved Rest alerts now tell you the exact local end time instead of a remaining-seconds estimate that can age before it reaches the phone.
    • Improved See the live countdown, add or subtract 15 seconds, and toggle cue sounds without clearing the timer.
    • Fixed Back to workout, a drag, Escape, Android Back, or Close now preserves the same rest; only End rest clears it.
    • Fixed Replacing or skipping rest now revokes stale alerts that no longer belong.
  6. 2026.07.29.1

    Set logging, dialed in

    Weight, set type, muscle focus, and duration now live where you expect them, while the active row stays visible as you type.

    • New Tap LB or KG to choose total or per-hand load and set workout-specific sled weight, with clear guidance about what changes past and current volume.
    • New Tap the set number to choose any of seven set types, including Myo-rep and Rest-pause mini-sets, or to open muscle focus without leaving the exercise.
    • Improved CONFIRM LB, CONFIRM REPS, and LOG SET replace the old ambiguous action and redundant LEFT shortcut.
    • Improved For duration, 5 now means 5:00; :30 and 1:30 make seconds explicit, with MIN : SEC guidance beside the input.
    • Improved Lower set fields move above the logger dock and stay put while you advance, dismiss and reopen, or switch rows quickly.
    • Fixed A completed or discarded workout no longer returns through Resume while an older sync is catching up.
  7. 2026.07.27.2

    Exercises, without guesswork

    Browse and add exercises through one clear library, with muscle and training context before you choose.

    • New Picker cards, custom exercises included, now show primary and secondary muscle focus, how many completed workouts used the exercise, and when it was last used.
    • New Hold an exercise to open its History, Charts, Records, and more above the picker, then return to the same search and selection.
    • Improved The Start library, exercise details, and active-workout picker now share your Display backdrop, cards, search, tabs, and protected controls.
    • Fixed Start's main action no longer changes appearance after the console opens, and workout option controls remain visible over camo and colored backgrounds.
    • Fixed With search open, one ADD closes the keyboard and picker and inserts once; Android Back closes the top layer instead of escaping the workout.
  8. 2026.07.27.1

    Progress, while you train

    Keep records and improvements visible in a live Progress Ledger, beside a calmer rest controller that belongs to the workout.

    • New Records and meaningful set improvements now collect in a live Progress Ledger, so the work you are building does not disappear with a brief signal.
    • Improved Rest remains glanceable at the bottom of your workout, with clearer timing controls and more room for the session itself.
    • Improved In Rest Cues, starting rhythms return to compact cards with a trailing peek, and the carousel runs edge to edge without a dark enclosing trough.
    • Fixed Start now opens from one place, so returning from Settings cannot leave a second console or an opaque footer behind.
    • Fixed Finishing or discarding a workout now clears its active rest, including scheduled cues that should no longer reach you.
  9. 2026.07.25.5

    Start, in your style

    Open a calmer Start console that carries your selected color, texture, and panel treatment from the rest of Ascend.

    • Improved The Start console now uses your selected color or Digital Camo canvas, and both its action keys and saved workouts honor your Cards & panels treatment.
    • Improved Saved workouts stay visible while Ascend refreshes them, a failed refresh offers Retry, and New routine remains available in every state.
    • Improved Start now has a visible close control, responsive Activity controls for smaller phones, and links only to destinations that work.
    • Fixed The direct empty-workout and saved-routine buttons now wait for the live-session check, defer to Resume when one exists, and offer an explicit offline fallback when that check fails.
    • Fixed Closing Start cancels a pending start, and rapid close and reopen or nested sheets no longer leave the console catching taps.
  10. 2026.07.25.4

    Settings, one language

    Carry your chosen backdrop, panel style, and one calm navigation rhythm through every Settings destination.

    • Improved Display, Rest cues, What's New, Using Ascend, and About & Legal now share the same title scale, content breathing room, and navigation grammar.
    • Improved Rest Cues now carries your selected color or Digital Camo backdrop, while its main panels honor your Cards & panels treatment.
    • Improved Bare glyphs replace boxed Settings icons, and Using Ascend now keeps the same comfortable inset as What's New.
    • Fixed Frosted Glass and locked-screen cue descriptions now name the visual and sound behavior that each surface can actually deliver.
  11. 2026.07.25.3

    Display, composed your way

    Shape light and dark looks, color and texture, and cards and panels through one fluent visual designer.

    • Improved Your live Home-instrument preview now leads into three stable destinations: Light & dark, Color & texture, and Cards & panels.
    • Improved Choose Clean or Digital Camo first, then shape its color, block size, and intensity in the same focused workspace.
    • Improved Skin ramps, camo fields, and surface treatments now use generous preview cards so each choice reads before you make it.
    • Fixed Editors open in one reusable pushed panel, and a rapid tap made while it closes is queued instead of disappearing.
  12. 2026.07.25.2

    Lift Cards, lined up

    Read each effort value directly beneath its Reps Left label while load and rep values keep their clean left edge.

    • Improved Previous and Current now sit directly beneath each exercise title, while two exercises share each Training Log row so more of the workout remains visible.
    • Improved The Previous column now includes the reps-left value logged for each lifting set, and leaves unlogged values absent rather than guessing them.
    • Fixed Comparison fit checks now model the same two-column rows the card renders, including uneven and odd exercise counts, before sharing is enabled.
  13. 2026.07.23.5

    Lift Cards, clear at every layer

    Matched Story and Post headers, adaptive camo contrast, and dependable designer panels make every Lift Card easier to shape and share.

    • Improved Story and Post now share the same left-anchored Ascend lockup and right-aligned workout identity, with a cleaner rhythm into Volume Moved.
    • Improved Bright or complex camo places key copy on restrained HUD surfaces only when contrast needs help; quiet looks stay open and clean.
    • Fixed Full Preview, Look, and Content now reopen reliably after Back or a camo edit, with no need to switch formats to reset the designer.
    • Fixed Designer content now continues behind the home-indicator area while keeping the final controls safely reachable by scrolling.
  14. 2026.07.23.4

    Lift Cards, dialed in

    Preview the complete card, compose any digital-camo color, and share Story or Post layouts that keep every detail clear.

    • New Tap the working preview to inspect the complete Story or Post before it leaves your hands, then return without losing a choice.
    • New Compose any digital-camo color with Fine, Medium, or Chunky blocks and Subtle or Bold intensity for this card alone.
    • Improved Story uses more of its tall canvas while respecting social overlays, and volume plus workout stats now sit in a stronger centered rhythm.
    • Improved Share Lift Card opens the image share menu; Send Workout opens an Ascend friend inbox layer and returns to your design when you close it.
    • Fixed Switching between Story and Post keeps volume and exercise names visible, while long training logs remain inside their card region.
  15. 2026.07.23.3

    Your Lift Card, your way

    Turn a completed workout into a branded Lift Card for Stories or posts, choosing the look and exactly how much detail feels right to share.

    • New Compose a Story or portrait post from one live preview, then share the exact card you designed.
    • New Start with Minimal, Highlights, or Full, then decide whether to include volume, its fun comparison, workout stats, exercises, and weights and reps.
    • Improved Every card carries the Ascend Lifting League lockup and a compact scannable workout invitation built for social safe zones.
    • Improved Use your current Display or choose Onyx, Paper, Cyan, or Violet for the card alone, and the app itself stays exactly as you configured it.
    • Fixed Image and text-sharing fallbacks now honor the same disclosure choices, and an unavailable personal record stays unknown instead of becoming a false zero.
  16. 2026.07.23.2

    Custom exercises travel

    One themed workout share now carries the recap, QR, link, code, and custom exercises, and a friend can perform it or request beta access from that same invitation.

    • New Every workout recap now carries the same scannable QR, link, and six-character code, so the person who sees it can bring that workout into their own training.
    • New Friend and workout links now explain what was shared, preserve it through sign-in, and let a new lifter request closed-beta access by email.
    • Improved The separate Send and Share controls are now one clear flow for the recap image, workout code, link, and direct friend send.
    • Improved Shared workout recaps now follow your active light or dark palette and digital-camo composition instead of using one fixed export style.
  17. 2026.07.22.2

    Settings, made yours

    A calmer Settings control center keeps your profile, training, privacy, support, and account controls clear without showing everything at once.

    • New Profile, training, privacy, learning, account, and diagnostics now begin in one calm, grouped home instead of one long wall of controls.
    • New Your identity now has a focused home where your display name and optional @handle can be reviewed and saved as one intentional change.
    • Improved Training, privacy, data rights, and diagnostics open as focused destinations, keeping the first screen short without removing a single capability.
    • Improved Bodyweight and handle prompts now open the exact Training or Profile setting they refer to.
  18. 2026.07.22.1

    The League, up to date

    Pull to refresh every League view, with standings that make the current week and a fresh start clear.

    • New Pull down on Activity, Standings, or Friends to fetch the latest League state, with a light haptic the moment your pull commits.
    • Improved Standings now name the current Monday–Sunday range, so every total has a clear timeframe.
    • Fixed When a new week opens at zero, Standings holds back rankings and explains the fresh start instead of placing everyone at #1.
  19. 2026.07.21.1

    Your display, composed

    Display now starts with one complete preview and reveals each layer of customization only when you want it.

    • New See Training, Calendar, or Readiness inside the complete appearance, color, texture, and surface composition.
    • New Appearance, Color, Texture, and Surface now open as focused editors instead of one long wall of controls.
    • Improved Named digital camo colors now carry the app's Action accent while Recovery adapts to stay unmistakably distinct.
    • Improved Block, intensity, frost, and depth controls appear only when the selected material or surface can use them.
    • Fixed Training now states the visual rule plainly: more blocks means more sets, and brighter means greater effort.
  20. 2026.07.20.4

    Every update tells its story

    Ascend now explains what changed, why it matters, and exactly which version is on your device.

    • New The update-ready notice now carries the next release's title, purpose, and highlights.
    • New A permanent, offline release feed in Settings keeps every meaningful improvement easy to find.
    • Improved Version, native build, runtime, and product release now have distinct, understandable labels.
    • Improved New-release education stays dismissible and never interrupts a set or forces an update.
  21. 2026.07.20.3

    Your training month, at a glance

    A new Calendar instrument turns the rhythm of training and recovery into a navigable part of the HUD.

    • New Choose Calendar beside Training and Readiness, then move month by month through your history.
    • New Tap a training, recovery, or open day to reveal its details and the action that belongs there.
    • Improved HUD stats and volume comparisons now follow the selected month instead of pretending it is 30 days.
    • Improved One-row and two-row stat clusters both scroll fully above the floating navigation when a day opens.
  22. 2026.07.20.2

    Friends belong in the League

    Finding, inviting, and understanding training partners now lives in one clearer social home.

    • Improved Friends moved into League, beside the activity and standings that give those relationships meaning.
    • Improved Codes, QR scanning, handles, and your own invite are layered into one keyboard-safe flow.
    • Improved A high-contrast active selector slides between destinations and stays clear over patterned backgrounds.
  23. 2026.07.19.1

    Rest cues, engineered

    Rest timing now feels intentional: a rising three-count, a decisive finish, and cues composed around how you train.

    • New A rising count and a final go cue replace generic timer sounds with a recognizable signature.
    • New Choose the moments, reach, sound, and vibration that fit a felt-sense workout or a strict cadence.
    • Improved Rest-over alerts and live timing can keep working when the phone is no longer in your hand.