NewChatCollaboration
Chat: talk where the work already lives
Ithura now has a chat of its own, and it is free on every plan including Free. Channels sit at workspace and project level, direct messages sit beside them, and replies open in a thread instead of burying the channel. The point is not another inbox: it is that the conversation and the work are finally the same graph. Type a task identifier and it becomes a live chip you can hover and click. Type a slash command and the message becomes a real task, or a call, without leaving the thread.
- Channels are scoped: one set for the workspace, one per project, plus direct messages. Every channel carries a topic, pinned messages, and full-text search that returns the matching snippet rather than a bare hit list.
- Threads keep channels readable. A reply opens a side panel and the parent row shows its reply count, so a long discussion never pushes the rest of the channel off screen.
- Task chips are live, not text: #ATL-4 in a message renders as a chip carrying the task name, state, priority and assignees on hover, and clicking opens the task. The same chip works in task descriptions, comments, wiki pages and board nodes.
- Slash commands reach into the work graph. /task turns the message you are looking at into a real task in the project, and /huddle starts a call in that channel that everyone can join from the header.
- Live by default: typing indicators, message edit and delete, emoji reactions, file attachments and link previews, all over the same socket the rest of the app uses. Unread is tracked by a monotonic sequence, so the new-messages divider lands in the right place on every device.
- Alt and the arrow keys move between channels, Alt with Shift jumps to the next unread. Chat is deliberately ungated: a workspace on the Free plan gets the whole thing.
NewPlanningSprints
Plan branches: what-if sprint planning, merged when ready
Try out a sprint reshuffle before your team sees it. A plan branch is a named staging area for planning changes: switch to it from the branch picker on the sprint page, then change task priorities and move tasks in and out of sprints as usual. Every edit stages on the branch instead of touching the live plan, an amber banner makes the mode unmistakable, and the Compare page shows the full before / after diff. Merge everything in one click, cherry-pick single changes, or discard the whole experiment.
- A branch is an overlay of staged changes, not a copy of the plan: creating one is instant, and nothing on main moves until you merge. Scope a branch to one project or to the whole workspace for a cross-project reshuffle.
- Stage from the surfaces you already use: the priority dropdown and the sprint picker in the task detail panel record a Staged on branch change while a branch is active. Today staging covers task priority and sprint membership; other edits still apply directly to main.
- Compare shows every staged change with its on-main and on-branch value side by side, and flags drift ahead of time: if a teammate edited the same field on main since you staged, the row is marked Conflict so nothing surprises you at merge.
- Merge re-checks every change against main's current value in a single transaction: everything that still cleanly applies lands, and the rest is reported as conflicts instead of silently overwriting newer work. Or cherry-pick one row to apply just that change and keep the branch open.
- Branches are live: when a teammate stages on the same branch, merges it, or discards it, your banner and Compare page update on their own. Docs at /docs/features/plan-branches; deep dive at /blog/plan-branches; ten-minute walkthrough at /docs/tutorials/plan-branches-first-what-if.
NewEnterpriseSovereign
Time Machine: an undo button on the whole task
A daily worker now captures a canonical snapshot of every task touched in the last 24 hours. Any project member can open the Time Machine on a task, browse snapshot dates, preview the field-by-field diff against the current state, and restore any snapshot back in a single click. Enterprise-only. Every restore lands both on the workspace audit log and on the task's own activity feed.
- Task detail, More actions menu, Time Machine: opens a modal listing every stored snapshot for the task, most recent first, each flagged with whether it still differs from the current state.
- Tracked field set: name, description_html, priority, state_id, start_date, target_date, estimate_point, plus assignee_ids, label_ids, module_ids, and cycle_ids (each sorted so the snapshot hash is stable across runs).
- Selecting a date loads a computed field-by-field diff against the current issue: base fields side by side, arrays as a set-membership summary, description as a compact differs note (v1 does not render an inline HTML diff; restore to see the exact prior content).
- Restore is a single transaction: base fields go back via one UPDATE (null values in the snapshot truly clear the live field), and join tables are replaced with the snapshot's set. Idempotent on repeat restores.
- Snapshot worker runs on a 24h scheduler with a 48-hour grace window on updated_at, so the previous day is covered even if the tick slips. Hash-dedup skips writes when nothing tracked changed between two consecutive days (a comment or a subscribe does not accumulate a duplicate row).
- Audit event on every restore: workspace.issue.time_machine.restored with metadata { issue_id, snapshot_date }. Activity row on the task reads restored the task from a Time Machine snapshot dated <date>.
- Follow-ups on the roadmap: retention pruning (auto-purge snapshots older than N days per workspace), per-field restore (keep the new description, only reset assignees), and a rich HTML diff for the description field.
NewSovereignEnterprise
Audit events, streamed to your SIEM in real time
Every workspace audit event is now streamed to a customer-owned HTTPS webhook the moment it lands in the audit log. HMAC-signed with the same scheme used by workspace webhooks and agent-dispatch runners, so a receiver you already have for either surface can be reused as-is. Zero polling, zero export window, zero cron. Splunk and Elastic see the event within a few hundred milliseconds of the actor clicking the button.
- Settings, SIEM streaming: workspace-admin sets a webhook URL, HMAC secret (Generate button produces a 48-hex random value), timeout, and active toggle. Enterprise plan. Secret is stored AES-256-GCM encrypted and never returned to the SPA after write, so a stolen bearer token cannot exfiltrate the value that would let an attacker forge events into your SIEM.
- Wire contract: POST application/json to the configured URL with X-Ithura-Signature = hex(hmac_sha256(secret, body)) and User-Agent: Ithura-SIEM/1.0. Envelope carries id, workspace_id, actor_user_id, actor_label, action, entity_type, entity_id, metadata, ip_address, user_agent, created_at.
- Every audit event is fanned out at write time, not on a schedule. The stream carries SSO sign-ins, SCIM provisioning changes, membership and role changes, integration secret rotations, agent dispatches, and every settings mutation.
- Follow-ups on the roadmap: retention pruning (per-workspace auto-delete after N days), a deliveries table with retry-with-backoff and a per-workspace success-rate widget, and per-scope filters so a workspace can stream just workspace.member.* or security.* events.
NewAgentsEnterpriseSovereign
Agent Dispatch Queue: hand a task to an agent on your own infra
Register agent runners (Claude Code, Cursor CLI, or any local model behind a webhook) at the workspace level, then dispatch any task to them from the API. Every dispatch is HMAC-signed on the outbound POST, every callback is HMAC-verified with a per-run token, every hop lands in the audit log. Not a chatbot. Not autonomy-by-default. A queue with provenance, running on your infrastructure.
- Settings, Agent runners: register a runner with a name, webhook URL, HMAC secret (Generate button produces a 48-hex random value), and a timeout. Admins only. The HMAC secret is stored AES-256-GCM encrypted and never returned to the SPA after creation, so a leaked bearer token cannot exfiltrate the value that would let an attacker forge dispatches to customer infrastructure.
- Dispatch a task: POST /workspaces/{slug}/projects/{projectID}/issues/{issueID}/dispatch-agent/ with a runner id and optional acceptance criteria. Ithura packages the task snapshot (title, description, project + sequence id, state, priority) plus a callback URL and POSTs the signed payload to the runner. Member-level, so any assignee can hand off.
- The runner works on your infrastructure, then POSTs a terminal callback (in_progress, completed, or failed) with an optional result_url (the PR or MR link) and a summary. Callbacks are HMAC-verified against runner_secret plus the per-run callback token, so a leaked runner secret alone cannot forge callbacks for unrelated runs.
- Every action lands in the audit log: workspace.agent_runner.created / .deleted, workspace.agent_dispatch.queued / .in_progress / .completed / .failed / .callback_ignored. Enterprise workspaces can export the full trail as CSV via the sovereign audit-log export endpoint.
- Follow-ups on the roadmap: UI dispatch action on the task detail page, auto-dispatch rules (label + state change), cost tracking from runner callbacks, and a retry policy that reuses the same run row.
NewVideoWikiCollaboration
Async video, native to Ithura
Record a screen or webcam clip from any wiki page, task description, or task comment, and drop it inline as an HTML5 video player. A floating recorder pill follows you around the app so the recording survives navigating between tasks mid-explanation, and Cmd+Shift+R starts a recording from any page. The recorder is the browser's own MediaRecorder API; the file uploads to your workspace's own object store; playback is a plain video tag. No Loom subscription, no external service, no data leaving your infrastructure.
- New Video button on the wiki, task description, and task comment editor toolbars. Click, pick camera or screen, click Start, and the mode picker closes.
- A floating recorder pill takes over at the bottom-right of the app: elapsed timer, source label, Stop and Cancel buttons. The pill stays visible on every page you visit, so a recording started from a task comment survives clicking around to grab context, jumping to a wiki page to demo it, or opening a different project mid-recording.
- Keyboard shortcuts: Cmd+Shift+R (Ctrl+Shift+R on Windows / Linux) starts a recording from any page in the app, whether or not you have an editor open. Cmd+Shift+S stops the current recording from anywhere. Both live in the keyboard shortcuts help panel under a new Recording section.
- If you navigated away from the source editor before stopping, the upload still completes and a toast gives you a Copy URL affordance so you can paste the embed anywhere.
- Up to 10 minutes per recording, WebM by default (VP9 or VP8 with Opus, whichever the browser negotiates). MP4 uploads also accepted for videos brought in from other tools.
- Storage stays in your infrastructure: self-hosted keeps every byte on your hardware, Ithura Cloud keeps it in the EU. No third-party CDN, no cross-account replication, no telemetry back to a video vendor.
- Works for bug repros, product tours, retro takes, onboarding pages, and any comment that would otherwise need ten messages of back-and-forth. The recording lives with the task or page it is about; no link rot.
NewSovereignComplianceEnterprise
Sovereign Ithura: the compliance answer pack, live
Ithura now ships a full sovereign answer pack for procurement, security review, and DPO-facing work: eight docs covering GDPR, NIS2, DORA, data residency, air-gap install, SBOM and signatures, and audit-log export, plus a fill-in DPA template and a dedicated /sovereign landing. Every release image is signed and every workspace on Enterprise can stream its full audit log to CSV.
- New public section at /sovereign with a one-page pitch, and a curated /docs/sovereign tree: data residency, GDPR (Articles 30 and 32), NIS2 (all ten Article 21(2) measures), DORA, DPA template, air-gap install, SBOM and signatures, and audit CSV export.
- Signed SBOM in CI: every release image now ships with a syft-generated SPDX SBOM and a cosign signature. The SBOM doc explains how to verify without cosign, and how to regenerate locally.
- Streaming audit-log export: GET /workspaces/{slug}/audit-logs/export.csv returns the workspace's audit trail as CSV with the same filter surface as the list endpoint. Enterprise, workspace-admin only, streamed row-by-row so a year of events downloads without a memory spike.
- Fill-in DPA template usable in the three common processor scenarios (you host, a partner hosts, or Anorph runs Ithura Cloud), with clause-level guidance and no vendor lock-in language.
- Admin panel gets a Sovereign section so an operator can see which sovereign controls are configured on the instance at a glance.
NewSovereignExportEnterprise
Workspace file: your whole workspace as one SQLite you can grep
The new Workspace File export packages your entire Ithura workspace into a single SQLite database: 19 tables, indexed, with parent-child foreign keys intact and a bundled DuckDB cookbook README. GDPR Article 20 answered in one click, and a portable archive you can query in every tool that speaks SQL, without an Ithura API token.
- One-click export from Settings, Exports: pick Workspace file (SQLite) and receive a zip containing workspace.db plus a README with the schema and copy-paste DuckDB queries.
- Nineteen tables cover projects, cycles, modules, issues, comments, activity, wiki pages, boards, groups, memberships, custom fields, labels, and more, with real foreign keys so joins work out of the box.
- Bundled DuckDB cookbook: aggregate issue counts by state, throughput by month, per-assignee cycle time, and cross-project rollups, all runnable against the shipped file with zero Ithura tooling installed.
- Enterprise plan, workspace-admin only. Available immediately on staging; queued for production on the next release train.
- Docs live at /docs/features/workspace-file; deep dive on the blog at /blog/workspace-file.
NewForecastsAnalytics
Delivery dates as a probability distribution
Every module and sprint header now carries a live Monte Carlo forecast pill: P50, P85, and P95 finish dates computed on demand from your team's real 90-day throughput. Drag scope in, the band slides right; drag scope out, it slides left. Bootstrap sampling with 10,000 simulations per request, running inline on your Postgres. The end of astrology-driven target dates.
- Pill on every module (epic) and sprint header shows the P85 finish date by default, with a hover card that reveals the full P50 / P85 / P95 band, the throughput history it was drawn from, and a soft-forecast note when under 14 days of history.
- Bootstrap sampler runs 10,000 futures per request, each drawing a random daily throughput from the team's actual last 90 days, stopping when remaining scope is done, then reading percentiles off the distribution.
- Public API for dashboards and automation: GET /workspaces/{slug}/projects/{projectID}/modules/{moduleID}/forecast/ and the matching cycles endpoint return the band, remaining issues, average throughput, and samples used. ~2ms per call, cheap enough for a dashboard poll.
- No AI service and no cloud dependency: the sampler is a pure Postgres query plus in-process arithmetic. Runs on air-gap installs unchanged.
- Docs at /docs/features/forecasts; deep dive at /blog/forecasts.
NewWikiReactive
Live Task List: wiki pages that never rot
A wiki page can now embed a Live Task List: a filtered view of the tracker that refreshes on its own. Drop one in a PRD, a sprint retro, or an onboarding page and it never rots. Everyone reading the page sees the CURRENT state of the work, without anyone editing the page. Notion's synced blocks are one-way; this is the two-way tie only a tool with wiki and tracker under one binary can ship.
- New Sparkles button on the wiki editor toolbar inserts a Live Task List block. Click the title to rename it. Click the gear on the block header for an inline filter builder that scopes the list by state (checkboxes), assignee (anyone or 'me' for whoever is reading), priority, and limit. A chip row under the header summarises any non-default filter so readers see at a glance what is being shown.
- One row per matching task: state icon, project chip like PAR-482, title, priority, first assignee. Footer shows the shown count and the refresh cadence.
- Auto-refreshes every 30 seconds, or on click. Re-renders in place so the surrounding prose never scrolls.
- Public API mirror at GET /workspaces/{slug}/reactive/issues/ for dashboards and automation. Same filter shape as the block's picker.
- Runs on your Postgres, no external endpoints. Docs at /docs/features/reactive-docs; deep dive at /blog/reactive-docs; walkthrough at /docs/tutorials/reactive-docs-first-live-block.