Cloud and AI API spend in one place, for solo developers. Sample figures.
This month
Spend by provider (sample)
One screen for a cloud bill and two model bills, because the actual problem is that they arrive in three different places and never on the same day. A home-screen widget shows the month to date without opening the app.
Connecting a provider
Read-only credentials only. The app can see a bill; it can never move money.
Onboarding
- 1Pick a provider
- 2Grant read-only access
- 3First sync
- 4Set a goal
- 5Arm an alert
- AWSread-only role
Granted through a CloudFormation template the app hands you, so the permissions are inspectable before you accept them — and there is a manual path for anyone whose org blocks the admin route.
- OpenAI · Anthropicusage API key
- CSV importfallback
For a provider or an account tier with no usage endpoint. Less convenient, but better than a spreadsheet nobody updates.
data model connections · provider_credentials
providerenumaws · anthropic · openaistatusenumpending · healthy · broken · needs_reauthlast_successful_poll_attimestampthe field that makes a quietly dead connection visibleciphertext / iv / auth_tagbyteacredentials are encrypted at rest, never stored in the clearkey_versionintso the encryption key can be rotated without losing what is already storedEvery decryption of a credential is written to an audit log. If the app ever reads a key, there is a record that it did.
Provider detail
This connection
- Provider
- sample
- Status
- healthy
- Last sync
- sample
- Month to date
- sample
Compared
- Last month
- sample
- Same point last month
- sample
- Trend
- up
- Top category
- sample
Daily spend (sample)
Spend is stored per provider, per day, per category — so the same rows answer the dashboard, the calendar and the per-category breakdown without a second pipeline.
Daily spend calendar
Click a cell to change its state. A month at a glance is how you spot the day something was left running.
A sample month
Click a cell to change its state.
Weekends read differently from weekdays for most solo developers, which is the pattern a monthly total hides completely.
Budget & anomaly alerts
| Alert | Kind | Scope | Threshold | State |
|---|---|---|---|---|
| Sample budget alert | budget | provider | monthly limit | armed |
| Sample anomaly alert | anomaly | tracker | percent above normal | armed |
| Sample group alert | budget | group | monthly limit | disabled |
data model budget_alerts · anomaly_alerts
kindenumbudget — a ceiling · anomaly — a deviationscope_typeenumtracker · provider · groupmonthly_limit_usdnumericbudget alertsthreshold_percentnumericanomaly alertsenabledbooleanarmed without being deletedrefire_minutesintso one bad afternoon does not send forty notificationslast_fired_attimestampSample alert
arm (demo)What fired, and what you did about it
Sample history
- todayDaily spend well above normalanomaly
push sent · amount recorded with the event
- todayAcknowledgedyou
which is what stops it re-firing on the same cause
- last weekMonthly limit reachedbudget
push sent
- last monthConnection needed reauthscheduler
status moved to needs_reauth rather than failing silently
data model alert_events
kindenumbudget · anomalyproviderenumaws · anthropic · openaimessage / amount_usdtext · numericwhat was said and the figure behind itacknowledged_attimestampcreated_attimestampConnections are polled by a scheduler that walks them as they come due, rather than everything at once on a timer. A provider that rate-limits one account should not delay every other account's sync.
Plan, export, deletion
data model entitlements
tierenumfree · paidmax_connected_providersintwhat the free tier actually limitsbilling_issuebooleana failed payment downgrades access without deleting dataWhat a user can always do
- Export everythingone request
Spend history and settings, in a form that is readable without the app.
- Delete the accountone request
Credentials and spend records go with it.
- Read the audit logtransparency
Credential decryptions and entitlement changes are both recorded.
Row-level security scopes every table to the signed-in user, and spend records are partitioned by month — a query about this month never touches last year's rows.