# Desktop apps (Mac & Windows)

> ESTAGE builds real desktop applications from the same AI chat — run them on your own machine while you build, then hand out a signed .dmg or .exe installer people download.

Source: https://knowledge.estage.com/platform/desktop-apps/
Part of the ESTAGE knowledge base (https://knowledge.estage.com). Full corpus: https://knowledge.estage.com/llms-full.txt

---
**ESTAGE builds real desktop applications.** Describe what you want and Genesis builds a program
people **download and install** on macOS or Windows — with its own window, its own files, camera
and microphone, notifications, and a link they get it from.

It is the same chat and the same project underneath as a website — real pages, real routes, a real
codebase. What changes is the end product: not an address someone visits, but an app someone keeps.

## Starting a desktop app

Two ways in, depending on whether you already have a project:

- **A new project** — in the [ESTAGE Genesis desktop app](/workspace/desktop-app/), choose
  **New project** → **Desktop app**. In a browser the card is shown but locked, with a note saying
  to open Genesis in the desktop app: a desktop app runs on your own machine while you build it,
  and the Genesis desktop app is what runs it.
- **Next to an existing site or app** — open the project and use the **app switcher** in the
  builder header → **Add** → **Desktop app**. It appears beside whatever the project already holds,
  with its own chat, files, and settings — see [Apps inside a project](/platform/apps/).

The first time you publish, ESTAGE asks **which operating systems the app is for** — macOS,
Windows, or both. That answer is part of the app, not a build option: it decides which installers
get built, and the AI designs to those conventions (⌘-shortcuts and Mac window chrome, or
Ctrl-shortcuts and Windows chrome). Change it later in **Settings → Desktop app**.

:::note[The AI knows it is building an app, not a page]
A desktop project is described to the AI as an application: a sidebar, a toolbar, panels, real
tables, keyboard shortcuts, a layout that fills the window — not a hero section, a footer, or a
"Get started" landing page. You can still ask for anything you like; this is just the default it
starts from.
:::

## It runs on your computer, not in a preview pane

A desktop app needs a real window — with your camera, your files, your notifications. So instead
of a browser preview, the builder's canvas has one button: **Open on my computer**.

For that you need the [ESTAGE Genesis desktop app](/workspace/desktop-app/) installed and signed
in on the machine you are working at. Then:

1. Press **Open on my computer**. Your project is copied to that machine, its dependencies are
   installed, and it opens in a real window.
2. Keep working in the chat. Every change reaches the window in a couple of seconds, without
   restarting it.
3. **Stop** closes it; pressing the button again brings the window back to the front.

You do **not** need Node, a package manager, or any developer tooling — the desktop app carries
everything it needs. The first start takes a little longer while dependencies install; after that
it is seconds.

If something goes wrong, the panel says what phase it stopped at and can show the log. When the
problem is in your project's own code — a missing dependency, a crash on start — an **Ask AI to
fix this** button hands it straight to the chat.

## What a desktop app can do that a web page cannot

The AI wires these for you; you ask for the outcome, not for an API.

| Ask for | What the app gets |
| --- | --- |
| *"let them open a file from their computer"* | A real **file dialog**, and the file's contents |
| *"save the report to their machine"* | A real **save dialog**, saved where they chose |
| *"remember their settings"* | Storage that lives with the app and **survives updates and reinstalls** |
| *"tell them when the import finishes"* | An **operating-system notification**, even when the window is behind others |
| *"open our help site"* | The link opens in their **real browser**, not inside the app |
| *"a proper title bar with a fullscreen button"* | **Window controls** — minimise, maximise, close, fullscreen |
| *"let them record / join a call / share their screen"* | **Camera, microphone and screen sharing**, with the picker handled for you |
| *"a video room people join from a link"* | A live room with a lobby, guests joining with no account — the same [live rooms](/live/) the platform runs |

:::caution[One rule about files]
An app can only read and write files the person **picked in a dialog** during that session, or
files inside the app's own data folder. There is no way to hand it a path and have it read
somewhere else. That boundary is deliberate — it is what keeps "customise my app" from turning
into "read my keys".
:::

## Handing it to someone else

When it is ready, build an installer. In the desktop panel, **Give it to someone else → Build
installer** (or the **Publish** button in the header) opens a short wizard:

1. **Platforms** — macOS (`.dmg` for Apple Silicon, optionally also Intel) and/or Windows
   (`.exe` installer). **The build runs in ESTAGE's cloud — you don't need a Mac or a PC**, whichever
   you are on.
2. **Signing** — asked once, only for a Mac build, only if you haven't connected a certificate yet
   (see below). You can also build unsigned and add it later.
3. **Build** — a few minutes per platform, with live status. Mac and Windows build in parallel.

You end up with a **download page of your own**: `genesis.estage.com/d/<your project id>`. Send
that link to anyone — no ESTAGE account, no copy of your project, nothing to explain. The link
**stays the same across rebuilds** and always serves the latest build of each platform.

## Signing, so other people's computers open it

**macOS refuses to open an app that isn't signed.** An unsigned build works on your own Mac and
nowhere else, which is exactly the surprise you don't want after sending someone a file.

The app is signed with **your** Apple identity, not ESTAGE's — it is your app:

1. Get a **Developer ID Application** certificate in your Apple Developer account. This part has to
   happen in your own browser, on your own account — Apple only lets the account holder create one.
2. Export it from Keychain Access as a **`.p12`** file with a password.
3. Upload it once — in the publish wizard, or **Settings → Desktop app**. It is encrypted at rest,
   used only inside a build, and never shown again. Replace or remove it any time.

**Notarisation** is the second half: add your **App Store Connect key** in the same tab and Apple
checks each signed build, so it opens on any Mac with no warning at all. Without it, builds are
signed but still show a first-run prompt.

:::note[Windows]
Windows installers are **not code-signed yet**, so Windows shows an "unknown publisher" notice the
first time someone runs one. That is fine for your own team or testers; for a public download you
will want to wait for signed Windows builds.
:::

## Updating people who already installed it

Every build knows where it came from. An installed copy checks whether a newer build of that app
exists and offers the person an update, which sends them to your download page. Rebuild whenever
you like — there is no store, no review queue, and no waiting.

## What is different from a website

- **No domain, no SEO, no publishing to the web.** The app is distributed as an installer and a
  link. Custom domains, sitemaps, and page-level SEO belong to [websites](/workspace/publishing/).
- **No click-to-select visual editing.** The [visual editor](/visual-editor/) works on top of the
  in-browser preview, and a desktop app doesn't have one — it runs in its own window instead. You
  drive changes from the chat, and open the [code editor](/workspace/code-editor/) when you want to
  change a file by hand.
- **The `electron/` folder is protected.** That is the part of the app that talks to the operating
  system, and the AI does not edit it. If you need something the bridge doesn't cover — a tray
  icon, a global hotkey, launch-at-login — say so in the chat and you'll get a straight answer
  rather than a silent change.
- **The rest of the workspace is unchanged**: [pages and routes](/workspace/pages/),
  [version history and per-turn revert](/workspace/version-history/), settings, and team access all
  work the way they do on a site.

## Related

- [ESTAGE Genesis desktop app](/workspace/desktop-app/) — the app that runs your project on your machine
- [Apps inside a project](/platform/apps/) — how a Website, Web app, Mobile app and Desktop app share one project
- [Mobile apps](/platform/mobile-apps/) — the same idea for iOS and Android
