# Updating Openship
URL: https://openship.io/docs/guides/updating.md

Keep your Openship up to date — the one-click desktop updater, the CLI update command, and how the always-on service picks up a new release.

import { Step, Steps } from 'fumadocs-ui/components/steps';

New versions of Openship come out from time to time — bug fixes, new features, the occasional security
patch. Updating is how you get them. Think of it like the update button on your phone: Openship checks
whether there's a newer version, and if there is, it swaps the old one out for the new one.

Openship gets these updates in one place only: the project's **public GitHub releases**. It **pulls** that
information — it asks GitHub "is there anything newer?" Nothing is ever pushed to your install, and no
Openship-run server can reach in and change your app. You stay in control of when (and whether) you update.

<Callout title="Good to know">
- **Automatic updates are off by default.** Openship tells you when an update exists; it doesn't install
  it behind your back (the desktop app can, if you turn that on).
- **Where it all lives:** the dashboard shows update status under **Settings → Instance → Updates**.
- This only appears for people who run their own Openship — the **desktop app** and **self-hosted servers**.
  On Openship Cloud there's nothing for you to update; we handle it.
</Callout>

## Where updates live

Open **Settings** and choose the **Instance** tab. Scroll to the **Updates** section. It shows:

- Which version you're on now, and whether a newer one exists — either **"You're on the latest version"**
  or **"Openship _x.y.z_ is available"**.
- A **Check now** button to ask GitHub again right away (Openship also checks on its own).
- A **View changelog & releases** link that opens the release notes on GitHub.
- Toggles for **Automatic updates** (desktop only) and **Update & security notifications**.

<Callout title="Screenshot">Settings → Instance tab, the **Updates** section showing the current version, the "Check now" button, and the toggles. *(screenshot pending)*</Callout>

## Updating

How you update depends on how you run Openship. Pick your case.

<Tabs items={["Desktop app", "Self-hosted server (CLI)"]}>

<Tab value="Desktop app">

The desktop app updates itself — you just say yes.

<Steps>

<Step>

### Wait for the update notice

When a new version is out, a notice slides in at the **top of the dashboard**: *"Openship _x.y.z_ is
available."* It sits just above the page, so you don't have to go looking for it.

<Callout title="Screenshot">The update notice at the top of the dashboard with an **Update now** button. *(screenshot pending)*</Callout>

</Step>

<Step>

### Press Update now

Click **Update now**. The notice turns into a progress bar and shows **"Downloading Openship _x.y.z_"**
with a percentage as it pulls the new version down.

</Step>

<Step>

### Let it restart

When the download finishes, the bar reads **"Installing — Openship will restart"**. The app replaces itself
with the new version and reopens on its own. That's it — you're on the new release. 🎉

</Step>

</Steps>

<Callout title="Want it hands-free?" type="info">
In **Settings → Instance → Updates**, turn on **Automatic updates** and the desktop app will download and
install new releases for you, without waiting for a click. It's off by default so you decide when your app
changes.
</Callout>

</Tab>

<Tab value="Self-hosted server (CLI)">

A self-hosted server (installed with the CLI) updates from the terminal. The `openship update` command
reinstalls the CLI — which bundles the API server — at the latest release.

<Steps>

<Step>

### Run the update command

```bash
openship update
```

Openship checks GitHub, and if there's a newer version it reinstalls itself with your package manager
(it uses **bun** if you have it, otherwise **npm**). If you're already current, it just says so and stops.

</Step>

<Step>

### Restart the service on the new version

Updating swaps out the files, but the server that's already running keeps running the old version until you
restart it. Bring it up again:

```bash
openship up
```

This restarts the persistent service on the new release and fetches the matching dashboard automatically.

</Step>

</Steps>

<Callout title="Just want to know if there's an update?" type="info">
Check without changing anything:

```bash
openship update --check
```

It tells you your current version and whether a newer one is available — then exits. It installs
nothing.
</Callout>

Force a specific package manager if you need to:

```bash
openship update --via npm    # or: --via bun
```

</Tab>

</Tabs>

## About the always-on service

If you started Openship with `openship up`, it runs as a **persistent service**: it starts again when the
machine reboots and restarts itself if it ever crashes. That keeps your apps online.

What it does **not** do is change versions on its own. It keeps running whatever version it started with, so
after `openship update` you re-run `openship up` to restart it on the new release (and `openship stop` to
take it down). See [Installation](/docs/getting-started/installation) for the full service commands.

## If something goes wrong

<Callout title="“Could not reach GitHub to check for updates”" type="warn">
Openship pulls updates straight from GitHub, so the check needs internet access — and GitHub limits how
often an address can ask. Wait a moment and press **Check now** again, or run `openship update` later. If it
keeps failing, reinstall by hand with the same install method you used originally (see
[Installation](/docs/getting-started/installation)).
</Callout>

<Callout title="The CLI update failed partway" type="error">
`openship update` reinstalls the global package with bun or npm. If that step errors, it prints the exact
reinstall command to run by hand — copy it and run it yourself. Then restart with `openship up`.
</Callout>

<Callout title="I updated but still see the old version" type="warn">
The running server hasn't been restarted yet. On a self-hosted server, run `openship up` again to restart on
the new version. On the desktop app, fully quit and reopen it if it didn't relaunch on its own.
</Callout>

## What next?

<Cards>
  <Card title="Installation" href="/docs/getting-started/installation" description="Every way to install Openship — and the full openship up / stop service commands." />
  <Card title="How Openship runs your apps" href="/docs/architecture/runtime-model" description="What the persistent service actually does behind the scenes." />
  <Card title="Roll back or redeploy" href="/docs/guides/rollback-redeploy" description="Undo a bad deploy or ship the same code again." />
</Cards>
