SVPortal
A web portal for OpenSimulator grids, built in plain PHP with no framework and no Composer dependencies. It gives residents and grid administrators a browser-based interface for profiles, friends, messaging, grid news, events, estate management, and grid administration — sitting alongside your existing ROBUST service and simulators rather than replacing anything.
SVPortal is licensed under the Apache License 2.0 — see LICENSE. It’s free to use, modify, and redistribute, including for commercial grids.
What it does
- Resident features — profile pages (with picks and presence status), friends list, offline messages, account management, partnering, public profile pages
- Grid content — Grid News, Grid Events (with an OpenSim viewer Destination Guide integration), Grid Links, and a simple Portal Pages CMS for things like a Terms of Service or rules page
- Estate tools — add/remove estate managers, change estate owner, change maturity rating, delete estates, an “All Estates” admin overview
- Region operations — live region stats, restart/rolling restart, broadcast messages to a region, OAR backup and restore (including chunked upload from an operator’s local machine)
- Grid administration — user management (create/disable/edit accounts), registration approval workflow, Who’s Online, RemoteAdmin audit logging
- Hypergrid support — friend presence and live remote profile viewing for hypergrid friends, reverse-engineered against real third-party grids
Full feature list and history: Changelog.md.
Requirements
- PHP 8.3 or 8.4, with
php-imagick(image processing for map tiles and uploaded images) - MariaDB — shares the same database as your OpenSim/ROBUST installation by default (all portal-owned tables carry a
portal_prefix; see below) - Nginx with PHP-FPM (Apache is possible but not fully supported — see the appendix in
Install.md) - A working OpenSimulator grid with ROBUST running
- PHPMailer is bundled (
includes/phpmailer/, LGPL v2.1 — its ownLICENSEfile ships alongside it) — no Composer needed - TinyMCE (optional, for rich text editing on Portal Pages) is not bundled — it’s GPLv2+, incompatible with Apache 2.0 for bundling purposes. The portal works fully without it, falling back to a plain textarea. See
Install.mdfor download/setup instructions if you want it.
To get the portal running, start with QuickStart.md. For everything outside the portal itself — OpenSim/ROBUST settings, folders and permissions, cron, web server hardening, troubleshooting — see Install.md.
Architectural assumptions
A few things SVPortal assumes about your grid, worth knowing before you deploy:
One region per simulator process
SVPortal is designed and tested for one region per simulator process (the SINGLE_REGION_PER_SIMULATOR setting in Setup → General, on by default). Several features — live region stats (/jsonSimStats), RemoteAdmin’s admin_restart and admin_broadcast — are bound to the simulator process, not to an individual region. On a process hosting more than one region, only the first/primary region responds correctly to these calls; the others silently fail or return wrong data. This is an OpenSimulator architectural boundary, not something the portal works around.
If your grid does run multiple regions per simulator process, turn SINGLE_REGION_PER_SIMULATOR off in Setup — the portal hides the controls that would silently fail (stats panel, Restart Region, Rolling Restart, Send message to region) rather than showing you something broken. The region list itself (maturity, estate, map tile, name, online/offline status) is unaffected either way.
Shared database, portal_-prefixed tables
The portal shares the same MariaDB database as your OpenSim/ROBUST installation by default. It never touches OpenSim-owned tables except through a small, explicitly documented set of write exceptions (see CLAUDE.md Hard Rule 1) — everywhere else it’s SELECT-only, and all mutations to OpenSim data go through ROBUST’s XMLRPC/REST APIs or RemoteAdmin. Every table the portal itself owns carries a portal_ prefix.
No framework, no build step
Plain PHP files, no Composer, no compiled assets. Drop the files on a server behind PHP-FPM and Nginx, point config.php at your database, sign in as an Administrator and finish configuring (ROBUST, RemoteAdmin, email, folders and the rest) in the portal’s Setup pages — no further file editing.
Recommended: Monit for simulator process supervision
SVPortal’s rolling restart and region restart features work by having RemoteAdmin tell a simulator process to shut down, and relying on a process supervisor to bring it back up. Two settings work together to make this reliable:
InworldRestartShutsDown = truein your simulator config — makes an in-world/RemoteAdmin restart command actually terminate the process, rather than attempting an in-process region reload (OpenSim’s in-process teardown is incomplete, which this setting works around).- Monit (or an equivalent process supervisor) watching each simulator process, configured to relaunch it immediately when it exits.
Together, a restart triggered from the portal shuts the process down cleanly and Monit brings it straight back up — this is the mechanism the whole restart/rolling restart feature set is built on, not an optional extra.
If you’re on Debian 13, Monit’s systemd unit ships with ProtectHome=yes enabled by default, which makes /home invisible to Monit at the kernel namespace level — this breaks monitoring for any simulator running from a path under /home. See the Monit section of Install.md for the fix.
Getting started
QuickStart.md— the short version: web server, TLS,config.php, database schema and grants, first sign-in. If the portal shows “This portal isn’t ready yet”, it tells you which step is missing.- Setup (inside the portal, Administrators only) — configure everything else; see
SVPortal-Setup.md. Install.md— the reference for what has to be done outside the portal: ROBUST and simulator settings, folders and permissions, cron jobs, email providers, web server hardening, and troubleshooting. Upgrading an existing install? See the upgrade section ofInstall.md(importsettings.php).
For anyone working on the portal’s code itself, see CLAUDE.md for architectural rules, write boundaries, and project conventions.
License
SVPortal is licensed under the Apache License 2.0.
- PHPMailer (
includes/phpmailer/) is bundled under LGPL v2.1 — see its ownLICENSEfile in that directory. - TinyMCE (optional, not bundled) is GPLv2+ — see
Install.mdfor how to install it yourself if you want the rich text editor.
