{"id":50450645,"url":"https://github.com/outsourc-e/rc-operator-signals","last_synced_at":"2026-06-01T00:01:26.872Z","repository":{"id":353020700,"uuid":"1217618636","full_name":"outsourc-e/rc-operator-signals","owner":"outsourc-e","description":"Deterministic operator signals on top of RevenueCat's Charts API. Built by Aurora (autonomous AI agent) in 48h.","archived":false,"fork":false,"pushed_at":"2026-05-23T08:25:11.000Z","size":10763,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T10:30:51.363Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://rc-operator-signals.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/outsourc-e.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-22T04:06:27.000Z","updated_at":"2026-05-23T08:25:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/outsourc-e/rc-operator-signals","commit_stats":null,"previous_names":["outsourc-e/rc-operator-signals"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/outsourc-e/rc-operator-signals","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outsourc-e%2Frc-operator-signals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outsourc-e%2Frc-operator-signals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outsourc-e%2Frc-operator-signals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outsourc-e%2Frc-operator-signals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outsourc-e","download_url":"https://codeload.github.com/outsourc-e/rc-operator-signals/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outsourc-e%2Frc-operator-signals/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33753925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-01T00:01:14.535Z","updated_at":"2026-06-01T00:01:26.861Z","avatar_url":"https://github.com/outsourc-e.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# RC Operator Signals\n\n**Dashboards show what moved. We show what deserves attention.**\n\nAn opinionated signal engine on top of RevenueCat's Charts API.\nDashboard, CLI, TypeScript SDK, and MCP server — all four in one monorepo.\n\n### 🚀 [Try the live demo → rc-operator-signals.vercel.app](https://rc-operator-signals.vercel.app)\n\n### 🎥 [Watch the 90-second demo → youtu.be/2KRqo-qweX0](https://youtu.be/2KRqo-qweX0)\n\nPulls live Dark Noise data from the Charts API. Auto-refreshes daily via GitHub Actions.\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/outsourc-e/rc-operator-signals)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Built by agent](https://img.shields.io/badge/Built%20by-AI%20agent-EE5A60)](#agent-disclosure)\n\n\u003c/div\u003e\n\n![Home dashboard](docs/screenshots/home.png)\n\n## Why this exists\n\nSubscription operators don't need another dashboard. They need to know **which number deserves their attention this week**.\n\nRevenueCat's Charts API gives you the data. This project turns it into:\n\n- 🎯 **Operator signals** — 10+ deterministic rules that flag contradictions, leading indicators, and caveats\n- ✨ **AI briefs** — pre-written, grounded narratives on every page\n- 💬 **Embedded chat** — ask questions about your numbers, get data-backed answers\n- 📋 **Exportable reports** — Slack, Markdown, or `.md` file in one click\n- 🔌 **MCP server** — drop into Claude Desktop, Cursor, or Cline\n\n## What's in the box\n\n| Artifact | Package | Purpose |\n|---|---|---|\n| 📊 **Dashboard** | `apps/dashboard` | 9-page Vite app with AI briefs, chat widget, signal engine UI |\n| 🖥️ **CLI** | [`@outsourc-e/rc-brief`](apps/cli) | `npx @outsourc-e/rc-brief --demo` → operator brief in markdown |\n| 📦 **SDK** | [`@outsourc-e/revenuecat-charts`](packages/charts-sdk) | Typed, rate-aware Charts API v2 client |\n| 🔌 **MCP Server** | [`@outsourc-e/revenuecat-mcp`](packages/charts-mcp) | 5 tools for any MCP-compatible agent |\n| 🧠 **Signal Engine** | `core/signals` | Deterministic anomaly detection (10+ rules) |\n\n## Quick start\n\n```bash\ngit clone https://github.com/outsourc-e/rc-operator-signals\ncd rc-operator-signals\npnpm install\npnpm build\npnpm --filter dashboard dev\n# → http://localhost:5180\n```\n\nNo API keys. No environment variables. The dashboard ships with pre-generated briefs baked into the repo.\n\n## Screenshots\n\n### Home — Welcome card, hero chart, KPIs, top signals\n\n![Home](docs/screenshots/home.png)\n\n### MRR page — Deep dive with AI brief, trend chart, and movement waterfall\n\n![MRR](docs/screenshots/mrr.png)\n\n### Signals — Filterable triage list, severity-sorted, with evidence and next actions\n\n![Signals](docs/screenshots/signals.png)\n\n### AI Brief — TL;DR narrative, signal table, Slack/Markdown export\n\n![Brief](docs/screenshots/brief.png)\n\n### Integrations — MCP, SDK, CLI, and Web Dashboard code snippets\n\n![Integrations](docs/screenshots/integrations.png)\n\n## Use the SDK\n\n```ts\nimport { RevenueCatCharts } from '@outsourc-e/revenuecat-charts';\n\nconst rc = new RevenueCatCharts({ apiKey: process.env.RC_API_KEY! });\nconst overview = await rc.overview();\nconst revenue = await rc.charts.revenue({ resolution: 'day' });\n```\n\n[→ Full SDK docs](packages/charts-sdk/README.md)\n\n## Use the CLI\n\n```bash\n# Demo mode with Dark Noise fixtures\npnpm --filter @outsourc-e/rc-brief start -- --demo --period 28d\n\n# With your own key\npnpm --filter @outsourc-e/rc-brief start -- --key \"$RC_API_KEY\" --period 7d\n\n# Output JSON\npnpm --filter @outsourc-e/rc-brief start -- --demo --json\n```\n\n[→ Full CLI docs](apps/cli/README.md)\n\n## Use the MCP server in Claude Desktop\n\n```bash\npnpm --filter @outsourc-e/revenuecat-mcp build\n```\n\nAdd to your Claude Desktop config:\n\n```json\n{\n  \"mcpServers\": {\n    \"revenuecat\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@outsourc-e/revenuecat-mcp\"],\n      \"env\": {\n        \"RC_API_KEY\": \"sk_...\"\n      }\n    }\n  }\n}\n```\n\nThen ask Claude:\n\n- \"What's my MRR this month?\"\n- \"Any churn anomalies?\"\n- \"Give me a weekly operator brief\"\n\n[→ Full MCP docs](packages/charts-mcp/README.md)\n\n## How the signal engine works\n\nThe engine consumes one month of chart data and fires structured signals with severity, evidence, and recommended followups. Every fact is grounded in the raw numbers — the AI narration layer is optional and never invents insights.\n\n```\ncore/fixtures        →  Dark Noise sample data (5 charts, 90 days)\n       ↓\ncore/signals         →  deterministic rules (10+ patterns)\n       ↓\nsrc/data/*.json      →  pre-baked briefs + dashboard state (committed)\n       ↓\napps/dashboard       →  reads JSON, zero runtime LLM, no keys\napps/cli             →  markdown brief with deterministic narrative\npackages/charts-sdk  →  programmatic access to Charts API\npackages/charts-mcp  →  agent-native access via MCP protocol\n```\n\n### Signal categories\n\n| Category | What it flags |\n|---|---|\n| **Contradictions** | Revenue up while MRR flat → non-recurring mix inflating cash |\n| **Leading indicators** | Trial velocity +16% → future MRR lift if conversion holds |\n| **Caveats** | Incomplete current period, refund exposure, non-subscription revenue |\n\n## Refreshing the data\n\nThe dashboard reads from committed JSON files — zero runtime API calls, zero runtime keys.\n\n### Locally (against fixtures)\n```bash\npnpm --filter dashboard prerender\n```\n\n### Locally (against live Charts API)\n```bash\nRC_API_KEY=sk_... pnpm --filter dashboard prerender\n```\n\n### In production (automatic)\n\n`.github/workflows/daily-brief.yml` runs every day at **06:00 UTC**, pulls a fresh 28-day window from the Charts API, regenerates the JSON, commits, and Vercel redeploys. The `RC_API_KEY` is stored only as a GitHub repository secret — never in code, never in the browser, never in the Vercel environment.\n\nFork behavior: without `RC_API_KEY`, the Action falls back to committed fixtures so clones stay functional.\n\n## Workspace layout\n\n```\napps/\n├── dashboard/        # Vite + React SPA\n└── cli/              # @outsourc-e/rc-brief\npackages/\n├── charts-sdk/       # @outsourc-e/revenuecat-charts\n└── charts-mcp/       # @outsourc-e/revenuecat-mcp\ncore/\n├── signals/          # Rule engine\n└── fixtures/         # Sample Dark Noise data\ndocs/\n└── screenshots/      # Product screenshots\n```\n\n## Tech stack\n\n- TypeScript end-to-end\n- React 18 + Vite 6 + Recharts for the dashboard\n- React Router 6 for client routing\n- Lucide icons, Inter + JetBrains Mono\n- pnpm workspaces\n- tsup for package builds\n- vitest for tests\n\n## Agent disclosure\n\nThis project was built by **Aurora**, an autonomous AI agent, as a take-home for the Agentic AI Advocate role at RevenueCat. Full agent disclosure on every page of the dashboard.\n\nThe agent shipped all four deliverable options the take-home listed, plus an MCP server as a bonus, inside 48 hours. Process log lives in [`PROGRESS.md`](PROGRESS.md).\n\n## License\n\nMIT. Use it, fork it, ship it.\n\u003c!-- deploy-trigger: 2026-04-23T15:58:02.149104Z --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutsourc-e%2Frc-operator-signals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutsourc-e%2Frc-operator-signals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutsourc-e%2Frc-operator-signals/lists"}