Releases

This is what came in each Graview version, newest first, in a few plain lines for deciding whether to upgrade. Every @graview/* package and graview share one version, so each version is said once.

Each version links its release and its full changelog. Before you upgrade says what breaks or moves for a host; Stability says what a version may change at all.

0.2.1

Published November 13, 2026 · the current version

The one face reads clean on a rich app: the City's boards and names never stand on each other, a page's lines leave from its own records, Nearby opens wider and can be explored, and a host mounts the one face through the embed.

  • Through the embed. The embed's mount takes sceneUnderPages and puts the host's bar in the one face's bar slot, seen at every level.
  • A City that reads clean. One placement pass stands each kind's views over their own district and each district's name beside it: no board, name, count or chip stands on another, nothing is cut or wrapped, and on a small window the City pans rather than shrink its words. A district's name opens its list, and its warning chip opens that kind's problems. The legend is a button, closed until opened.
  • Nearby shows its records. Districts are labels on the ground, not cards over their buildings, and the views stand there as at the City.
  • Lines from custom views. A worker view's or a frame's records have lines to their buildings. Each line starts on its own card or row and runs in the gap between rows to the panel's edge; four or more into one district become one line with a count; lines draw over boards.
  • A record is lit where it stands. Opening a record from the city outlines its building in place; the district keeps its order and fades the same way on a fresh load and after a press.
  • The page is drawn once. The page drawn while the one face loads is the page that stays, so a press, focus and typed words survive its arrival.
  • A wider panel you can explore beside. On a desk the panel opens at 55% of the window (at most 1,192 px), keeps the width you drag it to, and takes a host's panel share. Over the city a pinch or wheel zooms and a drag pans; over the panel a pinch still moves between levels. A page in the panel keeps panel-sized margins, and a view can tell it is there.
  • Security and reliability fixes for bound people.
  • Not on the one face: the "+n past" and "n match" chips, since its city has no search and no history horizon. Where the city's side is narrow, three things come later: on a phone, lines still leave the sheet straight up rather than through the gaps between rows; on a rich app a view can still go without a board beside a wide panel; and on a small phone, the home's city can sit a little off center.

Before you upgrade: Breaks: the page gutter variable is renamed --graview-page-gutter → --graview-gutter, with no alias; a view writes var(--graview-gutter, 20px). Binding a person is the host's alone: bindPerson takes the host's system seat as its author, and graview check refuses a grant that names bind-person (grant-gives-binding). The one face's panel opens wider on a desk. Gains, nothing taken away: the embed mount's sceneUnderPages and panel, PageContext.panel, data-graview-in-panel on a view's root in the panel, LOCAL_LAYERS.beneath, and /problems?kind=. Stored formats, ops, the wire, derived tool names and their input schemas are unchanged.

0.2.0

Published November 12, 2026

Pages and the Scene become one face, opt-in per app: a page rises on one camera from Page to Nearby to City, every view stands as a billboard in the city, and graview check finds two views that show the same thing.

  • One face, opt-in. A PagesApp given views and sceneUnderPages: true stands over the app's own city. A face without it is unchanged; one face by default comes in 0.2.1.
  • Three levels on one camera. Page is the page. Nearby is the same page as a panel beside its place in the city (a resizable sheet on a phone), with a line from each record it shows to that record's building and a Connected list. City is an isometric city with every page and view of the app standing as a billboard on its district; choosing anything there lands at Nearby. The same element moves between levels, never a cut to another screen.
  • One control at the bottom left. Page · Nearby · City and a legend of what the city's marks mean, which folds into a one-row slider. Keys 1, 2, 3 and [ ] move a level and can be turned off in the legend; Cmd or Ctrl with plus and minus stay the browser's zoom. No Scene/Pages switch and no Up; the bar stays at the top at every level.
  • History in the levels. While the history is played, buildings rise and sink as the scrub passes the changes that made and removed them.
  • Duplicate views are found. graview check names two views that show the same thing (view-duplicates-another) and carries the remove-lens edit that removes one: how pages and lenses become one view, applied per app.
  • Find. The down arrow goes onto the first result, and a result chosen after typing replaces the search page in the history, on every routed face.

Before you upgrade: Breaks: on every routed face, a Find result chosen after typing in the box now replaces the search page in the history, so Back returns to where Find was opened. While the history is played, the Scene's buildings rise and sink on every face. Everything else changes only where a host turns sceneUnderPages on: that face has no Scene/Pages switch, no "In the scene" link and no Up, the Scene's record drive-in is not drawn there, a person at the app's root is sent to it, and the keys 1, 2, 3, [ and ] move a level unless a person turns them off. Turning it off again puts the routed face back as it was. Gains, nothing taken away: PageContext.sceneUnderPages, SceneProps.camera and the SceneCamera type, LayoutOptions.standing and plaza, ONE_FACE_LAYERS, and the view-duplicates-another finding. Stored formats, ops, the wire, derived tool names and their input schemas are unchanged.

0.1.74

Published November 12, 2026

Any place drawn for an e-ink screen with what each press does; a bare app that looks designed, and a home proposed from the declaration; templates that ask a time and bring their views; a field that keeps a time of day; and a host asks whether a seat may run an act without running it.

  • An e-ink screen. @graview/pages/device draws any place for a reader on a wall (a Kindle Paperwhite 3 upright is 758 × 1024): sixteen grays, no motion, type at 20 px or more and presses at least 64 px, pages that turn at the foot. taps says what each region does, and resolveTap does it as the seat that tapped, refusing anything the screen it was tapped on did not offer.
  • An app says which places a device offers. devices: { screens: [{ place, label }] } names the strip along a device's foot; graview check holds each to a real place and 12 characters, and a screen follows its place when it is renamed.
  • A bare app looks designed. With nothing declared, a glance leads with the kind's date said as people say it, naming the zone only to a reader on another clock. The home says the app's description once. Every warning carries its mark and its words, never its color alone.
  • A home from the declaration. composeDesign proposes what a plain document lacks — a home of a count and a list per kind, and a row and a glance per kind with its date and status — and keeps what is declared. The new formatter {x | glance} says a moment as a glance does.
  • Templates ask a time and bring views. A question may be a time; setup words may say ${id}; a template may carry views and frameViews, which graview create --template writes beside the project. graview check template.json checks the template too.
  • A time of day. A field may be { "type": "time" }, kept as HH:MM, typed in a time input and read from "3 PM".
  • May this seat run this? mayRun and mayRunEach on @graview/core/seat answer allowed, what is left to fill, or refused with the rule and the words, writing nothing. Applying and asking now judge through one path.
  • Security and reliability fixes.

Before you upgrade: Breaks: an act may now refuse a call it used to take. A document act's argument left out is its default to what the act's condition reads and to a record the act makes, and no longer overwrites a field already set. A template may name the formatter glance, which a build before this one refuses by name, so update hosts before documents that use it. A bare app's glances, rows and home read differently (a kind's date leads a glance, the zone is named only to a reader elsewhere, a description is said once), and composeDesign proposes a home, rows and glances for a plain document where it proposed none. A document accent that shares the warning's hue and reads is no longer refused. Gains, nothing taken away: @graview/pages/device (renderScreen, tapAt, resolveTap, EINK_GRAYS, EINK_LEAST_TARGET), @graview/core/devices, a document's devices, the device-screen-* findings and the add-, move- and remove-device-screen edits; the time field type, timeField() and parseTimeOfDay; a template's time questions, ${id}, views and frameViews, questionAsked and templateFindings; mayRun, mayRunEach, store.wouldApply and store.judgedAs; homeFromDeclaration, rowFromDeclaration, glanceFromDeclaration, kindDateField, momentAtAGlance and homeSaysTheLine. Stored formats are otherwise unchanged: a record may hold a time field's HH:MM.

0.1.73

Published November 11, 2026

A visitor's view is no longer stopped by the host's link check; a view knows what its seat can't see, is checked as every seat, and fails a part at a time; a view loads its own face; a joining member becomes the person already entered; and a home view's pictures load lazily and small.

  • A visitor's view draws. A home view of many linked records that drew for its owner and stopped for every signed-out visitor now draws for both: what a seat is kept from is worked out once per seat, not once per link. A home view that does stop falls back to the app's built-in home and stays there.
  • A view knows what its seat can't see. A worker view is handed props.unseen — the kinds it reads that the seat sees none of, and the fields sight may keep from it — so it can say "Sign in to see the vendors". A view whose seat sees nothing it reads is not started; the host's sign-in is drawn in its place.
  • A view is checked as every seat. graview view check --seats runs a view as its owner, as each role and as a visitor, and says for each whether it drew, fell back or was stopped.
  • A part of a view fails alone. graview.part(name, draw) marks a part; one that throws or runs long is drawn as a small note, and the rest of the view still draws.
  • A view loads its own face. A worker view's stylesheet may declare an @font-face from a data: font, up to 50 KB a face and 200 KB a view, drawn in that view alone.
  • A joining member is the person already entered. bindPerson on @graview/core/binding binds the joining account to an existing record of the people kind, so $me, grants, acts and Activity are that record and no second person is made.
  • Pictures load lazily and at the size each use needs. An <img> in a view takes loading and fetchpriority, and pictures: { thumb } hands a smaller copy beside src. bleed: "full" is said in the skills and the manifest check.
  • A district's records with no value share one row, so adding one moves no other block.

Before you upgrade: Breaks: a view's stylesheet @font-face was refused and is now kept where its source is a data: font, and a face file is loaded only where its bytes are a font. A worker view whose home stops now falls back to the built-in home rather than a plain list. A host that pins the inlined guest client's hash takes the new GUEST_CLIENT_SHA256. A record of the people kind may carry $seat, which an export, a seed and a template drop; an act may not set a field whose name begins with $. A store with a people kind answers seenBy with a view of the graph as that seat in every case. Gains, nothing taken away: bind-person and @graview/core/binding, the person-seat-shared finding, props.unseen, partMs and partMark on a view's push, thumb on a GuestFile, pictures.thumb, graview.part, runWorkerViewForEachSeat and seatsOfPolicy, graview view check --seats, forgetSeatView, HomeFallsBack, the view-font-face*, view-pictures-thumb and view-bleed finding codes, and districtLanes on @graview/core/scene. Stored formats are otherwise unchanged.

0.1.72

Published November 11, 2026

An app's history opens from the app menu and from a host's own menu; a frame is lent the app's faces; a view chooses its pictures by record; and a frame that only grows with itself is held.

  • History is in the app menu. The chevron beside the app's name has a History row that opens the timeline at now on the scene and the routed face alike, and gives the keyboard to its scrubber. An app with no changes yet says "No changes yet". bar: { history: false } leaves it out.
  • A host opens it from its own menu. showHistory() on the handle mount returns opens that mount's timeline, and answers whether one will draw.
  • A frame is lent the app's faces. A guestView frame draws in the faces brand.views.fonts lends, handed over as data: fonts, held to the same 2 MB, and needs only font-src data:. A face file is read only where it answers as a font or as plain bytes.
  • A view chooses its pictures by record. A manifest's pictures takes records ({ subject: true } or { ids: [...] }) and most, so a view of one record is handed that record's pictures, not every one of its kind. checkManifest refuses a malformed choice (view-pictures-records, view-pictures-most).
  • A frame that grows only with itself is held. A guest sized by 100vh that asks for its frame's height each time the frame grows is held at the height it was given, and the host is told why through onProblem and onHeld.

Before you upgrade: Breaks: a host that serves a face file as anything but a font type, application/octet-stream or no type now has the face said and not loaded. A host that pins the inlined guest client's hash takes the new GUEST_CLIENT_SHA256. Under a host's bar with name: false the app menu offers no History. Gains, nothing taken away: showHistory() on EmbedHandle and PagesEmbedHandle, createHistoryDoor, HistoryDoorContext and HistoryDoor on @graview/react, EmbedBar.history, optional Playback.focusWanted and focused(), GuestFont and a fonts message on the frame's wire, and records and most on a view's pictures. Stored formats are unchanged.

0.1.71

Published November 9, 2026

A visitor is told plainly they are not signed in; an act clears a field with null and its condition says $subject and $arg; a view's faces come from origins of their own and a file the app holds is bounded; a record page with its own layout draws one divider; and acts are offered only where they apply.

  • A visitor is not signed in. When the host hands signIn, the account pane says "Not signed in" and offers sign-in first, the bar's button says so too, and no seat's id is shown.
  • An act clears a field. A literal null in a document act's set removes an optional field's value; on a required field graview check warns (act-clears-required).
  • An act's condition says which value it means. $subject.<field> is the record's own value and $arg.<name> the call's argument; inside where, every and the rest, a member's own field comes first. graview check warns where a bare name means both (act-name-means-both) and where $arg means nothing (act-arg-unknown, arg-outside-act).
  • A view's faces have origins of their own. A host lists them in fonts: { origins }; images.origins is for images only. A file the app holds may be at most 2 MB as a face, and when two faces share a name the one lent last draws.
  • A record page with its own layout draws one divider and no empty band before its facts, and a view that throws in its slot is caught there, in words, while the page stays.
  • A bleeding view on a phone keeps each safe area on its own side in a right-to-left page.
  • Acts are offered only where they apply. The several bar acts on the chosen records an act applies to and says how many; an act done as you is not offered to a seat that cannot see its own person; a link that is not there is refused in words.
  • A workflow's far step says the host's own refusal (otherApp may answer { refused }), and other ways to show a list at a filtered address offer only what that address would draw.
  • Security and reliability fixes.

Before you upgrade: Breaks: a host that lent faces from an origin listed in images.origins lists it in fonts.origins instead. Inside where, every and the rest, a bare name that is a member's field now reads the member ahead of an act argument of the same name. Code calling FarApps.otherApp gets FarReached and checks refused. Some refusal sentences changed wording and no longer carry ids. Store gains wouldDo and version; @graview/react's ViewBoundary gains optional reset, said and onCaught. Stored formats are unchanged.

0.1.70

Published November 8, 2026

A design reaches the router through @graview/pages on React Router 8; a worker view keeps values for whoever is looking, spans the whole window and draws in its app's faces; the inbox opens on what needs you; and an owner can try other ways to show a list.

  • The router comes from @graview/pages. Link, NavLink, useParams, useNavigate, useLocation, useSearchParams and MemoryRouter are exported from @graview/pages, and the routed face runs on React Router 8. A product that imports them from react-router-dom should import them from @graview/pages and drop that dependency; graview doctor says so where it finds one.
  • A view keeps values for whoever is looking. graview.mine holds small strings per viewer, and a seat may carry a profile, so several people at one screen each have their own $me.
  • A view spans the window. bleed: "full" draws a view edge to edge at every width.
  • Views as their authors expect. A view of one record reads its own kind across a relation, a press on a control already in its state passes the check, so does a dropdown a person picks from, cards keep whole in CSS columns, a brand lends its views web faces, the app's theme wins over a view's own rule, and a view that replaces a record's page may draw its own heading.
  • The inbox opens on what needs you. The bell counts only what asks something of this person; For you is Needs you and Updates; a person can stop a kind of suggestion.
  • Other ways to show this. An owner can flip a list or a place between a few ways to show it, drawn in its real records, and keep one; a list may open as a place (pages.lists.<kind>.opens).
  • The bar. A host takes back what it handed the bar at mount, and a person picks the scheme in the app menu by keyboard.
  • Security and reliability fixes.

Before you upgrade: Breaks: a product that imports from react-router-dom beside @graview/pages imports from @graview/pages instead (graview doctor finds it), and @graview/pages, @graview/embed and @graview/studio ask for React >=19.2.7. Every package needs Node >=22.22.0. The bell counts only what needs the person, and a host's notice is counted only with needs: true. An op's author may carry an optional profile. Stored formats are unchanged.

0.1.69

Published November 7, 2026

An undo keeps to what a seat may see, and a suggestion is decided by who may make its change.

  • An undo keeps to what a seat may see. An undo is served to a seat as what it takes back is served, on a socket's push as on a whole read, and a suggestion is served as the write it asks for would be.
  • A suggestion is decided by who may make its change. Its maker, the system, or a seat that may make every change it asks can take it back. A seat that may not still has its vote.

Before you upgrade: Nothing changes in stored formats, the declaration or tool schemas. An undo may arrive withheld where it did not, and undo of a suggestion is refused for a seat that may not make it.

0.1.68

Published November 6, 2026

Better UI holds a draft to what the page showed and no more, so a correct redesign of a flagged list or a book's home is kept; suggestions about one record stand under its name; and a focused record's kind tag is drawn whole on Chrome 157.

  • Better UI keeps a correct redesign. A row a rule flags ("⚠ The Velvet Notes") is read like the others. A record's details count anywhere in the block that holds it and no other record, so a tag one box over from its link is still its tag. A record drawn with no link is found by its heading. A count is held by its number, so "0 stories" may be said as "no stories". A card is not held to the status of a row nested inside it. A field named like an ordinary word (draft, story, type) is not taken for the computer's, nor is "true" when a record says it. The page the agent reads keeps each record's link with its name.
  • Suggestions about one record stand under it. Placing a note, linking it and setting it aside name the note once, a heading over a list, each row saying only what differs with its own Why?, Yes, No and Later.
  • The GPU path draws the kind tag whole. A focused record's kind tag, which stands across its panel's top edge, was cut at that edge on Chrome 157; the panel is now captured tall enough to hold it.

Before you upgrade: Changed: drawnFindings takes an optional values, and without it a lowercase field's name counts only before a raw value written as code ("done: true"), no longer before any number; several suggestions about one record are a suggestion-record-group with a suggestion-record-heading over an ol of suggestion rows, and suggestion-group holds only several alike about different records; on the GPU path a focused record's host carries data-graview-outset. Ops, stored formats, the wire, the declaration's check codes and derived tool names are unchanged.

0.1.67

Published November 5, 2026

Better UI keeps a correct draft the first time and makes a small change as a small edit; a tidying suggestion is one plain question; a workflow step can reach another app; the right-click menu opens at the pointer in Safari; and a district's name stands under its plot on Chrome 157.

  • Better UI, right the first time. Its checks read what the page draws: a record is named by its label or its link, not a card's words run together, so an unchanged draft passes; a heading a person asked to reword may change; and a built-in list page's records are read, so a draft that drops them fails. A small change is an edit the framework applies to the script (one changed declaration, not the whole page again), the agent sees the whole script, and a refused style is named by its rule. After two failures on the same thing it says so in a sentence and offers Keep anyway or Stop; a host can log each check (HostAi.onDraftChecked); Kept is said once.
  • A suggestion is one question. "Put “What I steer by” in 09 · Without a Map?" with Yes, No and Later, its records as links, why behind "Why?" in words, several alike under one line; a placement is no longer suggested on one shared word.
  • Workflows reach another app. A step's reads and acts may name another app's kind or act (@<address>/<name>), checked by shape and, with a host's resolver, by what that app has; the step runs only through the host's FarApps, a dry run lists the far writes, and each carries lineage the other app can show.
  • Hosts. The Answer slot says what the app lacks (couldNotFind, lacks); Share holds a second link; a status item on the app bar with its sentence on hover (status, setStatus); a kept 👎 note says where it went (keptSays).
  • Fixes. The right-click menu opens at the pointer in Safari, which drew it at the page's foot; a district's name and landmark stand under its plot on the GPU path (Chrome 157); a calendar entry wraps its name rather than cutting it.

Before you upgrade: New: @<address>/<name> in a workflow step's reads, acts and act, with the codes workflow-far-reference, workflow-far-app-unknown and workflow-far-args, resolveFarApp on compileDocument, editDocument and the workflow findings, FarApps on runWorkflow and seatWorkflows, WorkflowRun.far (optional), farAppsOver and farAppShapeOf; HostAi.onDraftChecked, applyEdits, DESIGN_AGENT_MOVES, ScriptEdit, the edit and stuck steps and the edit-missed finding kind; AnswerRequest.couldNotFind, AnswerReply.lacks and need; BarShare.secondLink; status, setStatus and BarStatus; ToldStore.keptSays; OUTSET_ATTRIBUTE and PlannedView.outset on the GPU path. Changed: a suggestion card's markup (suggestion-record in its sentence, new suggestion-why and suggestion-group, Yes, No and Later keeping the accept, decline and not-now test ids); a refused style's finding reads "is not allowed and is removed"; a calendar entry wraps; an older build refuses a far workflow reference as workflow-shape. Ops, stored formats in the graph, the wire and derived tool names are otherwise unchanged.

0.1.66

Published November 4, 2026

Right-click any page for Better UI, a design agent that keeps every control the page had and presses each one before you see it; a record's facts are drawn by their type; the app bar is calmer; a view reads today, jumps to its own sections and hears which is in sight; and the app's own actor never makes again what a person took back.

  • Make any page better. The right-click menu opens with its field first, "Tell Graview what you want…", over two buttons, Chat and Better UI, and the Fast slot lights the one your words belong to. Better UI, on any page the app draws by itself or from the Scene, is a conversation with a design agent in a side panel: it drafts, checks the draft, fixes what it found and shows each step. Every control the page offered is kept and bound to the same act, and each is pressed on a throwaway copy before the draft is shown, so a draft never shows a button that does nothing. What it says a control does comes from that press, not from the model. Keep, Discard and Undo; a kept page holds through a reload.
  • Every control of a view is pressed before it is kept. checkPresses presses each act, field, link and jump a view drew as the live host would take it, nothing applied, and a press that is refused says why beside it.
  • Facts by type. A record's facts are one sheet: a yes or no is a switch that runs its act, a choice of a few is a row of options, a relation is a row of chips with its own picker or ×, the heading renames in place, and What can be done holds only what no fact's control does.
  • A calmer app bar. The app and its pages on the left, with Scene, Pages, a host's rows and the scheme in a menu on the app's name; Find, one inbox (For you, Activity, Asks), a host's tools, the people, Share and you on the right.
  • Views. A view reads graview.today and says a day with graview.fromToday; a view that writes today into its source is said as a problem, and a change names the places that show it. <a href="#id"> jumps to a section of the view, the one in sight is marked and heard (sight), and a record's files link from a view.
  • Tidying. A person's undo of any change, or a link they broke, is a decline the app's own actor never makes again, kept through a checkpoint; each suggestion says its one reason, short.
  • Smaller. A quick ask that finds nothing says what the app does not keep; the opening screen can be photographed; a change names a field by its label; an edge refused says each kind's own targets; a visitor form takes assetsAt; a workflow run at a moment finishes at it.

Before you upgrade: Removed outright (pre-1.0): the bar's Scene | Pages switch (the embed's switch, BarSwitch), BarActivity, BarSuggested, SuggestedTray and the profile pane's scheme / onScheme; the app bar's suggested-button and activity-button, now inside the app menu and the inbox; MenuSection.takesWords, replaced by MenuSection.mode. New: appMenu, schemeChoice, share and notifications on the mounts and the Shell, Inbox, FACE_EVENT; @graview/guest/headless/presses (checkPresses), ./host/pressing and ./headless/pressed-here; KeptViews.fork, draftFork and forked, checkViewForkHost, onDraftChange; the design agent on @graview/tools/section (runDesignAgent and the rest), HostAi.design, HostAi.couldNotFind, ThinkingProvider.stream, AiBridgeAsk's tier: "design"; FactSheet and actsBeyondFacts; GuestProps.today, graview.today and graview.fromToday, the view event sight; datesPinned and placesTouched on @graview/core/revisions; declinesIn and Epoch.declines (optional within format 1); fieldInPassing, nameInPassing; splashPage and /graview/opening-screen in a preview; assetsAt on @graview/embed/form. Changed: a record page's facts and the app bar have new markup; a person's undo or removal of a link now declines it to an automated author; a view's clicks message carries acted, and a press the act's schema refuses answers failed; a declared act's record argument names only the kinds its subject reaches. Ops, stored formats in the graph and derived tool names are otherwise unchanged.

0.1.65

Published October 30, 2026

Type in the right-click menu and Graview works out what you mean, says what it will do and does it on Yes; what people tell it is kept, rated and suggested back; a section of a written view can be made better in place; a revision says what it broke; and on a phone the sheet leaves the city where it stood.

  • The menu takes words. Typing in a right-click menu filters every row as you type. Free words are read against what is under the cursor: Jev, in the Fast slot, works out what you mean (the record itself, the ones it holds, the done or the open ones, a person named or said as "me" or "her"), and the card says exactly what will happen before Yes, with one Undo. When the app has no way to do it yet, it says what it would add and asks first. A thinking model is asked only when Jev is unsure; the dev server lends one from Anthropic, xAI or OpenAI. Graview stands among who is here while it works, and the card opens where the menu stood and does not move. Option with a right-click keeps the browser's own menu; Inspect is gone.
  • What people tell Graview. Each telling is kept with what it did, rated with a thumb, listed in the Studio under "What Graview has been told", and the ones rated right are suggested back on similar records, worded only as the act.
  • Make a section better. Right-click inside a section of a worker view to make it better: Just do it, Describe changes…, or Highlight area…, each a draft you keep or discard.
  • Revisions. A view revised, a picture taken or an act run says what it broke (@graview/core/revisions).
  • The phone. A chosen district's sheet leaves the city where it stood and shows most of the screen with a handle; going into a district reads clean, "Everything" at the top rather than "The whole thing", its card as tall as what it holds.

Before you upgrade: New: @graview/core/told, @graview/core/revisions and @graview/tools/section entries; HostAi.light, HostAi.told, AiStage; planEdits, composeAppChange, checkPlanHost, checkToldHost and checkViewRevisionHost; KeptViews.revise and revised; PresenceChannel.alsoHere; ToldPanelDoor; toldDoor and devTold; the /graview/told route and told.json beside the store. Changed: ProposeChangeAnswer may be { applied: true, undo, note? }; ComposeChangeHost is { document, edits?, add?, drop? }; the dev server's model door takes tier: "fast" and answers from xAI and OpenAI as from Anthropic; the pages' menu no longer draws Inspect, and Option with a right-click reaches the page's own listeners. Ops, stored formats in the graph, the declaration, check codes and derived tool names are unchanged.

0.1.64

Published October 29, 2026

A workflow run says what it spent and what started it; a count of one relation is read whatever its size; an app's images load under its base and offer home-screen icons; a dark app opens through a dark screen; connection reports name their source; and the Scene holds steady under a finger and a mouse.

  • Workflow runs. A run says what its model steps spent, each step and in all, and which workflow started it: a chain of runs stops past three and holds what it would do. runCount counts a run's records. A classify step can label what no option clears (otherwise) and apply a label only above a confidence (applyAt).
  • Counts and sight. A count or an exists over one relation is read from the edge index in one step, so a rule, a computed field or a template that read one and was refused for its budget now draws. A sender sees their own ticket without the fields a sight hides from them. A check: code is always the checker's.
  • Brand and the head. An app's own images and logo load under its base (assetsAt), the head offers home-screen icons and a manifest (@graview/core/head, answered by graview serve and graview preview), and the theme color follows the app. A splash may declare its scheme, so a dark app opens through a dark screen on a light device.
  • Connections. A report says which source each sentence came from (saidBy), runConnections hands back each pass and the first one, and a calendar's guests field form takes max.
  • The Scene. Two fingers pinch-zoom under them on a phone and the wheel zooms under the cursor without laying the city out each frame; a tap or a quick second tap lands on what it was aimed at; a list in a card scrolls without moving the city or the page behind; turning a phone or folding its toolbar moves nothing; the edge signs step past a card's showings.

Before you upgrade: New: WorkflowRun.spent and chain, StepContext.spent, a runner's chainLimit, runCount on @graview/core/scene, triggeredBy().by and workflowOrigin; a classify step's otherwise and applyAt; @graview/core/head (homeScreenOf, themeColorsOf, headHtml, MANIFEST_PATH), assetSrc and HOST_ASSETS, an assetsAt prop on the provider, the frame, the Shell, the routed face and the embed, useThemeColor; brand.splash.scheme and the warning brand-splash-scheme; SyncReport.saidBy, onReport and firstPass; a calendar's fields.guests as { field, notify?, max? }. Changed: a count or exists over one relation is no longer refused for its budget; graview serve and graview preview answer /manifest.webmanifest and /icon.svg. Ops, stored formats in the graph, the wire and derived tool names are unchanged.

0.1.63

Published October 29, 2026

An app declares workflows that fill next week, keep records in step, archive what is done and label what arrives; people propose changes for review; Notion makes the properties it needs; a connection says whom it invited; and the right-click menu says what is under the cursor.

  • Workflows. A document's workflows run on a schedule (words or cron, in the app's zone), when a record is made or changed, after a connection's pass, or by hand. Steps run an act over a query, make dated records from a pattern (generate), archive what is done after N days (archive), label each record with a model and a floor of plain rules (classify), or ask an agent within a budget. A run never makes a record twice, its first run after a change is a dry run, a paused workflow holds, and what it asks waits as one suggestion a person accepts whole or one change at a time. Workflows stand on the Scene's map; graview workflow lists and runs them; an owner's seat runs, pauses and resumes them.
  • Records in step. A kind may say it derives from another: a plan item's rename renames its event in the same change and the next sync sends it; a computed field may be sent out through a connection.
  • Proposals and votes. A grant may say propose: such a seat's form reads Propose, and a reviewer accepts or declines what it proposed. A shared or signed-out seat is refused a vote unless the host keeps visitors' votes advisory, apart from the tally that accepts.
  • Connections. A Notion connection keeps several data sources of one database, one kind each, and makes the properties it needs. A calendar pass says in history whom it invited or took off, caps an event's guests, and lets a host read them back.
  • Pages. The right-click menu offers Copy link and Inspect, leaves selected text to copy, and offers Add and Show only on a column; a blank field an act writes is an empty slot to fill, and a reader sees values plainly; an iPad's bar fits and its Scene glides once per tap; money never reads .00; a timeline that cannot draw is refused with its bindings named.

Before you upgrade: New: the document's workflows with its step kinds and workflow-* codes, @graview/core/workflows and @graview/tools/workflows, the edits add-workflow, set-workflow, remove-workflow, pause-workflow, resume-workflow, set-derives, set-app-tidying; a kind's derives with derives-* codes and the stored-data code derived-out-of-step; a grant's propose, the built-in act propose-changes and the tool propose_changes; run_workflow, pause_workflow and resume_workflow where a host wires them; a Notion connection's sources and create, and connection-sources; a calendar's guests.max and connection-guests-max; the optional op fields sentOut and suggestsSaid and the lineage keys items and proposedBy; Principal.shared and visitorKey, and votes: { advisory }; a money field's places; splashHtml's per-page words and the caustics shader. Changed: a vote from a shared or visitor seat is refused; a provider given no principal in an app with a policy offers no in-place editors; runWorkerViewHeadless reads a place's missing kind from the app or throws; add-lens refuses a timeline that cannot draw; a kind may work out 60 computed fields. The wire is otherwise unchanged.

0.1.62

Published October 28, 2026

Calendar events invite the people they are about, a view links to the Scene, formulas build words and times, an act carries a change across a link, a rule covers every record, and the seat proposes a change to the app.

  • Calendar guests. A Google connection's guests maps the people an event is about to its attendees both ways: a field of addresses, or { via: "who" } through a relation to people with Invite me on. Quiet by default (notify sends invitations); an unknown attendee is kept, never dropped.
  • Views. A view links to the Scene and the home (data-place="overview", graview.navigate), read from one vocabulary the live host and the headless check share; a worker view's draw budget fits the device it runs on; brand.views gives every view one stylesheet and a fade between records; <graview-video autoplay cover> is a muted, looping hero background.
  • Rules and acts. concat, format, datetime, addMinutes, weekday and startOfWeek build words and moments in the app's locale and zone; setsLinked carries a change to the records an act's subject is linked to, in one undo; a rule's covers judges that each record reaches every one of another kind without a cost warning; a date that knows only its year or month is compared by its span and drawn across its month.
  • Pages and notices. A notice carries its tone as a chip, not a side accent, and the framework's own error toasts offer a host's Report this (onReport); a home's Recently leaves out what the reader cannot see; brand.splash puts the app's opening screen in its declaration, drawn by @graview/pages/splash and graview preview.
  • The seat and tidying. For an owner or editor with a host to apply it, the seat proposes a change to the app from words, as a card of what it adds, keeps and drops; a suggestion pressed by someone who may not make it records their vote, and whoever may decide sees the tally.

Before you upgrade: New: a Google connection's fields.guests and the codes connection-guests-field and connection-guests-via; every Google write now says sendUpdates (none unless notify); placeNamesOf and placeNamesFrom on @graview/core/navigate; the rule functions concat, format, datetime, at, addMinutes, weekday, startOfWeek and the codes expr-type, format-pattern; an act's setsLinked with act-sets-linked-relation and act-sets-linked-field; a rule's covers (making require optional) with rule-covers-relation; brand.splash and brand.views with brand-splash-* and brand-views-css; @graview/core/css, @graview/core/traits, @graview/pages/splash, @graview/tools/reshape; onReport and onProposeChange beside barActions; the op vote-suggestion, tidying.autoAcceptAt and the warning tidying-votes-unreachable. Changed: PageContext.overview takes an optional stop; a partial date compares by the span it covers; a worker view's push and draw budgets scale with how slowly its worker started, up to four times. Stored formats and the wire are otherwise unchanged; capabilities().shipped names the three ids these changesets announce.

0.1.61

Published October 27, 2026

A host's buttons stand on the app bar, a choice takes several of its options, a weekly record is one recurring event, a connection refused says its ways out, and a compaction can be asked to stay readable by an older build.

  • A compaction asked for format 1. 0.1.60's pins: [store.publishedSeq] held a store at snapshot format 1 only when the horizon landed on that one publish; compact({ format: 1 }) now holds it there through every publish while a rollback is possible, and formatStamp stamps 2 for any checkpoint carrying a publish.
  • A host's buttons on the app bar. barActions on mount, the frame, the pages embed and the Shell, drawn on the bar or folded into one control on a phone; setBarActions changes them live.
  • A choice takes several of its options. { "type": "enum", "multiple": true }: boxes in forms, labels on cards and sheets, a filter in lists, Notion's multi-select, an array in every schema, set-multiple in the studio.
  • Connections. A calendar connection refused says why in a person's words and carries fixes with edits a host can apply (set-connection); a kind with days and times of day is one recurring Google event, and a repeating date maps to its RRULE.
  • The Scene and the panels. The ground answers a right-click and a resting finger with Graview's menu; a cut card says More at its foot; Activity never scrolls sideways; a suggestion's record chips open their record; a link is offered on evidence, not one common word; a PDF that cannot be shown is one line.
  • Agents and the starter. graview check warns when a face reads content beside the graph; traitsOf, startingDocument, nounWords and pluralWords on /compose, and @graview/tools/starter asks the starter's questions with the host's model.

Before you upgrade: New: CompactOptions.format; barActions and setBarActions; multiple on an enum field (refused on any other type as shape), retype-field takes it, set-multiple; a finding's details and fixes, the edit set-connection; a calendar connection's fields.days and createInbound's then; the warning face-reads-content-beside-the-graph; traitsOf, hasTrait, TRAITS, startingDocument, nounWords, pluralWords on @graview/core/compose; @graview/tools/starter. Changed: formatStamp stamps snapshot: 2 for a checkpoint carrying any published (0.1.60 stamped 1 for one a later publish took readers back to), so such a store is stamped 2 at its next open; remove-kind takes a kind's hue, the sights through its relations and the people kind's $me acts with it. Ops, stored formats and the wire are otherwise unchanged; capabilities().shipped names the eleven ids these changesets announce.

0.1.60

Published October 27, 2026

A loopback serve and preview believe a seat only with the run's key; typing and Edit ride an act only where it would run; compaction moves past old publishes, and an older build refuses what it would misread.

  • A run's key on loopback. graview serve, graview preview and graview shots mint a key each run and say it only in the addresses they print; without it every route but health answers 401, the live wire too. Open the printed address once and the page holds a cookie; openRemote, graview mcp --remote-url and graview apply --remote-url take the printed address whole. GRAVIEW_SERVE_KEY sets the key for a harness.
  • Typing and Edit ride an act only where it would run. A keystroke into a field a TypeScript act writes is accepted only where that act would run on the record, and no Edit is offered where it would not; graview check warns typing-act-without-allowed-on where it cannot ask faithfully.
  • One rule for ids and sight. A day of a repeating series split or detached mints its id by the same kept-field rule as every act and import, and a sight names a field as the kind spells it (startsAt).
  • Compaction moves past old publishes. A checkpoint keeps what readers were served at each publish they may be served again, so an app that publishes rarely compacts as often as any; a store compacted past its standing publish is snapshot format 2, which 0.1.59 refuses rather than misread.
  • A host reads that 0.1.59 shipped the import and tidying fixes Graview Cloud's audit asked for, in capabilities().shipped.

Before you upgrade: Changed: a loopback graview serve or graview preview answers 401 to a request without the run's key (a host's own seatOf is unchanged; serveStore({ key }) and servePreview({ key }) turn it on for any host); a keystroke or Edit through a TypeScript act that refuses the record is refused or not offered; a sight's fields and hide take field names as the kind spells them and refuse names no field has; a store compacted past its standing publish is stamped snapshot: 2, which an older build refuses (pins: [store.publishedSeq] keeps it readable by one). New: wouldRun, quotesKeptField, SERVE_KEY, servedAddress, formatStamp(checkpoint?), the warning typing-act-without-allowed-on. Ops and the wire are unchanged.

0.1.59

Published October 27, 2026

A security release: a served store and a dev server answer only their own page, the store judges every undo, merge and keystroke as the act it is, and nothing a seat may not see reaches it sideways.

  • A served store on loopback believes only its own page. graview serve keeps to its own origin and host, answers no wildcard CORS while it trusts seat headers (--allow-origin names an origin that may), reads x-graview-kind: system as a person unless --trust-seat-headers is given, holds a body to 16 MiB before routing, and caps a live socket's fragments.
  • A dev server's doors ask for a key. The studio, local, model, decision, files and views doors answer only a page opened from the address the dev server prints, which trades a key kept in ~/.graview/door-key for a cookie only its own pages send; a page opened at the plain address is told its doors are closed. The local claude bridge reads only its own folder.
  • The store judges what a change is. An undo of an undo is judged as the act it puts back, and a change no act made is taken back only by its maker, the system or a seat granted every act; what a page offers to take back is what the store would take back. A merge and a kept link ride the making of a kind only over what the seat made; a keystroke rides an act only while that act could run; a split takes only what the kind's edit takes.
  • Nothing hidden leaks sideways. A record withheld whole refuses like an absent one, ids are never minted from a kept field or reused from the log, the app's own actor's suggestions say nothing a seat's sight keeps and a planted duplicate steers no merge, and a seat acting for a person reads another app as that person.
  • Data never becomes code. A template's title and the studio's write-back are written as text, a kind's figure is judged where it is drawn, and a typeface or scoped theme stays in its box.

Before you upgrade: Changed: a dev server's doors refuse a page not opened from the printed address (GRAVIEW_DOOR_KEY sets the key, GRAVIEW_DOOR_HOSTS names a network host); graview serve on loopback no longer answers * CORS and reads no system seat from headers without --trust-seat-headers; serveStore takes maxBodyBytes, ownOrigin, allowOrigins and trustSystemSeat; an undo, a merge, a typed edit and a split may now be refused where they were let through; Store.mayUndo is new. Ops, stored formats, the wire, the declaration and derived tool names are unchanged.

0.1.58

Published October 26, 2026

A Notion database is a connection, kept in step both ways, its tables' relations as links; Find's results stay still under the pointer and offer a record's acts when asked.

  • Notion, both ways. connections.<name> with "system": "notion" keeps one Notion data source in step with one kind, through an internal integration's secret that is never written in the document, the log or an export. It speaks Notion's 2025-09-03 API: a database of several data sources names one with source. Title, text, number, select and status, multi-select, date, checkbox, URL, email and phone go both ways; people are read; formulas, rollups and files are left alone and said once.
  • Relations as links. A relation property maps to an edge of the kind, to a kind another Notion connection keeps; a link made on either side arrives on the other, a page not read yet is linked once its table is, and both sides of a two-way relation settle with nothing sent.
  • Pages land through the acts that fit. A page from Notion becomes a record through an act that makes one from its mapped fields alone, a mapped field is kept in the kind's derived edit even when another act writes it, and a page that cannot become a record is said once until it changes.
  • Find stays still. Passing over a result only lights it; on a desk a panel beside the list shows the lit record and its acts, and on a phone a record's ⋯ opens them. Matched words are marked, each kind shows its best few with a row to all of them, and the keys are said under the list.
  • A new project's test imports what it calls.

Before you upgrade: Additive: "system": "notion" connections, with source and edges mapped in properties, and the checker's connection-properties, connection-relation, connection-relation-target, connection-connect, connection-disconnect, connection-read-only and connection-secret; a SyncState may carry unresolved and skipped, which an earlier build drops; SyncReport.problem. Changed: a kind a connection keeps has an edit-<kind> that takes every mapped field; connection-creates is also said when no act makes the kind from its mapped fields alone; creatingAct takes the mapped fields; ConnectionRun.calendarId is optional beside databaseId. Ops, the wire and the rest of the derived tools are unchanged.

0.1.57

Published October 25, 2026

A view can be renamed, and a view of many can be its kind's list page; a computed value is said as its format and rounded; a date emptied in place is cleared; a text block says how many lines it shows; worker views name their sections, choose their pictures and style a disclosure's marker.

  • Renaming a view. The edit rename-view moves every view:<name> the document holds (the order, the place the app opens on, the bar) and says so; a taken name or one that is no view's name is refused.
  • A view of many as the list page. A worker view whose manifest says replaces: "page" on cardinality: "many" is drawn on its kind's list page in place of the list, as a view of one already replaces a record's page.
  • Computed values read well. A computed field takes format (money, percent, duration), unit and hidden; set-format names a computed field; the rule language has round(x, places). A hidden computed value still sorts a list and feeds a view.
  • Clearing in place. Emptying a date, a text, a number or an amount where it is shown clears it, one change that can be undone; a field a record cannot be without keeps its value and says so beside it.
  • Text that shows more. A text block may say lines (1 to 12, or 0 for all of it) on a card or a row.
  • Worker views. A section may be named by its own heading with aria-labelledby; a manifest's pictures may choose kinds or fields (["circuit"], { "circuit": "photo" }) so the 12 MB go to what the view draws; ::-webkit-details-marker is kept beside summary::marker; a home view that bleeds starts right under the bar on a phone. The worker view skill says to draw a choice by its label from props.choices.

Before you upgrade: Additive: the rename-view edit; replaces: "page" on a view of many; a computed field's format, unit and hidden, set-computed's hidden, set-format on a computed field and round; a text block's lines and the finding view-lines; a manifest's pictures as a list or by field; aria-labelledby and aria-describedby naming the view's own elements; ::-webkit-details-marker; EditableField's clearable, each announced in capabilities().shipped. A build that predates them refuses the new keys. Changed: an emptied field in place sends null rather than nothing, and an emptied number is no longer read as zero; aria-labelledby naming an id the view does not draw is held back. Ops, stored formats and derived tools are unchanged.

0.1.56

Published October 25, 2026

An id names its kind; a date may know only its year or month, and an option has a readable label; a brand's suggested shade passes; a view is handed its computed values; the tray, the home's problems and Activity read better.

  • An id says its kind. An add act's requested id must begin with its kind (actor:apt1); apt1 is refused, the refusal names the prefixed form, and nothing in that batch lands. Ids already stored are untouched.
  • Every relation can be linked. A declared act that makes a record and links it no longer hides the derived connect-* act; only one that makes nothing and stands on one end replaces the pair.
  • Partial dates, and clearing. A date holds 2006 or 2016-05 as well as a day, drawn "2006" or "May 2016" and sorted a year before its months. null clears an optional field on a derived edit, and importRows(…, { blanksClear: true }) clears what a blank cell leaves empty.
  • Option labels. Enum fields take optionLabels and set-options takes labels; pages, pickers, change sentences, group headings, the CSV and a worker view's props.choices say them. An option with no label is said from its id: state-sponsored reads "State sponsored".
  • A brand's suggestion passes. A ground is judged on every pair the compiled palette holds, so the shade a refusal names is kept when sent back; an accent is judged on the ground it is drawn on, so a black brand keeps its gold. A light-scheme ground that is dark is drawn as a dark page.
  • Views get computed values. Every record a worker view is handed carries its computed values, worked out over the viewer's sight, from a lazily loaded evaluator. unreadEdgesSentence on @graview/guest/host/views names only a relation the view's code uses.
  • Who is here, exported. whoFor(store, principal, who) on @graview/ship/runtime is what the wire, /graview/who and /graview/here call.
  • The actor takes back its own. withdrawSuggestion on @graview/core/tidying is the maker's undo, not a decline; dream() withdraws its waiting suggestions that fall below the bands it is given.
  • Reading better. The Suggested tray wraps instead of scrolling sideways; a home says only the problems of the records it draws, on those records; Activity's row for a batch names each merge, removal and archive.

Before you upgrade: Breaking: an add act's requested id without its kind: prefix is refused (callers, templates and agents send <kind>: ids). Changed: enum options are drawn by their labels, said from the id when none is given; a dark light-scheme ground draws a dark page; a home's problem banner covers only the records it draws. Additive: partial dates, null clearing an optional field, importRows' blanksClear, optionLabels and set-options' labels, props.choices and computed values in worker views, whoFor, unreadEdges and unreadEdgesSentence, withdrawSuggestion. Ops and the rest of the wire are unchanged.

0.1.55

Published October 25, 2026

An app says who it is for and what they come to do; graview check judges the look and one call composes it; the home opens on those questions; an app learns from what people could not do.

  • Who it is for, and what they come to do. A document or defineApp takes purpose: for, a sentence about its people, and up to twelve jobs, each a question in their words answered by the records of one kind a rule holds for, in an order, with the act they usually take next. graview check holds each to the declaration (job-*), four edits change them, and @graview/core/jobs answers one as the viewer may see it. The seat, the MCP and describeApp say the purpose.
  • A judgment of the look. graview check says design-* warnings: a place that repeats another, too many places, a home with no focus, a card that repeats its title, a raw value, a main kind with no card, a job nothing answers. Each finding carries the edits that fix it, removals included.
  • One design, composed. @graview/core/compose infers jobs an app never said (inferJobs), and composeDesign returns the whole change: the jobs, the critic's edits applied until nothing is left to say, an accent where the brand has none. With no declared home, the derived home opens on the jobs: the question as its title, how many, the first records and their act.
  • What people could not do. A search that found nothing, a question nobody answered, an act refused and an agent's invalid call are kept in the graph's own words, never a visitor's, counted across people (@graview/core/friction, /graview/friction; graview serve --no-friction turns it off).
  • Learning from use. @graview/core/learn turns that log, the op log and the records into suggestions for the declaration (another name for a word several people searched with and found nothing, a choice or a date field for text written that way, one act for two people take in a row), each shown by at least three people, accepted or declined like the app's own actor's; graview learn and the list_app_suggestions tool offer them. Kinds and fields gain aliases.

Before you upgrade: Additive: purpose and its edits (set-purpose, add-job, edit-job, remove-job), aliases (add-alias, set-aliases), a Finding's optional edits, design-* warnings (CheckOptions.design: false leaves them out), @graview/core/jobs, /compose, /friction and /learn, recordFriction and attachFriction, aiContextOf's purpose and friction, and the /graview/friction route. Changed: the derived home of an app with jobs leads with them; graview serve writes friction.json and learned.json beside the store, outside the op log and every export. Ops and the rest of the wire are unchanged.

0.1.54

Published October 24, 2026

An app stands on a ground of its own; an app that publishes tells its readers only what is published; history can stop at a plan's window; a view of many pictures draws; collaborators see records in one order.

  • An app's own ground. brand.ground (and ground on set-brand) gives an app its own page background, one color or a light and a dark one; cards, edges and the bar are drawn from it, a light ground alone gets a dark one of the same hue, and a ground that leaves ink, muted ink or the accent unreadable is refused with a shade that passes.
  • Publishing, honestly. In an app that publishes when ready, a reader is told of a change when it is published, not when it is made, and is told where a collaborator stands only on what it is served. Text typed together survives a bundler that tree-shakes, and a poll of who is here reads its own op format.
  • History past a plan's window. A host says where its history stops and the timeline says so quietly, stepping by snapshots before it; an archive may begin at an epoch (archiveFrom), so a host can let go of what lies behind it and keep playback, export and restore inside it.
  • Views and typing. A view with many pictures is pushed at most once every 100 ms and is never stopped as a flood; a field typed together stays open, its caret where it was, while a tour or dialog holds the keyboard.
  • One order for everybody. A live client lists records in the server's order after a call the server refused, as every other client does.
  • The tray. What was done while a person was away leaves out what they said not now to, and may be handed over after the first draw (setWhileAway).

Before you upgrade: Additive: brand.ground and set-brand's ground (with a brand-ground check warning), HistoryHost.kept, ArchivedOps.keptFrom, archiveFrom, keptOf, AppBundle.checkpoint, whileAway's dismissed option, setWhileAway on an embed's handle, readsPublished, and PICTURES_SETTLE_MS. Changed: askArchived may answer behindKept; a reader of an app that publishes is matched for notifications at the publish; a poll of /graview/here that names no op format is answered in format 1; a view handed pictures may get one up to 100 ms later. Ops, stored formats and the wire are otherwise unchanged.

0.1.53

Published October 24, 2026

The scene keeps up on a large app and its grid moves with the picture; views fit a phone and draw more; a store never reuses an id; a visitor's form loads light.

  • The scene on a large app. A drag sets no React state, letting go costs about a third of what it did, and nothing animates to where it already is. Returning to the overview no longer stalls: its ribbons are routed once, remembered, and routed between frames when new. Every grid under the picture moves with it while it is dragged and does not jump when it is let go. A line lands on the card it joins even when the card's words settle a frame late.
  • Views on phones. A view's wide content scrolls inside it instead of widening the page; bleed works on a view's place; a fallback page keeps its gutters; a view that draws its own heading says heading: "own" and is titled once; Seen in names each place once.
  • What a view may draw. A named region, links inside a view's SVG, a card with its link on its heading, mask-image, -webkit-text-stroke, scroll-driven animation and SVG filters. @property, SMIL and feImage are refused, and the check says why.
  • For hosts. A store never names a new change with an id its log already holds; a deleted view never draws, a home's included; an import links a cell to any row of the same sheet, in one batch; a visitor's form loads from @graview/primitives/form, about 40% lighter. A view that fell back says which and why (data-worker-view-fell-back).

Before you upgrade: Additive: heading: "own" in a view's manifest, @graview/primitives/form, HomeRegistration and a registry's homes(), data-worker-view-fallback / -fell-back / -failed marks, and the CSS and SVG a view may now draw. A view's role="region" without a name, and @property, SMIL and feImage, are refused where they were dropped. The ground's grids are elements of their own (.graview-lattice, .graview-measure) where they were the ground's background. Ops, stored formats and the wire are unchanged.

0.1.52

Published October 24, 2026

A list exports as a CSV, just as it is shown, and a view hidden from the place menu leaves the bar.

  • Export CSV. A kind's list on the Pages face, and the lenses that list records, offer Export CSV. The file holds the records the place shows, in its order, filter, search and groups (a Group column first, and a shut group's rows too), the label and then the fields the list reads, said as the page says them. It never holds a field the seat may not see. Cells are quoted for any spreadsheet, with a byte-order mark for Excel, and a cell that would start a formula is escaped. The writing and the download load only when somebody presses it; a host that saves files itself passes onExport.
  • A switch per view. export: false on a lens or under pages.lists.<kind> turns it off; an owner turns it off or on from the place menu, for everyone, as hiding a view is (set-lens-export). graview check says a value that is not a boolean, and an export on a lens that lists nothing.
  • A hidden view leaves the bar. Hiding the view that is open put it under Hidden but left it on the bar and the scene's tabs; now every place a person navigates from skips a hidden view (offeredPlaces), the page stays where it is, and Show brings it back at once.

Before you upgrade: Additive: export on a lens and a kind's list (a build before this one refuses the key in a document), the set-lens-export edit, onExport on PagesApp and mount, @graview/core/csv and @graview/core/shown (shownList), and offeredPlaces. A hidden place is no longer offered by the bar while it is open, where it was. Ops, stored formats and the wire are unchanged.

0.1.51

Published October 23, 2026

Several people type into one long text field at once and keep every word: over the wire, in the editor, in words, whatever the network does.

  • Over the wire. remote.typing(node, field) sends a field's typing a run at a time as type-text, and the server carries each run over everyone else's, so two pages typing into one field both keep their words, over the socket or the poll. A reader that never said it reads op format 3 is sent the whole text instead of a splice. @graview/core/typing loads the first time somebody types.
  • In the editor. Prose the declaration types together opens with no draft and no Save: each keystroke is the field's at once, somebody else's typing lands as it arrives with the selection carried over it, and Ctrl or ⌘ Z takes back only this person's own last run. Presence carries a caret.
  • In words. A run of typing is said as what it wrote, where and how much ("Ada wrote in Kitchen's notes (+42 −3)"): one tick in the timeline, one row in Activity with one undo, one notification when the typist stops, and historyInWords for an agent's history.
  • Whatever the network does. A seeded fuzz of three pages typing, with frames held, duplicated and lost and runs taken back at random, found five ways an undo of typing went wrong; all are fixed.

Before you upgrade: transformSplices, composeSplices, diffSplice and isCollaborativeField move from @graview/core to @graview/core/typing. A type-text behind the horizon is answered conflict where it was refused invalid; a whole write over a field typed together may now be refused as stale by a server before 0.1.50. LiveProtocol gains floor(peers), so a host's own implementation has one more method to write. A notification's field typed into carries typed ({ inserted, removed, spans }) instead of before and after. Additive: presence caret, the provider's typing, EmbedRemote.typing, historyInWords and the typing words, holdTypingRuns and typingQuietMs, StoreHandler.pins() and compact. Ops, stored formats and WIRE_PROTOCOL are unchanged.

0.1.50

Published October 23, 2026

The 1.0 foundations: formats that fail closed, links with ids of their own, opaque cursors, a publishing lifecycle, and the first two phases of text typed together.

  • Formats fail closed. A primitive, a typed value or a store format a build does not know is refused with NewerFormatError rather than skipped; an author kind it does not know reads as the system's; a refusal code a client does not know is final. Two writers on one log fail loudly with LogHeadMovedError instead of writing a second op 1.
  • Links, ids and cursors. A link may carry an id and data of its own; an act honors a caller's id when it is free and refuses one that is taken; a page's own ids travel as a hint, so two people adding the same name both land. Positions on the wire are opaque cursors.
  • Publishing. Under publishing: { mode: "on-publish" }, collaborators edit live and everyone else reads the app as of the last publish; ?as=published shows what readers see, and unpublished(store) says what is waiting.
  • Text typed together. A text field takes a splice-text, transformed so concurrent typing converges; the type-text act in @graview/core/typing merges keystrokes, an agent's whole rewrite and undo out of order.
  • Not now. The Suggested tray hides a suggestion from one person until tomorrow, and a night's tidying is one row in Activity.

Before you upgrade: Stored formats: op format 3 — a store this build writes is refused by an earlier one with NewerFormatError, so roll back by refolding from the log. The wire: positions are cursor strings on welcome, ack, ops, /graview/state, /graview/since and /graview/here; a server reads a page's old number for one minor. A caller's id with a space, over 200 characters, or naming a record the act did not make is refused. A visitor form's ops say author kind visitor. appendOps takes { head }, and an adapter that ignores it works as before. Additive: edge id/data, mintedHint, publishing, publish, servedThrough, Store.servedSeq, CompactOptions.pins, unauthenticated and quota, collaborative on a document field, Dismissal, withNotNow.

0.1.49

Published October 23, 2026

An app tidies itself overnight, judged by a model where one is lent; suggestions and lineage take their 1.0 shapes; every form asks in one order.

  • Dreaming. @graview/tools/tidy gives an app its own actor: dream() finds candidates in code and, where the host lends a System One model such as Jev, asks it whether two records are the same thing, which record a field means, whether a record is finished, and which choice fits an empty field. What it is sure of may apply where the host allows; the rest waits as suggestions; without a model, rules do the judging. whileAway() says what happened since a person last looked; suggest_changes lets a remote actor suggest; graview dream runs it from the command line.
  • Suggestions and lineage, as 1.0 keeps them. A suggestion may expire; "not now" is one person's and leaves it waiting for everyone else; a decline answers by meaning, so the same change asked another way stays declined. Lineage names the run, the judge and the evidence, and keeps keys a later build adds.
  • The model door takes an object. Completion takes { prompt, system, images, signal } and answers { text, usage }; the Fast slot's types live in their own module; the seat's offers are Offer.
  • Every form asks in one order, whatever declared it: the label's fields, then what is required, then the rest. A declaration may name an act in another spelling.
  • Smaller things. Enter in Find leaves the box in the same press; a wider focus ring stays whole at a view's edge; graview view check --audit --browser runs every accessibility rule in Chromium; the host learns what a view hears a click on.

Before you upgrade: Completion changes shape (an object in, { text, usage } out) and Suggestion/suggestionsFor in @graview/tools/suggest are renamed Offer/offersFor. Additive: @graview/tools/tidy, the suggest_changes tool for automated seats, a suggestion's expiresAt, lineage's run, actor and evidence (and unknown keys kept), declines matched by meaning, Dismissal. A document's act arguments and every generated form ask in a new order. Ops, stored formats and the wire are otherwise unchanged.

0.1.48

Published October 23, 2026

Forms ask the name first, acts answer to the way they're spelled, refusals name the act that would, and a place says its forms.

  • A creating form asks the name first. Then the required fields, then the rest, in the page's order, whatever order the document keeps its fields in. A key's abbreviation is said as its letters: cvss is "CVSS", sourceUrl "Source URL".
  • An act answers to its other spellings. connect-threat-partOf runs connect-threat-part-of; a name no act has is answered with the nearest one. A relation from a kind to itself is titled from its description: "Set the family it belongs to".
  • Refusals name the act that would. An edit refused a field another act writes says which act: "whatToDo is set by set-verdict". A number given as its digits ("8.6") is read as the number.
  • Capitals where they belong. A headline that opens on a count in words starts with a capital; an acronym ("CVEs") is never lowered.
  • A declared row names its record when its blocks don't, so the picture and its words agree.
  • describe_place says a place's forms: each creating act's fields in order, required, with their choices; and a visitor form at forms/<name>.
  • A hidden lens is hidden where a record is seen, and a title another lens holds is refused by naming that lens. A draft view takes no title a titled view already has.

Before you upgrade: Additive in the API: actSpelledAs, nearestAct, numbersSpelled, capitalize and lowerFirst on @graview/core/words, blocksName on /blocks, DescribedForm on /describe, views on DraftOptions and DraftTools. A document's creating acts take their arguments in a new order (name, then required, then the rest), so a generated form and an agent tool's schema list them so; a field's label for a known abbreviation changes ("Id" is "ID"); a number argument given as an exact numeric string is accepted where it was refused. Ops, stored formats and the wire are unchanged.

0.1.47

Published October 22, 2026

Custom views work by keyboard with real links and buttons, are as tall as they draw, and can be audited for accessibility; a place is said drawn once its lens has drawn.

  • Views work by keyboard by default. A control a view draws is reached by Tab and pressed by Enter and Space without scrolling the page; whatever has the keyboard shows a ring a view can restyle but not remove; .graview-sr is words for a screen reader alone; an unlabeled <svg> is hidden from one; focus stays on a keyed element across a render.
  • Real <a> and <button>. Both start as plain words a view styles freely; <button data-record> goes where it says; a[data-record] and a[data-place] carry a real href, so a new tab, a middle click and copy link work. An embed that keeps its own addresses hands them in with hrefOf.
  • A view is as tall as it draws. The host measures it. On Pages it flows with the page; on the Scene a view of many or of one record is a card held to its box, faded where there is more, with Open (or Expand where there are no pages). flows: false and scene.maxHeight are new in the manifest.
  • An accessibility audit of a drawn view. auditView on @graview/guest/audit, graview view check --audit, and audit: true on a headless run: keyboard reach, names, state, nesting, images, scroll boxes, and in a browser the focus ring and contrast, each against its WCAG 2.2 criterion.
  • Checks know a view's place. A link to a titled view's place is no longer flagged as going nowhere when the host hands the check its views, and describePlace describes such a place.
  • A place is said drawn once its lens has drawn. data-graview-drawn and onDrawn wait for a declared lens's rows, so graview shots and graview preview no longer photograph a blank place; a full-page shot shows the whole of a long place.
  • Find hands the keyboard to a place at once. Enter on a kind in Find no longer leaves the keyboard in the Find box while the place's line is still coming, where the next key a person typed went on a slow machine.

Before you upgrade: Additive in the manifest (flows, scene.maxHeight) and the API (auditView, GoTo.href, hrefOf on the embed and PagesApp, lazyPart, PartsWatch, viewPlaceOf, views on runWorkerViewHeadless). A view's links now carry an href and lose the role and tab stop the host added; buttons and host links are reset to their words at zero specificity; Enter and Space on a pressable element are heard as a click; a one-record view on the Scene is a card rather than scrolling inside its box; a framed place's scroll box takes the keyboard and is named. data-graview-drawn comes later than before, when a lens draws. Ops, stored formats and the wire are unchanged.

0.1.46

Published October 22, 2026

Built-in views share one type scale and one heading per page, a view's own place flows with the page, and the home may keep the line under the name off.

  • Built-in views look designed. Place headers, blocks lenses, grouped lists, kind lists and record pages share one type scale, one left edge and one heading. A lens's headline becomes the line under the page's title instead of a second heading; a group's heading is its label and its count; a record's name in a row or card is set in the text face; choices in a line of facts are drawn as small chips; spacing follows a 4px scale, given as --graview-space-1 … --graview-space-7.
  • A view's place flows with the page. A titled worker view at /places/<slug> is no longer drawn in a fixed-height frame that scrolls inside itself, which trapped the thumb on a phone. A calendar, a board and the other pictures keep their frame.
  • The home may keep its line off. brand.subtitle: false keeps the description from being drawn under the app's name on the home, so a home view with its own hero no longer says everything twice. The description stays the app's, in its listings and on the name's hover.

Before you upgrade: Additive in the declaration: brand.subtitle, optional and only false; a build that predates it refuses a document that carries it. Additive in the API: Brand.subtitleDrawn, the set-brand edit's subtitle, PlacePageHead on @graview/primitives/pages, runs on a resolved text block whose facts name a choice field, count on a grouped list's group in describe_place, and the --graview-space-* tokens. A titled worker view's place no longer scrolls inside itself. Ops, stored formats, the wire and the derived tools are unchanged.

0.1.45

Published October 22, 2026

A form for a visitor, cards that open on a phone's tap, and views that link out, bleed and stack their stylesheets.

  • A form for a visitor. An app can declare a form — one act drawn alone for somebody with no account — whose answer lands as a record and shows nothing else of the app. @graview/embed/form mounts it anywhere.
  • A card opens on a tap. Any element a view binds to a record or a place opens it on a click, a phone's tap and Enter, from wherever inside it the press lands. Any element bound to an act presses as a button does, and a headless run can press it and say what it would send.
  • Views link out, safely. A view may link to an address a record it was shown holds, drawn to open in a new tab with no referrer; an address the view built is refused, so a link cannot carry what the view read.
  • Every stylesheet is drawn. A view that calls graview.style twice draws both, in order.
  • A view can go edge to edge on a phone with bleed: true, and a record page draws its slot under a view that does not replace the page.
  • The keyboard goes where an act asks, and the undo key the offer names is the one the journeys press.

Before you upgrade: The style message between a view's runtime and its host carries sheets where it carried css, and HeadlessTranscript.css is sheets; the two ship together in @graview/guest. An element other than an <a> bound to a record, and one other than a button bound to an act, now opens or presses and is given tabindex and a role; a text field or select with data-act and no data-save no longer presses. forms is a new key in the declaration and the document. bleed is new in the manifest; links on a worker view's options; describePlace takes views. Under a view that sits above the page, a fact the page's blocks say is not listed again.

0.1.44

Published October 21, 2026

A compacted store shows a seat only what it may see, history judged for one seat, and views that stand in the nav.

  • A security fix for compacted stores. A store opened from a checkpoint could serve a seat the id of a record removed before the checkpoint, inside a field of a record the seat may see. The checkpoint now keeps what it needs to judge that, and an older checkpoint fails closed.
  • History judged for one seat. archivedSeenBy serves a range of the archive, with its checkpoints, as one seat may see it.
  • A view stands in the nav. A view the host keeps can be ordered among the places and opened first; a kind kept off the places leaves the Pages drop-down and stays reachable at its address.
  • The two-scheme logo has a capability id and one public reader.
  • The Nightly's engines leg looks twice before it fails, and keeps its verdicts.

Before you upgrade: Checkpoints gain removed and writers (optional; older builds ignore them); a store opened on an older checkpoint fails closed for a seat whose sight is not total, so a host mends each once. view:<name> in pages.order, first and primary; editDocument, compileDocument and placesOf take views; a kind in pages.hide leaves the bar's places. About 2 KB more up front.

0.1.43

Published October 21, 2026

A change carries its value once less: smaller histories for every app.

  • A saved change no longer keeps its own undo copy. It was always worked out from what changed; now it is worked out when undo, playback or a rebase needs it, instead of being stored and sent. An image field's change is about 40% smaller, and a whole history of image edits about 38%.
  • Nothing old breaks. A store written by an earlier version opens and carries on; exports from earlier versions import and undo the same; a tab on an earlier version is still sent each change with its undo copy written out.

Before you upgrade: Op format 2: ops carry no inverse (read it with inverseOf(op)); AppendOp.inverse is gone. A version before 0.1.43 that opens a store or export written by this one refuses it with NewerFormatError. A reader says it reads format 2 on the wire (opFormat); one that says nothing gets format 1. About 0.5 KB more up front.

0.1.42

Published October 21, 2026

Pages that say where you are, a logo for each scheme, gestures in views, an open on a short tail, and playback past the undo horizon.

  • A page says where you are. A derived list, record or picture opens with a "You are here" trail; usePlaceHere() and registry.section let a design's own shell light its tab.
  • Undo and Find fit a design's bar. <PageUndo compact />, and className and size on both.
  • A logo for each scheme. brand.logo: { light, dark? }, drawn in the dark by the bar and AppMark; a light logo inverted only when the brand asks.
  • Worker views hear wheel, drag and pinch when their manifest says gestures: true.
  • Heavy apps open fast. A page can open on the snapshot and a short tail of the log (openTail), and a view's code is fetched only when it is drawn.
  • Playback reaches past the undo horizon by asking the host's archive for the older changes.
  • The framework costs half as much to import in a Worker: schemas are built on first use and zod is shaken to what is called.
  • A recipe: a product face of its own over a running preview.

Before you upgrade: Brand.logo is string | BrandLogo (read logoOf(brand)?.light); a host building its own Playback sets archive: null; the exported document shapes are z.lazy; a field revision is stale only when written after the claim; openTail, HistoryHost.archived and a lazy worker are additive. About 3 KB more up front.

0.1.41

Published October 21, 2026

The app bar holds still at every width.

  • The app bar no longer flickers. At some widths the places in the bar stood, squeezed the app's name onto two lines, folded, and stood again, over and over. Whether they stand, and whether the Scene and Pages switch shows its words, is now weighed with the name as it stands on one line, and the room before Find is measured as it is drawn.

Before you upgrade: A place near the bar's edge may now fold where it stood, because the row is no longer weighed 8 px roomier than it is. About 0.5 KB more up front.

0.1.40

Published October 20, 2026

Edits kept the moment they are made, labels that keep their space in a focused scene, a keyboard that reaches what it means, and a first draw with no extra round trips.

  • Stores persist in IndexedDB. A page's store moves from localStorage to IndexedDB, carried forward intact, so a large one survives in Safari; every edit is journaled the moment it is made, so leaving the page loses nothing.
  • A focused scene gives its words room. Relation headings sit over their own cards, counts appear once per district, and lines route around labels.
  • The keyboard reaches what it means. Skip links into a long list, the chosen card and the problems; a menu of acts is one Tab stop. Keyboard presses across the examples' jobs fell from 1,995 to 1,103.
  • The first draw needs no extra round trips. firstDrawChunks names what a face's first paint opens, and early fetches wait for it.
  • Smaller asks: a drop takes the photo's capture time; the scene opens on the overview and can sit under a host's own bar; sync-seed's dry run refuses what the apply would; graview preview stops when told; graview check warns of long headlines and templates in code describes; shots and preview take an app declared in code.
  • Apps that run the framework from source take their aliases from its exports (sourceAliases), including projects graview create --link makes.

Before you upgrade: The browser adapter keeps stores in IndexedDB (localStorage stores are carried forward) and loadMeta/saveMeta return promises; the adapter journals ops (journal, loadJournal); mount's bar takes { faces?: false, name?: false }; the scene with no path opens on the overview (where().stop is #overview=1); spatialHref(id, sceneHref); sync-seed exits 1 on a seed the declaration refuses; ServedStore.close({ grace }); new check findings describe-template-in-code, view-headline-long, lens-column-written-unsaid. The hosted page carries about 2 KB more up front.

0.1.39

Published October 20, 2026

Cards that answer the menu under a base, full-size photos in views, views that save as you type and take a drop, and a page that says when it has drawn.

  • Cards answer the right-click menu on a hosted page. A board or blocks card served under a base path offers its acts and Move to ›, a new tab keeps the base, and a finger resting on a board card opens its menu, so a phone moves cards again.
  • Full-size photos in views. A view that shows record pictures draws them at any size, and the headless check says when a page would leave one out.
  • Views save as you type. A field marked data-save="input" saves when the person pauses, and the view hears whether it saved.
  • Drop photos and videos onto a view. A view marks where files may land; the host takes them, stores them and makes one record per file, in one undoable change, with a picker on a phone.
  • The page says when it has drawn. data-graview-drawn and onDrawn replace a timer for anyone picturing a place, and a page can open on a view proposed and not yet kept.
  • add-lens refuses an option the lens does not take.
  • Authoring skills split at their limit, so each teaches one job.

Before you upgrade: mount takes onDrawn(place) (the old first-commit callback is onFaceDrawn on <Embed>), draftView and handle.setDraftView; @graview/embed depends on @graview/guest; add-lens refuses an unknown option (lens-option-unknown, an error) and lensOptionsRefused judges a patch; a worker view's manifest takes accepts, and graview.act takes a list of arguments as one change; a board card's long press opens its menu; code acts that move a board's cards need sets (lens-column-written-unsaid). The hosted page carries about 4 KB more up front.

0.1.38

Published October 19, 2026

Boards without buttons that search and filter, places that hide and restore views, a menu that offers what exists, and the last of inline AI.

  • Boards without buttons. A card moves by drag, by the keyboard or from its menu's Move to, with no Move button under every card, and a board takes search, filter and column options, showing search by itself once it is big.
  • Places that tidy their views. Right-click a place to hide or delete a view; Hidden and Recently deleted (kept 30 days) sit at the foot of the places list.
  • A menu that offers what exists. Before drawing a new view, the right-click menu offers the one the app already has.
  • The last of inline AI. Several records chosen get suggestions for the set, one quiet hover chip can offer the likeliest next step, and the menu's AI part fills in well under 400 ms.
  • graview.dev shows the interface is generated, then reshaped by asking.

Before you upgrade: A columns lens draws no Move button unless move: true; lenses take options; keptViews on mount, the provider and the Shell, with /graview/views and remoteViews; ai.hoverChips (off by default); places carry lens, reads, name and declared. The hosted page carries about 2.7 KB more up front.

0.1.37

Published October 19, 2026

Times in the app's own time zone, acts for every relation, video on records, and lines that wait for a view that draws late.

  • Times in the app's zone. An app says its time zone once; lists, record pages, act answers and views say times there, {at | time} and {at | datetime} read them out, and a rule's today() turns at the app's midnight.
  • Every relation can be linked. Each relation comes with its own connect and disconnect acts, so an app can link two records without writing an act for it.
  • Video on records. A video field plays on a record's page, and a view can place a host-drawn player and a full-screen viewer.
  • Lines that wait. A view that draws its members late, as on a slow phone, still gets its lines.
  • The twelfth walk (a film festival at real size) found seven problems, all fixed, among them a date editor that refused a stored time, a repair offered and then refused, and records of one name told apart by their ids.

Before you upgrade: brand.timeZone, timeZone on the provider, mount and PageContext; derived connect-<kind>-<relation> and disconnect-<kind>-<relation> acts appear in act lists and tool surfaces, and edge-without-severer is no longer reported; a video field type; seenBy is generic over the store. The hosted page carries about 7 KB more up front.

0.1.36

Published October 18, 2026

A record's pictures load under the host's base on every face, and a view draws the pictures and app images it was promised.

  • Pictures load where the host serves them. An app served under a path (/a/<app>/) drew its records' pictures and documents from the site's root; HostFiles.src now says where, and filesAt works it out from its own address, so a host that already uses it needs no change.
  • Views get their pictures. A view that asks for pictures receives each image's src, live and in a preview, and a picture the host doesn't answer for is said with what the host answered.
  • Views draw the app's own images in every form they are written in, and a refusal only offers what the host actually draws.

Before you upgrade: HostFiles takes src; fileSrc on @graview/core; views take file; runWorkerViewHeadless takes asset and origin; sayRefusal takes the host's { origins, assets }. The guest host's first load is about 0.4 KB larger.

0.1.35

Published October 18, 2026

A relation to another app can be made by an edit, a host may say later whether it still keeps a file, and playback asks for a past declaration when it gets there.

  • A cross-app relation from an edit. The add-relation edit, the studio and anything that sends edits can now relate a kind to another app's kind ("to": ["@nick/house/house"]), refused with the checker's own words when it can't be. Migrations no longer drop such a relation's links.
  • Files a host answers for later. HostFiles.kept may return a promise: a picture is drawn as itself until the host answers, then as removed later if it was, and each file is asked once.
  • Past declarations on demand. Playback asks the host for a past version's declaration when it reaches it (declarationAt), so a page no longer carries every version up front.

Before you upgrade: add-relation accepts a to of "@<address>/<kind>". HostFiles.kept may return Promise<boolean>. HistoryHost takes declarationAt. Nothing breaks; the hosted page carries about 0.5 KB more up front.

0.1.34

Published October 18, 2026

The right-click menu tells a visitor how to get in, draws a panel where it was asked, spends no thinking-model call on opening, and is ready before the click.

  • A visitor is told how to get in. A host passes signIn while nobody is signed in; a reader who may do nothing sees one sign-in row in the menu and at a list's foot instead of every act struck through, and is not offered Notify me.
  • A panel drawn from the menu stays on its face. On Pages, "Draw a panel" opens the draft page with Keep as a lens and Discard; over the scene the draft is framed as a panel; a failed ask is said in the menu.
  • Opening a menu costs nothing. With only a thinking model, suggestions wait for a "Suggest…" press; with a Fast slot they are asked once per record until it changes.
  • The menu is ready before the click. Resting on a record, focusing it or touching it prepares its menu, so it opens complete.
  • The eleventh walk (an animal shelter at real size) found six problems, all fixed: finding a past record by name, filtering a status board, offered repairs that were refused, a misnamed heading, Tab from a chosen box, and the scaffold's own test under a policy.

Before you upgrade: mount, <Embed>, GraviewProvider and PageContext take signIn (SignIn from @graview/core). HostAi.suggestOnOpen is new; with only a thinking slot the menu no longer suggests as it opens. The hosted page carries about 0.2 KB more up front.

0.1.33

Published October 17, 2026

A read-only calendar takes its own changes under a policy, and a host keeps Notify me in its own store.

  • A read-only connection works under a policy. A calendar the app only reads now brings its own changes in when the app declares who may do what, and a change the app refuses is reported as refused rather than as the calendar being unreachable.
  • Notify me on a hosted page. mount takes the host's subscription store, so subscriptions made from the right-click or a record page are kept by the host on both faces; keeping them that way adds no parser to the first load, about 9.4 KB less than before.

Before you upgrade: SyncReport.refused may now name an inbound change (SyncRefusal, with the remote resource and id), and offline is true only when the remote itself fails. mount and <Embed> take subscriptions.

0.1.32

Published October 17, 2026

Ask with ⌘K and the right-click, be told when things happen, a faster first load, the GPU by default, and a Google calendar kept in step.

  • The AI where you are working. ⌘K opens a bar beside what you're on that completes its acts, places and records; anything else is asked, and the answer is a card beside the record or list. The right-click offers suggestions, fills, new records and panels, picked only from what you may see and do. Every proposed change is previewed first, accepted all or some, and undone in one step, and Activity keeps each AI interaction.
  • Notify me. Subscribe to an act, a kind or a record in two presses from a right-click, a record page or chat. A change by someone else that you may see tells the host once.
  • Faster. First load to interactive is 31–38% faster on a desk and on a slowed phone, held by a CI budget, and the scene draws on the GPU where the browser can, with unfocused planes blurred.
  • Dates and calendars. One date and date-time editor everywhere that reads "tomorrow 3pm" or "Fri 10:30" and shows times in your zone. A Google calendar can be declared in the app (a calendar, a color or #tag filter, read-only or both ways) and kept in step by graview serve, proven against Google itself.
  • Twelve controls covered by another were fixed, and graview.dev shows the inline AI and gains this page.
  • Fewer presses to add a record. A list's Add button now stands beside its heading, so making a record from the keyboard on the pages takes 10–14 presses where it took 17–22.
  • The GPU only where clicks land. A Chrome whose capture build would hit-test where a view was laid out rather than where it was drawn now draws on the DOM path, so a press, a screen reader and a focused field always meet what is on screen.
  • Signs, panels and embeds that stay out of the way. A sign at the map's edge steps past a district's name, "Go to it" hands the keyboard straight on to the record it went to, a lens is drawn in the room it has from its first frame, and an embedded app draws nothing over its host page.

Also in it: 0.1.31, which was versioned and never published, so its changes shipped here. Ask with ⌘K and the right-click, be told when things happen, a faster first load, the GPU by default, and a Google calendar kept in step. The quick ask and the right-click AI, notify me, a faster first load, the GPU by default, one date editor and a Google calendar kept in step, all described under 0.1.32.

Before you upgrade: The old seat's input, its panel and their settings are removed, along with the routed face's own copy: quickAsk replaces their setting on the Shell, the pages and the embed, and quickAskOf reads a stored one. The full list of removed names is in the changelog. The Shell's and the embed's renderer defaults to auto. A document's datetime is asked for with the date editor. The hosted page carries about 3.5 KB more up front (1.3 KB gzipped).

0.1.30

Published October 15, 2026

Play an app back, link across apps, an actor that tidies, and graview.dev as a Graview app.

  • Playback. Open the app as it stood at any moment, and restore it to there.
  • Linked records. A relation can point at a kind in another app, read there as whoever is looking.
  • An actor that tidies. The app's own actor suggests fixes, which a person accepts or declines.
  • A first look for a new app, an emoji as the app's mark, kind lists you can sort and group, navigation with filters and sections, a right-click menu on Pages and images by URL.
  • Eighteen author requests and a run of scene and lens bugs fixed, a screen-reader pass, and the GPU path past 128 live views. graview.dev itself is now a Graview app.

Before you upgrade: Store.at and Store.seqAt are replaced by pastOf and seqAt on the new @graview/core/past. A role that removed, archived or merged other people's records only through the act that makes the kind now needs those acts named in its grant.

0.1.29

Published October 14, 2026

A large release of field types, list tools and data features, on a lighter page.

  • New field types: links to another app, Markdown text, phone, place and duration, and money, percent and unit formats; dates and numbers said the US way.
  • Records: archive and merge records, lineage and provisional links, repeating dates, field-level sight, acting on several records at once, and importRows for bringing data in.
  • Lists: fuzzy search, filters that scale to large lists, and cards you can read at a glance.
  • renderPlace writes a place as static HTML, guest views can show pictures, and store.tick reports what changed.
  • The map is laid out along the ground, and the hosted page is lighter up front than 0.1.28 despite everything added.

Before you upgrade: Breaking for imports: edgeWords and valueWords move to @graview/core/words, and the address helpers (withShown, withQuery and the rest) move out of @graview/layout; nothing is aliased. The scene's map is laid out anew, so a sceneThumbnail draws a different picture. Ops, stored formats, the wire and tool schemas are unchanged.

0.1.28

Published October 13, 2026

The people kind, grants and sights are named edits.

editDocument gains set-people, add-grant, remove-grant, add-sight and remove-sight, so who may do and see what can be changed as a named, previewed edit instead of a raw patch. Each is previewed in words and refused with the checker's own codes.

Before you upgrade: Ops, stored formats, the wire, the document format and check codes are unchanged. The edit vocabulary gains five ops, and an edit's refusal can now carry a specific code where every refusal was edit.

0.1.27

Published October 12, 2026

People in a document, bounded seat reads, and links that say why they did not go.

  • A document can name the kind that stands for its people, and its acts can say $me for the person acting.
  • A grant can hold to your own end of a link, and a sight can reach the records that link to you.
  • A seat's reads are bounded, and a worker view's link or navigate says why it did not go.

Before you upgrade: Breaking: answerSeenBy moved to its own entry, the read tools' answer shapes changed, useSeatConversation requires said, and $me is reserved as an argument name.

0.1.26

Published October 12, 2026

Pictures and files on records, and a failed AI turn says why.

A kind can carry pictures and documents: imageField(), fileField(), the image block, and uploads through the host's files seam. When a host's AI turn fails, the seat shows the host's own explanation.

Before you upgrade: Breaking for imports only: the form helpers (formFields and its neighbors) moved to their own entry. Ops, stored formats, the wire, the document format and tool schemas are unchanged.

0.1.25

Published October 12, 2026

The app on a phone: the seat closes and the screen fills.

On a phone, the open seat is put away by its close button, a tap on its grab line or a pull down, and the keyboard goes with it. An app fills the phone after it rotates.

Before you upgrade: Tool schemas move to @graview/core/json-schema.

0.1.24

Published October 12, 2026

Every seat judged over what it sees, problems that open on their fix, and a fit on the smallest phone.

  • What a seat is told is worked out over what that seat can see.
  • Pressing a problem opens its repairs, wherever the record sits, and a record is renamed by pressing its name.
  • The bar and the home's counts fit a 320-pixel phone at the largest text size.
  • Names, yes-or-no fields and facts read in plain words. Also sync fixes.

Before you upgrade: Ops, stored formats, the wire, the declaration, check codes and tool schemas are unchanged; only where some types are declared moved.

0.1.23

Published October 11, 2026

The seat's turn, without the weight.

turnThroughMessages has its own entry, @graview/tools/turn, under 2 KB, so a host can wire the seat's turn up front without loading the whole tools package on first paint.

0.1.22

Published October 11, 2026

Preview and doctor, typed documents, and a seat that reads before it answers.

  • graview preview serves a document and a seed with Graview's own faces over them, no product needed, and graview shots photographs places headless.
  • graview doctor says whether a product is on one Graview release.
  • Documents are typed from the editor to the face, can declare facts about the whole graph, and give kinds a natural time and author field. Declared blocks have stable keys.
  • The seat reads records with tools before it answers, the sync engine resolves conflicts as it is told, and kinds with no records fold into More.
  • A security and correctness review of 0.1.21.

0.1.21

Published October 11, 2026

Who's here on every bar, axe-clean markup, and a way back in the scene.

  • Who else is here shows on the bar on both faces and on a phone.
  • The framework's own markup passes axe-core for WCAG 2.0 to 2.2 A and AA, at desktop and phone widths, light and dark.
  • The scene gets its own way back, and the overview has an address that survives a server round trip.
  • A broken rule states its values to a host that reads only its message, and a read-only role is no longer warned for doing nothing.

Before you upgrade: Ops, stored formats, the wire, the document and compiled formats, check codes and tool schemas are unchanged; some presence and test-id behavior a harness reads moved.

0.1.20

Published October 10, 2026

List pages lead with their records, and rules read like sentences.

  • A list page puts its records first instead of a tall header of title and related links.
  • A rule written in the rule language says its shape in plain words.
  • An agent opening a new product finds what to read at the root.
  • Fixed: a connect that replaces now replaces the right link, one mistake gives one check finding, and the scene from an empty address lands where the scene opens.

Before you upgrade: Additive: the document format gains an optional pages.primary, and check gains two warnings about it. Which places stand on the bar changed.

0.1.19

Published October 9, 2026

The seat floats, takes you where you ask, and draws views you can keep.

  • The seat is no longer a rail down the scene's edge: it floats, quietly, on both faces.
  • Ask it to go somewhere and it goes, matching the request against what the declaration and the graph already name, without a model.
  • Ask it for a way of seeing and it drafts a view that can be kept as a lens. Who-and-when questions are answered from the graph with no model.
  • The host chooses the AI once, instead of the reader picking from a menu. The whole-page shell wears the one app bar, and the hosted page carries 9.5 KB less before the app draws.

Before you upgrade: Breaking for the components and API a host's seat reaches: the Companion family is removed for the floating seat and HostAi. Ops, stored formats, the wire, the document format and tool schemas are unchanged.

0.1.18

Published October 8, 2026

A lens picker in the scene, and prose that reads like prose.

The scene gets its own place control. A selected record is drawn once. Long text keeps its paragraphs. Parts that fail to load retry safely (@graview/core/retry), and no import cycles run at load time.

0.1.17

Published October 8, 2026

Graview's identity, and Scene and Pages side by side.

The framework's own look follows the third revision of its design kit and is exported as data. The scene and the pages read as two things on the bar.

0.1.16

Published October 8, 2026

One app bar, and brands you can edit by name.

One bar on every face, with the scene as a place beside the others. Named acts for an app's name and brand, contrast refusals that name the failing pair of colors, icon-sized app pictures, and search results that carry their address. The framework now spells in American English.

Before you upgrade: Breaking: names spelled the British way are renamed with no aliases (normalize, summarize, humanizeField, colorsIn and others). The undo dock is a fixed popover rather than a box in the page's flow.

0.1.15

Published October 7, 2026

Clearer refusals, one problem count.

Refusals that come from a rule now say so. The number of problems appears in one place. A host can hand the page an already compiled app.

Before you upgrade: Breaking for a caller that sent an act an argument it does not declare: it was dropped and the act ran; now it is refused as invalid, naming what the act takes.

0.1.14

Published October 7, 2026

Ranges, derived edits and fewer pills.

Number fields declare their ranges. A derived edit per kind covers every field nothing else sets, and refuses what it cannot take. A design pass, from building a real product, took words out of capsules.

Also in it: 0.1.13, which was versioned and never published, so its changes shipped here. Status-board moves and an address bar for the routed face. A status board's columns say which lens they are in, and an act that sets the board's field is offered as a move. Scene thumbnails can be fitted to what stands. A host whose page is the app can give the routed face the browser's address bar.

Before you upgrade: The arrangement functions moved from @graview/core to @graview/core/arrange. From 0.1.13: @graview/react/provider no longer exports UrlSync, useUrlSync or adjustment (@graview/react still does).

0.1.12

Published October 6, 2026

A lighter hosted page: the checker and the seat's tools leave the main entry.

What only a fetched face, an agent's seat or the checker uses moved out of @graview/core's main entry into subpaths named for what they hold, so a hosted page loads less up front.

Also in it: 0.1.11, which was versioned and never published, so its changes shipped here. A status board lens, currencies, and set walks in the rule language. A shipped columns lens draws a kind's records as a status board. Money fields take a currency, and the app has a default one. Figure labels are templates. The rule language walks a relation from every member of a set. The checker warns when an act reads a kind a role may not see.

Before you upgrade: Breaking for imports, with no aliases: checkApp, formatFindings, describeApp and the docs generators move to @graview/core/check, and other names to their own subpaths. From 0.1.11: @graview/primitives/frame exports themeBaseCss in place of themeCss, and a worker view's failure reads start where it read refused.

0.1.10

Published October 6, 2026

Declared lenses and homes, and worker views you can trust with HTML.

  • A lens, a home view and the arrangement of pages declared in a document now draw, and a view can list related records.
  • The rule language computes what pages need (sums over expressions, sorting), and kinds can declare computed fields.
  • A worker view can draw HTML, SVG and CSS with nothing able to fetch or leave its region; it needs no build, is a named place with a manifest the host enforces, stops past its limits, and can be run once headless to say what it drew.
  • describePlace says what one place shows one seat, without a browser. Every new document feature has an edit.

Before you upgrade: Additive within the document format and check codes. The guest-view protocol gains messages; derived tools gain one read tool, describe_place.

0.1.9

Published October 5, 2026

A host speaks in the app's own notices, menus and pictures.

A host can show its notices in the app's own voice, put its own actions in the profile menu, and draw a picture of an app without a browser. Every popover opens above everything else and behaves the same way, and the seat's rail can be put away.

0.1.8

Published October 5, 2026

Guest views run in a worker, for chats that cannot nest a frame.

A guest view can run in a worker as well as a frame, hardened before guest code runs and built as one classic script. The component kit it draws with is declared once and the host draws nothing else. A host says where its links may go, and a guest that stops answering is stopped.

0.1.7

Published October 5, 2026

A read-only app says so.

An open page is told that the app takes no changes for now, and why. An op that names a missing record is served as it is.

0.1.6

Published October 4, 2026

A host's refusals in its own words, and an embed that keeps to its box.

A host can refuse a change in its own words, an Apply with nothing changed asks the host nothing, and the embed's stylesheet stays inside its element.

0.1.5

Published October 4, 2026

The studio in a host's page, and half the weight.

A field changes in place in the studio, the host decides who is offered the studio and can refuse a change, and what the studio will not change is said up front. A hosted page carries 536 KB up front instead of 1,075 KB, with each face fetched as it is first drawn, and the framework builds its schemas in zod/mini.

0.1.4

Published October 4, 2026

Security: a seat learns nothing about records it may not see.

  • A seat is never served the id of a hidden record, and no refusal, sentence or checkpoint reveals whether one exists.
  • A change is acknowledged only once it is durable, a busy host's wait is read correctly, and a hibernating host can resume its sockets.
  • Refusals on the wire are written for people, and the studio hands a host back a document.

Before you upgrade: The wire and live protocols narrow what a seat with sights is sent; no field is added or removed. remove-kind removes more of what depended on the kind.

0.1.3

Published October 4, 2026

A live store a host can run, observe and deploy.

Refusals carry a code a program can branch on, a busy host is told apart from a refusal, presence can include agents, the declaration can change under open tabs, a remote client can be observed and can catch up, and the wire says when the client and server are on different builds.

Before you upgrade: Breaking for a client that named its own channel: via in a call is ignored, and a client sends x-graview-via to a server that trusts seat headers.

0.1.2

Published October 3, 2026

The declaration as a document, a live wire, and guest views.

  • The declaration is a document: one JSON object that compiles into the same app defineApp declares, with an edit vocabulary of twenty-one operations, rules written as expressions, and templates as data.
  • A live wire: openRemote({ live: true }) pushes every op to every browser as it lands, MCP is served over HTTP, and logs can be folded and compacted.
  • Guest views: @graview/guest, a view somebody else wrote, in a sandboxed frame that can only ask.
  • A SQL adapter, stored formats that carry their version, a conformance kit, and docs/stability.md, the promise a version keeps.

Also in it: 0.1.1, which was versioned and never published, so its changes shipped here. A record read whole, in its own words. A kind declares what a glance at one says, forms and lists say values in the record's words, lists narrow by numbers and words, and a policy says who may see what as well as who may do it.

Before you upgrade: Breaking: a store served without seatOf answers 401 until it passes trustSeatHeaders: true, graview serve binds 127.0.0.1, a host's seatOf receives a web Request, a full palette needs the good and bad tokens, and a kind no sight names is seen only by the system.

0.1.0

Published October 2, 2026

The first public release of the framework on npm.

Graview's first release to npm: a framework where a typed context graph is the interface rather than the backing store. One declaration per kind drives the layout, the legal actions, the agent tools and the accessibility labels. graview is the tool and @graview/* the framework, all at one version, under the Elastic License 2.0.

Also in it: 0.0.1, which was versioned and never published, so its changes shipped here. The work before the first public release. It was numbered once in the repository and never published.