NOVUS / RESTAURANT

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.

The two roles an account carries
Which roleWhere it livesWhat a new account gets
Organization role, shown on this pageYour membership record in this organizationOwner of the workspace created alongside the account
Account role, used by the administration consoleThe user recordViewer, 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.

What the Google control does in each state
StateWhat you seeWhat happens on the click
The deployment has no Google credentialsA sentence saying Google sign-in is not configured hereThere is no button to click
Google not connectedConnect GoogleYou are sent to Google, and returned to this page either way
Google connected, and a password also existsDisconnect GoogleThe Google credential is removed from this account
Google connected, and it is the only way inDisconnect Google, disabled, with the reason next to itNothing. 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.

Failures only the linking path can raise
CodeWhat it means
email_does_not_matchThat Google account uses a different address from the account you are signed in to
account_already_linked_to_different_userThat Google account is already connected to another account here
unable_to_link_accountThe 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.