Dashboard

The admin interface you would have had to build.

Every application needs a back office: somewhere to look up a customer, see what they bought, check why an entitlement is not granting, and read who changed what. This is that screen for the app you deployed — assembled from the capabilities you composed, so there is nothing to build and nothing to keep in step.

Why it exists

Every app grows an admin screen. Nobody wants to build one.

The moment real people use your app, you need to answer questions about it. Did that payment land? Why is this account not entitled? What did we send that customer? Answering them means either a terminal or an internal tool you now own and maintain forever.

This is that tool, already built, and it works against whatever your Worker composes. Add a capability and its panes appear — there is nothing to wire.

The part that matters

It never holds your data.

Present, and denying by default.

A Worker that has never been connected refuses every control-plane route. There is no flag left off and no backdoor to open.

The credential is asymmetric.

The dashboard holds a private key; you hold and can revoke the public one. Nothing secret of yours ever leaves your infrastructure, and a breach on our side is not a breach on yours.

Rotation cannot lock you out.

Append, prove, then expire — never replace. Revocation is a row you delete: immediate, and needing nothing from us.

Everything it did is in your audit trail.

Each call carries a signed, single-scope, short-lived token bound to its own body, and lands under its own actor kind — so what the dashboard did is answerable separately from what your users did.

Your Worker is the authority. We are a client that you can revoke.

Connecting

Four commands, and you can take it all back with one.

You run these against your own project. Every registration is a row in your own D1, so granting access and revoking it are both things you do, not things you ask us for.

Connecting is one command, per environment.

You run it, against your own project. It registers the dashboard's access as a row in your D1 — your Worker is the authority, and the dashboard is a client of it.

Connection is project-wide per environment, never per Worker, because Workers share a database: a per-Worker credential would show a user in one pane and not another. So a staging credential can never touch production.

terminal
$ pithy dashboard connect --env prod
▸ opened a browser to confirm it is you
▸ registered  app.pithy.sh
▸ scopes      the seam's own, plus every declared read
▸ stored in   your D1, on your account
Done.

Check what is registered, and prove it works.

status reports what is connected and with which scopes. With --verify it proves the connection end to end with a signed ping rather than telling you what a row says.

terminal
$ pithy dashboard status --env prod --verify
▸ connected   app.pithy.sh
▸ key         kid_01hv8w… (active)
▸ scopes      read:*, controlplane:self
▸ ping        signed, answered in 41ms
Done.

Rotating cannot lock you out.

Append the new key, prove it, then expire the old one — never replace. A rotation that fails leaves the previous key working, which is the opposite of how most credential rotations behave.

terminal
$ pithy dashboard rotate --env prod
▸ added    kid_01hv9x…
▸ proved   signed ping with the new key
▸ expired  kid_01hv8w…
Done.

Disconnecting is a row you delete.

Immediate, and needing nothing from us. --local deletes the row without even the courtesy call, so revocation never depends on our availability.

After it, every control-plane route answers 403 again — which is what a Worker that has never been connected already does. There is no backdoor to close, because there was never one to open.

terminal
$ pithy dashboard disconnect --env prod --local --yes
▸ deleted  the registration row
▸ routes   controlplane/not_connected
Done.

Screens

What it looks like.

Screenshot to come — project overview
Screenshot to come — purchases and entitlements
Screenshot to come — the audit trail

Reading is free. Acting is the product.

Connect a project when you deploy it and every pane your Worker composes becomes readable.