Aster 0.5.0 is out. A full release: Aster becomes a Zed agent, the web tools finally do what they said they would, and settings drift out of your .env.
Install or upgrade in one line:
curl -fsSL https://aster.builders/install | sh
Aster is a Zed agent
aster acp serves the agent over the Agent Client Protocol on stdio, so Zed's External Agents menu drives the whole thing: streamed replies and thoughts, tool calls with diffs and file locations, plans, approvals and questions as permission prompts, cancel, and thread resume.
Each thread offers pickers for the permission mode, provider, model, and effort, with the same humanized model names and coding shortlist as the desktop and VS Code apps. A thread opened without credentials offers to run aster login in a terminal.
feat(acp): serve the agent over the Agent Client Protocol for Zedrefactor(acp): extract protocol core into library crate
The web tools do what they say
The web tools in 0.4.0 lied about what they did. That is fixed, and most of the web now works with no key at all.
web/sitemapnever worked: its schema asked fordomainwhile the dispatcher readurl. It readsdomainnow, withurlstill accepted.web/crawlignored every option it advertised.max_pages,max_depth,stop_after_ms,url_regex,follow_subdomains,parse_pdfs, anduse_main_content_onlyall take effect, and a malformed option is an error.web/screenshotreturns the image itself as content the model sees, beside the link, instead of a JSON blob with a URL it could never open.- Search and extraction work on a fresh install, no key. Firecrawl opened a keyless tier, so
web/searchandweb/extractgo there by default instead of starting at DuckDuckGo and a plain HTTP fetch. The tier is rate-limited per IP, so a refusal falls through to the keyless providers that were already there rather than failing the call.web/crawlstill needsFIRECRAWL_API_KEY, which Firecrawl does not serve keyless. - The five built-in
web/*tools are pinned into the tool inventory, so a large MCP catalogue no longer forces a search round before the agent can search the web or read a page.
Images for models that cannot see
When the session model takes no image input, attached images are described by a vision model and the description takes their place, instead of the images being dropped. ASTER_VISION_MODEL picks the model (default openai/gpt-4o-mini).
read_file now refuses image files and says why: an image the user mentioned is already attached to the conversation, so the agent looks at it instead.
The agent's own conduct, off the screen
Skills that shape how the agent works, rather than what it can do for you, now live in an internal/ folder: eleven built-ins, plus eight of the bundled optional skills. They stay in the model's index and load on demand, but never appear in aster skills list, the /skills picker, the session header, or the status count. Reading one is never shown as a step in the chat.
- Skills are an internal reference. The agent never names one, quotes its headings, or says it consulted one. The user sees the behaviour.
- A skill you install under
<skills root>/internal/<name>/is treated the same way, andaster skills bundledmarks the internal ones and installs them there. - A skill a run produces is installed on the spot with
aster skills add ./dir --all --yes --force, not saved to memory.
A plan is a document now, not five stage names
exit_plan_mode took no arguments and presented whatever labels update_plan happened to hold, so an approval read "Stage 1: aster-auth crate, Stage 2: ChatGPT backend" and you were asked to approve an approach nobody had described. The tool now takes the plan as markdown and that is what you read: what it means to do and why, the files it will touch, the approach it picked over the one it dropped, what it is unsure of. The step list goes back to being the progress strip it always was.
- A plan opens in a tab of its own, and the approval keeps only the decision. The whole plan used to be drawn inside the approval card; it now opens as a document, with Approve and Reject waiting at the foot. Answering there closes the tab and hands you back to the thread.
- Task lists render as checkboxes in the panel,
☐or☑, instead of a bullet followed by literal[ ]. - Asking for a plan gets you a plan to approve, whatever the mode.
exit_plan_modeis offered in every mode now, and approving one no longer narrows the session.
aster config, revamped
aster config is now the one command for providers, models, keys, and every setting. It reads and writes aster.yaml, so changing a setting no longer means finding the file and remembering the key's spelling.
- The settings form is the same one
aster inituses. It opens on its own, and settings are grouped by what they do rather than the block they sit in, since that is the part a key name gives away least: the model every surface uses sits underreviewfor historical reasons, and the form files it with the provider instead. - Each setting carries a plain name, the value it currently resolves to, and the key it is spelled by, so a setting you find in the form is one you can pass to
getandset. - Numbers read as quantities. A timeout is
300s, a compaction budget192k chars, an emptyincludesays "everything". Picking one prompts for a value,-clears it back to the default, and a Save to row switches between the repo's config and the global one without leaving the form. - Piped or scripted it prints as a table instead.
listasks for it outright;getprints one value and nothing else, so it pipes;setandunsetwrite and clear one key;pathsays which files Aster reads here;editopens one in$EDITORand tells you whether what you saved still parses. - Nothing is saved that the next run would refuse to read. The edited file is parsed first, so a misspelled key or a value of the wrong type is an error naming the keys that do exist, rather than a config that fails on the next turn. Comments and layout survive an edit,
unsetclears the key from every file that pins it, and a shell variable that outranks what was just written is said out loud. - One place to switch provider and model.
aster provider use <id>points Aster at an endpoint and adopts a model it serves in the same write, andaster model use <id>changes the model alone. Both save toaster.yaml, so a switch made in one surface is the switch everywhere.
Keys without hand-editing .env
aster key stores the API keys Aster reads. Keys never live in aster.yaml, and before this the only things that wrote them were aster init (which asked for exactly two web-tool keys, hardcoded) and aster login. Every other var meant hand-editing ~/.aster/.env.
aster key listshows every key Aster reads and which layer supplies it;setandunsetwrite the file;pathsays which files are read here.- A value left off the command line is asked for without echoing, so it stays out of shell history.
aster initcan now point at any OpenAI-compatible endpoint. A Custom endpoint row asks for the base URL, stores the key asASTER_API_KEY, and when the endpoint already in use matches no catalog row, the cursor starts on that row with the URL offered back to edit.aster initasks about every web provider, not two of them.
VS Code and Cursor
- Cmd+F finds text in the conversation: the editor's own find widget in a tab, or a find bar of Aster's own in the sidebar where the editor offers none.
- Markdown links to files, including
file://and#L42forms, and cited paths in backticks such assrc/panel.ts:486open the file at that line. A link such asREADME.md:12is read as a file and a line, not a URL scheme. - Files dragged from the Explorer, an editor tab, or the Finder land in the composer as mentions, and pasted images attach with a thumbnail.
- Every file chip opens the real editor tab now. Clicking a file under "Edited", in a review's file list, on a tool row, or on a mention used to open a preview inside the panel; images open in the image viewer.
fix(vscode): reuse effort slider in settings
Desktop
The app's own interface is rebuilt on the design system the editor panel uses: a collapsible sidebar of conversations, a toolbar with the diff view and a command menu, provider and model pickers, a settings page, a home view over saved conversations, an in-app update control, and a setup card with the install command when the CLI is missing.
The agent can drive aster itself
The prompt tells it the binary is on its PATH: aster remind for a reminder, aster cron for schedules, aster skills add to install, aster mcp enable|disable, aster web crawl for a scoped crawl. Reminders accept seconds now too.
feat(cron): add scheduled runs, one-shot runs, and memory digestsfeat(ai): add xhigh, max, and ultra effort levels
Also in this release
- The agent can forget. A
forgettool deletes a memory block by name, so a wrong or unwanted fact is removed instead of overwritten with a placeholder. - Codex backend with ChatGPT subscription auth and MCP OAuth.
- LSP navigation, structural edits, and security scan tooling.
- WebMCP bridge for page-registered tools into the catalogue.
- A silent round no longer throws the turn away. Silence is usually a provider hiccup, so the turn says so and asks again, then falls back to the plain forced answer.
aster serveloads and saves the CLI config instead of keeping its own; a pick in the browser lands in the sameaster.yamlthe terminal reads.fix(desktop): stage sidecar under the target triple, not the host.
Try it
Built solo, in the open, Apache-2.0. Binaries for macOS, Linux, and Windows, plus desktop installers.
curl -fsSL https://aster.builders/install | sh
In your editor, install Aster AI from the VS Code Marketplace, or from Open VSX if you are on Cursor, Windsurf, or VSCodium.
For Zed, install the Aster extension (editors/zed/) and point Zed's External Agents menu at aster acp. It is not on the public marketplace yet; build it locally from the repo.