Added
GET /api/v1/versionnow says what it is talking about. Two new public fields:productidentifies a
Yuvomi instance, andclient_apiis a whole number for the contract a native client relies on. A client can
recognise a server and tell whether it is new enough before anyone signs in. The exact version stays
behind sign-in. This release setsclient_apito 1: signed-in devices and pairing, upcoming reminders,
and the API operations a native client is built from.- Upcoming reminders for a native client.
GET /api/v1/reminders/upcominglists your reminders that
are not due yet within a window of up to 14 days, so an app can schedule them on the device. Each row says
exactly when it fires infires_at, in UTC, also for older reminders stored with an offset.typescan
narrow the list, for example to tasks and events, and it follows the same rules as the reminders you
already see: nothing private, nothing from a module that is switched off. A task that is done or archived
stays out of the list. - Signed-in devices, the groundwork for a native client. New routes under
/api/v1/auth/deviceslet a
household member exchange a sign-in for a device credential, list their own devices and sign one out. A
device acts as the person with less reach than a browser session: an administrator is an ordinary member
on it, and it can change neither password nor email nor second factor. It ends after 90 days without use
and with everything that ends a session, so "sign out other devices" now counts these too. An
administrator cannot see a member's devices, but can sign a member out of all of them with
POST /api/v1/auth/users/{id}/devices/sign-out. Nothing changes for browsers or existing API tokens. - The API spec now holds for the operations a native client is built from. 39 operations have an
operationId, a typed response and a typed body, checked bytest:openapi-client-contract. A second
suite,test:openapi-client-responses, holds real responses against these schemas. This corrected
the spec where it was wrong:POST /tasks,POST /shoppingandPOST /shopping/{listId}/itemsanswer
201,DELETE /calendar/{id}answers 204,POST /auth/loginhas a second answer shape for two-factor
sign-in, andCalendarEventnames its fields instead of allowing anything. Three nullable response
fields now carrynullin their type rather than in aoneOfbranch, which the Swift generator
dropped together with the field. The API itself did not change. - Pairing a device, for households without passwords.
POST /api/v1/auth/devices/paircreates a
short code from a browser session, andPOST /api/v1/auth/devices/pair/redeemexchanges it for a device
credential. The code holds for five minutes and once, and comes back as text, as ayuvomi://pairlink
and as a QR code. It cannot open a wall display, and a display code cannot sign in a device. - A document can name who it is about. The document dialog has a new "About" field for one
household member, and the Documents page can filter by person. The person also gets the expiry
reminder, along with whoever filed the document, and once if that is the same person. This never
changes who can see the document: if the person cannot open it, the dialog says so and they get
no reminder until they can. - Expiring documents appear in Key dates. A document about to expire now shows up on the
overview tile next to your events and tasks, with the person's name, and opens directly in the
viewer. Archived documents stay out, and the tile follows the Documents module switch and your
rights.
Changed
- A document's lead time now also decides when it shows as expiring. The "expiring" chip and
the Deadlines filter used a fixed 30 days, whatever lead time the reminder had. They now follow
the document's own lead time, and stay at 30 days if it has none, so a document with a 90-day
reminder is marked from the day the reminder arrives, and one with 7 days is no longer marked
three weeks early. - The website tells Yuvomi as one story instead of a feature list. The homepage at yuvomi.cloud
now starts with the problem it takes off your hands - many apps, and one person who keeps it all
in their head - then shows how the parts work together, a day at home from morning to evening,
what the family gets, and why it stays yours: no subscription, your data on your own disk and
encrypted if you want, and one update check as the only call out of the box. Setup comes last,
with one main route, the NAS app stores as one-click options, the other ways behind "More ways
to install" and the technical details folded away, and the questions worth asking first open one
answer at a time. The text is plainer in
English and German, technical terms are explained where they appear, and the list of outbound
connections now also names Gravatar profile pictures and installing extension modules from GitHub.
The screens are staged instead of pasted in: the top of the page shows the desktop, the kitchen
wall tablet and a phone together, each connection between two parts shows both ends as real
excerpts from the app, the day at home shows each moment as a focused crop, and the overview,
wall and health screenshots are current again. On a phone the page is nearly a third shorter.
The top bar is the same on every page of the site and groups the jump menu, language and theme in
one glass control: EN and DE are two buttons, and pressing the language you are already reading
no longer switches to the other one; the theme names its mode on wide screens, and GitHub is a
single icon. The jump menu marks the section you are in. The floating Install button on phones
gets out of the way while you scroll down and comes back when you scroll up, and stays away over
the setup section and at the end of the page; "Back to top" appears only after half the page.
The family section shows the kitchen wall tablet large, with the shared notes board on a phone in
front, device frames stay visible in dark mode, and the excerpts are sharp on high-density phone
screens. The overview image at the top now starts loading right away on phones too, and the
footer says "MIT-Lizenz" on the German pages.
Security
- Channel routes only manage household channels. The admin routes for notification channels now
always create a household channel, and a personal channel cannot be pointed at a member through
the admin API or changed by it. A member's private reminders stay out of reach of anything an
admin sets up, in line with how private entries already work.
Fixed
- A reminder you have already seen stays seen when its event is saved again. Saving the reminders of an
event replaced all of them, so one that had already fired came back unread with a new id and showed up
again. A time that stays in the set now keeps its row, its read state and its push state; only new times
are added. - Tasks starting today show up on the household's today. The task list and the MCP
list_taskstool
hid tasks by start date using the server's own day instead of the household time zone, so near midnight a
task could appear a day early or late. - The API refuses malformed task, shopping and calendar input with 400. A number as a title or item name,
nullas a task category or priority, ornullas a category when editing an item ended in a server error.
Numbers in text fields were stored as text such as "5.0", an empty title was saved when editing a task or
event, editing an item checked no lengths,is_checked: "false"ticked an item off, and empty date fields
of a task were stored as empty text instead of no date. These now answer 400 or are stored as no value;
is_checkedstill accepts 0 and 1. Clearing checked items of a list that does not exist answers 404
instead of 200. - Saving a recurring event no longer moves its reminders. In the calendar view, every occurrence named
the last occurrence in view as the start of its series. The event dialog then showed a lead time weeks
too long, and saving wrote that lead time back, so a reminder could fire weeks early. Saving a series
from an external calendar also moved reminders nobody had changed onto the opened occurrence. Reminders
already moved by this stay as they are: if one looks wrong, set it again. - A shared event reminds a household channel once. An event assigned to several people sent the
same reminder to a household notification channel once per person. The channel now hears it once,
and a reminder someone set for a different time still arrives on its own. Each person's Web Push
and personal channels are unchanged. - A waste pickup reminds a household channel once. Everyone who turned on a reminder for the
same waste type sent the same pickup to a household notification channel once per person. The
channel now hears it once, and someone with a different lead time still gets their own message.
Each person's Web Push and personal channels are unchanged. - The Budget title stands in full on narrow phones (#2440). Below 390px wide the title sat next
to the month stepper and read "Bud..." at 360px. There the month now takes a row of its own under
the title, with the arrows at the ends of the row, and the title keeps its size. The tabs without
a month use the same row for their note, so the tab bar stays put between these tabs, and paging
through the months moves nothing. From 390px up nothing changes. - Error messages in Settings speak your language. Saving, syncing or removing something in
Settings could show the server's or browser's raw English sentence in a toast. Now the app says
it in your language, and names the cause where it knows one: the last administrator, a tag or
subscription that is already gone, an Outlook series with exceptions, or location access turned
off in the browser. Only what another server answered, such as a WebDAV or CalDAV server refusing
a connection, still appears as its original text, inside a translated sentence, so an admin can
fix it. - "Today at a glance" fits narrow phones again. On a phone, the summary next to the title
("2 events left · 1 task overdue") was not allowed to wrap. When it did not fit - in German
already on a 375px screen - the card's content became wider than the card and every row was cut
off at the right edge, including "All day" and "Overdue". The summary now moves below the title,
right-aligned, when there is no room beside it, and the card's column never grows past the card
(#2297). - The Tasks title stands in full on narrow phones (#2425). Below 390px wide the title sat next
to three buttons and read "Aufgab…" at 360px. There the filter now moves into the "..." menu, and
the number of active filters stands on the "..." button and in the menu entry. From 390px up
nothing changes. - Repeating tasks keep their time on CalDAV servers across clock changes. A repeating task with
a time now goes out in the household's time zone, so a daily 07:00 task stays at 07:00 after the
clocks change, and a weekday repeat near midnight stays on its day. Its start now lies before its
due time, which strict servers require. Yuvomi fixes a task already on the server the next time
you change it. If another app added a reminder or skipped a date there, the task keeps its old
timing until you tick it off, so those still line up. - A new app name reaches installed apps. After renaming the app in Settings, a browser that
had loaded the app before kept the old name for the installed app, even after uninstalling and
installing it again: the service worker answered/manifest.webmanifestfrom its cache and only
asked the server after the next release. It now asks the server first, like it already did for
manifest.json, and uses the cached copy only when the network is slow or offline. - Vitals take the units Yuvomi can convert, and impossible values no longer slip past in them
(#2375). The API took any text as a unit, so 9,000,000 g went past the limits that stop 9,000 kg,
and a typo likekgswas drawn unconverted next to kilograms.POSTandPATCH /api/v1/health/vitalsnow accept the units a measurement lists plus those the chart can convert,
in any capitalisation (weight alsog,lbsandstone, height and head circumference alsom
andmm, temperature alsoCandF), and check the limits on the converted value: 700,001 g
is refused like 700.001 kg. Any other unit is refused with 400 and the reason
health_vital_unit_invalid, and the message names the ones that work. Weights in stone now also
convert in the chart.unitstays optional, stored readings stay as they were sent, and older
readings in any unit can still be edited. - A calendar series that gets a new first date on its way out keeps its exact time. When Yuvomi
moves the start of a series like "last day of the month" onto the first day the rule hits, fractions of a
second that came from the calendar provider were dropped from the start and end. They now stay. - The container starts with
no-new-privileges. Hardened setups (Podman Quadlet
NoNewPrivileges=true,--security-opt no-new-privileges, Composesecurity_opt) never got
past the entrypoint:gosuhung as root at 100 % CPU before it switched to thenodeuser, so
the server did not start (#2380). The entrypoint now drops tonodewithsetprivfrom
util-linux, which is already in the base image, and setsHOMEto node's home asgosudid.
Thegosupackage is gone from the image. Starting as root without the option, or directly as
node, works as before. - Reset to original restores a subscribed event at once. Resetting a changed event from an ICS
subscription only cleared the edit mark, so the changed text stayed until the next sync. Each sync
now keeps the feed's values, and the reset restores them straight away, without a network call.
Subscriptions synced before this update have no stored values yet: their reset clears the mark
and says so, and the next sync fills them in (Refs D#2330). - Calendar responses no longer carry internal sync state. The event data sent to the app
included the snapshots Yuvomi keeps to match calendar syncs. The app never reads them, so they
are gone from the responses now; nothing you see changes. - Tasks remember how you group them. Grouping the list by due date instead of category now
stays after a reload, on that device, like the choice between list, board and history. - The Podman Quadlet health check passes. The
HealthCmdintools/quadlet/oikos.container
reached Podman as a shell command with a missing closing quote, so every check failed with
Syntax error: Unterminated quoted stringand the container stayedunhealthyalthough the app
was running. The quotes are swapped - single quotes around thenode -eargument, double quotes
inside the JavaScript. - The end of a long recipe list stays reachable on the iPhone. The last recipes used to sit behind the
bottom menu and sprang back out of reach when you let go. The list now ends above the menu, and
the bounce at the end of a list no longer brings the search row back. The same holds for the other
kitchen lists. - A meal stays on the wall until the next planned meal. Since 2.83.0 "Today at a glance" dropped
a meal the moment its slot began, so breakfast was gone at 08:00 and dinner at 18:30. A meal now
stays until the next meal planned for today starts, and the last one until the end of the day.
The smaller Today sheet on phones and tablets follows the same rule, and the timeline dot is
unchanged. - Vietnamese counts show the real number. In browsers with current language data, Vietnamese
picks the singular wording for 0 as well as for 1, so eleven messages such as the active filter
count said "1" when nothing was selected. They now show the actual count. - The website no longer says contacts sync both ways. Contacts come in over CardDAV and are
not written back; the homepage and the install page promised a two-way sync for them. - Running the web installer again keeps your settings. On an existing installation the advanced
setup now fills its fields with the values from your.env- port, public address, reverse-proxy
settings, timezone, weather, email, sign-on, storage and backups - so a second run no longer resets
them to defaults when you only wanted to add something. A hand-tunedTRUST_PROXY=2stays as long
as you keep the pre-selected access choice, and the review page shows the kept values instead of
"Not set up". Passwords, client secrets and keys never reach the browser: their fields stay empty
with the note "Current value is kept", and the existing values are written back. Lines you leave
unchanged stay exactly as written, inline comments and quotes included, and a secret read from a
file (GOOGLE_CLIENT_SECRET_FILE,SESSION_SECRET_FILEand the other_FILEvariables) counts as
kept instead of being written a second time, which stopped Yuvomi from starting. A setting you
leave as it was is no longer checked against the installer's stricter rules either: a port or
address written as a Compose variable (${HTTP_PORT:-3000}), a backup schedule with a seconds
field or a full weekday name, and OAuth redirect addresses registered under a different host all
stay as they are until you change the address or the client. - The simple setup makes Yuvomi reachable on your home network. It used to write
http://localhost:3000as the address, so invitation and password-reset links and the app on
your phones pointed at a device that could not be reached. It now uses this computer's address on
the home network (for examplehttp://192.168.1.20:3000), skips Docker bridges and VPN tunnels when
looking for it, and lets you change it with "Change". If it finds none, it says plainly that Yuvomi
is then reachable only on this computer. - A public address without
http://orhttps://is refused in the installer instead of being
silently replaced by an address derived from host and port. - The installer catches settings the server would reject before saving them. A backup schedule
like99 * * * *used to pass and then switched backups off at startup; the schedule is now
checked field by field (minute 0-59, hour 0-23, day 1-31, month 1-12, weekday 0-7). Google,
Outlook and iCloud need their ID and secret together, WebDAV switched on needs its URL, the
document folder inside the container must start with/, and theREPLACE_WITH_placeholder
from.env.exampleis no longer accepted as a key. A failed key generation now shows a message
instead of leaving the key fields silently empty, and the start screen no longer piles up status
requests when the server answers slowly. - Clearer wording in the installer. The key warning is now a calm notice that says what happens:
you get a key file (.env) at the end, and without the database key your data is lost. It used
to be a red alarm that asked you to save the keys "now". The start screen talks about
downloading, starting and checking Yuvomi instead of images, containers and health checks, the
start button reads "Save & Start Yuvomi" for Docker and Podman alike, and the iCloud row no longer
carries a "Legacy" label. - The installer's step count matches its step list. "Start Yuvomi" is now a numbered step like
the others, so the list and "Step N of M" count the same steps: the advanced setup used to show
"Step 8 of 9" next to ten entries, the simple setup "Step 1 of 2" next to three. - How you reach Yuvomi is a two-way switch in the installer instead of a drop-down with two
entries, and the home-network switches in the advanced step form their own named group, so screen
readers announce the warning above them. On the review page, anything not set up says so in its
own row ("Not set up") instead of one row that listed the missing services in the value column. A
failed save now reads "The settings could not be saved." instead of naming the.envfile. - The installer opens faster and in your language right away. The language files load in
parallel and the scripts are fetched with the first byte, the page stays hidden until it can show
your language (with a safety timeout), and HTML, scripts and language files go out compressed:
about 160 kB instead of 520 kB per visit. Every response now forbids embedding the installer in
another page (it shows your keys) and sends no referrer, and the browser tab shows the Yuvomi icon
instead of a missing-icon error. - Installer fields behave like the app's. Address fields open the URL keyboard on phones and are
no longer capitalised or spell-checked, ports open the number pad, and the Enter key on the
on-screen keyboard says "Next". A field the browser itself recognises as invalid (an address
withouthttps://) turns red after you leave it, and screen readers hear the same. Long labels
on the review page ("Database encryption key") are hyphenated instead of running into the value,
addresses like./dataread correctly in Arabic and Persian, and the page no longer puts a focus
ring on the first heading when it opens. Field borders, the main button and the browser bar now
match the app, and the language picker on phones is only as wide as the language it shows. - No more long dashes in the installer's texts. All 27 languages of the web and command-line
installer use a plain hyphen, also for ranges and negative numbers. - Emptying a field when you run the installer again removes the setting. A pre-filled value you
clear (for example the weather city or the sender name) used to come back from the old.env; it is
now removed, and the review page lists it under "Will be removed from .env". Fields you leave
alone, passwords and keys are never removed this way. - The installer asks for a second click only when it replaces something. A first installation
saves and starts with one click; with an existing.envor a running container the confirmation
stays, and a line above the button now says what you confirm - the old.envis replaced after a
backup, the running container restarts, or both. - The advanced setup also starts with your home-network address. Like the simple setup it fills
in this computer's address on the home network instead oflocalhost, and the review page says
calmly when an address is reachable only on this device. - Backup schedules the scheduler would never run are refused. A day that no chosen month has
(0 3 31 2 *, February 31) used to pass and switched backups off at startup. The message now also
names the six-field form with seconds and shorthands such as@daily. - Copying in the installer says when it did not work. If the clipboard refuses, the value is
selected for manual copying and the note says so, instead of claiming "Copied". - Browsers no longer offer saved passwords in the installer's secret fields. Calendar, sign-on
and app-password fields are marked as new secrets, so a password manager does not fill in an
unrelated login. - The installer's last screen leads with the success. One check mark says Yuvomi is ready, and
saving the key file is a quiet checklist row that ticks itself off after the download, instead of
a warning banner, a second logo and a download button above "Open Yuvomi". The note that the
installer shuts down soon stays as a small line until the file is saved. - Skipped steps look skipped in the installer's step list. Weather, calendar, email, storage and
advanced steps you leave empty show a dash instead of a green check mark. - Installer fields match the app's. Fields are 48 pixels high on the app's field background, the
show-password and copy buttons are full-size touch targets, the Yuvomi mark in the header looks
the same as in the app in dark mode, and hovering the advanced option no longer pulls harder than
the recommended one. - Clearer installer messages. A missing field in the admin step is named and focused instead of
"All fields are required", a server's own error text appears as a separate "Details" line, the
example values in the address and name fields are in your language, the start screen says that a
first run usually takes 1-3 minutes and counts in minutes, and technical terms like "session
secret", "SSRF protection" and "Compose file" follow a plain description instead of leading it. - Installer hints read at a calmer line length. Explanations under fields wrap at about 80
characters instead of 90, spacing follows the app's scale, a failed copy shows its note on its own
line instead of breaking around the button, and the "taking longer than usual" note no longer
touches the line above it.