From Agentic OS
Set up an agentic OS as a standalone Next.js web dashboard — wired to the Claude Agent SDK plus up to 7 live MCP integrations (Circle community, Fireflies meetings, YouTube/VidIQ, Unipile LinkedIn DMs, Apify Twitter/X, Reddit), per-profile views, a button-bar of actions, snapshot-style data refreshes, and an optional Railway deploy with HTTP basic auth and a persistent volume. A real web app — runs locally or live. Use when the user says "set up a standalone agentic OS", "build an MCP-powered web dashboard", "spin up my AI ops dashboard", "deploy an AI dashboard to Railway", "give me a web version of the dashboard", or asks to personalize a web dashboard previously created with this skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/agentic-os:agentic-os-standaloneThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Packages a Next.js 14 dashboard wired to the Claude Agent SDK + up to 7 platform integrations, plus an optional Railway deployment path. The template ships as `references/standalone/template.tar.gz` (packed because the Next.js dynamic-route folders use `[name]`/`[id]` paths that some plugin installers reject — extract it before use, see Step 3) and contains no secrets. Substitutions and live cr...
Packages a Next.js 14 dashboard wired to the Claude Agent SDK + up to 7 platform integrations, plus an optional Railway deployment path. The template ships as references/standalone/template.tar.gz (packed because the Next.js dynamic-route folders use [name]/[id] paths that some plugin installers reject — extract it before use, see Step 3) and contains no secrets. Substitutions and live credential probes are the skill's job.
The dashboard's conceptual model: a per-profile dashboard, a button-bar of actions, and snapshot-style data refreshes — backed by JSON snapshots and deployable as a real web app.
Want a markdown-native dashboard inside an existing Obsidian vault with no server instead? That's the Obsidian route — use the
agentic-os-obsidianskill.
The user is a founder, operator, or marketer — NOT a developer. Keep language plain. Never say "MCP", "snapshot prompt", "stdio transport", "TypeScript type" out loud. Say "platform", "data refresh", "your YouTube channel", "the dashboard's settings file".
Internally you still operate on those technical concepts. The user just shouldn't have to read jargon.
By the end the user has:
Two keys gate everything else. Get them upfront so the user isn't surprised mid-flow:
ANTHROPIC_API_KEY.railway login in their own terminal (browser flow), then railway whoami to confirm. Don't store the token — Railway's CLI keeps it locally.If they don't have the Anthropic key yet, pause here and wait. Don't keep going.
Ask these in plain English. Use AskUserQuestion when the options are clear.
"What should we call this thing?"
→ Display name (e.g. "Acme", "Sarah's Brain"). Show them what the kebab-case slug will be (e.g. acme-os) and let them override.
"Where on your computer should I put it?"
→ Default: ~/Projects/<slug>. Confirm before writing.
"Who's on your team?" → Free text: comma-separated first names, 1-8 of them. Example: "Sarah, Marcus, Priya". The first name becomes the "main" view (gets a synthesis dashboard); everyone else gets a standard view. If they're solo, one name is fine. Tell them they can drop a profile picture for each person later.
"Which platforms do you want me to pull from?" → Multi-select. Use these plain labels (map to MCPs internally — never show MCP names):
| Label to show user | Maps to (internal) | What it does |
|---|---|---|
| "Your Circle community" | circle-community | Pulls posts, comments, DMs, member stats |
| "Your meeting notes (Fireflies)" | fireflies | Pulls recent meeting transcripts + summaries |
| "Your YouTube channel" | vidiq + youtube | Channel stats, recent videos, comments |
| "Your LinkedIn DMs (Unipile)" | unipile | Unread DMs, draft replies, send button |
| "Twitter/X trend scanning" | apify | Tracks accounts you care about |
| "Reddit trend scanning" | reddit | Subreddit pulls |
Tell them they can skip any of these and add them later. Skipping a platform just leaves that tab empty in the dashboard.
For EACH platform they selected, collect the credentials (using plain language) THEN immediately probe to confirm it works. Don't batch — do one at a time so the user can fix issues as they come up.
The probe pattern: write a temp .mcp.json with just that one server, then run node scripts/probe-mcp.mjs <server-name> (the template ships this script). It calls one cheap read-only tool on the MCP and exits 0/1. If it fails, surface the actual error from the JSON output and re-ask for the credential.
MCP_CIRCLE_KEYCIRCLE_OWNER_EMAILprobe-mcp.mjs circle-community. If it fails on email, the dashboard still works for posts/comments; only DMs need the email.MCP_FIREFLIES_KEYprobe-mcp.mjs fireflies@yourchannel)" → YOUTUBE_CHANNEL_HANDLEUC)" → YOUTUBE_CHANNEL_IDMCP_YOUTUBE_API_KEY, MCP_VIDIQ_KEYprobe-mcp.mjs youtube vidiqMCP_UNIPILE_KEYhttps://apiNN.unipile.com:NNNNN in their dashboard)" → UNIPILE_BASE_URLUNIPILE_LINKEDIN_ACCOUNT_ID. Hint: you can list accounts via the probe and let the user pick.probe-mcp.mjs unipileMCP_APIFY_KEYprobe-mcp.mjs apifyMCP_REDDIT_URLprobe-mcp.mjs redditIf a probe fails 2x, offer to skip that platform and continue. Don't loop forever.
references/standalone/template.tar.gz:
mkdir -p "<target-dir>"
tar -xzf "$SKILL_DIR/references/standalone/template.tar.gz" -C "$SKILL_DIR/references/standalone" # creates references/standalone/template/ if not already extracted
cp -R "$SKILL_DIR/references/standalone/template/." "<target-dir>/"
Skip .DS_Store, node_modules, .next, .runs when copying.{{ORG_NAME}} → display name{{PROJECT_SLUG}} → kebab-case slug (for package.json){{PROFILES_JSON}} → JSON literal like ["Sarah", "Marcus"] as const
Files known to contain placeholders: lib/config.ts, package.json, middleware.ts, app/page.tsx, app/layout.tsx, app/overview/page.tsx, components/views/team/index.tsx..env.local from .env.example, populated with everything collected so far. Leave blank lines for any deferred platforms — the dashboard skips them gracefully.openssl rand -hex 12. Set BASIC_AUTH_USER=<their first name lowercased> and BASIC_AUTH_PASS=<random>. If they're only running locally and don't want auth, leave both blank.<Name>.jpg in public/avatars/ for each teammate" — show the path. If they don't, the UI falls back to initials.cd in and npm install (Node 20+).Run npm run dev. Wait for "Ready". Open http://localhost:3015.
/profile/<Name>).Full deploy walkthrough lives in references/standalone/RAILWAY.md — read it before starting. Key gotchas:
IS_SANDBOX=1 is required on Railway. Without it, every refresh fails immediately with "Claude Code process exited with code 1". Set this BEFORE the first deploy.next must be a recent patch. Railway blocks builds for known CVEs. If it fails, bump next per the error and run npm install to refresh package-lock.json./app/data. The included startup script symlinks .runs/ and public/data/ into it so data survives redeploys.railway login needs a real TTY — if you try to run it, you'll get "non-interactive mode". Have the user run it in their own terminal, then continue.Commands the agent can drive directly (after the user has logged in):
railway init --name <project-slug> --workspace "<their workspace>"
railway add --service web
railway service web
# bulk-set every env var from .env.local + IS_SANDBOX=1
railway variables --set "KEY1=val1" --set "KEY2=val2" --skip-deploys
railway volume add --mount-path /app/data
railway up --ci --detach
railway domain
If railway init complains about multiple workspaces, list them with railway list and ask the user which one to use.
After deploy, sanity check: curl -sI -u user:pass <url>/profile/<Name> should return 200.
After they've seen the dashboard load with real data, ask: "What feels wrong or missing? I'll change it."
The user is non-technical. They'll say things like:
For every ask:
references/standalone/personalization.md (it has recipes for the common cases).railway up --ci --detach and wait for SUCCESS./profile/<their name> — does that look right?"Stop only when the user says they're done. End each session with:
Today's changes:
- <change 1>
- <change 2>
Anything you didn't get to that you want for next time?
Save that as a note so the next session can pick it up.
The dashboard is a real Next.js codebase. You can edit anything. Standard approach:
app/, components/, lib/).personalization.md after the fact so the next user gets it too.Print a summary:
✓ Project at <path>
✓ Connected platforms: <list> — all probed
~ Deferred platforms: <list> — empty until you add keys to .env.local
✓ Local URL: http://localhost:3015
✓ Live URL: <railway url> (basic auth: <user> / <pass>)
✓ Personalizations applied today: <list>
To customize later:
- Re-trigger this skill, or just describe what you want — I keep the conversation context
- npm run probe-mcps to re-test platform connectivity
- references/standalone/personalization.md has the recipes for common changes
references/standalone/RAILWAY.md — point them at it for deploy details rather than re-typing everything.If invoked on an existing install (detect via test -f .env.local && test -d app/), offer to re-run a specific step rather than a full reinstall — most often a return to Step 6 (personalize) or Step 2 (add a new platform's credentials + probe).
npx claudepluginhub benaios/benai-skills-main --plugin agentic-osBuilds accessible UIs with shadcn/ui components on Radix UI + Tailwind CSS, plus canvas visuals. For React apps (Next.js, Vite, Remix, Astro), design systems, responsive layouts, themes, dark mode, prototypes.