# 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 product changelog on the Openship website.
- Toggles for **Automatic updates** (desktop only) and **Update & security notifications**.

## 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.

<Callout title="Desktop 0.8.0 and 0.8.1: manual update required once" type="warn">
If the updater reports **"Redirect was cancelled"**, download the fixed **0.8.2 or
newer** installer from [GitHub releases](https://github.com/oblien/openship/releases).
Quit Openship and replace the application without deleting its application data.
Your local projects, servers and settings are preserved. Critical advisories use
the same downloader, so marking an update critical does not repair these older
installed versions. Server/CLI updates are unaffected by this desktop bug.
</Callout>

<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.

</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
updates the CLI — which bundles the API server — to the latest release.

<Steps>

<Step>

### Run the update command

```bash
openship update
```

Openship checks GitHub, and if there's a newer version it updates itself in place. If you used the
**install script** (the default), it re-downloads the checksum-verified release bundle and swaps it in —
refreshing the Node runtime first if a release ever needs a newer one. If you installed the **npm package**
instead, it reinstalls with your package manager (**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>

Installed the npm package? Force a specific package manager if you need to (ignored for install-script
installs, which always update from the verified release bundle):

```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.

## Troubleshooting

<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` either re-downloads the verified release bundle (install-script installs) or reinstalls
the global package with bun or npm. If that step errors, it prints the exact command to run by hand — copy
it and run it yourself. Then restart with `openship up`.
</Callout>

<Callout title="The update stopped, naming POSTGRES_PASSWORD or BETTER_AUTH_SECRET" type="error">
A Compose install keeps its generated secrets only in `~/.openship/compose/.env`. If an update can't read that
file while the database volume is still present, it stops **without changing anything** rather than generating
values that couldn't work — most often because it ran as a different user (`sudo` reads `/root/.openship`). Re-run
as the user that owns the install, or restore the file (the previous one is kept at `.env.bak`). Full steps:
[Troubleshooting → openship up refuses to regenerate secrets](/docs/troubleshooting#symptom-openship-up-refuses-to-regenerate-secrets).
</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>

## Related guides

<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>
