Skip to content

v0.18.0

Choose a tag to compare

@vasilyoshev vasilyoshev released this 09 Sep 12:50
362d8ff

0.18.0 (2026-09-09)

Features

  • a11y: CrisisSupportCallout takes a heading level, and /support + /faq raise it to 2 (#2137) (#2164) (949d42e)
  • a11y: Disclosure becomes a full-width heading row (#2143) (#2156) (72e600a)
  • a11y: the crisis callout is a level-2 block on the module homes too (#2167) (#2168) (b9f320e)
  • a11y: the parents' letter gets its five sub-heads (#2149) (#2161) (6944416)
  • a11y: the underage-report route gets its own sub-head in the parents' letter (#2162) (41dadaa)
  • act: a help door in each ACT process list-screen header (#1549) (d8656e1)
  • act: archive rows read compact, detail screens absolute (#1558) (bfd09df)
  • act: every ACT record type gets a reachable archive (#1552) (ca9b662), closes #1517
  • analytics: retention gets a concern axis, and every report gets a guest axis (#1613) (#1649) (8e3e4c9)
  • audio: an opt-in tap for each meditation bell and each breath phase, off by default (#1741) (#1754) (961d777)
  • audio: nine background beds, a fixed loudness gate, and the app plays them (#1130) (#1569) (65b823d)
  • audio: the render pipeline speaks two languages (#1578) (#1584) (9a7d7d5)
  • auth: a guest's Sign in door in the header menu (#1869) (#1895) (73a854a)
  • auth: the Art. 9 consent becomes its own act, asked of everyone (#1766) (#1858) (ffc0df1)
  • auth: the neutral age and country gate, on every entry path (#1764) (#1806) (fd49def)
  • auth: the per-country age floor, and the check that reads it (#1761) (#1773) (cac547f)
  • auth: the under-floor exit erases the account and blocks the device (#1765) (#1821) (db30794)
  • auth: user_preferences remembers the age gate's verdict, never the birth date (#1762) (#1797) (4cfa2cf)
  • breathing: the ambient bed fades in and out instead of cutting dead (#1743) (#1751) (b4433af)
  • breathing: the voice cues are real, and the male voice becomes reachable (#1130) (#1572) (5ede2c4)
  • cbt: the assessment week leads with the active practice (#1676) (#1680) (654a26f)
  • cbt: the Learn surface teaches pace and mode, and the FAQ answers over-use (#1671) (#1684) (1e3ba33)
  • db: a favorites table, the 25→11 copy migration, export and seeds (#1953) (#1962) (44b5f21)
  • dbt: opposite action and the interpersonal script (#1980) (#2031) (0efb12e)
  • dbt: routines, the starter offer, the demo seed, the reports and the docs (#1980) (#2033) (a4236b5)
  • dbt: the coping plan, its card, and Pause and choose (#1980) (#2027) (8542b26)
  • dbt: the data layer - seven born-encrypted tables, preferences, record_days, export (#1980) (#2024) (dcc8a79)
  • dbt: the emotion record - one feeling from what happened to what came after (#1980) (#2029) (e543b08)
  • dbt: the module home, the learn primer and four skill-group pages (#1980) (#2026) (a10a581)
  • dbt: the muscle relaxation session, the module's first timed practice (#1980) (#2028) (ca72f87)
  • dbt: the programme, its graduation, and the module's one reminder (#1980) (#2032) (4cfcab2)
  • dbt: the wise mind check-in and the judgement record (#1980) (#2030) (0cf32f7)
  • donate: the donation path is wired — a Donate row, the Sponsor button, and present-tense policy copy (#1711) (#1720) (c29d52b)
  • grounding: cold-water technique carries its medical caution inline (#1996) (#2014) (2cb062a)
  • home: one card with a star, and Home becomes Favourites, Tools, Modules (#1955, #1956) (#1968) (ae9269f)
  • home: the arrange catalogue groups into Tools, CBT and ACT (#1793) (704db8e)
  • home: the skip-path empty state opens a first tool (#1675) (#1679) (d7f2378)
  • landing: the subreddit closes the landing footer beside Discord (#2130) (1f6ce23)
  • links: the store links default to the live listings, so every build points at a real app (#1776) (#1777) (c44247e)
  • meditation: the sit gets an ambient bed picker beside the bell volume (#1742) (#1752) (32d6bcf)
  • nav: /tools and /modules stop being pages (#2114) (#2135) (4197cdd)
  • nav: a tool home is its own top crumb (#2113) (#2120) (e0f9696)
  • nav: each sidebar group ends in a row that opens its hub (#1841) (#2078) (11667cb)
  • nav: the panel is seven rows, and the catalogue leaves it (#2106) (#2115) (9551f4d)
  • onboarding: concern-at-intake is recorded immutably (#1612) (#1647) (4edaafe)
  • onboarding: one welcome panel; drop selected_concerns and widgets_seeded (#1958) (#2001) (eceef15)
  • onboarding: the first-run panel carries the routing and mixing guidance (#2111) (#2116) (c85cd48)
  • onboarding: the home tour is retired, and the settings button that re-armed it goes too (#2109) (#2118) (8981f1f)
  • policies: /faq becomes its own screen, with four collapsible groups (#2147) (#2160) (b5c7f9d)
  • policies: FAQ_LAYOUT names every entry's place, guarded by a partition (#2145) (#2152) (261a5d3)
  • policies: the published text moves to the per-country teen floor (#1767) (#1866) (efd7909)
  • positioning: every in-repo surface carries the "mental health tools" frame, in both locales (#2009) (#2021) (68ea0b5)
  • progress: record_days answers which days hold a record (#1904) (#1920) (b48d094)
  • progress: the recovery-plan door on Looking back (#1905) (#1918) (eaac937)
  • progress: the screen is Looking back, and the mood trend leaves (#1903) (#1913) (3416006)
  • progress: Your days, one mark per day with a record (#1906) (#1924) (3b92f62)
  • release: the release-thread cleaner makes every picked line postable as pasted (#1949) (#1964) (c43a007)
  • release: the release-thread drafter files one reddit-draft issue per published release (#1951) (#1976) (3736edd)
  • release: the release-thread picker turns a changelog into picks and spares (#1948) (#1961) (4ea2d52)
  • release: the release-thread renderer lays out the thread, the submit link and the drafter issue (#1950) (#1967) (2af1509)
  • routines: the starter routine composes from records, not from widget_preferences (#1954) (#1972) (45a002f)
  • routines: the starter-routine offer fires at the second action (#1677) (#1685) (979d295)
  • seed: give demo and bob their decided Home widget layouts (#1561) (2e86a7b)
  • seed: seed demo's routines surface — cadences, one reminder, consent (#1562) (b070793)
  • settings: 14a's type scale, column rhythm and phone step-down (#1830) (#1897) (bce3f13)
  • settings: a row that leaves the app, a run with no card, and a chip that is one of a set (#1725) (#1729) (6848c8c)
  • settings: the Appearance group gets an eyebrow, through a shared SettingsGroupLabel (#1828) (#1864) (f72afe6)
  • settings: the guest identity row says something, from the header's shared expressions (#1829) (#1868) (76f5fd4)
  • settings: the Light/Dark/System control, as one segmented component shared with the menu (#1827) (#1843) (91dee23)
  • settings: the two row descriptions 14a asks for, and the four it does not (#1831) (#1909) (696fcb8)
  • support: seven cards become one column - callout, rows, lists, project, policies, delete (#1726) (#1731) (07ff8ac)
  • support: the feedback form gets a category for "this helped" (#1614) (#1646) (8d2f71e)
  • support: the form - radio chips, a counter, a reply-to line, and a Send that returns (#1727) (#1732) (b163aae)
  • support: the subreddit joins the ways out of the support page (#2121) (11d1c63)
  • support: the YouTube channel joins the footer, and the project run rather than the inbox (#2132) (91040dc)
  • ui: all seven policy routes take the 672px column (#2148) (#2157) (ce5b0c4)
  • ui: Section's eyebrow takes a heading level, defaulting to 3 (#2142) (#2155) (42584b2)
  • user-menu: the palette collapses to one row and opens as a pane (#1774) (#1792) (7b8324f)

Bug Fixes

  • a11y: /security stops skipping a heading level (#2133) (#2141) (f04f292)
  • a11y: CBT route-screen links activate on Enter on web - self-care's sleep and gratitude doors, new goal's values link (#1736) (#1740) (9706daf)
  • a11y: shared link components activate on Enter on web - Show all, shared tools, breadcrumb, donate, colophon (#1734) (#1738) (96af133)
  • a11y: the guest heading outline is flat, and a guest is warned before typing (#1801, #1865) (#2037) (eda2a91)
  • a11y: tool-screen links activate on Enter on web - habits, meditation, journal, mood (#1735) (#1739) (272493f)
  • act: the archives page each finished status, say when a later page fails, and paint details from the cache the lists fill (#2247) (23e6111)
  • act: the spec describes the programme that shipped, and the graduation states the record and stops (#2011, #2013) (#2038) (a35ce00)
  • act: two ACT list hooks shared one cache entry across limits (#1540) (4caf47d)
  • analytics: the module table reports usage, and never reads enabled_modules (#1672) (#1687) (41577a3)
  • audio: English-only again, and the two voices were transposed (#1580) (#1585) (f4335ee)
  • audio: the seam gate measures the master, and its head/tail half becomes a report (#1571) (#1596) (5b850e0)
  • audio: the shipped bytes get a ceiling, and .m4a joins the binary list (#1607) (#1608) (#1642) (a7dace5)
  • audio: voice-check must ask the Library, not just the account (#1579) (#1583) (f1605a5)
  • auth: a paused preferences read is an unknown verdict, and its timeout is reportable (#2271) (6921256)
  • auth: an unknown age verdict fails closed, with a retry (#2200) (#2224) (b4e2bf2)
  • auth: Denmark's floor follows the Danish statute, at 15 (#1921) (#1937) (8211d6d)
  • auth: one predicate decides what a guest is, and three surfaces stop lying in the stale-flag window (#1896) (#2047) (d6d661c)
  • auth: the age gate reaches 0.17.0-first accounts, and never strands crisis (#2227, #2229, #2228) (#2235) (29cc8c2)
  • auth: the age gate stops trusting a failure count TanStack resets (#2274) (353c817)
  • auth: the guest content notice joins the shared predicate, and the flag stops being passable (#1896) (#2049) (047d0b6)
  • auth: the under-floor block erases only the account it judged, and only on confirmation (#2195, #2193) (#2223) (3363954)
  • auth: the under-floor exit stops promising work it no longer does (#2232) (#2234) (19f0159)
  • bughunt: seven defects in the fixes landed today (#2272) (6ea4e25)
  • cbt: completion copy ends done, and the practice boundary is written and guarded (#1664) (#1666) (#1667) (#1673) (15e05c5)
  • cbt: the conditions table is softened for a 13+ readership (#1867) (#2042) (7299bcd)
  • cbt: the recovery-plan hint stops naming the punishment it withholds (#1342) (#1587) (2ee7fe0)
  • cbt: the weekly review's reflection prompt stops rotating by the week-start date (#1689) (#1690) (43cb808)
  • consent: a recorded policy version never moves backwards (#2217) (#2226) (f4376b7)
  • copy: safety, legal-boundary and policy copy name the current category noun (#1957, #1772) (#2036) (102fdad)
  • coverage: restore the ratchet floor #2114 lowered on a false rationale (#2140) (04d2501)
  • dbt: the coping plan refuses an empty list before the database does, names every candidate chip, and keeps a draft through a failed or paused refetch (#2245) (badad75)
  • dbt: the coping-plan builder waits for the stored plan before it seeds (#2204) (#2222) (4d0a9a7)
  • dbt: the coping-plan editor says so when there is no network to read over (#2231) (#2233) (23f8763)
  • dbt: the record screens save what they show, skip what they say they skip, and climb the whole ladder (#2248) (41ffc43)
  • docs: the banned compound leaves contributor prose, and the guard follows it there (#1644) (#1653) (b5bcbc3)
  • doors: a hand-off never overwrites an open draft, and never becomes one (#2269) (fbaa358)
  • errors: a paused read is neither an empty history nor an offline one (#2276) (1a59261)
  • errors: an online focus-pause keeps its Retry, and the invariant says so (#2277) (4b3cfdc)
  • handoff: a cross-module hand-off lives for one navigation, and four surfaces stop blanking held rows (#2275) (08ae13c)
  • header: the account actions move above the preference sections (#1862) (#2035) (7528fa9)
  • home: the arrange row's longest Bulgarian name gets a second line (#1592) (#1593) (cf758cc)
  • home: the longest Bulgarian tool name gets a second line (#1590) (#1591) (811ca4e)
  • home: the module mark gets a column wide enough for it, and the wrap gets a test that can see it (#2059) (#2069) (5681d72)
  • i18n: bg addressed the reader formally in eight strings (#2163) (#2166) (6dca608)
  • i18n: the house style stops being about one word (#1639) (#1652) (29a8ba9)
  • i18n: the market category word stops being spelled two ways (#1651) (#1654) (d3d91c6)
  • meditation: stage-1 mastery describes the default, not the perfection (#1670) (#1681) (f2dccb6)
  • meditation: the Reflect card stops advertising that it does not grade you (#1588) (#1595) (988fbdc)
  • notifications: the longest Bulgarian reminder name gets a second line (#1248) (#1589) (1d76301)
  • onboarding: panel 3 calls the tools what panel 1 just called them (#1775) (#1796) (f2ecfa0)
  • onboarding: the concern-at-intake guard stops missing grandfathered accounts (#1648) (#1650) (7c9d66b)
  • onboarding: the copy stops describing things that do not happen (#1632) (#1633) (#1634) (#1643) (358577a)
  • paging: a failed page says so once, and a painted detail stays painted (#2265) (5befa52), closes #2253 #2255 #2256 #2257
  • paging: the thirteen paged screens that latch a failed page get a Retry (#2270) (8da33f4)
  • policies: the FAQ's contact addresses come from env, not from the copy (#2150) (aeab011)
  • policies: the last 15 contact addresses leave the consent-bearing copy (#2131) (#2165) (2d4056a)
  • positioning: the frame word is spelled one way, and the invariant joins the gate (#1627) (#1637) (7993ea2)
  • positioning: the hero stops listing the product flat, and the tools become an on-ramp (#1628) (#1636) (0dba8cf)
  • positioning: the plain noun follows the adjective, and the guard grows a third ring (#1638) (#1640) (462dfe6)
  • positioning: the practitioner claim leaves the copy, and the guard grows a rule (#1616) (#1635) (3210cbf)
  • positioning: three surfaces state the frame, and one stops arguing against itself (#1617) (#1623) (#1629) (#1645) (3046bf8)
  • progress: the reflection prompt stops rotating by the weekday (#1665) (#1682) (e184952)
  • reminders: breathing and ACT reminders vanish once the practice happened today (#1668) (#1683) (d9f279f)
  • reminders: stop offering a reminder the cron holds out, and forward the key the web build never had (#2267) (5c72eab), closes #2260 #2263 #2221
  • routines: the starter offer's second action counts every prompting tool (#1677) (#1691) (ce46ded)
  • routines: the strip note states the record, and restraint-copy guards negated undoing (#1669) (#1686) (31b9a90)
  • routines: withhold DBT step ids from writing until the native rollout lands (#2203) (#2225) (7c722f7)
  • scripts,docs: the spelling tripwire catches defense, and the age gate gets its evidence figure (#1970, #1978, #1979) (#2039) (b1e82c9)
  • seed: the ACT band guard survives a run at the UTC day boundary (#1971) (#2016) (8321d3e)
  • sentry: normalise thrown non-Errors before reporting them (#1553) (56caf2a)
  • settings: the four runs and the identity row lose their cards (#1804) (1e52781)
  • shell: a second Retry really restarts the read, and the exit copy stops crediting the device (#2266) (909301a), closes #2251 #2252 #2262
  • shell: the block screen keeps its Retry, the under-floor copy stops calling the account empty, and the profile panel loses its card (#2244) (786c9ce)
  • store: the age-rating info URL was never in App Store Connect, and the key is gone (#1803) (#2072) (a854452)
  • store: the feature graphic's phone mockups come from a current build (#2041) (#2060) (c87f061)
  • store: the live Play description spells catastrophising, and the mirror follows (#2061) (#2066) (f66c963)
  • store: the Play feature graphic takes the short form, and its source joins the copy gate (#2022) (#2043) (83a6465)
  • support: the message form is a ruled band, not the column's last card (#1780) (91e9b18)
  • test: the positioning corpus follows the index, and the governing doc gets a facts guard (#1908, #1944) (#2034) (94d4746)
  • web: /legal and /progress take the 672px content column of Settings (#1721) (#1746) (b58ed9a)

Performance Improvements

  • audio: the sit's bells and the guided intro load ahead of their moments (#1744) (#1753) (e9a1561)
  • home: one server aggregate behind the eight tool cards (#2268) (88cea43), closes #2212