Downloads
Desktop App
| Platform | Download | Size |
|---|---|---|
| Windows (x64) | CachiBot-Setup-0.3.0-win.exe |
154.2 MB |
| macOS (Apple Silicon) | CachiBot-0.3.0-mac.dmg |
214.3 MB |
| Linux (x64 AppImage) | CachiBot-0.3.0-linux.AppImage |
206.9 MB |
| Linux (x64 .deb) | CachiBot-0.3.0-linux.deb |
164.6 MB |
| Linux (x64 .rpm) | CachiBot-0.3.0-linux.rpm |
173.6 MB |
Mobile App
| Platform | Download | Size |
|---|---|---|
| Android (APK) | CachiBot-0.3.0.apk |
79.8 MB |
Downloads become available once the build pipeline completes (~10 min after release).
macOS users: This build is not yet notarized by Apple. After installing, open Terminal and run:
xattr -cr /Applications/CachiBot.appThen open the app normally. This only needs to be done once.
Python Package (pip)
pip install cachibot==0.3.0Changes
CachiBot grew a nervous system this week. Bots can now extend themselves with external plugins, render rich artifacts inline, enter workspace modes with task tracking, and spin up entire multi-bot projects from a single conversation. Underneath, the storage layer was refactored into a generic repository pattern and every route file got a spring cleaning with centralized guard helpers.
Highlights
- External plugins can be installed from archives or auto-installed from the official registry at startup, each gated by bot capabilities and managed through a new Plugins view
- Agents can now produce rich artifacts — code with syntax highlighting, live HTML previews, SVG, Mermaid diagrams, images, and downloadable documents — rendered in a resizable side panel
- Workspace mode lets plugins define a focused context with custom system prompts, toolbars, and live task progress checklists streamed over WebSocket
- A full project creation flow classifies user intent, generates a multi-bot proposal with editable personalities, and batch-creates bots and rooms in one shot
- Per-message model selection via an inline ModelPill in the chat footer, with model white-labeling through public ID aliases
- Browse Templates card added to the bot creation wizard, linking directly to the marketplace
Technical changes
Plugin system
ExternalPluginService(cachibot/services/external_plugins.py) scans~/.cachibot/plugins/forplugin.tomlmanifests, dynamically imports plugin modules, and injects them intoCACHIBOT_PLUGINSandCAPABILITY_PLUGINSregistries keyed byext_<name>- WSL-aware directory resolution probes
/mnt/c/Users/*/and/mnt/d/Users/*/to find the Windows user profile when running under WSL install_plugin_from_archive()supports.zipand.tar.gzwithfilter="data"on tar extraction to block path-traversal attacks; validates manifest, checks Python imports, and rejects name collisions with built-in pluginsinstall_official_plugins()fetches a remote registry at startup, compares versions via.officialmarker files, and downloads newer defaults without overwriting user-modified directoriesenforce_permissions()blocks declaredallow_env_varsfrom containing system env vars (PATH,HOME, etc.)- Plugin API routes (
cachibot/api/routes/external_plugins.py): list, enable/disable with lifecycle hooks, reload, install from upload, uninstall (blocked for official plugins), and serve static HTML for view-type plugins - Plugin base class gains
on_install(),on_uninstall(),on_enable(bot_id),on_disable(bot_id)lifecycle hooks and aworkspace_configproperty - Five example plugins added:
hello_world,code_canvas,doc_writer,html_preview,website_builder - Full plugin documentation added under
docs/plugins/covering manifests, skills, artifacts, views, lifecycle, and examples
Plugin SDK
cachibot/plugins/sdk.pyprovides typed artifact constructors (code_artifact,html_artifact,markdown_artifact,svg_artifact,mermaid_artifact,image_artifact,document_artifact,react_artifact,custom_artifact) andartifact_update(), all returning dicts with__artifact__: Truesentinelsemit_artifact()pushes artifacts immediately viactx.on_artifactcallback for streaming multiple artifacts from a single tool callcachibot/plugins/sdk_types.pyadds protocol classes (PluginProtocol,ExternalPluginProtocol,SkillResult) for IDE autocompletion without requiring inheritance
Artifact system
ArtifactandArtifactUpdatePydantic models withArtifactTypeenum:code,html,markdown,svg,mermaid,react,image,custom,document- WebSocket handler parses
tool_resultevents for__artifact__,__artifact_update__, and__workspace_progress__sentinels and routes them as typed WS messages instead of genericTOOL_END - Proactive artifact emission via
_artifact_senderclosure passed ason_artifactto the agent context - Frontend
ArtifactPanelwith type-specific renderers:CodeRenderer(syntax highlighting, inline edit),HtmlRenderer(sandboxed iframe with print/refresh),MermaidRenderer(lazy-loaded mermaid.js v11),SvgRenderer(sanitized inline SVG),ImageRenderer(fullscreen overlay),DocumentRenderer(PDF embed or download card for Office formats),CustomRenderer(plugin iframe with postMessage bridge),MarkdownRenderer ArtifactCardinline cards in message bubbles link to the side panel- Zustand
useArtifactsStorewith persisted panel width ratio and transient active/open state; panel auto-closes on chat switch
Workspace mode
WorkspaceConfigmodel carriesdisplay_name,icon,description,system_prompt,default_artifact_type,toolbar,auto_open_panel,accent_colorWorkspaceProgressPluginregistersplan_tasksandupdate_tasktools that return__workspace_progress__: Truesentinel dicts- Agent factory injects workspace system prompts and external plugin prompts into the agent's enhanced system prompt
GET /api/bots/{bot_id}/workspacesendpoint discovers all workspace-capable plugins for a bot- Frontend
WorkspaceSelectorrenders chip row in empty chats;TaskProgressrenders inline checklist with status icons and progress bar ChatViewsplits into a resizable two-pane layout when the artifact panel is open, with a draggable divider
Project creation
classify_purpose()uses LLM extraction to determinesinglevsprojectintent with confidence scoringgenerate_project_proposal()produces structuredProposalBotSpecandProposalRoomSpecentries with creative naming, personality traits, tone, expertise level, and system promptscompose_system_prompt_with_personality()translates structured personality fields into natural-language "Communication Profile" directivesPOST /creation/create-projectbatch-creates all bots and rooms withtemp_id -> real_idmapping and bot-to-room assignment- Frontend wizard adds
ClassificationStep(animated AI classification with override),ProjectDetailsStep(SSE-streamed questions with rotating loading messages),ProjectProposalStep(fully editable bot/room cards with icon picker, color swatches, model selector, personality chips), andProjectConfirmStep(summary view) CreationStoreextended withai-assisted-projectflow, proposal mutation actions, andFlowKey-based step resolution
Model white-labeling
_resolve_public_id()queriesmodel_togglesforpublic_idaliases, resolving user-facing names to real provider model paths/api/modelsendpoint applies public ID remapping before returning grouped model lists; new/api/models/defaultsendpoint returns all three default slots in one request- OpenAI-compatible
/v1/chat/completionsresolves aliases internally but returns the user-facing name in responses - Bot reply messages store the actual model used in
metadata.model
Per-message model selection
ModelPillcomponent in chat footer: compact pill with search dropdown, provider grouping, capability badges, context window sizes, and manual entry mode- Selected model flows through the WS
sendMessagepayload asmodelandmodels.default
Storage refactor
BaseRepository[ModelT, EntityT]generic abstract class (cachibot/storage/base.py) provides_session(),_fetch_one,_fetch_all,_scalar,_add,_update,_delete,get_by_id,delete_by_id- Applied across
AssetRepository,MessageRepository,JobRepository, and others, eliminatingasync with db.ensure_initialized()() as session:boilerplate Bot.default_modelproperty unifies access to the effective model, replacing duplicated fallback logic
API route cleanup
require_found(value, label)generic 404 guard withTypeVarreturn-type preservation;require_room_ownership,require_member,require_roleaddedrequire_bot_ownershipandrequire_room_ownershipnow return the record, enabling chaining- Mechanically applied across ~25 route files, replacing hundreds of inline
if not x: raise HTTPException(...)blocks
Frontend cleanup
- Removed
syncPlatformChatspolling andloadPlatformChatMessages; WS handler now callsaddChatdirectly for incoming platform messages useModelsStore.refresh()consolidated from three separate API calls to onegetAllDefaults()request- Marketplace API client deduplicated via generic
fetchRemoteList/fetchRemoteItemhelpers BotCapabilitiestype gains an index signature for dynamicext_*capability keysToolIconRenderergains optionaltoolId,namealias,styleprop, and exportedresolveIconNamefunction
Marketplace telemetry
- Fire-and-forget install and view tracking POSTs to the remote marketplace API with 5-second timeout
Dev tooling
dev.ps1gainsStop-ProcessTreerecursive function for clean Uvicorn worker shutdown on port cleanup