Skip to content

feature: answer the question the README already promises — "is my plan worth it?" #106

Description

@pitimon

README:32 already makes this claim:

Subscriptions hide the number entirely. A flat monthly plan shows you a quota bar, not what your usage would have cost. TokenTracker prices every token against public model rates, so you can see whether the plan is a bargain or a subsidy you have outgrown.

The product does not compute it. It shows what the usage would cost at list price, and it shows a quota bar, but the comparison — the actual decision — is left as mental arithmetic against a plan price the product never asked for.

Every input already exists: per-source cost per window, and the pricing tier telling you how much to trust it.

Proposal

A per-provider plan-value card:

  • Plan price entered by the user in Settings, stored locally like everything else — never sent anywhere, no plan catalogue to maintain and go stale.
  • Shows: Claude Pro — $20/mo · your usage this month would cost $47 at API list price.
  • Rolls up to one headline across providers.

The labelling is the hard part, not the arithmetic

This number is easy to over-claim and must not read as "you saved $27":

  • It is list-price-equivalent, not a counterfactual bill. Anyone actually on the API would use it differently.
  • It must inherit the pricing caveats already shipped in feat(pricing): in-process refresh + report how each price resolved #92: if any model in the window is unpriced or fuzzy-matched, say so on the card. unpriced_models and fuzzy_priced_models exist for exactly this.
  • Under-usage is as useful as over-usage — "$3 of usage on a $20 plan" is a downgrade signal — so the card must read neutrally in both directions, not celebrate one.

If the honest framing cannot be made to fit, the right outcome is to soften README:32 rather than ship a number that flatters.

Why this rather than alerts

Considered and rejected: a budget-alert daemon. Notifications are three-surface work (web, Swift, C#), the acute case is already covered by the quota chips, and the value here is reflective — a number you look at when deciding whether to keep paying, not a ping.

Priority

Lowest of the current set. #100/#101 close a live privacy defect and its guard; #102/#103/#104 pay down real debt. This one adds surface. It is on the list because the README already sold it, which makes it a truth gap rather than a nice-to-have — but it should be built after the debt, not before.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions