Yuvomi
Self-hosted family planner for tasks, calendar, shopping, meals, and budget
Alternative to: cozi, familywall, skylight

v2.60.0
2026-09-01Added
-
The status is available when creating a task, not just when editing one (#807). @thesoundhead pointed out that the new-task dialog offers no status, although what people write down is often something they have already started. The field was not forgotten - it sat behind the edit branch.
The second half of the problem was on the server, and it was the more unpleasant one.
POST /taskshas validated a supplied status against the allowed values since forever, and never wrote it. A value that is checked and then silently discarded is the worse half of both: opening up the form alone would have changed nothing, and nothing anywhere would have said so.Creating with a status is a status change - it merely starts from
openinstead of from a stored value. It therefore runs through the same transition handling as editing and ticking off: reward ledger, completion history, and the follow-up instance of a recurring series. Filling only the column would have given the point ledger and the history two sets of books, where the same finished task counted differently depending on whether it was created done or ticked off done. Sendingarchivedon creation falls back to the first status rather than filing the task away: the archive has been its own axis since #688, and creating a task in order to put it away in the same breath is not creating a task. -
The wall mode can be started where it ends (#915). It could only be switched on under Settings, Personal, Appearance - but it was left on the overview. You walked out where you could not walk in. The entry point now sits in the overview toolbar as an icon button, the literal counterpart to the exit on the wall surface. The settings route stays: it is the long way with an explanation beside it, this is the short one at the place where it takes effect.
There is deliberately no switch governing whether that button appears. It would sit in the same settings the mode itself already lives in - two switches for one thing, and you would have to find the second one to be rid of the first. There is no device-shape rule either: a wrongly hidden entry point is unfindable again and would only move the problem. The exit toast, which used to point into the settings because that was the only way back, now names the button instead.
-
A kitchen timer on the wall (#844). @Gensokian asked for a timer plus a cross-device notification and then scaled the wish back himself: “honestly just the timer on the wall”. That notification is precisely what would have forced a server-side timer, because a phone suspends the page as soon as the screen locks. What remains runs in the browser of the device that hangs on the wall anyway and does not go to sleep: no endpoint, no table, no migration. Five presets, no number field - from two metres a keypad is not operable - and a chime built from three synthesised tones rather than an audio file that would have to be vendored, served and cached.
The screensaver had to come along. It covers the surface after five idle minutes, and a countdown that expires behind a photo is not a timer. It now reads the same attribute the timer sets, one source and two readers; the attribute drops the moment the timer rings, so an unacknowledged timer cannot disable the screensaver for good.
The mode was built as a display-only surface, and that promise turns out to be narrower than its name: the exit has been there since day one, so it was never button-free - it leads nowhere and changes nothing in the household. The timer does not break that, it marks its edge.
wall-mode.jstherefore gained an admission rule rather than a named exception - a control may go on the wall when it does not navigate, changes nothing server-side, stays on this device, and is operable from two metres - because an expiry date on something meant to stay would be a lie in a comment.
Fixed
-
A monthly series on the 29th to 31st no longer skips a month. Found while looking into a request for “last day of the month”, and it is not the bug the request suggested. The clamp that was supposed to move a 31 March onto 30 April never took effect:
setUTCMonth()had already rolled over on a date still carrying the 31st - a 31 February silently becomes 3 March in JavaScript - and the last-day correction was then computed for the month the overflow had landed in.So the short month did not fall back to its last day. It fell out entirely. A monthly task on the 31st arrived in seven months out of twelve; on the 30th and the 29th, February was missing. With an interval of two months the rhythm broke on top of that, because the skipped month shifted it: from 31 July it went three months on instead of two. It affected tasks and calendar events alike, since both walk the same function occurrence by occurrence.
Existing series need no migration and compute correctly from their next occurrence onwards. This does move dates in existing installations, in the direction the user meant. What it does not fix, and what now says so in the code: because the next occurrence is computed from the clamped date, a series begun on 31 January stays on the 28th from February onwards, and a yearly series on 29 February never returns to the 29th (#978). For that the rule itself would have to carry the intended day.
-
Scrolling the task board on a phone no longer drags cards along (#808). @thesoundhead suggested distinguishing a long press from a short one - which is exactly what the app’s shared drag wrapper has done all along for the shopping list and the category manager. The board did not use it: it carried two drag implementations of its own, native drag-and-drop for the mouse and a hand-written touch simulation beside it. The touch half did have a threshold, just the wrong kind: eight pixels of distance and no time at all. Anyone scrolling had those eight pixels within a blink, and the gesture then lost its scrolling. Both are gone; holding picks a card up, swiping stays scrolling, and the mouse still drags immediately.
The advance-status button on each card is excluded from dragging - it was excluded in the old touch handler too, and that single line was the easiest thing to lose in the switch. Of everything on a card it can least afford to become a drag surface, because it is also the board’s keyboard path.