← Back to the workshop
Behind the scenes

PWA Invite Console

One small console for managing invitations and devices across private web apps.

The console on a desktop, with every app in the sidebar and the devices of Casierul clasei

About The Project

The downloadable bundle has a synthetic example configuration for a local preview. Real administration requires your own compatible backend behind an authenticated private HTTPS listener.

One page for the invite and device administration of every app behind the invite mechanism.

It is the only administration GUI — the apps used to carry one each, which meant multiple tabs open and multiple places to remember. It lives in its own repository because it belongs to none of the apps it fronts.

Tailscale TLS terminates in front of the private listener, restricting administrative access strictly to authorized Tailnet nodes with zero exposed public endpoints or hardcoded passwords.

Gallery

Names, invitation recipients, classes, and children in these screenshots are anonymized and blurred.

On a desktop

On a phone

Features

  • 🔑 Unified Invite Lifecycle: Generate, share, track expiration, and monitor redemption of app invitation links across services from one place.
  • 📱 Device Management: Inspect enrolled client devices, view last-seen timestamps, assign friendly labels, and instantly revoke compromised sessions.
  • 🎟️ App-Specific Invitations: An app can offer its own access options. For Casierul clasei, an invitation picks the class, the role, the child for a parent, and the date access ends, while every other app keeps the simple one-step invitation.
  • 🌗 Desktop and Phone, Light and Dark: A sidebar of every app on a desktop, a searchable app picker on a phone, and a light and a dark theme.
  • 🔒 Tailnet Private Security: No credentials stored in front-end code; authenticated via private reverse-proxy header injection reachable only through Tailscale.
  • ⚡ Zero-Dependency PWA: Vanilla JavaScript single-page application with immediate revalidation and zero framework bloat.