Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
bea1c0a
Add Radio Studio design spec
jaylfc Aug 9, 2026
145b043
Merge pull request #2327 from jaylfc/exec/tsk-nu2lwo
jaylfc Aug 9, 2026
782ac24
fix(theme-store): use injected get() to break circular self-reference…
hognek Aug 9, 2026
527278b
test: add xfail-strict acceptance tests for generic LXC service install
jaylfc Aug 9, 2026
a0d68c3
tsk-glxi4e [OPEN] Make 3-strike card QUARANTINE loud (it currently v
jaylfc Jul 27, 2026
9d80b17
Merge pull request #2330 from jaylfc/exec/tsk-ecwibv
jaylfc Aug 9, 2026
3c71a7e
Add store-wiring-gate CI check for unwired BaseStore subclasses
jaylfc Aug 9, 2026
d50646f
fix(agent-loop): safe-point race, timeout-safe awaits, task_utils reu…
jaylfc Aug 9, 2026
2d2d50f
Merge pull request #2337 from jaylfc/exec/tsk-32u2nj
jaylfc Aug 9, 2026
ff11a81
feat(hailo): slice 6 model catalog manifests for Hailo-10H .hef chat …
jaylfc Aug 9, 2026
d24510e
docs(agent-manual): add mechanical-simple-auditable design law
jaylfc Aug 9, 2026
514be45
Merge pull request #2339 from jaylfc/exec/tsk-kxbvup
jaylfc Aug 9, 2026
11d7009
fix(auth): apply session User-Agent binding uniformly across auth sur…
jaylfc Aug 9, 2026
a6ac091
Merge pull request #2340 from jaylfc/fix/auth-status-ua-symmetry
jaylfc Aug 9, 2026
6a6a9ff
docs(skill): document the store-wiring gate + waiver trailer; retrigg…
jaylfc Aug 10, 2026
292202b
fix(hailo-catalog): wire hailo resolver target so HEF manifests can i…
jaylfc Aug 10, 2026
88cb74e
fix(hailo-catalog): pin real sha256 digests, sizes, and Instruct home…
jaylfc Aug 10, 2026
434e08d
fix(hailo-catalog): rename llama3.2-3b-instruct-hef to match id conve…
jaylfc Aug 10, 2026
93616cc
Merge pull request #2334 from jaylfc/exec/tsk-n3w5mh
jaylfc Aug 10, 2026
2cafd11
fix(models): recognize .hef files in the model-file scan
jaylfc Aug 10, 2026
6d05713
feat(projects): wire strike store into app lifespan and add unquarant…
jaylfc Aug 10, 2026
6a72e83
docs(readme): refresh catalog counts and mention Hailo-10H HEF variants
jaylfc Aug 10, 2026
fa9d8fe
docs(changelog): add fragment for the Hailo-10H HEF catalog fixes
jaylfc Aug 10, 2026
c6173c4
store-wiring gate: AST wiring check, R/C rename handling, waiver cleanup
jaylfc Aug 10, 2026
c2bd893
feat(agent-loop): wire AgentLoop as the per-agent serialization owner
jaylfc Aug 10, 2026
27f03ab
fix(registry): load context_window onto AppManifest from catalog YAML
jaylfc Aug 10, 2026
941c9b6
Merge pull request #2333 from jaylfc/exec/tsk-orqoif
jaylfc Aug 10, 2026
0134db4
Merge pull request #2341 from jaylfc/exec/tsk-lzvwte
jaylfc Aug 10, 2026
4627980
Add sweep test for model catalog manifest integrity
jaylfc Aug 10, 2026
13f469e
Merge pull request #2343 from jaylfc/exec/tsk-ppgpln
jaylfc Aug 10, 2026
c2d49fb
Merge pull request #2344 from jaylfc/exec/tsk-brblrv
jaylfc Aug 10, 2026
8b2d0a2
test(catalog): derive KNOWN_TARGETS from capabilities.py instead of h…
jaylfc Aug 10, 2026
8c0caca
fix(tasks): record actual from_status on quarantine; document claimab…
jaylfc Aug 10, 2026
3292018
chat: add exporter and transformer for A2A bus import
jaylfc Aug 10, 2026
9c7b433
Merge pull request #2345 from jaylfc/exec/tsk-dtanmd
jaylfc Aug 10, 2026
d90bd81
tsk-msmub3 [OPEN] reopen_task leaves stale claimed_by: reopened task
jaylfc Aug 10, 2026
3083334
fix(chat): preserve blocks on oversize export, flatten non-text block…
jaylfc Aug 10, 2026
9999881
fix(taos-agent): queued messages survive turn errors; supervise the d…
jaylfc Aug 10, 2026
1a0461e
revert the no-op reopen_task edit: dev already clears claimed_by
jaylfc Aug 10, 2026
759c678
Merge pull request #2347 from jaylfc/exec/tsk-msmub3
jaylfc Aug 10, 2026
190a92c
Merge pull request #2346 from jaylfc/exec/tsk-yfy5j5
jaylfc Aug 10, 2026
7f1544e
fix(chat-exporter): never drop thread_id-cycle rows; budget oversize …
jaylfc Aug 10, 2026
d26d2e9
test: add vitest coverage for GuidesApp
jaylfc Aug 10, 2026
2385648
Merge pull request #2342 from jaylfc/feat/agent-loop-wiring
jaylfc Aug 10, 2026
1948f9a
Merge pull request #2348 from jaylfc/exec/tsk-faqlk2
jaylfc Aug 10, 2026
1a0e1b3
Add editable handle field in Agents registry panel
jaylfc Aug 10, 2026
69ed439
fix(agents): normalize @ in handle editing via stripAt; label the input
jaylfc Aug 10, 2026
1444eb7
chore(deps): bump dompurify 3.4.13 + nanoid 5.1.16 (desktop, security)
jaylfc Aug 10, 2026
da0132e
docs(changelog): fragment for the alias editing UI (#2349)
jaylfc Aug 10, 2026
11763ef
tsk-6luty4 [OPEN] SECURITY: memory routes - path traversal + missing
jaylfc Aug 10, 2026
a07ffd0
bump spa-build Node 20 -> 22
jaylfc Aug 10, 2026
694c04e
test(invites): cover OS-level scope validation + failed auto-approve …
jaylfc Aug 10, 2026
cfe4f60
fix(memory): tighten agent-param validation to single path component …
jaylfc Aug 10, 2026
d772e7e
docs(mirror-policy): record the Hailo .hef vendor-CDN exception
jaylfc Aug 10, 2026
0dccf1d
Merge pull request #2350 from jaylfc/fix/desktop-npm-audit-bumps
jaylfc Aug 10, 2026
488ed00
Merge pull request #2349 from jaylfc/exec/tsk-kqffyv
jaylfc Aug 10, 2026
3f87e70
Merge pull request #2352 from jaylfc/exec/tsk-6luty4
jaylfc Aug 10, 2026
a1e3122
Merge pull request #2338 from jaylfc/exec/tsk-ba2p2g
jaylfc Aug 10, 2026
f2eac52
test(registry): add fail-open coverage for RegistryPanel
jaylfc Aug 10, 2026
853683e
test(registry): restore the @-strip PATCH regression test
jaylfc Aug 10, 2026
5b2d8c6
Merge pull request #2354 from jaylfc/exec/tsk-awuz7r
jaylfc Aug 10, 2026
d684453
docs(changelog): fragment for the spa-build Node 22 bump (#2353)
jaylfc Aug 10, 2026
40453f3
Merge pull request #2355 from jaylfc/exec/tsk-crdvza
jaylfc Aug 10, 2026
43d3d7e
chore: satisfy contributor-skill doc-gate for the Node 22 bump
jaylfc Aug 10, 2026
c3401ae
Merge pull request #2353 from jaylfc/exec/tsk-6ijt67
jaylfc Aug 10, 2026
2b1ffb3
Hide existence across scope-request owner-gated routes
jaylfc Aug 10, 2026
c588493
Add wallpaper fit options (fill/fit/stretch/center/tile) with per-dev…
jaylfc Aug 11, 2026
0453bcc
Add pytest tests for MCP GET endpoints
jaylfc Aug 11, 2026
eda3670
Merge pull request #2358 from jaylfc/exec/tsk-sucth5
jaylfc Aug 11, 2026
b778408
refactor(wallpaper-fit): drop inert helper/prop threading, real fallb…
jaylfc Aug 11, 2026
0b632eb
fix(registry): existence-hiding 404 on the remaining owner-gated writ…
jaylfc Aug 11, 2026
5910eb1
Merge pull request #2357 from jaylfc/exec/tsk-jar622
jaylfc Aug 11, 2026
74ba0d2
test(registry): update remaining 403 assertions to existence-hiding 4…
jaylfc Aug 11, 2026
999f7ab
test(registry): byte-identical .content comparisons, same-caller prob…
jaylfc Aug 11, 2026
e44e721
fix(scope-requests): close the credential-error existence oracle on c…
jaylfc Aug 11, 2026
e55ecfb
Merge pull request #2356 from jaylfc/exec/tsk-vzkbao
jaylfc Aug 11, 2026
2c5c8a3
fix(lists): cursor-scope in get_entry, rollback on failed reorder (ts…
jaylfc Aug 11, 2026
2fee937
fix(lists): widen reorder rollback guard to BaseException, cover comm…
jaylfc Aug 11, 2026
ef7fadd
Merge pull request #2361 from jaylfc/exec/tsk-u23vjy-v2
jaylfc Aug 11, 2026
7f15e1d
fix(auth): let consent-key clients reach the /v1 agent-model surface …
jaylfc Aug 11, 2026
369ff9f
Merge pull request #2363 from jaylfc/exec/tsk-hfs6zv
jaylfc Aug 11, 2026
d07f5c3
VERIFY at next release: secret-material .gitignore is dev-ONLY, maste…
jaylfc Aug 11, 2026
58d035b
chore(release): v1.0.0-beta.48 version bump + changelog
jaylfc Aug 11, 2026
aaf1113
Merge pull request #2364 from jaylfc/release/beta.48
jaylfc Aug 11, 2026
9eaefde
Merge master into dev-content for the beta.48 promotion (Dependabot c…
jaylfc Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion .claude/skills/taos-development-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ uv run pytest tests/ --ignore=tests/e2e -n auto
- Uses `uv sync --frozen` and `pytest -n auto`
- Also required: `spa-build` (npm build + tsc + **vitest** - a desktop type error or failing
component test fails CI), a "Verify app starts" `create_app` import smoke, `lint`
(`compileall`), and `cla`. The doc-gate is a separate workflow.
(`compileall`), and `cla`. The doc-gate and store-wiring gate are separate workflows.

## CLA - HUMAN signs

Expand Down Expand Up @@ -438,6 +438,43 @@ Docs-Reviewed: no user-facing change, internal refactor only
Run `scripts/install-git-hooks.sh` to enable local hooks (`.githooks/pre-commit` and
`.githooks/commit-msg`) so the gate runs before you push.

## Store wiring gate

A gate (`.github/workflows/store-wiring-gate.yml`, running `scripts/check_store_wiring.py`)
blocks PRs that add a new `BaseStore` subclass without wiring it into `tinyagentos/app.py`.
Routes reach stores ONLY via `request.app.state`, so an unwired store is unreachable dead
code. The check is name-level (the class name must appear in `app.py`) and polices only
classes added by the PR - pre-existing orphans are skipped.

For a store genuinely constructed elsewhere (tests, CLI, workers), waive it with a PR-body
trailer, which is logged by the gate:
```
Store-Unwired-Intentionally: <ClassName>, <why>
```

## Secret-ignores gate

A gate (`.github/workflows/secret-ignores-gate.yml`, running `scripts/check_secret_ignores.py`)
verifies that the committed `.gitignore` still protects known secret-shaped paths on every
promotion target. A `.gitignore` rule is the kind of file a rebase conflict can quietly drop
during a dev->master promotion while every test stays green and nothing builds red, so the
protection is asserted here, not assumed. The gate runs on push to `master`, `dev` and
`release/*` (a dropped rule fails the branch it lands on) and on PRs to those branches (a
conflict-resolution loss fails before the merge, since the merge commit's `.gitignore` is what
is checked).

Two signals, defense in depth:

- Every required protection rule must appear verbatim as an active line of `.gitignore`
(`*.key`, `identity.json`, `*.p8`, `*credentials.json`, `*creds*.json`, the `*_private.*`
key shapes, `secrets/`, `data/hub/`, and the rest listed in `REQUIRED_PATTERNS` in the
script). Comment prose and narrower sibling rules do not satisfy a rule.
- A set of secret-shaped paths (`data/hub/identity.json`, `foo.key`, `creds.json`, `x.p8`,
`y_credentials.json`, ...) must all be reported ignored by `git check-ignore`.

Removing any one protection pattern turns the gate red -- proven by a parametrized test that
drops each pattern from a copy of the real `.gitignore` and asserts the guard fails.

## Upstream conventions (from CONTRIBUTING.md)

- **Target branch is `dev`, not `master`.** `master` is the stable live-install track.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ jobs:
- name: Set up Node
uses: actions/setup-node@v7
with:
node-version: "20"
node-version: "22"
cache: "npm"
cache-dependency-path: desktop/package-lock.json

Expand Down
35 changes: 35 additions & 0 deletions .github/workflows/secret-ignores-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Secret-ignores gate

# Verifies that the committed .gitignore still protects known secret-shaped
# paths (data/hub/identity.json, foo.key, creds.json, x.p8, ...) on every
# promotion target. A .gitignore is the kind of file a rebase conflict can
# quietly drop during a dev->master promotion while every test still passes and
# nothing builds red, so promotion is verified here, not assumed.
#
# Trigger scope is deliberate:
# - push to master/dev/release/* : a dropped pattern fails the branch it
# lands on (this is the post-promotion check from tsk-laezfg step 1).
# - pull_request to master/dev/release/* : a conflict-resolution loss fails
# BEFORE the merge, since the merge commit's .gitignore is what is checked.
# The run is pure stdlib (~1s), so it carries no shard-timeout risk.
#
# See scripts/check_secret_ignores.py for REQUIRED_PATTERNS and SECRET_PATHS.

on:
push:
branches: [master, dev, release/*]
pull_request:
branches: [master, dev, release/*]

jobs:
secret-ignores-gate:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.12"
- name: Assert secret-shaped paths are ignored
run: python scripts/check_secret_ignores.py
46 changes: 46 additions & 0 deletions .github/workflows/store-wiring-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Store wiring gate

# Detects PRs that add a new BaseStore subclass without wiring it into
# tinyagentos/app.py. Routes reach stores ONLY via request.app.state, so a
# store that is never assigned to app.state is unreachable.
#
# Start with a NAME-LEVEL check (class name appears in the lifespan file).
# Only newly added classes are policed; pre-existing orphans are skipped so
# the check is mergeable on any branch.
#
# A "Store-Unwired-Intentionally: <ClassName>, <why>" trailer in the PR body
# waives a named class and logs it, for stores genuinely constructed elsewhere
# (tests, CLI, workers).
#
# See scripts/check_store_wiring.py for the implementation.

on:
pull_request:
# "edited" so a waiver trailer added by editing the PR body retriggers the
# gate (a re-run replays the stale event payload with the old body).
types: [opened, synchronize, reopened, edited]
branches: [master, dev]

jobs:
store-wiring-gate:
runs-on: ubuntu-latest
permissions:
contents: read
env:
BASE_REF: ${{ github.base_ref }}
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0

- uses: actions/setup-python@v7
with:
python-version: "3.12"

- name: Fetch base branch
run: git fetch origin "$BASE_REF"

- name: Check for unwired BaseStore subclasses
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: python scripts/check_store_wiring.py --base "origin/$BASE_REF"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ data/.seeded-agent-tokens.json
data/secrets.db*
data/*.key
data/*.token
data/.litellm_master_key

# Key material and secrets. Added 2026-07-27 after data/hub/identity.json was
# committed to PR #2043 with signing_private and encryption_private in
Expand Down
114 changes: 114 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,120 @@ Versions follow semver beta: `1.0.0-beta.N`, bumped on each dev->master promotio

## [Unreleased]

## [1.0.0-beta.48] - 2026-08-11

### Added

- Quarantined task cards surface their strike count and latest strike on the
task-detail response, and a lead can un-quarantine a card via
`POST /api/projects/{pid}/tasks/{tid}/unquarantine`, clearing its strikes (#2333).

- **Hailo-10H HEF model catalog**: five NPU-accelerated model manifests
(DeepSeek-R1-Distill-Qwen 1.5B, Llama 3.2 3B, Qwen2 1.5B, Qwen2.5 1.5B,
Qwen2.5 Coder 1.5B) now resolve and install via `hailo-ollama` on
Raspberry Pi 5 + AI HAT+2, and downloaded `.hef` files show up in the
local-files and orphan scans (#2338).

- The Agents app registry panel shows each agent's handle (alias) and lets the
owner or an admin edit it inline, saved via
`PATCH /api/agents/registry/{canonical_id}`. A leading `@` is display syntax
and is stripped before save (#2349).

- Wallpaper fit options in Settings -> Desktop & Dock: fill, fit, stretch,
center, and tile. The choice is persisted per device (localStorage, keyed
by a locally minted device id that is never sent to the server), so each
screen keeps the fit that suits its aspect ratio (#2357).

- **Agent loop infrastructure**: new `tinyagentos.agent_loop.AgentLoop` library
for subagent delegation and safe-point message queuing. Landed as
standalone infrastructure; wired into the chat router and taOS agent
routes in #tsk-icpt4i (#tsk-rl2lfb).

- **CI**: store-wiring-gate workflow and `scripts/check_store_wiring.py` guard.
A PR that adds a new BaseStore subclass without wiring it into
`tinyagentos/app.py` now fails CI and names the unreachable class and file.
Routes reach stores ONLY via `request.app.state`, so an unwired store is
dead code. Only newly added classes are policed; a
`Store-Unwired-Intentionally: <ClassName>, <why>` trailer in the PR body
waives a named class for stores genuinely constructed elsewhere (tsk-n3w5mh).

- **Docs**: mechanical-simple-auditable design law added to the agent manual
(`01-rules.md`), with a worked example anonymised as "an agent". Also trimmed
verbose prose in the image-prompting guide to stay within the compiled manual
character budget.

### Changed

- CI's `spa-build` job runs on Node 22 (was 20, now past end-of-life). Also
unblocks the jsdom 30 upgrade, which requires Node >= 22.13 (#2353).

- **Agent loop wiring**: `AgentLoop` is now the single per-agent serialization
owner. `AgentChatRouter` drives OpenClaw ACP turns through a per-agent
`AgentLoop` (replacing the per-agent lock) and the turn-holder drives
messages queued mid-turn at its safe point. The desktop taOS agent chat
endpoint serializes on one `AgentLoop` too -- fixing a race where two
concurrent POSTs shared the opencode session with no serialization --
queueing concurrent messages and surfacing them in the turn-holder's stream
tail. New `GET /api/taos-agent/status` endpoint returns the desktop loop's
status scoped to state / current turn / queue depth / subagent descriptors
(subagent result/error payloads stay server-side) (#tsk-icpt4i).

### Fixed

- Project list entries: `get_entry` no longer reads cursor metadata after the
cursor closes, and a failed reorder now rolls back its partial updates so a
later unrelated write cannot commit a half-applied ordering (tsk-u23vjy,
fix-forward of #2183).

- The Agent-as-a-Model surface (`GET /v1/models`, `POST /v1/chat/completions`)
is now reachable by external OpenAI-compatible clients: the auth middleware
passes exactly those two routes through to their own consent-key check
instead of rejecting every session-less caller before the handler ran. All
other `/v1` paths remain session-gated (tsk-hfs6zv).

- **PWA refresh loop after a browser auto-update**: `/auth/status`, `/auth/me`
and the chat/canvas/terminal/web-chat WebSocket handlers now apply the same
session User-Agent binding check as the API middleware. Previously a session
created before a browser update kept reading as authenticated on
`/auth/status` while every `/api/*` call was rejected, so the desktop shell
remounted in a loop; the WebSocket endpoints conversely accepted a cookie
the APIs refused.

- **Catalog manifests' `context_window` was silently dropped**: `AppManifest`
declared no `context_window` field and `from_dict` never read the YAML
value, so every manifest loaded as 0 and the chat context-window budget code
always fell back to the 4000-token "unknown window" default. The field now
loads onto `AppManifest` (0 reserved for unknown), so real windows -- e.g.
rkllm 4096, qwen 32768 -- drive the #1740 budget math. (#2338, #1740)

### Security

- Memory routes reject any `agent` value that is not a single plain path
component (separators, `.`/`..`, NUL all 400): the caller-controlled name
becomes a filesystem path component of the qmd `dbPath`, and a traversal
value could previously address SQLite files outside `agent-memory/` (#2352).

- All owner-gated agent-registry routes are now existence-hiding: a caller who
does not own an agent gets the same 404 as a nonexistent id, on the
scope-request create/approve/deny routes and on registry PATCH, revoke,
rotate-tokens, and org update. Previously a 403-vs-404 difference disclosed
whether an agent id existed (issue #2106, reported by hognek) (#2356).

- **CI**: `secret-ignores-gate` workflow and `scripts/check_secret_ignores.py` now
assert, on push to `master`/`dev`/`release/*` and on PRs to those branches, that the
committed `.gitignore` still contains every secret-protection rule (`*.key`,
`*.p8`, `identity.json`, `*credentials.json`, `*creds*.json`, the `*_private.*` key
shapes, `secrets/`, `data/hub/`, and more) and that known secret-shaped paths
are all reported ignored by `git check-ignore`. Closes the "promotion must be
verified, not assumed" gap from #2171/#2173. Removing any one pattern is
proven to fail the gate by a parametrized test (tsk-laezfg).

- **Desktop deps**: bump `dompurify` 3.4.12 -> 3.4.13 (GHSA-55q2-fjhq-7xh7,
moderate) and `nanoid` 5.1.11 -> 5.1.16 (CVE-2026-67214, high) in
`desktop/package-lock.json`; lock-only, both already within the declared
ranges. Split out of Dependabot #2331, whose grouped jsdom 30 bump fails
spa-build (jsdom 30 requires Node >=22.13; CI pins Node 20).

## [1.0.0-beta.47] - 2026-08-09

### Added
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

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 40 bundled apps, 109 catalog apps, 47 MCP plugins, 17 agent frameworks, a curated local model catalog of 113 manifests covering LLMs, vision, embeddings, audio, and image generation (including RK3588 NPU variants via c01zaut/happyme531), 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.
A full web desktop environment with 40 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.

Expand Down Expand Up @@ -215,7 +215,7 @@ lets the scheduler route work only to backends that are genuinely ready.
See [docs/design/resource-scheduler.md](docs/design/resource-scheduler.md).

### Local Model Catalog + Live Model Browser
A curated catalog of 113 vetted model manifests ships in-tree, every download URL is verified against HuggingFace, 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). 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).
A curated catalog of 120 vetted model manifests ships in-tree, every download URL is verified against its upstream host, 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 3B, Qwen2 1.5B, Qwen2.5 1.5B, and Qwen2.5 Coder 1.5B. 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.
Expand Down Expand Up @@ -384,7 +384,7 @@ Search across agents, apps, messages, and shared folders from a single endpoint.
|----------|------|
| **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** | 113-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 |
| **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 |
Expand Down Expand Up @@ -741,7 +741,7 @@ CI runs automatically on every push (Python 3.12 and 3.13 on every PR; Python 3.
- [x] 47 MCP server plugins in app catalog
- [x] Desktop notifications (toast stack + notification centre)
- [x] Widget system (Clock, Agent Status, Notes, System Stats, Weather)
- [x] Curated local model catalog, 113 manifests, all download URLs verified against HuggingFace
- [x] Curated local model catalog, 120 manifests, all download URLs verified against their upstream host
- [x] Activity monitor app, rktop-inspired per-core CPU/NPU/thermal/GPU/process stats
- [x] Loaded Models panel in Model Browser, shows running models, purpose, and VRAM/RAM usage
- [x] iOS PWA pill bar, safe-area-aware bottom nav with back / home / card-switcher / notifications
Expand Down
Loading
Loading