Direct answers, no detours. Grouped by topic.
| Can I…? | Yes/No | Example / Note |
|---|
Spaces in --name | ✅ | --name "my api" |
Colon : in --name | ✅ | --name "TEST: Release 1" — address with ns:name |
Symbols # @ ! , ( ) + = & in --name | ✅ | --name "api (v2) #blue" |
Accents / emoji in --name | ❌ | ASCII only. Use app-espanol not app-español |
; " $ backtick ` | <>in—name` | ❌ |
| Name > 128 chars | ❌ | 128 limit |
Spaces in --namespace | ❌ | strict [a-zA-Z0-9._-], 64 chars |
Two processes with same ns:name | ❌ | ERR_CONFLICT |
Omit --name | ✅ | auto: <basename>-<shortid> |
| Rename a live process | ❌ | delete+recreate with new name |
| Can I…? | Yes/No | Example |
|---|
| Start and forget | ✅ | lynxpm start app.js --restart always |
| Stop all in a namespace | ✅ | lynxpm stop --namespace prod or lynxpm stop 'prod:*' |
| Stop / restart / delete every managed process | ✅ | lynxpm stop '*' (quote the glob) |
| Restart several at once | ✅ | lynxpm restart a b c |
| Reload spec without stopping process | ❌ | lynxpm reload does stop+start; no hot-reload of spec |
| Send custom signal | ❌ | only --stop-signal for stop; use kill -USR1 $(pidof app) |
| Scale without restarting | ✅ | lynxpm scale app 5 (respects running instances) |
| Scale down to 0 | ✅ | lynxpm scale app 0 = equivalent delete all |
Reset Restarts counter | ✅ | lynxpm reset app |
| Can I…? | Yes/No | Example |
|---|
| Infinite restart | ✅ | --restart always --max-restarts 0 (0 = no limit via env) |
| Exponential backoff | ✅ | --backoff expo (default) |
| Restart only on crash | ✅ | --restart on-failure (default) |
| Never restart | ✅ | --restart never |
| Stop on exit code X | ✅ | --stop-on-exit 0,143,15 |
| Custom stop timeout | ✅ | --stop-timeout 30000 (30s) |
| HTTP health check probe | ❌ | removed due to SSRF — use sidecar: lynxpm start "curl -sSf http://localhost/h || exit 1" --cron '@every 10s' --shell |
| Unix-style cron | ✅ | --cron "0 */6 * * *" |
| Interval cron | ✅ | --cron "@every 5s" (min 5s) |
| Can I…? | Yes/No | Alternative |
|---|
--env KEY=VAL inline | ❌ | does not exist. Use --env-file |
Pass .env file | ✅ | --env-file .env.production |
Relative paths in --env-file | ✅ | relative to --cwd |
.. in --env-file | ❌ | rejected ERR_BAD_REQUEST |
| View env of a live process | ⚠️ | lynxpm show <name> shows spec; real env in /proc/<pid>/environ |
Secrets without leaking in ps | ✅ | --isolation dynamic uses LoadCredential (systemd) |
| Can I…? | Yes/No | Example |
|---|
| Cap memory | ✅ | --memory-max 512M (accepts k/m/M/G or bytes) |
| Cap CPU % | ✅ | --cpu-max 100 (100=1 core, 200=2 cores) |
| Cap number of threads/procs | ✅ | --tasks-max 64 |
| Cap file descriptors | ⚠️ | indirect — runtime default RLIMIT_NOFILE |
| Cap disk I/O | ❌ | not exposed (systemd IOWeight not wired) |
| Memory < 1 MiB | ❌ | minimum floor |
| Can I…? | Yes/No | Mode |
|---|
| Run without extra isolation | ✅ | --isolation self (default) |
| Synthetic per-process user | ✅ | --isolation dynamic (system mode only, systemd) |
| Sandbox without sudo | ✅ | --isolation sandbox (user+PID namespace + landlock) |
Block writes to /home, /etc | ✅ | --isolation sandbox (landlock allowlist) |
--cwd to /etc | ❌ | blocked: /etc /proc /sys /boot /dev /run |
Path traversal ../../etc | ❌ | canonicalized + rejected |
--shell in system mode | ❌ | blocked (hardening); user mode yes |
| View socket perms | srw-rw---- lynx:lynxadm (system) / 0600 (user) | |
| Can I…? | Yes/No | Example |
|---|
| Follow logs | ✅ | lynxpm logs api --follow |
| stdout only | ✅ | lynxpm logs api --stdout |
| stderr only | ✅ | lynxpm logs api --stderr |
| Last N lines | ✅ | lynxpm logs api --lines 50 |
| JSON-formatted logs | ✅ | --log-format json at start |
| Automatic rotation | ✅ | 50 MiB default, 3 backups (tunable env) |
| Truncate logs | ✅ | lynxpm flush api |
| Redirect to custom dir | ✅ | --log-dir /var/log/my-app |
| Redirect stdout to stderr | ❌ | both go to separate files |
| Can I…? | Yes/No | Note |
|---|
| Multiple apps in one YAML | ✅ | all in the file’s namespace |
| Apply incrementally | ⚠️ | apply always creates new; must delete before re-applying |
| Export running state → YAML | ✅ | lynxpm export --namespace prod > apps.yml |
| Dependencies between apps | ❌ | not implemented; starts independently |
| Per-app env-file | ✅ | env_file: .env in each entry |
| Lint before apply | ❌ | not exposed (though apply validates) |
| Can I…? | Yes/No | Example |
|---|
| Preview without executing | ✅ | --dry-run / -n |
| Silence output | ✅ | --quiet / -q |
| Parseable JSON output | ✅ | lynxpm list --json / lynxpm version --json |
| Shell completion | ✅ | lynxpm completion bash|zsh|fish |
| Namespace:name syntax | ✅ | lynxpm show prod:api |
| Resolve by ID prefix | ✅ | lynxpm show 019d9 (if unique) |
| Multiple lifecycle commands in 1 cmd | ✅ | lynxpm stop a b c d |
| Bulk by namespace (stop/restart/reload/reset/delete/flush) | ✅ | lynxpm restart --namespace prod or lynxpm restart 'prod:*' |
| HTTP API | ❌ | Unix socket IPC only |
| Remote daemon via TCP | ❌ | socket is local-only by design |
| Can I run…? | Yes/No |
|---|
| Node / Bun / Deno | ✅ |
| System Python / venv / uv / uvx | ✅ |
| Go source / binary | ✅ |
| Rust / C / C++ / Nim / OCaml / Haskell | ✅ |
| Ruby / Perl / PHP / Lua / R / Tcl | ✅ |
| Java / JVM (Kotlin, Scala) | ✅ |
| Erlang / Elixir | ✅ |
| Bash scripts | ✅ |
| Docker container | ⚠️ |
| Windows .exe | ❌ |
| GUI apps (X11/Wayland) | ⚠️ |
See RUNTIMES.md for per-runtime recipes.
| Can I…? | Yes/No | How |
|---|
| Auto-start on boot | ✅ | sudo lynxpm startup (systemd) |
| Restore specs after reboot | ✅ | automatic on daemon start |
| Backup state | ✅ | copy ~/.config/lynx/apps/*.json |
| Migrate between hosts | ✅ | lynxpm export → copy YAML → lynxpm apply |
| Kill daemon without killing apps | ✅ (dynamic) / ❌ (self) | in dynamic apps survive (systemd-managed); in self they die |
| Feature | Alternative |
|---|
HTTP health check (--health-url) | Sidecar cron with curl |
lynxpm attach / interactive stdin | no docker exec-style |
| Prometheus metrics endpoint | Parse lynxpm list --json from your scraper |
Watch file mode (--watch) | Use nodemon/cargo-watch as sidecar |
| Deploy via SSH | Use Ansible / Terraform / rsync + lynxpm apply |
| Modules/plugins | No plugin system |
| Hot-reload live spec | Do delete + apply |
| Mac / Windows | Linux-only (kernel features required) |
| Error | What it means | Fix |
|---|
cannot reach the Lynx daemon | daemon off | lynxd & (user) or sudo systemctl start lynxd (system) |
ERR_RATE_LIMIT | exceeded 100 req/s | Wait. Drop to normal burst. |
ERR_CONFLICT: ... already exists | duplicate ns:name | different name or namespace |
invalid name format | name with forbidden char | only a-zA-Z0-9 ._-:#@!,()+=& |
cwd is a restricted system directory | --cwd /etc etc | use /srv, /var/lib/lynx-pm, /tmp |
cwd is not accessible to the daemon user | user mismatch system mode | --cwd /srv/something that lynx user can read |
ERR_UNSUPPORTED: run_as=dynamic requires system daemon | dynamic in user mode | use sandbox or run daemon in system-mode |
fork/exec: executable not found | binary not in daemon PATH | lynxpm install-tools |
ambiguous argument 'X' | multiple matches | use full ns:name or ID |