TILLFORGE · ACCESS

One identity system, two credential kinds.

GA

TillForge has no parallel user system — people, roles and company sign-in (SSO) come from your TillDev workspace. You reach git and the API with one of two credentials: a tfp_ token (HTTPS + API) or a registered SSH key. Both are scoped, expiring, and revocable in one place.

01Tokens

tfp_ tokens — the git password and API key

A tfp_ token is your credential for HTTPS git (it’s the password) and for the CLI / API. Mint one scoped to exactly what it needs and give it an expiry.

bash
# Mint a token — read | write | admin, optionally repo-scoped, with an expiry.
tilldev forge tokens create --scope write --repo acme-api --expires 90
# → tfp_live_…   (shown ONCE — copy it now)

tilldev forge tokens ls               # list; secrets are never shown again
tilldev forge tokens revoke <id>      # kill a token immediately
ScopeGrants
readClone / fetch, and read the API (browse, findings, PRs).
writeEverything read grants, plus push and PR / review writes.
adminEverything write grants, plus policy, tokens, keys, and mirrors.

Add --repo <slug> to pin a token to a single repository — least authority by default. A token can never exceed the role of the member who minted it.

Shown once · stored hash-only · MFA-at-mint
The token secret is printed one time and stored as a hash — it cannot be recovered or re-displayed. Minting a token can require a fresh MFA check, and the mint is recorded in the audit log. Lost a token? revoke it and mint another; revocation is immediate.

Keep a token in TillSecrets? Deleting or rotating that secret can revoke the old tfp_ token in the same step. See revoke on delete.

02SSH keys

SSH keys with an enforced lifecycle

For SSH git, register a public key. TillForge validates the key, records its SHA-256 fingerprint, and refuses an RSA key under 2048 bits, a key already registered in the workspace, and a key whose private half is known (see Leaked keys). Every key is scoped and must carry an expiry — there are no long-lived keys, which is exactly the control that lets SSH sit alongside HTTPS safely.

bash
# Your own key: every repo you can reach, and it pushes as you.
tilldev forge keys-account add --name laptop \
  --key "ssh-ed25519 AAAA… you@host" --scope write --expires 90
tilldev forge keys-account ls         # fingerprints, owner, scope, expiry, last-used
tilldev forge keys-account rm <id>

# Owners and admins: a machine key for automation, org-wide or one repo.
tilldev forge keys-account add --name ci-box --key "ssh-ed25519 AAAA…" --machine
tilldev forge keys add <repo> --name deploy --key "ssh-ed25519 AAAA…" --scope read
KeyWho adds itWhat it reaches
Your keyAny member, for themselvesEvery repository you can reach, never more than your own access. It pushes as you, and stops working when you leave the workspace.
Machine keyOwners and adminsEvery repository in the workspace at its scope. It belongs to no person, so its commits may not name one.
Deploy keyOwners and adminsOne repository at its scope. Like a machine key, it belongs to no person.

Only the public half is ever stored. Keys are listed with their fingerprint, owner, scope, expiry, and last-used time. You can revoke your own keys; owners and admins can revoke any, and revoke is instant. Who a key belongs to decides whose name its commits may carry (see Commit identity). Use these with the SSH clone URL.

The same public key can be registered in several workspaces. Each registration only governs its own workspace, so someone who adds your public key to theirs gains nothing and doesn’t lock you out.

Leaked keys

A key is refused everywhere once its private half is known. That covers keys published with tools (such as Vagrant’s insecure keys) and any private SSH key that lands in a TillForge repository: the secret scan flags it, and once someone allowlists it into history or a pull mirror brings it in, every registration of that key is revoked in every workspace, it can’t be added again, and its commit signatures stop counting as Verified. The git server proves it holds the private key before anything is revoked, and a push the scan refused revokes nothing, since the key never entered history. Revoked keys show as revoked · private key leaked, and the finding names the key’s fingerprint.

An RSA key under 2048 bits that was registered before this rule shows as refused · too weak and no longer works over SSH. Make a new key with ssh-keygen -t ed25519.

03Roles

Roles govern git and the API alike

Membership and roles are TillAuth’s — an org has owners, admins, developers, and viewers, and that role governs both what a session can do in the dashboard and what a tfp_ token or SSH key can do at the git boundary.

RoleCan
ownerEverything — including transfer / delete, and approving dangerous actions.
adminManage repos, branch policy, tokens, keys, mirrors, and AI egress policy.
developerPush (within policy), open and review PRs, read everything in the org.
viewerClone / fetch and read the dashboard — no writes.

Authorization is 404-not-403: a request for a repo outside your org resolves to a not-found, never a permission leak. Every high-privilege action — a force-push to a protected branch, a policy change, minting a token — is append-only audited (read it with tilldev forge audit).

SCIM not available yet
Manage members and roles directly in the workspace; company sign-in covers the browser, while git and the API still take a token or SSH key. Removing a member ends their workspace access and their SSH keys at once; repository collaborator grants you gave them stay until you remove those too.

Next: Branch protection for what these credentials are allowed to do at the push boundary, or the CLI reference. Back to the TillForge overview.