Skip to content

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.

Video coming soon.

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

  1. The appliance starts and reads GLASSY_MEMBER_EMAIL and GLASSY_SELFHOST_TOKEN from your .env
  2. It sends that email and token to app.glassy.fyi with a membership check request
  3. The cloud responds yes/no based on your subscription status
  4. 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
  5. 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.js forces allowNewAccounts=false on every boot
  • /api/admin/allow-registration hardcodes false
  • /api/auth/settings hardcodes false
  • /api/auth/register returns a hard 403 REGISTRATION_DISABLED as 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.