Turns a zipped Windows game into a single .run installer for SteamOS: run it once, and the game is in the Steam library with its artwork and Proton set up.
Warning
Plumber is still being tested: use it at your own risk. If you run into a problem and want to help the project, open an issue on GitHub.
On a Windows PC:
- Install the game.
- Zip the folder it is installed in: right-click it and choose Compress to → ZIP File. On Windows 10 it is Send to → Compressed (zipped) folder.
In the browser, on the Plumber site:
- Drop the zip onto the page.
- Check the title and the executable, add artwork if you like, and build the installer: a single
.runfile.
On SteamOS:
- Switch to Desktop Mode: press the Steam button, then Power → Switch to Desktop.
- Copy the
.runfile over: a USB stick, a network share, whatever is at hand. - Right-click the file, open Properties, go to the Permissions tab and tick Is executable.
- Double-click it. The installer asks where to put the game and which Proton version to run it with: if you are not sure, keep what is already selected.
- Steam restarts by itself, and the game is in the library with its artwork. Double-click Return to Gaming Mode on the desktop and play.
Why everything is the way it is: SPEC.md.
SPEC.md: the specificationpackages/installer(@plumber/installer): the installer that runs on SteamOS, see its READMEpackages/frontend(@plumber/frontend): the web application that builds the.runinstaller
packages/frontend/app/ follows Flat Layers Design:
app/
index.ts entry point
devtools.ts in-page DevTools of the stores, development only
styles.css global CSS entry
assets/ icons, fonts, images
shared/ app-wide constants, types, pure utils
services/ zip (central directory, Zip64), exe scoring, DLL wrappers,
artwork, recipe, tar + gzip, .run assembly, browser downloads,
preflight checks
stores/ game, artwork, build, preflight: the wizard state
uikit/ presentational components and design tokens
blocks/ ArchivePicker, GameForm, ArtworkGrid, PreflightList, BuildPanel
pages/ Home
The UI is written with nanoviews and @nano_kit/store. Where the browser has showSaveFilePicker (Chrome, Edge), the build streams the .run to disk through it. Anywhere else (Firefox, Safari, Brave) the browser downloads it as a Blob made of the header, meta and the archive File itself, so the archive is never read into memory either.
pnpm install
pnpm updateGitHooks
pnpm dev # dev server of the frontend; Alt+Shift+D opens the nano_kit DevTools
pnpm storybook # Storybook on port 6006
pnpm test # lint, types and unit tests of both packages
pnpm build # production build into packages/frontend/dist/
pnpm preview # serves that build locally
pnpm commit # Conventional Commits, scoped by package