Usage & billing
Closed beta
Section titled “Closed beta”The hosted cache is in closed beta. The OSS CLI is public and unrestricted — install it, use the local cache, deploy, run bento ci, none of that needs an account. What’s gated is cache.bento.build.
Nothing is billable during the beta. The tiers on bento.build are planned pricing, not an active price list. We’ll give notice before anything changes; nobody gets a surprise invoice out of a beta.
Getting in
Section titled “Getting in”- Request access. Email, plus what you’re building with — it genuinely affects who we admit next, because we’re looking for repos that stress specific parts of the cache.
- We admit in batches. Not first-come-first-served, and not instant. You get an email when your address is admitted.
- Sign in at app.bento.build. Email magic link. Enter your address, click the link we send. GitHub sign-in exists but stays closed until general availability.
- Create a team, mint a token, paste three lines of TOML. Hosted cache walks the whole path; it takes about two minutes.
Two shortcuts around the one-address-at-a-time path. A whole domain can be admitted at once — if your company is coming in as a group, we admit @yourcompany.com and every address at that domain can sign in without a per-person round trip. (Public mail domains aren’t eligible, for the obvious reason.) And anyone already in can invite the rest of their team: an admin on a team enters an email on the dashboard’s Members page, the invitee gets a sign-in link, and they land on the team the first time they use it — no admission request, nothing to accept. Invites last 14 days and are revocable from the same page.
Signing in before you’re admitted doesn’t error usefully — the magic-link endpoint deliberately gives the same answer either way, so the response can’t be used to enumerate who’s on the list. If the email doesn’t arrive, you’re most likely not admitted yet.
The quota: stored bytes
Section titled “The quota: stored bytes”Your cap is on what the cache is holding, not on what you uploaded this month. It’s a balance, not a meter that resets on the 1st. Push 40 GB, and you’re using 40 GB until those entries are evicted — re-running the same build a hundred times adds nothing, because the cache is content-addressed and a re-upload of a key we already hold stores no new bytes.
The cap applies per org (teams roll up into their org — that’s the boundary the CAS worker enforces), and it comes with a retention window:
| Tier | Stored | Retention |
|---|---|---|
| Free | 10 GB | 14 days |
| Starter | 100 GB | 90 days |
| Team | 500 GB | 1 year |
| Business | Custom | Custom |
Retention, honestly
Section titled “Retention, honestly”An hourly sweep deletes entries older than your window. That is not a cleanup we’re apologising for — it’s the mechanism that keeps a stored-bytes quota from being a one-way ratchet, and it’s what brings you back under the cap without anyone filing a ticket.
What eviction costs you, exactly: one cold build. A key that gets evicted and is then needed again is a cache miss, so that task runs for real once, and its output is uploaded and cached again. Nothing fails, nothing is lost, and the entries you actually use stay warm because using them is what keeps them inside the window. The entries that age out are, by definition, the ones nothing has asked for since the window opened.
What gets metered
Section titled “What gets metered”Separately from the quota, three counters roll up per org, per calendar month. These are activity — the graphs on the Usage page — and none of them gate writes:
| Counter | What it counts |
|---|---|
ops | Cache operations — every HEAD, GET, and PUT against your team’s entries. |
bytes_in | Bytes written into the cache. |
bytes_out | Bytes served back out of it. |
The Usage page shows both halves: your stored bytes against the cap, plus the month’s daily breakdown and the entries responsible for the most traffic. During the beta the cap is the free-tier 10 GB.
The Overview page’s build time saved card also prices that time at $0.008 per CI minute (GitHub-hosted 2-core Linux list rate). It’s a heuristic derived from each build’s cache-hit ratio and capped at 10× the build’s own runtime — an order-of-magnitude sanity check, never a measurement of your runner bill.
Crossing the cap
Section titled “Crossing the cap”The dashboard warns at 80% of the cap and again once you’re over it, and we email the org’s owners on each of those two crossings — once per crossing, and at most once a month while you stay over. Crossing the cap stops new uploads — the CAS worker rejects PUTs with a 413 — but reads keep being served, so builds still succeed; they just stop getting faster as new keys appear. Nothing fails, and nobody gets billed for the overage during the beta.
Coming back under is automatic: the sweep frees space as entries age out, and the write block lifts the moment your balance drops below the cap. If you’d rather not wait for the window, reply to the quota email — during the beta we’ll raise the cap.
Choosing a plan
Section titled “Choosing a plan”The dashboard’s Billing page lists every plan as a card — Free, Starter, Team, Business — with the storage and retention each one carries. Your current plan is badged; the others each carry the action that’s actually true for them, and only an org owner can act on any of it.
Plan changes happen in bento. The only thing that opens Stripe is your first subscription, because there’s a card to collect and Stripe’s page is the right place to collect it. After that you never leave the dashboard.
- Free → a paid plan. Opens Stripe Checkout for the plan you clicked. Not the next one up the ladder — the one you picked.
- Paid → a different paid plan. “Switch to Team”. A confirmation states the price and that it’s prorated from today, then the switch happens in place: Stripe credits the unused part of the old plan against your next invoice, and the new storage cap applies immediately.
- Paid → Free. “Downgrade to Free”. A cancellation, scheduled — your org keeps the plan it paid for until the end of the period, then drops to Free (10 GB stored, 14-day retention). The Free card then reads Downgrades on 21 Sep, and your current plan grows a Resume button that undoes it any time before that date.
- Business. Quoted, not sold: the card mails [email protected]. Asking for it through the API answers
409 not on sale.
Picking the plan you’re already on is rejected rather than charged twice — unless a downgrade is pending, where re-picking it is the resume. Your current plan shows its renewal date (Renews 21 Sep · $29 / month), or the cancellation date while one is scheduled.
If Stripe declines the card an upgrade needs, the switch is rolled back whole — you stay on the plan you had, and the error points you at the portal to fix the card. The Stripe portal keeps two jobs: the card on file, and the receipts. Both are linked from the Billing page — Update in Stripe on the payment-method card, full history in stripe above the invoice list.
While the beta is on, every button is disabled and says why: nothing is billable yet.
When billing turns on
Section titled “When billing turns on”Billing is Stripe end-to-end: self-serve checkout and customer portal from the dashboard’s Billing page, subscription state driven by Stripe webhooks, invoice history rendered from the Stripe API. The plumbing is in place and dormant.
Until it’s switched on, the Billing page shows your org on the free tier with nothing to pay.