Aster / Changelog / 0.5.0

Aster 0.5.0

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 Zed
  • refactor(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/sitemap never worked: its schema asked for domain while the dispatcher read url. It reads domain now, with url still accepted.
  • web/crawl ignored every option it advertised. max_pages, max_depth, stop_after_ms, url_regex, follow_subdomains, parse_pdfs, and use_main_content_only all take effect, and a malformed option is an error.
  • web/screenshot returns 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/search and web/extract go 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/crawl still needs FIRECRAWL_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, and aster skills bundled marks 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_mode is 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 init uses. 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 under review for 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 get and set.
  • Numbers read as quantities. A timeout is 300s, a compaction budget 192k chars, an empty include says "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. list asks for it outright; get prints one value and nothing else, so it pipes; set and unset write and clear one key; path says which files Aster reads here; edit opens one in $EDITOR and 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, unset clears 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, and aster model use <id> changes the model alone. Both save to aster.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 list shows every key Aster reads and which layer supplies it; set and unset write the file; path says 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 init can now point at any OpenAI-compatible endpoint. A Custom endpoint row asks for the base URL, stores the key as ASTER_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 init asks 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 #L42 forms, and cited paths in backticks such as src/panel.ts:486 open the file at that line. A link such as README.md:12 is 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 digests
  • feat(ai): add xhigh, max, and ultra effort levels

Also in this release

  • The agent can forget. A forget tool 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 serve loads and saves the CLI config instead of keeping its own; a pick in the browser lands in the same aster.yaml the 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.

⭐ github.com/aster.builders