v1.9.65
October 2026
CurrentPublic betaHeartbeats can run on a cron schedule in any timezone, so a duty can run only on the weekdays it should, and a restart can no longer run the same heartbeat twice.
Added
- →A heartbeat can be scheduled with a standard 5-field cron expression and a timezone, for example 0 5 * * 2-5 in America/Puerto_Rico for 05:00 Tuesday to Friday. Interval and daily-time heartbeats work exactly as before.
- →Daylight saving is handled: a local time skipped when the clock jumps forward runs once at the next valid time, and one that happens twice when the clock falls back runs once.
- →The Heartbeats page has a schedule picker: Interval, Daily at a time, or Weekdays / cron. Weekday checkboxes and a time write the cron expression for you, a timezone dropdown defaults to the server's timezone, and the next three runs are shown in that timezone and in UTC.
- →The create_heartbeat and update_heartbeat MCP tools accept cron_expression and timezone and reject an invalid expression or unknown timezone with a clear error. list_heartbeats returns them with the next run times.
Fixed
- →A server restart at the wrong moment could make a heartbeat run the same scheduled slot twice. Queueing the run and scheduling the next one now happen together, so each slot runs once, and a slot missed while the server was down still runs once when it comes back.
v1.9.64
October 2026
Public betaAn agent run killed at its memory limit is now reported as an out-of-memory failure, so FlightDesk retries it with a memory hint, and a repo checkout left on the wrong branch now gets a warning.
Fixed
- →A run SIGKILLed after reaching its own memory limit, or while the shared agent slice was killing processes for memory, is now reported as a likely OOM even when no kernel record confirms it. The report names which limit was likely responsible, and says when another job may have been the victim.
- →A run killed with no sign of memory pressure is no longer worded in a way that FlightDesk read as an out-of-memory failure; it is reported as a kill of unknown cause.
- →Memory diagnostics now include the run's peak memory use.
Added
- →Each agent scan logs a warning when a repo's main checkout is on a branch other than its base branch (or detached), because jobs there run that branch's agent.config. The warning includes the command to switch it back. Per-task worktrees are not affected.
v1.9.63
October 2026
Public betaThe Linux installer can install or update to a specific release, not only a branch.
Fixed
- →Setting QALATRA_REF to a release tag or a full commit SHA now works with the Linux bootstrap script, both for a fresh install and for re-running it on an existing server. Before, an existing install could not move to a tag it had not fetched yet, and a fresh install refused a commit SHA. A branch still installs as a branch.
v1.9.62
October 2026
Public betaA finished agent turn now always reaches FlightDesk, even when the network drops or the server restarts before the report goes out.
Fixed
- →Qalatra now saves every DONE or FAILED report for FlightDesk and keeps retrying it until FlightDesk confirms it, backing off from 30 seconds to 15 minutes. Saved reports survive a restart, so a finished turn no longer stays RUNNING in FlightDesk after a failed send.
- →A report is given up only when FlightDesk says the dispatch does not exist, after ten rejections, or after a week, and each case is logged. The integrations status shows how many reports are waiting.
v1.9.61
October 2026
Public betaRunning agent jobs are now actually picked up again after a server restart on Linux.
Fixed
- →In 1.9.60 a restarted Linux server still marked running jobs orphaned, because it looked for their state in a different directory from where they were started. Runs now start under the data directory, so the next server process finds and finishes them.
v1.9.60
October 2026
Public betaRestarting Qalatra no longer kills running agent jobs. The next server process picks them up where they are, and only work that is really lost is marked orphaned.
Changed
- →Agent jobs keep running when the server restarts for an update, deploy or crash. The next server process picks up a job that is still running with its original timeout, and finishes one that ended while the server was down. Only a job whose process is gone is marked orphaned, and it keeps its session id and partial output so the next job on the task resumes it.
- →FlightDesk now hears FAILED for a restart only when the work is really gone, reported as orphaned and resumable, and only after Qalatra has checked every job left running.
- →On the desktop, quitting Qalatra leaves running agents going until the next launch picks them up. Set "killAgentsOnShutdown": true in settings to stop them with the app instead.
- →The bundled pipeline agent runs each task in its own worktree with more memory per run, and treats green CI as the merge approval.
Fixed
- →Upgrading a Linux server through the installer now restarts it, so the new version is actually the one serving.
- →Installing the Cloudflare tunnel with no terminal attached fails at once with instructions, instead of waiting ten minutes for a browser login.
v1.9.59
October 2026
Public betaA long agent job for one task no longer holds every other task’s FlightDesk relays, plus dependency security updates.
Fixed
- →FlightDesk session operations (rebase and CI-failure relays) now wait only for a running job on the same task, a job with no task, or a job on the same session, instead of any job in the agent folder.
Changed
- →The MCP SDK moves to 1.32.1, and several dependencies are updated for recently published advisories.
v1.9.58
October 2026
Public betaComplete or skip tasks and meetings where you’re working, see a year of each habit at a glance, @mention tasks in daily notes, and use new shortcuts. The Tools tab now keeps your place on Reconnect.
Added
- →Complete and Skip controls in the task detail panel and meeting view, plus Skip on recurring event cards. Add an optional completion note from the ▾ next to Complete; it is saved to the task’s notes and its agent record.
- →A year heatmap for every habit, with completion %, current and best streak, and week or month drill-down showing that period’s notes. Agents can audit a range with get_habit_history’s new start, end and summary options.
- →Type @ in a daily note to mention a task, project or context.
- →New shortcuts: e edits the selected task’s title, ⌘⌫ archives it, and ⌘[ or ⌘← goes back.
Changed
- →The Tools tab toolbar shows a connection status dot (details in its tooltip), keeps loading until the tool has actually rendered, and collapses on narrow windows.
- →In range mode, get_habit_history reports completion_rate as a number. Calls without a range are unchanged.
Fixed
- →Reconnect on the desktop Tools tab now reopens the page you were on instead of the tool’s home page. This needs the Qalatra server hosting the tool to be on 1.9.58.
v1.9.57
October 2026
Public betaClaude Bridge errors are routed by their code, non-Claude agent commands work without extra configuration, and agent scans stay consistent and clean up removed folders.
Fixed
- →Claude Bridge errors are routed by the code the bridge now sends. Only a genuinely missing session is reported as one, so an unreadable page or a "button not found" failure no longer looks like a lost session. Sign-in, missing-tab and crashed-tab states report the bridge as unavailable.
- →Diagnostics sent to FlightDesk lead with the bridge error code and carry only allow-listed fields. Scraped page and dialog text is never forwarded. Archiving an already-archived session now counts as done.
- →Agent commands that run Codex, including a default agent command such as codex --yolo, no longer get Claude’s prompt flags appended. The runtime is inferred from the command when agent.config does not set one. Unrecognised commands, such as wrapper scripts, keep the Claude runtime and log a hint, also shown in Settings.
- →An agent.config that exists but cannot be read or parsed is now logged with its path instead of being silently ignored. A folder without one still runs on the default command, as intended.
- →The rescan tool and the server scan now share one transactional write path, so worktree and concurrency settings are always recorded and agents and capabilities never disagree after a failed scan.
- →Agent folders deleted from disk are pruned from the registry and their capability is marked inactive. This only covers folders under the scanned root, so narrow rescans leave everything else alone.
Removed
- →An unused Tools tab refresh hook. The Tools tab reconnects with a fresh session and keeps your place.
v1.9.56
October 2026
Public betaSet a server’s agent concurrency without restarting, drain active work safely, and distinguish confirmed out-of-memory kills from uncertain evidence.
Added
- →Live host concurrency control: maxConcurrentJobs defaults to 3, accepts nonnegative integers, and pauses new admissions at 0 while current runs finish. Lowering the limit never kills existing work; restoring a positive value resumes admission on the next scheduling pass.
- →An authenticated worker status endpoint reports the effective limit, admitted count and paused state. Settings PATCH changes selected properties while preserving other settings; PUT and import still replace the full document.
Fixed
- →Overlapping scheduling passes and slow worktree preparation cannot exceed the configured ceiling. Claims, launch failures and process cleanup release admission slots safely.
- →OOM diagnostics retain scope and shared-slice memory evidence, attribute the constraining cgroup only when supported, and give different advice for per-run limits and shared-host contention. A sibling’s OOM no longer proves that an unrelated killed job exceeded its own cap. Missing evidence remains explicitly uncertain, with resumable sessions and partial output preserved.
v1.9.55
October 2026
Public betaAgent folders can run different tasks in parallel in their own git worktrees, each run's memory limit is configurable, and out-of-memory kills are reported as such.
Added
- →Opt-in per-task worktrees: with "worktrees": true in agent.config, each task-bound job (such as a FlightDesk dispatch) runs in its own git worktree, so different tasks in one folder run side by side while one task's jobs still run in order. The worktree is reused for the task's later jobs, so sessions resume, and removed when the task closes or after 7 idle days. Folders that don't opt in are unchanged.
- →Per-run memory limits: memory_high and memory_max in agent.config, or agentMemoryHigh and agentMemoryMax in settings for a whole server. Defaults stay 1G/2G; invalid values are ignored with a log line.
Changed
- →A run killed by its memory limit is now recorded as an out-of-memory kill with a clear message instead of a bare failure, and its session can be resumed.
- →Dependency security updates, including Electron downloads during packaging and the bundled single-file editor and terminal views (unchanged output).
v1.9.54
September 2026
Public betaApproval answers given directly in Claude now reach FlightDesk, so it can reconcile every page of a permission or question card.
Added
- →Session-state reports forward Claude Bridge 0.1.18's resolved-approval history to FlightDesk unchanged, including pages answered in Claude rather than through FlightDesk. Requires the matching FlightDesk support; with an older bridge, reports are unchanged.
v1.9.53
September 2026
Public betaFlightDesk work stays in the Code view and out of your to-do list, and FlightDesk-bound tasks close themselves when FlightDesk is finished with them.
Added
- →A FlightDesk-bound task closes once its FlightDesk task is done, archived or deleted and none of its jobs is queued or running. Qalatra checks when a job ends and every 15 minutes; the first check after startup clears tasks that had already piled up.
- →A new dispatch on a finished FlightDesk task reopens the same Qalatra task, so one FlightDesk task always maps to one Qalatra task.
Changed
- →Tasks an orchestrator such as FlightDesk drives are always coding tasks, shown only in the Code view. The priority view, inbox, briefings, end-of-day triage, stale reviews, overdue lists and get_todays_tasks all exclude them.
Fixed
- →FlightDesk tasks created as regular tasks no longer appear in the priority view; existing ones are corrected at startup.
- →Closing or completing a FlightDesk-bound task no longer queues a sync entry back to FlightDesk.
v1.9.52
September 2026
Public betaNative Claude permission requests reach FlightDesk, client setup is easier to follow, and revoked access tokens stay out of the main list.
Added
- →Session-state reports preserve pending Claude approvals and the full permission card, even without a transcript. Matching FlightDesk support can surface these requests for a human decision; Qalatra does not grant permissions automatically.
- →The hosted web app guides new users through finding a server URL and creating an access token, then tests the connection before saving it. Mobile 0.3.0 has matching setup guidance through an Expo update.
Changed
- →Settings → Instances keeps active and expired tokens visible, with revoked tokens behind a collapsed history showing their count and revocation dates.
- →The website Log in button offers a choice of the Qalatra web app or account portal. Portal links preserve their destination through sign-in.
- →Hosted and mobile account actions have clearer spacing. The hosted access screen opens the Connect portal directly.
- →The hosted app is live at app.qalatra.com, and the renewed iOS 0.3.0 (10) beta is available through TestFlight. Desktop remains free and open source without account login.
Fixed
- →Sessions waiting for permission no longer look idle; resumed sessions report a cleared card so FlightDesk can reconcile permissions answered in Claude.
- →Signed-out portal visits redirect to login before loading private organization data, avoiding the previous Connect page error.
v1.9.51
September 2026
Public betaConnect accounts now unlock the hosted web and mobile apps, with assigned-seat checks, login-only mobile access, and admin-managed complimentary seats.
Added
- →Hosted web deployment at app.qalatra.com, with account login and two-factor verification before connecting a backend.
- →Admin-only complimentary Connect access: grant a permanent seat to an existing organization member, with audit history and revocation, without charging Stripe or provisioning a Cloud server.
Fixed
- →Access checks recognize eligible assigned seats across organizations and plans, recheck while the app is open, and remove access after revocation.
- →Mobile credential storage now uses a valid SecureStore key. Changing backend connections cannot bypass the account gate.
Changed
- →Mobile 0.3.0 is login-only, with access refresh and sign-out. The free desktop app remains available without a subscription.
- →Pipeline agents follow FlightDesk-connected instructions instead of writing status to Linear.
v1.9.50
September 2026
Public betaTwo amendments to the folder-identity injection: agent config can now reference the folder’s FlightDesk credential, and the rc’s organization scope travels with it.
Fixed
- →The folder’s credential was applied after agent config env entries expanded, so an entry like "Bearer ${FLIGHTDESK_API_KEY}" for an MCP header expanded to an empty bearer. The credential is now set before those entries expand and re-applied after, so it is referenceable but still cannot be replaced.
- →An organizationId in the folder’s .flightdeskrc was dropped, and the CLI never reads the folder file once its key comes from the environment — so the org scope was silently lost. It now reaches the job as FLIGHTDESK_ORGANIZATION_ID.
v1.9.49
September 2026
Public betaA bound folder’s FlightDesk identity now reaches the job itself, not only the poller — an agent working from its repo root is still its own folder’s agent user.
Fixed
- →The folder’s .flightdeskrc was read only when polling for dispatches. The job launched in that folder never saw it, and the flightdesk CLI finds a key by walking up from its working directory — so an agent that cd’d to its repo root reported turns as the box owner instead of the folder’s agent. The credential is now injected as FLIGHTDESK_API_KEY / FLIGHTDESK_API_URL on every job in a bound folder, heartbeats included, and the CLI honours those over any file it would find.
- →A dispatch payload can no longer set FLIGHTDESK_API_KEY or FLIGHTDESK_API_URL through its environment, so an orchestrator cannot re-identify a job from outside the box.
Changed
- →The folder’s .flightdeskrc wins over agent.config env and the shared agentEnv defaults for those two names: the file is the binding, and a stale agent.config in a client repo cannot re-identify a folder.
v1.9.48
September 2026
Public betaThe first FlightDesk dispatch ran end to end on a real box — 58 seconds from request to done, no cloud session opened — and Poll now confirms a fixed credential immediately.
Changed
- →Poll now in Settings → Integrations skips the five-minute backoff applied to a folder whose credential was refused, so a key you have just fixed is confirmed on the spot. The automatic tick keeps the backoff.
v1.9.47
September 2026
Public betaA cloud session that stops and asks for work — a migration, a dependency, a secret — is noticed even when it doesn’t phrase it as a question.
Fixed
- →Session state reads decided “asked for something” by a trailing question mark alone, so “I need the migration run before I can continue” went unnoticed until the age ceiling. The closing paragraph is now read for request phrasing too, and the read reports whether the session is simply idle.
v1.9.46
September 2026
Public betaSession operations now match the FlightDesk release that shipped after 1.9.45 was built.
Fixed
- →FlightDesk stores a session operation’s rendered prompt beside its spec rather than inside it; Qalatra now reads it there, so relayed CI failures and rebase nudges reach the session instead of being refused.
- →A session state read with no transcript yet reported a null timestamp that FlightDesk rejects; empty fields are now left out of reports.
v1.9.45
September 2026
Public betaFlightDesk can now drive agent work: it decides when an agent should run, Qalatra polls for those requests and runs them, and nothing ever has to call into your box. Opt-in per agent folder; everything else runs exactly as before.
Added
- →FlightDesk integration. Put a .flightdeskrc in an agent folder and Qalatra polls FlightDesk every 30 seconds for that agent’s dispatch requests, turns each into a job, and reports acknowledged, running, done or failed back — with the result tail, why it failed, and whether the session can be resumed. Empty polls cost no model tokens, so the periodic “anything to do?” agent is no longer needed. Folders without the file are never polled, and Qalatra works exactly as before with no FlightDesk at all.
- →Session operations without an agent. Relaying a CI failure into a cloud session, nudging a rebase, clicking Create PR, archiving after a merge, or checking whether a session ended asking a question can now be requested by FlightDesk and performed by Qalatra directly through claude-bridge — no agent turn, no tokens. An injected prompt must come from a FlightDesk template and only counts as delivered when the bridge confirms it landed in the right session; nothing is ever run twice.
- →Outbox replay. If an agent’s FlightDesk calls fail mid-run because FlightDesk is unreachable, they are written to a folder and replayed on the next poll.
- →Settings → Integrations shows each bound folder’s last poll, last success, errors and counts, with a Poll-now button.
- →A generic orchestration surface for any external system: a job can be queued with an exact prompt and an external reference, started on a fresh session or the task’s latest one, and a task records which orchestrator drives it separately from where it was born.
Changed
- →At most one job runs per agent folder at a time. Jobs in one folder share its working tree, so two at once could fight over one checkout — especially when a backlog arrives together after a restart. Folders that share a checkout can be given the same concurrency key in their agent config.
- →When several jobs on a task finished in the same second, a follow-up could resume the wrong session; the latest one now always wins.
v1.9.44
September 2026
Public betaAn agent’s launch command can now be a list of arguments instead of a shell line, so a task title or description reaches the agent exactly as written with no quoting to get wrong.
Added
- →The command in an agent’s config can be written as an array. Each entry is one argument and Qalatra starts the program directly, with no shell in between, so a task title or description is delivered as its own argument exactly as written — quotes, dollar signs, newlines and all. The single-line shell form still works unchanged, so no existing agent has to move.
- →Every agent run now receives the task’s title, description and id, the job id, and the path to its spec file as environment variables. A shell-form command that relies on shell features can reference those instead of splicing the text into the command line, which was how a multi-word prompt once reached a cloud session as a single word.
Changed
- →The launch warning about an unsafely quoted placeholder now names both alternatives, and failed-launch diagnostics say which command form ran.
v1.9.43
September 2026
Public betaChecking on a task or a job no longer costs an agent the whole plan or the whole log, and a resumed agent is no longer handed its entire history again as a single argument.
Changed
- →Reading a single task now returns its status and metadata without the plan text. A pipeline that checks on its tasks every hour was re-reading each task’s full description every pass, and every copy then stayed in that agent’s session for the rest of its life — on one server that was roughly half of all agent spend. The response now says how large the omitted description, AI history and notes are, so an agent can tell a ten-thousand-character plan from an empty one and ask for the text only when it actually needs it.
- →Reading a single agent job now returns the end of its output rather than all of it. The summary and any error live at the end, which is what a status check wants; the response says how long the full output is, and the tail size is adjustable or can be turned off.
- →Listing agent jobs returns ten at a time instead of twenty, and can be filtered by status, so a poller asks for the queued and running jobs it cares about instead of paging through finished ones.
Fixed
- →Resuming an agent no longer replays its whole history. Claude and Codex already restore the earlier conversation when a session is resumed, but Qalatra was also re-sending the original task prompt — description plus every task note — as the new turn. Repeated dispatches made that one argument grow until Linux refused to start the agent at all. A resumed job now receives only the new message, or a short instruction to check the task for updates.
v1.9.42
September 2026
Public betaRoutine reads from Claude use far less context, and Qalatra can now measure its own share of an agent’s usage without ever logging task content.
Changed
- →Task searches and agent-job reads return compact operational fields by default instead of quietly including full descriptions, AI history, prompts and results. Anything can still be requested by name, or the complete record with a single wildcard. Measured against a real database, twenty-row responses were 82% smaller for task searches and 89% smaller for job listings.
- →Results are sent as compact JSON, repeated schema guidance was shortened, and the server advertises short instructions so Claude’s tool search can find Qalatra without loading every definition up front.
Added
- →MCP usage is measurable. Each tool call is logged with its duration, argument and result sizes, item count and error code — never the arguments or results themselves. Completed agent jobs also keep the provider’s input, output and cache token counts and the number of Qalatra calls the agent made, so a usage report can be traced to a tool rather than guessed at.
v1.9.41
September 2026
Public betaOn Linux, ending an agent now ends everything it started, and every agent run gets its own memory ceiling.
Fixed
- →A tool an agent had started could outlive the agent. Claude Code can launch commands in their own process group, which put them outside the group Qalatra killed on timeout; a leaked build or test run then kept its memory charged to the shared agent budget and quietly slowed every later agent until each hit its own timeout. Linux agents now run in a named systemd scope, and a timeout or shutdown ends the whole scope — reaching anything that detached, reparented or double-forked, even after the original agent process is gone.
Added
- →Each agent run has its own memory limits. Pressure is applied to the individual run before the shared budget, and a run that reaches its hard ceiling is terminated whole rather than leaving pieces behind.
v1.9.40
September 2026
Public betaA subtle quoting mistake in an agent’s command can no longer silently truncate its prompt, and failed jobs show exactly what the shell was asked to run.
Fixed
- →An agent command that wrapped a placeholder in quotes and then kept writing inside them could hand the agent only the first word of its prompt. Qalatra now warns, with the job id, when it finds a quote before a placeholder without the matching quote after it. Properly quoted and bare placeholders are unchanged.
- →Diagnostics for a failed job include the resolved command as the shell received it, not just the template, with the same secret and token redaction applied to both.
- →Signing on the current macOS build runners was restored, and every currently patchable dependency advisory was cleared.
v1.9.39
September 2026
Public betaAgent timeouts can no longer be delayed by a busy server, and a task’s AI history stops growing forever.
Fixed
- →An agent’s time limit was enforced by the same server loop it was meant to protect, so if that loop froze the sixty-minute deadline could slip indefinitely. Each running agent now has a small independent watchdog with its own clock that ends the agent and everything it started, and records which limit fired so the outcome is stored correctly once the server catches up. If a watchdog cannot be started the job is stopped rather than run unguarded.
- →Qalatra only moves an agent into its dedicated memory budget when that budget actually has a ceiling. A missing or unlimited one would have taken the agent out of the server’s capped budget and into an uncapped one — worse than leaving it alone — so the agent now stays put instead. The check runs on every launch, so installing the budget takes effect on the next job.
Changed
- →A task’s AI context keeps the newest fifty entries or eight thousand characters and marks how many older entries were trimmed. It remains append-only with the newest entry last, and the tool descriptions now say so consistently.
v1.9.38
August 2026
Public betaA runaway agent can no longer take the whole box down with it, and routine reads can ask for just the fields they need instead of failing on a task’s accumulated history.
Fixed
- →One misbehaving agent no longer stalls everything else on a Linux server. Qalatra, its Claude connection, your terminal sessions and every agent all ran inside a single memory budget, and when that budget is reached the operating system slows down everything in it — it cannot tell which one is at fault. Worse, slowing an agent that hard means it never quite reaches the point where it would be stopped outright, so it simply hangs and drags the rest down with it. That is how two servers stalled with the Claude connection timing out while otherwise looking healthy. Agents now run inside their own memory budget, so the parts you talk to the machine through keep working while the runaway is contained.
Added
- →Task and agent-job reads accept a list of fields. Every read used to return each matching task’s full description and context notes, which grow without limit and have nothing to do with what was asked — and once a response got too large the request failed outright rather than returning less. A routine check that cost nothing ninety-nine times would fail the hundredth because of one task’s accumulated history. Asking for just the columns you need keeps those reads small and predictable, and reading a failed job’s error no longer means pulling its entire prompt along with it.
v1.9.37
August 2026
Public betaAgents can run on Codex as well as Claude, a timed-out agent keeps working context instead of losing it, and killing an agent now also stops whatever it started.
Added
- →Agents can run on Codex as well as Claude. Qalatra built each agent’s command line and read its output in a way that only Claude Code understood, so nothing else could be scheduled as an agent. Each supported CLI now supplies its own launch and output handling, and an agent chooses one with a runtime field in its config — claude, codex, or raw for a plain command. Existing agents are unaffected: leaving the field out keeps exactly the behaviour they have today, and an unrecognised value falls back with a warning rather than failing the job.
- →An optional idle limit stops an agent that has gone quiet. The ordinary timeout only knows how long a job has been running, which cannot tell a productive fifty-minute run from one that wedged after ninety seconds. Setting idle_timeout_minutes ends a job that produces no output at all for that long. It is off by default, because a single long step — a full test suite, a large build — legitimately says nothing for a while.
- →Each job now records which CLI ran it and shows it alongside the result, so a mixed set of agents stays legible at a glance.
Changed
- →A timed-out agent can now be picked up where it left off. Claude only reported its session when it finished, so ending a job discarded the thread along with it and the work could not be continued. Qalatra now reads an agent’s output as it arrives and captures the session within moments of launch, which survives the job being ended. A timeout is also recorded as its own outcome rather than as a failure — it is Qalatra’s own limit, not the agent going wrong — and the result says which limit was hit, notes that the session can be continued, and includes whatever the agent had produced. Sending another message on that task resumes the same session.
- →The default time limit for an agent job moved from 15 minutes to 60. Fifteen was short enough that ordinary coding work was being cut off and recorded as a failure. A stuck job still occupies one of three slots, so the limit stays bounded, and any agent that sets its own timeout_minutes is unchanged.
- →A long or noisy run no longer accumulates without limit. Qalatra keeps the result and a recent excerpt rather than every byte an agent ever printed.
Fixed
- →Ending an agent now also stops what the agent started. A timeout signalled only the agent itself, so anything it had launched — a test run, a build, a helper server — kept going unsupervised after Qalatra had already reported the job finished and moved on. Agents now run in their own group and the whole group is ended together, including when the Qalatra server itself shuts down, so a restart no longer leaves live agents behind holding files and quota.
- →The “Resume session” button ran a Claude command for every job regardless of which CLI actually ran it, and now uses the right one.
- →The agent tools available to Claude describe every outcome a job can have, including runs interrupted by an app restart and runs stopped by a timeout, and state that neither is an agent failure. Both were previously undocumented, so an assistant reading job results could report a recoverable interruption as a hard failure.
v1.9.36
August 2026
Public betaThe MCP endpoint always belongs to the Qalatra server that is actually running, so Claude stops talking to a stale one after an update.
Fixed
- →An older MCP process can no longer hold on to the connection after Qalatra restarts. The MCP helper is now tethered to the server that started it and exits when that server goes away — including when the server is killed outright rather than shut down cleanly — so a previous generation cannot linger and keep the port. The helper also starts only after the server has claimed its own single-instance lock, so a duplicate server cannot create a second one, and the health endpoint stays red until the current helper has confirmed it is ready.
- →A blocked MCP port is no longer retried forever in the background. Startup now backs off and, after repeated failures, stops visibly instead of appearing healthy while nothing works. Shutting down cancels any pending restart and cleans up the helper.
Changed
- →Linux servers installed before this release should run scripts/remediate-orphaned-mcp.sh once from the updated checkout, as the Qalatra service user. Helpers created by earlier versions predate the tether and need removing once. The script stops the service, ends only the matching MCP processes for that checkout, confirms the port is free, and restarts — it does not touch tmux or running agent jobs.
v1.9.35
August 2026
Public betaClaude reconnects to the MCP server on its own after an update instead of reporting a session error.
Fixed
- →Claude recovers on its own after a Qalatra update. MCP sessions live only in the running server, so every release — which restarts that server — ends them. When a client came back afterwards with an id the new server had never seen, Qalatra answered as though the request itself were broken, and the client reported an error instead of simply reconnecting. An unrecognised session is now answered with the status that tells a client to start a fresh one, which is what it does. A genuinely malformed request is still rejected as before.
v1.9.34
August 2026
Public betaGroundwork for hosted Qalatra accounts and Connect seats, a stricter release pipeline, and a round of security updates.
Added
- →Foundation for hosted Qalatra accounts. The shared client now handles qalatra.com sign-in, two-factor completion, secure token storage on the device, recovery when a session is revoked, and Connect/Cloud seat checks. Mobile presents proper sign-in, two-factor, unlicensed, and service-unavailable states before you connect a backend. This is groundwork: hosted web builds can turn the gate on explicitly, and the free desktop app stays ungated. Hosted deployment and signed mobile builds still need production validation before any of this is switched on.
- →Headless servers can accept a bootstrap token supplied by the caller (QALATRA_BOOTSTRAP_TOKEN) on first start, so a provisioning system can hand a box its own derived credential. The raw full-access token is no longer printed to the service log.
Changed
- →Releases can no longer ship without written notes. A tag must match the version in package.json and carry a checked-in notes file; if it doesn’t, the workflow fails rather than falling back to raw commit subjects. Every tag also runs the full pre-publish gate before anything is packaged — typechecks, account/auth/output-rule tests, server smoke coverage, import verification, UI lint, and a production UI build.
Fixed
- →Security maintenance across the desktop and web builds: Electron, DOMPurify, js-yaml, Hono, fast-uri, ip-address, nanoid, and brace-expansion updated to patched releases, with the shipped Markdown editor bundle rebuilt against the patched sanitizer. Root and web audits are clean.
- →Updated Expo and its compatible packages on mobile. Two high-severity advisories remain in image-size, reached through Metro’s build tooling — no patched version of that library exists yet. The parser runs at build time only, on assets from the repository itself, so the mobile release gate carries a narrow temporary exception for those two advisories while continuing to reject every other finding. It will be removed when an upstream fix lands.
v1.9.33
August 2026
Public betaAgent output rules work again, and your saved servers can be reordered.
Fixed
- →Output rules in agent.config apply again. The rule evaluator was dropped when agent jobs moved to the headless server in May, so every release since then quietly ignored output_rules — agents ran fine, but never attached the links they were configured to attach. Rules now run against the agent’s actual result (command output for command and template agents, the parsed result for prompt agents), and when the output contains several matches the last one wins, so a preamble ID can’t outrank the real one. A malformed rule is logged and skipped rather than blocking the rules after it or failing the job.
- →The “orphaned” job status added in 1.9.32 is now part of the published type definitions, so integrations built on them can branch on it.
Added
- →Reorder your saved servers. Settings → Instances now supports drag-and-drop, with up/down buttons as a keyboard- and screen-reader-friendly alternative. The order drives the header switcher immediately, and editing an existing server keeps its position instead of dropping it to the end. Local Server stays pinned first when it’s visible.
v1.9.32
July 2026
Public betaRemote terminals now survive a server restart, and agent jobs interrupted by a restart are tracked distinctly instead of as failures.
Fixed
- →Remote terminal sessions on self-hosted Linux servers no longer die when the server restarts (including the automatic restart on every update). The tmux server backing the terminals was being started inside the service’s own process group, so systemd tore it down on stop; it now runs in its own scope and survives restarts, with the browser reattaching to full scrollback. Existing servers self-heal on their next update.
Changed
- →Agent jobs interrupted by an app restart are now marked “orphaned” rather than “failed.” Killing a running job by restarting the server is an infrastructure event, not an agent failure — conflating the two polluted failure counts and hid whether the job’s work had actually landed. Orphaned jobs now carry their own status and the restart’s timestamp, show a distinct amber badge (not a red failure), and are never blindly re-run. Existing jobs previously mislabelled this way are reclassified automatically.
v1.9.31
July 2026
Public betaSecurity maintenance: clears five dependency advisories across the desktop, web, and mobile builds.
Fixed
- →Patched five dependency security advisories flagged by scanning. The notable one is in the update toolchain (builder-util-runtime, used by the desktop auto-updater): a cross-origin redirect could leak an authorization token — but only for a token-authenticated update feed, and Qalatra updates from public GitHub Releases with no such token, so it was never exposed. Also updated: an AppImage packaging issue in app-builder-lib (unused — Qalatra ships a macOS build), a source-map path-traversal issue in postcss, and a denial-of-service issue in brace-expansion (both build-time only). No functional changes; the desktop app was verified to package cleanly on the updated build toolchain.
v1.9.30
July 2026
Public betaPer-backend navigation — each server keeps its own layout and remembers the tab you left off on — plus global agents that surface everywhere.
Added
- →Per-backend navigation. Each connected server — your local app and every remote box — now keeps its own sidebar layout: hide the sections a given backend doesn’t use (Reading, Backlog, Habits, Projects) and choose which view it opens on. A headless remote box can show just Priority and Terminals while your personal backend shows everything. Configured in Settings → Sidebar on desktop and More → Navigation on mobile.
- →Servers now remember the tab you were on. With several remote boxes in rotation, switching between them used to always drop you back on Priority; now each backend restores wherever you left off.
Changed
- →Global agents surface everywhere. A capability or agent with no assigned context is now treated as global — it appears in every context-scoped capability search, not just unfiltered ones — so shared agents show up wherever you’re working. To make one global, simply leave its context (and project) unset.
Fixed
- →Creating a task through the REST API now honors the task type, source, and event-time fields instead of dropping them, so events and externally-sourced tasks come through with their full detail.
v1.9.29
July 2026
Public betaClears the last outstanding dependency advisory — all builds now scan clean.
Fixed
- →Patched the final flagged advisory, a path-traversal issue in the @hono/node-server library used by the Model Context Protocol server transport. The MCP SDK still pins the older 1.x line, so the patched 2.x release was applied via an override; the only piece of the library the transport uses is unchanged across the major version, and the fix was verified end-to-end by running the MCP server on the new version through a full connect-and-list-tools handshake. All builds — desktop, web, and mobile — now scan clean.
v1.9.28
July 2026
Public betaSecurity maintenance: patches ten dependency advisories across the desktop, web, and mobile builds.
Fixed
- →Patched ten dependency security advisories flagged by scanning — denial-of-service and parsing issues in fast-uri, js-yaml, shell-quote, and tar, an HTML-sanitization update in dompurify (which also backs the Markdown-to-PDF export), and an image-processing update in sharp. The web and mobile builds now scan clean. No functional changes; the Markdown editor and PDF export were verified against the updated libraries.
v1.9.27
July 2026
Public betaCloses the last gap in secret auto-attach protection and patches three dependency advisories.
Fixed
- →Bare credential dotfiles in your home directory are no longer auto-attached. The previous release blocked secrets by known name and location, but a plain home-directory dotfile like .flightdeskrc matched none of those rules, so a note that named it by path could still attach it. Auto-attach now refuses any “rc” dotfile and, more broadly, any dotfile living directly in your home directory — that class is almost always app or credential config, and legitimate agent outputs never live there. Impact of the original gap was contained: only a local file reference was recorded, nothing was uploaded.
- →Patched three dependency security advisories flagged by scanning — a denial-of-service issue in brace-expansion across the desktop, web, and mobile builds, and a request-body handling issue in body-parser on the server. No functional changes.
Changed
- →The release pipeline now verifies every platform installer and auto-updater manifest is present before a release is published, so a partial upload can no longer result in a release that looks complete but leaves some platforms without an update.
v1.9.26
July 2026
Public betaFiles 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 betaHeartbeats 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 betaHeartbeat 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 betaOne 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 betaA 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 betaUnattended 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 betaMobile 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 betaTools 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 betaTerminal 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 betaMobile 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 betaMobile 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 betaFirst 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 betaHotfix: 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 betaGroundwork 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 betaDrag 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 betaMarkdown 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 betaSturdier 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 betaDynamic 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 betaPrivate 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 betaStartup 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 betaCopy 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 betaMCP 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 betaTerminal 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 betaCI 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 betaCopy-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 betaTwo 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 betaA 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 betaKnow 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 betaTask 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 betaRemote 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 betaAgent 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 betaClock-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 betaWindows 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 betaEncryption 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 betaYour 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 betaMCP 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 betaMCP 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 betaNavigate 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 betaAgents 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 betaA 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 betaA 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.