title: Shellular Web UI
emoji: π₯οΈ
colorFrom: blue
colorTo: indigo
sdk: docker
pinned: false
Shellular Web UI
A self-hosted web interface that runs Shellular inside a Hugging Face Space and shows the pairing QR code in your browser β no terminal access needed.
What it does
- Password-protected login page hosted on your HF Space URL
- Starts Shellular automatically after login and renders a scannable QR code
- All traffic between your phone and the host is end-to-end encrypted (libsodium)
- One-time setup panel guides you through saving permanent secrets so restarts are instant
Architecture
Your Phone ββscan QRβββΆ Shellular App
β
wss://api.shellular.dev (relay, E2E encrypted)
β
HF Space
(Node.js + Shellular CLI)
Quick Start
Step 1 β Fork the Space
Click Duplicate this Space on the top-right of this Space page.
Step 2 β Add SECRET_KEY
Go to your forked Space β Settings β Variables and secrets β New secret
| Name | Value |
|---|---|
SECRET_KEY |
Any strong password β this is the login password for the web UI |
The Space will restart automatically.
Step 3 β Login
Open your Space URL (https://your-username-vps.hf.space), enter your SECRET_KEY and click Login.
Shellular starts automatically. Within a few seconds the QR code appears.
Step 4 β Scan the QR code
Install the Shellular app on your phone β shellular.dev
Open the app and scan the QR code on the dashboard. Your phone is now connected.
Step 5 β Save the permanent secrets (important!)
After the QR code appears, a β‘ One-time Setup panel appears showing three values with Copy buttons.
Add all three as secrets in your Space settings:
Space β Settings β Variables and secrets β New secret
| Secret name | Where to get it |
|---|---|
SHELLULAR_HOST_ID |
Copy from the One-time Setup panel |
SHELLULAR_MACHINE_ID |
Copy from the One-time Setup panel |
SHELLULAR_KEY |
Copy from the One-time Setup panel |
After adding all three, restart the Space. The setup panel disappears permanently.
Why are these needed? Shellular calls
api.shellular.devto register on every cold start. That API is rate-limited β if the Space restarts too often, registration fails and the QR never appears. Saving these three values means Shellular reuses the same registered identity on every restart with no API call at all.
All Secrets Reference
| Name | Required | Description |
|---|---|---|
SECRET_KEY |
β Always | Login password for the web UI. Choose anything strong. |
SHELLULAR_HOST_ID |
β Strongly recommended | The relay server's ID for this host. Shown in the One-time Setup panel. |
SHELLULAR_MACHINE_ID |
β Strongly recommended | Hashed machine identifier tied to the registration. Shown in the One-time Setup panel. |
SHELLULAR_KEY |
β Strongly recommended | 32-byte base64 E2E encryption key. Shown in the One-time Setup panel. |
Troubleshooting
QR code doesn't appear / "Shellular stopped"
The Shellular registration API was rate-limited.
Fix: Save the three SHELLULAR_* secrets from the One-time Setup panel (Step 5). Once saved, Shellular skips registration on every restart β no rate limit, instant QR.
If you have not yet seen the One-time Setup panel (e.g. the first registration also failed), wait a few minutes and click βΆ Restart on the dashboard to try again.
"Invalid key" on login
SECRET_KEY is not set or was typed incorrectly. Check Settings β Variables and secrets.
One-time Setup panel not appearing
The panel only appears after the QR code is successfully rendered for the first time AND the SHELLULAR_* secrets are not yet saved. If the QR rendered but the panel did not appear, refresh the page and log in again.
Project Structure
βββ app.js # Express server β auth, SSE, shellular lifecycle
βββ package.json
βββ Dockerfile # Node 20-slim, pinned machine-id for stable registration
βββ public/
βββ index.html # Login page + dashboard (QR, One-time Setup, Output log)
βββ style.css # Dark theme
βββ app.js # Frontend JS
βββ qrcode.min.js # Bundled QR renderer (no CDN dependency)