Branding
Vistralio can be re-skinned with your own product name, tagline, primary colour, logo, and favicon. The branding is exposed publicly so the login screen already shows it before the user signs in.
Where it appears
- The browser tab title
- The browser tab icon / favicon
- The sidebar title and logo
- The login form
- The PWA install prompt
Editing
Settings → Branding (requires branding.edit or admin).
| Field | Notes |
|---|---|
| Name | Replaces "Vistralio" everywhere it appears |
| Tagline | Appears under the name on the login screen |
| Primary colour | Hex value, used for the accent colour. Pick something with enough contrast against the dark slate background |
| Logo | PNG, JPEG, SVG, or WebP. Upload a file or paste a remote image URL. Square aspect works best; max 1MB recommended |
| Favicon | .ico, PNG, SVG, WebP, or a remote URL. Used for the browser tab and refreshed by the app shell after save |
The logo file is written to /var/lib/vistralio/branding/logo.<ext> and served
by nginx at /branding/logo.<ext>. The favicon is written alongside it and
served back through /favicon.ico.
API
# Read (public — no auth)
curl https://cctv.example.com/api/branding
# Update (admin)
curl -X PUT https://cctv.example.com/api/branding \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Acme NVR","tagline":"Watch everywhere","primary_color":"#10b981"}'
# Upload a logo (multipart)
curl -X POST https://cctv.example.com/api/branding/logo \
-H "Authorization: Bearer $TOKEN" \
-F "file=@./acme-logo.png"
# Set logo from a remote URL
curl -X POST https://cctv.example.com/api/branding/logo-url \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/acme-logo.png"}'
# Upload a favicon
curl -X POST https://cctv.example.com/api/branding/favicon \
-H "Authorization: Bearer $TOKEN" \
-F "file=@./favicon.ico"
# Set favicon from a remote URL
curl -X POST https://cctv.example.com/api/branding/favicon-url \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/favicon.ico"}'
Reverting to defaults
There's no "reset" button — set the values back manually, or DELETE the
brand.* keys via the settings API:
curl -X PUT https://cctv.example.com/api/settings/brand.name \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"value":null,"scope":"admin","description":""}'