Keeps your apps running.

OxidePM is a process manager for Linux servers. It starts your apps, restarts them when they crash, keeps their logs and can bring them back after a reboot. You drive it from the command line. It is open source, written in Rust and licensed under MIT or Apache-2.0.

Not in the latest release (0.3.2)

The install command installs 0.3.2, the latest published release. The agent socket, audit log, dry runs, policy markers and adapters described on this site are not in that release, and the code that has them is not published yet. These pages describe what is coming. What 0.3.2 has and does not have.

curl -fsSL https://oxidepm.com/install.sh | sh
Read the docs first

Want to read the script before you run it? View install.sh. It installs the latest published release, 0.3.2.

Linux
the main platform
macOS
process manager only, untested; no adapters or sandbox
Windows
not supported

The same table as JSON: oxidepm status --json

Three ideas

Three ideas behind OxidePM

01

A small core that does one job

The daemon supervises processes. It starts your apps, restarts them with a growing delay, and stops restarting an app that is stuck in a crash loop.

Notifications and Prometheus metrics have already moved out of the core into adapters in the unreleased code. The web API, the dashboard, the language runtimes and the deploy tools are still built in today, and are planned to follow.

$ oxidepm status
╭────┬────────┬──────┬─────┬───┬─────────┬──────┬─────┬────────╮
│ id │ name   │ mode │ pid │ ↺ │ status  │ cpu  │ mem │ uptime │
├────┼────────┼──────┼─────┼───┼─────────┼──────┼─────┼────────┤
│  1 │ mailer │ cmd  │ -   │ 3 │ errored │ 0.0% │ 0B  │ 0s     │
╰────┴────────┴──────┴─────┴───┴─────────┴──────┴─────┴────────╯
$ oxidepm logs mailer --lines 3
[2026-10-31 04:11:47.153] cannot reach smtp
[2026-10-31 04:11:47.559] cannot reach smtp
[2026-10-31 04:11:48.362] cannot reach smtp
02

Adapters for everything else

Each adapter is a separate program. It talks to the daemon through a documented JSON-RPC protocol on its standard input and output, so you can write one in any language.

If an adapter crashes or hangs, the daemon drops it and carries on. The daemon never stops or restarts an app because an adapter failed.

# daemon and notifier, protocol 1 (version numbers are examples)
daemon: {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocols":[1],"host":{"name":"oxidepmd","version":"0.4.0"},"adapter":{"name":"notifier","version":"0.1.0"},"kind":"service","grant":{"level":"read","scope":"all"},"paths":{"state":"/home/u/.oxidepm/adapters/state/notifier"},"limits":{"max_line":262144,"max_in_flight":32,"event_queue":1024}}}
adapter: {"jsonrpc":"2.0","id":1,"result":{"protocol":1,"name":"notifier","version":"0.1.0"}}
daemon: {"jsonrpc":"2.0","method":"initialized","params":{}}
daemon: {"jsonrpc":"2.0","method":"event","params":{"seq":17,"kind":"crashed","family":"lifecycle","at":"2026-10-30T10:00:00Z","app":{"id":3,"name":"web","tags":["prod"]},"data":{"exit_code":1,"restarts":2},"options":{"chat":"ops"},"dropped_before":4}}
If the adapter stops answering ping three times in a row, the daemon kills it and restarts it. The apps are not touched.
03

Safe to hand to an AI agent

The daemon decides who is asking from the connection a request arrives on, and a claim can only make a request stricter. An agent on the agent socket is held to limits: it can read everything, may only stop or restart apps you opened to it, and can never start, delete or flush.

Mark an app as protected and agents can't change it. Most commands that change something can be rehearsed with --dry-run, and what agents ask for is written to an audit log.

agent$ oxidepm stop web --dry-run
ℹ︎ Dry run of 'stop': this is what would happen. Nothing was changed.
  stop  web [step 0]  status running

agent$ oxidepm restart db
✗ ai:assistant may not restart protected app(s): db. A protected app is read-only for anything but a person
Error: ai:assistant may not restart protected app(s): db. A protected app is read-only for anything but a person

agent$ oxidepm delete api
✗ ai:assistant may not make the request 'delete': it is a dangerous request. Ask a person to run it
Error: ai:assistant may not make the request 'delete': it is a dangerous request. Ask a person to run it
The core

What it does out of the box

Everything on this sheet ships in the core. Nothing here needs an adapter.

OxidePM core: featuresSheet 01
01

Daemon

Apps keep running after you close the terminal. save writes the list, resurrect starts it again, and startup writes a systemd or launchd unit for boot.

02

Crash restarts

A crashed app waits, then restarts with a delay that doubles up to a cap. More than 15 restarts in 10 minutes end it as errored, until a person starts it.

03

depends_on

An app waits until the apps it names are running, and fails closed if they never are (60 seconds by default). stop all stops dependents first.

04

Process groups

Each app runs in its own process group, and stopping the app signals the whole group. A child that starts its own session or detaches itself is not in it.

05

Clean environment

Apps don’t inherit the daemon’s environment. They get PATH, HOME and a few basics, plus what you pass with --env or env_file.

06

Health checks

HTTP, TCP or a script of your own.

07

Limits

Restart an app when it passes a memory or uptime limit.

08

Cron restarts

Restart an app on a cron schedule (UTC).

09

Clusters

Run up to 256 instances of one app. Instance i gets port port + i.

10

Logs

Captured per app and rotated by size (10 MB and 5 files by default). Gzip compression of rotated files is optional.

11

Scripting

--json output, and --dry-run on most commands that change something.

12

Adapter checks

An adapter is checked against a SHA-256 before it is installed, shows what it asks for before it can be enabled, and on Linux runs under Landlock and seccomp.

Errors carry stable E_… codes on the daemon socket, in the audit log and in the adapter protocol.

Limits

What it doesn't do

You should know these before you install it.

Windows
Not supported.
macOS
The process manager is built for it but not tested there. Adapters, the sandbox and recovery of orphaned apps are Linux only.
Reload
There is no zero-downtime reload. A reload is a restart.
File watching
Not available yet. --watch is refused.
Sandbox
It limits the damage a buggy adapter can do. It does not fully contain a hostile one. That is why every adapter is hash-checked and shows what it asks for before you enable it. Details.
Adapters

Add only what you need

Each adapter is hash-checked before it is installed. You see what it asks for, and you approve it, before it runs.

deploy@srv-01:~1 of 3
$ oxidepm adapter list
No adapters are installed. `oxidepm adapter list --available` shows what the index offers.
$ oxidepm adapter list --available
Error: no index is configured in this build. Import by a pinned hash (`oxidepm adapter import <file or url> --sha256 <hex>`) or from the bundle of a release (`oxidepm adapter import --bundled`)

Example output from a local build of the adapter. The hashes are those of that build, and the archive is not published yet.

Built

  • notifier
  • exporter-prometheus

Coming later

  • ui-web
  • ui-tui
  • runtime-node
  • runtime-python
  • runtime-go
  • runtime-rust
  • check
  • init
  • git-start
  • deploy
  • watch-rebuild
  • AI adapters

Browse all adapters Write your own