Isolation
Rudel isolation starts with the multisite site boundary and the environment-local content tree that belongs to that site.
Each environment is a real site. Site tables, site options, uploads, admin
state, isolated users, and site-scoped capabilities form the database and
browser boundary.
Rudel then gives that site its own cloned wp-content and keeps the
operational files and metadata for that site grouped under the same
environment identity so teams can create, clone, snapshot, back up, deploy,
and destroy environments without losing track of what belongs where.
Site data
Every Rudel environment is a real multisite site, which gives Rudel an isolation boundary for:
- per-site tables through
blog_id - per-site options
- per-site uploads
- per-environment
usersandusermetatables - per-site admin and REST behavior
Environment URLs, wp-admin, media uploads, and normal browser navigation
therefore behave like ordinary site requests.
Environment-local content
Every Rudel environment also has its own wp-content inside the generated
environment directory. That local tree is the canonical source of:
- themes
- plugins
- uploads
- environment-specific mu-plugins
- an environment-local
db.phpdrop-in for isolated users - git worktrees Rudel creates for tracked code
Rudel does not treat host or network theme/plugin directories as the runtime
source of truth for a live app or sandbox. Once you are inside an environment,
its local wp-content is the environment.
By default, that means themes, plugins, and uploads are all local to the
environment. Rudel also supports an opt-in shared mode for plugins and
uploads only. In that mode, the environment still owns the local
wp-content root, but those two top-level directories become links back to
the host wp-content directories. Themes stay local.
There is one narrower performance escape hatch as well: content_exclude.
That lets a caller skip explicitly named top-level entries inside themes,
plugins, or uploads when another runtime layer already guarantees those
entries externally. The intended case is a globally injected runtime plugin,
not a general-purpose way to shrink clones.
That shared mode is a deliberate tradeoff, not a hidden fallback:
shared_pluginsmeans plugin code is live-shared with the hostshared_uploadsmeans media files are live-shared with the host- shared directories are excluded from Rudel-owned snapshot/template copying and deploy replacement
- shared plugins cannot be combined with plugin-tracked Git directories
Environment directories
Each environment also has a generated directory containing:
bootstrap.phpwp-cli.yml- the cloned
wp-content debug.logsnapshots/orbackups/
This directory is where Rudel keeps the files that belong directly to that
environment: bootstrap files, scoped CLI config, the local wp-content, logs,
snapshots, backups, and other environment artifacts. Rudel still records
metadata about worktrees and lifecycle state in runtime tables, but the file
tree itself lives with the environment rather than in a shared network code
location.
Authentication and cache
Rudel also scopes authentication salts and cache behavior per environment so sessions and persistent cache data stay isolated between environments and the host. The site boundary comes from multisite; Rudel makes sure the surrounding runtime state follows that boundary cleanly.
Sandboxes block outbound email by default because they are meant for change work and disposable testing. Apps allow normal email delivery by default because they are meant to behave like stable runtime targets.
Users
Rudel no longer relies on the shared multisite wp_users tables for live
environments.
Every app and sandbox gets its own isolated users and usermeta tables, and
an environment-local db.php drop-in points WordPress at those tables early in
bootstrap. That means:
- app users are isolated from host users
- sandbox users are isolated from app users unless the sandbox was cloned from that app
- snapshots, backups, deploys, and restore flows carry the environment's users with the rest of its state
Because user membership is isolated per environment, multisite network UI that depends on shared usermeta, such as cross-site "My Sites" membership lists, is no longer the source of truth for moving between Rudel environments. Rudel keeps the environments isolated and resolves each app or sandbox as its own site instead.
The host WordPress database still stores Rudel's registry tables, but live
environment identity is no longer shared through network-global wp_users.