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
34 changes: 17 additions & 17 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; 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. Pro (id team; named Team until 2026-11-12) has a trial: trial_days (3) days free at Checkout, a card taken up front and charged when it ends unless cancelled, once per account (telemetry-worker/src/billing.ts trialFor). 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. Entitlements `problems` (the problem lists, pages, activity and fix prompts on the dashboard and in the genclass command; Free shows only the totals) and `ask` (genclass ask) were added 2026-11-12 (the owner's 'limit free fully'); a plan file without the key gives them.",
"version": 4,
"_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. Pro (id team; named Team until 2026-11-12) has a trial: trial_days (3) days free at Checkout, a card taken up front and charged when it ends unless cancelled, once per account (telemetry-worker/src/billing.ts trialFor). 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. Entitlements `problems` (the problem lists, pages, activity and fix prompts on the dashboard and in the genclass command; Free shows only the totals) and `ask` (genclass ask) were added 2026-11-12 (the owner's 'limit free fully'); a plan file without the key gives them. Version 5 (2026-11-13, the owner's call): Pro is bought for the account again, not per app, and per developer (per_seat: the subscription's quantity is how many developers, the owner included, US$15 each a month); it covers up to 3 apps (limits.apps) whatever the number of developers, the oldest first, and a later app waits on its plan page, where more apps are Enterprise's, by email. A subscription bought per project under version 4 still covers its app. Free covers one app. GenClass's grants cover every app. The genclass command is Pro's (2026-11-13, the owner's 'make the entire CLI paid'): a CLI session without Pro, its trial or a paying team gets 402 from every /api/cli route but the overview and the account; Free is the website's, with the owner's words for its list: one app, a limited dashboard, the open-source basics, and (the owner's 'keep them free') the GitHub App on public repositories, the page check and 100 live fixes a month.",
"version": 5,
"currency": "usd",
"contact": "mehar@genclass.dev",
"grant_plan": "enterprise",
Expand All @@ -10,58 +10,57 @@
{
"id": "free",
"name": "Free",
"summary": "The totals, one suggestion, up to 3 projects.",
"summary": "One app, its totals, and the open-source basics.",
"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, "live_fixes_per_month": 100 },
"limits": { "apps": 1, "history_days": 7, "seats": 1, "live_fixes_per_month": 100 },
"suggestions": { "per_day": 3, "shown": 1 },
"entitlements": { "dashboard": true, "forwarding": false, "export": false, "analytics": false, "custom_model": false, "github_private": false, "problems": false, "ask": false },
"features": [
{ "text": "One app", "available": true },
{ "text": "Dashboard totals, last 7 days", "available": true },
{ "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 totals, 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": "100 live fixes a month, then observe only", "available": true },
{ "text": "GitHub App on public repositories", "available": true },
{ "text": "Page check", "available": true },
{ "text": "Suggestions: your top one", "available": true },
{ "text": "Self-host the collector", "available": true }
]
},
{
"id": "team",
"name": "Pro",
"summary": "Everything for one project, your whole team included.",
"summary": "Everything for up to 3 apps, per developer.",
"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_seat": true,
"trial_days": 3,
"limits": { "apps": null, "history_days": 90, "seats": null, "live_fixes_per_month": null },
"limits": { "apps": 3, "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, "problems": true, "ask": true },
"features": [
{ "text": "Everything in Free", "available": true },
{ "text": "3 days free to start", "available": true },
{ "text": "Up to 3 apps", "available": true },
{ "text": "The genclass command in your terminal", "available": true },
{ "text": "Every problem, its pages and a fix prompt", "available": true },
{ "text": "Ask about your app in plain words", "available": true },
{ "text": "Every suggestion, plus the model's own ideas", "available": true },
{ "text": "Website design ideas from sites like yours", "available": true },
{ "text": "Unlimited live fixes", "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": "GitHub App on private repositories", "available": true },
{ "text": "Unlimited live fixes", "available": true },
{ "text": "Data export and API", "available": true },
{ "text": "90 days of history", "available": true },
{ "text": "Your whole team on the project", "available": true }
],
"per_project": true,
"trial_days": 3
{ "text": "Your team on it, $15 a developer", "available": true }
]
},
{
"id": "enterprise",
Expand All @@ -77,6 +76,7 @@
"entitlements": { "dashboard": true, "forwarding": true, "export": true, "analytics": true, "custom_model": true, "github_private": true, "problems": true, "ask": true },
"features": [
{ "text": "Everything in Pro", "available": true },
{ "text": "More than 3 apps", "available": true },
{ "text": "Your own classifier, trained by us", "available": true },
{ "text": "Our models in our cloud", "available": true },
{ "text": "The coding-agent loop run for your team", "available": true },
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.

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

## 0.3.7

The genclass command comes with Pro:

- **Pro right after the sign-in.** An account without Pro (paid, in its trial, GenClass's grant, or a place in a
paying team) sees Pro's card next, and Enter opens its checkout in the browser: 3 days free, the card asked for on
Stripe, then $15 a developer a month. The command waits for the payment and goes on with what was asked. There is
no Free in the terminal: Free stays on the website (one app and its totals).
- **Every command asks first**, except `login`, `logout`, `whoami`, `plan`, `upgrade`, `profile`, `status`, `remove`,
`help` and `version`. Signed out, the sign-in comes first and Pro right after it. Without a terminal (`--yes`,
`--json`, a coding agent) nothing is opened: one line with the checkout address, and exit code 1. genclass.dev
answers 402 to the command's other routes for an account without Pro, and every command says the same line then.
- **Pro is for the account**, per developer, for up to 3 apps (genclass.dev's plans version 5). Free covers one
app. `plan`, `profile` and `upgrade` show Pro's card and its trial; an app past the 3 says more apps come with
Enterprise, by email.
- **Every new app has its plan page once.** `login`, `connect`, `init` and `apps new` open it once the app is in the
account: Continue with Pro for an account that has it, or what the app needs. The walk has it as its own step,
after the runtime.
- The header shows this folder's app's plan. The note under a dashboard link says what Free shows (the totals) and
what comes with Pro.

## 0.3.6

The paid plan is Pro (it was called Team), with 3 days free:
Expand Down
Loading
Loading