Repository navigation
Releases
v0.3.5
byob can now work with your email and calendar, and answer questions about itself.
Email and calendars
Two new bundled plugins, off until you switch them on (Settings → Plugins):
- Mail (IMAP and SMTP, one account):
mail_search,mail_read,mail_folders,mail_draft(saved to your Drafts),mail_mark(read, unread, flag, move) andmail_send. Reading never marks mail as read. Presets for Fastmail, iCloud and Gmail, or fill in your own servers. - Calendar (CalDAV, one account):
calendar_list,calendar_events,calendar_free_busy,calendar_create,calendar_updateandcalendar_delete. Time zones, all-day events and repeating events (including "2nd Tuesday", exceptions and moved occurrences) are handled. Works with iCloud, Fastmail, Nextcloud, Radicale and other CalDAV servers. - Some things always ask you, whatever the approval mode: sending an email, creating or changing an event with attendees (the server may email them), and deleting an event. The card shows the whole message or event; a call too large to show in full is refused instead.
- Email and event text is treated as outside data, not instructions to the model.
- Passwords are kept as secret settings and never sent to browser clients. Gmail and iCloud need an app password.
- Not supported yet: Outlook / Microsoft 365 and Google Calendar (they need OAuth sign-in).
Help
byob_help: the model can now look up byob's own guide (installing, connecting a model, settings, workspaces, mail and calendar setup, writing plugins) instead of guessing. On by default; read-only and local.
Agents
- Subagents get the guidance of the plugins whose tools they have (for example mail's "prefer drafts, never claim mail was sent"), not just the tools.
For plugin authors
confirmin a tool's declaration makes a person approve every call, whatever the approval mode:true, a warning text, or{"warning": "...", "when": ["arg"]}to ask only when given arguments are set.
Fixes
- The browser UI server's "server busy" reply could be lost on Windows when a request arrived late.
v0.3.4
byob for macOS now comes as an app.
macOS
byob-<version>-<target>.dmgfor Apple silicon (aarch64) and Intel (x86_64): dragbyob.appinto Applications. The HTML app renderer is inside it. The.tar.gzarchives are still there too.- Opened from Finder, byob starts in your home folder and finds your tools. Apps started from Finder get almost no
PATH; byob now takes your login shell's (plus the usual Homebrew and Nix folders), sorun_commandfinds the same programs as in a terminal.
The macOS builds aren't signed by an Apple developer yet. Downloaded with a browser, macOS won't open them at first:
- for the
.dmg: try to open byob once, then System Settings → Privacy & Security → Open Anyway (on macOS 14 and older, right-click → Open), or runxattr -dr com.apple.quarantine /Applications/byob.app; - or skip Gatekeeper entirely by fetching the archive from a terminal:
(use
v=0.3.4; curl -L https://github.com/Scronkfinkle/byob/releases/download/v$v/byob-$v-aarch64-apple-darwin.tar.gz | tar xz ./byob-$v-aarch64-apple-darwin/byob
x86_64instead ofaarch64on an Intel Mac).
Work Macs whose management blocks unsigned apps won't run it until it's signed.
v0.3.3
A patch release: long jobs no longer stop when the server chokes on a reply, suggested prompts start right away, and chats keep their server slot on llama.cpp.
Fixes
- A failed request no longer ends the turn. When the server can't read the model's reply (llama.cpp answers a malformed tool call with an HTTP 500 or an error in the stream), byob tells the model what went wrong and asks again, up to two more times. Other server errors (5xx, a dropped stream, "Loading model") are tried again after a short pause. Requests that are wrong in themselves (a 4xx such as context too long) still stop at once.
- A broken tool call no longer switches the endpoint to prompt-based tools. Before, a "Failed to parse tool call" error could be mistaken for a server that doesn't support tools.
- The model fixes failed tool calls instead of giving up. The default system prompt now says to read the error and try again; calls you decline are still not repeated.
Interface
- Suggested prompts send on click in an empty chat, instead of only filling in the composer. While an attachment is still uploading, the prompt goes into the composer as before.
Servers with slots (llama.cpp)
- byob sends
id_slotto servers that reporttotal_slots, so each chat keeps the same slot (and its prompt cache) from turn to turn, and subagents run in slots no chat is using instead of evicting the main chat's cache. Endpoints that don't report slots, such as hosted APIs, get nothing extra.
v0.3.2
byob can now search the web, read PDFs and Office documents, look at images, remember things between chats and keep a plan for long tasks. Each of these is a bundled plugin you can switch off.
New tools
- Web search and reading.
web_searchandweb_fetch(a page as readable text). Privacy: by default, searches go to Exa (exa.ai), a third-party service, and pages that need JavaScript are read through Jina Reader (r.jina.ai). Both see what you send them, and byob says so the first time each is used. To keep this private, set your own SearXNG, Brave or Tavily under Settings → Plugins → Web, turn the reader off, or switch the plugin off. - Documents.
read_filereads PDF, Word (.docx) and PowerPoint (.pptx), page by page for long files. - The model can look at images.
read_fileandread_artifactshow PNG, JPEG, GIF and WebP images to models that can see, andlook_at_imagealso shows PDF pages. If the chat's model can't see, avisionmodel role in settings can describe the image instead. - Memory.
rememberandforgetkeep short notes in plain Markdown you can edit: one file for every chat, one per workspace. The Memory pane shows them. - Plans. For multi-step tasks, the model keeps a step list (
update_plan), shown as a card in the chat and kept in front of it until the work is done. - Questions.
ask_userputs a question on a card with choices and a field for your own answer. - Editing and searching files.
edit_filechanges part of a file instead of rewriting all of it;search_filessearches the workspace. - Today's date is in the system prompt.
Settings
- Tool calls per turn: 10, 30 (the default), 100, 300 or No limit. Long jobs no longer stop at 30 calls unless you want them to. When a turn hits the limit, the model says where it stopped.
- Images to the model: images are sent as JPEG 85 % by default, which makes requests several times smaller (a screenshot goes from 198 KB to 57 KB). Choose another quality, or send them as they are.
- Both can be set for every chat, per workspace or per chat.
Interface
- Zoom the whole interface with Ctrl + / Ctrl − / Ctrl 0, or from Settings → Appearance or the ⋯ menu. It's remembered on each device.
- Attached images show a thumbnail; hover for a larger view.
- Popups can be dragged: chat settings, workspace settings and New workspace.
- Getting back from Settings: "← Back to chat" at the top left; the byob wordmark goes back too.
For plugin authors
- Plugin tools can declare their access (read, write or execute), so approvals treat them like built-in tools.
- Native backends receive their plugin's secret settings.
v0.3.1
HTML apps now work out of the box on every platform, Windows starts reliably on Intel GPUs, and the README finally shows what byob does.
Batteries included: HTML apps in every download
The full archives (byob-…) now include byob-artifact-host, the Servo renderer that draws the HTML apps the model writes inline beside the chat. Before, that needed a Nix build. The slim archives (byob-slim-…) are still byob on its own; without the renderer, HTML apps open in your browser.
Windows
- Starts on Intel GPUs. byob now draws with DX12 when it's available. Intel's Vulkan driver could close the window at startup.
WGPU_BACKENDstill overrides the choice. - HTML apps render inline, with or without a GPU. The renderer draws through ANGLE (Direct3D 11), falling back to Windows' built-in software rasterizer. That covers VMs, Remote Desktop and machines without a GPU driver. ANGLE's
libEGL.dllandlibGLESv2.dllship next to it, withLICENSE-ANGLE.
Fixes
- HTML apps no longer stall when a library prints to the renderer's output. The channel between byob and the renderer now tolerates stray text: it's skipped, and logged as "artifact host printed: …". The reason a renderer stops is shown on the app card. Older renderers and older byob builds still work with the new ones.
- Each reply shows one card per artifact, on its last change. A sheet edited 24 times in one reply used to leave 24 cards. The version picker still lists every version.
- Settings: the title and Close button stay put while you scroll.
Also
- New README with a recorded session and screenshots, regenerated by
scripts/readme-media.sh. - Each release archive is now its own download, with
.sha256checksums.
Install
Download an archive below. byob-… has everything: the browser UI (byob --serve) and the HTML app renderer (byob-artifact-host; keep it next to byob). byob-slim-… is byob alone. Each has a .sha256 next to it.
Or cargo install byob (crates.io; without the renderer), or nix run github:Scronkfinkle/byob/v0.3.1.
Full Changelog: v0.3.0...v0.3.1
byob 0.3.0 — everything is a plugin
byob's built-in features now ship as plugins on the same API anyone gets, and plugins can do far
more than add tools: draw UI, sit in the turn pipeline, run long-lived backends, render artifacts.
Breaking: protocol 13 (open, versioned: major must match, minors and capabilities are
additive from here on). Start fresh — 0.2.x profiles aren't migrated. Old browser tabs are told
to reload.
Plugins can now
- Draw UI with declarative view trees drawn natively (desktop and browser): a side pane, a
header status chip, a settings section, cards on tool steps, artifact bodies. Includes a
virtualized, editable grid. See docs/views.md. - Run a backend: a long-lived process (JSON lines; Python helper
byob_plugin.py, per-plugin
venv frompython.requirements) or in-tree Rust ("backend": {"native": …}). State stays in
the process; faults and stderr reach the model so it can fix its own plugin.
See docs/plugins-backend.md. - Hook the turn: before_prompt, before_request, before_tool_call, after_tool_call,
on_turn_end — observe, change, block. - Add artifact types and renderers keyed by content type (native, view tree or web page).
- Provide workspace environments (Nix/pixi/mise/containers are themselves plugins now).
- Web views and MCP Apps: HTML panes and cards with a bridge (tools/call through the
approval gate, model context, theme).
Built-ins are bundled plugins
Prompt, core tools, artifacts, charts, images, markdown, HTML apps, compaction, subagents,
environments, workspace instructions and spreadsheets. Fork any of them to your global plugins
and edit it ("Fork to edit" in Settings → Plugins, or ask byob).
Spreadsheets
A native spreadsheet plugin (IronCalc): .xlsx/.csv/.tsv as editable grids beside the chat, with
tools to describe, read, write, fill, restructure and format sheets; every write recalculates and
reports errors back to the model.
Also
- Deletes are permanent (chats, artifacts, workspace folders; SQLite secure_delete).
- Broken plugins can be found, read and fixed from a chat.
- Settings are grouped into cards.
- Windows: links open without a shell; Python backends speak UTF-8.
- Hardening from a full audit: output caps that hooks can't bypass, hidden tools can't be called,
approval cards reflect hook-rewritten arguments, bounded queues/caches for plugins and views,
backend crashes detected even when a child holds its pipes, frames over the remote cap degrade
gracefully instead of vanishing.
Install
cargo install byob (crates.io), or download an archive below: byob-… has the browser UI built in (byob --serve), byob-slim-… doesn't.
Full Changelog: v0.2.1...v0.3.0
v0.2.1
v0.2.0
What's Changed
- CI, Nix, release and crates.io publish workflows by @Scronkfinkle in #1
New Contributors
- @Scronkfinkle made their first contribution in #1
Full Changelog: v0.1.0...v0.2.0
v0.1.0
Full Changelog: https://github.com/Scronkfinkle/byob/commits/v0.1.0