github ulsklyc/yuvomi v2.84.0

3 hours ago

Added

  • GET /api/v1/version now says what it is talking about. Two new public fields: product identifies a
    Yuvomi instance, and client_api is 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 sets client_api to 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/upcoming lists 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 in fires_at, in UTC, also for older reminders stored with an offset. types can
    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/devices let 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 by test: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 /shopping and POST /shopping/{listId}/items answer
    201, DELETE /calendar/{id} answers 204, POST /auth/login has a second answer shape for two-factor
    sign-in, and CalendarEvent names its fields instead of allowing anything. Three nullable response
    fields now carry null in their type rather than in a oneOf branch, 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/pair creates a
    short code from a browser session, and POST /api/v1/auth/devices/pair/redeem exchanges it for a device
    credential. The code holds for five minutes and once, and comes back as text, as a yuvomi://pair link
    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_tasks tool
    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,
    null as a task category or priority, or null as 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_checked still 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.webmanifest from 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 like kgs was drawn unconverted next to kilograms. POST and PATCH /api/v1/health/vitals now accept the units a measurement lists plus those the chart can convert,
    in any capitalisation (weight also g, lbs and stone, height and head circumference also m
    and mm, temperature also C and F), 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. unit stays 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, Compose security_opt) never got
    past the entrypoint: gosu hung as root at 100 % CPU before it switched to the node user, so
    the server did not start (#2380). The entrypoint now drops to node with setpriv from
    util-linux, which is already in the base image, and sets HOME to node's home as gosu did.
    The gosu package 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 HealthCmd in tools/quadlet/oikos.container
    reached Podman as a shell command with a missing closing quote, so every check failed with
    Syntax error: Unterminated quoted string and the container stayed unhealthy although the app
    was running. The quotes are swapped - single quotes around the node -e argument, 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-tuned TRUST_PROXY=2 stays 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_FILE and the other _FILE variables) 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:3000 as 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 example http://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:// or https:// 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
    like 99 * * * * 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 the REPLACE_WITH_ placeholder
    from .env.example is 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 .env file.
  • 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
    without https://) 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 ./data read 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 .env or a running container the confirmation
    stays, and a line above the button now says what you confirm - the old .env is 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 of localhost, 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.

Don't miss a new yuvomi release

NewReleases is sending notifications on new releases.