Skip to content

Plans per project with a paywall page, live-fix limit on Free, and genclass 0.3.5 (numbered menus, profile/upgrade, Free upsell, suggestions to your agent) - #224

Merged
MeharPro merged 10 commits into
mainfrom
feat/per-project-plans
Nov 12, 2026
Merged

MeharPro merged 10 commits into
mainfrom
feat/per-project-plans

Conversation

@MeharPro

Copy link
Copy Markdown
Contributor

Owner requests, 2026-11-12: plans per project ($15 a project a month, 3 free projects, grants on every project they have), a page that opens to choose the plan for the project (Team big, a very small "Try for free (limited)"), usage limits on live fixes that put GenClass on observe, and for onboarding: genclass works as a command, numbered choices, a profile command to upgrade, a Free notice after every command, and the whole suggest list handed to Claude/Codex/Cursor.

Collector (telemetry-worker)

  • billing/plans.json v4: Team is per project (per_project, $15 / project / month, whole team included); Free covers 3 projects and 100 live fixes a month per project (limits.live_fixes_per_month).
  • Migration 0016_project_plans.sql: plan, subscription and grant columns on projects, plan_chosen; account grants copied onto their projects. Apply before deploying: npx --yes wrangler@4 d1 migrations apply genclass-dashboard --remote.
  • Checkout per project (metadata genclass_project), webhook applyProjectSubscription; account subscriptions from before keep covering every app.
  • GET /account/billing?project=<id>: "Choose a plan for ", Team large with a big Start button, "Try for free (limited)" very small (none for a 4th app). POST /api/billing/projects/<id>/free records the choice. New apps made on the website go to this page first; ?plan=team opens the first app on Free.
  • Live fixes: counted from the daily counters; past the limit ingest's reply carries x-genclass-observe: live-fix-limit (the runtime side is a separate branch, pending the first-load budget OK). Dashboard stats and /api/cli/app carry usage, plan, plan_url.
  • /api/cli/overview: each app's plan, needs_plan, plan_chosen, plan_url; the offer is per project.
  • Strict type fix in the GitHub connect retry from GitHub connect tries a failed step once more and names the step that failed #216 (clientId ?? "").

genclass 0.3.5 (packages/cli)

  • The plan step runs after the app is in the account and opens that app's plan page; the terminal shows Team's card and waits for the choice (payment, or Free chosen on the page). Without a terminal it opens the page and leaves the step open instead of picking Free silently.
  • genclass installs itself on a terminal run through npx (npm install -g genclass, said on screen; GENCLASS_NO_INSTALL=1 turns it off).
  • Numbered home menu (type a number) and a numbered "Which app?".
  • genclass profile (account, each app's plan, numbered: upgrade, billing, sign out) and genclass upgrade.
  • On Free, one line after every command: the limits and genclass upgrade.
  • genclass suggest ends with numbered choices to start Claude Code / Codex / Cursor / Gemini with the whole list, or copy/print it.
  • dashboard shows live fixes this month and an "Observing only" banner past the limit.

Tests

  • telemetry-worker: 784 pass; strict tsc clean.
  • packages/cli: 184 pass (build 0.3.5).
  • packages/runtime install + readme: 157 pass.
  • Checked the plan page and the free choice by hand on a local collector (test account, Stripe test key).

Not done here: deploying (migration, then the worker), publishing 0.3.5, the runtime observe switch (separate branch, needs the ~0.3 KB first-load OK), site /pricing copy.

🤖 Generated with Claude Code

MeharPro and others added 5 commits November 12, 2026 16:46
…ects), and 100 live fixes a month on Free, then observe only

billing/plans.json version 4. Each app has its own plan: a per-project Stripe subscription (quantity 1, its metadata
naming the project) is written to that project by the webhook, which never cancels or refunds another project's
subscription; a second live one for the same project is reported to the owner. Free covers an account's first 3
projects; a fourth is created and locked until it has a plan. An account subscription from before keeps covering
every app; GenClass's Team grants are copied to every existing app (migration 0016), other grants stay account-wide.
Forwarding, export and funnels follow the project's plan. A paid project cannot be deleted while it bills.
Ingest's reply carries x-genclass-observe once a project on Free has fixed 100 problems live this month (read from
the daily counters); stats carry the usage and the project's plan page. New page /account/billing?project=<id>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, Try for free small), Free chosen there is recorded, new web apps go to it first

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ter each command, the whole suggest list to a coding agent, and the command installs itself

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pe fix in the GitHub connect retry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s room

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@genclass-dev

genclass-dev Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

GenClass runtime review

2 findings in this pull request's tests at fb885c3 · 2 reproducible · 5 tests read

# Status Finding Test Seen
1 Still flagged Witness, overwrote-newer · GET /api/search [chromium] search.spec.ts > search > buggy page: results of the last query 2 of 2 seeds, reproducible
2 Still flagged Witness, overwrote-newer · GET /api/search search.spec.ts > search > buggy page: results of the last query 5 of 5 seeds, reproducible

Reply @genclass-dev replay 1 for the steps to reproduce a finding, or @genclass-dev fix 1 for a brief a coding agent can work from.

The race report, test by test

Race report

2 signatures in 2 tests, 2 reproducible (flagged in 2 or more seeds of the same test) · 19 files read · mode observe

signatures reproducible
Duplicate submits 0 0
Stale responses 0 0
Failing endpoints 0 0
Other detections 0 0
Witnesses (facts measured without the model) 2 2
[chromium] search.spec.ts > search > buggy page: results of the last query

2 seeds (1, 2) · 1 signature · chaos: latency 0–600 ms, reorder

Witnesses (facts measured without the model)

  • Reproducible: 2 of 2 seeds (1, 2) · GET /api/search · witness:overwrote-newer

    The response of GET /api/search#​1 wrote search.results over what newer GET /api/search#​2, started 0.09s after GET /api/search#​1, had written (2 items ["re one", "re two"] → 2 items ["r one", "r two"]).

search.spec.ts > search > buggy page: results of the last query

5 seeds (1, 2, 3, 4, 5) · 1 signature · chaos: latency 0–600 ms, reorder

Witnesses (facts measured without the model)

  • Reproducible: 5 of 5 seeds (1, 2, 3, 4, 5) · GET /api/search · witness:overwrote-newer

    The response of GET /api/search#​1 wrote search.results over what newer GET /api/search#​4, started 0.25s after GET /api/search#​1, had written (2 items ["reac one", "reac two"] → 2 items ["r one", "r two"]).

3 tests with nothing flagged
  • [chromium] search.spec.ts > search > fixed page: results of the last query (2 seeds: 1, 2)
  • search.spec.ts > search > fixed page: results of the last query (5 seeds: 1, 2, 3, 4, 5)
  • search.spec.ts > search > latency only > buggy page, latency only: results of the last query (5 seeds: 1, 2, 3, 4, 5)

Lines under "Witnesses (facts measured without the model)" are happens-before facts the runtime measured in the page without the model, one per signature (witness kind, operation): overwrote-newer, a response wrote a field over what a newer request or the user had written since the request started; identical-in-flight, two identical requests in flight together from separate user actions. They carry no confidence: a fact is listed when it happened. Reproducible: seen in 2 or more seeds of the same test. Whether a fact is a bug is for you to decide (some overwrites are intended; many are repaired a moment later).


genclass-dev[bot] read 19 race files from the artifacts genclass-races-unmodified, genclass-races of this pull request's workflow run, never your source code. What the lines mean · Setup and settings · reply @genclass-dev help

MeharPro and others added 5 commits November 12, 2026 16:59
…m paying (kept, sent to the owner); no back-to-terminal text; the website opens an unchosen app's plan page first

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iption per app (the owner's choice, 2026-11-12); #225's promotion codes, dashboard frame and team wording kept, its account-wide app quantity left out; #223's Stripe fix kept

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MeharPro

Copy link
Copy Markdown
Contributor Author

Merged main in (#223 and #225). The owner chose this PR's billing model (each app its own Team subscription, its own plan page, Free's 100 live fixes, the reason popup) over #225's account-wide app quantity. Kept from #225: the "Add promotion code" field at Checkout, the larger dashboard with the menu always open, the team wording ("members come with Team"). Left out: per_app, appsOf, withinPaidApps, the Apps box on the billing page and the quantity default. Kept from #223: the Stripe fix for accounts that already have a customer. An account-level Team subscription bought under #225 (none so far) still covers every app of its account (accountWide).

Since the first push: the plan page's "Try for free (limited)" is a small link that opens "What's stopping you from paying?" (a reason is required; kept in plan_feedback, migration 0017, applied); no "go back to your terminal" text; the website sends an own app on Free with no choice to its plan page; the CLI setup stops until the app has its plan; coloured hints say genclass once installed.

Tests: telemetry-worker 786, packages/cli 184, runtime install + readme 157, strict tsc clean.

🤖 Generated with Claude Code

@MeharPro
MeharPro merged commit e4f2eaa into main Nov 12, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant