Releases: bardesss/haelan
Release list
v2.0.4
v2.0.3
2.0.3 (2026-09-20)
Features
- a console tool for the password reset this app has never had (#131) (21cdf17)
- a recovery index, haelan's own version of a score no API will hand over (#296) (a9e0ab3)
- a source that has stopped reporting says so (#246) (517c2da)
- a source that stopped inside the range says so on the page (#250) (52c754b)
- an account's name, username, timezone and password can be changed after it is created (#136) (b6153bf)
- core,server,web: a person whose rebuild failed is finally told so (#285) (e91fe35)
- core: a browser safe metrics subpath, so pages stop copying the catalogue (#69) (24cf29d)
- core: M1a store, schema, credentials and raw archive (#12) (5995f8e)
- core: M1b API client, catalogue and field mapping (#14) (d9f1088)
- core: M1c sync engine, day aligned windows and per row sources (#19) (885551a)
- core: M2a metric catalogue, daily rollups and the derive queue (#38) (21e4801)
- core: M2b source priority, merged daily rows and overrides at derivation (#45) (9c5c4fb)
- core: M2c sleep derivation, night assembly and nap detection (#50) (182a726)
- core: M2d baselines, insight suppression and the person bound query layer (#51) (9be53d1)
- core: M2e rebuild from tier 1 with re-resolved source identity (#55) (d746833)
- core: one unreplayable page costs that page, not the whole archive (#288) (7dfd3ad)
- core: the detail page spine, and the archive re-mapped onto it (#141) (3eb7ff7)
- core: the query layer M4a's agent surfaces read through (#138) (73de283)
- demo: a browsable demo, recorded from the real app and served as static files (#215) (7c62858)
- haelan installs into a Proxmox LXC without Docker (#229) (d957716)
- Haelan's own cardio load, and the per-split heart rate the watch never wrote (#191) (dd4a15a)
- how many backups to keep, and how often, become settings rather than variables (#205) (b2cd24b), closes #150
- M1d wizard, accounts and the setup flow (#21) (9254125)
- probe: M0 auth probe, answers scope, field paths and volume (#11) (3f17ebc)
- say which of your sources wins a contested day (#279) (7ec89bb)
- server: M3b-2 HTTP surface, ten person bound reads behind one guard (#67) (15c8a8b)
- server: thirteen tools and an MCP server on stdio (#144) (0faee79)
- site: a landing page, published to GitHub Pages on every release (#212) (b716193)
- sql_query, over a projection nothing else is in (#164) (79e8b2d)
- tell an admin when a newer release is out, if they ask for it (#269) (d30ddff)
- the agent surface over HTTP, behind a token that belongs to one person (#159) (df7a3e2)
- the all-time page, and what only the archive can answer (#253) (6da32e3)
- the landing page's screenshots open full size, and cannot drift from the README (#239) (4e5e65b)
- the maintenance card can download the latest backup (#243) (bc990ad)
- the members card says who the admin is, and how each member is doing (#271) (f59d2fa)
- the records a session holds, and the device that set a record (#256) (a4d6515)
- tokens: chart tokens with enforced colour blindness and contrast checks (1f6f468)
- tokens: colour conversion, cvd simulation and contrast (7bcc2bb)
- tokens: emit css custom properties for both themes (36c031c)
- tokens: primitive and semantic layers for both themes (800cfc5)
- tokens: raise the type scale floor to 12px (b0426ac)
- web: a card with nothing to show renders nothing at all (#293) (cea5f18)
- web: a day tile says how that day sat against your own usual (#262) (3072a58)
- web: a readable sessions list, a fitted sleep axis, and a rail that follows the pages you keep (#265) (97b4d53)
- web: a weekly cardio load target and an acute to chronic workload ratio (#203) (4f9b5a9)
- web: app shell built from semantic tokens only (268aa9c)
- web: dashboard and sleep reference pages with styling spec ([3e2dd33](3e2dd337201ac...
v2.0.1
v2.0.0
v1.40.2
Android 0.3.0
Hælan 0.3.0 for Android. See apps/android/CHANGELOG.md for what changed.
Android 0.2.3
A data type that fails now says why on its own row. 0.2.2 shipped this half done: the row turned red and kept saying never synced, because the status line had two writers and the one that ran last knew nothing about the failure.
Android 0.2.2
A data type that fails now says why on its own row, instead of only drawing a red dot and writing the reason to a log nobody can read from a phone.
Android 0.2.1
The app no longer draws its first line under the status bar, and the main screen carries the Haelan mark and wordmark like the web app does. Android 15 draws every app edge to edge whether it asked to or not, and these layouts predated that.
Android 0.2.0
Two data fixes, both silent before this release.
A sync cursor was kept per data type, but Health Connect has many writers into one type. A watch that synced in more than a day late, after the phone had already moved that type's cursor, was never read again. Cursors are now kept per source.
A sleep or exercise session that a wearable revised in place arrived as a second session rather than replacing the first, which double counted a night's stages. Sessions now carry Health Connect's own record id.
Both are worth updating for even if nothing looked wrong: neither failure showed anything on the instance.
This app exists because of @Lory99, who wrote it and contributed it in #272: the Health Connect reads across nineteen data types, the sleep stage mapping, the chunked uploads and cursors, the sync worker, the permission flow, and Dutch alongside English. Thank you. It is a large thing to build for somebody else's project.