Skip to content

Local Development Guide

This guide walks through building and running the full Dropzone stack locally, end-to-end.

Prerequisites

  • Bun installed and on your PATH
  • Inno Setup installed (iscc on PATH) — needed for the installer
  • Docker Desktop — needed only if you want to run the webapp

Install all workspace dependencies from the repository root:

sh
bun install

Architecture

The stack has three applications that work together:

Webapp (optional)         Daemon                    Launcher
─────────────────         ──────                    ────────
Web UI for browsing       Desktop app that          Updater that downloads
and managing mods.        manages installations     and runs the correct
Runs in Docker or         and serves a local        version of the Daemon.
standalone.               API + webview UI.         Shipped via the installer.

localhost:3000            localhost:56499            Runs on demand

The Launcher downloads the Daemon archive from a release server (locally: http-server on port 8081), unpacks it, and starts it. The Daemon then runs and optionally communicates with the Webapp.

Step-by-step: Full local build and run

1. Build the Daemon

Compile the Daemon into a standalone binary and release archive (dcs-dropzone.tar):

sh
cd apps/daemon && bun run build

This runs apps/daemon/scripts/build.ts which:

  • Compiles apps/daemon/src/index.ts into apps/daemon/dist/Dropzone.exe
  • Bundles helper binaries (wget, 7za) into dist/
  • Packages everything into apps/daemon/dist/dcs-dropzone.tar with a .manifest file

2. Serve the Daemon build locally

The Launcher expects to download the Daemon archive from a URL. Locally, this is served with http-server on port 8081:

sh
cd apps/daemon && bun run build:serve

This runs npx http-server ./dist -p 8081 inside apps/daemon/, making the archive available at:

  • http://localhost:8081/dcs-dropzone.tar
  • http://localhost:8081/dcs-dropzone.tar.manifest

Keep this terminal running — the Launcher will fetch from it.

3. Build the Launcher

In a new terminal, compile the Launcher into a standalone executable:

sh
cd apps/launcher && bun run build

This compiles apps/launcher/src/index.ts into apps/launcher/dist/Dropzone_Launcher.exe. By default the build uses the local environment config (pointing DZ_LAUNCHER_RELEASE_TAR_PATH at http://localhost:8081/). To build for production, set DZ_TARGET_ENV=prod which switches to the production URLs from apps/launcher/scripts/_env.ts.

4. Build the Setup Installer

Package the Launcher into a Windows installer using Inno Setup:

sh
iscc apps/launcher/installer.iss

This outputs apps/launcher/dist/Dropzone_Setup.exe.

5. Run the Setup

Run apps/launcher/dist/Dropzone_Setup.exe. The installer will:

  • Let you choose an install directory (default: %LOCALAPPDATA%\DCSDropzone)
  • Copy Dropzone_Launcher.exe into the install directory
  • Create Start Menu and (optionally) desktop shortcuts with the working directory set to the install path

6. Launch

Run DCS Dropzone from the Start Menu or desktop shortcut. The Launcher will:

  1. Fetch the manifest from http://localhost:8081/dcs-dropzone.tar.manifest
  2. Download dcs-dropzone.tar if the version has changed (or it is the first run)
  3. Unpack the Daemon into a versioned subfolder inside the install directory
  4. Start Dropzone.exe (the Daemon)

The Daemon serves its API at http://localhost:56499 and opens a webview.

Webapp (optional)

The webapp is not required for the Daemon or Launcher to work. It provides the web-based mod browsing UI. If you want to test with it running:

From the webapp directory, spin up the webapp and its MongoDB dependency:

sh
cd apps/webapp
docker compose up --build

Or from the root using the start script:

sh
bun run --filter webapp start

This builds the webapp in a Docker container and starts it alongside MongoDB. The webapp will be available at http://localhost:3000.

Alternative: Development mode

If you want hot-reload for webapp development:

sh
bun run webapp:dev

This starts MongoDB via Docker Compose and runs the webapp with bun --hot. You need Docker running for the MongoDB container.

Environment configuration

Configuration is defined as typed TypeScript objects inside each app's scripts/ directory — there are no .env files. Each app exports named environment configs that the build/dev/test scripts import directly:

AppConfig fileExported configs
Daemonapps/daemon/scripts/_env.tsenvLocalDev, envLocalTest, envLocalBuild, envProdBuild
Webappapps/webapp/scripts/_env.tsenvLocalDev, envLocalTest, envLocalBuild, envProdBuild
Launcherapps/launcher/scripts/_env.tsenvLocalBuild, envProdBuild

The target environment is selected via the DZ_TARGET_ENV environment variable (values: local | prod, default: local), handled by scripts/_target-env.ts at the repo root:

  • bun run dev — always uses the local dev config.
  • bun run build — uses local config by default; set DZ_TARGET_ENV=prod for production.
  • bun run tests — always uses the local test config.

To override individual values at runtime, set them as actual environment variables before running the script — the scripts merge process.env on top of the config object, so any variable already present in the environment takes precedence.

Quick reference

CommandWhat it does
cd apps/daemon && bun run buildBuild the Daemon binary + release archive
cd apps/daemon && bun run build:serveServe the Daemon archive on http://localhost:8081
bun run daemon:devRun the Daemon in watch mode (no compile, direct from source)
cd apps/launcher && bun run buildBuild the Launcher executable (local config by default)
DZ_TARGET_ENV=prod cd apps/launcher && bun run buildBuild the Launcher with production URLs
iscc apps/launcher/installer.issBuild the Windows installer with Inno Setup
bun run launcher:devRun the Launcher in watch mode
cd apps/webapp && bun run buildBuild the Webapp binary
bun run webapp:devRun the Webapp with hot-reload (needs Docker for MongoDB)
bun run --filter webapp startRun the Webapp + MongoDB in Docker Compose
bun run buildBuild everything (webapp, daemon, launcher)
bun run testsRun all tests