Repository navigation
Releases: Purgator/Momen2m
Release list
Momen2m 1.36.1
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.jsscans 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 testruns that scan as a test;node tools/bump.jsrefuses to bump while any text is garbled, and also refuses when
js/changelog.jshas no entry for the new version in bothenandfr;- the repo's working notes say to write files and commit messages from UTF-8 files, never
through the shell.
Momen2m 1.36.0
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
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
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
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
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
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.mdis marked resolved.
v1.31.0
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
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.jssplit 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 newconfirmDialog),widgets.js(row builders shared by renderers and sheets),sheets.js(the twelve non-quest sheets),ui.js(the renderers,tabbar,diffHtml).ui.jsre-exports the rest, soimport * as U from './ui.js'is still the one door forapp.js.app.jstap handling: the 55-caseswitchis now six per-area maps (SHELL,LIVE,QUEST,MOMENT,SETUP,OBactions) merged intoACTIONS; 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)andfmtDuration(ms, lang)never readlang— gone at the 19 call sites;update.js announce(worker)likewise; 23 unused i18n keys (appName,tagline,obQ_*,obPick*,toastMissed,minutesShort…) and the duplicatednowremoved from both languages. - Rough-patch detection (three misses in a row) moved from
app.jsintoengine.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'sconfirm()pop-up. Cancel keeps you where you were. - Accessibility: every switch and select in Setup is named after its row (
aria-labelinjected bytoggleRow); rows and cards that react to a tap are focusable (tabindex=0 role=button) and Enter / Space activates them; the active tab carriesaria-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
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.