LegacyShell WikiLegacyShell Wiki
Back to LegacyShell
Home
Wiki
Plugins
Docs
Back to LegacyShell
Home
Wiki
Plugins
Docs
  • Documentation

    • Getting Started

      • What is LegacyShell?
      • Speed Setup
      • Requirements
      • Installation
      • First Run
      • Config Files
      • Making an Account
      • Troubleshooting (Getting Started)
    • Running a Server

      • Architecture Overview
      • The Database
      • Users and Ranks
      • Adding Game Servers
      • Client Mirrors
      • Perpetual
      • Backups
      • Rate Limiting
      • Moderation
      • Closed Mode
      • Deployment
      • Troubleshooting (Running a Server)
      • Hosting for Someone Else's Instance
    • Content Creation

      • Maps
      • Dealing with Babylon Models
      • Map Blocks
      • Items and Skins
      • Hats and Stamps
      • Sounds
      • Gamemodes
      • Seasonal Events
    • Plugin Development

      • Quickstart
      • I Want To...
      • Anatomy of a Plugin
      • Lifecycle
      • Dependencies
      • Events (Concept)
      • Event Reference

        • services: events
        • game: events — shared logic (src/shell/)
        • game: events — main-thread server process
        • game: events — per-connection client object
        • game: events — room lifecycle & tick loop
        • game: events — in-browser gameplay
        • client: events — client server & build pipeline
      • Commands
      • Client-Side Code
      • Static Assets
      • Content Packs
      • Networking
      • Workers and State
      • Prediction and Authority
      • Recipes

        • Recipe: Killstreaks
        • Recipe: New Pickup Item
        • Recipe: New Gamemode
        • Recipe: Custom Weapon
        • Recipe: UI Modification
        • Recipe: Discord Integration
        • Recipe: Replacing Core Behaviour
        • Recipe: Persistent Plugin Storage
        • Recipe: Rewarding Players with Currency
        • Recipe: Custom Per-Player Data
        • Recipe: Custom Theme
      • Publishing
      • Pitfalls
      • Modifiers
      • Sound and Apollo
    • Codebase Reference

      • Repo Layout
      • Shared Shell Layer
      • Server-Only Markers
      • The ss Object
      • Build Pipeline
      • Stamps and Babylons
      • Game Loop
      • Rooms and Workers
      • Wire Protocol
      • Generated

        • Wire Protocol Opcodes
        • Enums & Lookup Tables
        • Database Schema
        • Config Reference
        • Slash Command Reference
      • Services Internals
      • Catalog and Items
      • Permissions Internals
      • Physics and Collision
      • Known Quirks
      • Codebase Anecdotes
      • Development Timeline
    • Contributing

      • Documentation Style Guide
      • Generators
      • For AI Agents

First Run

Audience: Total newbies · Prereqs: Installation

Canonical source: src/scripts/perpetual.js, server-services/start-services.js, server-client/start-client.js, server-game/start-game.js

Starting everything

The simplest way to run LegacyShell is one command that starts all three servers at once:

npm run all

This runs the services, game, and client servers together in the background of one terminal. It's the right choice the first time you run LegacyShell, and fine for casual local use afterward. Once you want to actually watch each server's individual log output (recommended once you move past "does this work at all"), switch to running them in three separate terminals instead:

npm run services
npm run game
npm run client

(Order doesn't matter - each one waits for the others it needs.) Windows and macOS also have double-clickable launcher scripts at the repo root (windows_start_all.bat, osx_start_all.command, etc.) that do the same thing.

What you'll see

The very first time any server starts, it loads every plugin in plugins_default/ (about two dozen, bundled with LegacyShell) plus anything you've added to plugins/. This first boot can take noticeably longer than later ones - some bundled plugins declare their own npm dependencies (e.g. the autoshopnotifications plugin needs the easy-table package) which get installed automatically on first load if missing:

autoshopnotifications dependencies { 'easy-table': '^1.2.0' } true
[WARN] easy-table is not installed. Attempting to install (^1.2.0)...
added 4 packages, and audited 505 packages in 3s

This is normal and only happens once. When the services server finishes starting, you'll see a line like:

[SUCCESS] WebSocket server is running on ws://localhost:13371 in 4509ms

The game and client servers print their own similar "ready" messages once they've synced with services. Once all three say they're up, you're ready to play.

Opening the game

Go to http://localhost:13370 in your browser (assuming you kept the default port from Requirements/store/config/client.yaml).

You'll land on the normal Shell Shockers-style menu:

  • A Nickname field (top of the play panel) - you can play as a guest without an account.
  • A gamemode dropdown (Free For All, Teams, Timed variants, and LegacyShell's own extra modes like Scale Shift, Lifesteal, Apocalypse, and Parkour).
  • Create/Join buttons for private games.
  • A ▶ PLAY button to jump into a public match.
  • A Login button in the corner, which opens a combined login/register box with Username and Password fields and separate Login/Register buttons.

You can click ▶ PLAY right away without an account to confirm everything works end to end. To create a persistent account (needed for stats, inventory, and eventually admin access), see Making an Account.

Stopping the servers

If you used npm run all or the individual npm run <role> commands, Ctrl+C in that terminal stops them. On Unix-likes, npm run cn force-kills anything bound to ports 13370-13372 if a server didn't shut down cleanly (this doesn't work on Windows - use Task Manager, or the process list, to end any stuck node processes instead).

Next: Config Files to understand what you can tweak, or jump straight to Making an Account.


This page was drafted with AI assistance and reviewed for accuracy. If something looks wrong, please open a PR or flag it.

Edit this page on GitHub
Prev
Installation
Next
Config Files