Changed log retention
— Workspace settings90 days365 days
Rhea Patel rhea@acme.com · · IP 203.0.113.42
The admin screen a security questionnaire is really asking about — seats with the bill shown first, invitations, scopes split from bundles, sharing stated as its consequence, live sessions, and the audit trail underneath.
app/team-access-page.tsxnpx hoverlab add team-access-page
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.
Seats, invitations, scopes, sharing, live sessions — and the trail that says what each of them was used for.
£12.00 per seat per month · renews 14 September
9 of 12 seats are in use
The part-period charge is £12.00 × 2 × 18/30 days. It goes on the card ending 4242 today.
Step 3 of 4
Paste as many addresses as you like — commas, spaces or one per line all work.
1 person will be invited to Northwind.
Can build and ship. The right default.
https://app.example.com/join/northwind-8f31c2
Invites expire after 14 days and can be revoked from Settings.
It needs to see who is at risk, and — if you let it — act on that.
Off by default. These act without asking again.
Revocable at any time from Settings → Agents
Only the people listed below can open it. Anyone else following the link is asked to request access.
One row per browser that holds a valid session. Locations are estimated from the IP address and are frequently wrong on mobile networks and VPNs — treat an unfamiliar city as worth checking, not as proof.
Chrome 141 · macOS 16
near Lisbon, PortugalActive now
Safari · iOS 19
near Lisbon, Portugal20 minutes ago
Edge 140 · Windows 11
near Frankfurt, Germany2 days ago
First sign-in from this country
Safari · iPadOS 19
near Lisbon, Portugal3 weeks ago
5 entries
90 days365 days
Rhea Patel rhea@acme.com · · IP 203.0.113.42
Sam Okafor sam@acme.com · · IP 198.51.100.9
Rhea Patel rhea@acme.com · · IP 203.0.113.42
Team, 24 seatsStudio, 40 seats
Billing system system · · IP —
Jordan Lee jordan@acme.com · · IP 192.0.2.77
Entries are kept for 365 days on your plan and then deleted. Export before that if you need them for longer — nothing here can be recovered afterwards.
The real page, rendered in your current theme — every section below is a live block, not a screenshot.
Only want one section? Open it and copy that block instead — browse Billing & Usage.
/**
* Who is in, what they can reach, and what they did — the admin screen a
* security questionnaire is actually asking about.
*
* The unifying idea is that every section here is one half of a pair, and
* products routinely ship one half. Seats without invitations. Sharing
* without scopes. Sessions without an audit trail. Each of those pairs is
* fine on its own and useless as a control, because the question an
* administrator has is never "who has a seat" — it is "who can reach the
* customer table, and when did they last do it".
*
* So the order runs from the commercial fact to the forensic one:
*
* seats changing headcount with the bill shown first, including
* the part-period charge, because a surprise invoice is how
* a team stops adding people who need access
* invite addresses pasted, typos caught, roles assigned
* scopes read and write separated rather than bundled, writes off
* by default, an expiry that is required
* sharing where a design mistake is a data leak — general access
* stated as its consequence, not as a setting name
* sessions the screen people go looking for after losing a laptop
* audit named actors, before and after values, and a retention
* period stated rather than implied
*
* <SettingsAuditLog> is last because it is the only read-only surface here.
* Everything above it changes something; it records that the change
* happened. Putting it first would turn an admin screen into a report.
*/
import * as React from 'react'
import { BillingSeatManager } from '@/components/billing-seat-manager'
import { TeamInviteStep } from '@/components/team-invite-step'
import { PermissionScopeDialog } from '@/components/permission-scope-dialog'
import { ShareAccessDialog } from '@/components/share-access-dialog'
import { SettingsSessions } from '@/components/settings-sessions'
import { SettingsAuditLog } from '@/components/settings-audit-log'
export default function TeamAccessPage() {
return (
<main className="min-h-screen bg-background text-foreground">
<section className="mx-auto w-full max-w-5xl px-6 pb-2 pt-12">
<h1 className="text-2xl font-bold tracking-tight">Team & access</h1>
<p className="mt-1 text-sm text-muted-foreground">
Seats, invitations, scopes, sharing, live sessions — and the trail
that says what each of them was used for.
</p>
</section>
<BillingSeatManager />
<TeamInviteStep />
<PermissionScopeDialog />
<ShareAccessDialog />
<SettingsSessions />
{/* The only read-only surface here, so it closes rather than opens. */}
<SettingsAuditLog />
</main>
)
}
components/ — each block page has its own copy button.app/team-access-page.tsx. The imports already point at @/components/…, so they resolve with no edits.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.
Profile, team, API keys and danger zone in one screen — with the destructive panel last, well away from the everyday controls.
Plan, quota meters and invoice history, with the upgrade prompt placed beside a bar that is nearly full rather than on the plan card.
Consumption in the order the questions arrive: the overage warning first because it is time-critical, then the meters, then what actually happens at each limit.
Billing history laid out for finance rather than for the user — a retrieval screen, so the table leads and the payment method comes last.
Notifications from the receiving end: the inbox you arrived from, per-event and per-channel control, and the push prompt asked after the decision rather than on arrival.
Both directions, because only one of them is usually built: a radiogroup with the prorated charge announced as it changes, and a cancellation with the end date, what breaks, and one honest alternative offered once.