◆ Changelog

What changed.
Plainly, in order.

Public releases below, with upcoming release notes labeled before they ship. Follow GitHub releases for RSS.

v1.9.26
July 2026
CurrentPublic beta

Files that look like secrets are never auto-attached to tasks anymore, even when an agent note mentions them by path.

Fixed

  • When an agent note or agent-job result mentioned a file path, Qalatra auto-attached the file with no restrictions beyond a size cap — so a note referencing something like ~/.ssh/id_rsa, a .env file, or a stored API token attached the live secret to the task. Auto-attach now refuses files in sensitive directories (.ssh, .aws, .config, .gnupg, .kube, and similar), files whose names look like secrets (token, secret, credential, password, api-key, .env variants, private-key extensions, shell history), and any file whose contents start with a PEM private-key header. Both the mentioned path and its symlink target are checked. Normal agent outputs — PDFs, CSVs, markdown, JSON, images — attach exactly as before, and anything caught by the filter can still be attached manually.
v1.9.25
July 2026
Public beta

Heartbeats can now be enabled or disabled idempotently, closing a race where agents could accidentally re-arm a paused heartbeat.

Added

  • The update_heartbeat MCP tool (and the matching API endpoint) now accepts an active field: setting it to false pauses the heartbeat, true resumes it and schedules the next run, and repeating either is a safe no-op. Previously the only way to pause a heartbeat was toggle_heartbeat, a blind flip — if another agent had already changed the state, calling it undid that change. Tool descriptions now steer agents to the idempotent call whenever they need a heartbeat to be definitely on or definitely off.

Fixed

  • Cloudflare tunnel installs that include MCP ingress no longer silently drop it.
v1.9.24
July 2026
Public beta

Heartbeat timestamps now agree with each other: last-run times are stored in UTC like the rest of the scheduler.

Fixed

  • A heartbeat’s recorded last-run time was written in the server’s local timezone while its next-run time was stored in UTC, so the two disagreed by the machine’s UTC offset and the “Last: … ago” label in the Heartbeats view was off by the same amount. Both scheduler columns are now UTC; existing rows self-correct on their next run. Heartbeat firing itself was never affected.
  • Patched vulnerable transitive dependencies flagged by security scanning across the desktop and mobile lockfiles — no functional changes.
v1.9.23
July 2026
Public beta

One straggler from the correctness sweep: the morning-briefing rollover path now preserves all task fields.

Fixed

  • Recurring tasks that roll over during the morning briefing no longer lose their time estimate or inbox flag on respawn. The v1.9.22 fix covered two of the three recurrence-spawn code paths; this closes the third, so all paths now preserve fields identically — and the briefing’s own capacity math no longer under-counts its respawned tasks.
v1.9.22
July 2026
Public beta

A deep correctness sweep: 26 bugs found and fixed across recurrence, MCP, and the HTTP API, verified by a new regression suite.

Fixed

  • Weekly and monthly recurring tasks no longer collapse to “tomorrow” when completed — the next occurrence lands on the correct RRULE date, and the recurrence rule, priority, context, and other fields are preserved on every respawn.
  • Completing a recurring task by setting its status to done now spawns the next occurrence exactly like the dedicated complete action, without duplicates even when rollovers run concurrently.
  • Read-only MCP tokens can no longer mutate data — token scope is enforced on every write tool.
  • MCP task updates handle fields correctly: explicit nulls clear a field instead of being ignored, and project upserts plus timestamped ai_context entries stay in chronological order.
  • Event auto-complete no longer fires early for late-night events, and server timestamps use local time instead of UTC (which pushed dates a day off).
  • Editing a heartbeat schedule recomputes its next run time, batched agent jobs each get their own spec file instead of clobbering one another, and a failed job spawn no longer leaks a concurrency slot.
  • The HTTP API returns proper error semantics: missing tasks are a 404, invalid snooze dates are rejected, and date fields default sensibly.
  • A pending database restore is now applied on headless server startup, and task deletion is transactional.

Changed

  • Pure task logic is now single-sourced in a shared module used by both the server and the database worker, so the two can no longer drift apart.
  • A standalone regression suite (10 scripts covering recurrence math, MCP scope, respawn behavior, heartbeats, and restore) now guards these paths.
v1.9.21
July 2026
Public beta

Unattended server stability hardening.

Fixed

  • Terminal WebSocket errors are now handled and cleaned up instead of becoming uncaught exceptions when a client sleeps, disconnects, or changes network state.
  • Background agent completion no longer leaves async database writes as unhandled promise rejections. Job persistence, note insertion, auto-attachment, and completion notifications are logged independently.
  • Agent result auto-attachment is non-fatal: if a mentioned file path cannot be attached, the agent note still lands on the task.
  • When Electron owns the local Qalatra Server child process, unexpected exits now trigger an automatic restart after a short delay.

Added

  • Qalatra Server now records unhandled rejection and exception details in server-crash.log inside the active data directory, including Linux headless installs.
v1.9.20
June 2026
Public beta

Mobile agent assignment is now available, and Tools reconnects cleanly.

Added

  • The mobile task create and detail screens can assign agents with a searchable picker filtered by the task context and project.

Fixed

  • Tools now uses one reconnect action on desktop and mobile. It creates a fresh Box Web proxy session and keeps the current path, avoiding stale-ticket 401/Unauthorized screens after a session expires or a server restarts.
v1.9.19
June 2026
Public beta

Tools refresh preserves the current proxied path.

Changed

  • Initial route-preserving Tools refresh support landed for the Box Web proxy, including no-store headers and path preservation when reconnecting after an expired ticket.
v1.9.18
June 2026
Public beta

Terminal touch scrolling actually works now, and removing a session really removes it.

Fixed

  • Touch-drag scrolling in the mobile/iPad terminal now genuinely works. The earlier attempts scrolled the wrong thing — the terminal runs tmux, whose history isn’t in the browser’s scrollback — so a finger drag now sends the same wheel scrolling a trackpad does, and tmux scrolls its history. Verified end-to-end on a real iOS engine.
  • Removing a terminal session now kills it (if still running) and deletes it in one step, on both desktop and mobile. Previously, removing an already-exited session just reordered the list instead of deleting it. Desktop’s separate Kill and Remove buttons are now a single button.
v1.9.17
June 2026
Public beta

Mobile terminal scrolling reliably reaches your device (stale-cache fix).

Fixed

  • The mobile/iPad terminal could keep running an old version of its screen even after you updated your backend, because the app was caching it. The backend now tells the app never to cache the terminal (and markdown editor) screen, and the app fetches a fresh copy each time it opens — so fixes like the 1.9.16 touch-scrolling change actually take effect once your backend is updated.
  • Touch-drag scrolling in the terminal is verified working with an automated test, so it won’t silently regress.
  • As always, the terminal is served by your backend — update the backend your mobile/iPad clients connect to, then reopen the terminal.
v1.9.16
June 2026
Public beta

Mobile terminal: touch-drag scrolling now actually works.

Fixed

  • You can now drag a finger to scroll back through history in the mobile/iPad terminal. The 1.9.15 attempt stopped the whole page from moving but didn’t actually scroll the terminal — it used an older xterm scrolling method that the current version ignores. This release drives the terminal’s own scroll API, so a single-finger drag moves through scrollback as expected (trackpad scrolling already worked).
  • The terminal page is served by your backend, so update the backend your mobile/iPad clients connect to for the fix to take effect there.
v1.9.15
June 2026
Public beta

First attempt at mobile terminal touch scrolling (completed in 1.9.16).

Fixed

  • Stopped the whole terminal page from rubber-banding/moving when you dragged a finger on mobile. (Scrolling the terminal itself with touch landed in 1.9.16.)
v1.9.14
June 2026
Public beta

Hotfix: backend no longer crashes when a device opens the terminal or editor.

Fixed

  • Fixed a crash where the Qalatra server could exit (and restart-loop) the first time a connected device opened the new mobile terminal or markdown editor. Update to 1.9.14 if you run a backend that mobile/iPad clients connect to.
v1.9.13
June 2026
Public beta

Groundwork for the Qalatra mobile/iPad app — your backend now serves it.

Added

  • Your Qalatra backend can now serve the markdown editor and a full terminal to the upcoming iPhone/iPad app — the same paginated markdown editor and embedded shell you use on the desktop, reached from any device that connects to your server.
  • Both are served by the backend that runs the terminal/files, so they work the same whether that backend is your laptop or a remote box.
v1.9.12
June 2026
Public beta

Drag or paste images straight into the embedded terminal.

Added

  • Drag an image onto the embedded terminal — or paste a screenshot — and its file path is dropped at the prompt, ready for a CLI like Claude Code to read it as an image.
  • Images are saved on the machine the terminal actually runs on, so it works whether your backend is local or a remote server, not just the laptop running the app.
  • A clear notice now appears in the terminal if an image upload fails, instead of the drop silently doing nothing.
v1.9.11
June 2026
Public beta

Markdown editor: the Style panel works again, the slide-up Terminal/Chat renders right, and the font picker grows up.

Added

  • Font picker overhaul in the markdown editor (Style → Typography): fonts are sorted alphabetically, you can type any custom font name, your full set of installed system fonts is available, and the complete Google Fonts catalog is now selectable.
  • Font files still download only when a font is actually chosen, so the longer lists add no load.

Fixed

  • The markdown editor’s Style panel is interactive again — a stray window-drag style had been swallowing every click, leaving the whole panel inert.
  • The Terminal and Chat slide-up panel in the markdown editor now renders over the document instead of as a black bar, and closes together with the editor.
v1.9.10
June 2026
Public beta

Sturdier agent workers.

Fixed

  • Templated agent commands are shell-quoted, so task titles and descriptions with spaces or apostrophes no longer break the launched command.
  • Failed agent jobs now record sanitized launch diagnostics (cwd, shell, PATH, config presence — never token values) to make troubleshooting headless workers far easier.
v1.9.9
June 2026
Public beta

Dynamic Box Web apps can use their normal /api paths inside Qalatra.

Fixed

  • Dynamic Box Web apps that call root-absolute API paths like fetch('/api/inbox') now work inside the sidebar embed.
  • The Box Web iframe injects a small runtime shim that rewrites fetch, XMLHttpRequest, EventSource, and navigator.sendBeacon calls through the session-scoped /api/box-web/proxy/<ticket>/... URL.
  • Bare Qalatra /api/* routes remain protected by bearer auth; this hotfix does not open a global unauthenticated API proxy.
v1.9.8
June 2026
Public beta

Private box-local web tools can live inside Qalatra now.

Added

  • Box Web Apps. Each saved remote instance can opt into one sidebar item that embeds that box's private http://127.0.0.1:8080 web app.
  • Settings -> Instances -> Box Web Apps now has a per-box enable switch and configurable label, so remote-first setups can add a Tools page without cluttering local-only installs.
  • Qalatra Server now exposes an authenticated /api/box-web proxy. The desktop client creates a short-lived session ticket with the existing bearer token, then loads the iframe without giving the embedded page the permanent Qalatra token.

Changed

  • The Box Web proxy intentionally starts narrow: one loopback target on port 8080 per remote box. It rewrites root-relative HTML links/assets and CSS url(/...) references so static dashboards and root tool pages work through the authenticated server connection.
  • Public tools hostnames such as tools-<box>.qalatra.com remain optional for access outside Qalatra; they are no longer required for desktop embedding.
v1.9.7
June 2026
Public beta

Startup defaults for remote-first work. Document terminals are real terminals again.

Added

  • Instance startup defaults. Settings -> Instances now lets you choose which saved instance Qalatra uses when the app starts, independent of the currently selected instance.
  • Hide Local. Remote-first users can hide the Local tab from the header while keeping the local server available for fallback and service management.
  • New remote instances can be saved and immediately set as the startup default from the same flow.

Fixed

  • Document Terminal and Chat now open server-backed terminal sessions instead of the old Electron-only slide-up PTY. Terminal opens in the document folder, and Chat launches the configured default agent with the document context.
  • The slide-up terminal now uses the same tmux/WebSocket transport as remote terminals, so it works against the active Qalatra server instead of assuming the local desktop runtime.
  • Terminal startup now falls back safely when a configured working directory no longer exists, avoiding a blank black terminal panel.
v1.9.6
June 2026
Public beta

Copy from terminals actually works now.

Fixed

  • Copying text out of terminals now works. The desktop preload runs sandboxed, where Electron’s clipboard module isn’t available, so every previous copy path silently failed. Clipboard writes now route through the main process over IPC.
  • Remote/agent terminals copy to your local clipboard over the wire. tmux now exports copy-mode selections via OSC 52, which the app catches and writes to the system clipboard — so a normal mouse drag-release in a remote terminal copies straight to your Mac. Cmd+C (and Ctrl+Shift+C) also copies the current selection.
v1.9.5
June 2026
Public beta

MCP over the internet. Authenticated, tunneled, no SSH required.

Added

  • MCP bearer-token authentication. The MCP server (port 3457) now validates the same tokens as the Qalatra API — sha256-hashed, revocable, expiry-aware, with last_used_at tracking on every call. Any token you create in Settings → Instances → Access Tokens works for both API and MCP.
  • Three auth modes via QALATRA_MCP_AUTH: local-bypass (default, loopback skips auth — back-compat for desktop and same-box Claude Code), required (every request needs a token, use this on any tunneled box), off (opt-out). Set it as Environment= in the systemd service.
  • Remote MCP via Cloudflare Tunnel is now supported. Add an mcp-<box>.qalatra.com ingress to your cloudflared config, set QALATRA_MCP_AUTH=required, and connect from any Claude Code instance: npx -y mcp-remote https://mcp-<box>.qalatra.com/mcp --header "Authorization: Bearer <token>"

Fixed

  • Authorization header added to MCP CORS Allow-Headers so browser-based MCP clients can send tokens.
v1.9.4
June 2026
Public beta

Terminal scroll is back. Headless servers update themselves.

Fixed

  • Terminal scroll works again. Mouse wheel now scrolls through output history via tmux copy mode. The trade-off: normal click-drag no longer auto-selects (tmux intercepts it). Hold Shift while dragging to select text — copy-on-select still fires and writes to the clipboard automatically. Existing sessions need to be killed and recreated to pick up the change.
  • Terminal connections no longer drop silently when Qalatra is backgrounded or behind a proxy. A 25-second WebSocket ping keeps the connection alive through NAT and proxy idle-timeouts.
  • Unexpected disconnects (network blip, server restart) now auto-reconnect with exponential backoff — up to 8 retries before asking you to click Reconnect. Intentional switches (changing sessions, clean PTY exit) are not retried.

Added

  • Headless auto-update for Linux servers. A systemd timer (qalatra-updater.timer) installed alongside qalatra-server.service checks GitHub releases every 6 hours. When a newer version is published it fetches the tag, rebuilds native modules, and restarts the service automatically. Fresh installs get this automatically; existing servers can enable it by re-running install-linux-server.sh from the 1.9.4+ checkout.
v1.9.3
June 2026
Public beta

CI is green again.

Fixed

  • Bumped concurrently from 9.x to 10.x. The old version pulled in shell-quote with a critical security advisory that was failing CI on every commit without affecting the release build. npm audit is now clean.
v1.9.2
June 2026
Public beta

Copy-out from remote terminals, for real this time.

Fixed

  • Remote terminal copy-out now works reliably. The root cause: if the remote server's tmux.conf has "set -g mouse on", tmux intercepts mouse selections on the server and copies to its own paste buffer — xterm on your Mac never saw the selection and nothing reached the clipboard. Qalatra now disables mouse mode on every tmux session it creates, so xterm handles selection natively on the client side.
  • Terminal copy mechanism switched to copy-on-select. Selected text is written to the Mac clipboard immediately via Electron's native clipboard API as soon as you finish selecting — no Cmd+C needed. Previous Cmd+C interception approaches failed because Electron's menu accelerator grabs the key before JavaScript sees it.
  • Note: existing terminal sessions need to be killed and recreated to pick up the mouse mode change. New sessions work automatically.
v1.9.1
June 2026
Public beta

Two bugs squashed.

Fixed

  • Resuming a paused heartbeat via MCP now works. toggle_heartbeat was calling an undefined function and throwing a ReferenceError, leaving the heartbeat permanently paused. It now correctly schedules the next run using the heartbeat's interval, run_at_time, and minute_offset so clock-aligned schedules are preserved on resume.
  • Copy-out from the remote terminal on Mac. Cmd+C (or Ctrl+C) with selected text now writes to the clipboard instead of sending an interrupt to the shell. With nothing selected, the key passes through normally.
v1.9.0
June 2026
Public beta

A terminal you can actually use. A file tree that stays put.

Added

  • Per-folder file creation in the workspace file tree. Hover any directory to reveal a + button. Clicking it opens an inline form directly inside that folder showing the parent path as a label — type only the filename and press Enter. The tree expands the target directory and stays expanded after the file is created.
  • Workspace root auto-expand. The first level of the file tree now loads automatically on open so you see your files without clicking anything.
  • Instance switcher tabs in the header. The terminal toggle button is replaced by a tab strip showing Local plus each saved remote instance. Click to switch; the app reloads on the new server.
  • Session rename. A Rename button in the terminal actions row puts the toolbar title into edit mode. Enter or blur saves; Escape cancels. Title updates without leaving the session.
  • Reconnect button in the terminal toolbar. When a session goes dormant and shows the disconnect message, click Reconnect to reattach — no need to navigate away and back.

Fixed

  • Terminal focus on session select. xterm now receives keyboard focus automatically when you pick a session, so keypresses go to the shell immediately instead of triggering app-level shortcuts.
  • Daily note redirect while typing in the terminal. The d keyboard shortcut (open daily note) was firing when typing inside the terminal pane. The shortcut guard now ignores keystrokes inside .ide-terminal-xterm.
  • tmux not installed error. The raw Node ENOENT error is replaced with a clear install instruction: brew install tmux on macOS or sudo apt install tmux on Linux.
  • Done event visual state. Completed calendar events now show a static ✓ indicator and fade to 45% opacity with a strikethrough title — they stay visible but recede so the day view stays scannable.
  • Done events no longer counted as "done today" tasks. The doneToday query excludes events so the done-count badge reflects tasks only.
  • Triage tool now excludes reading-lane tasks in addition to events, matching the behavior of the daily briefing tools.
  • Use Local Server button now works even when the local server token is absent — clicking it clears the active remote instance and reloads without requiring a token check first.
v1.8.0
June 2026
Public beta

Know what your day costs. Events that clean themselves up.

Added

  • Time estimates on tasks. Set how long something will take using preset chips in the detail panel — 15m, 30m, 1h, 1.5h, 2h, 4h. Click the active chip to clear it. Stored in minutes so estimates are easy to sum.
  • Capacity banner in the today view. A live summary above the task list shows total estimated time for actionable tasks ("⏱ 5h 30m estimated") plus a count of tasks with no estimate set — so you know at a glance how loaded the day actually is.
  • Capacity summary in morning_briefing. The MCP tool now returns a capacity object with estimated_minutes, tasks_with_estimate, and tasks_without_estimate summed across overdue and due-today work. Agents can answer "how screwed are we today?" without doing their own math.
  • Time estimate badge on task rows. When an estimate is set, a ⏱ Xh Ym chip appears next to the energy indicator in the task list.
  • Event done button. A ✓ button on every calendar event card lets you mark it complete instantly without opening the detail panel.
  • Event auto-complete. Timed events whose end time has passed are automatically marked done on the next today-view load — no manual cleanup needed at the end of the day. Past-day events are also swept. All-day events are left for manual action.

Changed

  • Reading-lane tasks excluded from operational briefings. morning_briefing, afternoon_briefing, and get_overdue_tasks now exclude task_type=reading tasks by default. Reading items were surfacing as overdue action items in daily agent briefings and causing confusion.
  • task_type and tags added to all compact MCP SELECT outputs so agents can filter edge cases that reach them through other tools.

Fixed

  • MCP create_task and update_task now persist time_estimate instead of only exposing it in the tool schemas, so external agents can reliably write task estimates after an MCP restart.
v1.7.0
May 2026
Public beta

Task search. Find anything, instantly.

Added

  • Task search bar in the Priority view. Type to filter the current screen live — matches against title, description, notes, context, project, tags, source URL, and AI context across all tasks currently loaded.
  • Search all mode. Toggle from "This screen" to "Search all" to hit the backend and find matching tasks across every status — Active, Backlog, Snoozed, Done, Archived — all grouped clearly in the results pane.
  • / keyboard shortcut. Press / from anywhere in the Priority view to jump directly to the search bar without reaching for the mouse. Listed in the ? shortcut reference overlay.

Changed

  • Project Dashboard now surfaces context-level agents — agents registered with a context but not pinned to a specific project — grouped alongside that context's project list. Context groups sort by the order you registered them.
v1.6.0
May 2026
Public beta

Remote instances, Linux headless servers, trust signals, and built-in agent operations.

Added

  • Qalatra Server: a headless HTTP API runtime that owns SQLite, MCP startup, background workers, agent jobs, heartbeats, attachments, backups, tokens, and encryption key access.
  • Settings -> Instances: the desktop app can connect to the local Qalatra Server or switch to a saved remote server URL and bearer token.
  • Linux headless install scripts: bootstrap a dedicated agent box on Debian/Ubuntu, rebuild native modules for system Node, install a user systemd service, and optionally expose the API through a Qalatra-only Cloudflare Tunnel.
  • Agent IDE: separate Terminals and Files views for remote boxes. Terminal sessions are backed by tmux so they can keep running after the client disconnects, and Files provides authenticated workspace browsing plus text editing.
  • Registered-agent terminal launch: start a terminal in an agent folder from a searchable picker grouped by context, project, and agent name.
  • Trust signals for tasks: hard deadlines, stale review indicators, and dependency blocking relationships.
  • Capability registry and daily-note memory search so agents can advertise what they do and recover relevant historical notes more reliably.
  • Automatic attachment recovery for local files mentioned in agent comments, even when the agent did not explicitly attach the file through MCP.
  • Token management: create, list, revoke, and expire full-access client tokens for desktop and future remote clients.

Changed

  • The UI data path moves from Electron data IPC to authenticated /api/v1 HTTP endpoints. Electron still handles desktop shell work such as updater, terminal, menus, file-open events, and local server lifecycle.
  • MCP remains local-only on port 3457. The public tunnel exposes only the Qalatra API on port 3456 and relies on Qalatra bearer tokens, not Cloudflare Access login pages.
  • Task rows no longer render every attachment and link chip. The overview stays scannable, while links and attachments remain available in the task detail panel.
  • Linux server installs now require tmux, create ~/workspaces by default, and refresh npm dependencies every time the installer runs so existing headless boxes can be updated safely.

Removed

  • The temporary /api/rpc bridge is removed. Clients use named API endpoints instead of channel-based RPC.
v1.5.4
May 2026
Public beta

Agent session surfacing. Configurable agent timeouts. MCP done-task visibility fix.

Added

  • Resume session button in the task detail panel. When an agent job finishes (done or failed), a "Resume session" button appears if the job has a session ID. Clicking it opens your terminal to the agent's working directory and runs claude --resume {session_id} — dropping you directly into an interactive continuation of that agent session without having to copy IDs or navigate folders manually.

Changed

  • Agent timeout is now configurable per-agent via the timeout_minutes field in agent.config. Previously every agent was hard-capped at 15 minutes regardless of the task. Agents running long research or generation tasks can now be given more runway.
  • Sidebar badge moved from the Code section to Priority. The badge counts active agent jobs — those are tasks in the Priority queue, not coding tasks — so the indicator now appears next to the section it actually reflects.

Fixed

  • Tasks marked done via the MCP update_task tool were disappearing from the done view. The tool was setting last_touched_ai but not last_touched_human on the done transition — and the done view filters by last_touched_human. Agent-completed tasks now appear correctly alongside manually-completed ones.
  • Missive icon was a generic email envelope. Now shows the real Missive crossed-M brand logo.
v1.5.3
May 2026
Public beta

Clock-aligned heartbeats. Real platform icons. Links and Attachments, properly organized.

Added

  • Heartbeat clock alignment (minute_offset). Sub-daily heartbeats can now be pinned to specific clock positions. Set interval=30, offset=0 and the agent fires at :00 and :30 past every hour. Set offset=15 and it fires at :15 and :45. Set interval=60, offset=30 and it fires at :30 past every hour. Without an offset the agent fires relative to whenever it was created — with one, it snaps to the clock. The offset picker appears automatically in both the create and edit forms whenever you pick an interval that supports it (30 min through 12 hours).

Changed

  • Links and Attachments now have their own labeled section headers in the task detail panel. Previously the platform chips (Missive, Notion, Asana…) floated above Attachments with no heading. Now: Links header with a + button shows all platform chips beneath it; Attachments header with the paperclip button shows doc links and uploaded files beneath it.
  • Agent list in Settings redesigned as a responsive card grid grouped by context then project. Context groups are collapsible — state persists across sessions via localStorage. Agents that belong to a specific project appear under a project sub-header; context-wide agents are listed directly under the context. Previously it was a flat list with no grouping.
  • Platform icons updated to use real brand assets. Asana now shows the three-circle logo with the brand's yellow-to-red radial gradient. Notion now shows the correct N lettermark (the blocky diagonal N from the official brand, not a generic zig-zag). Missive now shows the crossed-M logo (two diagonal strokes with outward curves at the top) instead of a generic email envelope.

Fixed

  • Clicking a link in task descriptions or notes was opening the URL inside the Electron window — navigating away from the app. External http/https links now always open in the system browser via Electron's will-navigate handler.
  • MCP server hangs on long-running tool calls. The previous timeout called req.destroy() which closed the HTTP layer but left the SSE socket alive, so the connection kept blocking. The fix calls req.socket.destroy() to sever the underlying TCP connection, paired with a httpServer.setTimeout() backstop. A /health endpoint was also added so uptime checks don't need a tool round-trip.
v1.5.2
May 2026
Public beta

Windows CI fixed. Recurrence now accepts full RRULE strings.

Fixed

  • check-imports.mjs crashed on Windows CI runners with "Cannot parse files: section from electron-builder.yml". The script was reading CRLF line endings verbatim — the regex expected Unix newlines and never matched. Line endings are now normalized before parsing, so the pre-build guard works correctly on both macOS and Windows.

Changed

  • create_task and update_task MCP tools now explicitly document RRULE string support in the recurrence field. Passing FREQ=WEEKLY;BYDAY=MO pins a weekly task to Monday regardless of when it's completed — the backend already supported full RRULE strings, but the tool description only listed the four shorthand values (daily, weekdays, weekly, monthly), so Claude wouldn't use the more precise form.
v1.5.1
May 2026
Public beta

Encryption module bundled correctly. CI now catches missing files before build.

Fixed

  • crypto.js was missing from the electron-builder files list. The app would crash on launch after a clean install because the encryption module wasn't included in the bundle. Added check-imports.mjs — a pre-build script that walks all Electron entry-point imports and verifies every file is covered by the builder's files list. CI now catches missing bundled files before the expensive code-sign and notarize cycle.
v1.5.0
May 2026
Public beta

Your data, encrypted. Settings, organized. Backups that just work.

Added

  • Encrypted cloud backups. Qalatra now backs up your task database to a dedicated R2 bucket using AES-256-GCM client-side encryption — the key never leaves your machine unencrypted. Backups fire automatically every hour, on app quit, and on demand from Settings. 30-day retention is enforced automatically. Restore from any backup with a single click; the app applies it on the next launch.
  • Encryption key management. Generate a 32-byte key stored in macOS Keychain via Electron safeStorage. Export it as base64 to store in 1Password or on a recovery drive. Import it on a new machine to restore access to your encrypted data. Encryption is optional — the app works without a key, but backups and attachment uploads will be unencrypted.
  • Encrypted attachments. Files uploaded to R2 after generating a key are encrypted before upload. Opening an encrypted attachment downloads and decrypts it locally before opening — nothing unencrypted touches the cloud.
  • Settings export / import. Export all your settings (S3 credentials, bucket names, agent config) as JSON for your recovery kit. Import JSON on a new machine to restore configuration instantly.
  • Settings redesigned as a full-screen tabbed view. Settings is now a proper sidebar section — same navigation as Priority, Code, and Reading. Five tabs: General (appearance, terminal, MCP), Storage (S3/attachment config), Encryption & Backup, Contexts, and Agents (with a Rescan button).
  • Agent dropdown optgroups. The Projects and Agents selectors in the task detail panel now use subheadings — Code Repos vs Projects, and Context-wide vs Project-specific — so you can tell at a glance which tier an option belongs to.
  • Heartbeat log expansion. Long agent run results in the Heartbeats history are truncated to a preview with a "show more" toggle to reveal the full output inline.

Fixed

  • Agent filtering in detail panel. Agents from unrelated projects were appearing in the agent dropdown when a task had a project set. The fix: only the explicit project field in agent.config is used for filtering — no folder-name fallback that could match incorrectly.
  • Boolean fields in update_task crashing. Passing inbox: true from Claude MCP threw a SQLite binding error ("unsupported parameter type"). Booleans are now coerced to 0/1 before binding in both the IPC handler and the MCP tool.
v1.4.2
May 2026
Public beta

MCP works in dev without manual rebuilds. Recurring tasks keep their checklists.

Fixed

  • Dev MCP server ABI mismatch. After pnpm run electron-dev, the MCP server was crashing because rebuild:electron compiled better-sqlite3 for Electron's ABI, then the server ran under system Node with a different ABI. The dev server now uses the same Electron binary (ELECTRON_RUN_AS_NODE=1) as the production launchd service — one rebuild step covers everything. No manual npm rebuild needed.
  • Recurring tasks now carry forward their notes field and attached links. Previously, completing a recurring task would spawn the next occurrence with only the title, description, priority, context, and agent assignment — the task's checklist or notes were silently dropped. Timestamped note entries (the comments log) still clear on each recurrence, which is correct.
v1.4.1
May 2026
Public beta

MCP server now runs on the right runtime — permanently.

Fixed

  • MCP server native module ABI mismatch. The launchd MCP service was running under system Node, but better-sqlite3 inside the app bundle is compiled for Electron's Node runtime. These ABIs diverge whenever Electron updates, causing all MCP calls to fail. The service now uses the Electron binary itself (with ELECTRON_RUN_AS_NODE=1) so the runtime always matches the bundled module — regardless of what Node.js version is installed on the system. The fix is automatic on next app launch.
v1.4.0
May 2026
Public beta

Navigate your entire task list without touching the mouse.

Added

  • Keyboard shortcuts — navigate the full app without a mouse. Number keys 1–7 jump directly to any sidebar section (Priority, Code, Reading, Projects, Backlog, Habits, Heartbeats). Press j / k to move through task rows; c to complete the selected task; b to send it to the backlog. d opens Daily Note, , (comma) opens Settings, t toggles the terminal. Press ? at any time to show the full shortcut reference.
  • Shortcut reference overlay — press ? to reveal a clean reference card listing every shortcut, organized by Navigation, Tasks, and Help categories. Click anywhere outside or press Escape to dismiss.
  • Play button for agent tasks — tasks created with a code agent assignment now sit in your inbox until you click ▶. Clicking Play routes the task to the Code view and queues the agent job. Previously, MCP-created tasks with task_type=coding would auto-route immediately with no user confirmation.
v1.3.1
May 2026
Public beta

Agents that run while you sleep. An MCP server that outlasts the window.

Added

  • Heartbeats — persistent scheduled agents that fire on a fixed interval. Configure a Claude Code agent path and a prompt; Qalatra queues the job, runs it, and tracks done/failed/pending counts. Intervals range from every 5 minutes to daily at a specific time (e.g. "every day at 8:00 AM"). Pause and resume without losing the schedule.
  • Heartbeats view — new ⚡ sidebar section. Create, configure, and monitor all heartbeat agents from one place. Shows live countdown to next run, run history counts, and inline toggle to pause/resume. Full edit form with agent picker and interval selector.
  • MCP server as a persistent system service (production). On first launch, Qalatra installs the MCP server as a macOS login item (launchd). It starts on boot, stays running whether or not the Electron window is open, and survives Electron restarts. App updates automatically reload the service — no manual steps. Claude's MCP connection is always alive.
  • MCP heartbeat tools — `create_heartbeat`, `list_heartbeats`, `update_heartbeat`, `delete_heartbeat`, `toggle_heartbeat`, `list_heartbeat_jobs`. Claude can now configure and monitor scheduled background agents entirely via MCP.
  • `assigned_agent` field on tasks. Tracks which agent is assigned to a task for filtering and display.

Fixed

  • Stale MCP server processes from previous sessions are now automatically evicted on startup. Previously, a leftover process would hold port 3457 and force a manual kill before the app could connect.
  • MCP server no longer runs inside Electron's utility process, eliminating the native module ABI mismatch that caused DB failures after certain Node version changes.
v1.2.2
May 2026
Public beta

A new sidebar. A new way to route work. Everything in its place.

Added

  • Left sidebar navigation. Replaces the top tab bar with a persistent 160px sidebar: Priority, Code, Reading, Projects, Backlog, Habits. Handles the macOS traffic-light drag zone cleanly. Active agent count badge on the Code item.
  • Reading view. New task_type = 'reading' routes tasks — articles, docs, anything to read later — to a dedicated 📖 Reading section and off Priority. Assign via the detail panel or via MCP.
  • Task type toggle in the detail panel. Any task now shows a Type row with ⌨ Coding and 📖 Reading pills. One click routes the task to the right view; click again to reset. Hidden for events and reminders.
  • Code view with Idle section. Tasks with task_type = 'coding' now show in three sections: Running, Queued, and Idle. Previously, coding tasks with no active agent job were silently invisible. Fixed.
  • MCP server auto-restart via launchd. A launchd plist supervises the MCP server at port 3457 — crashes recover in under 5 seconds. Port conflicts now retry every 30s instead of crashing. New ping tool lets agents verify MCP is alive before starting a pipeline run.
  • Project combobox in new-task form. The project field is now a context-aware combobox: options are filtered to projects assigned to the selected context. Free-text entry still works for new project names.
  • Live agent filtering in new-task form. The agent dropdown narrows in real time as context and project change. Selecting a context or project immediately removes agents that don't match.
  • Projects dashboard. New ⊞ Projects view groups all active tasks by context → project, with per-project agent lists and recent completed tasks.

Fixed

  • Code view was empty when coding tasks had no active agent job. Running/Queued sections rendered fine; Idle tasks were fetched but never displayed.
  • Changing context in the new-task form left a stale project and agent selection that didn't belong to the new context.
v1.1.0
May 2026
Public beta

A new name. The same conviction — your tasks, your machine, your agent.

Added

  • MCP server on localhost:3457. Thirty-four tools covering tasks, daily notes, habits, agents, and calendar. Any MCP-aware CLI agent — Claude Code, Cursor, Aider, or your own — connects with one command.
  • Background agent dispatch. Assign an agent.config to any task; Qalatra spawns it in a sandboxed runner, streams stdout into the task detail panel, and marks the task complete on exit. Failures surface with the real error, not a banner.
  • Scheduled agents. Drop a cron expression in agent.config and the agent runs on your local timezone — morning briefing at 8am, weekly review Sunday at 5pm, or whatever you need. Output routes to the task detail or today's daily note.
  • Daily notes with wikilinks. One markdown file per day, auto-created, full-text indexed. Your agent reads yesterday's via mcp:read_daily_note("yesterday"). Link tasks, people, and projects inline with [[brackets]].
  • Habit tracker with year-view. Name, cadence, streak — nothing else. Agent-readable via mcp:list_habits_today. Miss a day and the streak shows as broken but your best streak is preserved.
  • Inbox triage. New tasks land in Inbox until you give them a context and priority. ⌘⇧I to process. Your agent can triage the inbox for you.
  • Agent output_rules. Define regex patterns in agent.config — when a job completes, Qalatra matches agent stdout and can automatically attach deep links back to external resources.
  • Link chips in task detail. Attached URLs render as labeled chips (Asana, Linear, GitHub, Missive, etc.) in both the task row and detail panel.
  • Integrated terminal. Backtick to toggle; fullscreen with ⌘⇧↑. CWD follows your project. Docked or floating.
  • Light and dark mode with configurable color tokens. Follows your system preference by default; override per-session. Persisted in a cookie.
  • Universal macOS build. One DMG, arm64 and x64. Apple Silicon native.

Changed

  • Renamed from task-os to qalatra. Existing databases migrate automatically on first launch — no action needed.
  • MCP server binds to 127.0.0.1 only. If you were forwarding the port for remote dev, use an SSH tunnel instead.
  • Priority sort factors in agent availability. Tasks with an idle agent assigned bubble up.
  • Daily notes default template now includes a ## agent section the morning briefing writes to.