PaneOS Interactive Computer is an s&box library package that provides an XP-styled in-world desktop. It includes a persistent computer runtime, app launcher, movable windows, screensaver, notepad, task manager, about panel, and locked-down Ridge browser shell.
Try it out in the Test Project here.
Here are some WIP screen shots:
When you first load the project, you can choose to have the PC in sleep mode or awake, here it is awake.

After beginning the interaction with the computer by clicking "e" while looking at the monitor, it fullscreens the PC, you can exit via the "e" key as well if not in a text editor at the time.

Here are the current state of the apps on opening, the 2 not seen are the "About PC" and "Control Panel" which have more work to be done.

Here is the current state of the Start menu and the apps, there is a simulation feature for creating memory leaks and causing apps to not respond.
Apps not responding is something you can set a chance to happen each minute, and disable entirely if not wanted.

The apps show on the screen when not interacting with the computer

The screensaver is the classic DVD diagonal logo shifter!

This repository is structured as a library package:
paneosinteractivecomputer.sbproj
Assets/
Code/
Editor/
UnitTests/
Copy or clone this package folder into your game's Libraries directory:
YourGame/
Libraries/
PaneOSInteractiveComputer/
paneosinteractivecomputer.sbproj
Assets/
Code/
Editor/
UnitTests/
For the current local project, the package target is:
D:\sboxProjects\getalife\Libraries\PaneOSInteractiveComputer
After copying, reload or recompile the project in the s&box editor. The PaneOS components should appear in the component picker from the library assembly.
InteractiveComputerComponentowns one computer's state and runtime.ComputerDesktoprenders the PaneOS Razor/Panel desktop.ComputerUseRaycasteris an optional player-side use-key helper.ComputerInteractionPlayerLockis an optional player-side helper that disables your movement/look components while the desktop is in use.PaneOSMonitorSetupandPaneOSRtScreenBridgecreate the generated screen, camera, and render target used by monitor or TV setups.- Built-in apps:
system.aboutsystem.notepadsystem.ridgesystem.taskmanagersystem.paneexplorersystem.settingssystem.calculatorsystem.paintsystem.mediaplayer
Use this setup when the screen can directly host s&box UI:
- Create or select the in-world computer GameObject.
- Add
InteractiveComputerComponent. - Set a unique
ComputerId, for exampleoffice-pc-01. - Leave
UseGameSettingsResolution = trueif you want PaneOS to match the player's current game resolution automatically. Turn it off only when you want to force a fixed desktop size withResolutionXandResolutionY. - Create or select the screen surface GameObject.
- Add a built-in s&box
WorldPanelorScreenPanelcomponent to that screen object. - Add
ComputerDesktopto the same screen object. - Assign the computer GameObject's
InteractiveComputerComponenttoComputerDesktop.Computer. - Set
ComputerDesktop.VisibleOnlyWhenInteracting:trueshows the desktop only while the player is interacting.falsekeeps the desktop rendered on the screen all the time.
- If
UseGameSettingsResolution = false, set the panel size to matchResolutionXandResolutionY.
Recommended starting values:
InteractiveComputerComponent.UseGameSettingsResolution = true
InteractiveComputerComponent.ResolutionX = 1024
InteractiveComputerComponent.ResolutionY = 768
WorldPanel.PanelSize = 1024, 768
WorldPanel.RenderScale = 1
WorldPanel.LookAtCamera = false
Sanity-check this path before adding any RT/TV package:
- Set
ComputerDesktop.VisibleOnlyWhenInteracting = false. - Press play.
- Confirm you can already see the PaneOS desktop directly on the
WorldPanelorScreenPanel.
If this direct panel setup works, but your monitor/TV overlay stays blank later, the PaneOS runtime is fine and the remaining issue is in the render-target hookup.
You can wire interaction manually from your player controller:
computer.BeginInteraction( playerGameObject );
computer.EndInteraction();
computer.ToggleInteraction( playerGameObject );Or use the included helper:
- Add
ComputerUseRaycasterto the player GameObject. - Assign the player's camera to
PlayerCamera. - Set
UseButtonto your input action, usuallyuse. - Set
UseDistanceto the desired interaction range. - Optionally add
ComputerInteractionPlayerLockto the same player and assign your movement and look components.
While interacting, the computer wakes from sleep, the screensaver is dismissed, idle time resets, and pressing the configured ExitInteractionInputAction ends interaction. The default is use, which matches the usual button/use flow.
If your monitor model already uses a built-in s&box Button Component, a straightforward setup is to call InteractiveComputerComponent.ToggleInteraction( playerGameObject ) from that button's use/click event. PaneOS no longer shows a fake E prompt inside its lock or sleep overlays, so you can reserve the use key entirely for your own interaction flow.
Use this setup when a monitor or TV material expects a render target from another screen system.
- Add
InteractiveComputerComponentto the computer root. - Add
PaneOSMonitorSetupto the monitor model root or screen surface GameObject. - Assign
PaneOSMonitorSetup.Computer. - If the display surface is a child object, assign it to
PaneOSMonitorSetup.DisplayObject. - Optionally set
ScreenId; otherwise it usespaneos-{ComputerId}. - Press play or run setup.
PaneOSMonitorSetup creates/configures PaneOSRtScreenBridge. The bridge:
- Creates a
PaneOS Screenchild. - Adds/configures a
WorldPanel. - Adds/configures
ComputerDesktop. - Creates a
PaneOS RT Camerachild. - Creates a render target sized to the computer resolution.
- Exposes the generated screen, camera, render target, and optional
RtScreenComponentreference in the inspector.
s&box's whitelist blocks reflection in game code, so PaneOS does not auto-create or auto-write properties on arbitrary RT Screens package components. Add/configure the RT Screens component in the editor and assign the generated PaneOS Screen, PaneOS RT Camera, render target, and/or ScreenId to the fields your screen component expects.
Important: PaneOSMonitorSetup does not finish the third-party RT package setup for you. It only generates the PaneOS side. You still need to wire the generated objects into the monitor package component manually.
Expected runtime result after pressing play:
- Your display object should contain a child named
PaneOS Screen. - Your display object should contain a child named
PaneOS RT Camera. PaneOS Rt Screen Bridge.RenderTargetshould be populated in the inspector.- Your RT Screens package component should reference that generated camera/render target or the matching
ScreenId.
If those generated children never appear, the bridge did not set up correctly. If they do appear but the monitor stays blank or flat blue, the RT package is still pointing at the wrong source.
Important InteractiveComputerComponent properties:
ComputerId: separates one computer's state from another. Give every placed computer a unique value.ResolutionXandResolutionY: desktop resolution. Keep these in sync with your panel/render target size.UseGameSettingsResolution: whentrue, PaneOS follows the current game resolution and ignores manualResolutionX/ResolutionYvalues at runtime.StartsSleeping: starts the computer behind the sleep overlay.ScreenSaverEnabled: enables the PaneOS screensaver.ScreenSaverDelaySeconds: idle time before the screensaver appears.ScreenSaverLogoSize: size of the bouncing PaneOS logo.ScreenSaverVelocity: screensaver movement speed.ThemeName: texture theme folder name. The default isdefault, which resolves icons fromAssets/textures/themes/default.InstalledAppIds: comma, space, tab, or newline separated app IDs.InstallAllAppsWhenListIsEmpty: installs every registered app ifInstalledAppIdsis blank.SavedStateJson: serialized state mirror for save systems and editor inspection.
Theme icon convention:
Assets/textures/themes/{ThemeName}/App_{appName}.png
Assets/textures/themes/{ThemeName}/Ext_{extension}.png
Assets/textures/themes/{ThemeName}/folder.png
Example default theme icon names include App_notepad.png, App_paneExplorer.png, Ext_txt.png, and folder.png.
Example InstalledAppIds:
system.about
system.notepad
system.ridge
system.taskmanager
Runtime persistence helpers:
var json = computer.ExportStateJson();
computer.ImportStateJson( json );
computer.ResetStateFromCreationSettings();Apps implement IComputerApp and usually return a Sandbox.UI.Panel.
using Sandbox.UI;
using PaneOS.InteractiveComputer;
public sealed class PaintApp : IComputerApp
{
public ComputerAppSession Run( ComputerAppContext context )
{
return new ComputerAppSession
{
Title = "Paint",
Icon = "PT",
Content = new Panel()
};
}
}Register app descriptors explicitly:
ComputerAppRegistry.Register( new ComputerAppDescriptor
{
Id = "vendor.paint",
Title = "Paint",
Icon = "PT",
SortOrder = 50,
Factory = () => new PaintApp()
} );An app appears on a specific computer only when its app ID is installed in that computer's state.
Ridge is intentionally locked down. By default it does not render external websites.
To enable website rendering for a specific computer, add settings to the installed app state for system.ridge:
{
"AppId": "system.ridge",
"Settings": {
"web_rendering_enabled": "true",
"allowed_hosts": "sbox.game docs.facepunch.com *.example.com"
}
}Only http and https URLs whose host matches allowed_hosts are passed to WebPanel.
PaneOS credit links are allow-listed by default so the About PC credits can open in Ridge without requiring every placed computer to duplicate those hosts. The default credit hosts are:
github.comflaticon.comwww.flaticon.com
Run the framework-free unit test runner:
dotnet run --project UnitTests\PaneOS.Tests.csprojThe tests cover Ridge browser policy, screensaver timing/movement, and core state defaults.
Desktop does not appear:
- Check that
ComputerDesktop.Computeris assigned. - Check
VisibleOnlyWhenInteracting; if it istrue, callBeginInteraction. - Check the panel size and screen transform.
- Check that the library compiled in the editor.
Apps do not appear:
- Check
InstalledAppIds. - If
InstalledAppIdsis blank, checkInstallAllAppsWhenListIsEmpty. - Confirm custom apps are registered with
ComputerAppRegistry.Register(...).
State seems shared between multiple computers:
- Give each
InteractiveComputerComponenta uniqueComputerId.
RT monitor is blank:
- First prove the direct
WorldPanelsetup works before using RT screens. - Verify the generated
PaneOS Screenexists. - Verify the generated
PaneOS Screenhas bothWorldPanelandComputerDesktop. - Verify
PaneOS RT Cameraframes the generated screen. - Assign the generated camera/render target/
ScreenIdto your RT screen component in the editor. - If you only see a flat blue screen, the most common causes are:
- The RT screen package is not using PaneOS's generated render target yet.
- The RT camera is not aimed at
PaneOS Screen. - The monitor material is still bound to a different screen source.
- The visible area is cropped so far in that only desktop background is on screen.
- Temporarily set
ComputerDesktop.VisibleOnlyWhenInteracting = falsewhile debugging, so you are not also fighting interaction state. - Temporarily bypass the RT package and point the display at the generated
WorldPaneldirectly. If PaneOS appears there, the problem is definitely the RT hookup rather than the computer runtime.
PaneOSRtScreenBridge shows an OnValidate warning:
- This usually means the bridge validated before the computer runtime had fully awoken in the editor.
- PaneOS now falls back to the component resolution during validation, then finishes normal setup at runtime.
PaneOS uses s&box Panel/Razor UI. It does not use Qt.
- Pane OS, created by Daniel Garnier
- Video icons created by riajulislam - Flaticon
- Radio icons created by Freepik - Flaticon
- Mp3 icons created by Freepik - Flaticon
- Exe icons created by Freepik - Flaticon
- Document icons created by Freepik - Flaticon
- Painting icons created by Freepik - Flaticon
- Seo and web icons created by Freepik - Flaticon
- Search icons created by Freepik - Flaticon
- Notepad icons created by Freepik - Flaticon
- Calculator icons created by Freepik - Flaticon
- Checklist icons created by Freepik - Flaticon
- Recycle bin icons created by Freepik - Flaticon
- Control panel icons created by Freepik - Flaticon
- Computer icons created by Freepik - Flaticon
- Folder icons created by Freepik - Flaticon
- Picture icons created by Freepik - Flaticon
- Film icons created by Freepik - Flaticon