How Your Account Works
Understand the separation between your self-hosted appliance and the Glassy cloud — membership verification, local JWT auth, and the 30-day offline window.
Before you start
- self-hosting/01-deploying-with-docker
What you'll learn
- Understand what data the appliance sends to the cloud (just your email)
- Know how membership verification and the 30-day cache work
- Understand local JWT authentication after first boot
- Know why registration is permanently disabled
- Handle offline operation within the verification window
The self-hosted appliance and the Glassy cloud are two separate systems that share only one thing: your email address. This lesson explains exactly what happens at boot, at login, and offline.
What the cloud sees
The appliance sends your email and a pairing token you control to app.glassy.fyi. The cloud checks whether that email has an active membership and that the pairing token matches the one generated in your Settings → Self-hosting page, then replies with a simple yes/no. That’s it.
- No passwords exchanged
- No note content, bookmarks, or captures sent
- No usage telemetry
The verification lifecycle
First boot
- The appliance starts and reads
GLASSY_MEMBER_EMAILandGLASSY_SELFHOST_TOKENfrom your.env - It sends that email and token to
app.glassy.fyiwith a membership check request - The cloud responds yes/no based on your subscription status
- If yes: the appliance creates a local admin account using that email, generates a random password, prints it to the logs once, and stores only a bcrypt hash
- If no: the appliance logs an error and won’t create the account
Every 30 days
The membership check repeats every 30 days. Between checks, the cached result is trusted. This means:
- You can go offline for up to 30 days without interruption
- After 30 days, the appliance needs to reach the cloud once to re-verify
- If verification fails (expired membership, network issue), the appliance shows a notice but doesn’t delete your data
Every login after first boot
100% local. The appliance authenticates you against its own SQLite database using a JWT signed with your JWT_SECRET. No cloud call happens during login — the cloud only confirmed your membership at boot.
Your email → Cloud: "membership active?" → Yes (cached 30 days)
↓
First boot → Create local admin (random password, printed once)
↓
Every login → Local JWT auth → No network, no phone-home
Registration is permanently disabled
The appliance enforces registration lockdown at multiple layers — this isn’t a setting you can toggle off:
server/index.jsforcesallowNewAccounts=falseon every boot/api/admin/allow-registrationhardcodesfalse/api/auth/settingshardcodesfalse/api/auth/registerreturns a hard403 REGISTRATION_DISABLEDas its first check, before any other gate
This is defense-in-depth. Even if the database drifts, the server re-enforces lockdown on every boot. Only the seeded admin account can sign in.
Working offline
Within the 30-day verification window, the appliance works fully offline:
- Notes, captures, and search — all local, no network needed
- Browser WebGPU AI — runs in your browser, offline
- Ollama — runs on your server, offline
- Companion captures — the extension connects to your local instance
The only thing that requires the cloud is the periodic membership re-verification. If you know you’ll be offline for more than 30 days, re-verify before disconnecting.
What’s next?
Learn about configuration and multi-device access — environment variables, ports, CORS, and accessing Glassy from your phone via Tailscale.