Install on Linux
On Linux the engine schedules pipelines with systemd user timers (systemctl --user): no root, and nothing written under /etc.
Install, in this order
On a clean Debian or Ubuntu machine:
sudo apt install unzip# the Bun installer needs itcurl -fsSL https://bun.sh/install | bash# installs Bun in ~/.bun# open a new shell (or `source ~/.bashrc`) so that `bun` is on the PATHgit clone https://github.com/startcat/agentic-pipelines.gitcd agentic-pipelinesbun installbun link# puts `pipelines` on the PATHsudo timedatectl set-timezone <your timezone># e.g. Europe/Madridsudo loginctl enable-linger $USERYou also need git, a compatible Node on the PATH, and whatever binaries your pipelines declare (the starter uses jq; its README installs unzip git jq in one apt line). Pipelines with agent steps need an Anthropic API key in the data repo's .env, exactly as on macOS.
The four things that differ from macOS
Time zone
triggers.cron schedules are read in the machine's local time, and servers usually come set to UTC. Without the timedatectl line above, a pipeline meant for 03:00 would run at 03:00 UTC. doctor and install show the zone they see, and on UTC doctor warns that schedules will be read in UTC.
Linger
Without enable-linger, systemd doesn't keep your user session around once you close SSH, and user timers don't fire. pipelines doctor shows this check in red when it's missing, without failing (platform checks are informational). pipelines install refuses to install without linger unless you pass --force; --dry-run shows it but doesn't stop.
Bash
On Linux, shell steps and shell: guards run with bash --posix instead of sh: Ubuntu's /bin/sh is dash, which doesn't support set -o pipefail. bash --posix reproduces the semantics of macOS's sh. bash must be installed (it is on any standard Debian or Ubuntu); doctor checks it, and install checks that it resolves on the job's PATH.
Notifications
Channel scripts belong to the data repo, not the engine. A server has no desktop notifications, so use a channel that goes out over the network: for example, a script that posts to ntfy with the topic in the data repo's .env (NTFY_TOPIC=a-long-hard-to-guess-name). The topic works like a secret: don't put it in the YAML or in a repo. See Notifications.
The dashboard from your laptop
pipelines web listens only on 127.0.0.1. To see it from your laptop, open an SSH tunnel and browse to http://127.0.0.1:7717:
ssh -L 7717:127.0.0.1:7717 <server># from your laptoppipelines web# on the server, inside the data repoScheduling on Linux
From here, pipelines install <name> works just as on macOS (see Scheduling), and writes two units to ~/.config/systemd/user/ instead of a plist: cat.start.pipelines.<name>.service and cat.start.pipelines.<name>.timer.
If systemctl --user says it can't connect to the bus, open a real session (SSH as that user, not su or sudo -u) or set XDG_RUNTIME_DIR=/run/user/$(id -u).