BlitzGraph beta · occasional interruptions may occur
Changelog

Changelog

Recent product updates and release notes.

Beta 0.122.1
Current
Released
November 1, 2026

Model runs fail clearly when an answer is cut off, agent logins keep refreshed credentials, and queries do less work.

Beta 0.122.1

November 1, 2026Current beta

Safer model runs and faster queries

Model runs fail clearly when an answer is cut off, agent logins keep refreshed credentials, and queries do less work.

Improvements
  • Faster queries. Permission checks, definition lists and public IDs do less work on each request.
Fixes
  • Cut-off model answers fail clearly. Filtered, truncated or unfinished answers no longer count as finished. Hitting maxOutputTokens returns MODEL_OUTPUT_LIMIT_REACHED.
  • Agent logins keep refreshed credentials. A later login or logout is no longer overwritten by a running agent.
  • Queries respect access rules during definition changes. A query no longer returns units that the saved rules hide while a definition batch is applying.

Beta 0.122.0

October 31, 2026

Approve agent sign-in on the connect page

Agents authorize through an explicit confirmation, and failed batch queries report rejected.

Improvements
  • Region flags. The spaces list shows each Space’s region with its country flag.
Fixes
  • Opening a link no longer approves an agent. Only your confirmation on the connect page approves an agent code.
  • Failed batch queries report rejected. A collected batch where every item fails no longer reports partiallyCompleted.
  • Library storage usage refreshes after definition writes. Definition imports and replacements update asset usage.
Breaking Changes
  • Agent authorization uses /connect/authorize. POST /agents/auth returns authorizeUrl, and agents poll POST /api/auth/oauth2/token. /agents/auth/verify and /agents/auth/token are removed.

Beta 0.121.0

October 31, 2026

Preserve microseconds and order computed fields

Temporal values share microsecond precision. Computed fields respect their dependencies.

Fixes
  • Computed fields follow dependency order. Results no longer depend on declaration order, and cycles reject with CIRCULAR_DEPENDENCY.
  • RocksDB uses the configured options. Column families receive the same tuning when created or reopened.
Breaking Changes
  • Temporal values use microseconds. DATETIME and TIME output has six fractional digits. Sub-microsecond values reject; stored temporal representations and TIME index keys change.
  • Workflow and arc dates require DATETIME values. $arcCreatedAt filters and workflow wait.until no longer accept epoch-millisecond numbers. Workflow durations require duration strings in whole milliseconds.

Beta 0.120.0

October 31, 2026

Check data with findings

Request $findings to diagnose current data and connections.

Fixes
  • Expansions skip incompatible connections. Expansions and groups include only visible, compatible connections. Raw references stay readable.
Breaking Changes
  • Findings describe current data. $findings reports DATA, Role and Link conformance. Historical timestamps and counts are removed.

Beta 0.119.0

October 31, 2026

Reuse images and fonts

Upload images, SVG and fonts once and reuse them in portals and email.

Features
  • Library assets. Upload images, SVG and fonts, then use them in portals and email.
  • Asset revisions. Preview older revisions in Studio and filter assets by tag.

Beta 0.118.0

October 31, 2026

Smoother portal sign-in

Magic links complete in the browser that requested them, and signup can adopt existing units.

Fixes
  • Magic links complete in the requesting browser. Other browsers show Continue.
  • Signup adopts existing units. A verified email binds to its one eligible, unbound unit.
  • Namespace deletion survives interruption. Cleanup resumes after cancellation or shutdown.
  • Signed images work in canvas exports. Azure file storage allows cross-origin reads, including custom portal domains.
  • Internal fixes. More reliable lifecycle recovery and portal icon compilation.

Beta 0.117.0

October 31, 2026

Align BQL selectors and empty results

Expansions accept root selectors, expressions read captured units, and empty collections return null.

Features
  • Selectors in expansions. $expand and $expandArc accept kind, identity and search selectors.
  • Captured units in expressions. Use $var.name in JavaScript and TypeScript expressions.
Fixes
  • React hooks keep null results. Query hooks return null as data.
Breaking Changes
  • Null is the empty value. Empty arrays reject in requests. Empty public collections return null.
  • Presence uses null predicates. Use $eq: null for absence and $neq: null for presence.
  • Public-ID results have explicit shapes. Scalar public IDs return a nonempty array or null. Scalar $iid returns one object or null.
  • Unknown query keys reject. FILE content comparisons report NOT_IMPLEMENTED.

Beta 0.116.0

October 31, 2026

Retain action results and inspect runs

Action retries replay retained outcomes, and runs sort newest first.

Features
  • Retained action outcomes. Reusing an idempotency key replays the retained result. A changed request conflicts.
  • Sortable run history. Studio lists newest runs first and sorts by column. Queries filter by workflow, status and trigger.
Fixes
  • Workflow inputs apply defaults. Optional inputs receive declared defaults, including nested array items.
  • Clearer action failures. Missing secrets and code errors return typed, redacted errors.
  • Stale portal operations report PORTAL_OP_ARTIFACT_STALE. Republish the portal to recover.
Breaking Changes
  • Action execution requires an idempotency key. Send idempotencyKey or the Idempotency-Key header.
  • Run selection uses $filter. Replace the top-level workflow selector with workflowInvocation.rootWorkflow.
  • Commit trigger payloads name the operation. Values are create, update or delete.

Beta 0.115.0

October 31, 2026

One API vocabulary across SDK and MCP

MCP discovery follows caller permissions, and SDK names match the API.

Improvements
  • Permission-aware MCP discovery. List permitted operations, then fetch full schemas on demand.
Breaking Changes
  • Task operations use Run names. Use the runs surface. Artifacts live under runs.artifact.
  • Wire names use camelCase. Examples: timingMs, partiallyCommitted. Uppercase types and codes keep their spelling.
  • INVALID_REQUEST replaces INVALID_QUERY.
  • Resource writes use specific verbs. Subspaces use declare. Agent setups, keys, grants and limits use set instead of upsert.

Beta 0.114.0

October 31, 2026

Resolve composed fields and refresh caches

Filter JSON object keys, and SDK caches clear when identity changes.

Features
  • JSON object-key paths. Filter by literal keys on JSON/FLEX ONE fields, including through arcs.
Fixes
  • Consistent field pins. Cross-kind pins select the intended field in queries, expressions and SDK types. Ambiguous writes need an explicit choice.
  • Identity changes clear cached data. SDK stores clear when a response confirms a new identity.
  • Definition writes validate the final schema. Incompatible inherited fields and invalid filter keys reject.

Beta 0.113.0

October 31, 2026

Index collection members and intervals

MANY and INTERVAL indexes speed up matching queries.

Features
  • Per-element MANY indexes. Find collection members through indexed elements. Stored order and duplicates stay unchanged.
  • INTERVAL indexes. Interval queries use range indexes and still check exact endpoints.

Beta 0.112.0

October 26, 2026

Isolate portal renders and protect identities

Actions run in a sandbox, portal renders start fresh, and live snapshots hide unseen identities.

Features
  • Sandboxed Actions and builds. Network Actions and npm builds run in the configured sandbox. Paid portals fall back to browser rendering when server rendering fails.
Fixes
  • Portal renders start fresh. One render can no longer leave modified globals for the next visitor.
  • Live snapshots respect IID visibility. Snapshots omit a member IID when the caller cannot see it.

Beta 0.111.0

October 26, 2026

Consistent responses and request refusals

Mutation results follow the request shape, and expired credentials return 401.

Fixes
  • Mutation results follow the request. Batches return arrays. Single mutations keep their object or fan-out shape.
  • Expired connection credentials return 401. Invalid, inactive or expired bearer credentials report invalid_token.
  • Nested arcs reject foreign subspaces. An inline $subspace other than the parent’s returns CROSS_SUBSPACE_ARC.

Beta 0.110.0

October 25, 2026

Choose caller authority for portal operations

Portal operations use caller permissions by default, with explicit unsafe execution.

Breaking Changes
  • Portal operations use caller permissions by default. Omitting execution applies the caller’s data permissions to queries, mutations and live snapshots.
  • Unsafe execution is explicit. Queries and mutations can declare execution: "unsafe". Workflows reject unsafe execution and check caller authority for their effects.

Beta 0.109.0

October 25, 2026

Explicit mutation references and appSlug

Mutation text stays literal, identity objects replace arcs, and installations use appSlug.

Fixes
  • Variable-like text stays text. Values such as _:name stay literal. Use { "$ref": "_:name" } to reference a variable.
  • Identity objects replace arcs. An identity-only arc object replaces the arc like a bare ID. Use $op: "link" to add.
Breaking Changes
  • Installations use appSlug. Installation calls reject the former app selector.
  • Random bounds must be valid. randInt and randFloat reject unordered or non-finite bounds.
  • History retention moves to environment settings. Set BLITZSTORE_HISTORY_RETENTION_DAYS and BLITZSTORE_HISTORY_UNIT_MAX_EVENTS. Invalid values fail startup.

Beta 0.108.0

October 25, 2026

Steadier Studio navigation and account state

Studio keeps early navigation, cache clears work reliably, and agents use your own setup.

Improvements
  • DeepSeek endpoint overrides. DeepSeek setups accept a public HTTPS baseURL with your own API key.
Fixes
  • Studio keeps early navigation. Navigating while a subspace loads keeps the requested view.
  • Cache clears are complete. useClearBlitzCache clears cached records and cancels in-flight requests.
  • Invite failures explain the reason. Invitations report expired, mismatched-email and unverified-email failures.
  • Result types match values. DECIMAL and PERCENTAGE values are typed as strings.
Breaking Changes
  • Studio requires your agent setup. BlitzAgent uses the subscription or API key in your namespace. The platform-funded fallback is removed.

Beta 0.107.0

October 25, 2026

Unresolved IDs obey Boolean filters

Missing public IDs follow filter rules, and unsupported inputs fail explicitly.

Breaking Changes
  • Unresolved IDs follow negation. Missing or hidden public IDs match no positive filter. A negated filter can match other units.
  • Nested mutation IDs must resolve. An unresolved nested $id rejects the batch with PUBLIC_ID_NOT_FOUND, replacing NOT_FOUND_BY_CUSTOM_ID.
  • Invalid filter values reject. A value the field type cannot hold returns INVALID_FILTER_VALUE.
  • Search requires a full-text field. $search without a full-text field returns INVALID_QUERY.
  • Unsupported operations reject. Nested arc upserts and numeric aggregates over MANY fields return NOT_IMPLEMENTED.

Beta 0.106.0

October 25, 2026

Repair stored values and see live issues

Findings flag values that no longer fit their schema, and live responses carry evaluation issues.

Features
  • Find units needing repair. $findings filters select units with values outside their current schema.
  • Findings on inspected values. Inspection projections show diagnostics for out-of-domain values.
  • Live evaluation issues. Live snapshots and patches carry evaluation issues.
Fixes
  • Conversion keeps rejected values. Failed conversions keep the source value and record a finding.
  • Rust security updates. Updated WebAssembly, TLS and HTTP dependencies address known advisories. Some advisories remain open.

Beta 0.105.0

October 24, 2026

Safer file downloads and permission rules

FILE downloads keep their media type, and permission rules fail closed.

Fixes
  • FILE downloads are safer. New files keep their verified content type and download as attachments.
  • Security updates. Updated Next.js, Node and dependencies address reported remote-execution and denial-of-service vulnerabilities.
  • Portal timings are real. Query and mutation responses report measured execution time.
Breaking Changes
  • Time-window permission rules are removed. Definitions no longer support $compare rules. Rules that cannot be evaluated fail closed.

Beta 0.104.0

October 23, 2026

Safe retries and ordered live updates

Imports stay retryable, and live updates keep server order.

Fixes
  • Uploaded imports stay retryable. A refused import no longer deletes the uploaded file.
  • Live additions keep server order. New units appear at the position the server sends.
  • Grant token conflicts return 409. Reusing a token owned by another grant reports a conflict.
Breaking Changes
  • Transform hooks reject arc writes. Create and update transforms that write arc fields return NOT_IMPLEMENTED.

Beta 0.103.0

October 23, 2026

Recover demo replacement and see workflow holds

Demo replacement checks its target first, and interrupted replacements can resume.

Improvements
  • Demo replacement checks first. Invalid targets and busy workflows reject before anything is deleted.
  • Resume a replacement. Studio keeps recovery details for an interrupted replacement.
  • Workflow holds show their cause. Task details show why a workflow is held.
Fixes
  • Partial imports stop when asked. With continueOnError: false, the SDK stops after a partial result.
Breaking Changes
  • Explain counts use units. rows_in and rows_out become units_in and units_out. Sort rows becomes units.

Beta 0.102.0

October 22, 2026

Reuse design tokens and pin Library revisions

Apps and auth emails share design tokens and can pin Library revisions.

Features
  • Reusable design tokens. Create design tokens in the Library and use them in apps or auth emails.
  • Pinned Library content. Select the current head or a fixed revision of email templates and design tokens.

Beta 0.101.0

October 21, 2026

Faster magic-link sign-in

Magic links sign in with one click, and import formats change.

Improvements
  • One-click magic links. Clicking a magic link can sign in an existing account without pressing Continue.
Fixes
  • Workflow overload returns 429. Temporary capacity failures return HTTP 429 instead of 409.
Breaking Changes
  • Definition fingerprints are removed. Imports, exports and health responses no longer use $definitionContract.
  • Import releases are checked. Namespace imports reject malformed releases and releases below the supported floor.

Beta 0.100.0

October 21, 2026

Scoped field writes and retained values

Writes can target a kind context, and inspection reads show retained values.

Features
  • Scoped field writes. Use $definedOn to pick a kind when composed kinds share a field name.
  • Inspect retained values. !* or $!* show values outside their current field domain.
Fixes
  • Computed JSON expands correctly. JSON expansions use each computed field’s evaluated value.
  • Field identity survives import. Imports keep inherited fields without merging unrelated ones.
Breaking Changes
  • Wildcard DATA properties are optional. SDK wildcard types allow fields omitted because their values no longer fit.

Beta 0.99.0

October 21, 2026

Translations and kinds grouped by tag

Store and query translations, edit them in Studio, and browse kinds by tag.

Features
  • Localized text fields. LOCALIZED_TEXT stores one string per locale with a required defaultLocale.
  • Query language fallback. $locale takes a language tag or ordered list. Reads fall back to the field default.
  • Language-aware results. With $locale, filters, sorting, grouping and live results use the resolved translation.
  • Translation editing in Studio. Localized fields have translation editors and a display-language selector.
Improvements
  • Kinds grouped by tag. Studio’s schema sidebar groups kinds by tag. Untagged kinds get their own group.
Fixes
  • Independent namespace changes. Creating a namespace no longer fails another namespace’s deletion.

Beta 0.98.0

October 20, 2026

Write and edit rich text

Rich text fields store safe HTML, edit with formatting in Studio, and are searchable.

Features
  • Rich text fields. RICH_TEXT stores supported HTML and rejects unsafe markup and links.
  • Formatted editing in Studio. The editor supports headings, lists, links, quotes, code, colors and highlights.
  • Search visible text. Full-text search indexes the visible words, not HTML tags.
Improvements
  • Convert plain and rich text. TEXT to RICH_TEXT escapes the text. Converting back keeps the visible text.

Beta 0.97.0

October 20, 2026

Correct indexed pages and clearer demo loading

Indexed pages keep value order, indexes self-repair, and Studio confirms demo replacement.

Improvements
  • Demo loading asks first. Studio lists existing kinds and unit counts and warns that loading removes them.
Fixes
  • Indexed pages keep value order. Sorted results stay in order across page boundaries.
  • Indexes repair on reopen. Opening a database repairs stale indexes. Queries avoid incomplete indexes.
  • Computed fields keep their kind context. Grouping and projections honor inherited and composed definitions.
  • Prompt examples wait until ready. Start-page examples stay disabled until they can fill the prompt.

Beta 0.96.0

October 19, 2026

Start building from a chat

Start building in chat, link providers to portal accounts, and page through history in React.

Features
  • Chat-first start page. /agent asks what you want to build. Use your agent through MCP, a ChatGPT subscription, or an API key.
  • Link providers to portal accounts. A Google or GitHub sign-in with a known email sends a confirmation email. Confirming links the provider.
  • DeepSeek API keys. Agent setups accept a DeepSeek API key.
  • Paged history in React. useInfiniteQuery and useInfiniteResource read each page through selectPage.
  • More live portal queries. useLiveOperation accepts named queries with $limit, $expand or $id.
Fixes
  • Model calls no longer stop at ten seconds. They now stop after 60 seconds without provider data.

Beta 0.95.0

October 19, 2026

Declared fields only, faster presence filters

Writes must match declared fields, and kind metadata moves under $derived.

Improvements
  • Faster presence filters. $eq: null and $neq: null filters can use a field index when few units match.
  • Exports survive server upgrades. A server upgrade alone no longer blocks importing namespace exports made from this release on.
Breaking Changes
  • opts.schemaless is removed. Requests that set it are rejected. Writes to undeclared fields always fail.
  • Kind metadata moves under $derived. Read unitCount, ancestors and descendants with $fields: ["$derived"].

Beta 0.94.0

October 18, 2026

Mutation responses that match the request

Mutation responses follow each selector’s shape, and bulk deletes report each unit.

Improvements
  • Response shapes follow the request. With returnMode: "nested", each root follows its selector’s shape. Several roots return an array.
  • Bulk deletes list each unit. Each deleted unit returns deleted: true. Allowed misses return deleted: false.
Fixes
  • Mutation counts match the request. meta.count counts roots after $for and $if expansion.
  • Connect reports revocation state. A connection still updating returns 503. A revocation that keeps failing returns 409 grant_revocation_failed.
Breaking Changes
  • created, updated and deleted are reserved. You cannot use them as field names.

Beta 0.93.0

October 18, 2026

Arc filters that follow each unit

Arc filters check each unit against its own kinds, and quantifiers work on single-valued arcs.

Improvements
  • Quantifiers on single-valued arcs. $any, $all, $none and [*] work on arcs with cardinality ONE.
Fixes
  • Unknown IDs match nothing. An arc $eq or $exact with a missing public ID no longer matches the other IDs.
  • Arc filters follow each unit’s kinds. A field applies only to units whose kinds declare it. Other units count as absent.
  • Mixed-type and empty-list comparisons. Ordered comparisons skip JSON or FLEX values of another type. On MANY fields and arcs, $eq: null matches empty content.
Breaking Changes
  • Null predicates on shared field names. $eq: null requires every applicable facet to be absent. $neq: null matches any present facet.

Beta 0.92.0

October 16, 2026

Portal operations decide their own access

Portal operations declare caller access separately from data scope, and validation gets stricter.

Fixes
  • Expression errors hide stored data. Messages name the unit, field and expression, but no stored values.
  • Studio reports failed subspace changes. Studio shows the server error instead of a success message.
Breaking Changes
  • Operations declare access. Every operation not scoped to $me needs an access rule, such as "authenticated".
  • authorization sets data scope. It accepts only "unscoped". Without it, every root must be scoped to $me.
  • Field types are checked strictly. Value types parse only in UPPERCASE, such as TEXT.
  • Unsupported query options are rejected. Use opts.maxResults; opts.limits no longer accepts maxResults.

Beta 0.91.0

October 15, 2026

Workflows listen to webhooks, sockets and polls

Workflows subscribe directly to webhooks, sockets and polls in Studio, the SDK and MCP.

Features
  • Source triggers. Workflows accept webhook, websocket and poll triggers. One workflow can subscribe to several sources.
  • Trigger health and recovery. runs.workflowTrigger.query reports source health and rejected deliveries. You can restart a source, or replay or discard a delivery.
Breaking Changes
  • Source triggers replace services. A webhook trigger declares a source and a verify block. Deliveries go to POST /hooks/{database}/{namespace}/{subspace}/{source}.
  • Manual runs take input. runs.workflowRun.create rejects trigger. Workflows read it with $input.

Beta 0.90.0

October 14, 2026

Studio renames operations across apps

Studio updates operation names across apps and shows portal save diagnostics.

Improvements
  • Operation renames update every app. Renaming an operation in Studio rewrites every app that uses it.
  • Saves show diagnostics. Studio shows diagnostics the server returns on an accepted portal save.
Breaking Changes
  • Definition hooks are removed. @blitzgraph/client-react drops useSchemaQuery, useSchemaMutate, usePortalsQuery and usePortalsMutate.
  • Portal hooks need the matching operation kind. For example, useQuery with a mutation ref fails on save.

Beta 0.89.0

October 12, 2026

Grouped API routes and definition IDs

The HTTP API groups operations under six planes that grants and SDK clients also use.

Breaking Changes
  • Six API planes. units, definitions, resources, runs, installations and server each take POST /<plane>/query and POST /<plane>/mutate. Grants name their plane, such as units.read.
  • SDK and MCP follow the planes. AdminClient exposes one client per plane. MCP tools use names such as units.query.
  • Definition IDs use full family names. $did values use prefixes such as Kind: and DataField:.
  • Shared portal operations and env values. Portal operations live in portals.operations. Set env values with resources.env.set.

Beta 0.88.0

October 11, 2026

Find definitions with discovery tags

Tag definitions and filter or update them by tag in Studio, the SDK and MCP.

Features
  • Definition tags. Tag supported definitions, filter lists by tag and update them in bulk. Studio edits and filters tags.
Breaking Changes
  • Component tags replace labels. labels is rejected.
  • Export old records before upgrading. Export Kind definitions and Components with labels using the previous binary. The new binary cannot load them.

Beta 0.87.0

September 8, 2026

Validate workflow results

Declare the result a workflow must produce, and accepted runs keep that contract.

Features
  • Workflow result contracts. An optional outputSchema validates workflow results. Accepted runs keep their original contract when definitions change.

Beta 0.86.0

September 7, 2026

Start durable workflows from your portal

Portals start named workflows through generated SDK refs and get an acceptance receipt.

Features
  • Typed workflow submission. App workflowOps generate WorkflowRef exports and useWorkflowOp. Acceptance returns runId; idempotency keys make retries safe.
  • Portals on customer domains. Verified customer domains can serve their assigned portal.
  • Localized auth emails. Built-in auth emails use the app name and its English or Spanish locale.
  • Delete and wipe receipts. The SDK and MCP return receipts for definition delete, replace and wipe.
Improvements
  • Spanish documentation. Spanish routes include docs, glossary, use cases and legal pages.
  • Private query explanations. $explain withholds hidden fields, denied kinds and counts outside the caller’s data.
Fixes
  • Partial updates keep omitted fields. Missing inputs for direct field assignments no longer clear values.
  • Scoped search fills the page. Full-text search skips hidden matches instead of returning a short page.
  • Navigation keeps parent layouts. A loading child route no longer hides its parent layout or blocks clicks.
  • Loading indicators keep data. Query hooks show previous data during a refetch.
Breaking Changes
  • Portal runtime moves under /_blitz/. Old paths such as /_ops and /_auth no longer redirect. /api/{app}, /health and /favicon.ico stay at the root.
  • Portal fonts from any HTTPS origin. Portal CSP allows HTTPS font files and font CSS APIs such as Google Fonts.

Beta 0.85.0

September 4, 2026

Filters that fail with a reason

A filter that can never match now fails with an error that names the right operator.

Fixes
  • Mutations by $id respect the selector. An $id outside the $kinds, $filter or $search scope is now a no-op.
  • Batches see their own deletes. Later items in a batch no longer link to a unit deleted earlier.
Breaking Changes
  • INTERVAL containment uses $has. $contains now means TEXT substring only.
  • Ordering operators reject list bounds. $gt, $gte, $lt and $lte fail with an array, and on list group outputs. Use $eq instead.
  • $has rejects list probes outside JSON and FLEX. Use $any or $all on MANY fields.
  • Operators check the field type. Text and ordering operators on the wrong field type fail instead of returning nothing.

Beta 0.84.0

August 25, 2026

Usage meters, magic links, kind field updates

Studio shows usage, magic links open the app, and kind updates can edit fields.

Features
  • Usage meters and quotas. Studio shows storage, traffic and compute. Caps reject with QUOTA_EXCEEDED and name the quota.
  • Co-kind fields. $fields and $filter can use a field declared on another kind the unit has.
  • Kind dataFields on update. Add, patch or delete fields inside a kind update.
Improvements
  • Magic links open the app. Sign-in links redirect into the app, and auth emails carry your branding.
Fixes
  • Credential rotation keeps the grant. Rotating an MCP or agent credential no longer changes the grant owner.
Breaking Changes
  • Unsorted queries order by $iid. Pass $sort: "$id" for public ID order.
  • Kind fields use valueType. The type key and inline fields: [] are rejected.

Beta 0.83.0

August 16, 2026

Empty is null, writes refresh queries

Empty results return null, and portal mutations refresh the queries they change.

Features
  • Writes refresh affected queries. Portal useMutation refreshes only the queries whose kinds the write changed.
  • Brand kit at /branding. Find official marks, colors, type and voice.
Improvements
  • One definitions cache. The SDK, Studio and React share one cache, so a schema write updates every view.
  • Subspace names may include spaces. For example, Q3 Archive.
Fixes
  • Studio keeps kinds after agent edits. BlitzSheet no longer shows an empty kind list.
  • www redirects to the apex domain.
Breaking Changes
  • Empty results are null, not []. This covers UnitSets, MANY fields, INTERVAL slots, arcs and live snapshots. Decode with xs ?? []. Empty GroupSets stay [].
  • Query ops have no outputSchema. The output comes from the BQL.
  • MCP uses the 2026-07-28 stack. Reconnect agents to the current MCP endpoint.
  • Storage format changed. Wipe and reseed existing namespaces.

Beta 0.82.0

August 9, 2026

Edit kinds in BlitzSheet, full-screen /try

BlitzSheet edits unit kinds and long text, and /try fills the screen.

Features
  • Edit $kinds and long text in BlitzSheet. Change a unit’s kinds and edit long cells in a multiline editor.
  • Full-screen /try. The playground fills the screen, and BlitzAgent offers sign-in instead of hanging.
Fixes
  • BlitzAgent tools run again. Conversations persist after a successful turn.
Breaking Changes
  • Page access can override the app. The last explicit rule wins, so a public page can sit on a private app.
  • New BlitzCRM spaces have no seeded secrets. Set resend_api_key in Environment before sending email.
  • New error codes. Match EVAL_RUNTIME_UNAVAILABLE and AGENT_CUSTODY_GENERATION_CONFLICT where you matched INVALID_QUERY.

Beta 0.81.0

August 9, 2026

Code as `$code`, shared-field aliases

Code serializes as one $code envelope, and import can attach shared fields under local names.

Features
  • Shared fields with local names. Import attaches a shared data field to a kind under a local name with fromShared.
Improvements
  • Query captures match standalone queries. An $op: "query" $var returns the same shape as the query.
Breaking Changes
  • Code output is $code only. Responses emit { "$code": { "$lang", "$body" } } instead of $js or $ts. Input still accepts all three.
  • Older kind stores need a reimport. Wipe and reimport them before loading.

Beta 0.80.0

August 7, 2026

Denied fields stay denied

Field permissions now apply inside expressions, and name errors are consistent.

Improvements
  • Consistent name errors. Name conflicts in queries fail with the same error and path on every query path.
Fixes
  • Denied fields stay out of expressions. $js and $ts cannot read denied fields, and denied computed fields do not run.
  • Denied idField stays hidden. The $id alias falls back to the internal unit ID.
  • $groupBy respects denied fields.

Beta 0.79.0

August 7, 2026

Readable definition history

$history on definitions returns typed entries, including automation definitions.

Features
  • Typed definition history. $history returns typed entries scoped to the exact definition.
  • Automation history. Actions, workflows and embedders record readable history.
Improvements
  • One $history limit. Default 20, max 100, and $limit: 0 is valid.
  • Definition history follows retention. history.retentionDays and history.maxEventsPerUnit now apply to definitions too.

Beta 0.78.0

August 7, 2026

Try BlitzGraph without an account

A public /try page runs the Studio playground without signup.

Features
  • Public /try playground. A localized page embeds the Studio playground. No signup is required.
Fixes
  • The playground never opens a private workspace. Public playground pages use only the token their host passes. Without a token, /try shows an unavailable state.

Beta 0.77.0

August 7, 2026

Lossless export and import, clearer errors

Namespace export and import round-trip same-name fields and intervals exactly.

Features
  • Same-name fields round-trip. Export and import keep same-name DATA, ARC and FILE fields exact. Incomplete groups fail instead of guessing.
  • Lossless intervals. Exports keep exact interval bounds and inclusivity.
Improvements
  • Import errors point at the problem. Failures name the stage and the unit, field or ordinal path.
Breaking Changes
  • Some error codes change. FTS codec bounds report STORAGE_ERROR, namespace-id exhaustion reports NAMESPACE_LIMIT_EXCEEDED, and action lane and output failures report ACTION_EXECUTION_FAILED. Re-match clients that expect INVALID_QUERY there.

Beta 0.76.0

August 7, 2026

Invalid filters fail on every path

Invalid filters now fail with a typed error instead of matching nothing.

Improvements
  • One filter behavior everywhere. Root, relation, $expand, hook, mutation selector and live query filters reject the same inputs with the same errors.
  • Early $expand.$filter validation. Errors such as CURRENCY_MISMATCH appear even when no parent units match.
Fixes
  • Same-name fields cannot bypass operator checks. A DATA-only operator such as $startsWith on an arc field now rejects.
  • Relation quantifiers parse without a kind. { "posts": { "$any": { … } } } now resolves against the schema.
  • Filters with no target kind reject instead of being dropped.

Beta 0.75.0

August 6, 2026

Hashed OAuth tokens and correlation ids

OAuth tokens are stored as digests, and every response carries a correlation id.

Improvements
  • OAuth tokens are stored as digests. Session reads never return token material.
  • Every response carries x-blitz-correlation-id. Quote this header when you report a failed request.
Fixes
  • Studio History badges say definition. They no longer show the old schema label.
Breaking Changes
  • MCP clients must re-authenticate once. This release invalidates existing MCP OAuth tokens.

Beta 0.74.0

August 6, 2026

Shared data fields

Define a data field once and attach it to many kinds through schema import.

Features
  • Shared data fields. Define a data field once and attach it to several kinds on a fresh schema import. A unique shared field stays unique across those kinds. Studio and definition_mutate cannot attach them yet.
Improvements
  • Mutation projections match queries. They use the same $fetch and $as rules.
Breaking Changes
  • Root $fields on non-query mutations is rejected. Remove root $fields and $excludedFields from create, update, upsert and delete calls.

Beta 0.73.0

August 6, 2026

Open intervals and skippable expression errors

Intervals accept unbounded sides, and failing expressions can skip a unit instead of failing.

Features
  • Unbounded intervals. An interval side can be open-ended, written as ∞ or a compact form.
  • onExprError: "skip". On aggregates, projections, virtuals, computed fields and group keys, a failing expression skips that unit or contribution. Filter and sort $js remain unsupported.
Improvements
  • Group aliases may reuse field names. An explicit group key alias can shadow a schema field.
Breaking Changes
  • Empty results are data: null. A MANY query with zero units returns null, not []. Empty field arrays such as tags: [] are unchanged.

Beta 0.72.0

August 6, 2026

Errors with categories, paths and readable values

Errors carry a stable category, the failing JSON path, and values as you wrote them.

Features
  • Eleven stable error categories. Examples are invalid_request, permission, not_found and conflict. Each carries a recovery hint.
  • issues[].path on decode and write failures. Studio and the SDK can highlight the field that failed.
Improvements
  • Readable values in errors. Messages show "12:00:00.000", not Time(TimeValue(…)).
  • Did-you-mean hints. Unknown keys and filter operators suggest the closest match.

Beta 0.71.0

August 6, 2026

Code expressions on update

Update mutations accept $js and $ts field writes, like create.

Features
  • $js and $ts on update. Update field writes evaluate code the same way create does.

Beta 0.70.0

August 6, 2026

Membership exclusion is `$nin`

Use $nin for membership exclusion. $notIn is removed.

Breaking Changes
  • $notIn is removed. Use $nin. The server rejects $notIn with a hint to use $nin.

Beta 0.69.0

August 6, 2026

One canonical spelling for projections

Projection, sort and group keys have one canonical form. Input shorthand still parses.

Breaking Changes
  • Projection references use $fetch. Replace $field entries in $fields with { "$fetch": … }. Bare-string fields still work.
  • Sort and group keys use $by. Write { "$by": "name", "$order": "asc" } in $sort and $groupBy. The $field key is rejected.
  • Aggregate sort uses the same form. Replace { field, desc } with a string or { "$by": …, "$order": … }.
  • %name is input-only. Virtuals serialize as { "$code": …, "$as": … } or { "$expr": …, "$as": … }. These markers are also valid input.

Beta 0.68.0

July 29, 2026

Typed SDK for queries and definitions

The TypeScript SDK splits data, definitions and admin, and infers query result types.

Features
  • Typed query results. The SDK infers result types from BQL, including projections, expands, groups and aggregates. Mutation builders keep variables and result shapes.
  • Schema drift reports. Queries can report where stored data drifts from the schema. Strict evaluation aborts on any mismatch.
  • SDK entrypoints by capability. Import @blitzgraph/client-core/bql, /definitions or /admin for data, definitions or administration.
  • Group by expressions and arcs. Group keys accept scalar fields, computed expressions and role or link identity.
Improvements
  • Correct polymorphic filters. Filters consider every applicable kind and descendant relation target.
  • New icon set. Marketing, control plane and Studio use one Streamline icon system.
Fixes
  • Definition update and delete run correctly. They no longer fall through to create. Invalid operation arrays now fail.
  • Definition import and export requests no longer fail because of transport-only options in the payload.
  • ID values and unique-query cardinality agree across the SDK, generated types and the server.
Breaking Changes
  • The schema client is now definitions. Use client.definitions or import the /definitions entrypoint.
  • Admin methods need an explicit admin client. Use client.admin() or useAdminClient for namespace, task, blob, system and portal administration.
  • Raw dynamic operations stay untyped. Validate their results yourself, or use the typed BQL helpers.

Beta 0.67.0

July 25, 2026

Portal auth cards and connection fixes

Studio edits portal auth per provider, and several connect flow bugs are fixed.

Improvements
  • "Use another account". Re-authorize an external connection under a different identity.
  • Portal auth cards. Each provider (Email+password, Google, GitHub, Magic link) has its own card and activation dialog.
  • Template installs keep customizations. Installing a newer portal template no longer overwrites your changes.
  • Unified $groupBy. Group by stored or computed scalars, expressions and ONE arc identities. MANY keys fail explicitly.
Fixes
  • Studio no longer erases template auth on save. App settings now keep auth, env and route configuration.
  • MCP approval no longer stalls after Space approval. The final redirect reaches the client, and you can retry approvals.
  • Connect redirects use the public URL. They no longer point at the internal address.
  • Portal auth works right after environment setup. It no longer errors until another auth action runs.

Beta 0.66.0

July 25, 2026

Sitemap, structured data and use-case pages

blitzgraph.com gains a sitemap, structured data and two use-case pages.

Features
  • Sitemap and structured data. Marketing pages get a sitemap with hreflang alternates, canonical URLs, JSON-LD and an llms.txt.
  • Two use-case pages. New pages cover graph databases and agent-native application backends.
Fixes
  • Absolute URLs use the real domain. Canonical, hreflang, Open Graph and llms.txt links no longer point at localhost.

Beta 0.65.0

July 24, 2026

Operations, actions and workflows in Studio

Studio edits operations next to pages, and actions can run manually from a template vault.

Features
  • Operations in the main editor. Edit query and mutation operations next to pages, layouts and components.
  • Manual action runs. Run actions from Studio, using a reusable template vault.
Improvements
  • One app authoring surface. Settings, auth, pages, endpoints, components and operations live together. New apps require a Public, User kinds or Deny-all audience.
  • Access rules inherit. Descendants without a rule inherit their ancestor's rule chain, not the namespace default.
  • Redesigned Environment and Secret Vault. Navigation and destructive actions are clearer. Transfer & recovery moved to Namespace Settings.
Fixes
  • History no longer crashes on system events. A new System filter and kept pagination make it readable.

Beta 0.64.0

July 23, 2026

Namespace-level BlitzAgent setups

Agent provider setups live per namespace, onboarding is guided, and turn errors are clearer.

Improvements
  • Namespace-level agent setups. Configure Claude, OpenAI, GLM, Kimi or Codex once per namespace. Studio and Automation bind separately.
  • Guided onboarding. BlitzAgent starts setup in context, for Codex login or API-key providers.
  • One setup manager. Reconnect, rotate keys, assign and delete setups in one place.
  • Model selector and real errors. Studio shows a live model list per setup and the actual turn error. You can fix a retired model pin in one click.
Fixes
  • Codex turns work. A transport mismatch no longer breaks the first turn of Codex subscription setups.
  • External Automation connections can call their tools. Codex-bound connections can now invoke their granted MCP tools.

Beta 0.63.0

July 22, 2026

Reliable retries and resumable wipes

Bulk imports keep their retry budget, and you can retry interrupted wipes and restores safely.

Improvements
  • Resumable destructive operations. You can retry an interrupted wipe, reset or bundle restore without mixed state.
  • Bundle restore starts clean. .bzg imports restore into a fresh generation.
Fixes
  • Fewer conflict errors in bulk imports. The retry window starts at the first conflict, not at request start.

Beta 0.61.0

July 17, 2026

TypeScript expressions and WASM actions

Write expressions and action bodies in TypeScript, or run uploaded WASM components as pure actions.

Features
  • TypeScript definitions. Computed and default fields, mutations, workflow bindings and inline actions accept $ts or $code.
  • Protected WASM actions. pure×wasm actions run a pinned component without filesystem, network, clock or randomness access.
  • WASM module management. The TypeScript client uploads, lists, downloads and deletes components. Deletion fails while an action or hook uses the module.
Improvements
  • Consistent TypeScript diagnostics. Studio flags unsupported syntax early. The server rejects imports and unsupported constructs before saving.
Breaking Changes
  • Drain old workflow tasks before upgrading. Workers accept only workflow wire V6 and checkpoint V4. Drain or purge older queued, running or suspended development tasks, and do not run mixed worker versions.

Beta 0.60.0

July 17, 2026

Inspect effective limits before a request fails

Operators, Studio, SDKs, and agents can read the exact limits enforced for their scope.

Features
  • Effective-limit catalog. Studio, the SDK, POST /resources/query, and the limits.effective MCP tool show active request and batch limits for your scope.
  • Actionable limit failures. Rejections include configured, effective, and observed values. They also carry retry timing and a retryLater or reduceRequest remediation.
Improvements
  • Scope-safe limits. Database and namespace callers see only their own scope. Sensitive configuration details stay hidden from them.
  • Safer rate-limit identity. Rate limiting trusts forwarded addresses only when proxy-header trust is enabled.

Beta 0.59.0

July 17, 2026

Crash-resilient workflow fan-out

Workflows keep nested calls, mapped children, joins, and rollback progress across crashes and restarts.

Features
  • Map over Actions and Workflows. A map effect runs a named Action or Workflow with bounded concurrency, ordered outcomes, and retries.
  • Run timeline and tracing. Run events show child waves, joins, retries, and compensation. W3C traceparent propagates across actions and child workflows.
Fixes
  • Nested calls resume at the caller. A crash after a child call now resumes the parent instead of finishing with the child output.
  • Rollback resumes where it stopped. A crash during compensation no longer replays forward or repeats rollback steps.
  • Joins and cancellation survive restarts. Mapped children stay attached to their parent after worker moves and scope purges.

Beta 0.58.0

July 17, 2026

Resumable live queries and portal operations

Live subscriptions resume after a disconnect, and portal users get live named operations.

Features
  • Resume checkpoints. POST /units/live accepts opts.resume. After a disconnect, the server replays retained frames from your last checkpoint.
  • Live named operations for portals. Portal /_ops/query/{op}/live subscriptions enforce the operation policy. React portals use useLiveOperation().
Improvements
  • Clear resume errors. LIVE_CONTINUITY_GAP is retryable. LIVE_RESUME_UNAVAILABLE means resume is not configured.
  • Steadier reconnects. Client subscriptions back off after unstable closes and stop retrying when resume is unavailable.

Beta 0.57.0

July 17, 2026

Bounded search and Studio transfers

Search stays bounded on broad terms, numbers compare exactly, and Studio covers all transfer formats.

Improvements
  • Bounded fuzzy and prefix search. Broad terms run within work and memory budgets and stop when you cancel.
  • Exact numeric comparisons. INTEGER, DECIMAL, FLOAT, CURRENCY, and PERCENTAGE values compare consistently in filters, sorting, writes, and imports.
  • Studio Transfer panel. Export .bzg bundles, move data as JSON, and import or export definitions, portals, and automations in one place.
Fixes
  • FILE cleanup is safe. Uploads, imports, deletes, and wipes no longer remove files that another namespace or subspace still uses.
  • Transfer views stay in scope. Switching connections cancels stale requests. Subspace exports include only that subspace's selected FILE fields.

Beta 0.56.0

July 17, 2026

One response envelope and strict contracts

Every API returns the same BlitzResponse, and schema authoring accepts only canonical names.

Features
  • One response model. Every operation returns data, outcome, issues, meta, and explain with stable issue codes.
  • SDK error mode. Set errorMode: "throw" | "collect" globally or per call to throw or inspect outcomes.
Improvements
  • Clearer validation errors. Unknown keys fail with a stable code, the exact path, and the allowed keys.
Breaking Changes
  • Canonical schema names only. Use extends instead of kind-level parent and roleFields instead of kind-level roles. Use camelCase keys such as idField, userKind, emailField, onDelete, and jsonSchema.
  • Reset and reseed dev and preprod data. Old storage formats are not readable. Rebuild FTS and recreate portal registry bindings after upgrading.
  • Read issues from BlitzResponse. Use issues and meta.issues. QueryResult mirrors and endpoint-specific error payloads are gone.

Beta 0.55.0

July 17, 2026

BlitzAgent and reusable connections

Studio gains an in-product agent, named provider setups, and reusable external connections.

Features
  • BlitzAgent in Studio. Chat with an agent that uses the same MCP tools as external agents. Conversations and memory persist per scope.
  • Named agent setups. Spaces assign provider setups to namespaces. API keys stay on the server and never reach the browser.
  • Provider choice. Claude, OpenAI, GLM, Kimi, and Codex subscription execution share one model catalog and status view.
  • Reusable external connections. The /connect/* flow adds browser approval, target selection, and revocation for MCP and confidential backends.
Breaking Changes
  • Inline agent BYOK keys are removed. Create a named agent setup in Studio and assign it to the namespace.

Beta 0.54.0

July 17, 2026

Native portal sign-in and authorization

Portals sign users in natively and bind them to graph Units, with authored access rules.

Features
  • Native portal sign-in. Portals support email/password, magic link, Google, and GitHub. Signup can be open, invite-only, or closed.
  • Full account lifecycle. Email verification, password reset and change, and magic links work out of the box. Email delivery uses Resend.
  • Portal and operation access rules. App, route, page, endpoint, and named-operation rules deny by default. Guest-reachable operations must declare public.
  • Auth settings in Studio. Pages Builder configures signup mode, providers, access rules, and operation admission.
  • BlitzCRM template. A multi-tenant CRM portal with real sign-in, memberships, and role-aware routes joins the demo catalog.
Improvements
  • Access changes apply immediately. Password resets, demotions, disables, and definition changes take effect on active sessions.
Breaking Changes
  • Portal auth moved to /_auth/*. The /_session/sign-in, sign-up, sign-out, and refresh routes are removed. /_session/subject remains.
  • Reserved route prefixes. Rules under /_auth, /_session, or /_ops are rejected.

Beta 0.53.0

July 17, 2026

Durable actions and workflows

Actions and workflows run durably with triggers, simulation, and run inspection across Studio, MCP, and SDK.

Features
  • Workflow engine. Author Actions and state-machine Workflows. Trigger them manually, on commit, graph pattern, cron, webhook, signal, or from another workflow.
  • Retries without duplicate writes. Idempotency keys let client retries reuse the same run without repeating committed writes.
  • Safety tools. Lint, Mermaid render, simulation with mocks, blast-radius analysis, and golden tests are available in HTTP, SDK, MCP, and Studio.
  • Live run control. Stream run events, cancel or retry tasks, and answer an ask or send a signal to a waiting workflow.
Improvements
  • Runs keep their program. Editing, pausing, or deleting a definition does not change runs already submitted.

Beta 0.52.0

July 17, 2026

Live graph queries and reactive clients

Apps subscribe to query results over SSE and consume them through a store or React hooks.

Features
  • POST /units/live. A live query sends an ordered snapshot, then added, updated, and removed deltas.
  • Reactive clients. client.queryLive(), the new @blitzgraph/client-store package, and React useLiveQuery() share one normalized store.
  • Studio live mode. Query results can switch between one-shot runs and a live subscription.
Improvements
  • Reliable reconnects. Missed changes replay in order. Expired gaps send a fresh snapshot instead.
  • Revocable subscriptions. Revoking or rotating a credential ends the stream. Admission caps return structured 429 errors.

Beta 0.51.0

July 9, 2026

Canonical filter operators and access contracts

BQL filters use one operator vocabulary, and protected expands no longer leak hidden children.

Features
  • Canonical filter operators. Negative operators are $neq and $nin. Every surface uses the same operator set per field type.
  • Typed access rules. App, page, and endpoint access rules are typed in @blitzgraph/client-core and round-trip through Pages Builder.
  • System-managed MCP credentials. MCP dataserver tokens show as system-managed in Access. Disconnecting the connection revokes them.
Fixes
  • Protected expands hide children. Hidden child units no longer leak through nested filters, pagination, aggregates, or explain counts.
Breaking Changes
  • Removed filter spellings. Replace $ne with $neq and $notIn with $nin. Replace $includes and $overlaps with $has, $any, $all, $none, $exact, $contains, or $intersects by field cardinality.
  • access: null only clears on update. Create, import, and read reject it. Clear a rule through an update instead.
  • Permission rules reject $js. Use BQL predicate rules over $me.

Beta 0.50.0

July 8, 2026

App-user permissions and env vault

Portals gain BQL-native user permissions, and namespaces gain a vault for constants and secrets.

Features
  • Portal user subjects. Signed-in portal users resolve to a graph unit on every request. React portals read it with useMe().
  • BQL kind permissions. Kinds declare userKind, emailField, and permissions. Rules over $me filter reads, gate writes, mask fields, and control links.
  • Portal access rules. App, page, and endpoint access rules use $me predicates. Missing auth returns SIGN_IN_REQUIRED; denial returns ACCESS_FORBIDDEN.
  • Namespace env vault. Manage constants and write-only secrets from the SDK (client.env()), MCP, and the Studio Env panel. Read APIs never return secret values.
Improvements
  • Permission changes apply immediately. Deleting a subject or changing its kinds or rules takes effect on the next request.
Breaking Changes
  • Grants need route permissions. A token without the permission for a route gets PERMISSION_DENIED instead of full namespace access.

Beta 0.49.0

July 5, 2026

BQL projection and grouping semantics

BQL gains per-row field disambiguation, explicit windowing, and one grouping model for root and nested queries.

Features
  • $definedOn for same-named fields. Rows with conflicting definitions return a $ambiguous marker. $definedOn picks one defining kind.
  • Separate unit and group windows. Node $sort, $limit, and $offset select units before grouping. $groupBy holds its own filter, sort, and paging.
Improvements
  • Null filters test presence. $eq: null matches missing values. $neq: null matches present values.
  • Nested grouping matches root grouping. Grouped and aggregate expands behave like root queries.
Breaking Changes
  • Group-row operations moved under $groupBy. Use $groupBy.$filter for HAVING and $groupBy.$sort, $limit, $offset for group paging. Node-level $having is rejected.
  • Windows with grouping need $sort. $limit or non-zero $offset combined with $groupBy or $aggFields requires an explicit $sort.
  • Ambiguous writes fail. Writes to an ambiguous same-name field return AMBIGUOUS_FIELD_ACROSS_KINDS.

Beta 0.48.0

July 4, 2026

Self-service namespace bundles

Download and upload whole-namespace or per-subspace .bzg bundles from the API, SDK, and Studio.

Features
  • .bzg bundles. Plan with transfer.planExport, download with POST /runs/transfer/download, and import with transfer.import. Imports resume when the same bundle is retried.
  • Bundle SDK and Studio panel. namespace.bundle.plan/export/import wraps the API. Studio adds bundle downloads, uploads, and status.
  • MCP namespace binding. Connecting MCP binds the grant to one namespace. opts.defaultSubspace routes a single call to another subspace.
Fixes
  • Portals render if SSR fails. A failed SSR runtime no longer blocks server startup. Affected portals fall back to client rendering.
Breaking Changes
  • Rust Transaction API removed. Use the single-call query, mutate, and import paths.
  • New transfer request shape. Use include.definitions, include.units, and include.files instead of files: { mode: ... }.

Beta 0.47.0

June 16, 2026

Namespace export and import

Export a whole namespace with its files and import it into a new target from API, SDK, MCP, or Studio.

Features
  • Whole-namespace export and import. Export schema, portals, data, and arcs to a verified artifact. Import into an empty target, created if missing.
  • Resumable imports. Imports commit in chunks (chunkSize, default 1,000). Re-importing the same artifact resumes from the last chunk.
  • Large exports. Opt in to payload: "ndjsonZstd" for streaming exports. Store artifacts on local disk or in S3.
  • FILE attachments. Include files with files: "all" or per-subspace files: "selective". The default stays "rejected".
  • Studio import and export. The Namespaces panel lists artifacts, exports with subspace and file choices, and shows import status.
Improvements
  • Export preview. POST /runs/query shows what an export will contain before it runs.

Beta 0.46.0

June 13, 2026

MCP namespace targeting

MCP agents pick a namespace during OAuth and route single calls with opts.defaultSubspace.

Features
  • Grant-bound namespace. OAuth binds the MCP grant to one namespace. Reconnect to change it; use opts.defaultSubspace for one call.
  • api.connection reports the target. It returns the grant space, default subspace, and routing guidance for direct API or SDK use.
Improvements
  • Stricter OAuth registration. /api/auth/mcp/register rejects unsafe redirect_uris such as 0.0.0.0, non-loopback http, and javascript:.

Beta 0.45.0

June 9, 2026

Batch-size guardrails

Oversized mutation batches fail fast with BATCH_TOO_LARGE instead of exhausting memory.

Features
  • maxBatchSize caps. db.mutate() allows 10,000 operations per call and definition_mutate allows 500 items. Larger batches return BATCH_TOO_LARGE.
  • Configurable caps. Raise maxBatchSize per call or per namespace, up to the server hard cap. /resources/query shows the effective values.
Breaking Changes
  • The cap counts every operation. Creates, updates, upserts, deletes, nested queries, and each explicit link target all count. BATCH_TOO_LARGE reports unit: "operations" instead of "units".

Beta 0.44.0

June 5, 2026

Filter and sort relationships by arc time

Inside $expandArc, filter and sort related units by when each link was created.

Features
  • $arcCreatedAt in $expandArc. Filter with comparison operators and sort with -$arcCreatedAt. It must be a top-level condition and the primary sort key.
Fixes
  • Paged $expandArc keeps timestamps. A role-field expand with $limit no longer returns $arcCreatedAt: null.

Beta 0.43.0

June 3, 2026

Cursor pagination and stricter options

Queries page with an opaque cursor, empty results explain themselves, and unimplemented options reject.

Features
  • Cursor pagination. Pass $cursor with $limit and replay meta.$nextCursor to fetch the next page. It works on root queries only and excludes $offset.
  • Query warnings. A filter that matches zero units, or an empty $in: [], returns a warnings entry that explains why.
  • Subspace on definition reads. Definition reads and exports return the resolved meta.subspace. An empty read warns and names the other subspaces.
Breaking Changes
  • /resources/mutate uses the envelope. Send { "mutation": { … }, "opts"?: { … } }. A bare resource body is rejected.
  • Unimplemented options reject. parallel, limits.maxMemoryBytes and limits.maxRegexComplexity return NOT_IMPLEMENTED instead of being ignored.
  • Unknown option keys reject. Every envelope endpoint returns UNKNOWN_OPTS_KEY. 429 and 408 responses use the { errors: [{ code, message }] } shape.

Beta 0.42.0

May 30, 2026

Transactional search and stable query speed

Search indexes commit with your data, and the same query runs at the same speed.

Features
  • Search commits with your data. A committed unit is always searchable. A failed write rolls back its index changes.
Improvements
  • Reliable large search imports. Bulk imports no longer fail with opaque storage errors. Overload returns a 429 that bulk import retries.
  • Stable query latency. Queries on both unique and indexed fields now prefer the unique index. The same query no longer swings from microseconds to milliseconds.
  • unique fields use their index. Equality lookups on a unique field no longer fall back to a full kind scan.
Fixes
  • Ambiguous multi-kind writes fail clearly. A field with conflicting definitions across a unit's kinds returns AMBIGUOUS_FIELD.

Beta 0.41.0

May 26, 2026

Atomic schema changes

Schema batches are all-or-nothing, and deletes record the links they break.

Features
  • All-or-nothing schema edits. A definition_mutate batch commits in one transaction. If one item fails, the whole batch rolls back. import and wipe are atomic per call.
  • Deletes record broken links. Deleting a unit emits unlink events for its relationships. They appear in mutation output, $history and update hooks.

Beta 0.40.0

May 18, 2026

Schema-level hooks

Hooks move to a named top-level registry with BQL-shaped targets.

Features
  • Manage hooks with definition_mutate. Create, update, delete and query hooks with { "$type": "hook", "name": "..." }.
  • Hooks run only on matching kinds. A mixed batch runs hooks only against units of hooked kinds.
  • Hook dependency checks. Deleting a kind or field that a hook targets fails with a clear error.
  • Transform conflict detection. Two transform hooks that write the same path on one unit fail the batch.
  • Studio Hooks section. The schema sidebar lists each hook with its name and type.
Fixes
  • Duplicate kinds fire once. ["Post", "Post"] in $kinds.$any no longer runs a hook twice.
Breaking Changes
  • Hooks move to schema.hooks. Per-kind hooks blocks are removed and rejected on import. Rewrite them as schema.hooks["Post.audit"] = { type, target, $js }.
  • Hook targets are BQL-shaped. Use { ops, $kinds, $filter }. ops accepts create, update and delete; use update for link changes.
  • One hook per name. Updating a hook replaces it. Use distinct names to attach several hooks to one kind.

Beta 0.39.0

May 17, 2026

Save-time portal checks and component rename

Portal saves catch broken hooks and typos, and component renames update imports.

Features
  • Portal hooks checked on save. Unknown or misused hooks reject at save time with a suggestion, not in the browser.
  • Undefined variables caught on save. A typo like useMutationn rejects with the line number and a spelling suggestion.
  • Component rename updates imports. Renaming a component rewrites @components/OldName in every page, layout and component.
  • useQuery(ref) without {}. Operations with no input fields accept the ref alone.
  • $search gains $mode: "all". It runs every search strategy at once and returns the broadest match set.
Improvements
  • Double-click to edit in Studio. Double-clicking a kind or field opens its edit modal on that field.
  • Clearer strict-mode errors. additionalProperties rejections name the field that triggered them.
  • Better doc search. Partial and alternate terms find the right page.
Fixes
  • Namespace-imported hooks validated. They get the same save-time checks as default imports.
  • App saves reject pages and layouts. Pages or layouts in an app update reject instead of being dropped silently.

Beta 0.38.0

May 14, 2026

Roundtrip-safe data import and export

Exports produce query-shaped units that import back with their relationships.

Improvements
  • Multi-subspace imports. Items in one import payload can carry $subspace.
  • Precise import errors. Duplicate $id, id conflicts and missing kinds return structured error codes.
Fixes
  • Relationships survive a roundtrip. Imports rebuild exported relationships without hand-written $var aliases.
Breaking Changes
  • Data import is create-only. /units/import rejects items whose $op is not create.
  • Exports omit mutation fields. Exported units drop $op, $var and $iid. Import uses $id to rebuild relationships.

Beta 0.37.1

May 14, 2026

Scan-aware file uploads

File uploads use stricter checks, and file links respect scan status and expiry.

Improvements
  • Stricter file uploads. Studio and portals check filename, MIME type, file content and size on every upload path.
  • Scan-aware file links. Processing or blocked files have no download URL. Ready files report when their link expires.
  • React previews show file states. Previews render processing and blocked states and refresh links before they expire.
Fixes
  • Portal upload bypass closed. Inline portal uploads get the same checks as staged uploads.
  • Safe filenames in previews. Malicious filenames render as plain text.

Beta 0.37.0

May 14, 2026

Canonical import envelopes and portal checks

Imports and exports share one envelope across HTTP, SDK and MCP, and portals validate on save.

Features
  • One document for schema and portals. /definitions/import and /definitions/export carry kinds, apps, components and shared operations.
  • Subspace by name or ID. opts.defaultSubspace accepts either, like per-item $subspace.
  • Feedback dialog. The site header sends bug reports, feature requests and other feedback.
Improvements
  • Portal ops validated on save. BQL, $input markers, inputSchema and invalidation targets are checked before an app saves.
  • Daily data snapshots. Hosted server data has daily snapshots with per-environment retention.
Fixes
  • Imports land in the right subspace. Every import path keeps opts.defaultSubspace.
  • Presigned file uploads work. The security policy no longer blocks Studio and portal uploads to S3.
Breaking Changes
  • Definition endpoints are plural. Use /definitions/query, /definitions/mutate, /definitions/import and /definitions/export.
  • Import and export use envelopes. /units/import takes { units, opts? } and /units/export takes { selector?, opts? }. Set the subspace with opts.defaultSubspace.
  • Options are camelCase only. Use timeoutMs, failFast, returnMode and so on. Snake_case keys and a root subspace field reject.
  • Import and export results are camelCase. Results use inputItems, unitsCreated and byKind. Export returns units instead of items.
  • Portal TSX uses refs from @app/ops. String op names, local refs and tuple-destructured hooks reject on save.

Beta 0.36.0

May 13, 2026

Separate schema and portal wipes

wipe_schema now clears kinds only, and new ops wipe definitions or portals.

Features
  • wipe_definitions. It clears kinds, apps and components. It rejects when the subspace holds unit data.
  • wipe_portals. It clears apps and components and keeps kinds and data.
  • SDK and MCP wipe accessors. subspace.data, .definitions, .schema and .portals each expose wipe(). MCP adds matching tools.
Breaking Changes
  • wipe_schema clears kinds only. Portals survive. Use wipe_definitions (subspace.definitions.wipe() in TS) for the old full wipe.
  • TS wipeSchema changed the same way. Migrate full-reset calls to wipeDefinitions() or subspaceWipeDefinitions().
  • Studio button renamed. "Wipe Schema" is now "Wipe Definitions".

Beta 0.35.0

May 12, 2026

Full-screen Studio and larger portal uploads

Studio opens full screen, space lists load reliably, and portal uploads exceed 2 MiB.

Features
  • Full-screen Studio. /u/<owner>/<space>/studio and /o/<owner>/<space>/studio open the workspace without app chrome.
  • Larger portal uploads. Portal operations with files can use the server request limit instead of a 2 MiB cap.
Improvements
  • Reliable space loading. Dashboard spaces load after first login and quick navigation without hanging.
  • Sign-out clears cached spaces. Switching accounts no longer shows the previous account's spaces.
  • Open in Studio waits for placement. The action stays disabled until the space has a server.
  • Rate-limited public entry points. Sign-in, agent device auth and feedback return rate-limit responses on repeated requests.

Beta 0.34.1

May 12, 2026

Portal hook checks and small fixes

Portal saves catch tuple-destructured hooks, and several Studio and MCP issues are fixed.

Features
  • Tuple hooks caught on save. const [x] = useMutation(ref) fails on save with the line, instead of crashing at runtime.
Fixes
  • Runs query accepts subspace names. /runs/query?subspace=<name> no longer returns 400 from Studio.
  • Map-shaped definition input. schema_import, portals_import and set_definitions accept slugs as map keys.
  • Explicit ports in image allowlists. Origins like https://host:443 are accepted.
  • MCP fixes. Long-lived sessions no longer leak memory. Error codes reach clients intact.

Beta 0.34.0

May 10, 2026

File fields, typed literals and native expressions

FILE fields work everywhere, typed literals use #… keys, and portal ops get schemas.

Features
  • FILE fields. Write a File or Blob inline. Read back filename, MIME type, size, a signed url and image thumbnails.
  • Blob upload APIs. Use /units/blob/presign and /units/blob/finalize, or blob.uploadFile. mutate() switches to multipart for File values.
  • File UI in React and Studio. @blitzgraph/client-react exports FilePreview, FileDownloadLink and FileUploadInput. BlitzSheet previews and replaces FILE cells.
  • Native expressions. Virtual fields can use { "$expr": { "@text.concat": [...] } } as a checked fast path. $js still works.
  • Portal op contracts. queryOps and mutationOps can declare inputSchema and outputSchema. Generated @app/ops refs validate them.
  • Portal image allowlist. Declare dynamic image hosts in portalSecurity.externalImages.manualOrigins.
  • MCP file tools. Agents can upload files through MCP, including blob.uploadMany.
Improvements
  • Portals cannot be framed. Portal pages run under a stricter CSP that denies framing.
Fixes
  • Space slugs are per owner. Two owners can use the same slug.
  • Safe file links. Studio rejects unsafe URL protocols in file previews and downloads.
  • Multipart size cap. Portal uploads are size-checked before parsing.
Breaking Changes
  • Typed literals use #… keys. Write { "#decimal": "…" } or { "#intervals": [...] } instead of the $… forms.
  • Interval filters renamed. Replace $covers with $contains. Use $intersects for overlap.
  • Subspace option renamed. Query and mutation options use default_subspace instead of subspace.
  • Definition export takes no body. POST /definition/export?subspace=main expects an empty body.
  • Definition import is nested only. Send { schema: { kinds }, portals: { apps, components } }. Use schema_import or portals_import for one branch.
  • FILE markers use #file. Placeholders are { "#file": "file_0" }. Old $file and $cap shapes reject.
  • Strict portal op schemas. inputSchema and outputSchema accept a JSON Schema subset. Object inputs must declare additionalProperties.

Beta 0.33.0

May 9, 2026

Numeric type conversions

Fields convert between numeric types, and a background task rewrites stored values.

Features
  • Numeric conversions. valueType changes among INTEGER, DECIMAL, FLOAT and PERCENTAGE succeed. CURRENCY is not supported yet.
  • Rounding policy. numericPolicy picks rejectOnLoss (default), round, truncate or allowPrecisionLoss. NaN and infinity always reject.
Improvements
  • Banker's rounding. round turns 2.5 into 2 and 3.5 into 4. Use truncate to round toward zero.
  • Safer precision checks. rejectOnLoss catches scale-only drops. Out-of-range FLOAT to INTEGER values reject.
Breaking Changes
  • Conversions run in the background. Numeric valueType changes commit at once. A background task rewrites stored values and reports per-value failures.
  • New error code. Unsupported numeric changes return INVALID_NUMERIC_CONVERSION instead of INVALID_TEMPORAL_CONVERSION.
  • numericPolicy is validated. It rejects without a valueType change, on temporal changes, or with a typo.

Beta 0.32.0

May 8, 2026

HTTP 422 errors and object mutation hooks

Rejected requests return 422, schema batches order themselves, and mutation hooks return objects.

Features
  • Schema batches order themselves. definition_mutate runs creates dependencies-first and deletes dependents-first. You no longer order batches by hand.
Improvements
  • TS client handles 422. It still returns the parsed response. Void methods throw BlitzGraphError.
Breaking Changes
  • Rejected bodies return 422. Responses with non-empty errors[] use 422 instead of 200. The body shape is unchanged.
  • Mutation hooks return objects. Write const { mutate, isLoading } = useMutation(ref) instead of tuple destructuring.

Beta 0.31.4

May 8, 2026

Symmetric relations and self-relation checks

Writes enforce symmetric: true and allowSelfRelation: false.

Features
  • Symmetric roles. A reverse edge that duplicates an existing one rejects with SYMMETRIC_RELATION_EXISTS.
  • Self-relation check. By default, one player in two roles of a relation unit rejects with SELF_RELATION_FORBIDDEN.

Beta 0.30.3

May 8, 2026

Safer destructive actions and credential UX

Destructive subspace actions move to a menu, and token rotate and revoke need confirmation.

Improvements
  • Subspace actions in a menu. Wipe and Delete moved into a kebab menu. The menu also opens BlitzSheet and Query Studio.
  • Confirmed rotate and revoke. Rotating or revoking a token needs confirmation. Expiry shows date and time.
  • https:// by default. The Studio connection modal adds https:// to remote URLs and keeps http:// for loopback.
Fixes
  • Misleading copy button removed. The Access page button copied metadata, never the token secret.
  • IPv6 loopback detected. ::1 and [::1]:3011 no longer get https://.

Beta 0.30.2

May 8, 2026

Stricter React SDK types

React hook misuse fails to compile, and cached query data is frozen.

Breaking Changes
  • useRawResource.data is read-only. The array is frozen. Copy it with [...result.data] before changing it.
  • useInfiniteQuery needs paged output. The ref must return { items, nextCursor? }.
  • <TSelected> needs select. useQuery and the raw query hooks accept a selected type only with a matching select projection.

Beta 0.30.1

May 7, 2026

Structured envelope errors and visible truncation

Envelope rejections carry error codes, and truncated mutation errors are no longer silent.

Features
  • Structured envelope errors. Rejections return UNKNOWN_ENVELOPE_KEY, UNKNOWN_MULTIPART_FIELD or INVALID_ENVELOPE. Clients can branch on code.
  • Content type docs. Every content type ships a docs: { summary, description, related } block in the SDK and JSON Schema.
  • Portal 404 page. Unknown portals show a browser-friendly 404. A new portal is never hidden by a cached 404.
Improvements
  • All validation errors at once. Parse-time mutation validation reports every item error, even with failFast: true.
  • Visible truncation. When maxErrors truncates the list, MutateResult.info reports how many errors were elided.

Beta 0.30.0

May 6, 2026

Exact numeric types and MCP tools

NUMBER splits into INTEGER, DECIMAL and FLOAT, and the MCP server gains three tools.

Features
  • Three numeric types. Use INTEGER for counts, DECIMAL for money and FLOAT for scientific values.
  • Exact decimals. DECIMAL supports a fixed scale up to 28. Values round-trip exactly as { "#decimal": "<string>" }.
  • Numeric cell editors. Studio sheets get dedicated INTEGER, DECIMAL and FLOAT editors. The DECIMAL editor keeps full precision.
  • Typed error codes. @blitzgraph/client-core exports SERVER_ERROR_CODES, ERROR_DESCRIPTORS and isKnownErrorCode().
  • New MCP tools. studio.open returns a Studio URL, portals.url resolves a portal URL, and feedback.send posts feedback.
  • Rename pages in Pages Builder. Rename pages and layouts directly from the tree.
Improvements
  • Exact percentages. PERCENTAGE now uses DECIMAL, so percentages round-trip exactly.
  • No FLOAT keys. FLOAT fields cannot be unique, indexed, idField or interval bounds.
Fixes
  • Number() in $js. Expressions like Number(x) work again.
  • Currency metadata. Switching a field out of CURRENCY no longer leaves stale currency metadata.
Breaking Changes
  • NUMBER is removed. Migrate each field to INTEGER, DECIMAL or FLOAT.
  • No numeric type changes yet. Changing between numeric valueTypes is rejected until 0.33.0.
  • Decimal aggregates are strings. SUM, AVG, MIN, MAX and MEDIAN on DECIMAL return decimal strings. STDDEV still returns a number.
  • Decimals in $js. Return { "#decimal": "<string>" } for DECIMAL fields. A JS number may lose precision.
  • No NaN or Infinity in DECIMAL. These values are rejected with FLOAT_NOT_FINITE.
  • Dev databases wiped. Re-import schemas and data on upgrade.

Beta 0.29.0

May 2, 2026

Native currency and path-keyed portal layouts

CURRENCY becomes a value type, portal layouts key by path, and BQL contracts get stricter.

Features
  • Native CURRENCY. Declare a fixed currency (currency: "USD") or any currency (currency: "*"). Values are { amount, currency }.
  • Scalar money writes. Fixed-currency fields accept bare amounts in writes and filters, like 19.99.
  • Currency in Studio. Studio shows money as amount currency, converts pasted values and offers a currency picker.
  • Batch doc lookup. POST /docs/batch and client.docs.batch() look up several docs in one call.
  • Per-page layout override. layoutChainOverride lets a portal page inherit, skip or replace its layouts.
  • Delete layouts. The portals client adds a layout.delete mutation.
Improvements
  • Clear currency errors. Currency parse errors name the exact problem, like a bad ISO code.
  • Truthful failed batches. Aborted batches no longer return IDs of units that were never saved.
  • React cache invalidation. The React SDK now invalidates on unlink and on every $id shape.
Fixes
  • User fields named created. Fields named updated, created or deleted are no longer stripped.
  • Currency round-trips. Leaving CURRENCY clears stale metadata, so export and import succeed.
Breaking Changes
  • $ids is removed. Use $id: [a, b] or $id: { "$in": [...] }.
  • valueType and dataFields. Data fields use valueType, not type. Kinds use a dataFields object, not a fields array.
  • Unknown keys rejected. Definition payloads reject unknown keys.
  • Root update needs a selector. Use $id, $iid, $kinds, $filter, $search or $var. Set $setKinds at the root only.
  • Identity-only definition queries. definition_query without $fields returns identity only. Use $fields: "*" for full payloads.
  • Limited $expand and $filter. In definition_query, $expand sits inside $fields. $filter accepts equality and $in only.
  • CURRENCY needs currency. Multi-currency fields reject bare amounts. Cross-currency comparisons currently match nothing.
  • Layouts keyed by path. routeTree is removed. Rename layout keys to paths, like "/dashboard".
  • Renamed client types. OperatorDoc is now DocOperator. Route-tree types are removed.

Beta 0.28.0

April 27, 2026

Dates, times and stricter BQL

Native date, time and interval values land, and BQL rejects malformed requests.

Features
  • Date and time types. DATE, DATETIME and TIME are native value types.
  • Intervals. Store { "#intervals": [...] } and query with $contains and $intersects.
  • Multi-target mutations. Mutations can target many units with $filter, $search, $kinds, $sort and $limit.
  • Response timings. Responses include meta.timings, and Studio shows the breakdown.
Improvements
  • Safe role changes. Role renames update dependent links. Deletes that would break links are blocked.
  • Clearing a parent works. update_kind_in with parent: null now clears the parent.
  • Temporal types in Studio. Studio renders and validates dates, datetimes and times separately.
Fixes
  • Wildcard roles export. Exports write wildcard playedBy as ["*"].
  • Role renames on descendants. Renames keep descendant link fields intact.
  • Custom IDs in scoped arcs. $id lookups work with custom idField inside parent scopes.
  • Comments in JS defaults. Comments and regex in JS defaults no longer break field dependencies.
Breaking Changes
  • DATE is date only. Use DATETIME for timestamps.
  • Interval syntax. Use { "#intervals": [...] }. Replace $includes and $overlaps with $contains and $intersects.
  • Cardinality shortcut removed. Replace { "min": n, "max": n } with "MANY" or { "MANY": { "min": n, "max": n } }.
  • Stricter BQL. Malformed filters, unknown operators and scalar $expand now fail.
  • $meta inside $fields only. It is no longer a root query key.
  • Same-batch targets need $var. $filter and $search in mutations ignore units created earlier in the batch.
  • Upsert needs one identity. Use one $id, $iid or $filter.
  • Roles need playedBy. Creating a role without playedBy fails.
  • React raw hooks moved. useResource is now useRawResource in @blitzgraph/client-react/raw.
  • token auth surface. @blitzgraph/client-core renamed its auth* exports to token.
  • KindDef moved. Import KindDef from the defs entry point.
  • Portal maps. Layouts key by name. Send pages and layouts as a map, not an array.

Beta 0.26.0

April 18, 2026

MCP server, @blitzgraph packages and storage reset

Agents connect over MCP, packages move to @blitzgraph/*, and stored data needs a reset.

Features
  • Google sign-in. Sign in with Google, GitHub or a magic link.
  • MCP server. Claude Code and Codex connect to /mcp with device-flow OAuth.
  • MCP tools and resources. Agents can query schemas, portals, data and docs.
  • Docs API. /docs/* serves overviews, concepts, operators and examples.
  • More subspaces. Each namespace holds up to 65,535 subspaces, up from 255.
  • Namespace tasks. Namespace-scoped principals can list and run tasks in their namespace.
Improvements
  • Definition bundles. Bundles are { $bzv, schema, portals }. The TS client adds client.schema and client.portals.
  • Additive import. definition_import rejects kinds, apps or components that already exist.
  • Stable IDs. Namespaces and subspaces expose a $rid that survives renames.
  • Simpler billing upgrade. Upgrading opens a "book a call" modal.
Fixes
  • Task isolation. Namespace task APIs no longer show other namespaces' tasks.
  • Search reindex. Field schema changes trigger search reindexing.
  • Rate limit spoofing. Rate limits no longer trust client-supplied forwarding headers.
  • Shared queries. Components sharing a query no longer get stuck on pending.
  • Schema view. Studio keeps the last good schema when a refresh fails.
  • Header links. Marketing header anchors work from every page.
Breaking Changes
  • Storage reset. Data stored before this release is incompatible. Reset or reimport it.
  • Packages renamed. Use @blitzgraph/client-core and @blitzgraph/client-react. The API is unchanged.
  • Nested definition shape. Read raw exports from .schema.kinds and .portals.{apps,components}.
  • Docs consts removed. Replace CONCEPTS_MANIFEST and OPERATOR_DOCS with client.docs.list().
  • BQL envelope. HTTP BQL routes require the envelope with body.
  • Task target. Tasks return target instead of namespace, subspace_id and scope.
  • Unknown namespace errors. POST /runs/query returns 400 for an unknown Blitz-Namespace.
  • Subspace RIDs. Set defaultSubspace as a RID like Subspace:2.
  • Bearer auth. Send Authorization: Bearer <token> for bzt_* and bzi_* tokens. blitz-internal-key is removed.

Beta 0.25.1

April 16, 2026

Early Google sign-in and MCP (see 0.26.0)

An early cut of Google sign-in and MCP, consolidated into 0.26.0.

Features
  • Google sign-in. Sign in with Google, GitHub or a magic link.
  • MCP server. Claude Code and Codex connect to /mcp with 10 schema, portal and BQL tools.
Fixes
  • OAuth double-click. Social sign-in buttons stay disabled during the redirect.

Beta 0.25.0

April 11, 2026

Tunnel writes and root aggregates

Tunnel writes through role links and root aggregates without $groupBy.

Features
  • Root aggregates. Aggregate queries return one summary without $groupBy.
  • Tunnel writes. Query, update and create through link fields with target: "role".
Breaking Changes
  • Mutation envelope. POST /resources/mutate requires $type and $op.
  • Import progress. POST /units/import streams progress with Accept: text/event-stream, else returns JSON.
  • Tunnel endpoint writes. Endpoint-shaped tunnel writes are rejected. Use projected updates or relation-tree create.

Beta 0.24.0

April 9, 2026

Magic link sign-in

Email sign-in and a more stable feedback widget.

Features
  • Magic link. Sign in with an email link.
Fixes
  • Feedback widget. Conversations stay stable in long sessions.

Beta 0.23.0

April 7, 2026

Public docs and legal pages

Public docs, legal pages and a refreshed landing page.

Features
  • Public docs. A full public docs page.
  • Legal pages. Terms, Privacy, Acceptable Use and Report Abuse pages.
Fixes
  • Clearer errors. Custom-ID and not-found errors are clearer.

Beta 0.22.0

April 5, 2026

Storage reset and stricter URL config

Stored data needed a reset, and server URL config became stricter.

Breaking Changes
  • Storage reset. Existing data needed a reset or reimport.
  • Server URLs. baseUrl and publicUrl must be valid.

Beta 0.21.2

April 4, 2026

Automatic Studio and Playground connections

Studio and Playground connect more reliably.

Fixes
  • Studio connection. Studio reconnects cleanly and resolves the right space.
  • Playground autoconnect. Playground connects automatically more reliably.

Beta 0.21.0

April 1, 2026

Open Studio from a space

Studio opens from a space with less setup.

Features
  • Studio from a space. Open Studio from a space without manual connection setup.
Fixes
  • Studio navigation. Opening Studio from a space lands on the right server.
  • Footer links. Docs and changelog links point to the right pages.

Beta 0.20.0

March 31, 2026

Real space provisioning

Spaces provision for real, with real tokens and billing.

Features
  • Space provisioning. Creating a space provisions it and shows a builder token once.
  • Tokens and billing. Spaces show real tokens and billing data.
Fixes
  • Sign-in redirect. Signed-out users go to the home page.

Beta 0.19.0

March 24, 2026

GitHub sign-in and custom public IDs

GitHub sign-in, onboarding and custom public IDs.

Features
  • GitHub sign-in. Sign in with GitHub and complete onboarding.
  • URL type. Store URLs as a value type.
  • Custom public IDs. Arc responses and link operations accept custom public IDs.
Fixes
  • Custom IDs. Custom IDs resolve reliably across links and batch writes.