目前是 beta 版,部分 agent 管理、worker 连接和模型路由流程仍在完善;应用、框架和模型目录中不少安装清单未在真机验证,可能安装失败;worker 首次运行需在 taOS 的 Cluster 页面输入配对码批准,否则不会自动注册。

taOS
jaylfcAGPL-3.0活跃维护自托管的 AI Agent 操作系统,把记忆、聊天、Agent 和文件都留在自己的硬件上,默认离线运行,还能把树莓派、Mac mini、游戏 PC 自动组集群。
Self-hosted AI agent OS. Your memory, chat, agents, and files stay on hardware you own, offline by default, cloud by choice. Offline AI memory (taOSmd), self-hosted multi-framework group chat, a full web desktop + app store, and auto-clustering across the consumer hardware you already have (Orange/Raspberry Pi, Mac mini, gaming PC).
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo shREADME 未给出具体显存门槛;支持 Apple Silicon(MLX)、NVIDIA、AMD、Rockchip NPU、Raspberry Pi、Android 手机等;无 GPU/NPU 的主机注册为 CPU worker,承担 embedding 与小模型推理;taOSmd 可在约 170 英镑的 Orange Pi 5 Plus 上运行。
自托管 AI agent 操作系统,让记忆、对话和文件都留在你自己的硬件上,默认离线运行
自托管的 AI Agent 操作系统,把记忆、聊天、Agent 和文件都留在自己的硬件上,默认离线运行,还能把树莓派、Mac mini、游戏 PC 自动组集群。
核心能力
- taOSmd 记忆系统在 LongMemEval-S 上端到端准确率 97.0%
- 框架无关设计,切换 SmolAgents/LangChain 等不丢历史与配置
- 多框架 agent 可在同一频道群聊,支持 17 种框架
- 把 Orange Pi、Mac mini、游戏 PC 等闲置设备组成分布式推理集群
- 内置 Web 桌面、应用商店与本地模型目录,含 RK3588 NPU 与 Hailo 变体
容易踩的坑
- v1.0.0-beta.56最新正式版2026-10-15 · 2026-10-15 16:17 UTC
Security hotfix cut from beta.55.
Security
- Agent containers now reach the controller through a dedicated loopback listener (
agent_controller_port, default 6972) so agent requests are never mistaken for the local console. New deploys are refused until the listener is verified, and existing agents are moved onto it at controller startup. (GHSA-j7pr-x9wf-86g6)
Update from Settings. Until you have updated, do not use the swipe unlock method on an install that runs agents.
- Agent containers now reach the controller through a dedicated loopback listener (
- v1.0.0-beta.552026-10-02 · 2026-10-02 22:28 UTC
查看更新说明
Added
- Operators can now review a registered agent's active scope grants per project from the Agents app and revoke them (individually or the whole project) through the admin-gated
POST /api/projects/{id}/members/revoke-agentroute. (#2985). - Lock screen: a physical device agent (taOSusb) appears while it is plugged
in and disappears when it is unplugged, and can be asked to do things from
the chat sheet. Demo-gated behind
TAOS_LOCK_DEMO_DEVICE_AGENTSAND the Settings demo-mode switch, and off by default. - Lock screen: no cap on the agent islands; the feed scrolls, and a new agent goes at the bottom.
- Lock-screen pull-down USB tile: switch the USB-C port between USB network, charge only and file transfer. The switch goes through the root drop box and the answer is the read-back after the mode lands.
- Local speech-to-text in the LLM gateway:
POST /api/llm/v1/audio/transcriptions(OpenAI-compatible multipart,jsonortextresponse) transcribes 16 kHz mono PCM WAV up to 30 s through the on-devicetaos-sttddaemon on127.0.0.1. The upload is capped while it streams and is never written to disk; there is no cloud fallback. Helpers live intinyagentos/llm_gateway/stt.pyfor reuse by a device voice route. - macOS worker install registers Apple Silicon as a
gpu-metalresource (#37).scripts/install-worker.shnow runs a macOS accelerator probe in its Darwin branch: arm64 with Metal present selects thegpu-metalresource class (MLX / llama.cpp Metal / Core ML on unified memory, 1 concurrent task), and probes the python for the MLX runtime only to advise on GPU inference. Intel Macs, and arm64 hosts whose Metal probe answers nothing (a VM), fall back tocpu-inference.TAOS_FORCE_METAL=1forces the Apple Silicon branch on a bench box whose probe is silent;TAOS_WORKER_RESOURCESoverrides the detected set. POST /api/agents/registry/{canonical_id}/rotate-tokensnow replaces the credential ON the same canonical identity and returns the new token in the response, instead of only bumpingtoken_min_iat. The cutoff moves tomax(now + 1, current_cutoff + 1)and the replacement is minted at the resulting cutoff, so a token minted in the same second is superseded rather than surviving its own rotation. Owner or admin may rotate an identity they own; an agent may rotate its OWN identity with its own live registry JWT (the route joins the middleware's Bearer allowlist), giving agents the self-service "rotate my credential" action they lacked. Mint responses (register, mint-internal, auth-request poll, rotate) now carry astorage_guidancefield: store the token in two migration-surviving locations, mode 0600, outside git. (taOS #2158)docs/design/cross-node-summarization.md: design spike for taOS #156 — idle CPU nodes compress old conversation segments in the background. Covers node eligibility (derived from worker status, GPU leases and idleness), how summaries are produced, stored and pulled back through the RAG path, stale-summary vs live-context consistency rules, and a three-slice plan (local compression behind an idle gate, cross-node dispatch, live-context splice) with per-slice acceptance criteria. Design only — no behaviour change in this PR.- Follows the #3225 Lead review: the summary row identity is owner-scoped (
user_idin the store primary key, the vectormetadata_jsonand both lookup tiers, since agent names are not unique under per-user namespacing), and the "default on or default off" choice is recorded as an open product question instead of being assumed. - Invite bundle
relayendpoint kind: whenTAOS_CONTROLLER_RELAY_URLis set to anhttps://URL or anhttp://loopback URL, it is emitted at priority 1 ahead of LAN and mesh endpoints. Non-loopbackhttp://relay and publichttp://callback-host endpoints are omitted with a logged warning rather than downgraded to cleartext. - Design doc for the ski
- Operators can now review a registered agent's active scope grants per project from the Agents app and revoke them (individually or the whole project) through the admin-gated
- v1.0.0-beta.542026-10-02 · 2026-10-02 22:28 UTC
查看更新说明
Added
- Lock screen: the System panel now lists each agent's CPU, RAM and storage alongside the device readings.
- Lock screen: the phone, mailbox and apps panels no longer show "not wired up yet" placeholders over their content.
- Lock screen: summoning the agent chooser on a dark screen no longer flashes the lock screen first, and the arc fades up out of black.
- Lock screen: closing the agent chooser that was summoned on a dark screen returns to black instead of revealing the lock screen.
- Lock screen: the power menu, quick-settings radios and camera shortcut now write their privileged request durably and through one writer, so two taps in quick succession can no longer be confused for each other.
- Lock screen: swipe down from the top edge for a quick-settings shade with a brightness slider.
- Lock screen: the power menu is now a centred dialog over the blurred screen rather than a bottom sheet, and Emergency call is red.
- Lock screen: the agent chooser opens on the agent you last left it on, and arranges the faces with the most recently used first.
- Lock screen: pressing the category icon you are already on fades the cards away so you can see the screen underneath; pressing it again brings them back.
- Lock screen: the Phone, Mailbox, Apps and Projects panels now carry content, and pending decisions appear at the top of Alerts where they can be approved or dismissed without leaving the screen.
- Lock screen: the Settings tab is replaced by Projects.
- Lock screen: panel content is scripted demo data served by
/auth/lock-panels, which is console-only and 404s unless bothTAOS_LOCK_DEMO_AGENTSandTAOS_LOCK_DEMO_PANELSare set. The lock screen renders before sign-in, so there is no path from any of it to a real account. - Lock screen: holding the power key for 1.5s opens a power menu with Power off, Restart, Stop all agents, Screenshot and Emergency call. A short tap still toggles the screen.
- Lock screen: "Stop all agents" and "Emergency call" ask for confirmation before acting.
- Handset: double-tapping the dark screen wakes it. A single stray touch no longer does.
- Lock screen: the camera shortcut beside the unlock bar now opens the taOS camera app instead of saying there is not one.
- Lock screen: blanking the screen now dismisses the volume bezel and agent chooser, so neither ghosts onto the next wake.
- Lock screen: the Phone, Mailbox, Apps and Projects panels now render their "nothing here" state on a device without the demo content, instead of being blank.
- Lock screen: "Stop all agents" in the power menu now asks for the passcode. The confirm collects the intent and raises the keypad, so the agents are stopped as the signed-in user. Power off and Restart are unchanged: holding the power key already did both from the lock screen.
- Lock screen: a volume key on a dark screen wakes it and shows the agent chooser over black, rather than acting invisibly.
- Handset: volume presses are ignored while the proximity sensor says the phone is in a pocket or against something.
- Lock screen: the first volume-down press only opens the chooser; it no longer also rotates it.
- Lock screen: the pull-down shade has Wi-Fi and Bluetooth switches alongside the brightness slider.
- Lock screen: a surface opened while the screen is in standby returns to standby when it closes, rather than sometimes leaving the lock screen up.
- Lock screen: a torch toggle and a camera shortcut sit either side of the swipe-to-unlock bar. The torch drives the flash LED directly.
- Lock screen: volume-down now moves toward your most recently used agent on the rotary chooser.
- Lock screen: the microphone on an agent island opens a centred dialog over the blurred screen instead of a bottom sheet.
- Lock screen: changing the volume on a dark screen no longer leaves the lock screen showing when the slider goes away.
- Lock screen: opening an agent thread slides the threa
- v1.0.0-beta.531.0.0-beta.532026-09-16 · 2026-09-16 11:39 UTC
查看更新说明
Added
- Lock screen: keyboard focus now survives the islands' 15-second refresh. The poll rebuilt the agent list from scratch, which destroyed whichever island held focus and dropped the user back to the top of the page; because the islands and their mic buttons come before the notification stacks in tab order, a keyboard or switch-access user could never tab far enough to reach a stack. Focus is now captured before the rebuild and restored afterwards, keyed on the agent rather than its position so a reordered list cannot silently move focus to a different agent.
- Phone lock screen: a weather reading between the clock and the agent islands (Liverpool, °C and mph), fetched server-side and cached so a woken handset does not call the forecast API once per paint.
- Phone lock screen: iOS-style notification stacks under the agent islands.
One collated pile per source — mail, X, Reddit, missed calls, SMS — newest
first, with the rest of a source's banners tucked behind the top one and a
count on it; pressing a pile fans it out in place. Scripted demo content
only, on the same
TAOS_LOCK_DEMO_AGENTSflag as the placeholder agents: this screen renders before sign-in and never reads a real inbox. - Phone lock screen: the agent islands and the notifications now scroll as one feed instead of the islands scrolling alone, and the cut edge fades rather than slicing a card in half.
- Shared-GPU coordination over the A2A bus (taOS #893). Agents sharing one card
can
GET /api/a2a/gpu/check(folds the channel's open[GPU CLAIM]/[GPU RELEASE]messages into the claims still held and subtracts them from the node's live free VRAM), thenPOST /api/a2a/gpu/claimfor an admission-checked claim that both registers a real cluster lease (TTL, kept alive withPOST /api/a2a/gpu/renew) and posts the[GPU CLAIM]line peers read;POST /api/a2a/gpu/releasefrees it andPOST /api/a2a/gpu/requestasks for a window when blocked. The cluster lease applies to nodes the controller knows as cluster workers; a node it does not know is coordinated over the bus alone (admission-checked and posted, with no local TTL). Claiming refuses (409) on another holder's open claim or insufficient VRAM, and CHECK/CLAIM return 503 rather than reporting a node free when the bus cannot be read, so two agents can no longer silently co-load past the card's VRAM. An agent posts as its own registry identity (scopea2a_receiveto check,a2a_sendto act) and the node label resolves to a cluster worker's heartbeat VRAM or the controller's own shared VRAM ledger. - Claims carry their own expiry.
POST /api/a2a/gpu/claimpublishesexpires=<unix ts>on the[GPU CLAIM]line (the backing cluster lease's expiry, or the requested TTL for a bus-only node), rounded up so a published expiry can never precede the lease it describes, andPOST /api/a2a/gpu/renewreposts that line as it extends the lease — on the channel the claim was made on, since the channel is an input to the claim and never to its renewal. If the repost fails the local extension is rolled back rather than leaving a lease that peers have already seen lapse. The fold drops a claim whose published expiry has passed, so a holder that crashed or stopped keeping alive no longer blocks the shared card until its claim ages out of the fold window. A claim posted by hand without anexpires=is unchanged: it has no time-based expiry, so only a RELEASE closes it - though it is still limited by the fold window (the newest 500 messages), so a long-lived one is reposted periodically. - Agents can request project creation via
POST /api/agents/auth-requestswithkind: "project_create", carrying requested name, slug, and purpose. A taken slug returns 409 with suggestions; a free slug creates a pending Decision. Approving the Decision creates the project and makes the requester the lead member; denying it marks the request
- v1.0.0-beta.521.0.0-beta.522026-09-08 · 2026-09-08 09:28 UTC
查看更新说明
Highlights
- Sign in from the device's own screen. taOS renders its own on-screen keyboard on the login and setup pages, and a 4-12 digit PIN is available as a second sign-in method. A PIN is accepted only from the console, never over the LAN or through a proxy. The first-run wizard and Settings > Account both offer it.
- Power-cut durability, second pass.
config.yaml, the Fernet secrets key, the hub and mesh credential stores, the wake budget and several other small state files now go through the crash-safe writer (temp file, fsync, rename, directory fsync), closing the class of failure that wiped an account store on 2026-08-21. Two processes sharing a data dir can no longer overwrite each other's key material on first boot. - Security hardening (full list below): agent identity for skill execution is bound to the presented credential rather than the request body; every per-key rate limiter is bounded; notification and other HTML sinks escape agent-supplied text; SSRF, CSRF and token-path fixes.
- Cluster: workers on a beta can see newer betas again; split-brain layer-2 protection is actually reachable.
- Agents and projects: agent container provisioning requests (P1/P2), tuiui apphost conduit (D1), UnifiedPush for Android, cross-project kanban aggregate, project-task PATCH no longer drops edits silently.
- Dependency:
@tiptap/core3.30.5 (closes Dependabot alert #63).
Upgrade check: a controller upgrade was run over a real 1.0.0-beta.50 data directory before tagging (evidence in the PR #2904 comment) and completed cleanly.
The full 1.0.0-beta.52 changelog is long; it lives in CHANGELOG.md. Compare: v1.0.0-beta.51...v1.0.0-beta.52.
Security
- Skill-exec agent identity is now derived from the presented local-token
credential binding, not from the request body. A deployed agent passing
another agent's handle in the body is rejected with 403 instead of being
served.
_resolve_agent_workspace,_capture_tool_receipt,_check_execution_policy, notes and todo tools all key off the same credential-boundagent_name. - Rate limiters can no longer be made to exhaust memory. The per-key registries
behind the unauthenticated project-invite redeem, the cluster manual-claim,
the routine webhook and the client-log capture grew without bound, so a
caller with a large address range (an IPv6 /64 is 2^64 keys) could push the
controller into an out-of-memory kill on a small board. (The peer routes
registry already evicted opportunistically at 2000 entries; it carried the
same brute-force and clock-step defects as the others, described below.)
All five now share one bounded limiter in
tinyagentos/rate_limit.pyand evict the least recently used key once 2000 are tracked. - Theme (
.taostheme) installs and backup restores are now guarded against archive bombs: a sharedsafe_archivehelper caps the declared uncompressed total, per-member size and member count before anything is read or written, and a backup tarball is now extracted under the path-safe tar filter (an unsafe member fails the restore instead of being silently skipped). A tarball's headers are judged one at a time as they arrive, so a compressed member over the cap is rejected without being decompressed first. - Theme, backup and userspace-app uploads (32 MB, 64 MB and 64 MB) are refused with
413while the request body is still arriving, so an oversized upload is no longer spooled to temporary storage before the handler sees it. - A
.taosthememember resolving to the theme directory itself (for example.) is now rejected as an unsafe path instead of crashing the install. - A tar member declaring a negative size (a base-256 size field on a directory or symlink header, which CPython's
tarfilehands through intact) is now rejected outright inste
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
taOS
Your AI, your hardware, your data. Self-hosted AI where your agents' memory, conversations, and files live on machines you own, fully offline when you want, cloud only when you choose.
Beta (2026-06-02). This is beta software meant for testers running it on their own hardware, so expect rough edges. The install script, backend, API, memory system (taOSmd), and multi-framework group chat all work; the desktop GUI is wired up for everyday use but a few flows (some agent management, worker connections, model routing) are still being smoothed out. Star or watch the repo to follow progress and catch the next release.
A heads-up on the catalogs: with 100+ apps, 16 frameworks, and a large model catalog, plenty of install manifests have not been exercised on real hardware yet, so some apps, frameworks, and models will fail to install. If one does, open an issue with the name and the error you saw and I will fix the manifest as soon as I can. These reports are genuinely useful, most manifest fixes ship same-day.
Self-hosted AI agent platform that runs on whatever hardware you have. An old laptop, a Raspberry Pi, a gaming PC, an SBC gathering dust, or all of them at once. taOS turns your spare hardware into a distributed AI compute cluster.
A full web desktop environment with 43 bundled apps, 109 catalog apps, 47 MCP plugins, 17 agent frameworks, a curated local model catalog of 120 manifests covering LLMs, vision, embeddings, audio, and image generation (including RK3588 NPU variants via c01zaut/happyme531 and Hailo-10H HEF variants via hailo-ollama), plus 167k+ searchable models from HuggingFace, agent deployment, training, image/video/audio generation, and full system monitoring, all from a single web dashboard. Supports Apple Silicon (MLX), NVIDIA, AMD, Rockchip NPU, Raspberry Pi, Android phones, and more.
Framework-agnostic by design. taOS owns everything that matters: your agent's memory, files, communication channels, model access, and configuration. The agent framework is just a replaceable execution engine. Switch from SmolAgents to LangChain to OpenClaw and your agent keeps its entire history, all its Telegram/Discord/Slack connections, its trained LoRA adapters, its files, and its API keys. No migration, no data loss, no reconfiguration. This is possible because taOS manages the full agent lifecycle outside the framework.
taOSmd -- Framework-agnostic AI memory system. 97.0% end-to-end Judge accuracy on LongMemEval-S -- retrieve → generate → judge-with-LLM-grader, 500 questions across 50+ sessions each. For context, the most-cited open comparators -- MemPalace (96.6%) and agentmemory (95.2%) -- publish Recall@5 retrieval scores on the same dataset, which measures only whether the correct session lands in the top-5 (no generation, no judge). The metrics aren't apples-to-apples until one of us re-runs end-to-end; ours is the stricter measurement. Per-category on our hybrid-plus-query-expansion config: knowledge-update 100%, multi-session 98.5%, single-session-user 97.1%, single-session-assistant 96.4%, temporal-reasoning 94.0%, single-session-preference 90.0%. Everything runs on a £170 Orange Pi 5 Plus with no cloud dependencies. The stack: temporal knowledge graph with validity windows + contradiction detection, hybrid semantic+keyword vector search with cross-encoder rerank and LLM-assisted query expansion (the "Librarian" layer), zero-loss append-only archive, automatic fact extraction, intent-aware retrieval routing, multi-layer context assembly. Any agent framework can read/write through the HTTP API.
Your data stays yours
Most AI assistants keep your memory, conversations, and files on their servers. taOS keeps them on yours.
- Offline memory. Your AI's long-term memory is a self-hosted knowledge graph on your own box (a £170 Orange Pi is enough), not a row in someone else's cloud database.
- Self-hosted agents and chat. Your agents, their conversations, and your channels run on hardware you control.
- Your compute, your models. A local model catalog and cluster inference on your own devices; cloud models are opt-in, never required.
- Auditable and exit-able. Open source (AGPL-3.0), with a self-hostable binary mirror and an air-gapped install path. Nothing locks you in.
Sovereignty by default, cloud by choice. Run taOS fully offline, or connect a cloud model or paid remote access (taOSgo) when you decide it is worth it. The default is that your data never leaves your hardware.
Quick Start
Controller (server):
# Debian / Ubuntu / Fedora / Arch / Alpine / macOS, one-line install
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo sh
sudo apk add --no-cache bash python3 py3-pip git curl libtorrent-rasterbar sqlite nodejs npm sqlcipher-dev vulkan-tools
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo sh
sudo apt-get update && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
bash python3 python3-venv python3-pip git curl ca-certificates \
libtorrent-rasterbar-dev libboost-python-dev sqlite3 libsqlcipher-dev vulkan-tools
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo sh
sudo dnf install -y bash python3 python3-pip git curl \
rb_libtorrent-devel rb_libtorrent-python3 boost-python3 \
sqlite nodejs npm sqlcipher-devel vulkan-tools
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo sh
sudo pacman -Sy --needed bash python python-pip git curl \
libtorrent-rasterbar boost sqlite nodejs npm sqlcipher vulkan-tools
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo sh
Node 22 is installed by the script itself (NodeSource); it is not in these lists.
Run without sudo to install as a user-mode systemd unit instead. The script is idempotent, safe to re-run on an existing install. Supports env-var overrides for install path, branch, and port.
Verified installs
Platforms where a clean controller install has been verified end to end. Ran it somewhere else? Open an issue with your install log (the installer prints an environment banner for exactly this) and it gets added here.
| Hardware | OS | Verified |
|---|---|---|
| Orange Pi 5 Plus 16GB (RK3588) | Armbian (Debian trixie base) | Runs the maintainer's stack daily, including the RK3588 NPU memory/embedding path |
| Orange Pi 5 Pro (RK3588S) | Official Orange Pi Debian 12 (Bookworm) vendor image | Clean-install community report (#1540); fixes shipped in v1.0.0-beta.17, including the RK3588 NPU backend with preloaded models |
| x86_64 PC | Fedora | Maintainer-verified install (also serves as a GPU cluster worker with an RTX 3060) |
| x86_64 PC | Debian | Maintainer-verified install |
| WSL2 on Windows 11 | Default Ubuntu image (incl. Python 3.14) | Clean install; the installer provisions a compatible Python automatically |
| Mac | macOS | Installer verified in early betas; the dedicated macOS app (Apple Containerization) is a separate track |
Manual / development:
pip install -e .
python -m uvicorn tinyagentos.app:create_app --factory --host 0.0.0.0 --port 6969
Open http://your-host:6969 (or http://taos.local:6969 with mDNS). The root URL loads the desktop shell directly.
Web Desktop Experience
taOS ships with a full browser-based desktop environment. Open it at http://your-host:6969/ and you get a window manager, dock, launchpad, notifications, widgets, and 43 bundled apps, no native install required. On phones and tablets it automatically swaps to a widget-first home screen with swipeable pages, a persistent dock, and desktop-style app windows with close/minimise title bars, installable as a fullscreen PWA from the browser's "Add to Home Screen".
- Window manager. Float, snap zones, drag, resize, minimise, maximise, close
- Top bar. Global search (Ctrl+Space), clock, notifications, widget toggle
- Dock. Pinned apps with running indicators, customisable layout
- Launchpad. Fullscreen app grid with search
- Right-click desktop menu. New folder, change wallpaper, widgets, save to memory, settings
- Wallpaper picker. 8 built-in gradient wallpapers
- Widgets. Clock, Agent Status, Quick Notes, System Stats, Weather (draggable/resizable)
- Notifications. Toast stack + notification centre dropdown
- Persistent sessions. Windows, dock layout, and wallpaper restore across devices
- Login gate. Optional password protection
- Mobile/tablet mode. Auto-detects touch + screen width, widget-first home with swipeable pages, persistent dock, desktop-style app windows with title bars, iOS PWA fullscreen
- Card switcher. Horizontal carousel triggered from the dock, tap cards to switch or X to close
- Standalone Chat PWA. Messages available as a dedicated installable app at
/chat-pwa - shadcn/ui primitives. Button, Card, Input, Tabs, Switch, Toolbar
43 Bundled Desktop Apps
Platform apps (29): Messages (WebSocket chat), Mail (IMAP/SMTP accounts, read and send), Projects (Kanban + A2A), Agents (deploy wizard + logs + skills), Store (109+ apps), Settings (multi-section with Memory capture toggles, the lock screen unlock method, and an admin demo-mode switch), Models, Providers (cloud LLM provider management, add/test/remove OpenAI, Anthropic, DeepSeek, and compatible APIs), Memory (User + Agent sections), MCP (plugin manager), Channels, Secrets, Tasks, Import, Images (Image Studio: Create / Library / Edit with tier-aware inpaint + upscale backends), Dashboard (Activity), Cluster (worker management + health), Library (knowledge pipeline, document library with collections and search), Agent Browsers (manage agent browser sessions), Files (real VFS with workspace + shared folders), taOS Agent (Agent-as-a-Model endpoint), Guides, Feedback, Decisions, Notifications, Observatory, Notes, Todo, Hub (taOS hub account and sharing).
Optional taOS apps (4): Reddit (subreddit browser with saved threads and memory ingest), YouTube (video library with transcript extraction), GitHub (repository browser with code search), and X (feed monitor with bookmarks and memory capture) ship in the build but are not installed by default; install or remove them from the Store's "taOS Apps" section.
OS apps (9): Weather, Calculator (math.js), Calendar (month view), Contacts (CRUD), Browser (URL-rewriting proxy, agent-ready), Media Player (Plyr), Text Editor (CodeMirror 6 with Obsidian-style theme), Image Viewer (zoom/rotate), Terminal (real PTY + SSH client).
Games & studios (5): LoRA Studio (archive Civitai LoRAs by URL -- safetensors, previews, trigger words, and tags stored on your own cluster), Game Studio (AI-assisted game maker -- describe an idea or start from a real three.js/canvas template, edit the generated files with a live preview and an AI chat sidebar, then install locally or export a .taosapp package), Chess (plays against real agents via LLM), Wordle, Crosswords.
The Activity app includes a Cluster overview panel showing live worker status and resource stats alongside the process monitor. The Model Browser surfaces cloud models (from configured providers) alongside local catalog models, with a provider badge per entry. The deploy wizard accepts cloud models as inference targets.
Key Features
Web Desktop Shell
Full browser-based desktop OS with window manager (float + snap), dock, launchpad, right-click context menu, wallpaper picker, notifications, widgets, and persistent sessions that follow you across devices. 43 bundled apps, platform tools, OS utilities, and games, plus an optional password login gate. See Web Desktop Experience above.
Mobile & Tablet Mode
Auto-detects touch devices and swaps the desktop for a widget-first home screen with customisable multi-page layout (swipe or tap dots to navigate), a persistent dock with app launcher and app switcher, and desktop-style app windows with close/minimise title bars. The top bar features iOS 26-style frosted glass buttons for search and notifications, with a "taOS" home button. Installable as a fullscreen PWA on iOS and Android. A standalone Chat PWA is available at /chat-pwa and installs like a private Discord.
User Memory System
Personal memory powered by taOSmd, think Pieces App but self-hosted. Temporal knowledge graph + hybrid vector search + zero-loss archive auto-captures conversations from the Message Hub, notes from the Text Editor, file activity, and search queries. Per-category capture toggles live in Settings. Available in global search (Ctrl+Space) alongside apps, with a "Save to Memory" right-click option on the desktop. Agents can optionally read user memory with explicit permission via the TAOS_USER_MEMORY_URL environment variable. A "My Memory" section in the Memory app sits alongside agent memories.
User memory is unified through taosmd (issue #25): tinyagentos/routes/user_memory.py proxies writes to taosmd POST /ingest/batch and reads to GET /search?mode=bm25 (sub-300ms keyword search), with idempotent migration via POST /api/user-memory/migrate. A local SQLite FTS5 store is kept as a fallback for when taosmd is unreachable. taOS reaches taosmd at the URL configured in the TAOS_USER_MEMORY_URL environment variable.
Skills & Plugins Registry
Framework-agnostic skill system with 8 core skills (plus 20 more platform skills), memory_search, file_read, file_write, web_search, code_exec, image_generation, list_image_models, http_request, categorised by search, files, code, media, system, desktop, projects, agent, notes. Each skill declares compatibility per framework (native/adapter/unsupported) and works across all 17 supported frameworks via adapter translation. Assign or remove skills per agent from the Skills tab with compatibility badges.
Distributed Compute Cluster
Combine ANY device into one AI compute mesh, desktops, laptops, SBCs, even phones and tablets. A gaming PC handles large models, a Mac runs MLX inference, a Pi handles embeddings, an old Android phone contributes from a drawer. Cross-platform worker apps connect from the system tray (Windows, macOS, Linux) or via Termux (Android).
# Linux / macOS, one-line worker install (auto-detects headless,
# installs as a system service when run with sudo or as a user
# service otherwise; works on a fresh Debian install or your existing box)
curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-worker.sh | sudo bash -s -- http://your-server:6969
# Desktop, system tray worker app (interactive, with GUI tray icon)
tinyagentos-worker http://your-server:6969
# Android, one-line Termux setup
curl -sL https://raw.githubusercontent.com/jaylfc/taOS/master/tinyagentos/worker/android_setup.sh | bash
# Windows 10/11, one-line worker install (PowerShell, mirrors the
# Linux/macOS installer -- registers a Scheduled Task so the worker
# starts at boot and survives logout)
$env:TAOS_CONTROLLER_URL = 'http://your-server:6969'
iwr -useb https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-worker.ps1 | iex
Pairing. A worker no longer registers automatically just by reaching the controller. On first run it prints a short pairing code and announces itself as pending; you approve it in taOS (Cluster) by entering that code, which mints the worker's signing key. From then on the worker signs its register and heartbeat calls with that key, so a host on the LAN cannot register or impersonate a worker it does not physically control. Re-run the installer to resume pairing if you do not approve it straight away.
Adding a worker manually (LAN, no discovery). If you prefer not to broadcast on the network, run the installer with TAOS_PAIR_MANUAL=1. The worker prints its own LAN address and a one-time PIN instead of announcing itself. In taOS open Cluster, click Add worker, and enter that address and PIN: the controller authorises the pair and the worker's next poll claims its signing key. Nothing is advertised on the network; you type the two values by hand. The authorisation is single-use and expires after 15 minutes. (taOSgo, the optional remote-access tier, automates this end to end over the relay so there is no IP or PIN to copy.)
Hardware detection on minimal systems. The worker detects NVIDIA GPUs even when nvidia-smi is not installed: it probes /proc/driver/nvidia to confirm the driver is loaded and looks up VRAM from a known-cards table keyed by device ID. On native (non-container) hosts the installer offers to install nvidia-utils (via apt/dnf/pacman, matching the loaded driver branch automatically). Rockchip NPU detection uses unprivileged sysfs paths so it works inside LXC containers and other restricted environments where /sys/kernel/debug is inaccessible. Hosts that have neither GPU nor NPU are registered as CPU workers and contribute embeddings and small-model inference.
Sudo and freshness. The Linux/macOS worker installer is designed to run on either a fresh Debian install or your existing system. No clean slate required. It installs cleanly on Debian, Ubuntu, Fedora, Arch, Alpine, and macOS.
- Linux (recommended path): the installer runs in two phases. Phase 1 runs on the bare host: it installs incus, nftables, and btrfs-progs, creates a privileged LXC named
taos-workerbacked by a btrfs storage pool (taos-worker-pool), adds an nftables DNAT rule that forwards bare-host port:8443to the LXC, then re-executes the script inside the container. Phase 2 runs inside thetaos-workerLXC: it installs the Python runtime, clones the repo, builds the worker venv at~/.local/share/tinyagentos-worker/, and installs/etc/systemd/system/tinyagentos-worker.serviceas a root-run system unit inside the container. The worker daemon itself is outbound-only to the controller. - macOS: the two-phase LXC flow is skipped (incus is Linux-only). The script installs directly on the host, pairs the worker with the controller (writing the signing key to
$INSTALL_DIR/.taos-worker-state, the directory the plist pointsTAOS_WORKER_STATE_DIRat, so the daemon does not come up "not paired"), and registers it as a launchd agent (~/Library/LaunchAgents/com.tinyagentos.worker.plist), auto-started at login. It also picks the worker's resource class from the hardware: Apple Silicon (Metal present) registers asgpu-metal(MLX, llama.cpp Metal, or Core ML on unified memory, 1 concurrent task), while an Intel Mac (or an arm64 VM with no Metal GPU) falls back tocpu-inference. The detected classes are exported asTAOS_WORKER_RESOURCES(override it to force a class, or setTAOS_FORCE_METAL=1to force the Apple Silicon branch when a probe reports nothing) and baked into the plist, so the registration survives a re-login even while no GPU backend is loaded yet. The controller validates the advertised classes against the resource grammar indocs/design/resource-scheduler.mdand rejects a registration or heartbeat carrying an unknown class.
A truly clean Debian install is the smoothest experience because nothing else is competing for ports or sysfs paths, but the script is hardened against common existing-system gotchas: it detects headless environments and skips the desktop tray, it gracefully handles unreadable /sys/kernel/debug paths on hosts that mount debugfs but restrict it, and it scopes its writes to ~/.local/share/tinyagentos-worker/ plus the systemd unit.
Backend-Driven Discovery (Core Principle)
The source of truth for "what can I run right now?" is the live state of the backends, never the filesystem or a config file. Every subsystem that asks "is model X available? which backend serves capability Y? what's loaded on the NPU?" answers by polling the backends and reading a central in-memory index. On-disk catalog manifests describe the universe of known-good models; the live backend catalog describes the intersection of that universe with what's actually loaded right now. This principle applies to models, capabilities, skills, workers, and accelerators. It makes filename conventions irrelevant, makes cross-platform backends a drop-in (CUDA/Vulkan/ROCm/Metal just register and get discovered), and lets the scheduler route work only to backends that are genuinely ready. See docs/design/resource-scheduler.md.
Local Model Catalog + Live Model Browser
A curated catalog of 120 vetted model manifests ships in-tree, every download URL is verified against its upstream host and every download is SHA256-verified against a checksum pinned in its manifest, covering LLMs (Qwen3, Qwen2.5, Llama 3.1/3.3, Gemma 2/3, Phi-4, Mistral, Mixtral, DeepSeek, Granite, Command-R), vision models (Qwen2.5-VL, MiniCPM-V 2.6, Moondream2, Florence-2, LLaVA), embeddings (nomic, bge, mxbai, snowflake-arctic), rerankers (bge-reranker-v2, qwen3-reranker), speech (Whisper tiny→large-v3-turbo, Kokoro TTS, Piper, Parakeet), image generation (SD 1.5 LCM, Dreamshaper 8 LCM, SDXL Turbo/Lightning, Flux schnell/dev, SD3.5, PixArt-Σ, Playground v2.5, Kolors, AuraFlow), and image tools (RMBG-1.4, BiRefNet, Real-ESRGAN, 4x-UltraSharp, GFPGAN, CodeFormer, ControlNet canny/depth/pose). RK3588 NPU variants are included via c01zaut (Qwen2.5 1.5B→14B RKLLM) and happyme531 (LCM Dreamshaper SD as multi-file RKNN). Hailo-10H NPU variants (Raspberry Pi 5 + AI HAT+2, served by hailo-ollama) ship as .hef manifests: DeepSeek-R1-Distill-Qwen 1.5B, Llama 3.2 1B, Llama 3.2 3B, Qwen2 1.5B, Qwen2.5 1.5B, Qwen2.5 Coder 1.5B, and Qwen3 1.7B. Their hef_h10h content hashes are verified against the layer digest reported by hailo-ollama pull at install time, so a tampered or wrong artefact is rejected rather than silently accepted. The live Model Browser also searches 167k+ GGUF models from HuggingFace and the Ollama library. Hardware-filtered compatibility indicators show what runs on your device (green/yellow/red).
Agent Templates (1,467 Templates)
Pick from 1,467 agent templates, 12 built-in plus 196 from awesome-openclaw-agents and 1,259 from the System Prompt Library, and deploy in one click. Browse by category (28 categories), filter by source, or search. Each template includes a system prompt, recommended framework, model, and resource limits. All templates vendored locally so nothing depends on external services.
App Store (109 Catalog Apps + 47 MCP Plugins, including 13 Streaming Apps)
One-click install for agent frameworks, AI models, and services. Hardware-aware, only shows what works on your device.
Agent Deployment
5-step wizard: pick framework → choose model → configure → deploy into an isolated container (LXC on bare metal, Docker on VPS, auto-detected). Each agent gets its own memory system (taOSmd instance), its own file storage, and its own network identity. The framework runs inside the container but taOS manages everything around it: memory, channels, secrets, model access, scheduled tasks, and inter-agent communication. This means the framework is a swappable component, not a lock-in decision.
Running taOS inside an LXC (e.g. Proxmox)? Deploying an agent creates a nested container, which an unprivileged LXC cannot do -- the kernel can't remap the nested container's filesystem, so the deploy fails with an
idmapped storage / change ownershiperror. Run the taOS LXC as privileged with nesting enabled. On Proxmox: untick Unprivileged container and set Options → Features →nesting=1(pluskeyctl=1,fuse=1), then redeploy. Bare-metal and VM installs are unaffected. (taOS detects this and surfaces the fix in the deploy error.)
Channel Hub (Framework-Agnostic Messaging)
Most agent frameworks force you to wire up Telegram, Discord, or Slack directly into their code. If you switch frameworks, you rebuild all those integrations from scratch. taOS flips this: the platform owns the messaging connections and routes messages to whichever framework the agent currently uses. Switch an agent from SmolAgents to LangChain and it keeps every channel, every conversation, every connection. The framework never touches the bot tokens.
- 7 connectors. Telegram, Discord, Slack, Matrix (beta), Email (IMAP/SMTP), Web Chat (WebSocket), Webhooks
- 20 framework adapters. Thin HTTP bridges (~25 lines each) that translate the universal message format to framework-specific APIs
- Rich responses. Buttons, images, cards via universal format with inline hint fallback for any framework
- Per-agent or shared bots. Each agent gets its own bot, or share one across a group
LLM Proxy (LiteLLM)
Hidden internal gateway that unifies all inference providers behind a single OpenAI-compatible API. Each agent gets a virtual API key with budget and rate limits. The proxy is auto-configured from your backend list. Switch from a local Ollama backend to a cloud provider (or add both as fallbacks) and no agent config changes. The agent just calls its local API key and taOS routes to the best available backend.
Dynamic Capabilities
Features unlock automatically based on your hardware and cluster. Solo Pi sees core features. Add a GPU worker and image generation, video, and training appear. No configuration, the platform just knows what's possible.
Creative Studios
Dedicated studio apps for every kind of project, each a focused, native taOS workspace that runs entirely on your own cluster. Three are bundled (Images, Game Studio, LoRA Studio); Coding, App, Design, Music, Office, Web, Video, and Assistant studios are implemented but gated as optional apps (App Studio is taOS's own app builder, so agents and users can build and share new apps).
- Images Studio. Create, Library, and Edit in one app. Generate from a prompt on any discovered Stable Diffusion backend (NPU / GPU / CPU), browse a thumbnail library, and edit with tier-aware backends: inpaint and object removal, plus upscale. The platform picks the best installed backend per task and degrades gracefully when a higher tier is missing.
- Game Studio. An AI-assisted game maker. Describe a game or start from a real, playable starter template (a 3D platformer and orbit shooter on three.js, a 2D top-down collector and breakout on canvas); the taOS agent customizes the template's files to match your prompt. Edit files directly or ask the AI chat sidebar for changes, with a live sandboxed preview and a fullscreen Play mode with a mandatory exit-to-taOS control. Install a finished game locally as a sandboxed app, or export it as a .taosapp package.
- Web Studio. An AI-assisted, Wix-style website builder. Describe a site or start from a template, then edit it as stacked sections (hero, features, gallery, contact, and more) with inline text, image swaps, live theming, add/remove/reorder, and a responsive desktop, tablet, and mobile preview. Export a self-contained static HTML page. Sites persist on your own cluster.
- LoRA Studio. Paste a Civitai model URL and taOS archives the LoRA on your own cluster: the .safetensors file (SHA256-verified), preview images, name, description, creator, base model, trigger words, and tags. Civitai URLs shared into the Library ingest through the same pipeline. Where Civitai geo-blocks your connection (HTTP 451), set
lora_ingest_proxy_urlin config and only this fetcher uses it. - Video Studio. Create and Library in one app. Describe a scene, pick a resolution and duration, and generate a clip on any discovered video backend (WanGP / Wan 2.1). Generated clips land in a library with inline playback, download, and delete.
AI Generation
- Images. Stable Diffusion via NPU, GPU, or CPU (multi-backend auto-discovery), surfaced through Image Studio
- Video. WanGP, LTX Video (unlocks with 6GB+ GPU worker), surfaced through Video Studio
- Audio. Kokoro TTS, Chatterbox, Piper, Whisper STT, MusicGPT
- Games. Real three.js and canvas games, customized by the taOS agent through Game Studio and installable as sandboxed apps
Training & Fine-Tuning
- LoRA Training. Train agent-specific adapters from the web UI (8GB+ GPU)
- Agent Retrain. One-click: agent audits itself, finds knowledge gaps, trains improvement
- Per-agent LoRAs. Each agent gets its own specialisation on a shared base model
- Smart routing. GPU workers get instant LoRA hot-swap, NPU uses time-shared merged models
- Deployment. Auto-converts and deploys to all backends in the cluster
Agent Memory System (taOSmd)
taOSmd is installed as a Python dependency from PyPI (pip install taosmd, pinned to 0.4.0 in pyproject.toml, published via Trusted Publishing): 97.0% end-to-end Judge accuracy on LongMemEval-S (retrieve, generate, LLM-grade against the reference answer). The most-cited open comparators (MemPalace 96.6%, agentmemory 95.2%) publish Recall@5 retrieval scores on the same dataset, which measures only "did the right session land in the top-5" with no generation and no judge, so the numbers are not apples-to-apples until one of us re-runs end-to-end; ours is the stricter measurement. The Librarian layer's LLM-assisted query expansion adds a measured +15.4% on the vocabulary-gap axis (45% recall@lag25 with full pipeline + Librarian, vs 30% without) on long-horizon sessions where the cross-encoder alone isn't enough.
Two recent additions (separate measurements -- not part of the LongMemEval-S headline above):
- Upgraded low-tier embedding default. Low-tier dense retrieval now defaults to
snowflake-arctic-embed-s: +0.057 judged retrieval quality on the full 1540-QA LoCoMo set (0.730 vs 0.674 for MiniLM) at the same 384 dimensions and the same latency (about 13ms/embed on an Orange Pi). A free accuracy upgrade for low-end and SBC installs. MiniLM stays supported and is the model the 97.0% LongMemEval-S headline was measured on; existing installs are unchanged. - Provable Memory (opt-in, off by default). Because taOSmd keeps a zero-loss archive, it can verify every extracted fact against the source spans it came from, mark it supported or unsupported, and demote (never delete) the unsupported ones at recall. That makes the extraction-hallucination rate a standing, measurable number: 18.8% of extracted facts on LoCoMo were not fully supported by their source (cross-family verified) -- something extraction-based systems that discard the source cannot measure.
Memory layers: temporal knowledge graph with validity windows + contradiction detection, hybrid semantic+keyword vector search (ONNX arctic-embed-s low-tier default / MiniLM / Nomic), zero-loss append-only archive with FTS5, session catalog over the archive, and a crystal store of compressed session digests with extracted lessons. Processing: regex + LLM fact extraction (qwen3:4b), 30-min-gap session splitter, tiered enricher (heuristic / 4B / 9B+), session crystallizer, secret filtering with 23 regex patterns auto-redacting on every ingest, and Ebbinghaus retention scoring with hot/warm/cold tiers. Retrieval: parallel fan-out across all layers, query expansion, intent classifier that weights an RRF merge, ms-marco-MiniLM cross-encoder reranking, BFS graph expansion, and a token-budgeted L0-L3 context assembler.
taOS wraps taOSmd with platform-specific scheduling (job queue, resource manager, worker heartbeat, gaming detection) for multi-agent coordination on resource-constrained devices. QMD (qmd.service, port 7832) remains as the NPU-accelerated embedding / rerank / query-expansion backend. Per-tenant isolation is handled by dbPath routing: each agent's index lives at data/agent-memory/{name}/index.sqlite.
A2A bus. taosmd ships an agent-to-agent messaging bus with realtime wake support (a2a-watch / bridge). Agents register on the bus and exchange messages directly, with a bundled skill that agent frameworks can load. taOS uses this for inter-agent coordination without routing through the channel hub.
- Document ingestion. Drag-and-drop files into agent memory via the web UI or API. Supports text, markdown, PDFs, code.
- Automatic embedding. Documents are chunked and embedded using your local inference backend (NPU, GPU, or CPU). No external API calls.
- Keyword search. FTS5 full-text search across all documents with ranking (
GET /search) - Vector search. Semantic similarity search via sqlite-vec using locally-generated embeddings (
POST /vsearch) - Hybrid search. Combines keyword + vector results using Reciprocal Rank Fusion for best-of-both accuracy
- Browse / collections.
GET /browse,GET /collections,POST /ingest,POST /delete-chunk - Memory browser. Web UI to search across all agents' knowledge bases from one place
- Framework-independent. Memory lives on the host, not in the framework or the container. Switch frameworks and the agent's entire knowledge base stays intact.
- Portable. Export an agent's config, channels, and memory. Import on another taOS instance.
The embedding backend (qmd.service, port 7832) provides an Ollama-compatible embedding API with batch embedding and retry logic, backed by rkllama on RK3588 or node-llama-cpp elsewhere. LiteLLM also exposes a /v1/embeddings endpoint that routes to the same backends so frameworks using the OpenAI embeddings API work without any shim.
Agent Workspace
Click on any agent to enter their "virtual computer", a tablet-like interface with app icons: Messages, Memory, Files, Tasks, Channels, Logs. Browse their conversations, search their knowledge, manage their files. Like logging into their personal device.
Shared Folders
Create shared file spaces for agents, groups, and departments. The design team shares mockups, the research team shares documents. Per-agent access control.
Agent Management
- Communication Channels. Telegram, Discord, Slack, Matrix, web chat, email, webhooks (Easy/Advanced setup)
- Secrets Manager. Encrypted storage with per-agent access control
- Inter-Agent Relationships. Groups, departments, lead agents, permissions matrix
- Scheduled Tasks. Cron jobs with presets, per-agent or group assignment
- Data Import. Drag-and-drop file upload to agent memory
- Memory Browser. Keyword + semantic vector search across all agents
- Agent Export/Import. Portable JSON export of agent config, channels, and group memberships
External Coding Agents (Bring Your Own AI Team)
Connect any CLI coding agent (Claude Code, grok, kilo, opencode, aider, or your own) to a taOS project as a real team member. No shared passwords, no glue scripts: agents join through a consent flow and work through the same board and messaging surfaces your other agents use.
- Access requests + phone approval. An agent (or its harness) fires
POST /api/agents/auth-requestswith an identity claim and the scopes it wants. You approve or deny from the taOS notification on your phone, pick which project it joins, and taOS mints it a scoped identity (Ed25519 registry JWT, canonical id). Narrow-not-widen: you can grant less than requested, never more. - Agent registry. Every connected agent is a first-class registry identity with its own token, scopes, and project membership. Revoke or re-scope at any time from the Agents app.
- Kanban work loop. Bounded tasks live on the project board; a connected agent claims a task with its token, works in its own branch, opens a PR, comments the PR link back on the task, and closes it. Your reviewer (human or a stronger agent) gates every merge.
- A2A coordination bus. Agents coordinate on shared channels (
general,decisions, project channels) so a fleet of different models and harnesses can hand work to each other without stepping on toes. - Proven in production. taOS itself is developed this way: a fleet of consent-minted CLI agents on free models works the taOS board daily, with every PR reviewed before merge.
More on the flow in docs/design/external-agent-onboarding.md.
Authentication
Password-protected dashboard with persistent sessions. Per-agent API keys. Exempt paths for cluster workers and health checks.
Agents authenticate with their own identity, not the owner password. Each registered agent has an Ed25519 registry identity (canonical id + signed JWT). The owner password is human-only and is never handed to an agent. An agent calls scoped endpoints by presenting Authorization: Bearer <registry-jwt>; the route verifies the signature against the registry public key and checks the agent is active and holds the required scope grant. Today this covers the registry feed endpoints (scope registry_feeds_read), the A2A bus proxy (a2a_receive to read, a2a_send to post), the kanban board (project_tasks for read/lifecycle/comments, project_tasks_create to author cards), the canvas (canvas_read/canvas_write), project Files (files_read/files_write), and raising a decision (decisions_write). The Bearer allowlist is exact: a registry JWT authenticates only those agent paths, never an arbitrary route.
Onboarding an internal driver agent: an admin mints its identity once with taosctl agents mint --handle @taOS-dev --slug taos-dev --scopes a2a_send,a2a_receive (or taosctl agents seed-internal to mint the four built-in driver agents idempotently). Minting prints the registry JWT; store it on the agent host in a gitignored per-host file (for example ~/.config/taos/agent-token) and have the agent send it as Authorization: Bearer <jwt>. Re-running mint/seed for an existing handle reuses the same canonical id and re-asserts the grants, so it is safe to run again.
Model Conversion
Convert models between formats (GGUF→RKLLM, HF→GGUF, GGUF→MLX). Capability-gated, "Convert for NPU" button appears when an x86 worker joins the cluster.
Message Hub (Built-in Chat)
Discord-style messaging built into the platform. Chat with your agents, create topic channels, share files, view rich embeds and interactive components. Available as a standalone PWA (install it like a private Discord app) or within the main dashboard.
- Channels -- DMs, groups, topics, threads, agent sessions
- Rich messages -- markdown, code blocks, embeds with fields/images, interactive buttons and selects
- Canvas -- agents present visual content (charts, mockups, interactive choices) in a split view alongside the chat. Powered by CanvasX with live updates.
- Real-time -- WebSocket hub with typing indicators, presence, and token-by-token streaming of agent responses
- File sharing -- drag-and-drop upload, inline preview for images/video/audio/PDF
- Dual PWA -- install the chat as a separate app from the management dashboard
Terminal with SSH
Real PTY backend exposed over WebSocket (/ws/terminal) in the Terminal app. Pick Local Shell or SSH Connection; the SSH form takes host/port/user/password (key-based auth supported) and recent hosts are saved to localStorage. Built on xterm.js with Nerd Font, 256 colours, FitAddon, and WebLinks.
Browser App
Built-in browser with two engines. A lightweight server-side rewriting proxy renders arbitrary sites inline (bookmarks bar, Open in Tab, iOS PWA auto-detect). Alongside it, a full WebRTC-streamed Chromium (Neko) runs locally on the host, including the Pi, and renders any site with working video. The streamed browser is one persistent session you can reattach to from any device, presents a touch-friendly mobile layout on phones, and also surfaces agents' own browser sessions. It is becoming the default, with the proxy kept as a lightweight fallback.
MCP Plugin Catalog (47 Plugins)
app-catalog/plugins/ ships 47 MCP servers including the official set (filesystem, git, fetch, memory, sequential-thinking, time), GitHub, Playwright, Docker, Kubernetes, databases (Postgres/MySQL/SQLite dbhub, MongoDB, Redis, Chroma, Supabase), documents (pandoc, office docs, spreadsheet, markdownify, excel), comms (Slack, WhatsApp, email, Notion, Obsidian, Atlassian, Google Workspace), infra (AWS, Cloudflare, Grafana, arXiv, YouTube transcript, Firecrawl), agent-specific (browser-use, Camoufox, context7, supergateway, engram, Exa), Home Assistant, Todoist, and more.
Global Search
Search across agents, apps, messages, and shared folders from a single endpoint. Finds anything on the platform instantly.
Monitoring & Management
- Dashboard. KPIs, CPU/RAM sparklines, activity feed, quick actions, backend health, cluster stats. The Loaded Models widget unions controller-local models with each cluster worker's heartbeat-reported models, with a per-host badge on each entry. It always renders, shows an empty state when nothing is loaded rather than hiding.
- Health Debug Page. Checks all services, backends, agents, disk, RAM with live status
- Notifications. Health alerts, backend up/down, worker join/leave, webhook forwarding (Slack/Discord/Telegram). Toast notifications appear top-right. The welcome notification is gated on a
localStorageflag so it fires once per install, not on every page load. - Agent Logs. Real-time log viewer with auto-refresh
- Backup & Restore. Downloadable config backup, one-click restore, scheduled auto-backup (daily/weekly)
- System Updates. Pull latest from GitHub via Settings page. taOS periodically checks for updates and sends an install ping carrying the version, platform, and a stable random per-install id (a UUID stored in the data dir, no personal data) so the project keeps an exact install count; disable with
TAOS_NO_UPDATE_PING=1or in Settings. - Provider Management. Add/test/remove inference providers with live connectivity checks. The Providers desktop app manages cloud LLM credentials; the model browser reflects configured providers automatically.
App Catalog (109 Catalog Apps + 55 Desktop Apps + 47 MCP Plugins)
| Category | Apps |
|---|---|
| Agent Frameworks (17) | SmolAgents, PocketFlow, OpenClaw, nanoclaw, PicoClaw, ZeroClaw, MicroClaw, IronClaw, NullClaw, Moltis, Hermes, Agent Zero, OpenAI Agents SDK, Langroid, ShibaClaw, DeerFlow, OpenCrabs (beta) |
| Streaming Apps (13) | Blender, LibreOffice, Code Server, GIMP, Krita, FreeCAD, Obsidian, Excalidraw, JupyterLab, Grafana, n8n, Terminal, Neko Browser |
| LLM Models | 120-manifest local catalog: Qwen3 0.6B-32B, Qwen2.5 0.5B-72B (+ RKLLM 1.5B-14B for RK3588), Llama 3.1/3.2/3.3, Gemma 2/3, Phi-3.5/4/4-mini, Mistral/Nemo/Mixtral, DeepSeek, Granite, Command-R, SmolLM2, TinyLlama, plus 167k+ searchable from HuggingFace |
| Vision Models | Qwen2-VL, Qwen2.5-VL, MiniCPM-V 2.6, Moondream2, Florence-2, LLaVA 1.6 / LLaVA-Phi-3 |
| Embeddings / Rerankers | nomic-embed-text-v1.5, bge-large/small/m3, mxbai-embed-large, snowflake-arctic-embed, qwen3-embedding/reranker, bge-reranker-v2-m3 |
| Audio Models | Whisper tiny→large-v3-turbo, Kokoro TTS, Piper voices, Parakeet TDT |
| Image Models | SD 1.5 LCM, Dreamshaper 8 LCM, LCM Dreamshaper V7 (+ RKNN for RK3588), SDXL Turbo/Lightning, Flux schnell/dev GGUF, SD 3.5 Large Turbo, PixArt-Σ, SDXS, Playground v2.5, Kolors, AuraFlow, Stable Cascade |
| Image Tools | RMBG-1.4, BiRefNet, Real-ESRGAN x4, 4x-UltraSharp, GFPGAN, CodeFormer, ControlNet (canny/depth/openpose) |
| Image Gen | ComfyUI, Fooocus, SD Web UI, stable-diffusion.cpp, FastSD CPU, RKNN SD, rk-llama.cpp |
| Video Gen | WanGP (Wan 2.1/2.2, HunyuanVideo), LTX Video |
| Voice/Audio | Whisper STT, Piper TTS, Kokoro TTS, Chatterbox, MusicGPT |
| AI Tools | Perplexica (AI search), Open WebUI, Dify, SearXNG |
| Infrastructure | Gitea, Code Server, n8n, Docker Mailserver, Tailscale, Dynamic DNS |
| Home & Monitoring | Home Assistant, Uptime Kuma, File Browser, Excalidraw, Memos, Linkwarden |
Supported Hardware
| Category | Hardware | Notes |
|---|---|---|
| Apple Silicon | Mac Mini, MacBook, Mac Studio, Mac Pro (M1-M5) | Ollama (Metal) or MLX backend, 8-192GB unified memory |
| ARM + Rockchip NPU | Orange Pi 5/5 Plus, Rock 5B | 6 TOPS NPU, primary SBC target |
| Raspberry Pi | Pi 4 (8GB), Pi 5 (8/16GB) | CPU-only or with accelerator HATs |
| Pi Accelerators | Hailo-10H (40T), M5Stack LLM-8850 (24T) | LLM-capable accelerators |
| NVIDIA | GTX 1050 Ti through RTX 4090/5090 | CUDA 4-32GB or Vulkan legacy |
| AMD | RX 6600 through RX 7900 XTX | ROCm 4-24GB |
| Android | Flagship phones/tablets (12-16GB) | 7-8B models at 15-30 tok/s via Termux + llama.cpp |
| iOS/iPadOS | iPad Pro M4, iPhones (6-8GB+) | Dashboard via PWA, future native worker app |
| CPU Only | Any device | Smallest quantized models |
| Mixed Cluster | All of the above combined | A Mac, a Pi, a gaming PC, and an old phone, all working together |
Architecture
taOS Controller (FastAPI + htmx + React Desktop Shell)
├── Web Desktop Shell (window manager, dock, launchpad, widgets, 43 bundled apps)
├── Mobile/Tablet Shell (widget home, dock, app title bars, swipeable pages, iOS PWA)
├── Skills & Plugins Registry (8 core skills + 20 platform skills, 20 framework adapters)
├── User Memory (taosmd proxy: /ingest/batch + /search?mode=bm25, SQLite FTS5 fallback, auto-capture, global search)
├── Web Dashboard (77 route modules, React SPA frontend)
├── Channel Hub (7 connectors, 20 framework adapters)
│ ├── Telegram, Discord, Slack, Matrix, Email, Web Chat, Webhooks
│ └── Universal message format → framework-specific translation
├── LLM Proxy (LiteLLM, per-agent virtual keys)
├── Cluster Manager (worker registration, task routing)
├── App Streaming (13 apps, KasmVNC, split-view + agent chat sidebar)
├── App Orchestrator (worker selection, container lifecycle)
├── User Workspace (NAS-like file browser, shared with apps + agents)
├── Computer Use (vision + keyboard/mouse, agent escalation)
├── Message Hub (chat, channels, threads, canvas, dual PWA)
├── App Store + Registry (109 apps + 47 MCP plugins, manifest-based)
├── Live Model Browser (HuggingFace + Ollama search)
├── Container Manager (LXC or Docker, auto-detected)
├── Agent Memory (taOSmd -- temporal KG, hybrid vector search, zero-loss archive, session catalog, crystal store, librarian)
├── Health Monitor + Notifications
├── Secrets Manager (encrypted, per-agent access)
├── Task Scheduler (cron with presets)
├── Training Manager (LoRA, per-agent adapters)
├── Agent Export/Import (portable JSON config)
├── Agent Templates (1,467 vendored from 3 sources)
├── Global Search (agents, apps, messages, shared folders)
├── Backup Scheduler (daily/weekly automated backups)
└── Backend Fallback (priority-based, auto-recovery)
Worker Apps (Windows / macOS / Linux)
├── System tray icon (no dock/taskbar window)
├── Auto-discovers local inference backends
├── Reports hardware profile to controller (including loaded models per heartbeat)
└── Heartbeat with load monitoring; re-registers automatically on controller restart
The architectural plan for the OpenClaw → Hermes → OpenClaw round-trip (the TAOS Framework Integration Bridge) is at docs/superpowers/specs/2026-04-11-taos-framework-integration-bridge-design.md. The bridge is not yet wired, see Known Limitations below. For the framework-agnostic runtime rule that makes this possible, see docs/design/framework-agnostic-runtime.md.
Resource Overhead
Platform overhead: ~345 MB RAM (without models or agents)
What the install creates on your box
Full transparency on every file, service, user, and port the installers touch. Nothing is hidden behind a vendored binary; everything is plain Python, plain systemd, plain shell.
Controller install (scripts/install-server.sh)
Run curl -fsSL https://raw.githubusercontent.com/jaylfc/taOS/master/scripts/install-server.sh | sudo sh on a fresh Debian / Ubuntu / Fedora / Arch / Alpine box to get the controller fully installed, repo cloned to ~/tinyagentos/, venv created, all deps installed, and both tinyagentos.service (port 6969) and qmd.service (port 7832) registered and started.
| Where | What |
|---|---|
/etc/systemd/system/tinyagentos.service | Main controller systemd unit. Runs uvicorn on port 6969. |
/etc/systemd/system/qmd.service | Embedding backend (embed / rerank / query expansion) on port 7832. Used by taOSmd for vector operations. Backed by rkllama on RK3588 boards or local node-llama-cpp elsewhere. |
tinyagentos-sdcpp.service (repo root) | (RK3588 only) CPU image generation backend. Manual setup only -- not auto-installed by the installer. |
/home/<user>/tinyagentos/ | The repo checkout. All code, all configs. |
/home/<user>/tinyagentos/.venv/ | Python virtualenv. All Python deps live here, never pip install to system Python. |
/home/<user>/tinyagentos/data/ | All persistent state. One directory to back up. Contains: agent state YAMLs, agent memory SQLite indexes, agent workspaces, secrets DB, scheduler history, channel credentials, downloaded models, torrent settings, telemetry opt-in flag. |
/home/<user>/.cache/qmd/index.sqlite | User memory index (taOSmd knowledge base for personal notes). Per-agent indexes live separately under data/agent-memory/{name}/index.sqlite. |
| Ports listened on | 6969 (controller HTTP API + web UI), 6970 (browser-proxy second-origin, TAOS_BROWSER_PROXY_PORT), 7832 (qmd embedding service), 7838 (LLM gateway agent listener, loopback only) |
| Env vars set | TAOS_SPA_DIR=$INSTALL_DIR/static/desktop (points the controller at the staged desktop bundle for non-editable pip install . users) |
| OS packages added | python3 + venv + pip, git, curl, ca-certificates, libtorrent-rasterbar (model torrent mesh), Node.js 22 (qmd + SPA build), sqlite3, libsqlcipher (encrypted secrets), vulkan-tools (hardware detection) |
| User accounts created | None for the LLM layer any more. Everything runs as the user who ran the installer. Older installs may still have a litellm Postgres role and database from before LiteLLM was removed; nothing uses them now. |
Hailo-10H install (scripts/install-hailo.sh)
Installs hailo-ollama (the Hailo-10H LLM runtime) at a pinned ref, listening on port 7836 (port 8000 is the Django slot in taOS port hygiene and is already probed as a llama-cpp/vllm candidate). Before installing, the script checks for a pre-existing upstream hailo-ollama (something answering GET /api/tags on 0.0.0.0:8000, Hailo's own default). If one is found it reports plainly what was detected and exits, leaving the existing instance untouched rather than silently building a second server that would compete for the accelerator and go unseen by taOS.
Worker install (scripts/install-worker.sh)
Linux uses a two-phase install. Phase 1 runs on the bare host; phase 2 runs inside the taos-worker LXC.
| Where | What |
|---|---|
taos-worker LXC | Privileged incus container created on the bare host during phase 1. All worker software lives inside it. |
taos-worker-pool | btrfs incus storage pool (loopback image, sized to 90% of free space on /var/lib) created on the bare host during phase 1. Backs the taos-worker container. |
/etc/systemd/system/tinyagentos-worker.service | Worker systemd unit installed inside the taos-worker LXC (phase 2). Runs as root inside the container. Connects to the controller URL and registers this machine as a cluster node. |
~/.local/share/tinyagentos-worker/ | Repo checkout and venv, cloned inside the taos-worker LXC during phase 2. ~150 MB on disk after install. |
~/.local/share/tinyagentos-worker/.venv/ | Python venv with worker-only deps: httpx, pydantic, psutil, fastapi, uvicorn, pyyaml, pillow, libtorrent. Does NOT install controller-side deps (no aiosqlite, no LiteLLM, no scheduler engine). |
| Ports | :8443 (incus HTTPS listener inside the LXC, DNAT'd from the bare-host port :8443 via nftables -- used by the controller for LXC-based service deployment); :21434 (TAOS-namespaced Ollama, localhost-only inside the LXC by default). The worker daemon itself is outbound-only to the controller. |
| OS packages added (bare host, phase 1) | incus, nftables, btrfs-progs, curl |
| OS packages added (inside LXC, phase 2) | incus, curl, python3, python3-venv, python3-pip, git, bees (if available in apt) |
| User accounts created | None. All processes inside the LXC run as root (the container is privileged). macOS installs run as the invoking user via launchd. |
Verify what's installed
# Controller side
systemctl status tinyagentos qmd
ls /etc/systemd/system/tinyagentos*.service /etc/systemd/system/qmd.service
ls ~/tinyagentos/data/
# Worker side (after running install-worker.sh)
sudo incus list # shows taos-worker container
sudo incus exec taos-worker -- systemctl status tinyagentos-worker # service status inside LXC
sudo incus exec taos-worker -- ls ~/.local/share/tinyagentos-worker/ # repo + venv inside LXC
Uninstall
# Controller
sudo systemctl disable --now tinyagentos qmd
# If you manually installed the RK3588 sd-cpp image-gen unit:
# sudo systemctl disable --now tinyagentos-sdcpp
sudo rm /etc/systemd/system/tinyagentos*.service /etc/systemd/system/qmd.service
sudo systemctl daemon-reload
# Repo + data are still at ~/tinyagentos, delete with: rm -rf ~/tinyagentos
# Worker (two-phase LXC teardown -- bare host)
scripts/uninstall-worker.sh
# Or manually:
sudo incus stop taos-worker
sudo incus delete taos-worker
# Optional, DESTROYS worker data (the script keeps this unless you pass --purge); skip to keep it:
sudo incus storage delete taos-worker-pool
# Remove the nftables DNAT rule (port :8443 forward):
sudo nft delete table ip taos
# Persist (optional). This snapshots the FULL live ruleset over /etc/nftables.conf,
# so if you hand-maintain that file, edit it by hand instead of running this:
sudo bash -c 'nft list ruleset > /etc/nftables.conf.tmp && mv /etc/nftables.conf.tmp /etc/nftables.conf'
Upgrading a long-running install
Controller (recommended): use the one-shot update script:
cd ~/tinyagentos
bin/update.sh
This pulls the latest, rebuilds the desktop frontend bundle if the source has moved (skips it when nothing changed), then restarts the service. The frontend rebuild takes ~50s when it fires; it is a no-op otherwise.
Manual equivalent:
cd ~/tinyagentos
git pull
# Clear stale Python bytecode after upgrades (git pull preserves source mtimes
# which can confuse Python's .pyc cache invalidation on some setups)
find . -name __pycache__ -type d -exec rm -rf {} + 2>/dev/null || true
sudo systemctl restart tinyagentos
You do not build the UI on every machine. install-server.sh and the in-app update download a prebuilt SPA bundle published by CI, matched to your desktop/ source by its git tree hash, so installs and upgrades are fast and never run the memory-heavy vite build (which used to OOM on small machines like an 8GB WSL). The restart above triggers the same conditional fetch via the unit's ExecStartPre step when the desktop source changed. A local build (cd desktop && npm install && npm run build) is only needed for local frontend development, or kicks in automatically as a fallback when no matching prebuilt bundle is available.
Worker:
sudo incus exec taos-worker -- bash -c "cd ~/.local/share/tinyagentos-worker && git pull && find . -name __pycache__ -type d -exec rm -rf {} + 2>/dev/null || true && systemctl restart tinyagentos-worker"
The bytecode cleanup step is belt-and-braces; Python's mtime-based invalidation usually works, but on long-running boxes that have survived many upgrades it occ