npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@frinky/boiler

v0.1.3

Published

Butler-like CLI for uploading builds to Steam via SteamCMD

Readme

boiler

npm version npm downloads license

boiler is a CLI for uploading game builds to Steam via SteamCMD.

It generates VDF files, guides Steam login + Steam Guard flows, and gives you a repeatable login -> init -> push workflow without manual Steamworks UI steps.

Table of Contents

Why boiler

Uploading with raw SteamCMD usually means:

  • hand-writing VDF files
  • remembering the right command sequence
  • re-checking paths and depot mappings every upload
  • dealing with Steam Guard prompts manually

boiler handles this with:

  • interactive project setup (boiler init)
  • guided login (boiler login)
  • one-command upload (boiler push)
  • changed-depot detection (skip unchanged depots)
  • doctor and status commands for preflight and diagnostics

Install

Global install:

npm install -g @frinky/boiler

Run without installing:

npx @frinky/boiler --help

Simple Usage (Beginner Friendly)

If this is your first Steam upload, follow this exactly.

1. Log in once

boiler login

What happens:

  • you enter Steam credentials
  • Steam Guard is handled interactively (email/app/mobile prompt)
  • boiler stores only your username (not your password)

2. Create project config

From your game project folder:

boiler init

You will be prompted for:

  • Steam App ID
  • one or more Depot IDs
  • content root folder(s) (for example ./build)
  • include/exclude mapping rules

This creates .boiler.json in your project root.

3. Upload your build

boiler push

That is the full basic flow.

4. Optional: one-off folder override (single depot only)

boiler push ./dist

Use this only when your config has a single depot.

Command Quick Reference

| Command | What it does | | --- | --- | | boiler login | Authenticates with Steam and caches session via SteamCMD | | boiler init | Creates .boiler.json using an interactive wizard | | boiler push [folder] | Generates VDF and uploads build | | boiler status | Shows config/auth/artifact/upload status | | boiler doctor | Runs preflight checks | | boiler help [command] | Shows CLI help |

Global options:

| Flag | Description | | --- | --- | | -v, --verbose | Extra logging | | --debug | Debug logging (implies verbose) |

Command Details

boiler login

Interactive login:

boiler login

Non-interactive (CI/automation):

BOILER_USERNAME=buildbot \
BOILER_PASSWORD=super-secret \
boiler login --non-interactive

Supported automation inputs:

  • --username <name>
  • --password-env <var>
  • --guard-code-env <var>
  • --install-steamcmd
  • --non-interactive
  • BOILER_USERNAME
  • BOILER_PASSWORD
  • BOILER_GUARD_CODE
  • BOILER_NON_INTERACTIVE=1

boiler init

Create or refresh project config:

boiler init

boiler push [folder]

Upload using .boiler.json:

boiler push

Examples:

# Single-depot folder override
boiler push ./build

# One-off upload without config
boiler push ./build --app 480 --depot 481

# Add a build description
boiler push ./build --desc "v1.2.0 release"

# Set a branch live after upload
boiler push ./build --set-live beta

# Preview VDF output without upload
boiler push ./build --dry-run

# Force all depots (skip changed-depot detection)
boiler push --all-depots

# Strict content hashing for change detection
boiler push --content-hash

# Download SteamCMD from Valve if needed
boiler push --install-steamcmd

Push flags:

| Flag | Description | | --- | --- | | --app <id> | Steam App ID (overrides config) | | --depot <id> | Steam Depot ID (overrides config) | | --desc <text> | Build description shown in Steamworks | | --set-live <branch> | Sets uploaded build live on a branch | | --dry-run | Prints generated VDF without uploading | | --all-depots | Uploads all configured depots | | --content-hash | Uses strict content hashing (slower, safer) | | --install-steamcmd | Downloads SteamCMD from Valve if it is missing |

Important behavior:

  • If --desc is omitted, a timestamp-based description is generated.
  • Transient SteamCMD failures are retried up to 3 times with exponential backoff.
  • Changed-depot detection uploads only depots with changes unless --all-depots is set.
  • Set BOILER_CONTENT_HASH=1 to enable strict content hashing by environment variable.
  • For multi-depot configs, folder override is blocked to prevent accidental wrong uploads.
  • boiler will not auto-download SteamCMD unless you explicitly pass --install-steamcmd.

boiler status

boiler status
boiler status --json

Shows:

  • depot mapping summary
  • output/artifact paths
  • SteamCMD path detection
  • saved username
  • cached login state
  • last upload details

boiler doctor

boiler doctor
boiler doctor --json
boiler doctor --json --strict

Checks:

  • project config validity
  • depot content roots
  • SteamCMD availability
  • saved username
  • cached Steam login

boiler help [command]

boiler help
boiler help push

boiler (no args)

Running boiler with no args opens an interactive menu for login, init, push, status, and doctor.

Project Config (.boiler.json)

boiler init creates a .boiler.json like this:

{
  "appId": 480,
  "depots": [
    {
      "depotId": 481,
      "contentRoot": "./build",
      "fileMappings": [
        {
          "localPath": "*",
          "depotPath": ".",
          "recursive": true
        }
      ],
      "fileExclusions": ["*.pdb", "*.map", ".DS_Store", "Thumbs.db"]
    }
  ],
  "buildOutput": ".boiler-output",
  "setLive": null
}

Notes:

  • This file is safe to commit.
  • buildOutput is where generated VDFs and upload artifacts are written.
  • setLive is used by default for push unless overridden by --set-live.
  • Legacy configs with single fileMapping are still read, but new configs should use fileMappings.

If a depot needs multiple Steam FileMapping entries:

{
  "depotId": 481,
  "contentRoot": "./build",
  "fileMappings": [
    { "localPath": "*", "depotPath": ".", "recursive": true },
    { "localPath": "extras/*.dll", "depotPath": "./bin", "recursive": false }
  ],
  "fileExclusions": ["*.pdb"]
}

CI / Automation

Typical CI flow:

boiler doctor --json --strict
boiler login --non-interactive --install-steamcmd
boiler push

Recommended environment variables:

export BOILER_USERNAME=buildbot
export BOILER_PASSWORD=super-secret
export BOILER_NON_INTERACTIVE=1

If Steam Guard code entry is required in CI:

export BOILER_GUARD_CODE=123456

SteamCMD Behavior

boiler requires SteamCMD to upload builds.

If SteamCMD is not found, boiler stops by default and asks you to install it manually or rerun with --install-steamcmd. If SteamCMD is already installed, boiler checks your PATH, common install locations, and its own managed install directory.

Security

  • Passwords are never stored by boiler.
  • Only the Steam username is saved in global config.
  • SteamCMD handles its own credential caching.
  • For automation, use a dedicated Steam account instead of a personal account.

Global config location:

~/.boiler/config.json

Development

git clone https://github.com/your-username/boiler.git
cd boiler
npm install
npm run build
npm run dev -- --help
npm test

License

MIT