Documentation
Your profile and how you sign in
What the profile page shows about you, every way this account can be signed into, and what connecting or disconnecting Google actually does.
Last reviewed against the product on .
The profile page is the only page under /app that is about you rather than about the
organization. It says who you are signed in as, lists every way this account can be signed into, and carries the
one control that connects or disconnects Google. Everything about the organization itself lives on
settings.
What the page shows
Your name, your email address, the organization you are currently in, and your role in it. A name that was never set reads "Not set". None of the four is editable here: the page renders no form for a name or an address, and no page on this site does.
The role shown here is the organization role
Two different things on this site are called a role, and the profile page shows one of them. The one it shows is your role in the current organization. It is not the account role that decides whether the administration console appears for you.
| Which role | Where it lives | What a new account gets |
|---|---|---|
| Organization role, shown on this page | Your membership record in this organization | Owner of the workspace created alongside the account |
| Account role, used by the administration console | The user record | Viewer, unless the address matches the bootstrap administrator |
Measured from ensureUserOrganization in src/lib/organizations/bootstrap.ts, the user create hook and adminPlugin defaultRole in src/lib/auth/auth.ts.
What each organization role is allowed to do is the subject of how organizations work.
How you sign in
The page lists every credential attached to this account, with the date it was added. An email and password login appears as "Email and password"; a linked Google identity appears as "Google". The sentence above the list states which of them will actually get you back in.
That list is read from the credential table, and the page is deliberately narrow about what it reads from it.
- Columns the page reads
- Three
- the row id, the provider name, and the date the credential was added
- Secret columns read
- None
- password, access token, refresh token and id token sit on the same table and the page selects none of them
- Providers named in the list
- All of them
- not only the one the button manages, so the list can state how this account can really be signed into
Measured from the account projection in app/app/profile/page.tsx, the account table in src/db/schema.ts, and the projection assertion in tests/unit/profile-account-linking.test.ts.
A page that fetches a secret it does not render is one careless serialisation away from leaking it, which is why the projection is spelled out column by column and why a test fails if it grows.
Connecting Google
The control starts the link from inside your signed-in session. Success and failure both return to this page.
Connecting from here is the only way to add Google to an account that already exists. Signing in with Google on an address that already has a password account is refused. The reason is that this deployment verifies no email address, so the auth library will not bind a social identity to a local account whose address it has never seen verified. Linking from inside a session identifies the account from the session instead of from an address claim, so that refusal does not apply to it.
| State | What you see | What happens on the click |
|---|---|---|
| The deployment has no Google credentials | A sentence saying Google sign-in is not configured here | There is no button to click |
| Google not connected | Connect Google | You are sent to Google, and returned to this page either way |
| Google connected, and a password also exists | Disconnect Google | The Google credential is removed from this account |
| Google connected, and it is the only way in | Disconnect Google, disabled, with the reason next to it | Nothing. The control refuses before the click, not after |
Measured from src/components/settings/connected-accounts.tsx and googleSignInEnabled in src/lib/env/server.ts.
Disconnecting removes one credential row. It does not delete the account, touch the organization, or change anything anyone else can see.
When a Google attempt fails, the page says so
A failed round trip comes back here with its reason in the address, and this page turns that code into a sentence. Three of those codes can only ever be produced by linking, because all three require an existing session to link into.
| Code | What it means |
|---|---|
| email_does_not_match | That Google account uses a different address from the account you are signed in to |
| account_already_linked_to_different_user | That Google account is already connected to another account here |
| unable_to_link_account | The link could not be completed at all |
Measured from MESSAGES in src/components/auth/oauth-error-notice.tsx and the code list in tests/unit/profile-account-linking.test.ts.
Before the control moved to this page, a failed link returned to a page that rendered no error, so the reason sat unread in the address bar and the attempt looked like nothing had happened.
No message is ever sent to you
- Password length accepted
- 12 to 128 characters
- checked when the password is set
- Email verification
- Never performed
- it is not required at sign-up and no mailer exists to perform it
- Controls that change a password
- None
- no page on this site renders one
Measured from emailAndPassword in src/lib/auth/auth.ts and the account sections of app/app/profile/page.tsx.
Signing out, and what it does not end
Signing out ends the session and returns you to the public site. It does not revoke a personal access token. A token is meant to outlive the session that created it, and it is revoked separately, as personal access tokens describes.
Your data
Export a copy of your personal data, or submit a request about it, in the privacy centre. What that file contains is set out in your data and privacy. What this browser stores is a separate decision, made on the cookie settings page.