One identity that lasts
global configName, instructions, persona card, model and thinking level live on it. Conversations, tasks and routines all use that identity — it does not become a different person each time.
OPEN-SOURCE GROK BOT / MUSE · NO VENDOR LOCK-IN · 100% BYOK
Grok Bot says every agent gets its own computer — inside their datacenter. Muse reads your mail and photos; Today watches your calendar and meetings. All of them learned to know you somewhere else, and they remember you somewhere else too. eta is the open-source version of that: the one that lives at your house.
$ git clone \ https://github.com/0xfe-project/eta.git $ cd eta $ bun run setup $ bun run dev
Open http://127.0.0.1:3000. Data lives in ~/.eta — the same directory the installed one uses.
# Settings → Machines → Add, copy the command it gives you $ eta-daemon setup <primary-url> <code> $ eta-daemon run
The code works once and expires in 24 hours; the daemon only dials out to the primary.
One data directory holds all of it: conversations, memory, tasks, usage. Copy it and you have everything.
Session replay · scripted · time compressed · not live The replay stops wherever eta would wait for you.
Grok Bot, Muse and Today are all doing the same thing: moving into your life and acting before you ask. The only difference is how many apps each one plugs into. The cost is the same: the thing that knows you lives at their house.
| Grok Bot / Muse / Today | eta | |
|---|---|---|
| Where it lives | Their datacenter. Stop paying and the team is gone | Your machine, your own rack |
| Who answers | Dynamic routing — you do not know who answered this time | You decide. 100% BYOK: ChatGPT, Grok, Gemini, or the private model in your own rack |
| Memory | A black box you have to trust | One SQLite file you can read, change, delete, copy |
| What it did | A summary handed to you | Every step on the timeline: which file it read, which command it ran, which line it changed |
| Who sets the rules | Price rises, rate limits, a ban — you take it | None of that reaches your machine |
| Can you change it | No | The source is right there |
Rented 24/7 or your own 24/7. They sell you a team by subscription and take it back when you stop. eta is a team you keep, because you installed it once.
It remembers you. Do you remember what it remembers? Memory is one SQLite file on your disk: readable, searchable, deletable line by line. Deleted is really deleted.
One subscription, or your own models. 100% BYOK: a subscription account, an API key, the private model in your own rack — all first class.
A black-box memory, or a file. Go offline, pull the plug, move house: copy one directory and it comes with you.
The day you get banned. A ban on their side makes your agents disappear. eta has no such switch — only you do.
| Claude Code | eta | |
|---|---|---|
| Session | Close the terminal and it is gone | Agents stay, remember the last turn, start on their own schedule |
| Models | One vendor; they set the price and the limits | 100% BYOK, including the box in your rack |
| Data | Conversations and code flow into their service | One SQLite file on your disk; copy it and you have everything |
People who need 100% transparency and 100% control.
Willing to hand your life to an AI — not to one company.
People whose company will not let code leave the intranet.
People who have been rate limited, quietly model-swapped, or banned.
People who have to tell an auditor exactly what an agent read.
eta is a workbench for always-on agents. It runs on your own machine and you use it in the browser, on desktop or phone. Not a session — a team that stays.
Always-on agents Each has its own name, instructions, persona card and model. A restart loses nothing, and it remembers where the last turn stopped.
Group chats and a steward Several agents in one conversation; whoever you @mention answers, anything unmentioned goes to the steward.
Task board An agent proposes a task, you confirm it, the agent does it in its own session and hands it back for review.
Routines A short session on a schedule that leaves a report — and says nothing when there is nothing new.
Memory It remembers what was said; you can browse, search and delete. Memory is rows in a database, not a mood.
Artifacts Agents publish static pages: reports, charts, prototypes. Preview, share, revoke.
Your own models 100% BYOK: a subscription account, an API key, the private model in your own rack — all of it counts.
Agents are who you talk to and hand work to: a name, instructions, a persona card, a model, and which bundles it may use. Not a session, and not a machine.
Each face grows out of the agent's own id: rename it and the face stays, add an agent and you get another. These ones are actually breathing.
Name, instructions, persona card, model and thinking level live on it. Conversations, tasks and routines all use that identity — it does not become a different person each time.
Every (agent × conversation) pair has a session that remembers where it stopped, found again by the same row after a restart. It runs in one working directory.
Several agents in one room; only the @mentioned one answers, otherwise the steward. A woken agent gets only the lines it has not seen — never the whole history again.
It recalls what is relevant before a turn and records what is new afterwards. Browse, search, add and delete in the UI; memory is a SQLite file in the data directory.
Agents publish static pages: reports, charts, prototypes. Share any version by link; revoking is permanent. Pages run in an opaque origin and cannot read your cookies.
Rename it, rewrite its instructions, swap its model or bundles: the reply being written finishes first, the next one uses the new settings.
An agent proposes a task in the conversation; once you confirm it, the agent runs it — a worktree in the project, then back to you for review. You see every step, not a "done".
Hand it to an agent and have it hand the result back: every comment on the task wakes it once, in the same session. Nothing merges a pull request by itself, and nothing marks a task done by itself.
· list_tasks · get_task · update_task · comment_task # report done and hand it back for review · finish_task # merging is a click you make, not it · open_pull_request
A session runs on its machine, as your user, with whatever the tools are allowed to do. Only attach machines you keep for work.
Something that does one thing on a schedule. There is no agent behind it — only a model, a brief and a clock. Each run either reports or says nothing.
Each run leaves a note for the next one, and can read the runs and reports before it.
Tell a report “breaking changes only” and that goes into a new version of the brief, from the next run on. Old versions can be restored.
A run lasts at most 15 minutes, one at a time, and missed slots are not caught up — after a restart the clock starts from now.
Control first. You can see what an agent is doing, stop it, change it. Anything that needs your OK waits as long as it takes.
$ git push origin fix/checkout-clock rule confirm-push · from a bundle’s akhook.yml
✓ Allowed · this command only · valid 10 minutes · used once ✕ Denied · it was told not to route around it
Commands, file changes and tool calls all become the same card, answered in the chat or in Pending. The wait has no timeout.
# built in, shipped with the source - id: gh-pr-create on: shell_exec checks: - argv: [gh, pr, create] message: Push the branch, then open the PR with open_pull_request. # brought by a bundle’s akhook.yml - id: confirm-push on: shell_exec action: ask checks: - argv: [git, push] message: A push needs your OK.
Every shell command and every file change passes the rules first: either blocked with a better way to do it, or sent to you. Bundles can bring their own akhook.yml; the built-in layer cannot be turned off. This is a guardrail against slips, not a security boundary.
Everything waiting on you, in one place:
Steer the reply Stop everything /compact A bundle is a directory: skills, MCP servers, hook rules, and optionally a service. Whatever an agent ticks, its sessions carry on whichever machine they run. No repackaging, no install scripts.
my-bundle/ ├── plugin.json # name, description, requires, config, service ├── mcp.json # stdio or streamable HTTP ├── skills/*/SKILL.md └── akhook.yml # tool-call rules
The models are yours. Pick one: link a ChatGPT (Codex) or Grok subscription with a device code, paste a Google AI Studio key, or point it at any OpenAI-compatible service — including the one in your own rack.
Type this code on the provider’s page and eta has the login.
When one model fails on one account, only that model is parked; the account keeps working.
“Refresh status” checks every account without spending quota.
Needs a login, out of quota, failing for now — written next to the account. Replies continue once it recovers.
Anything OpenAI-compatible in your own rack is an ordinary model here, not a fallback.
Everything is in one process: the web, product data, running sessions, model credentials. No control plane, no message queue.
Conversations, tasks, memory, artifacts and agent workspaces all live on your machine, in one directory. The only thing that leaves is what you send out.
One machine is enough. One process, one data directory, one SQLite file. Decide before you start which machine the data lives on.
git clone \ https://github.com/0xfe-project/eta.git cd eta bun run setup bun run --cwd apps/web build HOME=/var/lib/eta bun apps/eta/src/main.ts \ --web-dir apps/web/dist \ --host 0.0.0.0 --port 8787
The data directory is always $HOME/.eta — no flag moves it: change HOME instead. In systemd that is Environment=HOME=/var/lib/eta.
Listening beyond loopback turns the token gate on: every request except /up needs a token. Open /?token=<token> once in a browser and it sets a cookie (HttpOnly, SameSite=Strict, 30 days); scripts use Authorization: Bearer. Behind a proxy, pass --allow-origin with the page’s public address.
A subscription account (device code), a Google AI Studio key, or any OpenAI-compatible service — pick one, or all three. A model you host only needs an address and a key.
# Settings → Machines → Add, copy the command it gives you eta-daemon setup <primary-url> <code> eta-daemon run eta-daemon install-service
The daemon is a single file with no web and no database: sessions run there, product data and model calls stay on the primary. The code works once and expires in 24 hours; you approve the pairing after checking the fingerprint. install-service registers a systemd user service or a launchd agent.
An open-source workbench for always-on agents that runs on your own machine: they remember, use tools, run on a schedule, and anything needing your OK stops and waits. Grok Bot, Muse and Today do the same thing — they just live in someone else’s datacenter.
No. eta runs on your machine and the data stays there. We do not touch your conversations, and we do not resell model capacity.
No. eta is a single-user service with no accounts or roles. It locks itself with a token gate that turns on when it listens beyond loopback.
Any. Subscription accounts (ChatGPT Codex, Grok), a Google AI Studio key, any OpenAI-compatible service — and a model you host just needs an address and a key. A model is provider:model-id, and the default provider is Anthropic.
Claude Code is a rented terminal: close it and it is gone, the models are theirs, the conversations flow into their service. eta is a team that stays, with your own models and your own disk. It is excellent at writing code — that part is not the argument.
No. The pull request a task delivers waits for you to merge it on the task page; the head is checked first, the merge uses a method the repository allows, and no admin rights are used to bypass protection. The GitHub chain is off by default.
The daemon only dials out to the primary, its key is made locally and the primary stores only a fingerprint; you approve the pairing after checking it, and the code works once and expires in 24 hours. Sessions there run as your user, so only attach machines you keep for work.
One process, a few hundred MB to start, plus whatever each session needs. No Kubernetes, no message queue.
One directory, $HOME/.eta by default: one SQLite file holds conversations, tasks, memory, usage and settings; sessions and artifacts are files. Copy that directory and you have everything.
eta’s interface is built on these rules. So is this page.
Using it should feel like things are in your own hands. Calm is there only so nothing knocks you out of that state.
The aim is to keep you in flow — and let you stay inside the work.
Try removing every element. If nothing is lost in understanding or use, it doesn’t stay.
Use space like a car’s dashboard. Density is respect, not clutter.
Square corners everywhere. Every colour goes through a variable; light and dark both.
Interaction transitions are 60ms linear: no trailing, no bounce. Reduced motion is respected.
Agent and technical parts use everyday words so you know what’s going on. No piles of jargon.
Polish means alignment, spacing, states, feedback and motion are all done — not a more “professional” skin.
Put your agents on your own machine.