ORLY supports full white-label branding, allowing relay operators to customize the UI appearance without rebuilding the application. All branding is loaded at runtime from a configuration directory.
Generate a branding kit:
# Generic/white-label branding (recommended for customization)
./orly init-branding --style generic
# ORLY-branded template
./orly init-branding --style orly
# Custom output directory
./orly init-branding --style generic /path/to/branding
The branding kit is created at ~/.config/ORLY/branding/ by default.
~/.config/ORLY/branding/
branding.json # Main configuration
assets/
logo.png # Header logo (replaces default)
favicon.png # Browser favicon
icon-192.png # PWA icon 192x192
icon-512.png # PWA icon 512x512
css/
custom.css # Full CSS override
variables.css # CSS variable overrides only
{
"version": 1,
"app": {
"name": "My Relay",
"shortName": "Relay",
"title": "My Relay Dashboard",
"description": "A high-performance Nostr relay"
},
"nip11": {
"name": "My Relay",
"description": "Custom relay description for NIP-11",
"icon": "https://example.com/icon.png"
},
"manifest": {
"themeColor": "#4080C0",
"backgroundColor": "#F0F4F8"
},
"assets": {
"logo": "assets/logo.png",
"favicon": "assets/favicon.png",
"icon192": "assets/icon-192.png",
"icon512": "assets/icon-512.png"
},
"css": {
"customCSS": "css/custom.css",
"variablesCSS": "css/variables.css"
}
}
| Section | Description |
|---|---|
app | Application name and titles displayed in the UI |
nip11 | NIP-11 relay information document fields |
manifest | PWA manifest colors |
assets | Paths to custom images (relative to branding dir) |
css | Paths to custom CSS files |
Replace the generated placeholder images with your own:
| Asset | Size | Purpose |
|---|---|---|
logo.png | 256x256 recommended | Header logo |
favicon.png | 64x64 | Browser tab icon |
icon-192.png | 192x192 | PWA icon (Android) |
icon-512.png | 512x512 | PWA splash screen |
Tip: Use PNG format with transparency for best results.
Edit css/variables.css to change colors without touching component styles:
/* Light theme */
html, body {
--bg-color: #F0F4F8;
--header-bg: #FFFFFF;
--primary: #4080C0;
--text-color: #334155;
/* ... see generated file for all variables */
}
/* Dark theme */
body.dark-theme {
--bg-color: #0F172A;
--header-bg: #1E293B;
--primary: #60A5FA;
--text-color: #F8FAFC;
}
Edit css/custom.css for complete control over styling:
/* Custom header */
.header {
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
/* Custom buttons */
button {
border-radius: 8px;
font-weight: 500;
}
/* Custom cards */
.card {
border-radius: 12px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
--bg-color - Main page background--header-bg - Header background--sidebar-bg - Sidebar background--card-bg - Card/container background--panel-bg - Panel background--text-color - Primary text--text-muted - Secondary/muted text--primary - Primary accent color--primary-bg - Primary background tint--secondary - Secondary color--accent-color - Link color--accent-hover-color - Link hover color--success, --success-bg, --success-text--warning, --warning-bg--danger, --danger-bg, --danger-text--info--input-bg - Input background--input-border - Input border--input-text-color - Input text--button-bg - Default button background--button-hover-bg - Button hover background--button-text - Button text color--button-hover-border - Button hover border| Variable | Default | Description |
|---|---|---|
ORLY_BRANDING_DIR | ~/.config/ORLY/branding | Branding directory path |
ORLY_BRANDING_ENABLED | true | Enable/disable custom branding |
Restart the relay to apply branding changes:
# Stop and start the relay
pkill orly
./orly
Changes to CSS and assets require a restart. The relay logs will show:
custom branding loaded from /home/user/.config/ORLY/branding
The relay serves branding assets at these endpoints:
| Endpoint | Description |
|---|---|
/branding/logo.png | Custom logo |
/branding/favicon.png | Custom favicon |
/branding/icon-192.png | PWA icon 192x192 |
/branding/icon-512.png | PWA icon 512x512 |
/branding/custom.css | Combined CSS (variables + custom) |
/branding/manifest.json | Customized PWA manifest |
To use the default ORLY branding:
# Option 1: Remove branding directory
rm -rf ~/.config/ORLY/branding
# Option 2: Disable via environment
ORLY_BRANDING_ENABLED=false ./orly
~/.config/ORLY/branding/branding.json existsbranding.json is correcthtml, body selectorbody.dark-theme selector