Skip to content

Releases: Purgator/Momen2m

Momen2m 1.36.1

Choose a tag to compare

@Purgator Purgator released this 23 Oct 17:21

Fix: garbled "what changed" note, and a guard so it cannot ship again

The note shown after the update to 1.36.0 displayed garbled characters: its two lines in
js/changelog.js had been double-encoded (UTF-8 read as cp1252 and re-encoded), the same
bug as 1.34.0. The lines are rewritten; the 1.36.1 note says so in one line.

Guards (developer side, no user-visible change):

  • new tools/checktext.js scans every text file of the project for invalid UTF-8, a BOM, or
    the double-encoding pattern (an accent as two odd letters, an emoji as four);
  • npm test runs that scan as a test;
  • node tools/bump.js refuses to bump while any text is garbled, and also refuses when
    js/changelog.js has no entry for the new version in both en and fr;
  • the repo's working notes say to write files and commit messages from UTF-8 files, never
    through the shell.

Momen2m 1.36.0

Choose a tag to compare

@Purgator Purgator released this 23 Oct 17:21

Every tip is tappable

1.35.0 made the timing advice actionable; this release does the same for every tip in
Progress → Tips. Each row now carries a short label saying what a tap does:

Tip Tap
Timing advice (earlier / later) the schedule sheet from 1.35.0: move the window, or adjust it in the editor
Notifications are off asks for the permission (same as the Setup button)
Unsaved changes to your moments runs the backup (same as Setup → Export)
Your hardest moment opens that moment's editor
Many snoozes this month goes to the Moments tab
Moments left today / streak to keep goes to the Now tab
Close to the next level opens the level explanation

A tip with nothing automatic behind it (finish early, start a new streak, the generic one)
now says so when tapped — "Nothing automatic here" — and offers two links: Ask for a change
(GitHub issues) and Discuss (GitHub Discussions). The app has no hidden dead ends: every
tip either does something or tells you where to ask.

Both languages (EN/FR). No change to stored data.

Momen2m 1.35.0

Choose a tag to compare

@Purgator Purgator released this 23 Oct 17:21

A timing advice you can act on

The Progress tab already tells you when a moment keeps getting done outside its window
("the last 9 times you did it around 08:25, before its window opens at 09:00. Start it at 08:15?").
Until now, acting on it meant going to Moments, finding the moment, and typing the new time.

New: the advice is tappable. A "Change its time" link sits under it; a tap opens a sheet
showing the window as it is and as proposed (same length, shifted start), with two buttons:

  • Move it — applies the proposed window right away, with a "Window moved" toast;
  • Adjust… — opens the usual moment editor, prefilled with the proposed start and length,
    for a finer change before saving.

Both go through the same save path as the editor (name-conflict check, habits version bump, backup
reminder, push sync). Once the window is moved the advice disappears, since the completions now fall
inside it.

Both languages (EN/FR); times follow the device clock format like everywhere else in the app.
No change to stored data.

Momen2m 1.34.1

Choose a tag to compare

@Purgator Purgator released this 23 Oct 17:21

Fix: garbled "what changed" note

The in-app note shown right after the update to 1.34.0 displayed garbled characters
(its emoji and arrow had been double-encoded in js/changelog.js). The entry is
rewritten; the note for 1.34.1 itself says so in one line.

No functional change. Installed apps update to this version and show a clean note
for both 1.34.0 and 1.34.1.

Momen2m 1.34.0

Choose a tag to compare

@Purgator Purgator released this 23 Oct 17:21

Share the welcome page from the app

1.33.0 added bienvenue.html, a French welcome page for someone who has never heard of
Momen2m. This release puts it one tap away from inside the app.

New button in Progress → Share: "Partager la page de bienvenue" (shown when the app
language is French). It opens the system share sheet with a short ready-made message and the
page's address:

Bonjour ! Voici Momen2m, une petite application gratuite qui aide à garder le fil des choses
simples de la journée, en douceur. Tout est expliqué sur cette page :
https://purgator.github.io/Momen2m/bienvenue.html

Where the share sheet is not available, the text is copied to the clipboard instead, with a
toast saying which happened.

No change to stored data.

Momen2m 1.33.0

Choose a tag to compare

@Purgator Purgator released this 22 Oct 18:12

A welcome page to share

New: bienvenue.html — a standalone, plain-language welcome page in French, at
https://purgator.github.io/Momen2m/bienvenue.html. It is meant to be handed to someone who has
never heard of Momen2m (by a relative, a caregiver, a doctor…):

  • a warm, no-pressure introduction (what the app does, what happens when you forget: nothing bad);
  • what to expect: ready-made moments, reminders with adjustable sound and vibration, points and
    badges, everything stays on the phone, free, no account, no ads;
  • a big Ouvrir Momen2m button, the address written out, and a QR code (generated with the app's
    own encoder, js/qr.js);
  • install steps for iPhone (Safari → Share → Add to Home Screen) and Android (Chrome → Install),
    plus the advice to say yes to notifications;
  • three tips for a gentle start (two or three moments at first, Reporter / Passer, ask a relative for help);
  • a Partager cette page button (system share sheet, clipboard fallback).

Large type, light and dark mode, prints cleanly (buttons hidden, QR kept). Self-contained: no
dependency on the app's CSS or JS, so it loads even on a phone that has never opened Momen2m.

The page is deployed with the site (.github/workflows/pages.yml) and included in the
self-hosting zip (tools/package.js). The README links to it.

No change to the app itself; the version bump exists so installed apps mention the page in
their "what changed" note.

v1.32.0

Choose a tag to compare

@Purgator Purgator released this 22 Oct 18:12

What's new

  • Quest questions are asked as soon as the step is done. When every task of a step that ends with a question is completed, the question appears in Today right away, on the step's first day if need be — no more waiting for the step's last day to pass. The step still runs its planned days: what follows starts after them (the card says so, e.g. "what follows starts Fri 16 Oct"). A step without tasks (a rest step) still asks only once its days are over.
  • A late answer no longer backdates what follows. Previously the next step was always dated the day after the previous one ended, whatever day the question was answered — answer two days late and a 1-day step was already over, every task late, no step bonus. The answer day is now recorded (decidedOn) and the next step starts on the later of "the day after the step ends" and "the day of the answer". The card says "what follows starts the day you answer" once the step is over.
  • The daily quest reminder counts an unanswered question from the moment it is asked (in-app and relay push), not only once the step's days are over.
  • Answering "stop" (an option that leads to the end) with every task of the step done ends the quest on the spot, paid for its planned days — the same rule a final step without a question already had.

Behaviour changes

  • "Day x of n" on a running quest now counts the days actually walked: the days spent waiting on an answer are not quest days, so after a late answer the counter no longer overshoots.
  • A question already asked in Today is no longer repeated under "Coming up".
  • Runs saved before this version have no answer days recorded and keep their existing schedule.

Notes

  • Tests: new quest test covering the early question, the late answer, the rest step and the early stop. 43 + 4 relay tests pass.
  • The open decision "Late answers backdate the next step" in docs/REVIEW-2026-09-30.md is marked resolved.

v1.31.0

Choose a tag to compare

@Purgator Purgator released this 22 Oct 18:12

What's new

  • Share / Copy diagnostics (Setup → Notifications): one tap produces a plain-text report to send when a reminder goes missing. It covers: app version, install state, notification permission, app sound/notification switches, background-reminder state (device id, last sync, last error, queued count), service worker and push subscription state (push-service host only), the local plan (count + next time), what the relay reports for the device (health, subscribed, pending, last sync, next alarm), and the last 15 pushes the phone actually received (when, lag after due time, shown or not, and any show error). No moment names or personal content.
  • The service worker now keeps that rolling log of received pushes (IndexedDB, best-effort).

Notes

  • Shares through the system share sheet, falls back to clipboard; a separate Copy button is provided.
  • Tests: new diagnostics-report test. 42 + 4 relay tests pass.

v1.30.0

Choose a tag to compare

@Purgator Purgator released this 22 Oct 18:12

Maintenance release implementing the "Suggestions — rest of the app" section of docs/REVIEW-2026-09-30.md. Nothing changes in how the app behaves day to day; a few small things got better on the side.

Refactor (no behaviour change)

  • ui.js split by job (1 255 lines → 6 modules): dom.js ($, $$, esc, shake, pctText, signed), toast.js (toasts, sparkles, celebrate), sheet.js (the bottom sheet, its back-button history handling, and the new confirmDialog), widgets.js (row builders shared by renderers and sheets), sheets.js (the twelve non-quest sheets), ui.js (the renderers, tabbar, diffHtml). ui.js re-exports the rest, so import * as U from './ui.js' is still the one door for app.js.
  • app.js tap handling: the 55-case switch is now six per-area maps (SHELL, LIVE, QUEST, MOMENT, SETUP, OB actions) merged into ACTIONS; each handler gets (btn, now) and returns early.
  • Deduplicated: shake (×5 → dom.js), pctText (×2), fmtDate(new Date(day + 'T12:00')) (×3 → time.fmtDay(key)), new Date(day + 'T12:00').getDay() (×2 → time.weekday(key)).
  • Dead parameters and keys: fmtClock(ts, lang) and fmtDuration(ms, lang) never read lang — gone at the 19 call sites; update.js announce(worker) likewise; 23 unused i18n keys (appName, tagline, obQ_*, obPick*, toastMissed, minutesShort…) and the duplicated now removed from both languages.
  • Rough-patch detection (three misses in a row) moved from app.js into engine.missRun(now), so it is unit-tested.

Changed

  • Confirmations — deleting a moment, a premade or a quest, giving a quest up, replacing a premade of the same name — use the app's own dialog (confirmDialog, promise-based, floats above the open sheet) instead of the browser's confirm() pop-up. Cancel keeps you where you were.
  • Accessibility: every switch and select in Setup is named after its row (aria-label injected by toggleRow); rows and cards that react to a tap are focusable (tabindex=0 role=button) and Enter / Space activates them; the active tab carries aria-current="page"; the importance dot on a moment has a name, not just a colour.
  • Layout guards: tab labels ellipsise instead of pushing the bar around at large font scales; the clock and the four pills fit one row at 375 px in French.
  • Midnight: whichever tab is open re-renders when the day changes (previously only Now and Quests).

Fixed

  • A moment set inside the hour the clocks skip in spring (e.g. 02:30–03:30 on the switch day) collapsed to a zero-length window and was missed instantly. It now keeps its nominal length. Found by the new DST test.

Tests

41 unit + 4 relay. New: a DST switch day (both directions), settlePastDays after a 46-day gap (catches up on the 45-day window only, old records untouched), mergeWithDefaults on a v1 save (migrations, back-filled day start, every field defaulted), engine.missRun. Not added: the relay double-fire test — the double-fire itself is still an open decision in the review.

v1.29.0

Choose a tag to compare

@Purgator Purgator released this 22 Oct 18:12

Changed

Late quest tasks say since when. The Today list showed "late · ¼" with no clue why. It now reads "late since Thu 1 Oct · ¼": the last day of the step the task belongs to. With two runs of the same quest started on different days, this is what tells them apart.

Spring-clean example quest. Its steps were named Saturday and Sunday, but quest steps are dated from the day you start, not from the calendar — started on a Thursday, "Saturday" ran on Thursday and showed as late on Friday. The steps are now "Clear out" and "Finish up" (fr: Désencombrer / Finitions). Copies already seeded on a device keep their old titles; they can be renamed in the editor.

No change to the rules: a task is late once the day its step ends is over, and pays a quarter.