Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Assign commands to AIs that break them into tasks on Linear, with human approval for final actions
AI summary · website and README
BusinessTypeScript · JavaScriptGitHub @Nexus2415OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Give one command, pick which AI leads, and let a team of AIs (Claude, ChatGPT, Gemini, Perplexity) break it down and work it, using Linear as the shared task board, with GitHub and Firecrawl as tools.
• Ownership rule: an AI owns an issue when its name is in [brackets] at the start of the title, in a label, or the assignee. Issues with no AI owner are never touched.
• Lead AI: chosen per command in the dashboard; the name in the command's title is the lead.
• One task per AI per cycle, highest priority first.Read the full README ↗Give one command, pick which AI leads, and let a team of AIs (Claude, ChatGPT, Gemini, Perplexity) break it down and work it, using Linear as the shared task board, with GitHub and Firecrawl as tools.
You ──command──▶ Linear issue "[Claude] …" (created from the dashboard)
│
lead AI plans │ creates sub-issues "[Perplexity] …", "[Gemini] …"
▼
each AI claims its sub-issue ─▶ uses tools ─▶ posts "## Result" ─▶ marks Done
│
lead AI reconciles │ posts "## Command summary" on the command, marks it Done
▼
Dashboard shows in progress / queued / accomplished per AI
[brackets] at the start of the title, in a label, or the assignee. Issues with no AI owner are never touched.| Control | Default |
|---|---|
ACP_ACTIVE kill switch | false: reads and reports only |
ACP_DRY_RUN | true: Linear and GitHub writes are logged, not made |
ACP_MONTHLY_BUDGET_USD | 0: only free-tier models run (Gemini). Paid calls are checked against worst-case cost before they run |
| Pull requests | off; when on, draft PRs only on allow-listed repos, never the default branch |
| Owner-only actions | merge, delete, deploy, purchase, send email, change credentials or release gates are refused in code and posted to the issue as "Owner approval needed" |
Model output, web pages and issue text are treated as untrusted data and can't change these rules.
Requires Node 22.18+ (runs TypeScript directly, no build step).
cp .env.example .env # fill in LINEAR_API_KEY at minimum
npm ci # dev tools only (typescript, @types/node)
npm run validate # tests + typecheck
set -a; . ./.env; set +a
npm run status # what's waiting; calls no models
npm run tick # one cycle (dry run until ACP_DRY_RUN=false)
npm start # loop every ACP_POLL_SECONDS
Free hosting: .github/workflows/engine.yml runs one cycle every 15 minutes on GitHub Actions. It stays off until you set the repository variable ACP_ACTIVE=true and add the keys as repository secrets.
dashboard/index.html is both the published claude.ai page and the website. Inside Claude it reads Linear through the viewer's Linear connector. On the website (https://ai-command-post.vercel.app) dashboard/console.js drives the owner console: task lanes and the agent roster from /api/console, commands and questions through /api/intake, and an Engine & budget panel fed by the engine's Linear status document. Keep the ownership regex in src/agents.ts and the dashboard's AGENTS list in sync.
Current state, what is switched off and why, and the owner-only steps left: HANDOFF.md ("Where it stands") and docs/OWNER-CHECKLIST.md.
src/config.ts environment → config (kill switch, dry run, budget, keys, models)
src/agents.ts roster, roles, tool kits, ownership rule
src/policy.ts green / yellow / red authority tiers
src/budget.ts monthly spend ledger and pre-call cap check
src/providers.ts Anthropic, OpenAI, Gemini, Perplexity clients (plain fetch)
src/linear.ts Linear GraphQL store + dry-run wrapper
src/tools.ts GitHub, Firecrawl and Linear tools behind the policy check
src/orchestrator.ts plan → work → reconcile cycle
src/cli.ts status | tick | run
dashboard/ claude.ai dashboard page
test/ node:test suites (fake models, fake fetch; no network)
The dashboard also runs as a website: vercel.json serves dashboard/, api/console.js (read-only) and api/intake.js (commands and questions) talk to Linear for it, and api/linear.js is the legacy read-only adapter. All of them share one password and origin check (api/lib/site-auth.js once ARN-83 F6 is merged). Import the repo in Vercel and set two environment variables: LINEAR_API_KEY and ACP_SITE_PASSWORD (anyone with the password can see your Linear team and issue commands). Without both, the site refuses every request. It can list teams and issues and create new command issues, nothing else.
The owner console sends new commands only to an AI lead you have explicitly approved. In Vercel, set ACP_DEFAULT_LEAD (for example claude) and list it in ACP_INTAKE_ALLOWED_LEADS (comma-separated). If either is missing, or the lead isn't on the list, the console refuses commands and files nothing. Questions still work.
api/eve.js, off by default)Dispatch is unsupported for now. /api/eve returns unsupported for every command and sends nothing, whatever the env vars say, until a verified Eve contract, a budget reservation and an ARN-52 ownership claim exist. Only health calls Eve: it reports reachable on an {"ok":true,"status":"ready","workflowId":"…"} (the Eve 0.71.3 health schema), unknown on any other 2xx, and never claims execution readiness. Server-only env vars: ACP_EVE_ACTIVE, ACP_EVE_BUDGET_USD (default 0 blocks), EVE_BASE_URL (bare https origin), EVE_TOKEN (never sent to the browser).
OIDC preflight (api/eve-oidc.js, inert, ARN-58). It builds, but never sends, the Eve 0.71.3 session request: POST /eve/v1/session with {message, operationId}, carrying ACP's Vercel OIDC token as both Authorization: Bearer and x-vercel-trusted-oidc-idp-token. It only uses a token from an injected getToken, and nothing wires that in yet. It refuses any token whose subject isn't exactly owner:<ACP_EVE_OIDC_TEAM>:project:<ACP_EVE_OIDC_PROJECT>:environment:<ACP_EVE_OIDC_ENVIRONMENT> (one explicit environment) and redacts the token when serialized. It also reads a session-create answer strictly: only 202 {ok:true,sessionId,status:"accepted"} counts, and that means accepted, not finished. Owner-only steps still block real dispatch:
vercelOidc({ subjects: [vercelSubject({ teamSlug, projectName, environment })] }). Calling vercelOidc() with no subjects only trusts Eve's own project.getVercelOidcToken() from @vercel/oidc is wired inside the request handler.