The modern way to play StarCraft 1. https://shieldbattery.net
  • TypeScript 63.9%
  • Rust 33.6%
  • PLpgSQL 0.6%
  • JavaScript 0.6%
  • HTML 0.5%
  • Other 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
ExcalZ 6a1c7a035a
Add a Watch action to linked game cards that plays the game's replay. (#1857)
* Add a Watch action to linked game cards that plays the game's replay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep a game's replay from starting twice, and download it from a fresh URL.

Watching from a link card, side panel or context menu now shares one per-game in-flight flag, so
repeat presses can't quit and relaunch StarCraft. A replay missing from the local cache is
downloaded via a refetched game, since a signed URL held from earlier in the session can expire.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 14:11:21 +01:00
.claude/skills Document the harness's live tick shapes in the soak skill. 2026-10-27 02:13:39 -07:00
.github Simplify CI error reporting and skip documentation-only changes (#1853) 2026-10-30 17:20:41 +01:00
.vscode Format with oxfmt instead of Prettier. 2026-09-23 13:46:16 -07:00
app Minimize the app window on its way to the tray. 2026-10-30 22:50:19 -07:00
assets Add new splash screen content (only visible on the web version). 2025-05-31 02:18:41 -07:00
build-plugins Update client setup and session handling. 2026-10-25 01:16:02 -07:00
client Add a Watch action to linked game cards that plays the game's replay. (#1857) 2026-10-31 14:11:21 +01:00
common Prefer the high-performance GPU for StarCraft while we run it. 2026-10-27 14:17:11 -07:00
deployment Improve client session handling. 2026-10-26 02:02:49 -07:00
docs Improve client session handling. 2026-10-26 02:02:49 -07:00
email Format with oxfmt instead of Prettier. 2026-09-23 13:46:16 -07:00
game Take the mouse as raw input during fullscreen play. 2026-10-30 23:21:01 -07:00
integration Update client setup and session handling. 2026-10-25 01:16:02 -07:00
migrations Catch points up to each player's rating and re-space divisions (#1819) 2026-10-27 02:11:45 +01:00
server Add a Watch action to linked game cards that plays the game's replay. (#1857) 2026-10-31 14:11:21 +01:00
server-rs Improve client session handling. 2026-10-26 02:02:49 -07:00
tools Fix macos compatibility. 2026-10-25 23:42:11 -07:00
typings Improve client session handling. 2026-10-26 02:02:49 -07:00
.dockerignore Compile TS server code ahead of time for production (instead of using babel-register). (#1394) 2026-08-02 22:26:36 -07:00
.editorconfig Send the game results to the server on game end. (#539) 2020-12-19 15:33:09 +01:00
.gitattributes Don't assume all filetypes are text. 2025-08-27 12:48:24 -07:00
.gitignore Recommend the project's VSCode extensions from .vscode/extensions.json. 2026-09-23 13:45:31 -07:00
.oxfmtrc.json Format with oxfmt instead of Prettier. 2026-09-23 13:46:16 -07:00
.oxlintrc.json Upgrade JS deps. (#1585) 2026-09-23 20:56:18 -07:00
.tokeignore 2025 Design Refresh (#1141) 2025-03-13 01:27:20 -07:00
AGENTS.md Remove decorative looping animations and video autoplay. 2026-10-26 22:16:35 -07:00
deploy.bat Add a Dockerfile for server-rs and add it to the deployment script. Also adjusts the ordering of things for better layer caching in the original Dockerfile. 2023-08-23 21:53:32 -07:00
docker-compose.yml Upgrade postgres/redis versions. [DEVELOPER WORKFLOW CHANGE] 2025-04-08 16:50:42 -07:00
Dockerfile Fix publishing assets to DO Spaces (was failing a cert check). 2026-08-09 02:17:46 -07:00
Dockerfile.base Move server container images off Alpine to Debian bookworm-slim 2026-06-29 01:53:31 -07:00
download-fonts.ts Add an emoji and text art picker to the chat input (#1410) 2026-09-02 13:09:29 +02:00
graphql-codegen.ts Format with oxfmt instead of Prettier. 2026-09-23 13:46:16 -07:00
i18next.config.mjs Add nicer ingame UI. (#1730) 2026-10-17 15:15:39 -07:00
icon.ico Update colors in the various logos/lockups to new color palette. I think I got everything. 2025-05-08 00:11:22 -07:00
index.html Move the web client build to Vite. 2026-08-02 06:02:46 -07:00
LICENSE Add a LICENSE file. 2017-01-15 18:59:33 -08:00
local-dev.json Move Electron app build to Vite. (#1393) 2026-08-02 19:11:02 -07:00
package.json Version 12.3.6. 2026-10-27 23:37:39 -07:00
playwright.config.ts Fix tests for real (fix viewport size across all tests, social sidebar only has a higher z-index when in overlay mode). 2025-04-29 15:57:31 -07:00
pnpm-lock.yaml Upgrade JS deps and prune aged-out quarantine exclusions. 2026-10-21 02:13:53 -07:00
pnpm-workspace.yaml Upgrade JS deps and prune aged-out quarantine exclusions. 2026-10-21 02:13:53 -07:00
prod.yml Make packaging step more efficient. 2026-10-25 01:54:23 -07:00
README.md Fix macos compatibility. 2026-10-25 23:42:11 -07:00
rolldown.app.config.ts Minify the app's production main-process bundle. 2026-10-25 17:19:08 -07:00
run-integration-tests.bat Run development-mode TypeScript through swc-node instead of babel-register. (#1395) 2026-08-03 00:24:07 -07:00
sample.env Implement rollback netcode. (#1657) 2026-10-06 01:46:56 -07:00
schema.graphql Add account permissions for development clients. 2026-10-25 01:16:02 -07:00
staging.yml Make packaging step more efficient. 2026-10-25 01:54:23 -07:00
tsconfig.json Move the web client build to Vite. 2026-08-02 06:02:46 -07:00
tsdown.server.config.ts Run development-mode TypeScript through swc-node instead of babel-register. (#1395) 2026-08-03 00:24:07 -07:00
typeshare.toml Unify the two maps reducers we had into one. (#1192) 2025-07-14 17:45:08 +02:00
vite.config.ts Show third-party licenses for the client, app, and game. 2026-10-17 20:33:57 -07:00
vite.electron.config.ts Show third-party licenses for the client, app, and game. 2026-10-17 20:33:57 -07:00
vite.shared.ts Badge channel owners and moderators in the member list and on messages. (#1573) 2026-09-28 14:31:05 +02:00
vitest-client-setup.ts Mark canceled animations' finished promises handled in client tests. 2026-10-21 02:51:16 -07:00
vitest-global-setup.ts Move to vitest instead of jest so we can get proper ESM support and use ESM-only modules (Node has supported require()ing ESM since 22.12, but jest was still failing for this). 2025-06-12 00:48:40 -07:00
vitest.config.ts Run development-mode TypeScript through swc-node instead of babel-register. (#1395) 2026-08-03 00:24:07 -07:00

ShieldBattery

The modern way to play StarCraft 1.

ShieldBattery is a custom server and launcher client for StarCraft: Remastered, adding many features and improvements while utilizing the real game client for gameplay. It is a community-run project under active development, with new features added all the time!

https://shieldbattery.net

Discord

The ShieldBattery developers frequent the Discord server at the link below, feel free to stop in with questions, comments, or just to hang out!

https://discord.gg/S8dfMx94a4

Localization/Translation

If you'd like to assist with translating our application into other languages, please reach out to us in our Discord! We use an external application for managing this process which can be found here. Registering to contribute translations requires approval.

Developer setup

See our getting started guide for information on initial developer setup.

Developer workflow

Running the server

pnpm run start-server

The server will automatically rebuild the necessary client JavaScript files as they change. If you make changes to the server files, you'll need to restart the server manually.

Running the standalone application

The standalone has two development components: a development server that rebuilds and hot-reloads client JavaScript files, and the Electron application itself (that loads and uses these files). Both must be running for things to work correctly.

To run the development server, use:

pnpm run dev

To run the app, use:

pnpm run app

This setup will automatically rebuild and reload for any client changes you make. If you make changes to things in the app folder, you'll need to close and restart the app (using the above command) for them to take effect.

Running multiple instances of the standalone application

To test the multiplayer aspect of the project, whether that's in the application or in an actual game, you can start multiple instances of the application with the different sessions by using the SB_SESSION environment variable. By default, the name of the session is simply session. So if you want to start an additional instance of the standalone application, you can set the environment variable SB_SESSION to anything other than the default name in a new console window. Eg., on Windows:

set SB_SESSION=session1

Note that ShieldBattery supports multiple instance of StarCraft running at the same time, so you can even start a game with two different accounts if you need to test something in the game.

Running the game

In order to actually run the game through the standalone application, you need to ensure that you successfully built the Rust code as explained in the getting started guide.

Project structure

The ShieldBattery project is broken down into several big pieces, located in these folders:

  • app: the standalone Electron application (main process)
  • client: all of the client-side code which is used by the standalone application and the website client
  • game: Rust code related to the game
  • server: the server-side code including all the HTTP API handlers and WebSocket API handlers
  • server-rs: a Rust-based GraphQL server used for some APIs

There are also some other important folders:

  • assets: contains source assets for our graphics
  • common: code that is shared between app, client, and server
  • integration: contains end-to-end tests for the client + server together (run with run-integration-tests.bat)

License

ShieldBattery code is generally licensed under MIT. Some assets and third-party components have their own license notices, which are available next to those assets in this repository.