Skip to main content
Ledger · rules engine

It's not AI.
It's a rules engine with a name.

Ledger reads your project data, runs a small set of deterministic rules, and surfaces the patterns you'd otherwise have to notice yourself. Same inputs, same output. Every time. No language model, no inference, no training.

Read the docs →Join waitlist
Is Ledger AI?

No. Same category as a linter, a spell-checker, or a fraud-check rule.

When most people hear "AI" they picture a language model — something trained on a lot of data, producing text that's sometimes right and sometimes made up. Ledger is none of that. It's a fixed set of rules running against your own Supabase data. If a flag fires, you can trace exactly which rule matched and which rows triggered it.

Ledger has exactly six flags. Each one is a deterministic rule. They don't change without a product release, and the inputs to each rule are recorded so you can check why it fired.

01stuck

The issue has been in its current status longer than the org-wide threshold (default: 7 days).

reads: issues.status_id + status_changed_at
02forgotten_close

A linked PR was merged, but the issue is still open.

reads: github_prs.merged_at + issues.closed_at
03regression_risk

The issue was closed, then reopened within the last 30 days.

reads: activity_log (closed → reopened transitions)
04live_bug

The issue is typed bug and its linked Sentry error is still unresolved.

reads: issues.type + sentry_errors.status
05design_drift

A linked Figma frame was modified after the most recent dev activity on the issue.

reads: figma_embeds.last_modified + latest dev activity_log entry
06unassigned_hot

The issue is priority critical or high, has no assignees, and is older than 24h.

reads: issues.priority + assignees + created_at

The summary panel has one layout, but emphasis differs by the issue's state. Ledger picks one of these five templates per build. The chosen template is printed in the panel footer so you can always see which shape was used.

  1. 01closedRetrospective — what shipped, when, which PR/deploy carried it.
  2. 02unassigned_hotPriority and age on top; Sentry evidence inline if present.
  3. 03stuckLeads with the blocker and pulls recent open questions.
  4. 04in_reviewPR state, latest assignee comment, who the review is waiting on.
  5. 05normalNeutral state snapshot.

Only your own Supabase database. Every table below lives inside your org boundary — nothing is sent to a third-party service, and nothing is cached in a shared layer.

issuesTitle, type, priority, statuses, timestamps.
activity_logThe most recent 20 events for the issue.
messagesThe most recent 20 non-deleted comments.
github_prsState, review state, merged status of linked PRs.
figma_embedsFrame name and last-modified timestamp.
sentry_errorsStatus and event count of linked errors.
vercel_deploymentsState, target, commit SHA.
org_ledger_settingsYour org's thresholds (stuck days, unassigned hours).

Four claims about Ledger that hold under scrutiny, enforced in code rather than in policy.

Ledger never uses a language model.

No LLM, no embeddings, no prompt, no provider call. The engine is deterministic rules in code — the summary codepath has no AI-provider SDK imports.

Your data never leaves your database for a third-party AI service.

Zero egress to any third-party model provider from anything Ledger does. The inputs and outputs live inside your own Supabase instance.

Your data is never used to train anything.

No model is being trained — globally or per-org. The closest Ledger comes to "learning" is per-org threshold auto-tuning, and that data never leaves your org.

Derived data has a retention window.

The inputs used to build older summaries are deleted after 30 days. The summary's conclusions (flags, template, body) are kept for historical context.

Boring. Deterministic.
Visible. Private.

If you've been burned by AI features that promised magic and delivered surprises, Ledger is the opposite of that by design.

How Ledger works →Join waitlist