Zum Hauptinhalt springen
War diese Seite hilfreich?

Changelog

Version history for PrimeCal. Versions follow MAJOR.MINOR.PATCH (semver). The patch number is incremented before every deployment. Feature milestones are noted at significant version boundaries, which are usually but not always MINOR bumps.

Current version: 1.14.38 (backend and frontend package.json), released 2026-11-06


v1.14.38 — Sign In With Any Microsoft Account​

Fix

  • Personal Microsoft accounts can sign in. Signing in with an Outlook.com, Hotmail or Live account failed after Microsoft's consent screen, because PrimeCal did not ask for permission to read the basic profile it needs. Work and school accounts from any organisation can sign in too.

v1.14.14 — Smart Reschedule Checks Every Calendar You Can See​

Fix

  • Smart Reschedule could miss a conflict on a calendar you don't own. The plan only looked at your own calendars when checking for a free slot, so a shared or subscribed calendar's events weren't counted - a move could land on top of one of them. The check now looks at every calendar you can see.

v1.14.13 — Smart Reschedule​

Feature milestone

  • Smart Reschedule: mark an event as reschedulable, and moving something onto it offers to shift it to the next open slot instead of just conflicting. Dragging a movable event onto another time, or creating a new event on top of one, opens a plan you can review before anything changes - what moves, to when, and why - with Apply and an Undo afterwards.
  • Your own working hours: a new per-weekday working-hours editor in your profile (a start and end time for each day; leave a day blank for no limit) feeds the reschedule planner's search for a free slot. Find a time in the calendar toolbar uses the same hours when your device hasn't chosen anything yet.
  • Reschedule preferences: choose a strategy (which events are allowed to move), how start times are rounded, and how far ahead the planner searches - all in your profile, alongside working hours.
  • Moving someone else's event asks first. If a drag or a new event would move an event you don't own, the owner gets a notification instead of the event moving under them; opening it runs a fresh plan under their own settings and hours.
  • Automation: a new event.rescheduled trigger and a set_reschedulable action, so a rule can mark events as movable or react when Smart Reschedule changes one.
  • Sync: imported events can default to reschedulable, per calendar, in the sync settings panel.

See Smart Rescheduling for the full guide.


v1.14.12 — (internal test fixture fix only; no user-facing change)​


v1.14.11 — Reschedule Groundwork: Plan, Apply, and Undo​

Backend groundwork for Smart Reschedule (shipped as a complete feature in v1.14.13): the plan/apply/undo routes, MCP tool coverage, and the cascade planner that decides what moves and where. Nothing in this release was yet reachable from the calendar UI.


v1.14.10 — Reschedule Data Model​

Database groundwork for Smart Reschedule: the schema for per-day working hours and the reschedule cascade planner, laid down ahead of the feature's UI and routes.


v1.14.9 — (internal build fix only; no user-facing change)​


v1.14.8 — Notifications Deliver Without Needing Redis, and Calendar Search Reaches Further​

New

  • In-calendar search now reaches events outside the currently loaded window. Searching used to only look at events the calendar had already fetched for the visible view; a new search endpoint looks at everything, so an older or future event you search for is found even if you haven't scrolled there yet.

Fixes

  • Notifications are delivered from a database queue instead of requiring a separate messaging service. Email, push, and other notification channels now queue and retry through the same database every other part of the app already uses, instead of depending on infrastructure that wasn't always available - so a notification that previously failed silently when that infrastructure was missing now gets delivered.
  • Four open items from the calendar redesign were closed: the event editor focuses its title field when opened, the "run now" automation dialog uses its proper colours instead of a default blue, the current-time line respects your timezone, and Esc closes only the dialog on top rather than everything behind it too.

v1.14.7 — Tasks Move Instantly When Dragged, and Three Small Fixes​

Fixes

  • Dragging a task card to a new column or position now moves it immediately, instead of waiting for the board to reload before showing where it landed.
  • The calendar's list of views can be reordered, and the separation between an experience mode (Standard, Focus, Planner, Simple, Kid, Family) and an individual feature flag is now consistent everywhere it's checked.
  • The login page's hero title now reads "Prime Calendar" in every language - French had previously translated the brand name itself.
  • Your username can no longer be changed, or seen, from your profile. It's a sign-in credential, not a display name; your display name is what everyone (including you) sees in the app, and it was already preferred everywhere the UI shows who you are.
  • A broken link to the refund policy in the footer is fixed, and the footer no longer shows a raw, untranslated key in place of text.

v1.14.6 — Moving a Subscription From Stripe to Paddle​

Improvement

  • Administrators can now move a subscriber from the older Stripe billing record to the current Paddle one, with the change recorded in the audit log. This doesn't change anything for subscribers paying normally - it's a one-time account-repair tool.

v1.14.5 — Shared Seats Can Now Outrank Your Own Plan​

New

  • A seat on someone else's higher plan now applies in full, instead of only adding on top of your own. If you're on the Free plan and accepted onto a Family seat, you get everything Family offers; if you already pay for a plan, a seat on an equal or lower plan never takes anything away or downgrades you automatically - you're still asked before anything changes.
  • Taking over (or losing) a paid plan this way always asks first. Superseding your own paid subscription with a seat cancels it at the end of its current billing period, never immediately and never with a partial refund, and only after you've confirmed.
  • The current-plan card now says who provides your plan when it comes from someone else's seat, and hides billing buttons that wouldn't apply to you in that case.

This feature is off by default while it's rolled out gradually; it has no effect until an administrator turns it on for an account.


v1.14.4 — The Task Board Shows Every Task (1.14.3 and 1.14.4)​

The Tasks board asked the server for its tasks without a page size, so it received the first 25 and stopped: with 47 open tasks, the last 22 never appeared on the board (they were still on the Focus list, which is a separate query). The board and the Today view now read every page. A caller that asks for a specific page size still gets exactly that page.


v1.14.2 — Release Stability Update​

Versions 1.14.0 and 1.14.1 were consolidated into this release. Everything listed in their entries below is available in 1.14.2, which also hardens the verification we run before every release.


v1.14.1 — Invitations No Longer Wait on Notification Delivery​

Version 1.14.0 was superseded by this release. Everything listed in the 1.14.0 entry that follows is available in 1.14.1.

Fixes

  • Inviting someone who already has an account could hang. The invitation announced itself with a push notification, and creating the invitation waited for that delivery to finish. Invitations to a people group and to a plan now announce themselves in the app and by email.
  • A notification can no longer hold up the request that raised it. If a notification cannot be handed off for delivery within three seconds, that one delivery is recorded as failed, the in-app notification and the other recipients' notifications stand, and the request carries on. Before, one stalled delivery could hold up the whole request - including the answer to a fifth wrong Kid-mode PIN, which hung instead of saying "Incorrect PIN".

v1.14.0 — Invitations Anyone Can Answer, Quick Add First, One Month for Every Screen, and Family Mode​

New

  • An invitation is asked, and anyone can answer it - the Free plan included. Someone invited to a people group or to a plan is asked the first time they open PrimeCal: a popup with who invited them, to what, the note they wrote and Accept or Decline - one tap each. Decide later (or Esc) puts it off for that browser tab; the invitation waits on a new Invitations page (/app/invitations) and in People → Manage under Waiting for your answer, and tapping its row in the notification inbox opens the same page. The invitation also arrives by email - in the person's language - with Accept and Decline links; for an address with no account the button is Create account and accept, with the address filled in, and the invitation is waiting after sign-up. The links only prepare the answer (one more tap), so a mail scanner cannot answer for anyone. See Answering an Invitation.
  • Add them to my account. Inviting someone to a people group on a plan with seats offers Also add them to my account, unticked, with how many seats are left. Ticked, a seat on your plan is held for them: accepting joins the group and your plan, declining or withdrawing releases it. Pending invitations can be sent again or withdrawn, inviting the same address to the same group again re-sends your own pending invitation rather than piling up, and anyone who is not the owner can leave a group (⋯ → Leave group). Creating and sharing people groups, and giving a seat, still come with the Family plan; being invited, accepting, seeing the group and leaving do not. See User Groups and Sharing.
  • Quick add is the main Create button. The quickest way to add an event used to be the second item of a menu; now the toolbar's main button - and, on a phone and in Focus, the floating + button - opens it: type Dentist friday 3pm and press Enter. New event, the full editor, is the first item in the arrow beside it, and in the floating button's list it sits just above Quick add (the entry nearest your thumb). The keys are the same: Q for quick add, C or N for the full editor. Simple mode keeps the form first (Add appointment) and calls quick add Add by typing. The small bolt button beside Search on a phone is gone.
  • Family mode and the People view. A new experience mode for a household's shared calendar. The calendar opens on People: one day, a column for each person (a calendar is a person), and a Who is next strip for today that says what everyone is doing now, what comes next and how far off it is, or that they are free. Each column has a + that starts quick add with that person's calendar already chosen - "for whom, then when". Big targets, roomy rows, no dragging, and the people-and-sharing parts of Standard without the workplace ones (automation, AI agents, booking links, developer tools, personal log). The People view is also in every other mode's views menu (not Simple's) and on the P key.
  • The month on a phone lists the day you tap, right under the grid. No sheet opens over the calendar any more: tap a day and its events are below the dots, with an Add button that starts quick add on that day. Week numbers work on a phone too.
  • Quick add reads more of the sentence. @Family names the calendar, #health a label (as many as you like), and every monday, daily, every 2 weeks make the event repeat - in English, Hungarian, German and French. More options takes all of it into the full editor.
  • A density you can choose. Compact, Regular or Comfortable in the calendar's options menu (⋯), kept for each mode on each device.
  • Planner's extras. ISO week numbers, a second time zone beside the hours, and Find a time: the next free slots of the length you choose.
  • Simple mode speaks plainly. "Appointment" where the other modes say "event", through the toolbar, the editor, the event card, the empty states, quick create and search - in all four languages.
  • PrimeCal asks and tells in its own dialogs. Confirmations and error messages no longer use the browser's pop-ups: they say what the button does ("Delete", "Keep my plan"), speak your language, and Escape closes only the newest dialog.
  • Accessibility. Reduced motion is honoured everywhere, not only in the calendar (a loading spinner still turns). Increased contrast firms up the quiet greys. In Windows high-contrast mode the selected view, today, the state of every checkbox, the hour lines, the line across now, the dots and the edge of each event are drawn in your colours. A swipe at the end of the time grid or the agenda no longer drags the page behind it.

Fixes

  • Month weekday names were one day early for anyone west of Greenwich: a browser in New York labelled a Sunday-first grid "Sat Sun Mon ...". The names now come from the days the grid really draws.
  • The month grid could not be entered with a keyboard when no day was selected, and an arrow key moved the selection without moving the focus, so a screen reader said nothing. Today (or the 1st) is the grid's one tab stop and the focus goes where the arrow does. Every day has a spoken name ("Tuesday, March 10, 2026, 2 events").
  • The day panel beside the month said "event" for an all-day event, made plurals by adding an "s", wrote times in 24 hours whatever your profile said, and put a meeting link inside a button. It now says "All day", counts in your language, follows your 12h / 24h choice, and the link is its own.
  • Imported events show their calendar's colour. Sync used to copy the calendar's colour onto each event it brought in, so recolouring a synced calendar left its events as they were (and every sync overwrote a colour you had given an event). A migration clears the default-blue copies on imported events; a colour you chose is left alone.
  • Quick create and quick add say why when nothing can be added: every calendar you can see is read-only ("No calendar to add this to"), instead of an empty list.
  • The weekday header of the month is part of the grid for assistive technology, and counted in its rows.
  • An invited family member could not accept. Every people-group route, accepting and declining included, sat behind the user_groups plan feature, so a Free account invited to a Family answered "feature not available" - and nothing asked it to try. The gate is now per route: managing groups needs the feature, answering an invitation, reading a group you belong to and leaving it do not.
  • A seat on someone's plan had no way to be accepted: the invitation linked to a page that does not exist, there was no way to decline, no email, and nothing refreshed the person's features when it was accepted (they appeared up to 15 minutes later). An accepted seat now applies at once, a revoked one stops at once, the seat can be declined, and the accepting account must be the one invited (a forwarded email no longer hands the seat to whoever opens it).
  • A menu opened inside a drawer or a dialog was hidden under it: it stacked below the overlay (tier 30 under 70), so the People group's ⋯ menu - Edit details, Delete, and now Leave - could not be clicked. A popover whose anchor is inside a dialog now stacks above it.
  • Seat errors read "Request failed: 403", because the client looked for the message where the API does not put it, and revoking a seat from the Subscription page was refused, because it was the one request not sent signed in. Both say what happened now, in the person's language, and a failed resend or revoke is shown instead of vanishing.
  • A seat of someone who held seats on two subscriptions counted only the first; the features of every active seat now add up, and a seat on a subscription that has been canceled or suspended grants nothing.

API changes

  • New endpoints: GET /api/invitations/pending, POST /api/invitations/:kind/:token/accept and /decline, GET /api/seats/capacity and POST /api/seats/decline. Invitation errors carry stable codes (INVITATION_NOT_FOUND, INVITATION_EXPIRED, INVITATION_NOT_FOR_YOU, SEAT_LIMIT_REACHED). See the Invitations API and the User Group API.
  • Inviting someone to a people group accepts an optional addToMyAccount flag; re-inviting the same address re-sends the invitation instead of creating a duplicate, and an invitation can be revoked or left.
  • The FAMILY experience mode is accepted wherever an experience mode is set.

v1.13.1 — Billing Buttons That Work, and a Phone Grid That Fits​

Fixes

  • Manage Billing and Cancel failed with a server error. Three kinds of record - Paddle customers, Paddle transactions and trial grants - could not be read or written, and the billing portal looks a customer up that way. This is fixed, and an automated check now guards against it recurring.
  • A subscription that began on Stripe opens Stripe's portal, even though new checkouts now go to Paddle: where you are sent is decided by who bills you, not by the setting for new checkouts.
  • A plan an administrator assigned shows no Manage Billing or Cancel button, and says there is no billing to manage. There is no portal behind it.
  • When a portal cannot be opened, the page says so, in your language. Manage Billing used to do nothing at all, and Cancel showed the server's raw words.
  • The cancel confirmation no longer says everyone will be sent to Stripe.
  • On a phone, the time grid ends exactly above the bottom bar. Its last two hours were hidden under the bar until the page itself - not the grid - was scrolled.

API changes

  • The subscription summary now includes billingProvider (stripe, paddle or null). A billing-portal request for an account with no billing relationship returns 400 NO_BILLING_ACCOUNT instead of 500.

v1.13.0 — Move Events With a Finger​

New

  • Press and hold an event to move it, on a phone or tablet. Rest your finger on an event for about a third of a second - on devices that can, a short buzz says it is in hand - then drag it down the day or across to another day, and lift. The dashed outline, the conflict colours, the quarter-hour snapping and Undo work exactly as they do with a mouse.
  • Carry an event to the top or bottom edge and the grid scrolls by itself, so any hour can be reached without letting go. Before, the whole page scrolled instead, and the drop time came out wrong.
  • The bottom edge that changes an event's length is bigger on a touch screen - a strip up to about 6 mm tall, never more than the lower 40% of a short event.

Fixes

  • Dropping an event on another day no longer pages the calendar as well. On a phone a sideways drag already moved an event, and also swiped to the next period.
  • Scrolling the day back up no longer refreshes the page. Swiping down in the time grid counted as pulling the page down to refresh: the profile was fetched again and the refresh indicator slid in, every time. Pulling down from the very top still refreshes.
  • A long press on an event no longer selects its text or opens the system menu.

v1.12.4 — A Lighter First Load​

Improvements

  • The first page of every visit is about 60% smaller. The script downloaded before the calendar can appear fell from about 4.2 MB (1.05 MB compressed) to about 1.6 MB (470 KB compressed), plus roughly 80 KB for your language's text. On a phone connection that is seconds.
  • Only your own language is downloaded. All four languages used to arrive together in one 1.5 MB file. A visit now fetches its own language (and English as the fallback), one small file per area, and a change to one file leaves the others cached.
  • Pages you have not opened are not downloaded yet: Automation, Screens, Reservations, Notifications, Calendar sync, Profile, Subscription, the AI agent settings, the public booking page, pricing, onboarding and the sign-in consent page. Each arrives the first time you open it, behind a placeholder the shape of a page. The calendar, Today, Tasks and the navigation are still there from the start.
  • The emoji picker's data (half a megabyte, with every emoji's name in four languages) loads when a form with an icon picker first opens, not with the first page.
  • The Now view's idle sentences (a thousand per language) load when that view opens.
  • A tab left open across an update repairs itself. When a new version has replaced the files an old tab still points to, the next page you open reloads once instead of reporting "module failed". Offline, it leaves the page alone.

v1.12.3 — Two Labels That Were English for Everyone​

Fixes

  • Deleting a calendar asked you to type its name with the line "Type NAME to confirm" in English, in every language. It is now in your language (for example "A megerősítéshez írja be: NAME").
  • The toasts' labels for screen readers - the region that holds the confirmations ("Notifications") and the button that dismisses one ("Dismiss notification") - were English for everyone, including the Undo confirmation after moving or deleting an event. They follow your language now.

The admin area keeps its English-only labels by design.


v1.12.2 — The Event Editor Asks in the App​

Fix

  • Deleting an event from the editor, or closing the editor with changes not saved, asked with the browser's own confirm() box: unstyled, in the browser's language, impossible to read with the page's text size, and blocked outright by some browsers. Both now ask in a dialog of the app, in your language, with named buttons (Delete Event / Cancel; Discard changes / Keep editing).

Fixes

  • A moved or resized event is drawn in its new place at once. Until now it went back to its old place the moment it was dropped and only jumped to the new one when the server and the refetch had answered, a second later or more - and a keyboard user watched it jump twice. It now stays where it was put; if the server refuses, it goes back and a message says so; Undo draws the way back just as quickly.
  • The app icon was a 3 MB image. The navigation showed a 1024px PNG at 40px, the login page at 76px, and the browser fetched it again as the favicon: about 3 MB on every first visit. The navigation now loads a 30 KB version, the login page 100 KB and the favicon 9 KB.

v1.12.0 — Moving and Resizing Events From the Keyboard​

Feature

  • Move an event with the keyboard: Tab to it, Space picks it up, the arrows move it (a day sideways; a quarter-hour up or down in the Day, 3-day, Work week and Week views, a week in the Month view), Space or Enter drops it, Esc puts it back. The same landing outline and conflict colours as dragging, a screen reader hears each step in the app's language, and the keyboard is on the event again once it has moved. The user guide had described this since 1.4.62; it had never worked.
  • Change an event's length with the keyboard: Shift with ↑ or ↓ in the time grids, a quarter-hour at a time, saved once after the last press with an Undo.
  • The ? reference lists the keys of an event, in modes that let events be edited.
  • Fixes: in the Month grid an arrow key moved the selected day and paged to the next month (both the grid and the page shortcut acted on it); Space on an event selected its day; Enter on a meeting link inside an event opened the event instead of the link; a carried event's old time overprinted the landing outline.

See Rescheduling by Dragging and Keyboard Shortcuts.


v1.11.0 — Quick Add​

Feature

  • Quick add: type an event as a sentence and press Enter - Lunch with Sam tomorrow 12:30-14:00, Dentist friday 3pm for 45 min, Offsite all day next monday. Press Q or choose Quick add in the Create menu. A line under the field shows how the sentence was read before anything is saved, More options carries the title, day, hours and calendar into the full editor, and English always works alongside the words of the app's language (Hungarian, German, French). On a phone, a bolt button beside Search opens it as a sheet.
  • Fix: a toolbar that was mounted again (leaving the Now view, turning a tablet) no longer reopens the date picker, the search box or quick add by itself because of a key pressed earlier.
  • Fixes (1.10.1): the toolbar date and the main navigation are no longer cut off at tablet widths or with large text, and the Comfort skin scales its text size to the screen.

See Creating Events and Keyboard Shortcuts.


v1.10.0 — Calendar Overhaul and Experience Modes​

Feature milestone (shipped over 1.8.4 to 1.10.0)

The calendar workspace was rebuilt around handling events.

  • Dates and toolbar: one period title for every view and locale, the profile's week start and default view honoured, a jump-to-date picker, a split Create button, one filter menu, and a toolbar that fits its own width. View and date live in the URL.
  • Sidebar and people: every calendar listed once, a + on the list to add one, a menu on each calendar and group, and People groups in a drawer with a share dialog that starts from what is already shared.
  • Events: a quarter-hour time grid with quick create (drag a time, name the event, press Enter), a landing preview when dragging and a resize handle, undo for create and resize, and one colour per event (its own, else its calendar's). Clicking an event opens a card with Edit, Duplicate, and Delete with an undo.
  • Views: Day, 3 days, and Work week join Week as views of the same grid; a phone shows three days at a time. The wide toolbar shows Day, Week, Month, and Agenda as buttons and the rest in a menu.
  • Experience modes with a purpose: Planner and Simple join Standard (formerly Production), Focus, and Kid. Each mode opens the calendar on a view of its own and offers the views that suit it — Focus opens on Now with Now, Day, and Agenda; Planner opens on the work week on a tighter grid; Simple opens on a plain agenda with larger text (the new Comfort skin), roomier rows, and no dragging. The mode selector and Profile → Experience describe each mode.
  • Phone: the bottom navigation's tabs share the bar instead of cutting off the last one.

See Experience Modes Overview and Calendar Views.


v1.7.0 — Task Board: Drag-to-Rank, Quick Task, Archiving​

Feature milestone

  • Manual drag-ranking: A new Task.rank column, scoped per owner and status, gives each Kanban column its own manual order — independent of priority. Drag a task within a column (Todo, In Progress, or Done) to reorder it; the position sticks for you and anyone else who can see the board. PATCH /api/tasks/reorder takes the full ordered id list for a column and reassigns rank in one transaction.
  • Quick Task: A fast two-field capture flow (title + duration, with an auto-schedule checkbox) replaces jumping straight into the full task composer for a simple add. "More options…" hands the same fields to the full composer instead of discarding them. Both the Tasks page's "+ New Task" and the Calendar view's quick-add now open Quick Task by default.
  • Archiving completed tasks: PATCH /:id/archive / /unarchive, bulk POST /tasks/archive-done, and a GET /api/tasks?archived=true opt-in filter (archived tasks are excluded by default) let a Done task disappear from the board without being deleted. A new per-user setting (autoArchiveCompletedTasksDays) drives a daily cron that archives old Done tasks automatically — off (NULL) unless you turn it on.
  • MCP coverage: New tools primecal_tasks_reorder, _archive, _unarchive, _archive_done, _settings_get, _settings_update.

See Tasks Workspace and the Tasks API for full detail.


v1.6.0 — Notification Inbox Rebuilt​

Feature milestone

The Notification Center was rebuilt around a single, real problem: for most users, the old "conversation" grouping showed dozens of one-message threads labeled things like "Task 4127" or "Event 918" — never a real conversation, never a usable title.

  • Priority + time, not conversations: One stream — Needs action → Today → Earlier. Related updates collapse into an expandable bundle with a real, human title instead of a raw entity id. See Using the Notification Inbox.
  • Search and filter, server-side: Full-text search, class filters (Critical, Time-critical, Coordination, Operational, FYI), and a state filter (All / Unread / Needs action), all resolved on the server with cursor pagination — the old inbox filtered a fixed 50-row client cache.
  • A new v2 API: Server-side filter/search/group/count, with subject, actor, and deep-link resolved per row instead of left for the client to guess at.
  • MCP and push: The notification-triage and delivery logic behind the inbox is also what drives web push, mobile push, and the MCP notification tools — see the Notification Classes Reference for the underlying five-class triage engine.

See Notification Preferences and Using the Notification Inbox for the user-facing detail, and the Notifications API for the v2 contract.


v1.5.0 — 14-Day Free Trial (card required)​

A Paddle-native, card-required free trial layer on top of the existing plan system — explicit opt-in, not automatic. Ships with an abuse-prevention ledger (trial_grants) that blocks a repeat trial on the same user, a normalized email, or the same payment-provider customer id, and a sweep that clears abandoned, never-confirmed trial attempts after 24 hours.

Not currently available — the trial is switched off at the platform level. See Plans and Pricing for the current, live plan terms.


v1.4.79 — Trash and Activity Log​

Recoverable deletes and a durable per-entity timeline, replacing hard deletes for the paths it covers. A deleted event moves into a 30-day trash window instead of being destroyed outright, and a 365-day activity log records what happened to an entity even after it's gone. Restoring from trash is an admin-console capability today, not a self-service one — see Support Contact if you need something recovered.

Deleting a calendar is not yet covered by this system and remains an immediate, unrecoverable hard delete — see Deleting Calendars.


v1.4.62 — Calendar Rebuilt on a Pure Rendering Engine​

Feature milestone

  • New calendar engine: The month and week grids were rebuilt on a pure, side-effect-free engine that indexes events once per data change instead of re-filtering the full event list on every render — fixing real slowdowns on calendars with many events, especially on hover.
  • Correctness fixes that came with it: multi-day events previously rendered only on their start day; events were bucketed to the start of their hour rather than their actual time; overlapping events could draw on top of each other. All three are fixed by the same rewrite.
  • Data layer: the calendar now fetches only the visible date window (plus a few days of padding either side), caches per window, and prefetches the next window you're likely to navigate to — replacing a much wider, unbounded fetch.
  • Drag-to-reschedule: drag an event to a new time with a conflict preview and undo, plus in-calendar search and full keyboard navigation.
  • MCP coverage: primecal_calendars_events_move, _events_conflicts, primecal_calendars_availability_find.

See Calendar Views for full detail.


v1.4.58 — Admin Console Rebuilt​

The admin area moved from a single panel with a tab switcher to a proper route tree at /admin, with dedicated pages per area (Overview, People, Calendars, Events, Access, Reservations, Organizations, Logs, Audit, Compliance, Notifications, Configuration, System) and a shared set of list/table/drawer primitives. Administrator-only; it is not covered in this documentation set.


v1.4.46 — Paddle Add-on Layer​

A second, optional subscription layer — buy one or more feature or limit "add-ons" on top of whatever plan you're already on, billed through Paddle alongside your plan rather than requiring a full plan upgrade. See Plans and Pricing for how add-ons currently show up (or don't) on your account.


v1.4.24 — Screens and Gadgets​

Feature milestone

A new module for always-on wallboard displays: drag-and-drop "Gadgets" (calendar views, focus lists, notifications, household info, and more) onto a sized canvas to build a "Screen," save layouts as reusable Templates, and pair a physical device (kiosk browser, tablet, smart TV, Raspberry Pi) to display a Screen read-only via a short pairing code.

See Introduction to Screens and the Screens API for full detail.


v1.4.0 — Experience Modes & Skins: Production, Focus, and Kid Mode​

Feature milestone

  • Experience Modes: A new capability-driven mode system with three tiers — Production (everything visible, the default), Focus (stripped-down navigation, simplified Tasks, a floating create button, and a slide-in task drawer), and Kid Mode (a fully separate, standalone shell for children ages 4-8). Every gated component reads a useCapabilities() flag rather than checking the mode directly, so a future mode only needs a new capability object, not changes to every consumer. New GET/PATCH /api/user/experience-mode endpoints persist the choice per user.
  • BREAKING CHANGE — Task experience toggle removed: The manual Tasks experience (Standard/Simplified) profile setting has been replaced. Task density is now derived automatically from your Experience Mode (Production → Standard, Focus → Simplified) instead of a separate pick. Anyone who had manually selected Simplified while otherwise wanting full features will need to switch to Focus mode to keep that view — see Tasks Workspace for the full explanation.
  • Kid Mode: A safe, standalone shell — its own header, a read-only simplified calendar (today's events as large color cards, friendly relative dates for upcoming events), and a simple complete-only task list. Exiting requires a PBKDF2-hashed PIN (100,000 iterations, salted, never stored or transmitted raw), verified server-side with a timing-safe comparison. Repeated wrong attempts trigger an escalating, server-authoritative lockout (5-minute lock after 5 failures) and an email notification to the account's own address. All Kid Mode text passes through a sanitizeForKid() HTML/URL stripper, and in-app navigation is trapped (useBlocker) so the browser back button can't leave the shell.
  • Skins: A pluggable, purely-cosmetic theming layer (CSS custom properties + a <html> class), separate from Experience Mode. Ships with a default skin and a bright, large-touch-target kid-default skin (self-hosted Nunito font, no CDN dependency) that activates automatically with Kid Mode. Changeable independently from Profile → Experience.
  • Profile → Experience section: Shows your current mode, embeds the mode switcher, a skin picker, and Kid Mode PIN management (set on first activation; change requires re-verifying the current PIN in the same request).

See the Experience Modes Overview, Focus Mode, Kid Mode, and Skins & Appearance user guides for full detail.


v1.3.46 — Routine Builder, Task Checklists, Household Low-Stock, Routine Streaks/Skip​

Feature milestone

  • Routine navigation merged into Tasks: Routines is no longer a standalone top-level nav item (it was prone to overflowing into the mobile "More" dropdown on narrower screens). It's now a Board/Routines toggle inside the Tasks workspace itself — supersedes the "sibling view" navigation described in v1.3.44 below.
  • Build a routine from scratch: A new routine composer (+ New routine in the Routines tab) lets you create a template — name, description, color, group sharing, rotation strategy, recurrence, and task items — without needing to clone a system template first. Previously, cloning was the only way to get a routine template.
  • Task Checklists: A new sub-step list inside a single task (TaskChecklistItem), distinct from task dependencies (which link two separate tasks). Add, check off, rename, reorder, and remove checklist items from the task detail composer. New endpoints: GET/POST /api/tasks/:id/checklist-items, PATCH/DELETE /api/tasks/:id/checklist-items/:itemId.
  • Household Low-Stock Tracking: A new lowStockThreshold field on household items triggers the hourly restock scan independently of expiry/shelf-life — for items tracked by count rather than freshness (paper towels, batteries). A new POST /api/household-items/:id/consume endpoint reduces quantity by an amount (default 1) instead of only supporting the binary "mark used up."
  • Routine Completion Streaks: GET /api/routine-templates/:id/streak returns currentStreak/longestStreak/lastCompletedDate, derived from existing assignment-history + task-completion data (no new tracking table). Shown as a 🔥 badge on owned routine cards.
  • Skip A Routine Occurrence: POST /api/routine-templates/:id/skip marks today's occurrence as handled without creating tasks — useful for travel or holiday weeks — without disturbing rotation history.
  • MCP Coverage: New tools primecal_tasks_checklist_list/_add/_update/_remove, primecal_routine_templates_streak/_skip, and primecal_household_items_consume. primecal_household_items_create also accepts lowStockThreshold.

See the Tasks Workspace, Routines and Templates, and Household Inventory user guides, and the Tasks API, Routine Templates API, and Household Items API developer references for full detail.


v1.3.44 — Tasks Redesign: Routines, Auto-Scheduling, Household Inventory, Smart-Home Automation​

Feature milestone

  • Routine Templates: Reusable, recurring chore/checklist templates (RoutineTemplate + RoutineTemplateItem). Clone from a system template library into a personal or people-group copy. Start on schedule (daily cron check), by hand (POST /api/routine-templates/:id/instantiate — "Start now"), or from an automation rule.
  • Chore Rotation: Three rotation strategies per template — fixed, round_robin, and least_recently_done — resolved per item at instantiation time from the template's people group membership.
  • Household Fairness View: GET /api/routine-templates/fairness?groupId=X aggregates assigned/completed counts per person over a rolling window, to help spot lopsided chore distribution. API/MCP-only for now — no dedicated frontend screen yet.
  • Household Inventory: Shared item list (HouseholdItem) with quantity, category, expiry date, and shelf-life tracking. An hourly scan (HouseholdRestockSchedulerService) automatically creates a Restock: <item> task when an item is used up or close to expiring/exhausting its shelf life.
  • Focus View: GET /api/tasks/focus — a single, schedule-ordered daily list combining routine-instantiated and due tasks, excluding anything done or blocked by an incomplete dependency.
  • Auto-Scheduling: POST /api/tasks/:id/auto-schedule finds the task's next open calendar gap using its duration, priority (search horizon and high-priority window padding), and a deep_work context preference for roomier gaps, then sets its due date/time. Auto-scheduled tasks reflow automatically if a new calendar event conflicts with their slot.
  • Delegation with Confirmation: POST /api/tasks/:id/accept-assignment and POST /api/tasks/:id/bounce-assignment let the current assignee confirm or decline a delegated task; bouncing returns it to unassigned (assignmentStatus: bounced_back) with an optional logged reason.
  • Task Dependencies: POST /api/tasks/:id/dependencies / DELETE /api/tasks/:id/dependencies/:dependsOnTaskId — a task with an incomplete dependency is hidden from Focus until the dependency is done. Guards against self-reference and direct two-task cycles.
  • New Task Fields: durationMinutes, context (deep_work|errand|admin|kid_safe|low_energy), autoScheduled, preferredWindowStartHour/preferredWindowEndHour on CreateTaskDto/UpdateTaskDto.
  • Smart-Home Automation: The webhook automation action now supports a configurable HTTP method (GET|POST|PUT|PATCH|DELETE) and auth (none|bearer|basic|header), enabling real smart-home REST integrations (e.g. a Home Assistant service call) in addition to plain webhook posts. A new instantiate_routine action lets any trigger — including the new task.status_changed and task.scheduled_start triggers — start a routine template on demand.
  • MCP Coverage: New tools primecal_tasks_focus_list, primecal_tasks_auto_schedule, primecal_tasks_accept_assignment, primecal_tasks_bounce_assignment, primecal_tasks_dependencies_add/_remove, primecal_routine_templates_list/_clone/_instantiate, and primecal_household_items_list/_create/_mark_used_up.
  • New Navigation: The Tasks workspace nav bar now shows Calendar/Tasks/Focus/Household/Routines as sibling views instead of nesting these concepts under Tasks.

See the Tasks Workspace, Routines and Templates, Focus and Scheduling, Household Inventory, and Smart-Home Automation user guides, and the Tasks API, Routine Templates API, Household Items API, and Automation API developer references for full detail.


v1.3.4 — i18n, Pool Booking, Payment Integration​

Feature milestone

  • Internationalization (i18n): Full multi-language support (English, Hungarian, German, French). Language switcher on public pages. NestJS i18n integration for backend messages. BOM and encoding validation for translation files.
  • Pool Booking System: Complete reservation and pricing system for pool/resource facilities. Configurable time slots, real-time availability, conflict prevention.
  • Payment Integration: Stripe-based payment processing for public bookings. Invoices in user language, refund management, transaction history.
  • Mobile App (v1.2.5): Strict build policy introduced — mobile builds only on explicit request. Web changes apply automatically via Capacitor sync.
  • Translation audit: Validation parity checks across all four locales.

v1.3.0 — Calendar Automation System​

Feature milestone.

  • Automation Rules: Complete rule-based automation platform with 9 trigger types, 12 condition fields, 15+ operators, and plugin-based action executor architecture.
  • Webhook Trigger: Rules can be triggered by external HTTP POST with any JSON payload. Smart value dot-notation extracts payload data into conditions.
  • HMAC Webhook Signing: Per-rule signing secrets with rotation grace period.
  • Audit Logging: Circular buffer (1000 entries per rule) with full per-condition and per-action traces.
  • Retroactive Execution: "Run Now" feature with 1-minute cooldown rate limiting.
  • Feature Flags API: GET /api/feature-flags — public endpoint for frontend feature control.
  • Admin Usage Plan Management: PATCH /api/admin/users/:id/usage-plans.
  • Extended Color Palette: 16 total theme colors in rainbow order (Sky #0ea5e9 and Violet #7c3aed added).
  • Subscription Plan System: plan_features, plan_limits, user_entitlements, FeatureAccessGuard introduced (off by default: ENABLE_SUBSCRIPTIONS=false).

v1.2.0 — External Calendar Sync​

Feature milestone.

  • Multi-Account External Calendar Sync: Multiple Google Calendar and Microsoft Outlook accounts per user. external_calendar_accounts table. OAuth flow per account.
  • Sync Status: Per-account sync status, last sync time, manual refresh.
  • UUID Extension Removed: Sync accounts no longer depend on the PostgreSQL uuid-ossp extension.

v1.1.9 — Mobile-First UI Overhaul​

Feature milestone

  • Atomic Design Component Library: Full component hierarchy (Atoms → Molecules → Organisms → Templates).
  • Bottom Tab Bar: Mobile navigation with role-based and feature-flag-aware visibility.
  • Mobile Calendar Views: MobileMonthView (event dots), MobileWeekView (scrollable time slots), DayDetailSheet (bottom sheet for day events).
  • Swipe Gestures: Left/right calendar navigation with haptic feedback.
  • Touch-Optimized Controls: 44px+ touch targets (WCAG AAA). Pull-to-refresh support.
  • Hour Format Settings: 12h/24h user preference propagated to WeekView and CalendarEventModal.
  • Comprehensive Timezone Support: 70+ IANA timezones across all continents.
  • Week View Drag Selection: Mouse drag to create events with pre-filled time range.

Patch Notes​

Patch versions (e.g., 1.3.1 → 1.3.35) are incremented for every deployment. Individual patch changelogs are maintained in git commit history. Use git log --oneline for granular patch-level changes.

git log --oneline --since="2026-01-01"