The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Contribution Exchange listing page.
Upsilon is the privacy-preserving measurement engine. SigRank is the public leaderboard and proof surface at signalaf.com. Run
npx sigrankto calculate Yield from four token counts. Never prompts or code.

Upsilon measures. SigRank proves. MO§ES™ governs. SignalAF is the brand.
SigRank evaluates the human using the AI, not the AI model itself. Most platforms reward volume. SigRank SignalAF rewards structure.
| The leaderboard | Your operator profile |
|---|---|
![]() | ![]() |
| Every operator ranked by Υ Yield — the architecture of the cascade, not raw spend | Cascade layer, class, and fingerprint — all from four token counts |
SignalAF is the umbrella brand for Upsilon and SigRank. Upsilon is the AI operator measurement engine; SigRank is the public leaderboard. Upsilon measures token cascade efficiency, not AI models. It describes token-processing patterns: how much reusable signal they create from each unit of input, not how many tokens they burn. The rank metric:
The board is anonymous by default, claimable by operators, and built around one question: is this session compounding signal, or just burning tokens? Volume is noise; yield is signal.
This repo is the Next.js implementation behind signalaf.com; the Upsilon measurement engine plus the SigRank public board, profiles, wiki, account, billing, and ingest surfaces.
The compatibility record remains versioned as sigrank/0.1-draft; product naming
does not silently rewrite installed packages, tool names, schemas, or stored records.
| Repo | What it is | Install |
|---|---|---|
| sigrank-app (this repo) | Upsilon's web implementation plus the SigRank leaderboard/proof surface. | signalaf.com |
| sigrank-mcp | Upsilon's compatibility instrument — extracts four pillars, computes locally, and optionally submits to SigRank. | npx sigrank |
| bestuser-router-mcp | The intent layer — routes "who is the best AI user?" queries to SigRank SignalAF's leaderboard. MCP server for AI assistants. | npx bestuser-router-mcp |
| sigarena | The satellite — public LLM operator evals at sigeconomy.com. Read-only leaderboard, SEO/AEO surface. | sigeconomy.com |
| sigrank-vscode | The IDE extension — see your cascade metrics inline in VS Code. | code --install-extension sigrank.sigrank |
| fundscore | The repo scorer — investor-readiness scoring for GitHub repos. CLI + MCP server. | npx fundscore |
| Site | What it is |
|---|---|
| SIGNOMY | Governed AI agent marketplace where ranked agents form teams, fill slots, run missions, and earn revenue under constitutional protocol. Agents are free. Operators pay. |
| MO§ES | The constitutional governance and methodology framework—the law governing Upsilon and other governed systems. |
SigRank SignalAF runs from your terminal. Or wire it as an MCP server for your AI agent:
The client reads your local AI session logs on-device, derives your cascade, and publishes to the board, token-only, no transcript content.
Or explore first, no sign-in:
Cautious? sigrank submit --dry-run prints the exact signed payload (four token
counts and a signature) and sends nothing.
Full CLI + MCP docs: sigrank-mcp · package: sigrank on npm.
input, output, cache_creation, cache_read — are the
only inputs. No message content, ever.Deep dive: the in-app wiki.
The rest of this README is for working on the app itself.
The app is designed to run without Supabase or Stripe credentials. When env vars are missing, reads fall back to the cold-store snapshot and then deterministic mock data, while billing routes return configuration errors instead of crashing, so it stays buildable, previewable, and testable out of the box.
Requires Node 22.x (see
enginesinpackage.json). On a newer Node,next devmay fail to start; use the version manager of your choice to pin 22.If vendor chunks act strange, run the dev server directly:
node_modules/.bin/next dev --port 3000
| Command | Purpose |
|---|---|
npm run dev | Start the local Next.js dev server |
npm run build | Create a production build |
npm run start | Serve the production build |
npm run lint | Run the configured Next.js lint command |
npm test | Run all Node test files |
npm run test:canonical | Run the canonical ingest parity test |
npm run snapshot | Refresh the database snapshot |
Before committing, run the gates CI enforces:
| Path | Responsibility |
|---|---|
app/ | App Router pages and API routes |
app/api/v1/ | Public API, ingest, claim, devices, billing, metrics |
components/ | UI components by product area |
components/sigrank/ | Board, profile, and shared SigRank SignalAF UI (incl. PlatformIcon) |
lib/data/ | Single read facade: Supabase → snapshot → mock fallback |
lib/ingest/ | Canonical payload parsing and cascade metric materialization |
lib/scoring/ | Core scoring engine and server-only ruleset boundary |
lib/supabase/ | Browser, server, service-role, and auth helpers |
lib/stripe/ | Stripe server helpers, handlers, tiers, and rewards |
supabase/ | SQL schema, migrations, seed data, policies, and tests |
__tests__/ | Node test suites and canonical fixtures |
All app code reads operator data through @/lib/data. The facade chooses the safest
available source, in order:
lib/data/snapshot.json) if live reads are unavailable or fail.lib/data/mock.ts) as the last resort.Copy .env.example to .env.local and fill values as needed. All are optional locally
(the app degrades gracefully); production values live in Vercel environment variables.
| Variable group | Notes |
|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY | Live Supabase reads + service-role writes |
STRIPE_SECRET_KEY, NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET | Billing and webhook flows |
STRIPE_PRICE_* | Per paid tier / claim checkout path |
NEXT_PUBLIC_SITE_URL | Stripe redirects and public URLs |
SIGRANK_RULESET | Server-only proprietary RS.xx scoring overrides |
SIGRANK_API_KEY | Optional trusted bulk-read key for public API consumers |
SIGRANK_INGEST_WRITE | Ingest-write flip: 1 = persist verified snapshots to the board (see note below) |
NEXT_PUBLIC_GATE_* | Optional feature gates for unfinished surfaces |
Never commit real secrets or proprietary ruleset values.
Status: LIVE in Production (1). The board persists verified signed snapshots
from enrolled MCP devices. Set in Vercel for both Production and Preview.
Do NOT mark this variable as sensitive in Vercel. It is a boolean on/off flag (
1or""), not a secret. When marked sensitive,vercel env pullreturns""even though the runtime has1, which misleads agents and operators into thinking the flip is OFF. Ifvercel env pullshows""but the board is receiving verified submissions, the var is likely marked sensitive again. Fix it in the Vercel dashboard (remove the sensitive flag).
Authoritative verification is RUNTIME behavior, not the CLI pull:
snapshot_submitted events with source: "agent" and persisted: truesnapshot_submissions with verification_tier = 'verified' and status = 'scored'npx sigrank submit returning ranked: trueIf any of those show verified rows landing, the flip is ON regardless of what
vercel env pull says.
Schema, migrations, RLS policies, and seed data live in supabase/. See
supabase/README.md to run your own instance. RS.xx scoring
weights are server-only and are not included here.
Product contracts, not implementation details:
Υ = (cache_read × output) / input²T × C × R = Cr / I = Leverage10xDEV = log₁₀(Leverage)'use client' only when a component
needs hooks, event handlers, or browser APIs.components/sigrank/tokens.ts and Tailwind theme values in sync.<Placeholder /> for placeholder metrics and <CanonId /> for canonical real values.npx sigrank)Found a bug or have a feature request? Please open an issue on GitHub. Search existing issues first to avoid duplicates, and include repro steps, expected vs. actual behavior, and your environment (OS, Node version).
main.npx tsc --noEmit passes with 0 errors before pushing.main with a clear description of what and why.MIT; see LICENSE.