Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/brentfarris/echo/browser-spa-frameworknpx skills add BrentFarris/echo --skill browser-spa-frameworkgit clone --depth 1 https://github.com/BrentFarris/echoWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00091 | $0.03265 |
| Opus 5 | $0.00046 | $0.01632 |
| Sonnet 5 | $0.00018 | $0.00653 |
| Haiku 4.5 | $0.00009 | $0.00327 |
Grade A, and why
browser-spa-framework scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
- Manual smoke: `go run .` then `curl http://localhost:3740/api/health`, `/` (index), `/some/route` (SPA fallback), `GET/PUT /api/settings`, `GET/POST /api/workspaces`, `GET /api/workspaces/{id}/fs/media?rootId=&path=img How it starts
The opening of the file, as written. The whole thing — 93 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Echo Browser SPA Framework
Echo is now a browser-based app (not Wails). A Go server hosts a single-page application and a JSON/WebSocket API. Old Wails code lives in echo/OLD and should not be referenced for new work. Parity ports from the Wails branch (origin/jjtw87) are surgical: copy individual files/functions, never merge the branches (they diverge heavily — services-layer vs server-package architecture).
Shared app data file (echo.json) — settings + workspaces
internal/appdataowns the single Echo app data file atos.UserConfigDir()/Echo/echo.json(DefaultStorePath()). The file is one JSON document:{"settings": <raw JSON>, "workspaces": [...]}.appdata.FilekeepsSettingsasjson.RawMessageso the package stays decoupled from the settings schema.appdata.Store.Load()migrates a legacy bare-settings file (no"settings"key) by treating the whole document as settings.Save()writes to a.tmpthen renames into place.- Both the settings store and the workspace manager share this one file so they never clobber each other. When adding a new persisted top-level concern, extend
appdata.Filerather than creating a separate file. - Tests must use
NewWithSettingsPath(addr, webDir, tempPath)with an isolated temp path so they never touch the realecho.json.
Workspace registration (internal/workspaces)
workspaces.Managerkeeps the workspace ID and absolute main-folder locator in shared appdata, while.echo/workspace.jsonis authoritative for the workspace name, folders, and settings.Create(...)writes portable config paths and registers an ID-preserving locator in appdata.Icon.Datais[]byte, so the frontend must send image bytes as a base64 string. API endpoints ininternal/server/workspaces_api.goall use the standard JSON envelope.
Backend (Go, stdlib net/http)
- Entry point:
echo/main.go. Default port3740(-portflag). Production binaries embedweb/distvia//go:embed web/dist; after frontend changes runnpm run buildinweb/so the embedded bundle picks them up. internal/serverpackage:server.go(Server, New, routes, ListenAndServe/Shutdown, Go 1.22 method-pattern ServeMux),api.go(writeJSON/writeData/writeError),ws.go(WebSocket Hub).- JSON envelope: every endpoint returns
{"ok":true,"data":...}or{"ok":false,"error":"..."}. New endpoints must follow this. Raw binary streams (e.g./fs/media) bypass the envelope and setContent-Typedirectly.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 93 lines · 91 tokens per session scan A cb604feaf9da
browser-spa-framework is a skill published in the GitHub repository BrentFarris/echo (11 stars, last pushed 3d ago), licensed MIT. It adds 91 tokens to every session and 3,265 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
claude_code_delegation
Delegate coding, review, and refactor tasks to Claude Code CLI through Row-Bot's approval-gated shell workflow.
developer_coding
Structured workflow for implementing code changes in Developer Studio.
code-runner
Execute Python code, Shell commands, and pytest tests in a sandboxed environment. Returns structured results with stdout, stderr, exitcode, and timing. Use when writing/testing/debugging code, running scripts, or validating code snippets. Supports --lang python/shell/test, --timeout, --workdir.
agent-code-analyzer
Agent skill for code-analyzer - invoke with $agent-code-analyzer.
agent-collective-intelligence-coordinator
Agent skill for collective-intelligence-coordinator - invoke with $agent-collective-intelligence-coordinator.
agent-payments
Agent skill for payments - invoke with $agent-payments.