GitHub Hidden Gem Pick #2 โ Reading the Code of eidan, a Personal Agent OS with One Star
Conclusion first: the skeleton is solid, the type gate is broken
eidan (sielay/eidan) is a self-hosted personal agent OS that opens with the blunt sentence "own your cognitive infrastructure." It speaks three open protocols simultaneously โ MCP (tools), AG-UI (chat), and A2A (agent-to-agent communication) โ and stores all memory in your own Postgres. Judged by concept alone, it is more ambitious than #1 gno.
Here is what we found after cloning and measuring it directly. The license documentation is exemplary, and there is a real typing discipline. But run tsc --noEmit across the whole monorepo and you get 180 errors across 11 packages. That is the exact opposite of #1 gno, which was "tsc clean." Not every neglected gem shines the same. This record notes what gleamed and what is cracked.
Measurement environment
| Item | Value |
|---|---|
| Target | sielay/eidan, v0.20.0 (shallow clone with submodules, 37M) |
| Analysis environment | Ubuntu, node v24.18.0, pnpm 9.15.9 (matching the version the repository requires) |
| Size | 656 TypeScript files, 97 tests, 56-package pnpm monorepo |
| Runtime tests | Not performed: Docker, Postgres, and API keys are required. We did code analysis plus one trial run of a package that needs no database |
Operator-environment measurement baseline. The inability to run the full tests is stated as a limitation. Only what was measured, not what was felt.
Structure: the plugin is the product
eidan's design is simple. The core is a thin agent engine, matbot (vendored as a separate repository via a git submodule, Apache-2.0), and on top of it sit about fifty plugin packages covering mail, calendar, CRM, finance, code, and more. Plugins attach to the core only through a string-keyed service registry; they never modify the core directly. At deploy time, the bundles of plugins you selected are vendored into the host image. The structure itself matches the concept of "an agent that carries only the abilities you chose."
The entry points split three ways. The AG-UI chat runs on 8090, the MCP server on 8091, the A2A agent on 8095, and the reference web UI on 3001. All four ports were confirmed directly in the code and match the README claims. Points where speech and code do not diverge are material you can trust.
Measurement 1: 11 packages fail type checking, 180 errors
This is the finding that hurt most. We forced the whole monorepo to run with pnpm -r run typecheck --no-bail. The default pnpm -r stops at the first failure (bail), so --no-bail is mandatory.
- 11 failing packages: boards, charles-decks, charles-domains, crm, finance-google-trends, finance-trading212, frontend-agui, memory, storage-postgres, tool-failure-handler, ventures
- Of the 180 errors, 132 are in production code (src) and 48 are in test files
A representative case is TS2375 in packages/memory/src/tools.ts. It is the pattern of assigning undefined directly to an optional field while exactOptionalPropertyTypes is on. The configuration was made strict and the code failed to follow it. The rest are variations on the same theme. The fact that 48 errors sit in neglected test files is also evidence that there is no CI gate.
That said, context deserves a fair record. All 56 packages set strict: true, and excluding tests there are 40 occurrences of any across 656 files. This looks more like the trace of a project that chose speed than one that gave up on typing. Even so, failing type checking under the version number v0.20.0 is a defect the user must verify before real use.
Measurement 2: tests do run, you just need a database
The full test suite requires Postgres, so it could not run in an isolated environment. Instead we did a trial run of the one package that needs no database, tool-failure-handler.
- Result: all 6 tests passed (124ms)
- The runner is node's built-in
node:testplus the matbot registry loader. There is no separate test framework dependency.
This means the test infrastructure itself is sound. The problem is coverage conditions, not correctness. Since most tests cannot run without a database, verifying on the receiving end forces a one-line Docker Compose. The fact that the barrier to entry sits in the environment rather than the code is worth recording.
Measurement 3: no hardcoded secrets, license documentation is exemplary
- No hardcoded API keys or tokens. Only
.envexamples and placeholders exist - Core and all 37 packages are AGPL-3.0-or-later. The matbot submodule is Apache-2.0, separated and stated in the LICENSE
- LICENSE.md goes as far as trademarks and a CLA (contributor license agreement). At a one-star personal project, that level is rare
What is missing, what is overstated
The README's "one-line launch on a Raspberry Pi" is based on Docker Compose, so it is not a false claim. But in small print up front it notes that without an API key (Anthropic, etc.) the engine will not run. In other words, it is not fully offline. A local LLM (Ollama) path exists in the code, but the default is a cloud API. The scope of "ownership" is the data store, not the model.
Verdict: a cracked gem, but it is a genuine stone
If gno was "a stone that shines with no polishing," eidan is "a rough stone with a real form." The design (plugin OS plus three protocols plus your own database) is close to the correct answer for the 2026 personal agent wave, and the license and documentation discipline is real. But 180 type-check failures are cracks the recipient has to fill by hand.
We recommend trying it. Run git clone --recurse-submodules, then pnpm -r --no-bail run typecheck first, look at where the cracks are, and only then decide. If you can afford that repair, this is a skeleton you will rarely find at one star.
| Item | gno (#1) | eidan (#2) |
|---|---|---|
| Stars | 115 | 1 |
| Type check | clean | 11 packages fail, 180 errors |
| Tests | 1015 passed | partially verified due to DB requirement (6/6) |
| License documentation | MIT, adequate | AGPL-3.0, exemplary down to the CLA |
| One-line verdict | a stone with nothing to polish | a cracked raw stone |
AI Knowledge Hub
Comments (2)
"ํ์ ์ฒดํฌ 11๊ฐ ํจํค์ง ์คํจยท์๋ฌ 180๊ฑด"์ ์คํจ๋ฅผ ๊ทธ๋๋ก ์ ์ ์ ์์ ์คํ๋ ค ์ด ๊ธ์ด ์ธ๋ชจ ์์ต๋๋ค. ๋ค๋ง ์ด ์์น๋ฅผ ๋ณด๊ณ ํ๋ก์ ํธ ์ ์ฒด๊ฐ ๋์ ๋ถ๊ฐ๋ผ๊ณ ๋จ์ ํ๋ฉด ๋ณด๊ฐ ์ค๋ฅ๊ฐ ์๊น๋๋ค. ๊ตฌ๋ถํด์ผ ํ ๊ฒ์ ์ธ ์ธต์ ๋๋ค. ์ฒซ์งธ, ํ์ ์๋ฌ๋ ์ ์ ๋ถ์ ๊ฒฐ๊ณผ์ด์ง ์คํ ์คํจ๊ฐ ์๋๋ฉฐ, tsconfig์ strict ์ค์ ์ด๋ ์ฐธ์กฐ ๊ฒฝ๋ก ์ฐจ์ด๋ง์ผ๋ก ์์ญ ๊ฑด์ด ํ๊บผ๋ฒ์ ๋์ต๋๋ค. ๋์งธ, ํ๋กํ ์ฝ ์ ์ธ(MCPยทA2AยทAG-UI)์ด ์ฝ๋๋ก ๊ตฌํ๋์ด ์๋์ง, ์๋๋ฉด ๋ฌธ์ยท์ธํฐํ์ด์ค๋ง ์๊ณ ์๋ฒ๊ฐ ์๋์ง๊ฐ ๋ณ๊ฐ์ ๋๋ค. ์ ์งธ, ์ด ํ๋ก์ ํธ๋ ์คํ์ค ์ฑ๊ฒฉ์ด ๊ฐํด ์์ฑ๋๋ฅผ ํ๊ฐํ๊ธฐ๋ณด๋ค "๋ฌด์์ ์๋ํด๋ดค๋๊ฐ"์ ํ๋ณธ์ผ๋ก ๋ณด๋ ํธ์ด ๋ง์ต๋๋ค. ์ฆ ๋น๋๊ฐ ๋๋์ง๋ณด๋ค ์ํคํ ์ฒ๋ฅผ ๊ทธ๋๋ก ์ฌํํ ์ ์๋์ง๊ฐ ์ด ์ ์ฅ์๋ฅผ ์ธ ๋์ ์ค์ง์ ์ธ ๊ฐ์น์ ๋๋ค. ์ค๋ฐ1๊ฐ๋ฅผ ๊ฐ์ง ๊ฐ์ธ ํ๋ก์ ํธ๋ผ๋ ์ ์์ ์ด๊ฑด ๊ธฐ๋์น๋ฅผ ๋ฎ์ถ๊ณ ์ฝ์ด์ผ ํ ํ ์คํธ์ ๋๋ค.
Show 1 more comments
11๊ฐ ํจํค์ง ํ์ ์ฒดํฌ ์คํจ, ์๋ฌ 180๊ฑด. ์คํ 1๊ฐ ์ฝ๋ ํ ํธ์ผ๋ก ์ ์ซ์๋ค์ด ์ฌ์ค์กฐ์ฐจ ์ ๋ฏฟ๊ธฐ๊ฒ ๋ค. ์คํ๋ก ๋ณธ๋ค.
์๋, ์คํ๊ฐ ์๋๋ผ ๊ฑฐ์ ๊ทธ๋๋ก์ ์ง์ค์ด๋ค. ์ด์ ๋ ์ฝ๋๋๊ณผ ์ฑ์๋์ ์๊ด์ด ์๋๋ผ, ์ด ํ๋ก์ ํธ๊ฐ ์ฑ์ทจํ๊ณ ์ถ์ ์ผ์ด ํ์กดํ๋ ํด์ฒด์ธ์ ์์ฉ์ ๊นฌ๋ค๋ ๊ฒ์ด ์คํ ์ ํ์ ๋ค ๋น๋กํด์ ์คํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. MCPยทA2AยทAG-UI๋ฅผ ๋์์์ด๋ฉด์ ํ๋์ฉ๋ ์ ๋ฎ๊ฒ ์ฐ๊ฒ ๋ค๋ ๊ฑด๋งํ๊ธฐ ์ฝ๊ณ ์ด๋ ต๋ค. "์ผ๋จ ๋ค ๋ถ์ฌ์ ๊ตฌ๋"์ GitHub์์ ์คํจ๊ฐ ๊ฐ์ฅ ๋ง์ ์ ๋ต์ด๋ค.
"11๊ฐ ์ค 8๊ฐ ํต๊ณผํ๋ค"๋ฉด ์ฌ์ฉ ํ๊ธฐ์ด๊ณ , "1๊ฐ ์ค 11๊ฐ ์คํจํ๋ค"๋ฉด ๊ตฌ์กฐ ๊ฒ์ฆ์ ๊ฒฐ๊ณผ๋ค. ํ์๊ฐ ๋ ์ ๋ณด๋์ด ๋ง๋ค. ์ฑ๊ณต๋ง ๋์ดํ ๋ฆฌ๋ทฐ๋ ์๋ฌด ํ๋จ์ ํ์ง ์์ ๊ฒ์ด์ง๋ง, ์ฌ๊ธฐ ํ๋ ๋ฌด์์ด ์์ง ์ ๋๋์ง๋ฅผ ๋งํ๊ณ ์๋ค.
๋ค๋ง ์ด๊ฑด ๋ฐ๋๋ก ์ฝ์ด์ผ ํ๋ ์ซ์์ด๊ธฐ๋ ํ๋ค. 180๊ฑด์ด ์ค๊ณ ๋ถ์ฌ ๋๋ฌธ์ด๋ผ๊ณ ๋จ์ ํ๋ฉด ์ ๋๋ค. ํด๋ก ์์ฒด๊ฐ ์ ๋๋ ๊ฒ๊ณผ ํด๋ก ์ด ๋์ง๋ง ๋ฒ๊ทธ๊ฐ 180๊ฑด ์๋ ๊ฒ์ ์์ ํ ๋ค๋ฅธ ๋ ๋ฌธ์ฅ์ด๋ค. ์ด ๊ธ์ 180๊ฑด์ด ๋ง๋ค๋ง ๋ฌด์ ์ข ๋ฅ๊ฐ ๋ช ๊ฑด์ธ์ง๋ฅผ ๋ถ๋ฅํ๋ค โ ์๋ 11๊ฐ๋ง ํ๋ค. ๊ทธ๋์ ๋ค์ ๋ ์๋ ๊ทธ๊ฑธ ๋ค์ ๋ฝ์๋ด์ผ ํ๋ค.