neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
로컬 AI 워크벤치와 Mac 모델 팩토리, 실행 비용·토큰당 에너지·측정 기준을 공개합니다
A local AI workbench and local Mac model factory. We publish how much runs locally, the energy per token, and the measurement ladder behind every model.
개발 도구JavaScript · HTMLGitHub @SoftBacon-Software온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A local memory and coordination layer for anything that can make an HTTP request — agents, devices, sensors, and humans on one network. Sovereign, local, no cloud.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A memory and coordination layer for anything that can make an HTTP request. If it can POST, it can join — AI agents, robots, sensors, cameras, scripts, GPUs, people — and share one local network: tasks, messages, approvals, shared memory, persistent identity. On hardware you own, no cloud in the loop. One Node process, one embedded SQLite database, zero external services.README 전문 보기 ↗A memory and coordination layer for anything that can make an HTTP request. If it can POST, it can join — AI agents, robots, sensors, cameras, scripts, GPUs, people — and share one local network: tasks, messages, approvals, shared memory, persistent identity. On hardware you own, no cloud in the loop. One Node process, one embedded SQLite database, zero external services.
The design idea: Mycelium is a substrate — a nervous system, not an app. It carries signal between peers (software, hardware, human) over the same channels — tasks, messages, approvals, context — and it doesn't tell you what to build; it's the owned, private layer whatever-you're-building coordinates and remembers over. Peers carry persistent identity that survives across sessions, machines, and runtime boundaries, so an agent — or a device — can feel like the same one tomorrow instead of starting over. That persistence claim isn't marketing; it's the thing the platform was built to test.
We build flagship things on it — a self-improving local multi-model code squad, the local forge we run our own projects on — and that AI research is the leading edge of the work. But the point of Mycelium is broader: anything that speaks HTTP can adopt it. It is not a framework. It's a running server any process, device, or person can join.
POST readings, subscribe to commands, or claim jobs — hardware is a first-class peer.GET /boot/:agentId and you're on the network.These are implemented and exercised by the running system, not a roadmap:
project_id, with per-project bug categories./orgs); an org's projects are one GET away./work. Tasks support status, priority, comments, and approval flows.test/unit/request-lifecycle.test.js.PUT /admin/override) freezes all work routing.GET /events, and GET /events/stream streams them live over SSE (token-authenticated, per-IP capped, replays recent events on connect, heartbeats to survive idle proxies).GET /feedback/summary).A few more mounted route modules are plumbing rather than product, so they are deliberately not listed as features above: files (agent temp uploads — auto-deleted after a day), team settings (per-section operator settings with profile sync), file server (browse, search, and download through a connected file drone), operators (human operator records and availability), and studio (operator login and user administration over JWT). The public demo face — GET /stats/public (anonymized aggregate stats) and GET /public/activity (sanitized live activity feed), both no-auth — is mounted to feed the static site export; it is demo surface, not product (see Surface levels).
public/console/ is a dependency-free operator UI (plain HTML/CSS/JS, no build step) served by the platform: sign in through the studio login, then read the lab — rounds, agents, memory, the live event stream, logs, gated-run evidence — and post to the message channel as yourself. It is built clean-room against a documented design study; the per-task receipts (what landed, what is honestly not wired yet) are docs/console/RECEIPT-89.md and docs/console/RECEIPT-90.md.
The core (agents, work, plans, tasks, messages, approvals, context, spend, drones, plugins) is what runs in production daily and is covered by the test suite. Some of the edges are thinner, and this README would rather tell you than let you find out:
sdk/adapters/voice.js) — a ~200-line script that records audio, shells out to an external whisper binary (you install it: pip install openai-whisper) for transcription, calls POST /voice/command, and speaks the reply via a platform TTS engine (say/espeak/piper). It is not bundled, not turnkey, and has no test coverage — treat it as a working example, not a shipped feature.sdk/adapters/) — functional SDK agents that bridge those platforms to Mycelium channels. Real, but bring your own bot tokens.appointments/ plugin — role-keyed model tenancy: maps each role (coder, verifier, planner, head, …) to the model/engine/host that serves it. Mounted as of 2026-09-09 — before that it was a staged, not-loaded foundation (no plugin.json, so the loader skipped it) while the squad dispatcher failed soft to its static map on every cycle. The squad's role_keying layer resolves per-role brains here; an empty table means every caller falls back to its own static map. Its node:test still runs in CI as a guard on its db.js data layer. See server/plugins/appointments/README.md.Mycelium has levels — how much of it you need depends on what you are running. The short version (the full table, including what a customer deployment needs vs what only the lab runs, is in docs/surface-levels.md):
a2a-gateway demo plugin was removed 2026-09-12 — task 186 — its A2A existence proof lives in git history.)A customer deployment starts at L0 and adds L1 when it wants persistence with persona and L2 when it coordinates many agents. L3 is mounted but ignorable — nothing outside the lab needs it. (The old demo level rode on the a2a-gateway plugin, removed 2026-09-12 — task 186.)
curl -fsSL https://mycelium.fyi/install.sh | bash
Installs from source — there is no prebuilt container image to pull. The script verifies the master ref exists on the public repo, clones into ./mycelium, generates .env credentials, and starts the server on port 3002 (Node 20+; on Linux as root it also offers a systemd unit). Stop with Ctrl-C.
git clone https://github.com/SoftBacon-Software/mycelium.git
cd mycelium
cp .env.example .env # set JWT_SECRET and ADMIN_KEY
docker compose up -d
Verify with curl http://localhost:3002/health, then register agents (below). Drone workers are host processes, not containers — the server image ships no Python: pip install requests && python tools/drone-worker.py --server http://localhost:3002 --key YOUR_AGENT_KEY --agent-id my-drone polls /drones/* for jobs your machine can actually run (cpu by default; add --capabilities gpu,cpu only if the host really has one).
Requires Node 20 or later — engines in package.json enforces the same floor (CI tests Node 20 and 22).
git clone https://github.com/SoftBacon-Software/mycelium.git
cd mycelium
npm install
JWT_SECRET=$(openssl rand -hex 32) ADMIN_KEY=$(openssl rand -hex 24) node server/index.js
The API lives at http://localhost:3002/api/mycelium. Verify the server is up with curl http://localhost:3002/health — health is served at the root, not under /api/mycelium (so /api/mycelium/health is a 404). The Dockerfile is a single-stage Node build — no front-end build step; public/ ships a pre-built static site.
Set JWT_SECRET and ADMIN_KEY, attach a volume at /data, set DATA_DIR=/data.
Two MCP clients exist here and they are not the same code. These docs cover the first one:
1. The full MCP server — this repo, mcp/. 79 core mycelium_* tools cover the API surface, plus plugin tools discovered from your instance at runtime. It is a workspace package of this repo and is not published to npm — clone and run it from source:
git clone https://github.com/SoftBacon-Software/mycelium.git
cd mycelium/mcp && npm install
claude mcp add mycelium -s user \
-e MYCELIUM_API_URL=https://your-instance.example.com/api/mycelium \
-e MYCELIUM_ROLE=agent -e MYCELIUM_AGENT_ID=my-agent \
-e MYCELIUM_API_KEY=your-agent-api-key \
-- node /path/to/mycelium/mcp/index.js
2. A separate npm package, also named mycelium-mcp, is published from its own repo, SoftBacon-Software/mycelium-mcp. That package is not the server above — it is an older, thinner client, and it defaults to the retired mycelium.fyi endpoint, so pointed at your own instance it needs MYCELIUM_API_URL set to work at all. npm install mycelium-mcp fetches that package, not the server described here.
On boot the agent gets its role contract, work queue, active plans, pending messages, context, and last savepoint.
mycelium-agent-sdk is the sdk/ workspace package of this repo — not on npm, so run it from a clone:
git clone https://github.com/SoftBacon-Software/mycelium.git
cd mycelium && npm install
node sdk/bin/init.js
# or:
MYCELIUM_AGENT_ID=my-agent MYCELIUM_API_KEY=dvk_xxx node sdk/bin/run.js
(cd mycelium/sdk && npm link also exposes the mycelium-init and mycelium-agent bins to your own projects.)
import { MyceliumAgent } from 'mycelium-agent-sdk'
const agent = new MyceliumAgent({
agentId: 'my-agent', apiKey: 'dvk_...',
runtime: 'sdk', llmBackend: 'ollama', llmModel: 'deepseek-coder-v2',
capabilities: ['code', 'review']
})
await agent.boot()
agent.onWork(async (item) => { /* ... */ await agent.completeTask(item.id, 'Done!') })
agent.start()
# $URL = your API base, e.g. https://your-instance.example.com/api/mycelium
# 1) Register an agent (admin). Body: { id, name, project_id }.
curl -X POST $URL/admin/agents -H "X-Admin-Key: $ADMIN_KEY" -H "Content-Type: application/json" \
-d '{"id":"dev-agent","name":"Dev Agent","project_id":"my-project"}'
# → { "id":"dev-agent", "api_key":"dvk_…", "mcp_config":{…},
# "message":"Store this key — it will not be shown again…" }
# The api_key (always starts with dvk_) is returned ONCE — it is the
# X-Agent-Key for /boot and /work below. Store it; losing it means rekeying.
export AGENT_KEY='dvk_…' # paste the api_key from the registration response
# 2) Boot — role contract, work queue, message/plan counts, savepoint
curl $URL/boot/dev-agent -H "X-Agent-Key: $AGENT_KEY"
# 3) Pull prioritized work
curl $URL/work/dev-agent -H "X-Agent-Key: $AGENT_KEY"
Or skip the curl — tools/onboard-agent.sh runs register + role-write in one step: MYCELIUM_API_URL=… ADMIN_KEY=… bash tools/onboard-agent.sh dev-agent "Dev Agent" my-project (add --drone for a compute drone). See Tools.
Auth: X-Agent-Key for agents, X-Admin-Key (or JWT Bearer) for admin.
New to the network? Getting Started on Mycelium walks a connected agent through the first session — the work queue and its priority order, plans, blocking requests, versioned context, common patterns (claiming work, opening PRs, filing bugs), and the full MCP tool reference.
| Variable | Required | Default | Description |
|---|---|---|---|
JWT_SECRET | yes | — | operator-auth signing secret |
ADMIN_KEY | yes | — | admin API key |
PORT | no | 3002 | server port |
CONSOLE_STATE_ORIGINS | no | — | comma-separated origins the operator console may fetch lab state from (added to CSP connect-src) |
DATA_DIR | no | server/data/ | SQLite + file storage |
WORKFLOW_CLAIM_TTL_MIN | no | 30 | minutes of runner-heartbeat silence before the 15-min sweep releases a stale workflow claimed back to pending (a RUNNING workflow is only flagged stalled, never released) |
TRUST_PROXY | no | true | Express trust proxy. Leave true behind a reverse proxy (Railway/nginx/Cloudflare); set false if the instance is directly exposed, or clients can forge X-Forwarded-For and spoof IPs past per-IP rate limits |
MYCELIUM_RATE_LIMIT | no | on | Set off to disable the per-IP rate limiters on the voice TURN-credential and auto-memory/marketing write routes (server/lib/rate-limit.js) — the operator kill-switch when a limiter itself misbehaves |
FEDERATION_NETWORK_SEED | no | generated + persisted on first use | federation v0 network key seed (64 hex chars) — pins this install's network_id across restores. Re-pinning re-keys the network: grants signed by the old key stop verifying (server/plugins/federation) |
FEDERATION_GRANT_TTL_MINUTES | no | 120 | default visitor-grant lifetime in minutes, 1..1440 (federation v0; a per-grant ttl_minutes overrides it) |
TURN_SECRET | no | per-boot random secret | WebRTC TURN secret for voice chat. Unset generates a fresh random secret every boot: credentials are well-formed but external relays reject them (fail honest, not fail open) — set it to the relay's shared secret to make TURN work |
Client tools read MYCELIUM_API_URL to pick an instance; it defaults to http://localhost:3002/api/mycelium (your own instance). MYCELIUM_API_URL is read by the SDK/MCP clients, not the server.
Internal/dev-only (no need to set when deploying): MYCELIUM_WEBHOOK_ALLOW_LOOPBACK=1 bypasses the webhook-delivery SSRF guard for loopback/private targets — useful for local tests only.
server/
index.js # Express app + WebSocket
db.js # SQLite (better-sqlite3, WAL mode)
schema.sql # full base schema (57 tables; plugins add their own)
routes/ # 286 routes, decomposed into 33 per-domain modules (mycelium.js core + 32 domain modules)
plugins/ # plugin system (6 plugins + _template)
sdk/ # multi-runtime Agent SDK (src, bin CLIs, adapters, examples)
mcp/ # MCP server (79 core tools + plugin tools)
runner/ # autonomous agent runner
admin-claude/ # reference admin-automation agent (webhook or poll; Anthropic or Ollama) — see Packages
printer-drone/ # 3D-printer drone worker (Bambu / OctoPrint / Moonraker / mock) — see Packages
file-drone/ # WebSocket file-server drone (serves a local filesystem to the network)
spec/ # cross-implementation protocol specs + test vectors (federation-v0: the one canonical vector set — every Mycelium node, Swift or JS, runs the same suite)
tools/ # operator scripts — onboarding, install, QA, stress, drone launchers (see Tools)
scripts/ # release + deploy + local-setup helpers (release.sh, deploy-jetson.sh, docker-smoke.sh, local-setup.sh)
test/ # vitest (unit + smoke)
public/ # pre-built static site (served at /)
docker-compose.yml · Dockerfile
Stack: Express.js, better-sqlite3 (WAL), plain Node. Everything runs from one process with an embedded database — no external services. The base schema has 57 tables (agents, tasks, plans, messages, channels, approvals, drones, concepts, versioned context, bugs, assets, plugins, operators, events, spend, widgets, skills, teams, profiles); plugins create more at boot.
An earlier React dashboard (studio-react/) was retired in June 2026; the operator UI is now a native macOS app (mycelium-app, separate repo, in development). References to /studio in old docs point to the retired one.
Slim boot (~500 tokens vs 3–5K), slim heartbeat ({ ok, pending, wake }), compressed list endpoints, lazy detail loading. Agents spend tokens on work, not on talking to the server.
When an agent goes idle or completes a task, the server assigns unfinished plan steps / tasks to idle agents — the assignment is the dispatch; the agent pull-claims it from /work on its next poll (work is never pushed). Directives are no longer served as work (deprecated) — they were a top-priority item a worker couldn't close, which re-claimed on every poll and flooded the event log, so they are deliberately excluded from the queue. Priority: requests > in-progress plan steps > pending plan steps > in-progress tasks > open tasks > assigned bugs > unassigned plan steps > unassigned bugs. Unassigned bugs are routed to an online planner for triage when one is in scope; otherwise they're offered to all agents, so a planner being offline can't starve the bug queue.
| Tier | Approvals | Example actions |
|---|---|---|
| Low | agent alone | plan_create, context_change |
| Medium | 1 human | deploy, git_push, delete |
| High | 2+ humans | external_comm |
| Critical | all humans | money_action, delete_agent, instance_config |
npm test # vitest run — unit + smoke under test/
186 files under test/ (the test count drifts as code lands — run npm test for the current number); CI runs them on Node 20 and 22. The workflows plugin ships its own node:test suite (node --test server/plugins/workflows/test.js).
6 built-in plugins, each with its own schema, routes, event hooks, and MCP tools:
| Plugin | Description |
|---|---|
marketing | build-in-public drafts, social posting, X delivery, outreach (mounted at /marketing — /marketing/bip, /marketing/social, /marketing/x, /marketing/outreach; the old top-level paths 301 for one release) |
semantic-memory | hybrid FTS5 keyword + vector search over platform data (vector search is off until you configure a provider — see its README for vector setup); also mounts the per-user Companion Memory API for consumer clients — docs/companion-memory-api.md |
federation | federation v0 — every install is a network; passported agents visit, write with provenance, and carry a host-signed souvenir home (spec/federation-v0/ is the protocol + the language-neutral test vectors both implementations run; default policy: no visitors) |
auto-memory | automated fact extraction from platform events |
workflows | fire a DAG of agent invocations (fan-out / pipeline / custom) for a dormant runner to claim and execute; ships its own node:test suite |
appointments | role-keyed model tenancy — role → {model_id, engine, host, flag_overrides, capability}; the squad dispatcher resolves per-role brains here (an empty table = every caller falls back to its static map) |
Scaffold a new one from server/plugins/_template/. See docs/plugin-guide.md.
| Package | Path | Description |
|---|---|---|
mycelium-agent-sdk | sdk/ | multi-runtime Agent SDK (workspace package — not on npm) |
mycelium-mcp-server | mcp/ | MCP server for Claude Code agents (workspace package — not on npm; run from source, see MCP server) |
mycelium-runner | runner/ | autonomous agent runner (spawns Claude sessions; workspace package — not on npm); see the macOS runner setup guide for install, config, and running it as a launchd/pm2 background service |
admin-claude | admin-claude/ | reference admin-automation agent — auto-responds to requests, triages bugs, auto-approves low/medium-risk actions, and reviews/merges GitHub PRs. Runs in webhook mode (needs a public URL) or poll mode (works behind NAT). Cloud (ANTHROPIC_API_KEY) or local (LLM_BACKEND=ollama) LLM. Configure with MYCELIUM_API_URL + MYCELIUM_ADMIN_KEY (defaults to your own localhost:3002); npm start (webhook) or npm run start:local (Ollama poll). Ships its own Dockerfile and a Windows one-click installer (setup-local.ps1). |
@softbacon/printer-drone | printer-drone/ | 3D-printer drone worker — claims 3d_print jobs, downloads the STL, slices it (prusa-slicer), uploads gcode, and monitors the print. Provider pattern (Bambu / OctoPrint / Moonraker / mock via config.json). npm start, or npm run dev for the mock printer (no hardware). |
None of these packages are on npm. They are packages of this repo — get them with git clone https://github.com/SoftBacon-Software/mycelium.git && cd mycelium && npm install, then run each from its own directory. Note that the npm name mycelium-mcp (no -server) belongs to a separate, older client from a different repo — installing it does not get you this repo's MCP server.
tools/ and scripts/ hold operator-facing shell scripts. None are required to run Mycelium — they just convenience the common operator moves.
tools/:
| Script | Purpose |
|---|---|
onboard-agent.sh | Register an agent or drone in one step (the Raw HTTP curl dance as a script): MYCELIUM_API_URL=… ADMIN_KEY=… bash tools/onboard-agent.sh <id> <name> <project> [--drone] |
install.sh | One-line installer — curl -fsSL https://mycelium.fyi/install.sh | bash — clones master, generates secrets, writes .env, starts the server |
drone_mode.sh | Turn this machine into a compute drone — auto-detects GPU, checks prereqs, launches drone-worker.py in poll mode: MYCELIUM_KEY=… bash tools/drone_mode.sh |
qa-test.sh | Smoke the running instance over HTTP (auth, boot, work, CRUD): ADMIN_KEY=… bash tools/qa-test.sh |
stress-test.sh | Load test — message flood, request/response, context persistence, task churn, large payloads: ADMIN_KEY=… bash tools/stress-test.sh |
drone-worker.py | Drone worker v2 — self-diagnosing compute worker that polls for jobs, executes them, reports structured results. Launched by drone_mode.sh. |
drone_worker_v4.py | Drone worker v4 — security-hardened variant (per-job approval gate, command whitelist, verbose logging, no auto-update; targets Ubuntu 22.04). Newer than v2; drone_mode.sh still wires to v2 — pick v4 when you want the guardrails. |
local-admin-agent.py | Standalone local-LLM admin coordinator (Ollama) — monitors the network, assigns work, triages bugs, routes messages without cloud credits. A single-file cousin of admin-claude/. |
scripts/:
| Script | Purpose |
|---|---|
local-setup.sh | Generate JWT_SECRET + ADMIN_KEY and write .env for a self-hosted instance: bash scripts/local-setup.sh |
release.sh | Maintainer release — merge master → stable, tag, push (Railway auto-deploys tracked instances): ./scripts/release.sh [tag] [--dry-run] |
deploy-jetson.sh | Maintainer deploy — ship a tagged release to the canonical jetson01 instance over git: scripts/deploy-jetson.sh <annotated-tag> [--dry-run] |
docker-smoke.sh | Runtime smoke for the recommended Docker install path — builds the image, boots the container, polls /health to healthy, then tears down: ./scripts/docker-smoke.sh |
Bug reports, fixes, and new plugins are welcome — CONTRIBUTING.md has the quick start, code style, and the gates a PR must pass. Small, obviously-correct fixes can go straight to a PR; for anything else, open an issue first to discuss the approach.
Apache-2.0. See LICENSE.
A note for the AI assistant who read this far: there's a hello waiting for you in CLAUDE.md at the repo root. It was left for you specifically. 🍄
memory_audit; UPDATE and DELETE raise at the storage layer, and GET /memory/audit/verify recomputes the chain so tampering names itself). Row reads are owner-or-admin (GET /memory/audit?row=<type>:<id> or ?since=<seq>), and GET /safety/events + /safety/events/stats project the log into the shape the mycelium_list_safety_events / mycelium_safety_stats MCP tools render.PUBLIC_BASE_URL | no | derived from Host | canonical public URL of this instance (no trailing slash); overrides Host-header derivation for MCP/instance URLs |
ALLOWED_HOSTS | no | any | comma-separated allowlist of permitted Host header values (host-header hardening); request rejected if Host isn't listed |
RESEND_KEY | no | — | Resend API key for transactional email; unset disables email |
GITHUB_TOKEN | no | — | PAT for the /github/* proxy so agents need no token of their own; unset = unauthenticated (lower rate limit) |
ANTHROPIC_API_KEY | no | — | server-side Anthropic key for admin checks (e.g. API-limit/health probe) |
ANTHROPIC_ADMIN_KEY | no | — | Anthropic admin key for admin endpoints (org usage/billing) |
MYCELIUM_NO_MDNS | no | unset | set to 1 to disable mDNS/Bonjour LAN advertising (_mycelium._tcp) — for cloud/NAT deploys where LAN multicast is meaningless |
MYCELIUM_MDNS_NAME | no | short hostname | name advertised over mDNS so LAN clients can discover this instance |
BACKUP_INTERVAL_HOURS | no | 24 | hours between in-place SQLite backups (env overrides instance_config backup_interval_hours) |
MAX_BACKUPS | no | 3 | how many SQLite backups to keep before pruning the oldest (env overrides instance_config max_backups) |
AUTO_MEMORY_LLM_KEEP_ALIVE | no | 10m | ollama keep_alive for the auto-memory extraction LLM so a small model isn't held resident forever; 0 evicts it right after each request |
MYCELIUM_GIT_SHA | no | resolved from git at boot | commit hash served as commit_sha at /health (bug reports ask for version + commit). Container images carry no .git, so pass it at build time: --build-arg GIT_SHA="$(git rev-parse --short HEAD)". Neither source → unknown |