Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Default mode is `observe` (report only); `guard` is opt-in; `heal` is experiment
| `bench/stall/` | `request-stalled` on the demos (`run.ts`, local, headless Chromium): false reports on clean and chaos trials, recall on planted 60 s hangs; numbers in RESULTS.md section 23 |
| `bench/late-load/` | the lite install's cost (`run.mjs`, train VM, headless Chromium; README "Lite install"): the Angular starter built without GenClass, with the first-line import and with the late loader (a dynamic import, or the script tag), each visited at 4× CPU throttling: load metrics, long tasks, script time, download and what the runtime saw; numbers in RESULTS.md section 28 |
| `compat/`, `templates/` | framework compatibility matrix (`RESULTS.md`) and starter templates (react-vite, nextjs, vue-vite, sveltekit, astro, nuxt, react-router, angular; `compat/templates-check.mjs` builds and boots them in Chromium against the packed runtime, module and integration); evaluation only |
| `telemetry-worker/` | the diagnostics collector with the dashboards, accounts, plans (`billing/plans.json`: Free, Team per app, Enterprise; `src/plans.ts`) and teams (`src/team.ts`) (Cloudflare Worker), and the GitHub App, genclass-dev[bot], in `src/github/` (webhook, reviews of pull requests from the race files their test runs upload, `@genclass` commands, the link between a repository and an app; off until its secrets are set; `github-app.manifest.json` is the app's permissions and events; tests `test/github*.test.ts` against a fake GitHub; `docs/github-app/`; rule 10). genclass.dev itself (the site, its admin and the pitch deck) and the page check (`scan-worker/`) live in the private repo genclass-dev/genclass-site, which has this repo as its `lib/` submodule |
| `telemetry-worker/` | the diagnostics collector with the dashboards, accounts, plans (`billing/plans.json`: Free, Team per project, Enterprise; `src/plans.ts`) and teams (`src/team.ts`) (Cloudflare Worker), and the GitHub App, genclass-dev[bot], in `src/github/` (webhook, reviews of pull requests from the race files their test runs upload, `@genclass` commands, the link between a repository and an app; off until its secrets are set; `github-app.manifest.json` is the app's permissions and events; tests `test/github*.test.ts` against a fake GitHub; `docs/github-app/`; rule 10). genclass.dev itself (the site, its admin and the pitch deck) and the page check (`scan-worker/`) live in the private repo genclass-dev/genclass-site, which has this repo as its `lib/` submodule |
| `research/` | earlier Jev research: extension, `jev_local` (Python encoder the training scripts import), benchmarks |
| `docs/adoption/` | listing drafts for directories and registries (`listings/mcp.md`): steps, fields and entries, nothing submitted |
| `docs/github-app/` | the GitHub App: `README.md` (users: setup, what the lines mean, commands, settings, what it reads and keeps), `SETUP.md` (the owner: registering it with `scripts/github-app-setup.mjs`, secrets, the migration, first run), `DESIGN.md` (why it is built this way, threats, what is not built), `workflows/` (two files users copy); the Marketplace listing draft is `docs/adoption/listings/github-marketplace.md` |
Expand Down
4 changes: 2 additions & 2 deletions PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,11 @@ and invite links.

## Paid plans, payments and Stripe

Free costs nothing, Team is sold on genclass.dev per app (since 12 November 2026; per developer from 11 November), and Enterprise is agreed by
Free costs nothing, Team is sold on genclass.dev per project (since 12 November 2026; per developer from 11 November), and Enterprise is agreed by
email. A plan decides what your dashboard shows, never what is collected: an app that turned visitor analytics on has
them counted on Free too, and they show once its plan includes them. A paid plan (Team; the Individual plan was one
until 22 October 2026) is paid through Stripe, which processes payments
for us. We keep the number of apps your subscription pays for, next to its status. When you upgrade, we send Stripe
for us. We keep which app a subscription pays for (or, for a plan bought per developer, the number of seats), next to its status. When you choose Free for an app, we keep when, the reason you picked and anything you wrote (at most 500 characters), and we read them to improve our plans. When you upgrade, we send Stripe
your account's email (if it has one) and your GenClass account id, and you type your card or other payment details
into Stripe's own checkout page: they go to Stripe and never reach GenClass. Stripe handles them under its own privacy
policy (stripe.com/privacy) and keeps your invoices and receipts, which you can see under Manage billing on your
Expand Down
25 changes: 14 additions & 11 deletions billing/plans.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"_about": "The one place GenClass plans are defined. telemetry-worker/src/plans.ts imports this file (limits, entitlements, Stripe lookup keys, the billing page) and genclass.dev's site reads it (the pricing page). Three plans since version 3 (2026-11-11): Free, Team and Enterprise. Free is what finds, shows and fixes the problems: the open-source runtime with every mode and its on-device model, the coding-agent loop on the developer's machine, the dashboard's problems for one person (3 apps, the last 7 days shown) and genclass-dev[bot] on public repositories. Team is sold per app since 2026-11-12 (per_app true: the Stripe subscription's quantity is the number of apps the plan covers, and it holds as many members as the owner invites; telemetry-worker/src/plans.ts appsOf; per_seat true would sell it per person instead, the quantity then being the seats, telemetry-worker/src/team.ts) and adds what a team uses: genclass-dev[bot] on private repositories, visitor analytics, forwarding, export, 90 days of history and members. Enterprise is agreed by email: a null monthly price means the plan is not sold on the site, and an account gets it from GenClass's own grant (accounts.comp_until, set by hand to the end of the agreement; accounts.comp_plan names the plan granted, grant_plan when it is empty). The classifier a person from GenClass trains is in Enterprise only. retired_plans lists the plan ids GenClass sold before (Pro and Custom until 2026-10-19, Individual until 2026-10-22): their Stripe products and prices stay GenClass's own, so a subscription to one is still cancelled with its account, opens Manage billing and is reported to the owner while it bills, but it gives no plan (it reads as Free). The worker's Stripe code and scripts/stripe-setup.mjs sell any plan given a monthly price above 0, its stripe_lookup_keys and a stripe_tax_code. Prices are US cents (per seat for a per_seat plan, per app for a per_app plan); a null yearly price means no yearly option. limits.apps null means no plan limit (for a per_app plan the apps paid for are the limit) (the worker still caps an account at 200 apps against abuse); limits.seats is how many people a plan that is not per_seat holds (null: no limit); limits.history_days is what the dashboard shows, and data is never deleted before 90 days whatever the plan, so the longer history is there the moment an account upgrades. Ingest never depends on the plan: an app's visitor analytics are counted while its plan leaves them out, and shown once it includes them. There is no trial. Feature lines with available false are shown as coming next. The entitlement github_private is what lets genclass-dev[bot], the GitHub App, review an account's private repositories (telemetry-worker/src/github/entitlement.ts); public repositories are reviewed for everyone, whatever this file says. A self-hosted collector sets PLAN_GATES = \"open\" and gives every account the grant plan. managed_payments true would sell a plan through Stripe Managed Payments (only for fully automated digital products; telemetry-worker/README.md, Paid plans). `suggestions` (2026-11-12): what `genclass suggest` gives a plan (telemetry-worker/src/suggest.ts): `per_day`, model runs an account has a day, and `shown`, how many items of the plan it is shown (null: all); the measured checks themselves are free for everyone.",
"version": 3,
"_about": "The one place GenClass plans are defined. telemetry-worker/src/plans.ts imports this file (limits, entitlements, Stripe lookup keys, the billing page) and genclass.dev's site reads it (the pricing page). Three plans since version 3 (2026-11-11): Free, Team and Enterprise; since version 4 (2026-11-12) a plan belongs to a project, not to an account. Free is what finds, shows and fixes the problems: the open-source runtime with every mode and its on-device model, the coding-agent loop on the developer's machine, the dashboard's problems for an account's first 3 projects (the last 7 days shown; a 4th project on Free is locked until it has a plan), and 100 problems fixed live a month per project (limits.live_fixes_per_month; past it the runtime is told to observe only until the month ends) and genclass-dev[bot] on public repositories. Team is sold per project (per_project true: one Stripe subscription of quantity 1 per project, its metadata naming the project; everyone on the account's team sees it; telemetry-worker/src/stripe.ts) and adds what a team uses: genclass-dev[bot] on private repositories, visitor analytics, forwarding, export, 90 days of history and members. Enterprise is agreed by email: a null monthly price means the plan is not sold on the site, and an account gets it from GenClass's own grant (accounts.comp_until, set by hand to the end of the agreement; accounts.comp_plan names the plan granted, grant_plan when it is empty). The classifier a person from GenClass trains is in Enterprise only. retired_plans lists the plan ids GenClass sold before (Pro and Custom until 2026-10-19, Individual until 2026-10-22): their Stripe products and prices stay GenClass's own, so a subscription to one is still cancelled with its account, opens Manage billing and is reported to the owner while it bills, but it gives no plan (it reads as Free). The worker's Stripe code and scripts/stripe-setup.mjs sell any plan given a monthly price above 0, its stripe_lookup_keys and a stripe_tax_code. Prices are US cents (per project for a per_project plan, per seat for a per_seat plan); a null yearly price means no yearly option. limits.apps null means no plan limit (the worker still caps an account at 200 apps against abuse); limits.seats is how many people a plan that is not per_seat holds (null: no limit); limits.history_days is what the dashboard shows, and data is never deleted before 90 days whatever the plan, so the longer history is there the moment an account upgrades. Ingest never depends on the plan: an app's visitor analytics are counted while its plan leaves them out, and shown once it includes them. There is no trial. Feature lines with available false are shown as coming next. The entitlement github_private is what lets genclass-dev[bot], the GitHub App, review an account's private repositories (telemetry-worker/src/github/entitlement.ts); public repositories are reviewed for everyone, whatever this file says. A self-hosted collector sets PLAN_GATES = \"open\" and gives every account the grant plan. managed_payments true would sell a plan through Stripe Managed Payments (only for fully automated digital products; telemetry-worker/README.md, Paid plans). `suggestions` (2026-11-12): what `genclass suggest` gives a plan (telemetry-worker/src/suggest.ts): `per_day`, model runs an account has a day, and `shown`, how many items of the plan it is shown (null: all); the measured checks themselves are free for everyone.",
"version": 4,
"currency": "usd",
"contact": "mehar@genclass.dev",
"grant_plan": "enterprise",
Expand All @@ -10,20 +10,22 @@
{
"id": "free",
"name": "Free",
"summary": "Find, see and fix the problems. For one person.",
"summary": "Find, see and fix the problems. Up to 3 projects.",
"price_usd_cents": { "monthly": 0, "yearly": null },
"stripe_lookup_keys": { "monthly": null, "yearly": null },
"stripe_tax_code": null,
"managed_payments": false,
"per_seat": false,
"limits": { "apps": 3, "history_days": 7, "seats": 1 },
"limits": { "apps": 3, "history_days": 7, "seats": 1, "live_fixes_per_month": 100 },
"suggestions": { "per_day": 3, "shown": 3 },
"entitlements": { "dashboard": true, "forwarding": false, "export": false, "analytics": false, "custom_model": false, "github_private": false },
"features": [
{ "text": "Open-source runtime, every mode", "available": true },
{ "text": "On-device model", "available": true },
{ "text": "Coding-agent loop on your machine (@genclass/mcp)", "available": true },
{ "text": "Dashboard: the problems found, 3 apps, last 7 days", "available": true },
{ "text": "Dashboard: the problems found, last 7 days", "available": true },
{ "text": "Up to 3 projects", "available": true },
{ "text": "100 live fixes a month per project, then observe only", "available": true },
{ "text": "GitHub App on public repositories", "available": true },
{ "text": "Page check", "available": true },
{ "text": "Suggestions: your top 3 next steps", "available": true },
Expand All @@ -33,26 +35,27 @@
{
"id": "team",
"name": "Team",
"summary": "Everything a team needs, per app.",
"summary": "Everything for one project, your whole team included.",
"price_usd_cents": { "monthly": 1500, "yearly": null },
"stripe_lookup_keys": { "monthly": "genclass_team_monthly", "yearly": null },
"stripe_tax_code": "txcd_10103001",
"managed_payments": false,
"per_seat": false,
"per_app": true,
"limits": { "apps": null, "history_days": 90, "seats": null },
"limits": { "apps": null, "history_days": 90, "seats": null, "live_fixes_per_month": null },
"suggestions": { "per_day": 30, "shown": null },
"entitlements": { "dashboard": true, "forwarding": true, "export": true, "analytics": true, "custom_model": false, "github_private": true },
"features": [
{ "text": "Everything in Free", "available": true },
{ "text": "Unlimited live fixes", "available": true },
{ "text": "Every suggestion, with a prompt for your agent", "available": true },
{ "text": "GitHub App on private repositories", "available": true },
{ "text": "Visitor analytics", "available": true },
{ "text": "Alerts to Sentry, PostHog, Datadog, Slack or a webhook", "available": true },
{ "text": "Data export and API", "available": true },
{ "text": "90 days of history", "available": true },
{ "text": "Unlimited team members", "available": true }
]
{ "text": "Your whole team on the project", "available": true }
],
"per_project": true
},
{
"id": "enterprise",
Expand All @@ -63,7 +66,7 @@
"stripe_tax_code": null,
"managed_payments": false,
"per_seat": false,
"limits": { "apps": null, "history_days": 365, "seats": null },
"limits": { "apps": null, "history_days": 365, "seats": null, "live_fixes_per_month": null },
"suggestions": { "per_day": 100, "shown": null },
"entitlements": { "dashboard": true, "forwarding": true, "export": true, "analytics": true, "custom_model": true, "github_private": true },
"features": [
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions packages/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
# Changelog

## 0.3.5

For onboarding paying customers:

- **Every app chooses its plan on a page.** Once the app is in the account, the setup opens the app's plan page in
the browser: Team large, with its price and a Start button, and a very small "Try for free (limited)" under it.
Free asks what is stopping them from paying first. The terminal shows the same card and waits for the choice made
there; the setup goes on only once the app has its plan. Plans are per
app now: Team is $15 a project a month with the whole team on it, Free covers 3 apps and 100 problems fixed live a
month per app. A fourth app has only Team. Before, the plan was a card in the terminal only, and a setup run
without a keyboard (`--yes`, a coding agent) chose Free without showing anything.
- **`genclass` alone works.** A run through `npx genclass` on a terminal installs the command (`npm install -g
genclass`) and says so; `npm uninstall -g genclass` takes it out, `GENCLASS_NO_INSTALL=1` turns it off.
- **Numbered choices.** The home lists its commands with numbers (type 3 for analytics), and "Which app?" is a
numbered list instead of commands to retype.
- **`genclass profile`**: who is signed in, each app's plan, and numbered choices to upgrade, open billing or sign
out. **`genclass upgrade`** opens the plan page of this folder's app (`--app` for another).
- On Free, every command ends with one line: the limits and the way up (`genclass upgrade`).
- **`genclass suggest` hands the whole list to your coding agent**: after the list, one number starts Claude Code,
Codex, Cursor or Gemini CLI in the folder with every item, or copies or prints the prompt.
- `genclass dashboard` shows the live fixes used this month, and says when an app on Free has used them all and
GenClass only observes until the month ends.
- `genclass apps new` says when the new app needs a plan of its own, with its plan page.

## 0.3.4

From a review of every setup path after a teammate hit the 0.3.2 bug:
Expand Down
Loading
Loading