What's New

Everything that's shipped in xNet, newest first.

#699 crs48

Invite people to your hub, and only they can connect

Family, Team and Community plans can now invite collaborators from the dashboard — they create their own passkey and read you a short code, so their keys never touch us. A managed hub now only accepts the people on your list, seats are billed as advertised, and the free tier finally has a working sign-up button.

View PR #699 →
platformidentity
#695 crs48

xNet promises your old laptop keeps working

The Charter now declares the oldest machine xNet supports — a 2017-class laptop with 8 GB of RAM — and a CI check fails any change that makes a first load cost more there. We make no claim to be greener than anything else, and we will never sell efficiency as a paid tier.

View PR #695 →
platformperformance
#692 crs48

Cloud plans with an uptime guarantee no longer sleep

Plans that publish an uptime target now keep a warm instance, so they are not woken from cold on first use. We also corrected wording across the site and dashboard that said we cannot read your data — on a managed hub we can, and now say so plainly, along with what our operators may see and the signed log that records it.

View PR #692 →
platform
#691 crs48

Follow xNet on Bluesky and X

The site footer now links the project's Bluesky and X accounts, so you can follow along for new essays and release notes. The icons are inline artwork — no platform embed scripts, so the pages still load nothing third-party.

View PR #691 →
platform
#674 crs48

Your imported social library is now legible, projectable, and searchable by transcript

Imported TikTok favourites and collections get their own feeds, every surface now shows real titles and thumbnails instead of platform ids, a saved lens can be projected onto the canvas as cards with the connections between them, and YouTube transcripts can be fetched per import run so an AI agent can search what was actually said in videos you saved.

appai
#680 crs48

Habit tracking shows a completion rate, not a breakable streak

The habit heatmap and Today panel used to show a 🔥 streak — a chain a single missed day destroyed. They now show the share of scheduled days you completed over the window on screen. Same information, but a miss lowers a number instead of wiping one out, which is what our charter's commitment against loss-aversion mechanics actually asked for.

app
#678 crs48

Your hub keeps the same address when it moves

Apps can now find your hub by name instead of a fixed URL, so moving it between regions or hosts no longer leaves your devices pointing at the wrong place. A hub waking from sleep says so and reconnects, instead of looking offline, and an exported backup carries the address so it alone is enough to get you syncing again.

View PR #678 →
syncplatform
#676 crs48

Publish what you saved, and find what you have in common

Your imported YouTube, Instagram and TikTok saves can now be published to your own AT Protocol repo — a link, a date and your own tags, never the platform's titles or thumbnails. A new comparison shows what you and one other person both saved, across networks. Messages, comments, searches and who you follow are never offered: they describe other people. Publishing is permanent, so it asks every time and shows you the exact records first.

appidentity
#673 crs48

A failed payment no longer silently stalls your hub

If a card fails, xNet Cloud now walks a clear path instead of doing nothing: two weeks of normal service while the charge retries, then read-only (everything stays readable and exportable), then a paused hub with your encrypted data kept in cold storage. You get an email at every step, with real dates, and paying at any point restores everything immediately. Data on your own devices is never affected.

View PR #673 →
platform
#670 crs48

New essay: The Matchmaker and the Meter

Why dating apps are metered on purpose — match scarcity as inventory, the market for lemons run on people — and what the matchmakers people actually loved got right. The essay ships with a receipt: a new CI rule and Charter clause mean xNet can never sell an introduction.

View PR #670 →
platform
#668 crs48

Verify what your agent did

Any agent connected to xNet — OpenClaw, Hermes, Buzz, Claude Code — now gets its own key and a narrow grant, and everything it does exports as a receipt you can verify offline. A new xnet audit verify command checks the signatures, spots a removed action, and proves you approved anything risky.

View PR #668 →
ai
#665 crs48

Approve an agent's high-risk changes without leaving the app

When a connected coding agent asks to make a high-risk change — creating a page, editing one — an approval card now appears in the app with the change to review, and Approve and Deny buttons. Previously those requests waited invisibly and expired after five minutes, so the change never happened and nothing said why. Approving now also hands the result straight back to the agent, so it can carry on in the same turn.

View PR #665 →
ai
#664 crs48

Two worktrees can run the desktop app at once

The desktop dev app now takes its profile and ports from the git worktree it was started in, so parallel checkouts no longer fight over one set of ports and one data directory. Collisions that used to exit silently now fail with a message naming what holds the lock.

View PR #664 →
devtoolsplatform
#658 crs48

Connect a hub straight from the Share dialog

Sharing with no hub connected now offers a Connect a hub button that opens the connection panel with an inline hub-URL form, instead of a dead-end message. Links from a private hub ask for confirmation before copying, so a LAN-only link is not pasted somewhere it cannot work.

View PR #658 →
appsync
#620 crs48

The AI assistant now streams live replies from your own Claude Code subscription

The local bridge streams tokens as they arrive, remembers your conversation across turns, and every AI thread is saved as a searchable chat in your workspace. New: one-command login-item install (xnet bridge install), a helpful offline card with the exact command to start the bridge, read-only workspace tools by default with explicit write consent, faster workspace search behind AI answers, and an OpenRouter account-connect flow for machines without the bridge.

ai
#617 crs48

Every section in the sidebar now opens something

All, Docs, Chats, People and Views used to re-filter the sidebar and leave the main screen exactly as it was. Now every section in the left nav takes you somewhere — and People, Views and AI have their surfaces back.

  • People opens your contacts again, and Views opens the data workspace
  • All, Docs and Chats each give the home screen a different shape
  • Click AI in the sidebar for the full assistant, with your own model or API key
  • Typing into the floating Assistant now carries your question over instead of clearing it
  • The highlighted section always matches what you are looking at
  • Companion, Experiments and Import are reachable without typing a URL
appai
#612 crs48

Long select menus scroll again

Dropdown selects with many options (like the database field-type picker) were capped at a fixed height with no way to scroll by mouse, hiding options past the twelfth. The list now scrolls and shows scroll arrows, so every option is reachable.

View PR #612 →
app
#611 crs48

Dropdowns no longer hide behind the popovers that open them

Changing a column's data type from the table view's ⋯ menu works again. The type dropdown was painting behind the field popover, so its options were unclickable — clicks landed on the menu underneath instead. Every portalled select, menu, popover, and tooltip now sits above the overlays it opens from.

View PR #611 →
  • Table view: the column data-type selector is usable again
  • Selects and menus opened from inside modals and popovers stay on top
appui
#609 crs48

Try the app with a ready-made demo workspace

Arriving from the landing page's Try-the-app link now opens a lived-in demo workspace — sample documents, a tasks database, chat channels, and CRM records — instead of an empty screen. The demo only seeds brand-new profiles; existing workspaces are never touched.

View PR #609 →
  • Landing-page try links carry the demo signal (/app?demo=1)
  • Seed runs once, only for a fresh profile with no user content
app
#607 crs48

Hubs gain named roles, an index engine, and hub-to-hub subscription

One hub binary now runs as named roles (personal, demo, community, index, registry, gateway) selected with --role. The index role rebuilds a deterministic public atproto index from source; gateway hubs mirror other hubs' public Spaces over the existing sync protocol; every hub gets a persistent system identity on /health; and a compose template runs a hub beside the official AT Protocol PDS behind one domain.

View PR #607 →
platformsync
#603 crs48

Change-log storage quota now enforced on managed and self-hosted hubs

The append-only change log is metered against the same per-user storage quota as backups and file uploads. Previously this gate ran only on demo hubs, so a hub's change log could grow past its plan quota without being rejected.

View PR #603 →
  • Appends over quota are rejected with QUOTA_EXCEEDED, matching how backups and uploads already behave
  • Demo hubs are unaffected: they continue to meter against the demo override
platformsync
#596 crs48

Inline comments are readable again

Comment threads now open as a proper floating island: the reply box stays out of the way until you need it, so you can actually read the conversation, and the card follows the text it is attached to when you scroll. Clicking a highlighted passage opens its thread — previously only the sidebar could.

editorapp
#573 crs48

Every blog post links to its own edit history

Essays get revised after publication — corrections, tone passes, spelling sweeps — and a page showing only its publication date quietly implies it never changed. Each post's byline now carries a History link to the full commit history of that post's source file on GitHub, so anyone can check what was altered and when. It makes no claim that a given essay has changed; it just puts the record one click away.

platform
#589 crs48

Bluesky sign-in now writes the identity binding

Linking a Bluesky or other ATProto account now actually records the identity binding in your repo. The sign-in flow previously requested identity-only permission, so the binding write was never authorised and silently did nothing.

View PR #589 →
  • Requests the granular repo permission the binding write needs, falling back to broader legacy permission on older servers
  • Moves the binding record to the fyi.xnet namespace, which xNet controls
identity
#584 crs48

New essay: The Harvest You Can Count

Blog post #20 on why layered perennial food systems lost — not to a better design but to a better ledger. Grain genuinely won on calories and labour; the forest won on variance, soil carbon, micronutrients and input independence, and no ledger has a column for any of them. Includes two corrections to our own earlier essay.

View PR #584 →
platform
#579 crs48

Propose a change to a rule that binds you

Plugin authors, self-hosters and hub operators can now file a Rule Change Proposal against an enumerated operational rule — the humane-patterns gate, allowed plugin licences, marketplace terms, the Charter's refused rents, the Moat Register, or plan quotas — and get a public written answer with reasoning within 30 days. Decisions, including refusals, are recorded in a public append-only log.

platform
#576 crs48

Host a community on xNet

Community Spaces now have a discussion feed with topics, replies and a welcome queue that surfaces newcomers nobody has answered yet — plus schemas for courses, lessons and events.

View PR #576 →
app
#566 crs48

Only a space's owner can invite people to it

Invite links for a space are now restricted to the person who created it, or someone they have made an admin. Previously the hub had no record of who owned a space, so anyone who learned a space's id could mint an invite link to it — and because a space invite grants access to everything filed beneath it, that covered the whole subtree. The hub now derives ownership from the signed change that created the space, so existing spaces are covered without any migration.

View PR #566 →
identity
#567 crs48

A fourth test for every way xNet makes money

The Charter now carries a Sleep test alongside improvement, BATNA and vanish — asking not just whether a revenue lane is fair to you, but whether it would survive a competitor open-sourcing our whole feature set. A new ECONOMICS.md sets out how xNet earns, what it deliberately refuses to charge for, and what that position costs us; LICENSING.md settles why the core is MIT. The marketplace terms now commit to ranking neutrality: our own plugins get no placement preference.

platformplugins
#564 crs48

One sidebar, no tab strip

The workbench now opens as a single calm surface: no tab strip, with what you are working on kept as Pinned and Recent rows in the sidebar. The nine separate left-hand navigations collapse into one list of your workspace, filtered by lens — Docs, Chats, People, Views — so channels and contacts live alongside your documents. Chats sort by recency and bump on unread; documents hold their order. Cmd-[ and Cmd-] walk history, Ctrl-Tab flips between your last two views, and tabs remain one command away.

app
#561 crs48

Large sync catch-ups no longer drop changes

Syncing a workspace with a big backlog could silently lose changes: the hub sent them 1000 at a time but told the client it was fully caught up, so everything past the first batch was skipped and never re-requested. Clients now walk every batch to the end.

View PR #561 →
  • No more silently missing changes after a long time offline or on a fresh device
  • Catch-up continues in the same session instead of waiting for the next reconnect
sync
#560 crs48

Choose how xNet feels, and meet a scene in the demo

First-run now asks how xNet should feel — focused, cozy, or quiet — instead of hiding warmth in settings. The demo workspace gains Night Bloom Records, a small record-archiving collective, alongside Acme Inc. And a new CI rule bans ratio/leaderboard scorekeeping for good.

View PR #560 →
appdevtools
#552 crs48

Documents now embed live databases, maps, and pages

Pages compose like Lego: slash in a live view of any database (table, board, map, calendar and plugin views), transclude other pages, and drop nodes onto frames to link or add rows. Hovering a row lights the same item up in every frame on the page, every surface carries the same node passport, and the assistant can compose whole pages of live frames with a reviewable plan.

editorappai
#545 crs48

Export your whole workspace as a portable bundle — and restore it anywhere

Settings → Data now exports a signed .xnetpack bundle: the full change log with history, signatures, and document contents from the real local database (the old export missed the master copy). Restore it on any xNet — a fresh device, the CLI (xnet data export/import/snapshot/export-folder), or back into the same app — with every record verified before anything is written. Lossy CSV/JSON exports now say what they drop, and hubs gained export/restore/purge endpoints so leaving takes everything with you.

View PR #545 →
appplatformdevtools
#541 crs48

Location fields put your rows on the map

Databases gain a first-class Location column type storing latitude and longitude in one cell.

View PR #541 →
  • Add a Location column and the Map view binds to it automatically — no more paired lat/lng number columns
  • Right-click the map to create a row at that spot, with its location filled in
  • Paste "lat, lng" text straight into Location cells, and CSV import/export round-trips coordinates
app
#537 crs48

Your hub is your crash console

Every hub now quarantines its own deployment's crash reports — nothing leaves your infrastructure by default. Operators import reports into a Diagnostics Space (Settings → Privacy & Diagnostics) and triage them in the workbench; managed-hub owners see pending counts and top issues on their cloud dashboard, read live from their own hub. Sharing anything with xNet stays a separate, explicit choice: preview-and-send a single report, opt in to anonymous crash counts, or grant time-boxed, revocable support access.

View PR #537 →
appplatform
#535 crs48

Databases gain Board, Gallery, Calendar, Timeline, List, and Map views

Every database now offers Notion-style views beyond the table: a kanban board grouped by any select field (drag cards between stacks), a cover-image gallery, a month calendar with drag-to-reschedule, a roadmap timeline with month/quarter/year zoom and swimlanes, a compact list, and a map that pins rows by latitude/longitude with clustering. Each view remembers its own configuration, colors, and layout — and says so honestly when a large database is windowed.

View PR #535 →
app
#533 crs48

Agent Passports: audit every OpenClaw/Hermes action

External agents (OpenClaw, Hermes, Claude Code) can now be enrolled with their own scoped identity: every tool call is recorded as a signed audit node, risky actions require a typed approval code in chat or an in-app confirmation, reversible actions can be undone, and the new DevTools Agent Audit panel shows the full per-agent trail.

View PR #533 →
aiidentitydevtools
#534 crs48

Databases scroll past 500 rows with honest row counts

The database grid now loads more rows as you scroll (up to 2,000), shows the true total ('500 of 12,000 rows') instead of the window size, and stays smooth on wide tables by rendering only the visible columns. Filtered views on large tables say when they only cover the loaded rows.

View PR #534 →
appperformance
#525 crs48

Build plugins inside xNet from a spec

Turn a spec document into a live, sandboxed, composing plugin without leaving the workspace: an agent writes the plugin's source as a synced node, it hot-loads into an isolated iframe, and its console/errors feed back to the agent so it self-debugs.

View PR #525 →
plugins
#523 crs48

Time Machine and drafts: version history and branching for all your data

Every page, task, database, and canvas gains a Time Machine — scrub through its history with named versions, author colours, and one-click restore — and Patchwork-style drafts: fork content into a private working copy, review a three-way diff against a moving main, and merge back in one step. Assistant edits now land in a draft awaiting your review instead of touching live content.

app
#509 crs48

New essay: Clutch Power

Blog post #15 frames xNet as LEGO for data on the web: one coupling — node shape, namespace, merge rule, permission algebra — and why the grip that lets go matters as much as the snap.

View PR #509 →
platform
#508 crs48

DevTools Data panel lists only schemas in use

The schema picker now shows schemas that actually have data in the workspace (plus the current selection), instead of every schema registered by imports — in small embeds like the live demos, side-effect registrations buried the two real schemas under twenty unused ones.

View PR #508 →
devtools
#496 crs48

New Notion-style editor built on BlockNote

Pages, tasks and canvases now use a BlockNote-based editor: cleaner formatting toolbar, slash menu, drag handles, tables, and an emoji picker — with mentions, hashtags, wikilinks, callouts, embeds, mermaid diagrams and math carried over. Existing documents are converted best-effort on first open (prerelease: complex blocks may degrade to text).

editor
#487 crs48

Hardened change-log integrity and hub query safety

Sync integrity checks now verify author signatures cryptographically instead of merely checking they are present, hash auto-repair no longer runs on untrusted data, the hub validates dynamic query column identifiers against SQL injection, and it warns loudly when auth or signed-replication safety is relaxed.

View PR #487 →
sync
#465 crs48

Profile pictures, everywhere you appear

Upload a profile picture in Settings → Profile — it shows in the top-left profile button, menus, chats, and presence, with your generated avatar as the fallback. Profiles now reach people you share with: names and pictures render on shared channels, pages, and the Share dialog instead of DID fragments. Only you can write your profile; collaborators can read it.

  • Upload, change, or remove a profile picture (downscaled locally; photo metadata stripped)
  • Share recipients see real names and avatars on messages, comments, rosters, and the People tab
  • Your generated avatar (identicon) remains the default when no picture is set
appidentitysync
#468 crs48

Notion-grade editor chrome on official open-source parts

Block drag-and-drop, the slash menu, and all suggestion popups were rebuilt on Tiptap's official MIT components (drag handle, Floating UI positioning, toolbar primitives with arrow-key navigation), fixing inconsistent handle and popup behavior. The editor also gains :emoji shortcodes and KaTeX math (^2$ inline, 97747…97747 blocks).

editor
#464 crs48

Your @username now works everywhere you can mention someone

Setting a username in your profile now surfaces you in the @mention autocomplete in comments, task inputs, and page editors — not just chat. You can also @mention yourself in chat, and pickers show the @username next to each person's name.

  • Comment and task @mention pickers match usernames
  • Page editor mentions match usernames
  • Chat picker includes yourself, listed last as (you)
  • Task pickers resolve profile names instead of raw IDs
appeditor
#461 crs48

Links you paste now turn into what they point at

Paste a link in chat and it up-reses: internal deep links become live-titled chips, share links become titled document cards (owner-controlled via a new 'Show title in link previews' toggle), and external URLs get preview cards resolved once by the sender — readers never ping the link. The page editor's pasted-URL cards now hydrate with real titles too.

app
#458 crs48

Checklist tasks no longer flood the Changes tab with conflicts

Checking off or deleting page checklist items no longer spams the DevTools Changes tab with false conflicts, and a mid-delete snapshot can no longer rename a task to 'Untitled task'. Replayed sync changes now apply idempotently, and true cross-author conflicts are distinguished from routine last-write-wins housekeeping.

View PR #458 →
tasksdevtoolssync
#455 crs48

CI sheds its always-red lanes

The mobile-e2e placeholder workflow is retired, Fallow's weekly run now gates only the dead-code ratchet (the full audit runs on demand), five orphaned end-to-end suites joined the nightly soak lane with their rot fixed, and hub image releases no longer fail on SBOM upload permissions.

View PR #455 →
ci
#454 crs48

Changelog pages are easier to browse

The changelog now paginates at 50 entries per page, so the timeline loads and scrolls comfortably as history grows.

View PR #454 →
  • Prev/Next and numbered page buttons below the timeline
  • Search and tag filters page their results too
  • Shared entry links still land on the right entry, whatever page it's on
app
#453 crs48

New essay: Weights You Can Hold

Blog post #13: graduates boo AI executives, then go home and run open-weight models on their own laptops. Two video essays woven into the series' exit-over-voice thread — open weights, owned assets, analogue media, and the software layer of the exit.

View PR #453 →
platform
#452 crs48

Opening share links in the browser works again

Clicking a share link no longer fails with 'Missing link, handle, or payload' when it falls back to the web app — the app was accidentally discarding the link's parameters during startup. Share links also no longer leave their secret in the address bar.

View PR #452 →
syncapp
#448 crs48

Demo hub now enforces its storage limits

The shared demo hub enforces its 10 MB per-user cap, wipes demo data daily, and sheds writes before its disk fills instead of crashing. Workspace (bench) share links now work end-to-end, and a hub that is down reports 'isn't responding' instead of a cryptic 'Failed to fetch'.

View PR #448 →
syncplatform
#447 crs48

Install and configure plugins right from Settings

The plugin browser now tells the truth and does the work: plugins only say Built-in when they're actually installed, every first-party integration (GitHub, Slack, Notion, Linear, Discord, Stripe, and more) gets a real Install button, and a new Configure form collects tokens and settings — stored on your device only.

View PR #447 →
  • Built-in badge now reflects what's actually installed — everything else shows Install
  • Install a first-party integration and drop straight into its setup form
  • Configure from the plugin details or the Installed tab; a Needs-setup hint flags unfinished connections
  • Tokens and webhook secrets stay on this device — they never sync
app
#444 crs48

Every tab opens as a preview tab

Opening a page from the sidebar, command palette, or Settings now opens a temporary (italic) preview tab that the next open replaces — double-click the item, or start editing, to promote it to a permanent tab. Previously this VS Code-style behaviour only applied to Explorer rows.

View PR #444 →
  • Single-click any surface (People, Meetings, Finance, Settings…) → a preview tab
  • Double-click the row to keep it open
app
#443 crs48

Plugin details view with an install button

Browsing plugins in Settings now lets you click a plugin to open a details view — with its description, stats, requested permissions, and what it adds — and install it right from there.

View PR #443 →
  • Click any plugin card in Settings → Plugins → Browse to open its full details
  • The details view shows installs, stars, license, homepage, requested access, and contributions
  • Install straight from the details view, with the same capability-consent prompt as before
app
#441 crs48

The mobile navigator's first tab follows the view you're in

On phones, the center navigator sheet's first tab is now contextual — like the desktop bottom-left island. It shows Explorer on the workspace, Settings on the settings screen, Tasks on tasks, and so on, instead of always saying Explorer.

View PR #441 →
  • The navigator's contextual tab tracks the current view (Explorer / Settings / Tasks / Chats / …)
  • Picking a panel surface from Surfaces opens it right there in the navigator
app
#440 crs48

Managed hubs now report and prove backup freshness

The cloud dashboard shows a real "data safe as of" time from Litestream's measured R2 sync, cold-tiering never destroys a hub until its backup is confirmed fresh, and nightly restore drills verify recoveries. Self-hosters can enable the same Litestream durability against any S3-compatible store.

View PR #440 →
platform
#438 crs48

The phone workbench gets the Floating Islands redesign

The mobile editor now matches the desktop Floating Islands look: a floating control cluster at the bottom of the screen replaces the old top bar and bottom nav, and every panel opens as a rounded island sheet hovering over your document.

View PR #438 →
  • A bottom control cluster hosts your profile, workspace, a navigator for Explorer/tabs/surfaces, search, and New
  • Comments, the assistant, and menus now open as floating island sheets over the page
  • A slim status island shows sync health and a theme toggle, with dev tools one tap away
appplatform
#437 crs48

Dev tools open as a hovering island

The developer tools panel now opens as a floating overlay island — rounded corners, a soft drop shadow and the warm island colour — hovering on top of your content instead of sliding up as a flush bottom sheet. Its tabs are now pills that match the rest of the workbench's hover panels.

View PR #437 →
devtoolsapp
#435 crs48

Settings now opens as a tab

Opening Settings now creates a proper tab in the editor's tab bar (with a gear icon), alongside your documents — you can switch to it, close it, and it survives back/forward like any other tab. Switching between settings sections stays on the one tab.

View PR #435 →
app
#434 crs48

Readable, cohesive modal & panel styling

The What's New panel and modals now render as solid "floating islands" — matching the workspace chrome with a slightly darker surface and deeper shadow so they read as hovering on top, and are fully legible instead of translucent.

View PR #434 →
appplatform
#430 crs48

The New button now creates anything, filed into your workspace

The New button in the sidebar's top island is now the one place to create a page, database, canvas, dashboard, map or lab, a folder, or add a shared link — and it files new items into the workspace you're scoped to, matching the Explorer's New menu. The Explorer and the contextual '+' now use the same action, and the profile menu gained Sign out.

View PR #430 →
app
#429 crs48

Dev-tools island now shows outside dev-only builds

The docked developer-tools island (beside the status bar) now appears whenever the developer tools are actually available — matching where the old floating button used to show — instead of only in local dev servers, so it no longer disappears in preview builds while its space stays reserved in the status row.

View PR #429 →
devtools
#427 crs48

Dev-tools island and collapsible workbench header

In dev builds, the developer tools now dock as their own small island beside the status bar (with an upward menu into the query console, schema inspector, and sync log) instead of a floating button. The workbench header island can also collapse to a compact rail via a caret at its base, giving the Explorer below more room; the change is animated and respects reduced-motion.

platform
#426 crs48

Redesigned workbench with floating islands

The desktop workbench is now one warm canvas with all chrome floating as rounded, softly-shadowed islands — a calmer, Notion/Claude-desktop feel. Two stacked sidebar islands (navigation + a contextual surface), a base-surface editor with a breadcrumb header and pill tabs, a right context island, a status-bar island, and a bottom-center Assistant dock. A new surfaces model lets you pin the few surfaces you want visible and reach the rest from a roll-out.

platform
#420 crs48

One coherent workspace shell

The web app is now a single shell: a sectioned, collapsible sidebar surfaces every tool (and previously-hidden routes like Meetings, Finance and Analytics), with a ⌘. focus mode to hide the chrome. The quiet/calm/workbench modes are gone.

app
#414 crs48

CI failures now mean something

Fixed a workflow-file bug that failed every push, unblocked desktop releases (audiotee now targets macOS 14.2), moved the quality audit to a weekly schedule, and added guards (actionlint, storybook-shim conformance, DCO auto-sign-off) so red checks track real defects.

View PR #414 →
ci
#412 crs48

Arrange your workspace by dragging — and find it all in Settings › Labs

The malleable shell now has a real front door: a Labs section in Settings toggles it (and the other experiments) without any console tricks. Once on, panels show a grab handle, every dock lights up as a drop target while you drag (closed docks appear as edge strips), and a new Customize layout mode lays the whole shell out as draggable chips you can move, reorder, pin or hide — then save as a named workspace.

app
#409 crs48

Your workspace layout is now yours to arrange, save and share

The shell is one layout tree with three presets (Quiet, Calm, Bench) behind an experiment flag: move any panel between docks from its header menu, drag, or the command palette; save the arrangement as a named workspace node that syncs and can be shared like any document; and let the companion rearrange or scaffold new dockable views through undoable, consent-gated tools.

app
#407 crs48

Meetings: botless transcription and AI notes

New Meetings surface: record a meeting without a bot — your mic plus (on desktop) system audio — with live Me/Them transcription that runs on-device by default (NVIDIA Parakeet v2 or Whisper, swappable in Settings), then merge your rough bullets with the transcript into AI-enhanced notes. Includes a meetings list + detail view, engine picker with model downloads, and privacy-first defaults: audio is never stored unless you opt in.

appai
#404 crs48

New essay: The Vault and the View

Blog post #11 traces the fifty-year lineage of apps-as-views-over-your-data — from Codd's data independence through Solid's pods and local-first to xNet's substrate — and why AI-cheap views make user-owned data the ground that's left.

View PR #404 →
platform
#403 crs48

One canvas experience across web and desktop

The web and desktop canvases now share one core: media and PDF cards, dashboard widgets, query frames, and pinned records render identically on both (no more degraded cards after sync), and the web gains the desktop's power features — peek and inline editing of pages and databases, the selection action bar, linked-copies lookup, and multi-domain undo. Scene undo on the desktop canvas is fixed, and inside a focused canvas Cmd+Z can now undo an inline source edit when that was your latest change.

View PR #403 →
appsync
#398 crs48

Share links work from the web app again

Fixed the Share dialog failing with 'Failed to fetch': the hub now answers browser CORS preflights on its HTTP APIs, so listing, creating, and managing share links works from apps hosted on a different origin than the hub.

View PR #398 →
  • Share dialog Links and People tabs now load and update against your hub
app
#397 crs48

DevTools logs keep capturing while the Logs tab is closed

Console capture now lives on the devtools provider, so log lines recorded before you open the Logs tab (or while another panel is active) are no longer lost. A new opt-in Preserve toggle keeps the log across reloads for the current tab session, with tokens and emails scrubbed from the stored copy.

View PR #397 →
devtools
#388 crs48

Query debug mode no longer distorts what it measures

With xnet:query:debug enabled, plan diagnostics issued hundreds of serial SQLite worker round-trips per boot (EXPLAIN + per-index PRAGMAs per query), delaying real query results by 18-20s. Index metadata is now fetched in one batched statement, shared across concurrent callers, and plan diagnostics are collected once per unique query shape per session.

View PR #388 →
performancedevtools
#390 crs48

Blog posts now credit their authors

Every essay on the blog carries a byline — the human author linked to their GitHub profile, and Claude credited as the AI co-author — with first-party avatar images, per-author RSS credits, and structured data for search engines.

View PR #390 →
platform
#385 crs48

npm releases flow again

Fixed the release pipeline stall: the desktop app's version sync now maintains its own changelog (the missing file crashed every release run since July 4), and a failing npm Release workflow now raises a loud alarm issue instead of failing silently.

View PR #385 →
ciplatform
#384 crs48

Lists load several times faster and reappear instantly after reload

Reading your workspace got a structural speed-up: the database now returns each item as a single row instead of one row per field, list queries travel in one round-trip, and the query planner finally keeps statistics. On top of that, the app remembers your last-loaded lists and paints them immediately on the next visit while fresh data loads behind them.

View PR #384 →
performance
#383 crs48

Storage optimisation now survives rapid reloads

The one-time database conversion that speeds up cold opens is atomic, so reloading mid-run used to cancel it with zero progress — and the slowness it fixes is exactly what makes people reload. xNet now remembers interrupted attempts: it shows a subtle "keep this tab open" hint while the optimisation is running again, and after repeated interruptions it starts the work right at first paint so the conversion finally lands.

View PR #383 →
  • Interrupted storage-optimisation attempts are tracked and retried smarter
  • Subtle non-blocking hint asks you to keep the tab open while it finishes
  • After repeated interruptions the optimisation starts right after first paint
performance
#382 crs48

Multiple tabs now share one local database

Opening xNet in a second tab no longer loses local persistence: tabs elect a leader and share its database, and if the leading tab closes another takes over seamlessly. Queries also got faster — repeated statements skip re-parsing, multi-part reads travel in one message, and lists refresh more selectively after large syncs.

View PR #382 →
performanceapp
#381 crs48

Storage reclaim now actually returns space to disk

Freed pages from change-log compaction were returned to the filesystem one page at a time due to a WASM binding quirk, so the storage file plateaued instead of shrinking. Reclaim now drains the whole freelist per pass, and a pass that finds a stranded backlog returns it even when there is nothing left to prune.

View PR #381 →
performance
#380 crs48

Storage now shrinks on long-lived profiles

Databases created before incremental auto-vacuum existed were never converted, so reclaimed space never returned to disk. The one-time conversion now keys off the database's actual auto-vacuum mode instead of a latched flag, so existing profiles get converted and the storage file starts shrinking.

View PR #380 →
performance
#373 crs48

Download page now links to the real desktop app

The download page pulls the actual Electron desktop release (macOS, Windows, Linux) instead of the most recent npm package release, so every platform button points at a working installer. Desktop builds now also publish automatically alongside each core release.

View PR #373 →
appplatform
#366 crs48

Cold open no longer stalls behind background cleanup

Change-log compaction, database VACUUM, and presence cleanup now wait until the workspace has painted before touching the single SQLite worker, so opening a large workspace is no longer slowed by maintenance work. A reset or protocol-skewed hub no longer triggers a full change-log re-offer on connect.

View PR #366 →
performance
#358 crs48

New essay: Hand on the Tiller

A new blog essay reframes alignment as continuous course correction across a nested stack of systems — physics, planet, society, technology, AI — and shows the instruments xNet hands back: undo, exit, consent, and a machine you can read.

View PR #358 →
platform
#346 crs48

New essay: The Tip of the Hook

A developer-facing deep-dive on xNet's React hooks: how useQuery and useMutate let you specify your whole API in the client — including authorisation — and trust it, with a dive beneath the surface to the SQLite-in-a-worker, the priority scheduler, and the signed change log that make it safe.

View PR #346 →
platform
#344 crs48

A calmer, conversation-first workspace layout

New 'Calm' layout (now the default) reorganises the app into three modes — Companion, Workspace, and Network — with a conversation surface and a contextual canvas. Switch back to the multi-pane Workbench anytime in Settings → Appearance or via 'View: Switch layout'.

View PR #344 →
appai
#343 crs48

Change a task's status from its status icon

Click the status icon on any task — in the task list, on board cards, or inline — to open a dropdown and pick any workflow status (Triage, Backlog, To Do, In Progress, In Review, Done, Cancelled). It no longer just toggles the task complete.

View PR #343 →
tasks
#332 crs48

New essay: The Loom You Can Read

A deep-dive essay that follows one note all the way through xNet's internals — local-first storage, the signed change log, the keys you mint, and the no-referee merge — framed as the Luddite argument for a machine you're allowed to open.

View PR #332 →
platform
#323 crs48

New essay: The Right to Say No

Our fifth blog essay is live — a response to Benn Jordan's 'The Richest Country Is Pretty Mid Now' on how the economy shifted from growth to extraction, and the part local-first software can give back: the right to leave. Read it at /blog/the-right-to-say-no.

View PR #323 →
platform
#312 crs48

New essay: The Gentlest Furnace

Our third blog essay is live — what a star's equilibrium teaches us about information, attention, and building technology that burns long instead of burning out. Read it at /blog/the-gentlest-furnace.

View PR #312 →
platform
#311 crs48

New blog essay — Data Should Work Like Soil

The second post on the xNet blog is live: an essay on mycelial networks, the nervous systems of bodies, companies, and forests, and how an internet — like a damaged forest — is healed by biodiversity, reciprocity, and care. Read it at /blog/data-should-work-like-soil, or subscribe via RSS at /blog/rss.xml.

View PR #311 →
platform
#310 crs48

A tidier site header

The top navigation is shorter and better organized: home-page sections (App, Teams, Vision) come first, then key pages (Why, Build, Blog). Cloud, Plugins, React, Commitments, and the changelog moved to the footer.

View PR #310 →
platform
#308 crs48

The xNet blog is live

A new blog at /blog opens with an essay — A Great Pirate Age for the Internet — on data ownership, self-governance, and why you are the cargo. Subscribe via RSS at /blog/rss.xml.

View PR #308 →
platform
#304 crs48

Docs & a hub for building xNet in any language

New Languages & SDKs docs (Swift's XNetKit, Rust's xnet-core, and a maturity matrix), a /build-with marketing hub, a footer link, and cross-links across the site — so the native Swift/Rust implementations and the Vue/Svelte/Solid adapters are finally discoverable, each with an honest maturity badge.

View PR #304 →
platform
#302 crs48

Use xNet from any framework, validated

The headless runtime is now the official 'use xNet from any framework' surface: a documented Vue/Svelte/Solid/vanilla binding over createXNetClient + liveQuery, plus runAdapterConformance — a shared, framework-agnostic suite that proves a binding's live-query, mutate, auth, and lifecycle behaviour in one call.

View PR #302 →
platform
#300 crs48

Take everything and go

Settings → Data now has a 'Leave with everything' export that bundles your whole workspace, your portable did:key identity, and a re-import README into one file — nothing held back. Clearing your data is routed through an honest Delete Day with no guilt or nagging.

View PR #300 →
app
#296 crs48

See exactly what we know about you

A new Settings → 'What we know about you' panel enumerates everything xNet has derived about you — buffered diagnostics, and (as they arrive) embeddings and AI memory — and lets you purge any of it. Because xNet keeps no behavioral surplus, the usual answer is simply: nothing.

View PR #296 →
app
#295 crs48

A gentle nudge to call it a day

An opt-in 'time well spent' reminder (off by default, in Settings → Appearance) that, after a long continuous session, slides up a calm note inviting you to step away — never a streak, never a guilt trip. xNet competes for your wellbeing, not your time.

View PR #295 →
app
#293 crs48

Take your data and go, and see what we've derived

New Right to Leave flow bundles your whole workspace and portable identity into one archive (with an honest Delete Day, no confirmshaming), and a 'what we know about you' mirror enumerates every derived artifact — telemetry, embeddings, AI memory — so you can purge any of it.

View PR #293 →
platform
#291 crs48

The assistant now scaffolds by default

The in-app AI assistant defaults to a 'scaffold' mode — it proposes and cites while you stay the author — and marks anything it writes as AI-generated, a guard against AI deskilling. Backed by a new Humane Internet Charter and a CI gate that keeps dark patterns and third-party tracking SDKs out of the codebase.

View PR #291 →
ai
#290 crs48

Faster cold start when reopening a workspace

Reopening a populated workspace paints sooner: the first database read after a reload is now memory-mapped and the local file is defragmented in the background, cutting the cold-start stall.

View PR #290 →
  • First read after reload is memory-mapped instead of thousands of synchronous reads
performance
#287 crs48

Durable-storage status lives in the status bar

Durable local storage now shows as an ambient indicator in the bottom status bar instead of a banner that reappeared on every page load.

View PR #287 →
  • When storage is working, the persistent top banner is gone — its usage shows quietly in the status bar with the other system info
  • When storage isn't durable yet, you still get the actionable banner plus a warning-toned reminder in the status bar
app
#286 crs48

A cozy theme and comfortable density

New opt-in Appearance options: a warm 'Cozy' theme (paper surfaces, terracotta accent, soft shadows, editorial serif headings) and a 'Comfortable' density that opens up type and spacing. Find them in Settings → Appearance; the default monochrome look is unchanged.

View PR #286 →
app
#276 crs48

Flame graph and heat maps in the Performance dev tool

The dev-tools Performance panel now shows a latency heat map (trace latency distribution over time), a frame-time/jank heat map, and an aggregated flame graph of where time goes across recent operations; the Traces panel adds a Waterfall/Flame view toggle for per-trace call nesting and self-time.

View PR #276 →
devtoolsperformance
#272 crs48

Dev seed fills every node type with real content

The dev-tools seed now bakes contextually-rich content into every node type — populated dashboards (charts, metrics, time ranges), pages exercising the full editor block + inline vocabulary, databases with all six views and advanced fields, canvas scenes with framed/grouped cards, and rich Task/Project/CRM/Experiment documents.

View PR #272 →
devtools
#264 crs48

One-click idempotent database seed in dev tools

The dev tools can now seed a full demo workspace — projects, tasks, pages, canvases, dashboards, channels, comments and metrics, plus the relationships between them — from one button. Re-running converges instead of duplicating, and every new content type is covered automatically.

View PR #264 →
devtools
#260 crs48

Changelog now shows the exact merge time

Each entry on the What's New page now shows the precise time of day it shipped (in UTC) next to its date, and the RSS and JSON feeds carry the exact merge timestamp — so feed readers and the in-app What's New order and date entries correctly, down to the minute.

View PR #260 →
  • Every changelog entry shows its merge time-of-day (UTC) beside the date
  • RSS pubDate and JSON Feed date_published now use the real merge instant (fixes a previously malformed timestamp for slugged entries)
  • The in-app What's New feed exposes the precise merge time
platformci
#259 crs48

Changelog entries now sort by actual merge time

The What's New / changelog list is now ordered strictly by when each change actually merged — down to the time of day — so several updates that shipped on the same day appear in the true order they landed, newest first, instead of being shuffled by entry name.

View PR #259 →
  • Entries sort by the PR's real merge timestamp (time-of-day precision), not just the calendar day
  • Same-day updates no longer appear out of order
  • Merge time is recorded automatically when a PR merges, with a deploy-time backfill as a safety net
platformci
#258 crs48

Clearer editing in the dev tool's data table

The Data panel in the dev tools (Ctrl/Cmd+Shift+D) now makes editing legible: read-only cells show a lock with a hover reason, editable cells don't, and the panel explains when a schema can't be edited — instead of silently refusing.

View PR #258 →
  • Read-only cells show a lock glyph and a hover tooltip saying why (system field, non-editable type, schema not loaded)
  • Schemas that aren't in the registry now say so, instead of a dead edit toggle that did nothing
  • The edit toggle only appears once a schema's typed definition is loaded, with clearer wording
devtoolsplatform
#257 crs48

Entity counts in the dev tool's schema picker

The schema dropdown in the dev tools' Data panel (Ctrl/Cmd+Shift+D) now shows how many entities each schema holds — e.g. Task (12), Person (0) — so it's obvious at a glance where the data lives. The counts respect your read permissions and update live as nodes are created or deleted.

View PR #257 →
  • Each schema shows its entity count, e.g. Task (12) or Person (0)
  • "All schemas" shows the total across schemas
  • Counts respect read authorization and refresh live without polling
devtoolsplatform
#256 crs48

Per-cell permissions in the dev tool's data table

The Data panel in the dev tools (Ctrl/Cmd+Shift+D) now reflects your real authorization per cell — cells you can't edit are locked instead of failing when you try, and a row's detail pane shows exactly how your read and write permissions are derived.

View PR #256 →
  • Cells you're not allowed to edit are locked (with a lock glyph and a hover reason) rather than failing on save
  • A node's detail pane shows your read/write decision with the full derivation — roles, grants, and evaluation steps
  • Falls back gracefully when authorization isn't enforced in the store
devtoolsplatform
#255 crs48

Sort and filter in the dev tool's data table

The Data panel in the dev tools (Ctrl/Cmd+Shift+D) now has the same rich table toolbar as the database UI — click a column to sort, build filter conditions with real operators, change row density, and show or hide columns.

View PR #255 →
  • Click any column header to sort (or use the sort chip); the Updated column now sorts chronologically
  • Build AND/OR filter conditions with typed operators (contains, greater than, between, is empty, …)
  • Adjust row density and show/hide columns; your view settings are remembered per schema
devtoolsplatform
#253 crs48

Sync fails loudly instead of silently retrying forever

When the app and your hub are on incompatible versions, every change can be rejected with an opaque 'invalid hash' error. Before, the app retried forever — flooding the hub and silently never syncing. Now the hub explains exactly what mismatched (it names both hashes and protocol versions), and the app stops pushing after a few rejections, logs one clear, actionable message, and automatically resumes the next time it reconnects to a compatible hub.

View PR #253 →
  • The hub's rejection now names the client hash, the hub's recomputed hash, and both protocol versions — a version skew is obvious instead of looking like data corruption
  • The app trips a circuit breaker after repeated structural rejections, so it no longer floods the hub with changes that can never be accepted
  • Outbound sync resumes automatically on the next reconnect, once the hub and app are back in sync
sync
#252 crs48

A cozier dev tool with a real data browser

The in-app dev tools (Ctrl/Cmd+Shift+D) are reorganized around four high-signal panels — Data, Changes, Logs, and Performance — with everything else tucked into a grouped "More" menu and a ⌘⇧P command palette, so the bottom strip is no longer a wall of tabs.

View PR #252 →
  • Data panel: query and browse every node in the real database grid, with schema-aware columns, live updates, and a query-plan inspector
  • Edit data inline where it makes sense — toggle editing on a selected schema to change values directly in the grid (system and computed columns stay locked)
  • Logs panel: flip the sync/SQLite/query/boot/trace debug channels and read captured output in-app
  • Performance panel: cold-start boot timeline, live frame budget and memory, storage stats, and recent traces in one place
  • Jump to any panel by name with the ⌘⇧P command palette
devtoolsplatform
#250 crs48

Clearer, safer cloud plan upgrades and downgrades

Upgrading your managed hub is seamless — your data just gets more room, applied instantly. Downgrading is now guarded: if your data is larger than the smaller plan allows, we tell you up front and offer two clear paths — free up space and try again, or wipe and start fresh — instead of silently shrinking your quota. File uploads now count against the same plan quota as backups.

View PR #250 →
  • Upgrades apply instantly with no migration prompt for 'just more space'
  • Downgrades that wouldn't fit your data are blocked with a clear over-quota notice
  • Honest choices: free up space and retry, or wipe and start fresh on the smaller plan
  • Your data is never auto-deleted; an over-quota hub goes read-only until you free space or upgrade
platform
#249 crs48

Open xNet Cloud in the desktop app with one click

Your Cloud dashboard's Desktop tab now offers an "Open in desktop app" button that hands your hub to the installed app over an xnet://connect link. The app asks you to confirm before pointing itself at the hub — it never repoints silently, and only xNet-hosted wss hubs are accepted.

View PR #249 →
  • One-click desktop connect via xnet://connect (hub handoff)
  • Explicit in-app confirmation — never auto-connects
  • Hard hub validation: wss-only + xNet host allowlist
platformapp
#247 crs48

Guided per-platform connect on the cloud dashboard

The xNet Cloud dashboard now walks you through connecting your web, desktop, or mobile app — with a copyable hub URL, a getting-started checklist, and links to help.

View PR #247 →
  • Web / Desktop / Mobile connect tabs with tailored steps
  • Copyable hub URL + getting-started checklist
  • Help & FAQ links, plus a new Connect to xNet Cloud guide
platform
#246 crs48

Updated Terms, Privacy, and new legal pages for xNet Cloud

Ahead of xNet Cloud going live, the Terms and Privacy Policy now reflect accounts, billing, managed hosting, managed AI, and the marketplace — clearly separating the local-first path (we see ~nothing) from Cloud (exactly what we process). New Sub-processors and Acceptable Use pages, plus draft Data Processing Addendum and Marketplace Terms.

View PR #246 →
  • Privacy Policy rewritten around two contexts: your own device/hub vs xNet Cloud
  • Honest, per-feature scope of what we can and can't see (server-side search and managed AI process content)
  • New /subprocessors and /acceptable-use pages; draft /dpa and /marketplace-terms
  • Terms now cover accounts, billing, cancellation, managed AI, and the marketplace
platformpluginsai
#243 crs48

Reset the database from the dev tools

A new Reset panel in the dev tools (Ctrl/Cmd+Shift+D) clears the local database, the hub, or both for a clean slate — useful for pre-release resets.

View PR #243 →
  • Clear local data, hub data, or everything in two clicks
  • The local clear now actually wipes the OPFS SQLite database (it previously left it intact)
devtoolsplatform
#242 crs48

Open the web app from your cloud dashboard

The xNet Cloud dashboard now has a persistent "Open web app" button in the header, so you can jump to your workspace from anywhere in the control plane — including before a hub is connected.

View PR #242 →
  • Always-available header button to the web UI
platform
#239 crs48

Faster cold load: content paints before the hub syncs

The home page now renders each list as soon as it loads instead of blocking on the slowest query, and your recently-opened documents are restored more reliably after a reload.

View PR #239 →
  • Document list paints per-section instead of all-or-nothing
  • Open documents are pre-synced after a reload (tracked-node registry now persists)
performancesync
#240 crs48

Integrations: webhooks in, connectors and notifications out

xNet now speaks to the services developers and hobbyists actually use — GitHub, RSS, Stripe, Sentry, Discord, and a generic webhook in both directions.

View PR #240 →
  • Receive signed webhooks from GitHub, Stripe, Sentry, and PagerDuty (HMAC-verified, replay-protected)
  • A generic POST /hooks/:token inbox bridges Zapier, Make, n8n, and IFTTT
  • Pull connectors for RSS/Atom, GitHub issues+PRs, Notion, and Airtable into governed nodes
  • Outbound actions post to Discord, Slack, Telegram, email, or any webhook when something changes
pluginsplatform
#238 crs48

Conflict resolution is now deterministic across devices — fixed a locale-dependent tiebreak

The last-writer-wins tiebreak that settles concurrent edits to the same field compared author IDs with `localeCompare`, which is locale- and ICU-version-dependent — so two devices could, in rare same-timestamp ties involving mixed-case IDs, disagree on which edit wins. It now compares by code-unit order everywhere, matching the protocol spec and the conformance vectors, so all peers converge identically. Found by the Rust core's adversarial review.

View PR #238 →
  • Six author-tiebreak sites (store, sync chain/clock, history) switched from `localeCompare` to deterministic UTF-16 code-unit ordering
  • Spec §7 now states the rule explicitly and forbids locale collation; a new golden vector (`lww/0004`) pins the mixed-case case
  • No behavior change for the common case — only removes a latent cross-device divergence in same-lamport/same-wallTime ties
syncprotocolbugfix
#237 crs48

A portable Rust core for the xNet protocol — one kernel for every language

Phase 2 of the native-SDK work: `xnet-core`, a Rust implementation of the protocol's byte-exact kernel (did:key, the canonical-JSON change hash, Ed25519 sign/verify, per-property LWW, version negotiation, authorization eval). It passes the shared golden-vector corpus — and, with deterministic RFC-8032 Ed25519, re-signs changes byte-for-byte (which the Swift/CryptoKit kernel can't). It's the foundation for backing the Swift, Kotlin, and .NET SDKs from a single core via UniFFI.

View PR #237 →
  • `rust/xnet-core` reproduces the conformance corpus (identity, change incl. byte-exact re-sign, LWW, replication, authz) — a fourth conforming implementation alongside TypeScript, Python, and Swift
  • Ed25519 implemented on audited `curve25519-dalek` + `sha2` (RFC 8032); base58btc and canonical JSON inline — minimal, dependency-light crypto
  • An FFI-ready surface (`String`/`Vec<u8>`/`bool`) is built and tested; generating Swift/Kotlin (UniFFI) + a C ABI for .NET is the documented next step
protocolrustconformance
#236 crs48

On-device semantic search for the assistant

Turn on Semantic search in the AI chat and the assistant finds context by meaning, not just matching words — fused with keyword search and your data's connections. It runs entirely on your device and is off by default.

View PR #236 →
  • Finds related notes even when they don't share the exact words you typed
  • Runs on-device — the model loads only when you opt in, and never leaves your machine
  • Always safe: falls back to keyword search instantly, so it can only help, never slow you down
aiapp
#235 crs48

Native Swift data is now durable — XNetKit persists to SQLite

XNetKit gained an on-device store: pass a `SQLiteChangeLog` to a `NodeStore` and every signed change is written to SQLite, then replayed on next launch to rebuild state. A native app's xNet database now survives restarts, with last-writer-wins preserved across the replay. Uses the system SQLite library — no extra dependency.

View PR #235 →
  • `SQLiteChangeLog` persists the signed change log; `NodeStore(identity:persistence:)` replays it on open to rebuild node state
  • Durable across restarts with LWW intact — verified by a write → close → reopen test that keeps the latest update
  • Built on the system SQLite (`import SQLite3`), so the package's only third-party dependency is still BLAKE3
swiftsdkstorage
#234 crs48

Native Swift now syncs in real time — live changes stream straight to a Swift client

XNetKit's hub connection gained real-time streaming: a Swift client subscribes to a room and receives relayed changes the moment a peer publishes them — not just on-demand catch-up. Proven end-to-end against the reference TypeScript hub: one Swift client publishes a change and a second Swift client sees the live update arrive instantly. Full bidirectional, real-time native-Swift ↔ hub sync.

View PR #234 →
  • `HubConnection.subscribe(room:)` + `startStreaming()` run a read loop that delivers relayed `node-change`s to `onRemoteChange` live (each verified before apply)
  • `xnet-sync-demo` now proves both phases against the real hub: catch-up via `node-sync-request`, then a real-time streamed update between two Swift clients
  • Complements the existing publish + catch-up path — a native app can now stay continuously in sync, not just reconcile on demand
swiftsyncprotocol
#233 crs48

Agents can now follow a node's connections on demand

A new xnet_graph_expand tool lets a connected agent (via MCP, or the CLI) walk the typed links out from any node to its neighbors — fetching just the connections it needs for a question instead of loading the whole workspace.

View PR #233 →
  • Just-in-time graph expansion: pull a node's related items only when needed
  • Returns each neighbor with the relation it came through, for traceable answers
  • Auto-available to MCP and CLI agents — no extra setup
aiplugins
#232 crs48

The assistant now follows your connections

When you chat with the assistant about your workspace, it now pulls in related items by walking the links between them — not just keyword matches — so multi-step questions get the connected context they need.

View PR #232 →
  • Context now walks typed relations from the best matches (graph-aware retrieval)
  • A token budget keeps it focused instead of dumping the whole workspace in
  • Runs entirely on-device — no embedding model download, no added startup cost
aiapp
#231 crs48

Native Swift now syncs with an xNet hub — proven cross-language interop

XNetKit gained a live hub connection: a native Swift client can publish a signed change to a running xNet hub over WebSocket and catch up changes from it. It's proven end-to-end against the real TypeScript hub — a Swift-signed change is verified (hash + Ed25519 signature) and stored by the hub, then caught up and materialized by a second Swift client. This is the first true cross-language round-trip, unblocked by the integer-lamport protocol fix.

View PR #231 →
  • `HubConnection` speaks the L2 replication protocol over `URLSessionWebSocketTask`: version handshake, room subscribe, `node-change` publish, and `node-sync-request` catch-up
  • `WireCodec` maps a Swift `Change` to/from the hub's `SerializedNodeChange` wire shape; a `NodeStore.onLocalChange` hook publishes local writes
  • `xnet-sync-demo` demonstrates the round-trip live against the reference hub; 16 Swift tests pass including a wire-codec JSON round-trip
swiftsyncprotocol
#229 crs48

Protocol fix: a change's Lamport clock is now a plain integer

While building the native Swift SDK we found that the runtime hashed a change's `lamport` field as an object `{time, author}`, but the protocol spec, the conformance golden vectors, and the reference kernels all treat it as a plain integer — so real changes didn't match the vectors and a spec-conformant client would be rejected by the hub. The runtime is now aligned to the spec: `lamport` is an integer, the author tiebreak comes from `authorDID`, and the conformance corpus finally represents reality. A breaking change (no migration; not live yet).

View PR #229 →
  • `Change.lamport` is now a `number` (the logical clock); the materialized per-property timestamp carries `author` separately for the LWW tiebreak
  • Cross-language interop unblocked: a change created by the TypeScript runtime now hashes identically to one from the Python/Swift kernels and XNetKit
  • Swept across sync, data, hub, history, runtime, react, data-bridge, devtools, cli, and the Electron IPC layer — 88/88 typecheck tasks and all suites green
protocolsyncbreaking
#228 crs48

AI second brain: hybrid GraphRAG retrieval

A new brain layer connects your governed graph, full-text search, and the vector engine into one retriever — so the assistant pulls the right, connected slice of your data instead of being overwhelmed by all of it.

View PR #228 →
  • Hybrid retrieval fuses semantic + keyword search, then walks typed relations for multi-hop context
  • A strict token/hop budget keeps answers focused; extra matches stay one click away (just-in-time)
  • First-class, private-by-default memory that's auditable back to its source notes
aiplatform
#227 crs48

XNetKit — define schemas, query, and observe xNet from native Swift

A real, runnable native Swift SDK lands. Define schemas in Swift, write and query the database in Swift, and bind results into a SwiftUI re-rendering loop — no JavaScript, no React. It's built on the conformance-pinned protocol kernel, so identity, signed change hashes, and LWW convergence match the TypeScript reference. This is the native-authoring slice of the Swift exploration (0210); live hub sync and persistence are the next steps.

View PR #227 →
  • Swift schema DSL (Schema { text(…); select(…) }) emits the same SchemaIRI as TS defineSchema; a native NodeStore signs every write into a Change and folds it via per-property LWW
  • Reactive @Observable LiveQueryModel drives a SwiftUI re-render loop the way useQuery does in React — plus a framework-agnostic LiveQuery and an AsyncSequence view
  • swift run xnet-demo walks it end-to-end; 11 tests pass including the shared golden vectors (identity, change hash, LWW) — verified on Swift 6.3 / macOS
swiftsdkprotocol
#225 crs48

A verified Swift kernel — xNet's protocol is provably portable to Apple platforms

The first step toward a native Swift SDK: an independent Swift implementation of xNet's interop kernel now reproduces the same did:key, canonical bytes, and BLAKE3 change hashes as the TypeScript reference, and verifies TypeScript-signed changes. The conformance corpus also grew new L2 (replication) and L3 (authorization) golden vectors, so the wire protocol stays honest across languages.

View PR #225 →
  • New Swift reference kernel (conformance/reference/swift) passes 18/18 L0+L1 checks against the shared golden vectors — proof the protocol, not the TypeScript source, is what implementations follow
  • Conformance corpus extended to L2 (version handshake, catch-up filtering, the byte-exact signed Yjs envelope) and L3 (authorization expression evaluation), drift-guarded in CI
  • Surfaced and documented a real Apple-platform constraint: CryptoKit's Ed25519 is randomized, so it verifies signatures but can't reproduce them byte-for-byte
protocolconformanceswift
#226 crs48

Error monitoring, privacy-preserving analytics, and a consent spine

The app now captures boot failures instead of showing a blank screen, the site and app gained cookieless analytics that need no cookie banner, the cloud server logs and reports errors, and one Privacy & Diagnostics control governs everything you share — off by default.

View PR #226 →
  • A blank-screen 'didn't load' now surfaces an actionable screen and a captured error with the failing boot stage
  • Cookieless analytics on the website and app — no personal data, no cookie banner
  • Opt-in crash reporting (Sentry-ready) gated by a single consent spine; self-hosted builds phone nothing home
  • Cloud server adds structured request logs + a global error handler; hubs can opt in to share scrubbed diagnostics
platformappperformance
#223 crs48

Managed AI with model switching

Use metered xNet Cloud AI right from the app — no API key — and switch between models with live pricing.

View PR #223 →
  • New managed AI tier: the chat panel routes through xNet Cloud's metered gateway with a live used/included/cap budget gauge — no key in the browser.
  • Switch between models from a picker grouped by family, with per-token price and context badges; cheaper plans get a curated set, bigger plans the full OpenRouter catalog.
  • Optional model fallbacks keep a chat working through a provider outage.
aiappplatform
#218 crs48

See xNet Cloud's usage and growth in the open

The public /open dashboard now publishes live usage at scale — workspaces hosted, documents synced, data under management, people on the platform, and AI tokens metered — alongside the financials, all privacy-safe aggregates.

View PR #218 →
  • New 'product, at scale' counters on /open
  • Aggregate-only and k-anon-gated below the cohort floor
  • Fed by a control-plane usage collector, published via the weekly snapshot
platform
#209 crs48

A gentle welcome the first time you open a view

xNet now greets you with light, one-at-a-time tips the first time you open a view — what ⌘K does, where your CRM lives, how Tasks work — each dismissible and never in the way. Replay them anytime from Settings → Tips & tours.

View PR #209 →
  • One tip at a time, shown the first time you reach a view — not a blocking tour
  • Dismiss with Escape, the ✕, or 'Got it' — it never steals focus or blocks the app
  • Replay onboarding anytime from Settings → Tips & tours
appplatform
#208 crs48

Sync stays connected — no more reconnect storms on busy workspaces

The app no longer re-sends its whole change history to the hub on every load; sync now resumes from where it left off and throttles bursts, so the connection stays steady instead of tripping the hub's rate limit.

View PR #208 →
  • Reload resumes sync from a persisted cursor instead of replaying the entire change log
  • Outbound changes are throttled and a rate-limit disconnect backs off instead of reconnect-storming
  • A single malformed change no longer aborts a whole sync batch
syncperformance
#207 crs48

Desktop gets the extra charts; marketplace is more honest

The Extra Charts plugin (donut + horizontal bar) now ships in the desktop app too, and the plugins marketplace clearly flags first-party connectors that need explicit setup rather than implying they auto-install.

View PR #207 →
  • Donut + horizontal-bar charts now bundled in desktop (web/electron parity)
  • Slack/Unreal connectors marked 'Setup required' instead of implying they run
pluginsapp
#204 crs48

Charts, maps, and canvas shapes are now plugin-extensible

New chart types, map basemaps, and canvas shapes can be added by a plugin with no change to core code, via shared runtime registries. A bundled Extra Charts plugin adds donut and horizontal-bar charts as a worked example.

View PR #204 →
  • Chart, basemap, and shape registries (unknown types fall back gracefully)
  • Editor schema/behavior tiering guards against silent Yjs content loss
  • Bundled Extra Charts plugin: donut + horizontal bar
pluginseditorplatform
#202 crs48

Your workspace loads from the local cache again — no waiting for sync

Fixed a regression where a reload race could drop the local database into memory-only mode, so the app appeared empty until it re-synced from the hub; it now retries and stays on persistent storage.

View PR #202 →
  • OPFS storage no longer silently falls back to in-memory on a reload race
  • Returning users see their data immediately from the local cache, before the hub connects
performanceapp
#199 crs48

Faster cold start — your data shows before the hub connects

The app now warms the local cache and hub connection during boot and shows a clear 'restoring' state instead of a blank screen, so returning users see their workspace sooner.

View PR #199 →
  • Boot timeline instrumentation to attribute startup cost
  • Local-first 'restoring from hub' state replaces blank/empty screens after a browser cache eviction
  • Hub preconnect + faster first-dial retry shrink time-to-connected
performanceapp
#198 crs48

Changelog now credits everyone who contributed

Each changelog entry now shows every contributor to its pull request — not just a single author — as linked GitHub avatars, on the website and in the in-app What's New.

View PR #198 →
  • Avatars for every PR contributor (the author plus any co-committers), linking to their GitHub profile
  • Filled automatically from the merge event, and backfilled across past entries
platformdevtools
#192 crs48

Changelog entries get their PR number automatically

Every changelog entry now reliably links its pull request — the number is stamped into the entry when the PR merges, with no extra commit from you.

View PR #192 →
  • PR number is written into the entry at merge, so the repo matches what's published
  • Pull requests are verified at PR time — a numberless or malformed entry fails CI, not the live deploy
  • The deploy-time resolver remains a safety net for anything merged outside the normal flow
platformdevtoolsci
#191 crs48

Changelog entries always link their PR

Every changelog entry now links to its pull request and shows a 'View PR' link even when there are no screenshots.

View PR #191 →
  • PR links resolve reliably (GitHub API fallback), not just from commit messages
  • Entries without screenshots show a clear 'View PR #N' link
platform
#188 crs48

Plugins marketplace, live on the web

Browse every plugin xNet ships out of the box and everything the community builds — on the website and inside the app — and publish your own with a one-line PR.

View PR #188 →
  • A new /plugins page with search, categories, and per-plugin detail pages
  • In-app Browse tab installs community plugins through a capability-consent gate
  • Publish via a metadata PR — your code stays in your repo and updates ship automatically
pluginsappplatform
#189 crs48

A public status page and a one-command path to cloud staging

xNet Cloud now publishes its live operational status, ships a containerized control plane you can deploy to Cloud Run, and can run against real Stripe/WorkOS APIs straight from your laptop.

View PR #189 →
  • New /status page — control plane, hub fleet, managed AI, and backups, with aggregate-only uptime (no tenant is ever identifiable)
  • The control plane is now containerized (apps/cloud/Dockerfile) with a build + smoke-test script and a keyless (Workload Identity Federation) deploy workflow
  • Run against staging credentials locally with `pnpm --filter xnet-cloud dev:staging` plus a git-ignored .env.staging.local for localhost OAuth/webhook overrides
  • A weekly job refreshes the run-in-public /open metrics from live Stripe and opens a PR for review
platform
#187 crs48

Metered AI through OpenRouter

xNet Cloud can now run managed AI through OpenRouter with per-tenant budgets, exact per-call cost, and a self-serve spend cap.

View PR #187 →
  • OpenRouter gateway with per-tenant provisioned keys and monthly spend limits
  • Bills off OpenRouter's exact usage.cost, not a static price estimate
  • Self-serve hard spend cap (clamped to your plan) with near-cap warnings
ai
#186 crs48

Bring Unreal Engine game data into xNet

A new governed connector and game-interop schema pack let an Unreal Engine 6 title's durable player data — identity, inventory, achievements, matches, and economy — sync into space-scoped xNet nodes you own.

View PR #186 →
  • Player identity is keyed to your portable xNet DID, so it carries across games
  • A save-file-not-netcode guardrail rejects per-frame syncs at build time
  • Game assets are stored as glTF/USD references; each title sees only its own space
platformplugins
#184 crs48

xNet is now an open, re-implementable protocol

The data model, sync, identity, and authorization are now a written standard — re-implement xNet in any language, over any database, and interoperate.

View PR #184 →
  • New /docs/protocol section: four normative layers (primitives, data model, replication, authorization) and the xnet/1.0 umbrella version
  • A language-agnostic conformance corpus with golden vectors and a Python reference kernel that verifies TypeScript-signed changes byte-for-byte
  • The XPP proposal process for evolving the standard
platform
#181 crs48

Managed AI, fair billing, and a company we run in the open

xNet Cloud gains a managed AI gateway with transparent, metered billing — usage is shown against an included budget with a hard cap so there are no surprise bills — plus self-serve plan changes. And a new public dashboard shows our real customer growth, revenue, and full cost breakdown as we build toward break-even.

View PR #181 →
  • Managed AI on paid plans: included monthly budget, metered overage, and a hard cap that stops before a surprise bill
  • See your AI usage against the included budget and change plans yourself, right from the dashboard
  • A public /open page: customer and revenue growth week over week, with an honest cost breakdown
cloudplatform
#180 crs48

Browsable changelog screenshots

Changelog screenshots are now a scrollable gallery: click any shot to enlarge it, hover a before/after to flip to the before image, and press and hold to reveal the diff.

View PR #180 →
  • A scrollable row of previews — click one to enlarge it in a lightbox
  • Hover or focus to flip instantly between after and before
  • Press and hold to reveal the diff — in the row or the lightbox
platformdevtools
#174 crs48

A redesigned chat & channels experience

Chat and channels are rebuilt to feel like Slack, Discord, or Zulip — grouped messages with avatars, emoji reactions, threaded replies, presence, and a smarter scroll.

View PR #174 →
  • Grouped messages with avatars, date separators, and a "new messages" divider
  • Emoji reactions, threaded replies, and inline edit-in-place
  • Presence dots, editable channel topics, and a comfortable/compact density toggle
  • Smart stick-to-bottom with a jump-to-latest pill and unread count
app
#173 crs48

Airtable-grade database grids

Database grids gain a summary footer with per-column aggregations and an adjustable row height, so you can read totals and tune density right in the view.

View PR #173 →
  • Per-column summary footer — Sum, Average, Min/Max, Median, Filled %, Unique, and more
  • Row-height control (Short / Medium / Tall / Extra tall), saved per view
  • Polished field-type pickers with readable labels
app
#171 crs48

Smoother, more consistent motion

A small, consistent animation vocabulary now runs across the app, so things move in a calm, on-style way. Toasts and banners glide in and out, and switching workspace scope cross-fades instead of snapping.

View PR #171 →
  • Toasts and banners animate both in and out
  • Workspace re-scoping cross-fades smoothly
  • Honors your system "reduce motion" setting
app
#170 crs48

Bring your Slack data into xNet

Moving from Slack just got easier. A new Slack connector imports your channels and message history into native xNet messages, and a Slack-compatibility layer translates Slack formatting so existing integrations are easier to carry across.

View PR #170 →
  • Import Slack channels and message history into native xNet channels
  • Slack mrkdwn and Block Kit messages translate to xNet-flavored markdown
  • A migration guide with an honest compatibility matrix
pluginsplatform
#169 crs48

Cleaner page editor typography

Page documents now read like Notion or Obsidian. Body text, bullets, numbered lists, to-dos, and blockquotes all share one clean left edge, the text column is centered, and the page title has a clear hierarchy.

View PR #169 →
  • Bullets, numbered lists, to-dos, and blockquotes align to a single left edge
  • Centered text column with consistent vertical rhythm between blocks
  • Checkboxes sit centered on their first line; the page title now clearly outranks H1
editor
#167 crs48

Linear-grade Tasks

The Tasks surface gets a Linear-style overhaul — faster in-surface navigation, multi-select bulk actions, a detail slide-over, and powerful filtering and grouping.

View PR #167 →
  • In-surface sub-nav (All Issues / My Issues / Triage) plus the Projects list
  • Multi-select with a floating bulk-action bar — set status, priority, or assignee in one batch
  • Filter bar, Display Options (group / order / density), Space-to-peek, and a detail slide-over
  • Opt-in violet "Linear" accent theme (Settings → Appearance → Accent)
tasksapp
#163 crs48

See your local agent in the AI panel

The AI panel now shows the local bridge agent and its connection status, with a picker to choose which agent handles your requests.

View PR #163 →
  • Live status for the local bridge agent
  • Pick which agent runs (your own Claude Code, Codex, …)
aiapp
#156 crs48

xNet adapts to your phone

On a small screen, xNet now uses a content-first mobile layout — bottom navigation and slide-in panels — instead of the desktop grid.

View PR #156 →
  • Bottom navigation and edge sheets on mobile
  • A content-first shell that gets out of the way
  • The desktop experience is unchanged
app
#159 crs48

Kick off agentic code tasks from xNet

The local bridge gained a run endpoint that executes a full agentic code task end to end, powering one-click dev tasks from the app.

View PR #159 →
  • A single call drives an end-to-end agent task
  • Foundation for in-app developer workflows
devtoolsai
#157 crs48

Paid plugins

Plugin authors can now sell their plugins — a licensing spine plus Stripe Connect payouts, with a fail-closed install gate that checks entitlements.

View PR #157 →
  • DID-bound plugin licenses
  • Stripe Connect payouts (publishers keep their own account)
  • Installs are gated on a valid license
pluginsplatform
#162 crs48

Plugins run on the Labs runtime

Plugin code now executes on the same sandboxed Labs runtime, unifying how user code runs and receives capabilities across the app.

View PR #162 →
  • Shared sandbox and runtime for plugins and Labs
  • Consistent capability grants for all user code
pluginsplatform
#160 crs48

Agent-native Connectors

Connectors sync an external service into governed nodes and expose agent tools — your AI works with policy-checked data while the access token stays in the hub.

View PR #160 →
  • Sync external services into governed nodes
  • Agent tools are surfaced to the AI automatically
  • Tokens stay server-side; the agent sees only what policy allows
aipluginsplatform
#155 crs48

An agentic dev loop in your terminal

The new xnet code command runs an isolated edit → validate → commit loop with your own agent, so you can vibe-code changes to xNet from the CLI.

View PR #155 →
  • Each task runs in an isolated git worktree
  • Runs the validation gate, commits on pass and rolls back on fail
devtoolsai
#152 crs48

Your agent can use your workspace

When you drive a local agent from xNet, it now gets governed tools to read and write your workspace — with writes gated by policy and your token staying local.

View PR #152 →
  • Workspace read/write tools exposed over MCP
  • Writes pass through a policy guardrail
aidevtools
#151 crs48

A richer, interactive changelog

The changelog page now shows the actual UI that shipped — screenshots pulled straight from CI — and you can filter, search, and click through them.

View PR #151 →
  • Auto-pulled screenshots, before/after sliders, and a click-to-zoom lightbox
  • Filter by tag and search across every entry
  • JSON and RSS feeds for the full history
platformdevtools
#150 crs48

Your Labs become AI tools

Tools you build in Labs are now available to the assistant, so your own automations can be called directly from AI chat.

View PR #150 →
  • Lab agent-tools surface to the AI automatically
  • One ladder from a Lab to an AI tool
ai
#149 crs48

AI that can act on your workspace

The assistant gained a tool surface, @-mention providers, and recommendations — so it can reference your data and take actions, not just chat.

View PR #149 →
  • Plugin and Lab capabilities exposed to the AI as tools
  • Extensible @-mentions in chat
  • Contextual recommendations
aiplugins
#148 crs48

Drive your own coding agent from xNet

A new local bridge lets xNet drive your own Claude Code or Codex CLI — bring your own agent, no extra API key, and your token never leaves your machine.

View PR #148 →
  • Runs your local Claude Code / Codex from xNet's UI
  • Loopback-only, OpenAI-compatible streaming
  • No model cost to xNet — it uses your own agent
aidevtools
#145 crs48

One trust model across plugins and Labs

Plugins and Labs now share a single trust and provenance system, so “is this code trusted?” is answered the same way everywhere in xNet.

View PR #145 →
  • Unified provenance and trust checks for plugins and Labs
  • Consistent install and run consent across the app
pluginsplatform
#147 crs48

Automated changelog & in-app "What’s New"

xNet now keeps a changelog you can actually read. Every release is summarized here, on the website, and inside the app — so you always know what changed when a new version lands.

The xNet workbench
  • A public changelog page with a JSON and RSS feed you can subscribe to
  • An in-app "What’s New" panel that flags updates since your last visit
  • Release notes on the desktop app are now written in plain language, not raw commit logs
  • UI screenshots captured by CI can be embedded directly in changelog entries
appplatformci
#143 crs48

AI chat that knows your workspace

The in-app assistant now reads your own workspace — your notes, tasks, contacts, and more — so its answers are grounded in your data, with citations. It also remembers the conversation instead of treating every message as the first.

View PR #143 →
  • Answers are grounded in your workspace and cite the items they draw from
  • Conversations have memory — the assistant sees the whole thread, not just your last message
  • A clear "reads workspace" badge and privacy note explain what it can see
ai
#146 crs48

Reliability you can see for managed hubs

xNet Cloud now measures uptime against real service-level objectives, ties upgrades to error budgets, and runs backup restore drills — the operational backbone behind the managed fleet.

View PR #146 →
  • Measured SLIs/SLOs for each managed hub
  • Error-budget-gated rollouts
  • Routine backup restore drills
platform
#142 crs48

Plugin ecosystem: scaffolding, marketplace & trust

Building and sharing plugins is now first-class. A scaffolder gets you from zero to a working plugin in seconds, and an enforceable capability model keeps installs safe.

View PR #142 →
  • xnet plugin scaffold command and an AI "script → plugin" path
  • Capability enforcement, semver compatibility gates and inter-plugin dependencies
  • A searchable marketplace index with install-consent prompts
pluginsplatform
#136 crs48

On-device dictation

Talk to xNet. A new dictation engine turns speech into text locally, with hold-to-talk and private-by-default transcripts.

View PR #136 →
  • Zero-dependency dictation engine with hold-to-talk
  • Private-by-default transcription with full-text search
  • Pluggable speech backends (bring-your-own engine)
appai
#144 crs48

Extensibility fabric: one home for plugins, labs & AI

Plugins, labs, the AI surface, and the editor are converging into a single extensibility fabric, so a capability built in one place can be reused everywhere.

View PR #144 →
  • Shared trust and consent model across plugins and labs
  • Plugin contributions and lab tools can be exposed to the AI assistant
  • Foundations for an AI → Lab → Plugin assembly line
pluginsaieditorplatform
#141 crs48

Faster, cheaper CI

Behind the scenes, the build pipeline got faster and more reliable — which means features reach you sooner.

View PR #141 →
  • Parallelized lint, typecheck and test jobs
  • Cached browser and native build dependencies
ciperformance
#140 crs48

xNet Cloud — managed hub hosting

Don’t want to run your own hub? xNet Cloud hosts one for you. A new onboarding flow takes you from signup to a provisioned hub, then lets you claim it from the app.

View PR #140 →
  • Marketing and pricing pages for managed hub hosting
  • Signup → provision → claim flow
  • Connect the app to your hosted hub from Settings
platformapp
#138 crs48

A safer foundation for plugins

Plugins now run on an enforceable platform layer — capability gates, provenance and trust checks, dependency resolution, and a searchable marketplace index — so installing a plugin is governed end to end.

View PR #138 →
  • Capability enforcement wraps each plugin's data access
  • Install-time consent prompts when a plugin needs new capabilities
  • Inter-plugin dependencies resolve with cycle detection
pluginsplatform
#137 crs48

xNet AI chat panel works out of the box

The in-app AI assistant is wired up end-to-end — the chat panel now connects, picks a sensible model tier automatically, and reports errors honestly.

View PR #137 →
  • Fixed the connection so the assistant responds on a fresh install
  • Automatic model-tier selection with a clear status badge
  • Tier preference persists between sessions
aiapp
#123 crs48

Cohesive, feature-complete domain apps

CRM, accounting, tasks, experiments and spaces are now fully editable and consistent. Open any record to see every field, with bespoke views where they help.

Domain workspace in xNet View PR #123 →
  • Full CRM: contacts, deals, organizations, forecast lanes, quotes and de-dup merge
  • Finance: account and transaction inspectors, reports tab and budgeting
  • Tasks: project detail headers and milestone management
  • A shared inspector substrate (NodePeek + SchemaForm) across every domain
crmfinancetasksapp
#106 crs48

Plug-and-play billing (Stripe & Bitcoin)

A provider-agnostic billing layer lets xNet apps take payments via Stripe or Bitcoin (BTCPay) without locking into either.

View PR #106 →
  • Stripe and BTCPay adapters behind one payment interface
  • Signed webhooks with idempotent processing
  • A useBilling() hook for checkout and subscription status
platform
#102 crs48

Native CRM & ERP foundation

xNet grew a native CRM — a universal party model, pipelines, deals and activities that reuse the same social and schema primitives as the rest of the app.

View PR #102 →
  • Organizations, contacts, pipelines, deals, products and quotes
  • Append-only activity timeline and contact de-duplication
  • vCard import/export and GDPR helpers
crmapp
#101 crs48

Double-entry accounting

Track your money in xNet. A local-first, double-entry ledger brings accounts, transactions, budgets and reconciliation — with CSV/OFX/QIF import.

View PR #101 →
  • Balanced double-entry transactions with integer-precise money
  • Budgets, reconciliation and chart-of-accounts reports
  • Import from CSV, OFX and QIF
financeapp
#94 crs48

Screenshots of every UI change, automatically

Every pull request that touches the interface now gets before/after screenshots and GIFs captured by CI — the same visuals that can feed this changelog.

View PR #94 →
  • Automatic screenshot, diff and GIF capture for changed UI
  • A sticky gallery comment on each pull request
  • Durable galleries that survive after merge
cidevtools
#89 crs48

Experiment journal & habit tracker

Run personal experiments and track habits in xNet, with streaks, correlations and a verdict engine that stays honest about what the data can and can’t show.

View PR #89 →
  • Metrics, observations and experiments as first-class data
  • Streak heatmaps and correlation widgets
  • A "Today" panel for quick logging
app

Updated August 2, 2026