Quick Start

A Launchfile describes what your application needs to run. Create a file called Launchfile (no extension) in your project root:

Minimal example

Three fields and a start command — the simplest possible Launchfile:

name: my-app
runtime: node
commands:
  start: "node server.js"

Adding a database

Declare what your app needs. The platform figures out how to provide it:

name: my-app
runtime: node
requires:
  - type: postgres
    set_env:
      DATABASE_URL: $url
commands:
  start: "node server.js"
health: /health

The $url expression is resolved at deploy time — the platform provisions Postgres and injects the connection URL into your environment.

Validate with the SDK

Use the TypeScript SDK to parse and validate your Launchfile:

import { readLaunch, validateLaunch } from "launchfile";

const app = readLaunch(`
  name: my-app
  runtime: node
  requires: [postgres]
  commands:
    start: "node server.js"
`);

const result = validateLaunch(app);
if (!result.success) {
  console.error(result.error.issues);
}

Run it

Launchfile has two modes: Docker for quick, self-contained runs, and native macOS for local development.

Docker (default)

Run any catalog app with one command — no source code needed:

npx launchfile up ghost
# Pulls Ghost + MySQL, wires everything, starts at http://localhost:2368

Ghost starts with MySQL, health checks, and persistent storage — all from pre-built images. When you're done:

npx launchfile down --destroy
# Removes all containers and volumes — 100% clean

Native macOS (for development)

For local development, clone a repo and run natively — databases via Homebrew, runtimes via version managers, no containers:

git clone https://github.com/TryGhost/Ghost
cd Ghost
npx launchfile up --native
# Installs Node via fnm, MySQL via Homebrew, runs Ghost from source

Now try it with your own app — create a Launchfile in your project root, then run npx launchfile up.

Next steps

esc
Type to search the docs