Harthelm Docs
Getting started

Quickstart

Create a workspace, describe a small app in harthelm.yml, Sync, Run and open it. About five minutes.

Last updated 2026-10-19

You build a web server without dependencies, describe it in harthelm.yml and run it on your workspace's dev URL. You need nothing but a browser.

Before you start

  • You can sign in to your Harthelm installation's console and you are a member of a team. If you have an invitation mail, accept it first; the tutorial shows how.
  • <id> below is the number of your workspace, and <workspace domain> the domain of your installation's dev URLs.

Create a workspace

On Workspaces of your team, click Create workspace and fill in the dialog:

  • Start from: Empty.
  • Name: hello.
  • Base image and IDE plan: keep the preselected ones.
  • Availability: Sleeps when idle. The workspace sleeps when nobody uses it and wakes when you open it.
  • Visibility: Private. Only members of your team can open its URLs.

Click Create workspace. The console opens the workspace; after a few seconds to about a minute the editor appears and the status bar says "Workspace is running".

Write a small app

Every workspace has mise, which installs Node.js for you. In the terminal panel at the bottom, click Open a terminal; it opens in /data/app. Create the two files of the app:

Terminal
cd /data/app
printf 'node 22\n' > .tool-versions
cat > server.js <<'EOF'
const http = require("node:http");
const port = Number(process.env.PORT || 3000);
http
  .createServer((req, res) => {
    res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
    res.end(`<h1>Hello from Harthelm</h1><p>Workspace ${process.env.HART_WORKSPACE_ID}, path ${req.url}</p>`);
  })
  .listen(port, () => console.log(`listening on ${port}`));
EOF

Describe the landscape

harthelm.yml tells Harthelm how to prepare your code and which services run it. Create it in /data/app, next to server.js:

harthelm.yml
schema: harthelm/v1

prepare:
  - name: Install Node
    run: mise install node@22

services:
  web:
    type: steps
    steps:
      - name: Serve
        run: node server.js
    env:
      PORT: 3000
    ports:
      - port: 3000
        routes:
          - path: /
    health:
      port: 3000
      path: /

The prepare stage installs Node once, before the services run. The service web runs node server.js; its port 3000 gets the route / of the dev URL, and Harthelm counts it as ready once / answers. The editor knows the file's schema: hover a key to read what it means. Every key is in the harthelm.yml reference.

Sync

Sync creates the services that harthelm.yml describes.

Click Run panel on the workspace's left rail, then Sync. The dialog Review changes lists web under "To add" with its plan, CPU and memory, and the team quota after the Sync. Click Sync in the dialog. The panel says "In sync with harthelm.yml" when it is done.

Sync never starts anything

Sync creates, changes and removes services; Run starts them. After the Sync, web is listed but not running yet.

Prepare and Run

In the Prepare card of the Run panel, click Run all and wait until the step shows Succeeded. Then click Run at the top of the panel. web goes from Starting to Running with "1/1 replicas ready".

If web shows Failed, open its Logs: the output of node server.js says why. The most common cause is a skipped prepare; run it, then Run again.

Open the app

Click the link / in the row of web. A new tab opens the dev URL, https://<id>-3000.<workspace domain>/, and shows "Hello from Harthelm".

The dev URL is private: signed-in members of your team can open it, other visitors are sent to the sign-in. When nobody uses the workspace for a while (60 minutes by default), it sleeps; the next visit wakes it, and your files are kept.

Change something

Edit the text in <h1> in server.js, then Stop and Run the service in the Run panel and reload the app's tab. A change to harthelm.yml itself needs a Sync first; the Run panel says "harthelm.yml changed since the last Sync" until you do.

Next steps

On this page