AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Claude Code 팀 전체 사용·비용 관리, 노트북·클라우드·CI 포함, 오픈소스 자체 호스팅 가능
Claude Code usage and cost for a whole team: laptops, cloud sessions and CI in one priced ledger. Open source, free to self-host.
개발 도구TypeScript · JavaScriptGitHub @NotTahaAli온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Your team runs Claude Code in three places. Count it as one.
Claude Code usage and cost for a whole team: every Session from every laptop,
server and cloud environment lands in one dashboard, per Member, per Project,
per Device.
The live demo runs on made-up data. No sign-up needed.README 전문 보기 ↗Your team runs Claude Code in three places. Count it as one.
Claude Code usage and cost for a whole team: every Session from every laptop, server and cloud environment lands in one dashboard, per Member, per Project, per Device.
Live demo · Website · Docs · Self-hosting · Contributing
The live demo runs on made-up data. No sign-up needed.
Claude Code's /cost shows one Session on one machine. A team runs Claude
Code on laptops, on servers and in cloud environments, under several people,
and the bill arrives as one number. SessClone collects every Turn from
every one of those places and answers the questions that number cannot: who
spent it, on which Project, with which model, from which Device.
Self-hosting is free at any size. Hosted plans on sessclone.com run the same code for teams that would rather not operate it; they are paid, and on a waitlist for now.
/sessclone-status and /sessclone-sync check or push at once.Claude Code ──hooks──▶ Collector ──HTTPS + API key──▶ /api/ingest ──▶ Postgres (RLS)
│
└── presigned PUT ──▶ S3-compatible bucket (transcripts)
The plugin's hooks read each transcript from a cursor and push only the new Turns, so a typical turn costs a few hundred bytes. When the deployment cannot be reached, reports wait in a local queue and are sent at the next session. Transcripts go straight to storage through presigned URLs and never pass through the application. The dashboard is Next.js. It reads Postgres through a role that owns nothing, so every query goes through the policies. Sign-in uses Supabase Auth.
sessclone.com runs this repository. The paid hosted tiers are on a waitlist for now; the site has the details.
In Claude Code:
/plugin marketplace add NotTahaAli/sessclone
/plugin install sessclone@sessclone
Enabling the plugin asks for two things: the deployment URL and an API key from the dashboard under Keys. Then restart Claude Code, because hooks take effect only after a restart. The install guide covers checking that it worked, exporting the settings as environment variables instead, and setting it up in Claude Code cloud environments.
The quickest path is Supabase for the database and sign-in plus Vercel for the
app: create the Supabase project, run node apps/web/scripts/setup-db.mjs once
to migrate it, then press the button above.
Quick start
has the six steps.
You supply a Postgres 16+ cluster, an
S3-compatible bucket (optional; without one, archival is off) and a Supabase
project for sign-in. The self-hosting guide goes from a
clone to the first collected Turn: the database roles, the migrations, a script
that checks your bucket, compose.yaml, and scheduling the retention sweep.
Configuration lists every environment
variable, and .env.example is the same list in copyable form.
Node and pnpm versions are pinned in .nvmrc and in the root package.json.
Dependency versions are pinned in the catalog of pnpm-workspace.yaml, except
for a few that are pinned directly in apps/web/package.json.
pnpm install
pnpm lint # oxlint, type-aware
pnpm typecheck # tsc across every package
pnpm test # vitest, every suite
pnpm test:db # the web project only: routes, schema and policies, against Postgres
pnpm format # prettier --check
pnpm format:write # prettier --write
To run the dashboard locally, copy .env.example to apps/web/.env (Next.js
reads that file, not one at the repo root), fill it in, and run:
pnpm --filter web dev
Route and policy tests run against a real Postgres, with every migration in
supabase/migrations/ applied to an empty database, so you need a Postgres
server you can reach. Create two roles:
sudo -u postgres psql -c "create role sessclone login superuser password 'sessclone'"
sudo -u postgres psql -c "create role sessclone_app login password 'sessclone_app'"
sudo -u postgres createdb sessclone_test --owner sessclone
sessclone owns the tables, applies the migrations and seeds the fixtures. It
is a superuser only because schema.test.ts has to create a probe role and
switch into it, which nothing short of a superuser can do. CI's Postgres
container gives the same role the same privilege. A deployment does not need
this: see supabase/README.md.
Because it owns the tables, sessclone bypasses every policy. sessclone_app
owns nothing, and it is the role the dashboard connects as
(ADR 0007). That makes it the only
connection on which a policy test proves anything.
DATABASE_URL and APP_DATABASE_URL override the defaults,
postgres://sessclone:[email protected]:5432/sessclone_test and
postgres://sessclone_app:[email protected]:5432/sessclone_test.
apps/web/test/harness.ts is the test harness those suites share. It applies
the migrations once per run and empties the database between tests. Its
seedFixture() creates two Orgs with a person in every Role, including one
Manager with a Scope and one without.
The browser flows live in apps/web/e2e/ and run with
pnpm --filter web e2e against a database named sessclone_e2e_test (or the
DATABASE_URL/APP_DATABASE_URL you pass). Install Chromium once with
pnpm --filter web exec playwright install chromium. The run starts
next dev itself, seeds through the database, and signs in without a Supabase
project: apps/web/e2e/global-setup.ts serves the JWKS endpoint the app
verifies against.
| Path | What lives there |
|---|---|
apps/web | The dashboard, the ingest API and the marketing site (Next.js) |
packages/plugin | The Collector, a Claude Code plugin (MIT) |
packages/shared | Transcript parsing, Turn identity and the ingest schema, used by both |
supabase | SQL migrations and the RLS policies |
docs | Install, self-hosting, configuration, ADRs, design notes, findings |
scripts | Repo tooling, including verify-collector.mjs for a Member's machine |
.claude-plugin | The marketplace manifest that /plugin marketplace add reads |
compose.yaml, Dockerfile | Running the app in a container |
.scratch, docs/tickets | The issue tracker and its ticket graph, kept public |
AGENTS.md, CONTEXT.md | Working rules for coding agents, and the domain glossary |
Read CONTRIBUTING.md before you open a pull request. Its
Where to start section lists small tickets
that need no database.
Contributions are accepted under AGPL-3.0-only plus the additional term in
NOTICE.md. Every commit needs a DCO sign-off (git commit -s), and there is
no CLA. Everyone taking part agrees to the
CODE_OF_CONDUCT.md. To get help, see
SUPPORT.md.
Security issues: report them privately as described in
SECURITY.md, not in a public issue.
Copyright (c) 2026 sessclone contributors.
SessClone is licensed under AGPL-3.0-only together with one
additional term under AGPL section 7(b), which is set out in
NOTICE.md. The term: a deployment must keep the panel's
Appropriate Legal Notices visible (the copyright, the no-warranty statement,
the licence and how to read it), along with the SessClone credit shown beside
them. LICENSE is the unmodified licence text. NOTICE.md states the term and
explains what the marketing site's three self-hosting promises mean in
practice. If you run a modified copy as a network service, you must offer its
users the source.
packages/plugin is MIT, under its own
packages/plugin/LICENSE. The Collector runs on each
Member's own machine and gets vendored into other people's setups, where a
copyleft licence would only make it harder to install.