What Desire Builds explores Eros and software
A new blog essay connects bodily attention, consent, and the wish to make tools together in xNet.
View PR #729 →No entries match.
A new blog essay connects bodily attention, consent, and the wish to make tools together in xNet.
View PR #729 →The website explains the shipping workspace, its open data layer, and the longer-term vision with clearer copy, compact sections, and a neutral white design.
View PR #727 →A white mesh cell on black makes xNet’s app icon and favicon easier to recognize, with a softer center and matching rounded lettering across the website.
View PR #726 →New artwork brings each essay to life on the blog, inside posts, and in shared links.
View PR #725 →Pair selected saved links with an experimental read-only browser viewer, search their neighborhoods, and inspect saved details; Vision Pro controller support and comfort still need device testing.
View PR #724 →Caption retrieval retries an empty helper version check while still requiring the supported helper version.
Desktop startup waits for large workspace checks and search-cache reconciliation to finish before reporting a timeout.
Recovery copies on macOS share unchanged disk blocks while keeping saved content and backup retention intact.
Browsing large Libraries no longer holds up enrichment as more descriptions and transcripts are saved. Resource refreshes also avoid piling up during slower operations.
Repeated rate limits now increase the wait between enrichment attempts while honoring longer delays requested by the source.
The desktop restores editing if resuming Library enrichment times out after a recovery copy, keeps recovery errors visible, and gives large workspaces more time to resume.
Enrichment starts while local indexing continues, saves YouTube details without installing a helper, shows live progress, and keeps restricted videos from holding up the rest.
Import more social exports, enrich TikTok and starred repositories, and retrieve YouTube captions through a fallback when direct tracks fail.
Saved links get richer GitHub READMEs and repository details, visible article text, thumbnails, and available captions. Large imports spend less time waiting on the local queue, and unrelated websites no longer share an enrichment cooldown. A throttled image server no longer delays page text from another host.
Imported Instagram posts now fetch public captions, authors, and cached thumbnails without an extra helper. Posts that need sign-in show a gap while enrichment continues.
Browse your saved links through playlists, tags, topics, categories, and creator names, with thumbnail previews and searchable neighborhoods.
Record edits and their history now commit together. If a write fails, the whole edit rolls back and can be retried. Imported history keeps its original change identity after restart.
Recovery copies now include desktop preferences, your AI provider key, and an unfinished capture draft. Encrypted exports restore these settings before the app opens.
Open saved collections, page through their original entries, and view enriched source details while keeping repeated saves and missing items visible.
Capture a URL, a thought, and an optional excerpt into a private editable Page, then find the saved note offline.
Export your workspace, retained source files, and recovery keys to a password-protected folder. Restore it through Settings while keeping your current workspace. Browser settings and sign-in sessions are not included.
Pause a desktop archive import and resume from its last saved batch after reopening xNet. Reviewed selections and original source bytes stay with the workspace, so the original export path is no longer required.
Create verified local recovery copies from Settings, restore without deleting newer work, and keep a restored workspace offline for review. Desktop quit and update installation now wait for text saves and a recovery copy.
Coverage & gaps offers video-helper setup, cancellation, and repair, with checks for incomplete or altered downloads.
Instagram imports now read named collections and liked comments, and share resources across likes and saves. YouTube imports retain repeated playlist entries and report ambiguous catalog matches. A read-only preview reports seed archive coverage before import.
The desktop now schedules copies of changed data, shows backup failures, and upgrades supported storage on a separate verified copy while retaining the original workspace.
The desktop import picker accepts GitHub stars snapshots, preserves native star dates, and keeps a verified private copy of imported exports for local recovery.
Browse imported links, cache source thumbnails, and search full fetched descriptions and available video captions offline. Pause enrichment and inspect missing details from the Library.
Older or unreadable workspaces now stop with recovery guidance instead of being reset. Development launches use separate data folders.
Unreadable recovery manifests stay on disk with a visible warning, while xNet can keep making verified copies and quit safely.
Import a garden JSON snapshot with its source links, authored notes, tags, and categories. Find resources by your own commentary and recover the original snapshot with your workspace.
Pasting a blog post link into Slack, iMessage, X or Bluesky now unfurls with that essay's hero picture instead of the generic xNet screenshot.
View PR #720 →A new essay on why internet voting stays unsolved and what the same tests say about xNet. xNet now has a published security policy telling researchers where to report a bug and what we promise in return.
View PR #713 →Plugin- and connector-contributed agent tools now appear in Claude Code sessions, xnet mcp serve, and the in-app assistant automatically — including live, when a plugin activates mid-conversation. The plugin_* tools ship in both terminal lanes, so a connected agent can scaffold, build, and preview sandboxed workspace plugins, and a new Workspace Plugins panel runs them with hot reload. The desktop app also stops using a source-derivable signing key: seeds are now random, per profile, and stored in your platform keystore.
View PR #712 →The site now leads with the agent connection: a copyable npx @xnetjs/cli connect command with per-client tabs in the hero, a new /agents page covering installs, the three access lanes, and the safety model, and agent-readable entry points at /llms.txt and /agents.md. Zero-install connects now register an MCP server that keeps working after the npx cache is gone.
View PR #711 →A new blog essay asks one question of every machine in the house: if its maker vanished tonight, what still works in the morning? On rented rotary phones, bricked smart-home hubs, and the vanish test xNet pins in CI.
View PR #708 →Blog essay #23, on why productivity platforms have to be able to read your pages — and why a ban and an export were ever welded into one act. Eleven documented account suspensions across nine companies, and the promise it commits us to: a host can refuse to serve you, but refusing can never take your work. Read it at /blog/the-door-inside-the-house.
View PR #704 →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 →Need more room? Buy 100 GB, 500 GB or 1 TB on top of the plan you already have — same hub, same seats, same AI budget, same price for all of it. Extra space applies immediately; removing it waits until your data fits, so a quota never shrinks out from under stored data.
View PR #696 →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 →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 →Follow xNet on Bluesky and you'll see new blog essays as they publish, plus the changelog entries worth interrupting you for — not every commit. Links in the posts are properly clickable.
View PR #691 →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 →The seeded demo dashboard referenced a widget type that no longer existed, so its habit heatmap rendered as an empty tile. It now resolves to the real widget, and a test checks every seeded widget against the registry.
View PR #690 →Dragging a card to another column now animates it into its new spot, and reordering tabs slides the neighbours aside rather than snapping. The animation code loads only when you first drag something, so start-up is unaffected.
View PR #681 →Settings now has an AI section where you pick whether the assistant scaffolds your thinking or drafts finished prose. Scaffold stays the default. First-run tips also start appearing again — every one of them had been silently rendering nothing.
View PR #685 →xNet's public economics doc adds a fifth test — every promise we make not to charge you for something must name the revenue that pays for it — and the build now fails on scarcity countdowns and act-now prompts anywhere in the product.
View PR #682 →When the full-text index is unavailable, the in-app assistant falls back to scanning a limited window of your workspace. It now says so alongside its answer instead of replying as if it had searched everything, and cites the path it followed to each item it used.
View PR #687 →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.
View PR #674 →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.
View PR #680 →Contacts can hold the shared activities a word like "friend" leaves out, and xNet reads the label from them instead of storing it — including which activities people in that kind of relationship commonly share that you don't.
View PR #679 →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 →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.
View PR #676 →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 →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 →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 →Claude Code and Codex now use xNet's real retrieval instead of scanning the first 500 nodes, the new `xnet recall` answers questions that span several notes and shows how it got there, and xNet remembers what you have told it between sessions.
View PR #667 →Capture your screen and camera, get a transcript, and let xNet propose cuts for dead air — all on your machine. Edits are non-destructive: every cut is listed, reversible, and the original is never overwritten.
View PR #666 →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 →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 →A failed hub setup now cleans up after itself instead of leaving a paid-for server running with nothing attached to it, and scheduled maintenance jobs no longer get skipped when the service restarts.
View PR #662 →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 →Turn on 'Allow edits' in the AI panel and the assistant can create and edit pages. Risky changes pause for your explicit approval in the chat, every action is audited, and the local agent bridge now shows tool activity and per-turn cost.
View PR #656 →Cold open is back at pre-unified-shell speed: editors, database views, meetings, charts and panels now load when first opened instead of at launch.
View PR #655 →The desktop shell is the same workbench the web app uses: sidebar with search and filters, command palette, tabs, and panels — with the canvas home, meetings, data workspace, and social import inside it. The two apps now stay in sync by construction.
View PR #653 →Open Assistant from the system menu or command palette to chat with your workspace on desktop. It finds your Claude Code or Codex subscription automatically and pairs with one click — your model, your machine, and it can search and read your actual pages and data.
View PR #648 →The Railway deploy button and README link now point to Railway's new deploy URL; the old template URL had started returning 404.
View PR #645 →The app icon and favicon use a refined geometric mandala, and the mark now appears as a subtle debossed engraving beside the wordmark in the site and docs headers.
View PR #643 →Opening the menu in the desktop app crashed it to a black screen with no way back. It works again, and a shell error now shows a recoverable panel instead of taking the whole window down.
View PR #641 →The app icon and favicon across desktop, web, mobile and the site are now a fine geometric mandala on black, replacing the previous mark.
View PR #640 →A copy-editing pass across all twenty essays cuts an overused em-dash habit and the mirrored sentence pairs that came with it. No facts, quotes, links or arguments changed.
View PR #639 →The desktop app's AI chat now hands your coding agent xNet's own tools, so it can search your workspace and create pages and tasks in it — not just talk about them.
View PR #638 →The xnet_query tool used to ignore a schemaId filter and return nodes of every type, so an agent asked about your pages could answer with canvases. It now filters correctly, and a query with no type at all fails loudly instead of quietly returning everything.
View PR #637 →The desktop app no longer rebuilds native modules on every start, only when they actually change.
View PR #636 →Contributor-facing docs for AI agents are single-sourced in AGENTS.md, with surface-specific guidance loaded only where it applies.
View PR #635 →A Storybook button now sits next to the dev-tools button when the component catalog is running, and Storybook has a Back to app button.
View PR #634 →UI explorations can ship an MDX page rendered in Storybook against the real design system, with a wireframe kit for UI that does not exist yet.
View PR #633 →Hold Option and hover to see whether a piece of the interface comes from a theme token, a panel, a plugin, or xNet's own source — and one sentence on what changing it would affect. Option-click to adjust a token or move a panel, with one Undo.
View PR #631 →On models that call tools reliably, the in-app assistant searches and reads your workspace directly instead of only answering from context it was handed — and shows you each lookup as it happens. It still cannot make changes.
View PR #629 →The desktop app can download and run in-browser AI models and build its on-device search index — its content policy previously blocked the model weights, WebAssembly, and the local agent bridge.
View PR #629 →New `xnet connect claude-code|codex` wires a coding agent to your workspace in one step; the agent CLI verbs now work with the app closed via a standalone SQLite store.
View PR #627 →The local AI bridge can now stream tool calls, cost, and session info as structured frames over a new endpoint, keeps chat sessions across restarts, and sources model info from models.dev.
View PR #623 →The agent bridge's default origin allowlist (and the CLI/docs examples) pointed at app.xnet.fyi, which no longer exists — the deployed app at xnet.fyi/app could never pair. The default is now https://xnet.fyi; XNET_BRIDGE_ALLOWED_ORIGINS still extends the list.
View PR #621 →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.
View PR #620 →xNet can now project a published page onto the shared site.standard lexicon as a rich card while the body stays on your hub, sign in and recover with your Bluesky identity, and make a self-hosted hub discoverable across the network — the private half of the atmosphere.
View PR #619 →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.
View PR #617 →The top-left New menu now creates tasks, channels, meetings and spaces alongside pages, databases and canvases. The plus button in the corner of the sidebar has been removed — it always made a page even when you were looking at chats.
View PR #615 →Database file cells now hold several attachments, show thumbnails inline, and open a full-screen viewer with paging and download when clicked. Attachment bytes sync between your devices through the hub instead of staying stranded on the device that uploaded them.
View PR #614 →Lists, chat transcripts, the sidebar tree and long menus now fade their content into the background at any edge that still has more to scroll, and the fade disappears once you reach the end. Works in light and dark mode on every surface.
View PR #613 →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 →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 →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 →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 →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 →Placing your cursor inside a commented passage no longer pops up a second, differently-styled comment card. The comment island is now the only comment surface in the editor.
View PR #601 →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.
View PR #596 →The blog now has a duplicate at /blog-preview built by the xNet publishing pipeline, so we can compare it against production before changing anything.
View PR #594 →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.
View PR #573 →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 →Fixed export maps so TypeScript resolves types reliably, and shipped the .xnetpack codec that was advertised but never built.
View PR #587 →The new essay now carries its Sources section: ten grouped entries with every citation link verified.
View PR #586 →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 →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.
View PR #579 →A published post now shows readers the version you published, not your latest draft, until you publish again.
View PR #578 →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 →A new xnet publish command renders your pages to plain HTML, RSS and a sitemap you can host anywhere — no hub required.
View PR #575 →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 →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.
View PR #567 →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.
View PR #564 →Importing or deleting a large data set now sends changes in batched frames instead of one at a time, and verifies them with native crypto — a 10,000-change import reaches the hub in under a second instead of several minutes.
View PR #563 →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 →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 →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.
View PR #552 →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 →Databases gain a first-class Location column type storing latitude and longitude in one cell.
View PR #541 →Sign in with any ATProto handle to claim a free global name, with a verified-handle badge and Bluesky-identity account recovery — all optional and self-hostable.
View PR #536 →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 →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 →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 →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 →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 →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.
View PR #523 →The new editor no longer floats as a white card: the document background matches the page, checkboxes and list markers line up with their text, and the blue focus border around the document is gone.
View PR #512 →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 →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 →Every demo at xnet.fyi/play (and the paired frames on /demos) ships the real DevTools inspector — click the floating wrench or press Ctrl/Cmd+Shift+D to watch the data, change log, and sync frames live while you play.
View PR #506 →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).
View PR #496 →A new opt-in "Report a problem" flow lets you send scrubbed crash and diagnostic reports to a first-party endpoint — you see and can edit the exact contents before anything is sent. xNet does not use a third-party error service.
View PR #499 →Opening a document could fail with a storage error ("no such column: tiebreak_key") when the local database had been created by an older build. The missing column is now repaired before the first read, so existing workspaces open documents without needing a data reset.
View PR #498 →xnet.fyi/demos shows two copies of the same app syncing in real time; the demos live at /play with shareable room URLs, and a copy-paste examples/minimal-app starter gets a synced app running in two commands. React apps get a new usePresence hook for live cursors and ephemeral peer state.
View PR #494 →Schema authorization gains create and update actions that refine the coarse write action. Chat messages and comments now declare contributor semantics: anyone in the space may post, but only the author (or a space admin) may edit afterwards.
View PR #488 →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 →The sidebar, status bar, dock, and context panel no longer cast a drop shadow — islands sit flat on the surface with just a hairline edge. Modals and menus keep their shadow so they still read as floating.
View PR #485 →The last-write-wins tiebreak no longer lets a hand-picked identity win every simultaneous edit; conflicts now break by a per-conflict hash of what was written. Sync bumps to protocol v4.
View PR #482 →Tab content — pages, databases, settings, chat — now blends into the backdrop behind the floating islands, and every overlay (modals, menus, dev tools, sheets) shares the same island fill as the sidebar and status bar, in both light and dark mode.
View PR #474 →Selecting Tasks in the sidebar now opens the task board directly alongside the panel, so the extra "Open task board" link is gone.
View PR #472 →Channels and workspaces shared with you now keep receiving new messages and edits across reloads, even when you're not viewing them.
View PR #471 →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.
View PR #465 →You can now share a saved workspace (bench) with a link, like a page or channel — the recipient gets the layout in their switcher.
View PR #470 →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).
View PR #468 →Opening a shared channel link now shows the real channel — its name, full message history, and members' names/avatars — and new messages arrive live. Previously a shared channel opened empty.
View PR #467 →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.
View PR #464 →Opening a database view containing a formula or rollup column (such as the seeded Tasks Tracker) crashed the editor. Computed cell values are now rendered as text, and link detection safely ignores non-text values.
View PR #460 →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.
View PR #461 →You can now generate a share link for a chat channel (from the channel header or its menu) and for a saved workspace layout — the same way you share a page or database. A channel share with 'comment' access lets people post messages without editing the channel.
View PR #457 →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 →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 →The changelog now paginates at 50 entries per page, so the timeline loads and scrolls comfortably as history grows.
View PR #454 →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 →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 →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 →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 →The floating Assistant island no longer opens over the editor at launch. It starts collapsed to its reopener pill so the workspace is clear at rest — one click reopens the full island.
View PR #445 →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 →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 →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 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 →You can now point the AI panel at a local Claude Code, Codex, or Ollama model through a hardened loopback bridge — protected by a pairing code, an origin allowlist, and Host-header checks so no other website can reach it.
View PR #439 →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 →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 →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 →Tabs no longer show an inline pin button that took up space; pin and unpin are still available from the tab's right-click menu.
View PR #436 →When Settings is open, its section list (Profile, Appearance, Labs, …) moves into the lower-left contextual island, matching the rest of the workbench, and the selected section fills the main area. The active section now rides in the URL (/settings?section=…), so it's deep-linkable.
View PR #433 →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 →The dev-tools button beside the status bar now toggles the panel directly instead of opening a menu. The floating Assistant dock now uses the same 8px spacing as the other islands — it no longer floats with extra margin on the left, right, and bottom.
View PR #432 →The workspace selector at the top of the sidebar now switches which workspace (Space) you're scoped to and filing into — it no longer changes your shell layout. The old workspace-filter chips and the duplicate New button have been removed from the Explorer, which now stays focused on your files.
View PR #431 →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 →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 →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.
View PR #427 →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.
View PR #426 →Right-clicking a canvas node opens a context menu with its actions, matching the right-click menus already available elsewhere in the app.
View PR #425 →Right-click (or the hover ⋯ kebab) now opens an actions menu on Explorer items, channels, chat messages, editor tabs, and card/list/timeline/board/task rows — rename, move, archive, delete and more, in place.
View PR #424 →The left-nav Explorer panel now scrolls vertically, so every workspace, folder, tag, and page stays reachable no matter how much you have.
View PR #423 →Opening a document with a single click now shows it as a preview tab (italic) that the next click replaces — double-click, or start editing, to keep it. Matches VS Code, and now works from every list including the home page.
View PR #422 →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.
View PR #420 →Blog post #12, the series' first personal essay: on autism, dissociation, and the network dreamed in the timeout — with a new 'personal' tag on the blog index.
View PR #419 →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 →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.
View PR #412 →The Workspaces button now appears on the workbench rail and in the quiet shell's corner glyphs, not just the calm mode switch — and Settings → Appearance picks between the three layout presets (Quiet, Calm, Bench) with a shortcut to the workspace switcher.
View PR #411 →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.
View PR #409 →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.
View PR #407 →Turn any database into a form: build questions from fields with show-if rules, share a public link that needs no account, and collect responses as rows — validated and signed by your own device, never the server.
View PR #405 →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 →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 →The storage engine, sync server, and app shells were reorganized into smaller, independently tested modules — same behavior, one shared conflict-resolution rule everywhere, and page comments now share one implementation across web and desktop.
View PR #401 →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 →Settings → About now displays the actual running build version — bumped automatically with every release — and links to the correct GitHub repository.
View PR #399 →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 →Opt in to quiet chrome (⌘K → View: Quiet chrome): the surface owns the screen, and the navigator, context panel, and a devtools-style dock are summoned from the corners and edges. Pin pages, databases, and views onto your new Desk — a bounded home canvas that follows your identity.
View PR #395 →Two durability fixes: edits made offline before an app restart no longer get stuck behind the sync circuit breaker, and two devices editing the same field at the same logical time now always agree on the winner instead of depending on delivery order.
View PR #392 →New reliability suite: deterministic sync simulation with seeded network chaos, SIGKILL crash-consistency testing, backup restore drills, 100k-node scale rails, and hub load smoke — run shallow on every PR and deep every night.
View PR #392 →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 →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 →Blog post #10: how game modding built genres, why the walled-garden era locked that creativity out, and how capability-scoped views over data you own bring it back safely.
View PR #387 →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 →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 →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 →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 →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 →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 →Every blog post now ends with a previous/next pager, so you can read the essays as a series — finish one and jump straight to the next.
View PR #379 →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 →Local databases now return freed space to the filesystem when old change-log history is compacted, so the file that determines cold-open speed shrinks over time instead of staying large. This steadily speeds up opening large, long-lived workspaces.
View PR #369 →xNet Cloud now recognizes Stripe payment-failure and recovery webhooks and tracks a per-account non-payment lifecycle, so a failed card opens a grace period (and recovers cleanly) rather than silently doing nothing until the subscription cancels.
View PR #367 →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 →New runtime primitives (createMultiHubSyncManager + replication-scope helpers) that route each Space to only the hubs its policy selects, wiring up selective multi-hub replication over the existing multiplexed transports.
View PR #365 →A new dunning lifecycle decision powers grace, suspend, and retention so a failed payment degrades an account gracefully — and never deletes your local data — instead of an abrupt cutoff.
View PR #364 →A new Run on Mobile page (linked in the footer) shows a QR code that launches the xNet demo inside Expo Go — no App Store, no sideloading — plus copy-paste steps to run it yourself.
View PR #363 →The humane-pattern build check now scans the site too, and the telemetry commitment is worded honestly — 'scrubbed and bucketed', not 'k-anonymized' — to match what the code actually does.
View PR #359 →Workspaces with a long edit history now compact their local change log in the background, so the app opens faster after the first sync.
View PR #360 →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 →A lagging sync cursor made the first outbound resync process the whole change-log slice synchronously — a multi-second main-thread freeze on cold open. It now sorts by code units (not locale) and yields to the event loop between batches.
View PR #356 →A slow local-database open (which could intermittently exceed the startup timeout and show an initialization error) now retries automatically with a fresh worker instead of failing the whole boot.
View PR #355 →A main-thread stall detector records how long the app freezes during a slow cold start and at which phase, so the cause can be pinpointed from one localStorage value.
View PR #354 →The persisted boot timeline now re-captures itself after a stall settles, so a slow cold start is recorded in localStorage even when it happens after the app reports connected.
View PR #353 →Boot-phase timings are now persisted to localStorage (xnet:boot:last) so a slow cold start can be diagnosed from a single value even when the console log is truncated.
View PR #352 →A timed-out database open now releases its storage handles immediately instead of holding them while still initializing, so a retry no longer compounds the delay. Adds cold-start boot diagnostics that pinpoint where startup time goes.
View PR #351 →Fixed a content-security-policy gap that blocked the WebLLM in-browser model from downloading its weights, so the on-device assistant now loads and replies.
View PR #350 →The AI chat box no longer sits disabled with no explanation when you pick an in-browser model. WebLLM now runs a small model fully on-device after a one-tap download (with progress), Gemini Nano offers a download button when its model isn't ready yet, and every tier that can't run shows why instead of a silent dead box.
View PR #349 →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 →On phones the calm layout shares the same three modes as desktop — Companion, Workspace, and Network drop to a bottom tab bar, with the list and contextual canvas as sheets.
View PR #347 →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 →Returning to xNet now paints your recent pages, databases and canvases from a local snapshot in well under a second, instead of waiting on the first cold database read.
View PR #345 →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 →You can now split your recovery across trusted people (any 2 of 3 can help you back in) and recover on a new device by collecting their share codes — no recovery phrase to memorize, and the cloud is never involved.
View PR #339 →The blog listing shows each essay's hero illustration as a colourful card banner, so posts are easier to tell apart at a glance.
View PR #338 →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 →If your xNet passkey syncs via iCloud Keychain or Google Password Manager, you can now recover your workspace on a new device with one tap — no recovery phrase needed.
View PR #333 →A new essay on applying permaculture's design principles to the open web — regenerating the digital commons instead of strip-mining it.
View PR #326 →Settings now shows your recovery phrase (behind a passkey prompt) for recoverable identities, so you can save it any time — and back it up to the system keychain in the desktop app.
View PR #327 →You can now opt into a recovery phrase at sign-up and use it to restore your identity and encrypted data on a new device if you lose your passkey.
View PR #324 →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 →A new blog post on Saharan dust, desert bees, and the invisible substrate the open web runs on — the fourth in the essay series.
View PR #321 →xNet Cloud now verifies the passkey that claims a hub with a real signature over a single-use server nonce, and the dashboard can recover your paid account and hub from your billing login if you lose the passkey (your encrypted data still needs a saved recovery phrase).
View PR #318 →Fixed the plan default models (Claude Haiku/Sonnet/Opus) to OpenRouter's real catalog IDs, so managed AI works out of the box instead of failing with model-not-found.
View PR #319 →Managed AI now lets you pick any plan-allowed model and set a personal spend cap by week, month, or rolling window — we stop calls when you hit it. Replies stream in token-by-token, prices shown are what you pay, and billing stays provably above cost.
View PR #316 →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 →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 →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 →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 →The landing page got a thorough refresh — an AI-native section, an integrations gallery, the full app surface (CRM, finance, maps, labs), our six commitments, and an honest by-the-numbers strip whose counts are verified against the repo at build time.
View PR #305 →Mobile is now wired to host the same xNet web app inside a native webview (Capacitor) rather than re-implementing documents, databases, canvas and dashboards — with OPFS storage capability detection so it picks the right backend per device.
View PR #307 →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 →You can reach our Commitments page from the footer of every page, not just the top nav.
View PR #303 →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 →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 →The Compare page's Protocols layer now includes xNet alongside AT Protocol and Matrix, and the sync-engines section's framing was corrected so it no longer contradicts the own-store tools (Turso, Ditto) it lists.
View PR #299 →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 →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 →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 →A narrative landing page (/why) that reframes everyday web surveillance as a physical-world thought experiment — then shows, with cited sources, how xNet's local-first model keeps your data yours.
View PR #292 →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 →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 →The bottom status bar's connection indicator is now a click-through cluster: a calm chip when synced, plus on-demand chips for unsynced changes, integrity warnings, and storage pressure — with a detail popover and a Reconcile action. Mobile gets a matching sync glyph.
View PR #289 →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 →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 →To-do checkboxes now show their real checked state and line up with their text, the block drag handle sits in the margin instead of overlapping bullets and checkboxes, and headings use a consistent vertical rhythm.
View PR #285 →Server-side URL fetching (link unfurling, federation, crawling) now uses a single strict SSRF guard that blocks private network ranges earlier blocked inconsistently, and several duplicated helper functions were consolidated.
View PR #284 →Map layers can now bind to a database by lat/lon and render live in the viewport, switch to a satellite basemap, or overlay aerial imagery — backed by new query, raster, and pmtiles layer sources and pure geohash spatial helpers.
View PR #283 →The desktop app now runs heavy database reads (search, large lists) in parallel on multiple cores and keeps the UI responsive during big imports.
View PR #282 →Your workspace now starts syncing with the server immediately on load instead of waiting for local startup work to finish, so changes appear sooner. We also added detailed boot diagnostics and a one-time cleanup that reclaims disk space from old presence data.
View PR #280 →Interactive reads now take priority over background writes, so opening pages and searching stay snappy even while a large sync or import is running. Repeated identical reads are also collapsed into one.
View PR #279 →Returning users no longer wait through a long blank-screen pause before their workspace appears — local data now paints right away instead of queuing behind presence/document warming. Also fixes a background error that stopped your tracked-node list from saving.
View PR #278 →Database views can now reuse their cached results across reloads even when per-row permissions are in effect — authorized once when the view is built, and automatically rebuilt the moment access changes, so a revoked viewer never sees stale rows.
View PR #277 →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 →The DevTools landing page now shows real screenshots of the in-app debugger instead of stylized mockups.
View PR #273 →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 →A single-page walkthrough of xNet React — the hooks, then a choice between a managed Hub or your own @xnetjs/server backend — plus a DevTools showcase and docs for running your own server.
View PR #271 →Adversarial review of @xnetjs/server closed authorization, identity, and conflict-resolution gaps (cross-tenant write/delete, create clobber, signed-change spoofing, custodial clock drift) before the kit is exercised in production.
View PR #270 →New @xnetjs/server lets developers run xNet's data layer on their own server with their own auth — a structured-query executor, backend-authoritative mutations, and a server/custodial/signed trust spectrum — while React hooks stay unchanged.
View PR #267 →The dev-tools seed now fills out databases (columns, rows, views), a full CRM and ledger, nested folders and team workspaces, multiple rich linked documents, and canvas scenes — so it exercises every relationship in the app.
View PR #266 →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 →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 →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 →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 →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 →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 →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 →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 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 →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 →Clicking "Open web app" from the xNet Cloud dashboard now points the web app at your own managed hub instead of the shared default.
View PR #251 →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 →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 →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 →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 →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 →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 →Import your Linear issues into xNet as governed nodes, alongside GitHub, Notion, and Airtable.
View PR #241 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →Use metered xNet Cloud AI right from the app — no API key — and switch between models with live pricing.
View PR #223 →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 →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 →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 →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 →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 →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 →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 →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 →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 →Every changelog entry now links to its pull request and shows a 'View PR' link even when there are no screenshots.
View PR #191 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →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 →Plugin code now executes on the same sandboxed Labs runtime, unifying how user code runs and receives capabilities across the app.
View PR #162 →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 →AI edits in the editor now show a preview with an approve or reject gate, so nothing changes your document until you say so.
View PR #158 →Select text in the page editor and ask AI to rewrite, summarize, or transform it — inline, without leaving the document.
View PR #154 →xNet has fresh cosmic-web app icons and a new favicon across the desktop app and the website.
View PR #153 →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 →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 →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 →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 →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 →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 →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 →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 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 →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 →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 →Talk to xNet. A new dictation engine turns speech into text locally, with hold-to-talk and private-by-default transcripts.
View PR #136 →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 →Behind the scenes, the build pipeline got faster and more reliable — which means features reach you sooner.
View PR #141 →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 →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 →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 →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.
View PR #123 → A provider-agnostic billing layer lets xNet apps take payments via Stripe or Bitcoin (BTCPay) without locking into either.
View PR #106 →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 →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 →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 →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 →Updated October 22, 2026