Skip to content

Releases

Medora 0.6.0 (25)

Choose a tag to compare

@github-actions github-actions released this 25 Sep 06:08

What's new in 0.6.0+25

No user-facing changes: 2 maintenance commit(s) (chore, test).

See the commit log for the full list of changes.

Medora 0.5.0 (23)

Choose a tag to compare

@github-actions github-actions released this 22 Sep 09:57

What's new in 0.5.0+23

Features

  • a year of sick leave, counted and drawn

Fixes

  • registering says what happened

Medora 0.4.3 (22)

Choose a tag to compare

@github-actions github-actions released this 22 Sep 07:56

What's new in 0.4.3+22

Fixes

  • a maintenance release says what it held

Medora 0.4.2 (21)

Choose a tag to compare

@github-actions github-actions released this 22 Sep 07:39

What's new in 0.4.2+21

Fixes

  • the first migration applies to a real project

Medora 0.4.1 (20)

Choose a tag to compare

@github-actions github-actions released this 22 Sep 06:11

What's new in 0.4.1+20

See the commit log for the full list of changes.

Medora 0.4.0 (19)

Choose a tag to compare

@github-actions github-actions released this 22 Sep 04:21

What's new in 0.4.0+19

Features

  • "delete all data" reaches every device
  • stock changes go out once each through the server ledger
  • run the sync cycle on the v2 server contract
  • every repository stamps its writes with the injected clock
  • the merge resolves each column with its own edit time
  • local writes record an edit time per column
  • sync v2 keeps an edit time per column
  • the sync v2 merge engine (row merge, settle, per-row pull and push)
  • three-way row merge for sync v2
  • local schema v16 with sync bookkeeping and edit times on every write
  • client and fake for the sync v2 server contract
  • sync v2 migration with a server change cursor, row versions and a stock ledger
  • a settings gear on the four main tabs

Fixes

  • a force sync that could not run says so
  • the same value set again later is the latest edit
  • an undo made before a slot is dropped still beats the take
  • a dose dropped while its batch waits is never sent
  • a child written while its parent is deleted ends deleted
  • a quantity left as it was in the form is not a count
  • an edit back to the old value is the latest edit
  • rows under a deleted parent never block a device, and a regenerated slot stays
  • the server never holds a live row under a deleted parent
  • a legacy write ignores a sent map in one place, and the checks send per-column times
  • a 0.3.0 row merged in does not keep the device's edit time
  • a deleted prescription refuses edits
  • signing back in keeps the stock changes still waiting
  • stock changes replay in the order they were made
  • edit times are stored in UTC from the datasource clock
  • bottom-bar labels shrink to 0.85x rather than break a word
  • an Expiring Soon chip replaces "Low Stock · Expiring Soon"
  • a failed End logs the error type, not its text
  • the low-stock links open Medications filtered to low stock
  • pulls end only on an empty page; client and fake follow the stock rules
  • sync v2 takes TRUNCATE away and never refuses a stock change for good
  • "ongoing" mid-line on Add/Edit Treatment is lower case
  • section headings wrap instead of being cut
  • bottom-bar labels stay whole instead of breaking mid-word
  • only an as-needed prescription is offered a week
  • search on Medications and Treatments keeps the whole app bar
  • the sync status is an icon, so the gear and title stay on screen
  • the settings gear works again after go() closed Settings
  • Low Stock and Active Treatments say how many rows they hide
  • a failed End says so
  • "ongoing" in the middle of the shared text is lower case
  • switching back from as-needed offers a week, not 0 days

Medora 0.3.0 (18)

Choose a tag to compare

@github-actions github-actions released this 16 Sep 19:43

Before you update (cloud sync only): apply supabase/migrations/20260917000000_treatment_sick_leave.sql to your Supabase project (and supabase/migrations/20260916000000_medication_ean.sql if you have not yet). Without it, treatments stop syncing and the app shows an error naming the missing file. Local-only installs are unaffected.

Update every device you sync before you add an "as needed" medicine. Older versions read it as "every 8 hours" and create doses and reminders for it, and they can still overwrite doses taken on an updated device.

The first sync after this update downloads all your data once more to recover entries older versions skipped. It can take a little longer on a slow connection; unsynced changes are kept.

New: record an illness and your sick leave. A treatment can hold a sick-leave period (Krankenstand / malattia), the certificate number and the doctor. The list and the dashboard show a badge while the leave runs. Ending a treatment can also end the sick leave (unticked by default, shows the date). "Share record" sends one illness as plain text with its sick leave and what you took; the CSV export has the new columns.

New: "as needed" medicines (Bei Bedarf / Al bisogno). Log each dose with "Log dose". No reminders, nothing is marked missed, and the treatment shows how many you took and when.

Sync is more reliable: a dose taken on one device stays taken on the others; every device gets the doses of a prescription made elsewhere; large accounts sync past 1000 rows; stuck requests time out.

Known limitation: if you change the same illness on two devices while one is offline (for example end it on one and add the certificate number on the other), the change saved later wins as a whole. Edit one illness on one device at a time.

What's new in 0.3.0+18

Features

  • show what was taken and share one episode as text
  • read every dose of one treatment
  • an as-needed schedule with a "Log dose" button
  • ending a treatment offers to close its sick leave
  • End can also close the open sick leave
  • record and show the sick leave of an illness episode
  • migration 15 adds the sick-leave columns to treatments
  • sick-leave fields and inclusive day count on the entity

Fixes

  • as-needed counts name the dose; Italian leave heading
  • an ended treatment's medicines get no new doses
  • a treatment push to an unmigrated project names the migration
  • pull every table once more after upgrading, past old cursors
  • pull every table in pages, oldest first, past the 1000-row cap
  • a dose never takes more stock than it uses (m-7)
  • a disposed sync service starts nothing more (m-2)
  • generated doses are pulled once, not on every cycle (m-4)
  • a row created offline is seen by devices that synced since (I-C)
  • an overdue dose with an unpushed change is not marked missed (I-B)
  • a dose row the server refuses no longer holds back its batch (I-A)
  • the shared record names the patient and reads right
  • a prescription made or changed elsewhere gets its doses here (C-A)
  • a prescription's dose reads "1 Tablette", not "1 tablets"
  • write a cell a spreadsheet would run as a formula as text
  • every device derives the same doses from one prescription
  • "Log dose" records one dose per tap (task 6 I5)
  • a schedule that replaces "as needed" starts now (task 6 I4)
  • save an as-needed prescription with no duration (task 6 I3)
  • a local edit never brings a deleted medication back (task 6 I2)
  • a second undo gives no stock back (task 6 I1)
  • "x of y taken" counts scheduled doses only
  • a dose takes units of stock, not milligrams
  • a sync stopped at the re-run cap retries once later
  • a request that hangs fails like a network error (I-2)
  • a dose taken on one device stays taken on every device (C-1)
  • "Log dose" sits below the tile, on one line
  • undoing an as-needed dose deletes it
  • a pending dose of an as-needed prescription is never due
  • a stock change keeps the pack's EAN
  • the end-sick-leave box starts unticked and names its date
  • stamp (de)activating and (un)archiving after the row's stamp
  • an upsert answered without its row fails the push
  • run a sync asked for during a force push or pull
  • cap a cycle's automatic re-runs
  • label the date clear button; Italian doctor hint says Dott.
  • no sick-leave badge for a leave that has not started
  • sick-leave errors name the sick-leave fields
  • show the sick-leave card for any stored field
  • mark a pushed row synced only if nobody edited it meanwhile
  • date picker opens inside its own bounds
  • ending a deleted treatment no longer undoes the delete
  • background push follows the sync cycle's write rules
  • sick-leave day count is null, never 0 or negative
  • stop endTreatment dropping fields it does not name

Medora 0.2.5 (17)

Choose a tag to compare

@github-actions github-actions released this 16 Sep 09:35

What's new in 0.2.5+17

Features

  • let the expiry card reach the rows it cannot show

Fixes

  • send the expiry count to the list it counts
  • cap the dose status column so the name keeps its row
  • cap the expiry badge so the name keeps its row
  • show a failed card's error in 300 ms, not thirteen seconds
  • stop the Now card and the Low Stock row overflowing
  • keep the stat tile label whole at every text scale
  • name the expiry section for both of its states
  • give the expiry sort a deterministic tiebreak
  • make the expiry badge plural-aware at its new boundaries
  • read the expiry window from one constant
  • stop the stat tile labels clipping
  • show expired medications as expired
  • keep expired medications in the expiry list

Medora 0.2.4 (16)

Choose a tag to compare

@github-actions github-actions released this 16 Sep 03:51

Cloud sync users: apply supabase/migrations/20260916000000_medication_ean.sql to your Supabase project before or with this update. Every medication now sends the pack's EAN, so a project without that column rejects medication changes (the app then shows an error naming this file). Local-only installs are unaffected.

Stock and expiry reminders are new and on by default. Settings → Notifications → "Stock and expiry reminders" turns them off.

What's new in 0.2.4+16

Features

  • notify about low stock and medications expiring soon
  • plan which stock and expiry alerts should exist
  • carry the pack's EAN from the scan to the medication
  • remember the pack's EAN next to its code
  • search the supplement register by product name
  • add a supplement register search sheet
  • publish a grouped changelog instead of generated notes
  • show the release body as readable, collapsible text
  • make the area rescan reachable without a drag
  • warn on the review that the register is stale
  • monthly refresh script and systemd user units for the register
  • warn when a register is 45 days old or older
  • the 45-day freshness rule as a pure function
  • rescan a selected area of the review photo
  • sweep orphaned crop folders at startup
  • decode the bars above the digits, in four rotations
  • show the register's code for a misread supplement chip

Fixes

  • evict every width the review photo was decoded at
  • consult the cabinet for every scanned code, not just an EAN
  • actually ask iOS for notification permission
  • re-plan the stock alerts after a cloud pull
  • make a failed release run recoverable
  • keep parens and unpaired markers in the changelog
  • refuse to publish the register from a non-default checkout
  • key the stock snapshot on what the alert says
  • order the barcode-or-EAN lookup deterministically
  • always push the medication EAN and name the missing migration
  • make Enable notifications a real master switch
  • stop the dose scheduler cancelling the stock alerts
  • let the unit dropdown ellipsize instead of overflowing
  • report a shutter that wrote nothing, and settle on a condition
  • keep the torch indicator truthful when pausing the preview
  • release a camera the scanner walked away from
  • gate the whole Notifications group and honour a refusal
  • re-plan stock alerts whenever the cabinet changes
  • remember, serialise and permit the stock alerts
  • give dose and stock notifications one shared budget
  • say the right day count and stop booking years ahead
  • keep the remembered EAN through a rescan or a retype
  • send the pack EAN only when the medication has one
  • tell a failed register search from an empty one
  • render the release body once, without backtracking
  • never let "Scan selection" do nothing at all
  • never sweep a live scan's crop folder
  • drop inert network ordering, widen the refresh schedule
  • harden the unattended supplement refresh script
  • keep pinch-zoom alive while selecting an area
  • keep register resolution's provider reads inside its try
  • keep a re-read token that only sits inside a bigger box
  • keep a labelled code printed after a quantity or an EAN
  • prefix letters, label-adjacent codes and re-read junk

Medora 0.2.3 (15)

Choose a tag to compare

@github-actions github-actions released this 15 Sep 22:48

Full Changelog: v0.2.2+14...v0.2.3+15