ozpanel sovereign hosting
Get ozpanel

Operator & API reference

Webmail, webapp and push

Webmail portal, SSO into Roundcube and SOGo, the mailbox app, branding, Web Push, notifications.

The portal

webmail.example.com per mail domain: sign-in, mailbox app, webmail clients. Generated; DNS record and certificate automatic.

PathServes
/Mailbox app (sign-in when signed out)
/app?client=Webmail framed under the app bar
/roundcube/, /SOGo/Roundcube; SOGo mail, calendar, contacts
/.well-known/caldav, carddavRedirect to SOGo DAV
/manifest.webmanifest, /webmail-icon, /sw.jsBranded manifest, icon, push worker
Exposure fieldDefaultWho
host / host_labelon / webmailtenant
path / path_prefix— / /webmailtenant
login_scope_strictOnly this domain's mailboxestenant

PUT /domains/{domain}/support-services/roundcube|sogo. Auto opt-in when mail is enabled. Only healthy clients mounted. Operator: Support services panel (install, reconfigure, verify, DB account migrate, password rotate).

Mailbox · Sign in. — ozpanel screenshot
Mailbox · Sign in.

Single sign-on

One sign-in at the portal. Clients open signed in. Panel never holds the plain password.

ClientMechanism
RoundcubeOne-time token (90 s, single use cluster-wide, hash stored, redeem key on loopback) → Dovecot master user
SOGoOpenID Connect; panel is the IdP (/oauth/*); mail over XOAUTH2
  • SessionHost-only, HttpOnly, Secure, SameSite=Lax cookie. 30 days, sliding. One mailbox per session.
  • 2FATOTP and recovery codes.
  • SOGo limitOne IdP host per node: SSO into SOGo for one webmail domain per node. Others: Roundcube.
  • Hand-offPOST /mail/me/webmail-handoff: one-time 90 s link from another console.
  • Not availableSeveral mailboxes in one session.

The mailbox app

Installable PWA at the portal root. Phone-ready, light and dark. Deep link /?open=<view>.

ScreenOffers
OverviewStatus, storage vs quota, send limit and usage, 30-day activity, filtering, sign-ins, deliverability card, diagnostics
MailDefault webmail, signed in
RulesFilters, forward, vacation (shared Sieve)
Spam & heldStrictness, allow/block, held mail release/delete
Import & syncIMAP import, once or continuous
NotificationsFeed, delivery preferences, push devices
SecurityPassword, 2FA, sessions, connected apps, app passwords, access tokens, API keys
SettingsDefault client, new-mail sound
Install appInstall steps, QR code (address only)

Routes for this area: API reference → route tables.

Mailbox · Overview. — ozpanel screenshot
Mailbox · Overview.

Branding

Per mail domain, tenant. Manifest and icon built per requesting host.

PUT /mail/domains/example.com/branding {"app_name":"Example Mail","short_name":"Example",
  "theme_color":"#2C6E8F","bg_color":"#0D1216","default_sound":"chime"}
POST /mail/domains/example.com/branding/logo     # body = PNG, SVG or JPEG, ≤512 KB
FieldRuleDefault
app_name≤64short name + "Mail"
short_name≤24Domain's first label, capitalised
theme_color, bg_color#RRGGBB#2C6E8F, #0D1216
default_sounddefault, chime, bell, nonedefault
LogosquareShipped icon

Empty field = default. Operator consoles not branded per domain.

Web Push

Open standard, own keys, no third-party account. RFC 8291 encryption, RFC 8292 VAPID.

  • KeysOne P-256 pair per cluster, private key encrypted. Generated automatically. No rotation (would void subscriptions).
  • SubscribeNotifications → Allow. GET/POST /mail/me/push/subscriptions, DELETE …/{id}. One per browser per device.
  • Expired404/410 deleted; network errors retried.
  • Payload"New mail", sender and subject, opens /?open=mail. High urgency, TTL 4 weeks, domain logo. No body.
  • TestPOST /mail/me/push/test: attempted, sent, pruned.
  • NoticesSame channel: held, rejected, bounced mail, limits, forwards.
  • SoundPUT /mail/me/sound {"theme":"bell"}; mailbox → domain → default.
  • Not availableOpen-the-exact-message click · per-rule notifications · sound on push while open.
Detection (PUT /mail/push/trigger, operator, per node)Behaviour
sieve (default)Global Sieve on every delivery, any folder
dovecotPush plugin + Lua, Inbox only
offNo new-mail push
PlatformInstallPush
iPhone, iPadSafari → Share → Add to Home ScreeniOS 16.4+, home-screen app only
Android ChromeInstall button or menuAllow when asked
Desktop Chrome, EdgeAddress-bar icon or menuBrowser running

Service worker handles push only; no offline cache.

Notifications and alerts

FeatureCallWho
FeedGET /me/notifications, POST /me/notifications/read. Read mail notices kept 30 days.everyone, own scope
Delivery preferencesGET/PUT /me/notifications/settings per class: panel (on), email (off), push (off)everyone
Operator pushPOST /notify/push/subscribe, GET /notify/push, /notify/push/test. 15 min cooldown per event.operator
Sound / push thresholdsPUT /realtime/alerts/policy {"sound_min_priority":"warn","push_min_priority":"error"}operator
Alert levelsGET/PUT/DELETE /notify/thresholds: threshold, deviation_pct, disabledoperator

Priorities: info · warn · error · crit. Channels: panel, email, Web Push.

Previous: Mail Next: DNS