Auth Flow
Six auth screens, second factor included
Every screen between a stranger and a working account: sign in, sign up, reset, the second factor, SSO by email domain, and the first-run setup on the other side.
What a paying customer needs and never gets: this period’s usage with the overage rate on it, every invoice as a PDF, the plan, the card — and a 403 that names who can grant what was refused.
app/billing/page.tsxapp/globals.cssapp/invoices/page.tsxapp/layout.tsxapp/login/page.tsxapp/no-access/page.tsxnpx hoverlab init customer-portal ./my-app
Or over MCP, from your editor's agent — no account needed.
Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.
/Manage your account, your workspace and how you sign in.
4 of 10 seats used
Ada Lovelace
ada@acme.com
Marco Silva
marco@acme.com
Priya Raman
priya@acme.com
alex@contractor.devInvite pending
Keys carry full account access. Treat them like passwords.
Production server
sk_live_••••••••••••4f2a
Created 12 Mar 2026
Last used 2 hours ago
CI pipeline
sk_live_••••••••••••9c1e
Created 3 Jun 2026
Last used Yesterday
Local development
sk_test_••••••••••••b7d0
Created 28 Jul 2026
Never used
These actions affect everyone in the workspace.
Hand this workspace to another member. You keep admin access, but billing and deletion move to them.
Make everything read-only and stop billing at the end of the period. You can un-archive at any time.
Permanently removes all projects, members and history. This cannot be undone and support cannot recover it.
This billing period, with what happens at each limit rather than only how close you are to it.
Everything is still running. You are being billed for the overage, and this is what it looks like so far.
Projected from 6 GB a day over 21 days so far. It is a straight line, not a forecast — a quiet week moves it.
Upgrading is usually cheaper than paying overage at this volume. Capping stops the charges and starts returning 429s — some teams genuinely prefer that, and it is a real option rather than a threat.
Resets 1 September
You are over the limit on at least one quota. Overage is billed at the end of the period.
84% of your limit used
80% of your limit used
94% of your limit used
28 GB over your limit
No limit on this plan
2,110credits available
320 credits from monthly allowance expire in 1 days; 150 credits from launch bonus expire in 3 days. They are spent last, so use them before buying more.
320 / 500
Included with Pro+. Resets on the 1st and does not roll over. Expires .
1,640 / 2,000
Purchased 12 August 2026. Never expires.
150 / 250
Granted with your first purchase. Expires .
Credits are spent from the top of this list down, so the allowance included with your plan is used before anything you paid for.
Pricing tables list what a plan includes. They rarely say what happens at the limit, which is the thing that decides whether a limit is survivable.
Every charge, downloadable as a PDF. Nothing here needs an account on the product itself.
Every charge on this account. PDFs are available for seven years.
Issued 31 August 2026 · Due 14 September 2026
| Description | Qty | Unit | Amount |
|---|---|---|---|
| Studio plan — 40 seats1 Aug – 31 Aug 2026 | 40 | $12.00 | $480.00 |
| Unused time on Team plan20 Aug – 31 Aug 2026 | 24 | $12.00 | -$103.20 |
| Remaining time on Studio plan20 Aug – 31 Aug 2026 | 40 | $12.00 | $172.00 |
| AI credit pack — 2,000 credits | 1 | $15.00 | $15.00 |
| Subtotal | $563.80 | ||
| VAT (United Kingdom) at 20% | $112.76 | ||
| Total | $676.56 | ||
Receipts and failed-payment notices go to billing@acme.com.
Visa ending 4242Default
Expires 11/2026
Mastercard ending 5100
Expires 03/2029
Your plan, what you have used, and everything you have been charged.
Your plan, your next charge and how it is paid.
Current plan
Team$490/month
Next charge
$490.00
on 1 September 2026
Resets 1 September
You are over the limit on at least one quota. Overage is billed at the end of the period.
84% of your limit used
80% of your limit used
94% of your limit used
28 GB over your limit
No limit on this plan
Every charge on this account. PDFs are available for seven years.
The page exists and you are signed in — your account just is not on the list for it. Nothing has gone wrong, and nothing you do here will change that except asking.
If access was granted while this page was open, reload to pick it up.
Ask one of them rather than opening a ticket — this is a role change, and they can make it without us.
4 of 10 seats used
Ada Lovelace
ada@acme.com
Marco Silva
marco@acme.com
Priya Raman
priya@acme.com
alex@contractor.devInvite pending
The link may be out of date, or the page may have moved. Here are a few ways forward.
Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Amethyst palette, which ships in app/globals.css. Mauve-purple on a cool white. The only hue on a billing screen that is not already saying paid, overdue or ours.
then
cd customer-portal npm install npm run dev
The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.
The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.
| Path | Page | File |
|---|---|---|
| / | Account Settings | app/page.tsx |
| /usage | Usage & Limits | app/usage/page.tsx |
| /invoices | Invoices | app/invoices/page.tsx |
| /billing | Billing & Usage Screen | app/billing/page.tsx |
| /no-access | Permission Denied | app/no-access/page.tsx |
| /login | Sign-In Screen | app/login/page.tsx |
| 404 | 404 Page | app/not-found.tsx |
Every file is listed. The 18 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.
Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.
@tailwind base;
@tailwind components;
@tailwind utilities;
/**
* Design tokens — the Amethyst palette.
*
* Mauve-purple on a cool white. The only hue on a billing screen that is not already saying paid, overdue or ours.
*
* This file is the reason a pasted block looks right. Every block and page
* styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
* `border-border` — rather than literal colours, so they inherit whatever
* you define here instead of fighting it. Change a value below and every
* section in the project moves with it. Change the hue on `--primary` and
* `--ring` together and you have rebranded the site.
*
* Values are bare HSL channels, not `hsl(...)` calls. That is what lets
* Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
* `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
* carries its own function wrapper.
*
* Every foreground/background pair below clears WCAG AA (4.5:1) in both
* themes. If you retune one, check the pair rather than trusting the eye —
* mid-lightness accents are the ones that fail.
*/
@layer base {
:root {
--background: 300 28% 99%;
--foreground: 300 30% 10%;
--card: 0 0% 100%;
--card-foreground: 300 30% 10%;
--popover: 0 0% 100%;
--popover-foreground: 300 30% 10%;
--primary: 300 55% 34%;
--primary-foreground: 0 0% 100%;
--secondary: 300 26% 96%;
--secondary-foreground: 300 30% 20%;
--muted: 300 20% 95%;
--muted-foreground: 300 10% 40%;
--accent: 276 40% 93%;
--accent-foreground: 276 45% 20%;
--destructive: 0 72% 47%;
--destructive-foreground: 0 0% 100%;
--border: 300 18% 90%;
--input: 300 18% 90%;
--ring: 300 55% 34%;
--radius: 0.75rem;
}
.dark {
--background: 300 30% 5%;
--foreground: 300 14% 96%;
--card: 300 24% 8%;
--card-foreground: 300 14% 96%;
--popover: 300 24% 8%;
--popover-foreground: 300 14% 96%;
--primary: 300 70% 66%;
--primary-foreground: 300 42% 7%;
--secondary: 300 18% 15%;
--secondary-foreground: 300 14% 96%;
--muted: 300 22% 15%;
--muted-foreground: 300 10% 68%;
--accent: 276 26% 18%;
--accent-foreground: 276 45% 87%;
--destructive: 0 62% 52%;
--destructive-foreground: 0 0% 100%;
--border: 300 16% 19%;
--input: 300 16% 19%;
--ring: 300 70% 66%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground antialiased;
}
/**
* Global motion opt-out.
*
* Blocks guard their own animations with Tailwind's `motion-safe:`, but
* third-party CSS and anything you add later will not. This is the
* backstop: it neutralises every animation and transition on the page
* for users who have asked the OS for reduced motion, rather than
* relying on each author to remember.
*/
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
}
Six auth screens, second factor included
Every screen between a stranger and a working account: sign in, sign up, reset, the second factor, SSO by email domain, and the first-run setup on the other side.