# Download Vantage UI

[Download for Mac](https://vantage-releases.s3.eu-west-2.amazonaws.com/stable/1.9.16/Vantage-1.9.16-aarch64.dmg)

v1.9.16 · Apple Silicon · macOS 13+

sha256: 143bcd3a3cb37464…

## Changelog

### Vantage 1.9

21 October 2026

#### Vantage 1.9

A preview of an agent chat panel now docks at the right of the window, so you can ask a coding agent about your project without leaving it. Claude Agent is there by default: the first time you open the panel, Vantage downloads what the agent needs, with nothing to install yourself. If the agent asks you to log in, the login runs inside the panel. The agent starts in the project folder and can read the page you have open, run data scripts and read logs through Vantage's own MCP server.

##### What's new

- Toggle the panel with the title-bar button or Cmd-Shift-A. The first open shows the download's progress; later opens start straight away, even offline. Pick another agent, such as Codex, with `agent.selected` in `settings.json`, or add an `agent.custom` entry for any Agent Client Protocol command you already have and select it. The Set up with AI screen now points at the panel first, with your own editor as an option.
- Replies stream in as they are written. File edits show as diffs, the agent's plan as a checklist, and `/compact` as a divider. Pick the agent's mode and model under the message box. When the agent asks for permission or a login while the panel is closed, the toggle shows a dot, and the Dock icon bounces if Vantage is in the background. Closing the panel mid-turn leaves the agent running. Esc stops the current turn. If the agent crashes, the panel shows the reason and a Restart button.
- Type `@` in the message box to complete project files and skills, and `/` to list the agent's commands.
- Dialogs and sheets stay clear of the panel, so you can keep using it while one is open.
- Conversations are saved per project. Pick an earlier one under Threads in the panel header; Claude Agent picks up where it left off, after a restart too. Switching profiles keeps the same list.
- The agent in the panel knows Vantage's skills from its first message, so it can start a new project or add a page the Vantage way.

##### 1.9.1

- Long agent conversations scroll and resize smoothly, and the panel no longer pulls you back to the bottom while you are reading an earlier reply.

##### 1.9.2

- When an agent crashes, the panel now shows its last messages before the error instead of dropping them.

##### 1.9.3

- A project's `refs/` folder stays out of git and out of app sync.

##### 1.9.4

- Claude Agent in the panel loads Vantage skills as its own skills, without a permission prompt, instead of reading their files. When you name a file it can't find in the project, it asks where it is instead of searching your computer.

##### 1.9.5

- Drag files or folders from Finder onto the agent panel, or pick them from the new + button by the message box, to add them to your message. Each one shows as a chip above the text box; the agent gets a link to it, not its contents.
- Files from outside the project can be copied into the project's `refs/` folder or referenced where they are; a drop asks which each time.

##### 1.9.6

- The libraries Vantage uses for secure connections (TLS, certificates, HTTP/2) are updated to versions with published security fixes.

##### 1.9.7

- A service added to `composer.yaml` while the stack runs now starts and shows in the Services sheet; a removed one stops, and a changed one is marked until you restart it.

##### 1.9.8

- After a project switch, the title bar names the open project, not the one the app started with.
- Going back to Welcome stops the previous project's services, APIs and menu-bar pages.
- A profile switch waits for a project switch to finish, and isn't offered on Welcome.

##### 1.9.9

- Leaving a project now stops everything it started before the next screen opens: the agent, background jobs, frontend dev containers, APIs and services. Switching projects, Welcome, Cmd-Q and the window's close button all do this; the close button now waits for the project to stop, then quits. If stopping takes more than a second, a card lists what is still running, with Force quit and then Don't wait.
- Opening a project always starts its services, including the first open. Picking the open project from the switcher does nothing.

##### 1.9.10

- After you close a project or go to Welcome, MCP tools, actions, the feedback form, saved column widths and filters no longer act on the closed project.

##### 1.9.11

- On Welcome, Project Settings, Secrets and the other project tools in the title bar no longer open the project you just closed.

##### 1.9.12

- Switching, going to Welcome or quitting while a project is still opening now closes it like an open one: its connect is cancelled and its tasks stop.

##### 1.9.13

- The agent panel belongs to its project: a switch ends the old project's agent and opens a fresh panel over the new project's conversations. Whether the panel is open carries across Welcome.

##### 1.9.14

- Pinned tabs come back when you reopen a project; unpinned tabs don't, and with nothing pinned the first page opens. A switch no longer leaves the old project's layout behind.

##### 1.9.15

- Relative dates read the same everywhere: `3 days ago` in a wide column, a label or a record view, `3 d ago` in a column under 120 px. Add `freshness: true` beside `render: relative` to colour a date by age.
- Fix: SurrealDB dates showed as `1791200315, 0` in `render: relative` grid columns and blank in page headers.
- A `select` with `appearance: chips` takes `align: start`, `center` or `end` (the default) to place its chips in the row.
- A page `form` over a record of a table that takes updates edits it in place, with Save and Revert, instead of showing it read-only.
- A grid or crud row action with `triggers: { double_click: true }` runs when a row is double-clicked, so a double-click can open an edit dialog.
- Fix: with `log_changes:` on a SurrealDB project, changes saved but no audit entry was written, with "Expected `datetime`" in the log.

##### 1.9.16

- Ask the agent for a pipeline and it sets one up on GitHub and Google Cloud: checks that run your app on every pull request, a deploy on every merge, and a deploy account that can only publish new versions of your own services, from a protected `main`.
- The agent can move a SurrealDB project to SurrealDB Cloud: it tells you what to create in the Cloud console, then loads your schema and data.

Raw file: [changelog-1.9.md](https://vantage-ui.com/changelog-1.9.md)

### Vantage 1.8

21 October 2026

#### Vantage 1.8

One project can now run against your local database and your production one without editing a file. Each profile in `application.yaml` names its own env file, and a selector next to the settings cog switches between them; the window reconnects and every page reloads under the new profile.

##### What's new

- `profiles: { local: { env_file:.env }, prod: { env_file:.env.prod } }` in `application.yaml` now reaches datasources: `${secret.mongo_url}` reads the active profile's env file, and `${profile.<key>}` reads its other lines.
- With two or more profiles, the title bar shows the active one beside the settings cog. The choice is remembered per project.
- `VANTAGE_PROFILE` no longer picks the desktop's profile; the selector does.
- A secret the active env file doesn't set names that file in its error.
- API frontends' dev containers now pull `romaninsh/vantage-web-dev` from Docker Hub, tagged with this app's version (1.8.0), instead of `ghcr.io/atk4/vantage-web-dev` tagged by client version. `VANTAGE_WEB_DEV_IMAGE` still names any image.

##### 1.8.1

- Agents can now put a project's API and web frontend online: a production profile, a Docker image on `romaninsh/vantage-server`, and Google Cloud Run with a MongoDB Atlas database.
- Dev containers pull `romaninsh/vantage-web-dev:1.8`, the release line, instead of the exact app version, so a patch release of the app doesn't wait for a new image.
- A new web frontend installs again: Vantage asked it to depend on `@vantage-ui/client` 0.4.3, but the 1.8 dev image carries 0.5.0, so its install failed with `ENOENT … vendor/…`. New frontends now get 0.5.0; existing ones keep the client they committed.
- A project's stack starts again after its Docker network was removed while it was stopped: the start used to fail every time with `exited (128)`; Vantage now recreates the containers once (volumes stay). A failed stack command now shows Docker's own error, not just the command line.
- Switching to another project no longer reopens the one you left. When the new project's services came up during the switch, the window reconnected the old project and dropped the new one; that reconnect now waits for the switch and then runs over the new project.
- A project's database log is readable again. The generated `composer.yaml` checked health every 2 seconds, and MongoDB logged each check's connections in four lines (about 600 lines a minute). Health is now checked every second while a service starts and every 30 seconds after, and MongoDB runs with `--quiet`. Projects with an existing `composer.yaml` keep theirs. The checks need Docker Engine 25 or later.

Raw file: [changelog-1.8.md](https://vantage-ui.com/changelog-1.8.md)

### Vantage 1.7

19 October 2026

#### Vantage 1.7

A project can now sign people in through its own session table: your web app and API clients sign in, and the desktop app doesn't have to. It opens with a session of its own and full access, and can step into anyone's shoes to check what they would see. Each client's rows stay apart by one rule on the datasource, which every page, relation, script, MCP read and API call gets; a table the rule misses stops the project from loading. Every new, edit and delete, and every action run, is written to an audit table you choose, with who did it and what changed, so a record's history is an ordinary page.

##### What's new

- `session:` in `application.yaml` names the session and people tables and, in `signed_out:`, the only actions anyone may run before signing in. Pages read the session's fields as `${session.<field>}`, and a row action's `when:` reads them too, so an entry can show only for admins.
- The desktop never signs in: it opens with its own session, filled by `session.desktop` (or your OS account name), and full access as the `vantage` app (`app:` renames it). An admin can reset someone's password from there.
- A `kind: identity` title bar item shows who the pages are for and runs its `menu:` actions. An action that calls `session.assume` switches every page to that app and session, say a staff editor of one bakery, and `session.restore` switches back.
- A page whose table the rules refuse shows who is looking, in which app, and the rule that refused it. A narrowed table shows one locked chip per rule beside its filter chips.
- `invariants:` on a datasource (or opting out on a table) keeps each client's rows apart, with `exceptions:` for shared tables, operator pages, actions and apps. A rule's `script:` can check writes and remove columns, so one table serves readers and editors.
- Over MCP, `explain_access` says what the rules do to a table, `run_data_script` reads as any app and session you name, and `ui_tree` reports the session and each page's access.
- `log_changes:` and `log_events:` in `application.yaml` log row changes and action runs into a table; the log table is read-only everywhere.
- `auth: session` in `api/*.yaml` lets API clients sign in with the same actions; the API's own `sign_in:` lists the ones it offers.
- Without `session:`, the person picked in the title bar is the one the audit log names.
- A script writing `table:id` text into a reference column on SQLite, Postgres or MySQL stores it as written; only SurrealDB turns it into a record link.
- Fix: a file that `!include`s another one written a moment later now loads as soon as that file appears, instead of staying broken until you touch it.
- Fix: editing a log script (or anything else `application.yaml` includes) now takes effect at once, in the app and in your running APIs, instead of after a datasource reconnect.
- Fix: a button pressed by an agent over MCP can run actions again while another app is in front ("no active window to host dialog").
- Fix: read-only fields in a dialog, such as a password shown once, can be selected and have a Copy button.

Raw file: [changelog-1.7.md](https://vantage-ui.com/changelog-1.7.md)

### Vantage 1.6

18 October 2026

#### Vantage 1.6

The app now runs on version 2.0 of the Vantage data framework, and project scripts follow its vocabulary. A Rhai script saves a row with `row.flash()` in place of `row.save()`, faker datasources list their `capabilities:` under the 2.0 names, and `expr:` columns build queries through `sql::`, `surreal::` or `mongo::`. The bundled agent skills already use the new names, so an agent editing a project writes them for you. A form or a select label opened on a row the table hasn't loaded yet fetches it instead of showing an empty record.

##### What's new

- Rhai row scripts call `row.flash()` to save; `row.save()` is gone.
- Faker `capabilities:` take the 2.0 names (`window`, `cursor`, `order`, `search`, `insert`, …); the old names stop the project from loading.
- `expr:` and `modify:` use `sql::`, `surreal::` and `mongo::` builder prefixes.
- A binder keeps its own fixed filters; every other filter on the table shows as a chip.
- Fix: a form opened by id, or a select label, stayed empty until the row loaded elsewhere.
- Fix: an activity feed whose `at:` column can't order a source was empty; it now shows the error.

Raw file: [changelog-1.6.md](https://vantage-ui.com/changelog-1.6.md)

### Vantage 1.5

12 October 2026

#### Vantage 1.5

A record page can show what happened to it in one place. `kind: activity` merges several tables (comments, a history of field changes, work logs) into one timeline, oldest at the top and newest at the bottom, and keeps following as new entries arrive. Each table gets its own tab, long runs of changes fold away, and an optional box under the timeline posts a comment as the person picked in the title bar. A gauge button in the title bar cycles a profiler that outlines slow widgets; hovering one shows its cost and why it repainted: its own data, a resize, input, an animation or a neighbour's data.

##### What's new

- `kind: activity` merges several tables into one time-ordered feed, with tabs per source and folded runs of changes.
- The feed's `compose:` box posts a comment, completing names after `@` and `#`.
- Stat cards draw a trend line behind the value from `spark:` (an array or a scenery's rows), count to new values, and shrink to fit narrow widths.
- Grid and tree columns take `render: sparkline` with `series:` and `max:` for a small per-row trend.
- Fix: dashboards with charts redrew twice per step while the window was resized.
- Fix: a loading grid redrew itself every frame; its placeholder now pulses briefly, then rests.

##### 1.5.1 — 2026-10-12

- Agents can give an API a web frontend in `web/<api>/`, with the new `vantage-web` and `vantage-client` skills.

##### 1.5.2 — 2026-10-13

- A `web/<api>/` frontend builds in a Docker container started from its Web row in Services, with no Node on the machine; the open page reloads after each build.
- Agents open the frontend in your browser as they build it; until the first build lands, the page shows where to follow the build in Services.
- The container puts the `@vantage-ui/client` tarball in a new frontend's `vendor/` folder.
- `kind: script` actions run in the app, with a progress sheet for their `state:` and inputs that resume a `wait()`; `notify()` now shows a toast.
- On a new project, agents ask a few short questions first and fit a web frontend's style to its purpose.

Raw file: [changelog-1.5.md](https://vantage-ui.com/changelog-1.5.md)

### Vantage 1.4

12 October 2026

#### Vantage 1.4

Pages can show a table as a tree. `kind: tree` nests each row under the row its `parent:` column names, so epics hold their stories and stories their sub-tasks, and rows fold and unfold by clicking or with the arrow keys. Extra columns can total each subtree: a sum of points, a count, or the share of rows that are done. With `reparent:` or a `rank:` column, rows can be dragged under another row or into a new order, and a refused write puts the row back.

##### What's new

- `kind: tree` shows a table's rows nested by a `parent:` column, folded to `expand:` levels.
- Tree columns can roll up each subtree with `sum`, `count`, `avg` or a done percentage.
- Tree columns take the grid's column keys (`render: progress`, `color:`, `labels:`, …), and rollups draw with them; a done percentage draws as a progress bar by default.
- Rows whose parent is missing go to an `orphans:` bucket instead of the top level.
- Drag a row onto another to re-parent it (`reparent: true`) or between rows to re-rank it (`rank:`); `allowed:` can refuse a move.
- `quick_filters:` chips work on trees too.

##### 1.4.1 — 2026-10-12

- The log button is now a feeds menu, with level and text filters.

##### 1.4.2 — 2026-10-12

- APIs from `api/*.yaml` run while the project is open and show in Services with a link, their status and their own log feed; compose services gain port links, Restart and Rebuild.
- A new backend or profile restarts APIs on their ports, keeping the last good version and the feed.
- Editing an action reloads the APIs that expose it.
- An API with no `auth:` entry for the active profile doesn't start; other profiles without one show a warning.
- A container that crashes on start gets a feed; feeds keep following when the stack fails.
- The feeds menu shows each feed's state (`live · 2 clients`, `disabled`); the viewer follows a restarted feed.
- `list_logs` on API and service feeds needs "Allow MCP agents to read data".
- Fix: `list_logs` paging with `since_seq` could skip lines.

Raw file: [changelog-1.4.md](https://vantage-ui.com/changelog-1.4.md)

### Vantage 1.3

11 October 2026

#### Vantage 1.3

An app can now know who is using it. A `user:` block in `application.yaml` names a table of people, and the title bar shows a picker in place of the role icon. The choice is remembered per project, and when the app is signed in, the person with the matching email is picked for you. Pages read the choice as `${user.id}` and `${user.label}`, so a grid can show only the rows assigned to the person at the keyboard.

##### What's new

- `user:` in `application.yaml` adds a title-bar user picker; pages read the choice as `${user.id}` / `${user.label}`.
- `quick_filters:` on `grid` and `kanban` adds toggle chips, each a Rhai `where`, with live counts.
- Starting the app with `--ui-perf` (or `VANTAGE_UI_PERF=1`) turns on a performance mode: two title-bar icons toggle a frame-time HUD and a frame overlay, `perf_stats` reports per-window frame times and slow-frame incidents, and each incident is written to the app's `diagnostics` folder as a line of JSON.
- Fix: a progress bar with a value and no total no longer shows the loading animation.

##### 1.3.1 — 2026-10-11

- Components bind data with `observe:` only; the old `table:` spelling no longer loads.

Raw file: [changelog-1.3.md](https://vantage-ui.com/changelog-1.3.md)

### Vantage 1.2

10 October 2026

#### Vantage 1.2

Pages can show a table as a kanban board. `kind: kanban` puts each row on a card in a lane chosen by one column, such as an order's status, and dragging a card to another lane writes that column back to the datasource. The lanes follow the column's `enum:` values unless the page lists them. With a numeric `rank:` column, cards can be reordered inside a lane as well. On a datasource that takes no writes the board is read-only.

##### What's new

- `kind: kanban` shows a table's rows as cards in lanes by a column's value; drag a card to move it to another lane.
- `rank:` names a numeric column that orders the cards in a lane, so they can be dragged into a new order.
- Each lane has an "Add card" entry, and `wip:` shows a lane's count as a warning once it holds more cards than its limit.
- Double-clicking a card, or pressing Enter on it, runs `on_open:`, for example `open("order", #{ id: row.id })`.
- The playground menu has an Order Board over its orders, which gain a `status` column.

##### 1.2.1 — 2026-10-11

- Fix: MongoDB apps got slower the longer they ran.
- Fix: pages over MongoDB views stalled on open.
- Fix: relation tabs and `ref()` on MongoDB tables.
- `mongo: { view: true }` marks a table as a MongoDB view; `stream_pool_size` sets a datasource's pool for live streams.
- A table's `mongo:` block takes only `view`. `collection:` used to pass and be ignored; now it fails the table.

Raw file: [changelog-1.2.md](https://vantage-ui.com/changelog-1.2.md)

### Vantage 1.1

3 October 2026

#### Vantage 1.1

A major rewrite of the Rhai engine. Until now Vantage ran several separate Rhai implementations, and they disagreed on many things, including the language itself. The language is now one and the same everywhere. Each place a script can appear in your app turns on only the parts it needs, so a form's options can read tables, while an action body can also write to them. This makes background jobs sturdier and greatly extends what the Faker backend can do with sims: live data that changes while you watch. A blog post about it is coming soon.

##### What's new

- `type: memory` is a new datasource holding editable tables in the app, optionally seeded from YAML or JSON files.
- In an action body, `row` saves with `row.save()`, and `table("x")` reads or writes any other table; `table("x").import_from(...)` replaces `tables.x.import_values(...)`.
- `observe:` scripts narrow to a related table with `scenery("t").where("id", id).ref("rel")`, replacing `related(...)`.
- MCP agents can change data when "Allow MCP agents to write data" is on in Settings (off by default).
- Old faker keys such as `effect:` stop the datasource from loading with a message naming what replaces them.
- Fix: a sim that fails while running now shows a toast instead of the table silently freezing.

##### 1.1.1 — 2026-10-03

- Fix: `builtin:pulse` wrote fractional values into whole-number columns.
- Fix: `count()` on a grouped SurrealDB query table showed 0 rows, and deleting a SurrealDB row reported it as missing.
- Fix: `.ref(...)` on faker and memory tables failed with "Unknown reference" in action bodies and MCP data scripts, and `references()` came back empty.
- Fix: a column still using the removed `lazy:` key failed with an unreadable schema error; the error now points to `sugar:`.
- Fix: a faker `fan_out:` over a table on another datasource failed on open with "not a reference column"; the table file now loads invalid with a message naming the datasources.
- Fix: a failed SurrealDB connection logged no reason.
- Fix: MCP `preview_query` rejected short table names that `run_data_script` accepts.
- Fix: every launch logged a false "no datasources connected" warning, and composer-backed datasources logged a connect error while their services were still starting.

##### 1.1.2 — 2026-10-04

- `spawn_sim("name", #{…})` in an action body, wizard worker or MCP data script starts one more faker sim; sim names must be unique across datasources.
- Fix: the status bar stayed empty until a grid was clicked, and its text was hard to read.

##### 1.1.3 — 2026-10-07

- Writes through narrowed tables stay in their set (action scripts, agent scripts, forms); deleting a missing row succeeds; `import_from` reports `rejected`.
- Fix: the status bar counted rows left over from an earlier run as loaded.

##### 1.1.4 — 2026-10-07

- Fix: switching to another app froze the window while memory kept growing.

Raw file: [changelog-1.1.md](https://vantage-ui.com/changelog-1.1.md)

### Vantage 1.0

27 September 2026

#### Vantage 1.0

Along with the first major version comes a new layout engine. Until now every app looked much the same: a menu on the left and pages in tabs on the right. Layouts are far more flexible. Elements can be placed where you want them, more zones are available, and any of them can be hidden entirely. A dedicated blog post will follow once the engine settles. Apps can also sign in to an API for you through `oauth2_login`, keeping the tokens in the project's `.env`.

##### What's new

- `sugar:` on a grid, list, chart or record adds columns computed by a Rhai script, never stored.
- A button's `enabled:` can follow the grid selection, a grid's `double_click:` runs a button, and `navigate()` opens a page in a new tab.
- Record page titles can use `${record.name}`.
- Form fields marked `masked: true` hide their value behind a show/hide toggle.
- REST tables with `pagination:` load the whole collection page by page as you scroll.
- Fix: scrolling over a map zoomed it and scrolled the page at the same time.

##### 1.0.1 — 2026-09-29

- An app can choose its window layout: add `layout/<name>.yaml`, name it with `layout:` in `application.yaml`, and pick the first page with `home:` and a welcome pop-up with `intro:`.
- A layout places a menu, icon rail, tree or vertical tabs on the left, panels on the right and bottom, a status bar, and a title row with a page selector and a tray of compact icons.
- Pages open in tabs, one at a time, or in a stack with Back; pop-ups open as a modal, sheet or drawer, and a side panel can follow the row you click in a grid.
- Grids fill the page, colour rows and cells, show progress bars and times such as "in 4 min", and open a compact drawer under the selected row.
- Fake datasources can run live scenarios: a flight board with aircraft in the air, and scripted sims that book, move and deliver records while you watch.
- Editing a layout file applies at once and keeps open pages where they still fit.

Raw file: [changelog-1.0.md](https://vantage-ui.com/changelog-1.0.md)

### Vantage 0.42

17 September 2026

#### Vantage 0.42

REST and GraphQL datasources now cope with a server that is slow or failing. A request you are waiting on retries by itself, and a background refresh that fails keeps the rows already on screen instead of emptying the grid. Each datasource carries a four-bar indicator in the title bar with its request rate beside it: amber when calls are failing or a response is slow, red when the source is down. Going down and coming back earns one toast each, rather than an error per request.

##### What's new

- Hover a datasource's indicator for the last minute in full: latency, requests in flight, failures, the last error, and whether Vantage is easing off to let the server recover.
- `max_connections` caps parallel requests to a datasource and `rate_limit` bounds them per second.
- Name an API's sort parameter (`ordering: { param: ordering }`) and grids ask the server for their order, so the first page is the real top and new records surface there on the next refresh.
- Fix: actions run after switching projects used the previous project.
- Fix: a terminal action pointed at a missing folder says so, rather than opening in your home directory.
- Fix: some coloured labels showed raw text like `#{"color": "danger", …}` instead of the label.

##### 0.42.2

- A project switch, Quit or Ctrl-C with services running shows them stopping while the window stays usable. A datasource that is slow to connect no longer freezes the window either.
- An `http_request` URL can name a `composer.yaml` service (`http://api:8080/…`), as a datasource URL already could.

##### 0.42.3

- Hover the Update button in the title bar to read the release notes of the version it offers.
- Fix: markdown broke a line wherever its source wrapped, in the release notes and on pages.

Raw file: [changelog-0.42.md](https://vantage-ui.com/changelog-0.42.md)

### Vantage 0.41

14 September 2026

#### Vantage 0.41

"Connect your data" opens a comparison of every driver the free build ships against what Enterprise adds, and one click continues into a wizard. Pick your data sources and each gets a step of its own. CSV and SQLite files are copied into a `data/` folder inside the project, gitignored. A database can be one you already run — address and credentials go to the project's `.env` and are never committed — or Vantage can run it for you, writing a loopback-only `composer.yaml` service with its data on a named volume and starting it from the Services panel. Nothing is written until you press Finish.

##### What's new

- `${VAR}` references from `.env` work in every driver's connection field now — postgres, mysql, mongo, REST, GraphQL, SQLite and CSV paths included — and a connection error logs the reference, never the secret.
- The "no datasource" banner, the datasource panel's Add button and the setup screen all open the same wizard. The old add-datasource form stays, for editing what exists.
- Every project gets the full skill set, installed on create and refreshed on every open, instead of a per-backend pick.
- The AI setup screen is three steps: configure data, open the folder in your agent, and watch the three signals confirm it works.

##### 0.41.1

- The bundled skill set was rebuilt against Vantage itself: a build order that puts real data on screen within minutes, a quality checklist for colours, money, dates and icons, verification and debugging guides, and a skill for each of the 13 data sources. An agent that can't build something now says so and writes it to `FEEDBACK.md` for you to send, and it opens the page it is changing in your Vantage window so you watch each edit land.
- Fix: a project with its own database could open to "datasource offline" just after Vantage started the stack, because the container's port answered before the database behind it was ready. Vantage waits for the service's own health check.

##### 0.41.2

- Sidebar sections fold, one open at a time, and the page list scrolls, so a long menu no longer runs under Project Settings.
- `menu: { placement: native }` in `application.yaml` moves your pages into the macOS menu bar — one menu per section, submenus for nested ones — and takes the sidebar away.

Raw file: [changelog-0.41.md](https://vantage-ui.com/changelog-0.41.md)

### Vantage 0.40

14 September 2026

#### Vantage 0.40

Put a `composer.yaml` next to `application.yaml` and Vantage runs your project's database for you. A layers button in the title bar brings the stack up, shows each service's health, ports and live log, and puts it away again. Quit Vantage and the containers stop; open the project again and they resume, data intact. Docker Desktop, colima and OrbStack all work. A service can take an ephemeral loopback port and the datasource just names the service (`surrealdb:8000`), so Stable and Nightly run the same project side by side, each with its own containers. A setup wizard step can embed the services panel, which makes "install, start the database, seed it" three presses of Next.

##### What's new

- While an action's command runs, the dialog offers "Run in background", and Close asks stop-or-continue instead of killing the run. A backgrounded job sits under Jobs on the Services sheet with a live log and a Stop button, counted in the title-bar indicator ("1/1 +1").
- `kind: button` runs an action from anywhere on a page, and any button — page or grid toolbar — takes `color:` (a theme name or `#hex`) and `size: xs`.
- A select over a table publishes the value it shows, so tiles narrow through `.args(#{ … })` and a "Promote"-style button carries the same pick into its form. A grid's filter chip prefills it the same way.
- `x_label:` formats each chart tick with a one-line script, and a repeated label shows only once, so a live 30-second ticker labels each minute exactly once. An all-zero chart draws a flat zero rather than nothing.
- `sub:` puts dimmed context under a list row's text, and long rows clip with an ellipsis instead of wrapping over their neighbours.
- A `bool` field renders as a checkbox, and `widget: checklist` turns `choices:` into tickboxes, submitted comma-joined.
- New MCP tools report service status, tail service and action logs, and — when you allow it — start or stop the stack.

##### 0.40.1

- Fix: naming a new project could land you in a `my-app-2` folder, because the location picker's "New Folder" had already created the one you named. The name you type is the folder you get.

Raw file: [changelog-0.40.md](https://vantage-ui.com/changelog-0.40.md)

### Vantage 0.39

10 September 2026

#### Vantage 0.39

A funnel button beside a grid's search box opens a small form: fill in what you want, press Apply, and each filter appears as a chip you can take off one at a time. Say `filter: shop, "~name", ">total"` on the page and you get a field per column — a picker where the column has a fixed set of values, a text box otherwise. The `~` means "contains" and `>` means "more than"; leave the mark off and you can type one into the field yourself (`>30`, `~smith`). Come back to the page later and the filters you left on are still there, still shown as chips, so it's always clear why you are looking at fewer rows.

##### What's new

- Point `filter:` at a form you wrote, plus a short script that turns its answers into conditions, for a date range or one question that narrows two columns at once.
- The same `grid.filter(…)` works from a toolbar button or a right-click action, so "only overdue" or "just this row's shop" is one click.
- `kind: markdown` renders a document — headings, tables, lists, code. With `text:!include../README.md` the page and the file can't drift apart.
- A column can carry an `expr:` again, so a table can show a total or a balance the database works out on every read without giving up editing. 0.38 removed this; it turned out to be the only way to do it.
- Buttons declared in `toolbar:` sit next to Add and Delete, and look like them, instead of on a strip above the table.
- Fix: prices showed as plain numbers on any page that lists its columns, losing the pound sign and the pence.
- Fix: a negative price read `£-1.40` instead of `-£1.40`.

Raw file: [changelog-0.39.md](https://vantage-ui.com/changelog-0.39.md)

### Vantage 0.38

10 September 2026

#### Vantage 0.38

Every script in your YAML now runs on one engine — bindings, guards, labels, actions, workers and the data layer's query builders, all on the same rules. What you see of that is scripts reading the page directly: `scenery("order").where("bakery", bakery.value)` rather than quoting it as `"${bakery.value}"`. Existing pages need the quotes removed, because a quoted read now compares against that literal text. List rows became templates in the same move, so a list's `text:` and `label:` are ordinary text with `${ … }` holes and a bare expression like `text: member` needs the wrapper.

##### What's new

- `worker:!include import.rhai` keeps a long script in its own file beside the YAML that names it; `!include part.yaml` splices YAML the same way. An included file can't reach outside the project, and editing it reloads the page.
- Braces inside a hole work: `${ if x > 1 { "many" } else { "one" } }` is one hole, and so is a `#{ text, color }` map.
- Every script has a time budget — small on the UI thread, larger for workers and actions — so an accidental infinite loop ends with an error in the log instead of a frozen window.
- The bundled schemas mark every scripted field, and a `# language=rhai` comment above a script block gives JetBrains and VS Code Rhai highlighting inside the YAML.
- Removed, none of them used by any project: column `render:`, `copy:`, `expr:` and `lazy:`, table `expressions:` and `unit: { rhai: … }`, and a reference's `rhai:`.

Raw file: [changelog-0.38.md](https://vantage-ui.com/changelog-0.38.md)

### Vantage 0.37

2 September 2026

#### Vantage 0.37

An action can be a multi-step dialog. `kind: wizard` takes a list of steps, each one an ordinary page body — pick a file, check a preview grid, fill in a form — with a rail on the left showing where you are. Back keeps what you typed, and Cancel leaves nothing behind, because nothing is saved until you say so. A step can run a `worker` script beside its page and show the step's variables live, so a long import moves a progress bar row by row with the figures next to it ("1,240 / 5,000") instead of freezing the dialog. Cancel stops it mid-import, leaving whatever had been written; a failure holds the step and offers Retry. A later patch gave that worker a time ceiling, so a runaway loop fails the step rather than keeping it busy forever.

##### What's new

- The `csv_file` step component opens a file picker and turns the file into a table you can preview and import from. Ids come from a column of your choice and leading zeros survive; a duplicate code is refused, by line number, before anything is written. `tables.<name>.import_values(...)` reports how many records it created, how many were already there (never overwritten), and whether you stopped it.
- Three new page components: `button` runs a short script on click, `progress` draws a bar over two live values, and `log` shows timestamped lines as they arrive, keeping the newest in view unless you have scrolled up.
- A wizard can hold an unsaved record that several steps edit (`servo:` on a form), and `params.fields` picks which columns each form shows. Such a form has no Save button of its own — the wizard's Next is the save.
- Fix: a save the database rejects says why ("Expected `int` but found `NONE`") instead of "default write failed".
- Fix: actions opened after signing in could report every table as offline.
- Fix: on a new record, picking a related row stored its id as text instead of a link, and a date set by a script was stored as nothing at all.
- Fix: closing a wizard with Escape left its background work running.

##### 0.37.1

- Fix: `${ if x { "a" } else { "b" } }` read only as far as the first `}`, so it never compiled and the value never appeared. Braces nest now, and a brace inside a quoted string counts as text.
- Fix: a failed expression pointed at the first line of the value rather than the spot that broke.

Raw file: [changelog-0.37.md](https://vantage-ui.com/changelog-0.37.md)

### Vantage 0.36

25 August 2026

#### Vantage 0.36

A page's `kind: select` is a real dropdown now: searchable, filled either from a `query:` block of its own or lazily from a whole table, and narrow enough that a filter bar of four of them fits on one line. `appearance: chips` brings the old chip look back as a proper segmented control. What those filters feed is the other half of the release — a binding can hand named values to a query-sourced table, `scenery("revenue").args(#{ region: r })`, and the table's `rhai:` script reads them from the `args` map. The slice is narrowed before it is aggregated, so KPI totals, deltas and sparklines all recompute rather than being filtered after the fact.

##### What's new

- A select with `observe:` fronts a whole table lazily: nothing is fetched until the menu opens, scrolling pulls the visible window, and typing searches on the server, so a picker over 500,000 people costs nothing until you use it. `params.column` names the display column, `params.placeholder` the closed-face prompt, and the picked row's id publishes as `${name.value}`.
- Stat tiles became KPI cards: a value from the data (`column:`) instead of a row count, an `icon:` in the corner, an accent `color:`, a trend strip under the number (`spark:`), and a change line like "▲ 4.5% vs June" whose colour follows the meaning — `change_good: down` paints a growing cost red.
- A line chart with `group:` draws one line per distinct value of that column, the top 8 by total, with a legend underneath, so a per-entity chart needs no hand-pivoted columns. `chart_type: stacked_bar` stacks series into monthly columns, and `palette: { colors:... }` pins exact series colours.
- A label with `observe:` and `column:` shows a value your query formatted — a panel subtitle like "8 title tiers · 500,000 employees · 245,315 active" with no client-side arithmetic. Labels also take `style: heading | muted` and an `icon:`.
- `search: true` on a `kind: grid` puts a quicksearch bar above the table: on the server where the backend can do it, over an eager cache where it can't, and hidden where neither would be honest.
- `when:` conditions are real expressions: `when: 'tab.value == "Details"'`. A text-form gate used to render to a non-empty string and count as always-true, so a page that relied on that needs the expression form.
- Postgres tables match SQLite now — case-insensitive quicksearch, declared page sizes, paged and cursor fetches — which is what used to make Postgres grids trickle-load in small chunks. Postgres also joins the datasource wizard.
- Fix: changing a filter scrolled the page back to the top.

##### 0.36.1

- Fix: the recent-projects list showed several identical "inventory" rows, one per app keeping its catalog in a folder of that name. Names that clash grow a parent folder until they read apart — `bakery/inventory`, `space/inventory`.

Raw file: [changelog-0.36.md](https://vantage-ui.com/changelog-0.36.md)

### Vantage 0.35

16 August 2026

#### Vantage 0.35

GraphQL apps read nested data now: a column can point at a field buried inside another object, and APIs that wrap their rows in a paged envelope load. Tables also state what their endpoint supports, so sorting and searching run on the server where it can do them and locally where it can't.

##### What's new

- A summary tab can carry a button that opens a link in your browser, to jump from a row to the same record in the system it came from.
- A table can name its own column headings, so they read properly on screens with no page behind them to set one — a master/detail relation tab, for instance.
- A master/detail screen can drop the record form when the data is only ever read.

##### 0.35.1

- A colour rule can end in `*` to cover every label sharing a prefix, and the colour then replaces the prefix on the tag, so a row reads `api dev back` rather than `component:api environment:dev team:back`. An exact rule still wins.
- Fix: a column holding several labels showed them as one tag with the values run together.

##### 0.35.2

- Your agent can ask what Vantage would send for a table — the SQL, the GraphQL document, the command a CLI-backed table runs — without running it, which is usually faster than narrowing an empty or over-full grid down a row at a time. It works with "Allow MCP agents to read data" switched off, since it shows the question and never your data.

Raw file: [changelog-0.35.md](https://vantage-ui.com/changelog-0.35.md)

### Vantage 0.34

8 August 2026

#### Vantage 0.34

Until now every person opening a shared app had to be handed its passwords and paste them into a file of their own, where they sat in plain text next to the app and let anyone who had them see everything. An app can now keep its credentials centrally. Opening it asks you to sign in once: your browser opens, you pick your work account, and the app fills in and connects; later launches don't ask again. Access is decided per credential by whoever administers your organisation's accounts, so if your team can reach the mailing system but not the customer database, the pages built on the mailing system work and the others say so.

##### What's new

- Where a service accepts it, Vantage connects as the signed-in person rather than through a shared password, so the service's own logs name who did what and there is no password to rotate.
- Sign Out of Work Account is in the Vantage menu.
- If a published app update needs a newer Vantage than you're running, the app keeps working on the version it has and tells you to update Vantage first, instead of loading screens it can't read.
- Fix: credentials no longer leak into the terminal pane. A command you run from an app can't read its passwords out of the environment, and switching apps doesn't leave the previous app's credentials behind.

##### 0.34.1

- Fix: nightly and custom-built copies of Vantage refused app updates that named the version they were already running.

##### 0.34.2

- An app can offer an operation whose fields come from the operation itself rather than from the app's configuration, so you get the right boxes in the right order, and they stay correct when the operation changes.
- Fix: an action that failed said nothing — the dialog closed and looked exactly like success, so an email that never sent passed for done.

##### 0.34.3

- Actions run in front of you: press Run and the dialog stays put, with a spinner and then whatever the operation reported. A failure shows the reason with a button to copy it, and Back returns you to the form with everything you typed still in it.

##### 0.34.5

- On an app that keeps its credentials centrally, the account sits under the app name in the sidebar, and reads "Not authenticated" in warning colour when the app wants a sign-in it hasn't got — which explains every empty page above it. Signing in and out moved to the switcher dropdown beside it.
- Fix: pages open when you signed in kept showing their errors, and pages open when you signed out kept showing their data. Both now rebuild.
- Fix: two copies of Vantage open on the same app fought over one row cache, and the second reported every table as unavailable. Each copy keeps its own.
- Fix: signing in to one app signed you in to another using the same account settings. Each app on each copy of Vantage holds its own now, so you'll be asked to sign in once more after updating.

##### 0.34.6

- Fix: columns a page hides, columns worked out from other columns, and read-only fields all turned up as editable boxes on a record form, and a field with a default value came up empty on a new record.

##### 0.34.7

- Fix: in an app built into Vantage, dates showed as blank cells or a long run of digits, a cell holding a list or a nested record looked empty, and the rows attached to a record lost that table's own column names, widths and formatting.

##### 0.34.8

- Check for Updates names the version you're on when there's nothing newer, and gives the reason when the check couldn't be made. A check that runs on its own and finds a new version now tells you, once per version.

##### 0.34.9

- A table can leave its Add button out, for pages whose rows only ever appear because you ran an operation.

Raw file: [changelog-0.34.md](https://vantage-ui.com/changelog-0.34.md)

### Vantage 0.33

7 August 2026

#### Vantage 0.33

Vantage has always kept itself up to date; the apps you open inside it did not. A change someone made this morning reached you only if they sent a link and you installed over the top of what you had. An installed app now remembers where it came from and fetches its own updates. On enterprise builds it checks when you open it — a short "checking for updates" screen with an Open anyway button if you'd rather not wait — and every ten minutes after that. The update button in the title bar swaps the changed files underneath the running app, so pages redraw where they stand and nothing restarts.

##### What's new

- The apps under "Open an example" are fetched when you open the picker, so newly published ones appear without waiting for a new Vantage. Offline you get a short built-in list.
- Re-installing an app replaces only the published files. A local database, a `.env`, installed skills are left alone, and Vantage names any published file you had edited and asks before overwriting it.
- Enterprise builds carry their own name in the window, Dock and About box, their own icon, their own update channel, and a settings folder of their own, so they sit beside a standard Vantage without either disturbing the other.
- An action can declare its dialog in YAML as before and on confirm run a routine compiled into the app, and a build can carry a model written in Rust whose tables screens use with no table file describing each one.

Raw file: [changelog-0.33.md](https://vantage-ui.com/changelog-0.33.md)

### Vantage 0.32

7 August 2026

#### Vantage 0.32

Search comes back. 0.31 took it away because it only ever looked at the rows already sitting on your machine and presented that as the whole answer. It asks the data source now: type in the box above a grid and the rows narrow as you go, with the question going to the source on a large table and staying local on a small one that is already loaded in full. Where a source can't be asked, the box isn't there, so a search result is either the real one or nothing pretending to be it.

##### What's new

- Reference dropdowns search the same way and under the same rule. Each one searches on its own, so filtering one doesn't disturb another on the same form.
- A dropdown over a large table shows its first options straight away and fetches more as you scroll, with placeholders in the rows that haven't arrived.
- Re-opening a grid whose rows are cached draws them directly instead of flashing a skeleton first. The loading placeholder appears only when there's a real wait.

Raw file: [changelog-0.32.md](https://vantage-ui.com/changelog-0.32.md)

### Vantage 0.31

27 July 2026

#### Vantage 0.31

Search is gone from grids and dropdowns. It only ever filtered the rows already loaded on your machine, so on a large table it quietly searched a slice of your data and presented the result as if it were all of it — narrower than what you asked for, with nothing to tell you so. Filter buttons and column sorting are unaffected, and search returns once it can put the question to the datasource instead of guessing locally.

##### What's new

- The search box is gone from data grids and reference dropdowns. Use the filter buttons above a grid to narrow rows, and the column headers to sort.
- Fix: on framework pages, a record's id could show as a chunk of raw machine text.
- Fix: timestamps stored as whole seconds showed as a bare number in page elements, while the same value read correctly in a grid cell.
- Fix: the same expression could print `3` in one place and `3.0` in another.

##### 0.31.1

- Fix: a grid could open empty and stay empty, then fill instantly if you clicked the same menu item again.
- Fix: a grid showed "no rows" for a moment before its rows arrived, and figures on a dashboard could sit at zero on a first run and never move.

##### 0.31.2

- `debug: true` on a data source, with Vantage started from a terminal, prints a line for every request it sends, every batch of rows it stores, and every screen it paints without asking the source at all, plus a summary when you quit. Only the source you marked says anything.
- Fix: sorting a large table could put the wrong rows at the top — rows you had already scrolled past, re-ordered among themselves, instead of the true first rows of the sort.

Raw file: [changelog-0.31.md](https://vantage-ui.com/changelog-0.31.md)

### Vantage 0.30

27 July 2026

#### Vantage 0.30

Two things this release, and they meet in the middle. A page can follow a single record instead of a whole table, so a row opens into a screen built for it: a row action opens one for the row you clicked, the sidebar can link straight to a specific record, and Vantage holds the page behind a spinner until the record is fully loaded rather than showing you a half-drawn screen. And a page can host a widget Vantage doesn't ship. Drop a plugin into your project's `plugins` folder and any page can place it. The first one is a real map, which arrives as a separate download rather than weight in the app.

##### What's new

- A map drags to pan and scrolls to zoom with the momentum you expect. Give it a GPS trail, a boundary or a point of interest and it draws that over the basemap, then frames the view on it.
- A widget whose plugin isn't installed shows a note in the space it would occupy rather than breaking the page. Plugins can also add functions your pages call.
- Opening a second record reuses the same tab instead of piling up, unless you pin it, in which case the next one opens alongside.
- A data page can offer named filters as buttons above the grid — click to narrow, click again to clear. They read as chips you can dismiss, and they work on computed columns as well as stored ones.
- A table can borrow columns from another data source and show them beside its own, a file store's contents next to a database's records. They fill in as they arrive and sort, search and filter like any other column.
- Pages gained an image element that renders a picture from a path, a labelled divider, and framed columns that draw as cards.

##### 0.30.1

- Fix: a table borrowing columns from another source made rows jump order for an instant while you scrolled, and kept re-asking about rows the other source had nothing for long after it had finished loading.

Raw file: [changelog-0.30.md](https://vantage-ui.com/changelog-0.30.md)

### Vantage 0.29

27 July 2026

#### Vantage 0.29

Dates and times read like dates and times. A date column no longer shows a raw `2027-07-22T20:26:13.902258674Z` — it renders as a clean date and time, and you pick per column how much of it to show: full timestamp with milliseconds, date and time, date only, or just the year. The stored value keeps its full precision either way, so hiding the seconds doesn't throw them away and the same column can read year-only on an overview grid while a detail view shows the lot.

##### What's new

- Editing a date field gives you a text box with a calendar button beside it. The year caption jumps years fast, which helps for birthdays and anything far in the past.
- A date copied out of an email or a spreadsheet pastes straight into the field without matching its format: `July 22, 2027`, `07/22/2027`, an ISO timestamp or a bare year all get understood and tidied up.

##### 0.29.1

- A field that packs several values — a contact with its email and phone, a nested record — reads as one line, `Peter O'Mahony <peter@example.com>, +353…`, and right-click copies just the part you point at instead of the whole cell.

##### 0.29.2

- Custom form layouts: drop a `form/<name>.yaml` into your project and point a page at it (`form: <name>`) for titled sections, fields side by side, multi-column spreads and a notes box across the whole row. The same layout drives the details panel and the add/edit dialogs, and the column count follows the space available — three in a wide tab, one in a narrow side panel.
- A section with `when: 'record.kind == "company"'` appears only while the condition holds, and hidden fields stay out of the save.
- A failed save keeps your edits and shows the server's message under the field it rejected. Changed fields carry an `edited` tag, the footer counts them, and Revert puts everything back. Enter submits from any single-line field, and a new record takes its identity when the form opens, so retrying Create after a network hiccup updates that record instead of adding another.

##### 0.29.3

- Tables update themselves. A colleague editing a record, a script loading a batch, another system writing in — it appears on screen within about a second, in grids, detail tabs and the lists inside them. This works wherever your database can announce its own changes; SurrealDB projects get it with no setup and everything else refreshes as before.

Raw file: [changelog-0.29.md](https://vantage-ui.com/changelog-0.29.md)

### Vantage 0.28

23 July 2026

#### Vantage 0.28

You can edit, add and delete records from any data page. Open a record's details and change it: Save writes only the fields you touched, Revert puts them back, and the footer counts your unsaved changes as you type. Fields you haven't touched keep tracking live changes from the data source while the form is open, so nothing goes stale under you, and creating is safe to fumble — clicking Save twice can't produce a duplicate. A round of performance work went with it. The app's working cache used to live in your project folder, where iCloud could evict it to the cloud and leave the app locked up re-downloading it mid-click; it now lives in the system cache folder.

##### What's new

- A column that references another table renders as a searchable dropdown of that table's records, and a column with declared `enum:` values becomes a dropdown of exactly those choices.
- A grid column showing a value from a related record — an author's name on a books table — can declare a link, so clicking the value jumps to that record.
- Fix: closing a page releases everything it was holding, instead of accumulating data pipelines, caches and watchers until you restart.

##### 0.28.1

- Fix: creating a record on a plain SQL table with an integer id column failed silently, and saving a value picked from a reference dropdown could crash the app.
- A failed save or delete shows a full message with a copy button, and the delete confirmation waits for the outcome — a record other rows still point at says so ("Cannot delete — referenced by: books").
- Add and Delete lead the toolbar with labels and icons, drilling into related records shows a filter chip you can dismiss to see the whole table, and the `icon:` set grew from about 100 to 300+ Lucide icons.
- New projects land in `~/Vantage`, out of `~/Documents` where iCloud eviction kept freezing cold starts.

##### 0.28.2

- A reference dropdown names the linked record the instant the form opens rather than sitting blank while a long list loads, fetches its choices when you open it, and filters as you type.
- Fix: a form could show one unsaved change on a reference field that you never made, and blank the reference on Save.

Raw file: [changelog-0.28.md](https://vantage-ui.com/changelog-0.28.md)

### Vantage 0.27

21 July 2026

#### Vantage 0.27

A table column can show more than what's stored: a value from a related record — a batch's name beside each tag, a course name beside each booking — or one worked out from the row, without putting it in your database. This works on SurrealDB, SQL and REST. Timestamps in summary and detail views read as "2 days ago" or "15 Jul 14:32" rather than raw machine strings, and every value on screen is selectable, with double-click to copy it whole and a copy icon beside the ones you reach for most.

##### What's new

- A dashboard stat can show how it has moved recently — a green "+3" or a red "−2" beside the number, with a tooltip explaining the window.
- Pie and donut charts shrink to fit their tile as the window narrows instead of spilling over their neighbours, and a tall dashboard scrolls.
- SurrealDB datasources can authenticate at the namespace level, which is what a hosted SurrealDB Cloud instance expects.
- REST datasources can read auth tokens and credentials from environment variables instead of hard-coding them in the project, and send fixed query parameters on every request.

##### 0.27.1

- Fix: the Mac disk image now opens an installer window asking you to drag Vantage into Applications. Running it from the read-only image is what quietly blocked in-app updates.
- A connect-your-data card for a backend that needs a stored credential has a button straight to the secrets editor.

Raw file: [changelog-0.27.md](https://vantage-ui.com/changelog-0.27.md)

### Vantage 0.26

17 July 2026

#### Vantage 0.26

Opening Vantage with no project no longer leaves you on an empty screen in a hidden folder. You get a splash with three ways in — connect your own data, try a playground of sample data, or open a downloadable example — plus a wide button for a project folder you already have, including one you just cloned from git. Creating a project isn't a separate step any more; it happens as a side effect of picking what you want to do, and everything Vantage creates lands in `~/Documents/vantage`. The splash stays one click away under "Welcome / New Project" in the project switcher.

##### What's new

- "Try with sample data" builds a courier-service playground — a live delivery board, cities, orders, customers and couriers — out of generated data, with no install, network or account.
- A project running on fake data keeps a slim banner up saying so, and a project with no datasource that connects gets one pointing at the fix. Each hands you off to your AI agent in one click.
- The AI path no longer asks you to pick data kinds first. Name your app, press Start, and you land on a three-step guide: open the folder in your agent, say what you want, watch your first datasource appear. Skills for every backend are pre-installed.
- A picker lists curated examples (Bakery, Launch Control, Periscope) and runs them through the same download-and-review installer as website links.
- A fake table whose columns reference another table points at real rows there, so drilling from a customer into their orders works on sample data the way it does on a live database.

##### 0.26.1

- Projects you create come pre-wired for your AI agent: the app's feedback loop is connected, and the everyday data commands (SQLite, Python, the database CLIs) are pre-approved, so the agent builds instead of stopping for a permission prompt at every step.
- A project whose folder you deleted or moved drops off the recents list on its own, and opening the app lands you on the welcome screen rather than trying to reopen it.
- Fix: a project created through the connect-your-data or sample-data path could end up impossible to reopen.

##### 0.26.2

- The bundled agent instructions were rebuilt around showing results first: a couple of opening questions, then a working page in your menu, refined in later passes once you can see real screens. They also describe pages, dashboards, actions and column styling as they work today, so agent-built apps validate on the first save far more often.
- SQLite is a first-class scenario in the connect-your-data picker — a local single-file database, no server, no credentials — and the agent grows it one table at a time, asking first about anything that touches data you already have.

##### 0.26.3

- A table can be defined by a query on SQLite, Postgres and MySQL as well as SurrealDB: grouped totals, top-N rankings, filtered worklists, or a variant of another table. Dashboards chart these directly, with no views or stored procedures in your database.

##### 0.26.4

- The welcome screen's "Connect your data" card shows where the project will be created, with a folder button to pick somewhere other than `~/Documents/vantage`. The location you pick is remembered for every project after it.

Raw file: [changelog-0.26.md](https://vantage-ui.com/changelog-0.26.md)

### Vantage 0.25

16 July 2026

#### Vantage 0.25

A SurrealDB data source used one shared database password. It can now reach a hosted instance and sign you in through your browser instead.

##### What's new

- Signing in goes through your own identity provider, Google via Auth0 for example, and the data source connects with the token that comes back. The login is remembered and the next launch reconnects on its own.

##### 0.25.1

- Fix: SurrealDB record IDs and timestamps could show up blank or as raw numbers.

Raw file: [changelog-0.25.md](https://vantage-ui.com/changelog-0.25.md)

### Vantage 0.24

16 July 2026

#### Vantage 0.24

A path-shaped source can be browsed like a file manager. The new `finder` component puts a breadcrumb and an expandable folder tree beside the selected folder's listing, with humanised byte sizes and Finder-style timestamps. Expanding a folder opens just that path's data and collapsing it closes it again, so a deep tree stays light.

##### What's new

- Pointed at a live source, the listing moves on its own as files come and go.
- The selected path is published for the rest of the page to read.

Raw file: [changelog-0.24.md](https://vantage-ui.com/changelog-0.24.md)

### Vantage 0.23

16 July 2026

#### Vantage 0.23

The key that points a grid, stat or chart at its data is now `observe:`. `observe: launches` reads like what it does, and the editor's autocomplete follows suit. Existing pages keep working — the old `table:` spelling is still accepted.

##### What's new

- A stat can carry a `project:` formula that keeps its number gliding between data updates, so altitude climbs on velocity instead of jumping once a second. The projection corrects itself whenever fresh data lands, and freezes at the last honest value if the feed stalls.

Raw file: [changelog-0.23.md](https://vantage-ui.com/changelog-0.23.md)

### Vantage 0.22

4 July 2026

#### Vantage 0.22

Every page runs on one page language. A page is a `body:` list of components — grids, charts, lists, forms, selects, binders — nested in rows and columns. That grammar gained everything the old `elements:`/`layout:` format could do, and the old format no longer loads; a page still written that way shows a clear error naming the file. Every bundled example ships migrated, and the YAML editor's schema hints describe the real grammar instead of flagging valid pages.

##### What's new

- The master-detail screen was rebuilt: arrow-keying through rows re-targets the tabs without reloading the page, the details form fills in place instead of blanking first, and the split between grid and tabs is draggable.
- `refresh_interval` on a grid, crud or binder re-pulls on that cadence. New rows float to their sorted spot, and an unchanged pull repaints nothing.
- A select can take its options from a table, with an "All" entry, and chart bindings can narrow on it — pick a namespace and the pod charts re-scope while the cluster-wide ones stay put.
- Clicking a relation cell or "Related →" opens the target page narrowed to the reachable records, from any page, including chained walks such as namespace → deployments → pods stacked on one page. Re-selecting a row you've visited is instant.
- A datasource or table that reads anything other than `profile.*` or `secret.*` in a `${...}` placeholder is flagged at load time, so switching profiles swaps every connection detail cleanly.

Raw file: [changelog-0.22.md](https://vantage-ui.com/changelog-0.22.md)

### Vantage 0.21

3 July 2026

#### Vantage 0.21

A new `faker` data source lets you try Vantage without a backend to wire up. Add one from the datasource dialog and its tables fill with synthetic rows — names, emails, cities, amounts. A table can sit still or run live, with rows appearing about once a second and expiring a few seconds later, so you can watch grids, lists and charts react. It suits a demo, or trying a dashboard layout before the real data lands. The rest of the release is sorting and live-data behaviour.

##### What's new

- Where your data source can sort, Vantage lets it: the order is applied where the data lives and the grid shows the result, instead of re-sorting everything on your machine. The built-in sorting handles more cases too, including numeric columns that used to sort oddly.
- When rows shift under you on a live feed or after a refresh, the highlight stays on the item you picked as it moves. If the item is gone, the selection clears rather than jumping to whatever slid into its place.
- A pie chart can be ordered, so its slices come out in a sensible sequence instead of the order the data happened to arrive in.

Raw file: [changelog-0.21.md](https://vantage-ui.com/changelog-0.21.md)

### Vantage 0.20

29 June 2026

#### Vantage 0.20

Vantage talks to Kubernetes. Add a Kubernetes datasource and browse your cluster's resources — pods, deployments, nodes and the rest of the API — as plain tables, the same way you'd browse any other data source. It connects through your current kubeconfig context, and a table can be pinned to a single namespace. A later patch made a page's default sort actually order the rows, rather than only lighting up the header arrow, even where the data source can't sort on its own.

##### What's new

- A page that opens already sorted shows the up/down arrow on that column straight away, so it reads as though you had clicked the header yourself.
- Fix: a data source that briefly failed to refresh could snap the grid back to an older cached version. Rows hold steady now when a fetch doesn't come through.

##### 0.20.1

- Drilling into a related tab or opening a table no longer freezes while everything loads. The page appears straight away and fills in as the rows arrive, even when the source is slow or briefly down.

##### 0.20.2

- Fix: a date in the future read "3 months ago" instead of "in 3 months".

##### 0.20.3

- Fix: on a live table, a refresh reshuffled the rows into the source's order before snapping back to your sort. A new or changed row now settles into place without the rest of the list jumping.

Raw file: [changelog-0.20.md](https://vantage-ui.com/changelog-0.20.md)

### Vantage 0.19

27 June 2026

#### Vantage 0.19

A record can carry a custom Summary tab: a read-only dashboard you lay out in YAML and bind to the selected row, sitting alongside the usual Details and relation tabs. Headings, stats, status badges, progress bars, a countdown and lists of related rows, arranged in columns — and a single bad field shows a small inline error rather than taking down the whole tab. The launch-control example uses it to show a launch coming together live.

##### What's new

- The tab refreshes as its data changes, and timed elements keep moving between updates: a countdown ticks down smoothly, and readouts for speed, altitude and downrange carry forward so the numbers climb instead of jumping each time the server reports.
- A tab can list a record's related rows — the crew on a launch, the payloads on a flight — each as a row of labels and badges that updates as that data changes.
- A number with a unit reads the way you'd say it: 26,500 kg as 26.5 t, 6,400 m as 6.4 km.

Raw file: [changelog-0.19.md](https://vantage-ui.com/changelog-0.19.md)

### Vantage 0.18

22 June 2026

#### Vantage 0.18

A form dropdown can build its list from a live query. Give it an `options:` script — a short Rhai snippet that builds a table query, with conditions and references, and returns the rows as the choices — and pick the label and id columns the way you would for a static reference. The dialog opens immediately, with a spinner on each scripted dropdown while its query runs. When the script reads another field on the same form, that dropdown re-runs the moment you change the field it depends on, so a Country dropdown can drive a Cities one with no extra wiring.

##### What's new

- Fix: an HTTP action that failed dumped the raw JSON response body into the toast. It now shows the server's own message — the `detail`, `message` or `error` field — so you read "rocket configuration X does not belong to agency Y" instead of `{"detail": "..."}`.
- Fix: a dropdown's options could be empty until you had opened the referenced table in its own tab. Dropdowns read straight from the datasource now.

##### 0.18.3

- Fix: a multi-line value in a table cell or a form field — a JSON blob, a stack trace — crashed the app. Such values are flattened to a single line wherever they are rendered.
- Fix: a `cmd`-backed table with a per-row `detail` script showed only its first 100 rows, then re-ran the whole CLI to fetch the next page.

Raw file: [changelog-0.18.md](https://vantage-ui.com/changelog-0.18.md)

### Vantage 0.17

20 June 2026

#### Vantage 0.17

A grid on screen refreshes itself every few seconds, but only while its tab is the active one, the window is focused, and you have interacted recently. Switch away or step out for a minute and it pauses; come back and it resumes. The work runs in the background, so a refresh never freezes the app, and an unchanged table doesn't flicker or lose your place. A small title-bar indicator spins while a refresh is in flight and shows a bell with a count when something changed underneath you; hover it for the most recent updates.

##### What's new

- If a background refresh fails — a script that won't respond, an expired login — that page stops auto-refreshing instead of retrying on a loop, and you get one toast naming what broke. Reopen the tab once it's fixed.
- A row or toolbar action can run a script or CLI command: a dialog collects any inputs as a form, then streams the command's output live in a terminal, so a deployment can be kicked off from the row it belongs to.
- A page's default sort is honoured on open, so log streams and state objects lead with the most recently active instead of falling back to name order.
- Fix: right-clicking "Show " on a row you had already selected sometimes failed to open the drill-down.
- Fix: clicking a link in a table with a detail tab open below could drill into the wrong table, or nothing at all.

##### 0.17.2

- Fix: a table that auto-refreshed blanked out on each refresh, then snapped back when the new rows landed, or stayed blank if the refresh failed. Visible grids refresh in place now, and only swap rows in if the fetch succeeds.

Raw file: [changelog-0.17.md](https://vantage-ui.com/changelog-0.17.md)

### Vantage 0.16

20 June 2026

#### Vantage 0.16

An agent working on your project's YAML can read and query its data, not only its logs. It can load a model and run a small read-only query — pull a few rows, count them, follow a reference — to confirm that a table or a drill-down returns what you expect, reading the same data the app shows. The "Allow MCP agents to read data" toggle on the dashboard governs it.

##### What's new

- A REST datasource that reports a row total pages rows in as you scroll, instead of fetching the whole table up front, so a big API-backed table opens fast and fills in as you go.
- Flag a column as a label and it renders as a small coloured tag next to the row's name rather than taking a column of its own, which suits status and state fields.

Raw file: [changelog-0.16.md](https://vantage-ui.com/changelog-0.16.md)

### Vantage 0.15

14 June 2026

#### Vantage 0.15

Vantage has a secrets editor for your project's `.env`, opened from the title bar: variables with a file description, per-variable notes, single- or multi-line values and masked secret fields. It saves a standard `.env` that any dotenv loader reads, plus a committed `.env.example` that never holds real values, and flags template keys you haven't filled in locally. A `cmd` datasource that shells out to a script can read its keys and tokens from there.

##### What's new

- The nightly build installs as Vantage Nightly next to the stable app instead of overwriting it, and keeps its own settings and recent-projects list.
- Pick a theme for the app, and tune chart colours on the chart itself with sliders for hue, spread and lightness. Copy as JSON saves what you land on, and a project-wide palette in your config gives every chart one scheme.
- A link on the website opens Vantage, downloads the example with a progress bar, shows you what's inside, asks you to trust the source, and installs it ready to open.
- Fix: the app crashed the first time you opened it on a new machine. Launching without a project drops you on the welcome screen.

##### 0.15.1

- A `cmd` datasource that fails on something you did — opening its tab, hitting Refresh — now raises a toast naming it ("Problem with tfstate.") with a one-line summary, instead of hanging silently.
- Fix: a page that explicitly listed its id column had it dropped from the grid.

Raw file: [changelog-0.15.md](https://vantage-ui.com/changelog-0.15.md)

### Vantage 0.14

9 June 2026

#### Vantage 0.14

A real terminal lands in Vantage. The old log viewer was a line-by-line text box, so coloured output, progress bars that redraw in place and screens that clear and repaint all came out garbled. The new one understands the same escape codes your shell does: ANSI colours, bold and underline, in-place redraws and full-screen repaints all render, you can scroll back through a long history with the wheel or PageUp/PageDown, and dragging to select copies to the clipboard. The app log panel and any page log view, CloudWatch events included, run through it.

##### What's new

- A new kind of action opens a dialog with a description, the exact command in a box you can copy, and a live terminal. Run executes it in a real terminal session, so its colours and progress bars work; Stop sends Ctrl+C and Stop again kills it. Try Bake muffins on the Products page of the surreal-bakery example.
- Drill into a big table and it appears right away with not-yet-loaded rows dimmed, then fills them in on its own, with no blank grid and no nudging the mouse to make rows appear.

##### 0.14.2

- `stacked_area` stacks multiple series into cumulative bands, and `labels: false` suppresses axis text on a dense dashboard tile.

##### 0.14.3

- A page can set a `tab_title:` template, so a drilled-into tab reads `Deployments: acme-flights` rather than a `Parent → Child` breadcrumb. `${row.*}` fills in values from the row you came from.

Raw file: [changelog-0.14.md](https://vantage-ui.com/changelog-0.14.md)

### Vantage 0.13

9 June 2026

#### Vantage 0.13

Relationships can be scripted. A related list used to be a plain foreign-key match; give the relation a `rhai:` script and it builds its own set when you drill in — filtered by status, sorted newest-first, limited, or matched on a computed condition that plain YAML couldn't express. The parent record is available to the script, so the related list can depend on the row you opened it from. Relations without a script work exactly as before.

##### What's new

- A `surreal: { modify: | … | }` script on a table runs as a final step once the table is built, for a condition the column and relation YAML can't say on their own — "only paying clients", "balance below zero". It narrows the table without making it read-only.
- The bundled SurrealDB and UI-builder skills teach both, so asking the assistant to "show a client's open orders, newest first" produces the right YAML.

##### 0.13.1

- A table whose rows come from running a command or script shows the list right away and fills in the slower per-row details as they scroll into view. Switch a filter or sort and the details it already fetched stay put.

##### 0.13.2

- A menu item or button can use any icon from the built-in set; before, only a handful of names worked and anything else quietly showed nothing. Your YAML editor lists the full set as you type.

Raw file: [changelog-0.13.md](https://vantage-ui.com/changelog-0.13.md)

### Vantage 0.12

6 June 2026

#### Vantage 0.12

A SurrealDB table can be defined by an arbitrary `SELECT` rather than mapped one-to-one onto a physical table. Add a `surreal: { rhai: | … | }` block to the table YAML and write the query as a Rhai script that builds SurrealQL, `GROUP BY` aggregation, joins and computed columns included. The result rows populate the table as usual, so sorting, filtering, drill-down and chart binding all work.

##### What's new

- A `base:` + `inherit:` shorthand starts from an existing table and narrows or transforms it — "clients with a negative balance".
- The Surreal bakery demo has query-sourced tables for daily revenue, order totals, low-stock products and debtors, each on a different aggregation pattern.

##### 0.12.2

- The app is now just "Vantage" — same app, shorter name, in the menu bar, window title and the download. The change breaks auto-update from older builds, so grab this version manually from the download page; updates flow normally after that.

Raw file: [changelog-0.12.md](https://vantage-ui.com/changelog-0.12.md)

### Vantage 0.11

6 June 2026

#### Vantage 0.11

Point a data source at a local command — the `aws` CLI, say — and each table fetches its rows by running that tool and reading the JSON it prints. A small script per table shapes the command's arguments, and drilling from a row into a related table passes the parent's id through as a command flag, so the usual master/detail navigation works with no API or database behind it.

##### What's new

- Choose Command (CLI) when you add a data source.

Raw file: [changelog-0.11.md](https://vantage-ui.com/changelog-0.11.md)

### Vantage 0.10

30 May 2026

#### Vantage 0.10

Grid rows and toolbars can run operations. An action is declared as `action/*.yaml` and referenced from a row's `action:`: `kind: form` opens a dialog to add or edit a record, `kind: confirm` asks before a destructive step, and `kind: http_request` calls an outside service. The bakery example uses them to add, edit and delete products, to cancel an order, and to send a password reset to a client.

##### What's new

- Grids can carry a toolbar of buttons above the rows, such as "Add product".
- Orders carry a status, and the right-click menu offers only the valid next transitions for the current state — placed, confirmed, in production, ready, delivered or picked up, paid, cancelled — hiding the steps that don't apply.
- A `kind: chart` element plots a table as a bar, line or pie chart, with an `x` column for the category and a `y` column for the value. `layout: grid` arranges several into a dashboard.
- A page can declare a `controls:` dropdown sourced from a table, and every chart that references it in `where:` re-filters when the selection changes, so one dropdown scopes the whole dashboard.

Raw file: [changelog-0.10.md](https://vantage-ui.com/changelog-0.10.md)

### Vantage 0.9

23 May 2026

#### Vantage 0.9

Tables handle a million rows. Only the rows you can see are fetched and the rest wait in a backing cache; sequential and cursor-based pagination are picked per backend, so scrolling stays smooth whatever the size of the data, and sorting falls back to in-memory where the backend can't do it.

##### What's new

- Tables refresh without flicker — on file change, on a schedule, or when you press the button. The strategy depends on the data source.
- Open the same table in two tabs, or a master grid plus a detail sheet, and they share one cache, so an edit in one view appears in the other instantly.
- Read rows from DynamoDB and write them through a REST API call: the read source and the write target are configured per operation.

Raw file: [changelog-0.9.md](https://vantage-ui.com/changelog-0.9.md)

### Vantage 0.8

16 May 2026

#### Vantage 0.8

GraphQL joins the backends Vantage can talk to. Set `type: graphql` with your endpoint in `url:` and pick a `dialect:` — `generic` for flat-argument schemas like the public SpaceX API, `hasura` for `where: { _eq: … }` arguments. The rest of the admin works as it does anywhere else: grids, sort, search, right-click drilldowns. The GraphQL root field is just the table's name.

##### What's new

- You can override the filter argument name or send an auth header.
- A table that declares has-many relations grows a sticky leftmost `Open` column with a button per relation, which opens the related model in a new tab filtered to that row. A top-level `has_many:` list on `table/*.yaml` adds extras, so one row can surface several related models side by side.

Raw file: [changelog-0.8.md](https://vantage-ui.com/changelog-0.8.md)

### Vantage 0.7

14 May 2026

#### Vantage 0.7

Tabs, and drilldowns that open related records in one. You can keep several data-table pages open at once; the left sidebar owns a single nav slot, so clicking a different sidebar item rebuilds that slot's tab in place and any child tabs you spawned from it stay live. Click a link cell and the related record opens in a child tab owned by the current page. Later clicks in the same parent reuse that tab, unless you star it to pin it, in which case new tabs slide in to the left and take focus.

##### What's new

- `context_menu` entries can declare an `open_page` plus a `model:` Rhai expression returning the table to show. The expression sees the clicked row's columns, the full `row` and the page's master `model`, with a `get_ref(relation, id)` helper for chasing `has_many` relations — chain it for `model.get_ref("albums", row.id).get_ref("photos", album_id)`.
- The CRUD toolbar shows the active page's title to the right of Refresh, or a breadcrumb path on a drill-down tab.

##### 0.7.1

- Fix: the dashboard's "Recent Changes" panel showed an empty placeholder instead of the real notes for 0.5, 0.6 and 0.7.

Raw file: [changelog-0.7.md](https://vantage-ui.com/changelog-0.7.md)

### Vantage 0.6

14 May 2026

#### Vantage 0.6

A release for working with tabular data. Click a column header to sort and the choice is remembered per project, so reopening a grid picks up where you left off. Long-running grid views keep themselves current without a manual reload.

##### What's new

- Open a single row in a side sheet for a scrollable view of every field, instead of widening columns and scrolling sideways.

Raw file: [changelog-0.6.md](https://vantage-ui.com/changelog-0.6.md)

### Vantage 0.5

13 May 2026

#### Vantage 0.5

Vantage UI gets serious about working with AI coding agents. A first-run "Set up with AI" wizard walks an agent through scaffolding a project and drops bundled skills — markdown instructions plus YAML schemas — that teach any agent following the [agentskills.io](https://agentskills.io) convention how to author Vantage configs. A local MCP endpoint lets Claude Code, Cursor or anything else that speaks MCP introspect your project's datasources and config without leaving the editor.

##### What's new

- Browse the app's structured logs in the app and attach them to a "Send feedback…" message, so a bug report doesn't need a separate `tail -f`.
- Edit a YAML datasource and the connection rebuilds in place, with no app restart.
- Stable builds offer stable updates and nightly builds offer nightly ones, and a nightly build gets its own icon so it isn't confused with stable in your dock.
- Error reports no longer carry connection strings, hostnames or credentials from your datasources.
- Fix: forms backed by SurrealDB failed to read tagged CBOR values.

##### 0.5.1

- The "Set up with AI" wizard offers SurrealDB, with a bundled skill covering `INFO FOR DB` / `INFO FOR TABLE` introspection and the YAML mappings for record-link relations.

##### 0.5.2

- The "Send feedback…" dialog picks up `FEEDBACK.md` from the project root. Tick Include feedback from the agent to send the agent's notes with your own, or View agent feedback to read them first; sent contents are deleted from disk. The bundled builder skill tells the agent to write its UX, validator and schema suggestions there as it works.
- Bundled skills install under `.agents/skills/`, so any agent following the [agentskills.io](https://agentskills.io) convention picks them up. Opening a project refreshes installed skills whose bundled version has moved on and tops up missing folders; skills you have edited are left alone.

Raw file: [changelog-0.5.md](https://vantage-ui.com/changelog-0.5.md)

### Vantage 0.4

9 May 2026

#### Vantage 0.4

The first 0.4-line release: more backends, a project-aware shell and a built-in macOS auto-updater. Alongside SQLite you can connect to SurrealDB, MongoDB, REST APIs, AWS CloudWatch Logs and CSV files, with CloudWatch browsable in its own right — pick a log group, drill into events, follow master/detail. Editing inventory YAML rebuilds the open page in place, and results cache to disk, so reopening a project is near-instant.

##### What's new

- New master-detail page layouts, vertical and horizontal.
- A project switcher with a recently-opened list, and a sidebar that groups pages per data source with collapsible sub-menus.
- Computed columns from inline expressions.

##### 0.4.1

- Built-in auto-update with progress in the title bar, and a native Mac download from the website.

##### 0.4.2

- Fix: SQLite datasources work when launched from Finder, and AWS list views walk all pages.
- `AWS_PROFILE` and SSO logins are supported, and DynamoDB gained a `begins_with` sort-key filter.

##### 0.4.3

- Fix: the auto-updater offered to "update" 0.4.2 to itself on every launch.

Raw file: [changelog-0.4.md](https://vantage-ui.com/changelog-0.4.md)

Nightly channel

## Living on the edge?

Nightly builds track `main` — every commit is signed, notarized, and shipped. Expect rough edges; the in-app updater keeps you on the nightly channel automatically.

[Download nightly](https://vantage-releases.s3.eu-west-2.amazonaws.com/main/1.10.0-main.20261029100502/Vantage-1.10.0-main.20261029100502-aarch64.dmg)

v1.10.0-main.20261029100502 · Apple Silicon

sha256: 02c12a493671699b…
