Skip to main content

ethos

Stopaskingoneagenttodoeverything.

General-purpose AI is fine for small talk, mediocre at real work. Ethos gives you a team of specialists — researcher, engineer, reviewer — each with its own tools, memory, and model. Same conversation across Slack, Telegram, and your terminal. Boundaries the prompt can't talk its way out of.

mit · node 24 · typescript strict · zero deps in the types layer

One agent core with three orbiting personalities — researcher, engineer, reviewer. Every call the AgentLoop makes is shaped by a personality: hover or click a mark to see its model, tagline, and curated toolset.

researcherclaude-fable-5
methodical · cites sources · flags uncertainty
web_searchweb_extractweb_crawlread_filesearch_filesmemory_readmemory_writesession_search

Three specialists, one session. Switch personality mid-conversation; memory and boundaries follow.

One conversation, three specialists: the researcher finds a race condition, the engineer patches it, and the reviewer checks the diff — but is refused write access because write_file is not in its toolset.

Personality, not "an agent."

A generic agent has every tool. That is its problem. The toolset is the union of every task you might ever do, which is a security surface, a cost surface, and a quality surface. Voice is mush. Memory is a pile.

Personalities invert it. Each has a curated toolset, a first-person identity (SOUL.md), and a memory scope. Researcher gets the 8 tools it needs. Reviewer gets 3 and a per-personality memory scope so its code-review notes never leak into the engineer's session.

Specialization, not configuration. Personality is architecture, not a system prompt in a costume.

routing: claude-fable-5 · gpt-5.6-sol · glm-5.2 · deepseek-v3.2 — per personality, set in config.yaml

New here? Read What is Ethos? for the 90-second mental model, Why Ethos? for the comparison to LangChain / CrewAI / OpenClaw / Hermes, and Glossary for every domain term.

AgentLoop is one async generator.

Every component is an interface in @ethosagent/types, injected at construction. Personality decides which tools enter the loop and which model handles the turn.

Architecture in 90 seconds →

user input flows into AgentLoop.run's nine steps — session, hooks, memory, prompt, agentic loop — and streams out as an AsyncGenerator of AgentEvents to cli, tui, vscode, email, telegram, and slack surfaces.

Bring your existing setup.

OpenClaw users migrate in one command. Any clawhub skill installs into Ethos directly — the catalogue becomes your toolset, no forks, no shims.

migratefrom openclaw
$ ethos claw migrate --dry-run
# preview the plan, then re-run without --dry-run

Memory, skills, platform tokens, and API keys copy in place. Your SOUL.md becomes a migrated personality; built-in matches resolve automatically. Idempotent — safe to re-run.

installany clawhub skill
$ ethos skills install steipete/slack
# any slug clawhub serves, just works

The OpenClaw-compat layer parses SKILL.md frontmatter, environment substitutions, and OS gates — so the full clawhub catalogue runs unmodified inside your personality's toolset.

Runs where you work.

Every surface is a thin adapter in front of the same AgentLoop. Switch windows mid-conversation; the session comes with you.

CLIstreaming chat with tool events, sessions persist across restartsethos chat
Web appdashboard: sessions, personalities, memory, activityethos serve --web
Desktop appthe same agent in its own windowmenu bar · native shell
Slacka channel adapter through one gatewaysame session · same memory
Telegrammulti-bot: one loop per bot tokensame session · same memory
Discordthe same dedup path as every adaptersame session · same memory
VS CodeTUIWhatsAppEmail

one AgentLoop behind every surface — same sessions, same memory, same personality boundaries.

The loop keeps running when you stop typing.

Detached jobs, schedules, skills, and plugins all run through the same AgentLoop and the same personality boundaries — nothing gets a side door.

background tasks

Fire a job, keep the conversation moving.

delegate_task with detached: true returns a job id immediately — no waiting on the result. Jobs live in a durable store and survive restarts. Check in with task_status, task_result, task_logs, or task_cancel; each job carries its own max_cost_usd budget.

delegate_task { detached: true } → job_7f2 · poll: task_status
cron

Recurring runs, delivered where you read.

Add cron to a personality's toolset.yaml and recurring runs — daily briefings, weekly reports — fire through the agent loop and deliver to your configured channels. Needs the long-lived ethos gateway start.

toolset.yaml: + cron · ethos gateway start
custom skills

Install skills — or reuse the ones you already have.

Install from ClawHub, or point at skill libraries already on disk — Claude Code and OpenClaw formats parse as-is. Invoke with /skill-name in chat, or let them auto-load when relevant.

ethos skills install steipete/slack · /skill-name
external plugins

Plugins are default-deny.

npm packages or local paths shipping tools, hooks, and injectors. Each personality opts in explicitly — a plugin unlisted in its config.yaml stays dormant.

plugins: weather invoice-checker · ethos plugins