# Looper for Linux

**Looper 1.2.0 for macOS and Looper 1.1.6 for Linux preview are available.** [Download for macOS](https://tg8pkbwbl5cwfevb.public.blob.vercel-storage.com/releases/1.2.0/looper-1.2.0-macos-universal.dmg) · [Download for Linux](https://tg8pkbwbl5cwfevb.public.blob.vercel-storage.com/releases/1.1.6-preview.20260923/looper-1.1.6-linux-x86_64.tar.gz). Linux runtime proof covers Ubuntu 24.04 x86_64 binaries; systemd installation was not tested. See [release status](https://looper.fyi/release.json) for exact versions and SHA-256 digests.

## Requirements

A Linux x86_64 computer with Bash, curl, Python 3, sha256sum, tar, and a working `systemd --user` session. This package runs as your user account and requires no Rust toolchain. The published package targets Ubuntu 24.04 x86_64.

## Inspect and install

The following commands download the installer for inspection. The installer exits without changing your installation while release status is pending.

```sh
curl --fail --show-error --silent --location \
  --proto '=https' --proto-redir '=https' \
  https://looper.fyi/install.sh -o looper-install.sh
less looper-install.sh
bash looper-install.sh
```

When a release is published, the installer selects its exact version from [release.json](https://looper.fyi/release.json), downloads the matching immutable URL declared for the Linux asset, checks SHA-256, and runs `looper-linux.sh install` from the verified archive. To require a particular published version, use `bash looper-install.sh --version X.Y.Z`, replacing `X.Y.Z` with the Linux asset's version in the manifest. A different version is refused.

Installation enables and starts or restarts `looper.service` in your user session. It writes owned files under `~/.local/lib/looper`, links commands in `~/.local/bin`, and installs units under `~/.config/systemd/user`. The existing package helper preserves configuration and backs up owned files on replacement. Desktop notifications remain opt-in. The bootstrap installer does not edit your shell profile, install hooks, configure Tailscale, or use sudo.

## Verify

```sh
~/.local/bin/looper-linux status
systemctl --user is-active looper.service
```

Open `~/.local/bin/looper` for the terminal interface. Add `~/.local/bin` to your shell's PATH yourself if you want to use shorter command names. The server's user service depends on the user manager; a headless machine may need an administrator to configure lingering separately.

## Add this Linux computer to your iPhone over Tailscale

Use Linux **1.1.6 preview or later** for this flow. The older September 21 Linux 1.1.5 preview does not support remote browser setup. Install or update using the installer above, then connect this Linux computer and your iPhone to your Tailscale network.

Enable remote setup explicitly. For a hosting dashboard or startup command, use:

```sh
AGENT_CONTROL_PLANE_LISTEN=0.0.0.0:8765 looper serve --tailscale
```

For the packaged user service, run `systemctl --user edit looper.service` and add:

```ini
[Service]
ExecStart=
ExecStart=%h/.local/lib/looper/looper-server serve --tailscale
```

Then apply the setting:

```sh
systemctl --user daemon-reload
systemctl --user restart looper.service
systemctl --user is-active looper.service
tailscale ip -4
```

The service user must have access to the local Tailscale daemon socket. A custom socket can be configured with `LOOPER_TAILSCALE_SOCKET` in `~/.config/looper/server.env`. If your SSH session has no user-bus environment, use `export XDG_RUNTIME_DIR=/run/user/$(id -u)` only when that directory and its `bus` socket belong to your user.

On your iPhone:

1. Connect Tailscale and open Looper → Settings → Add Computer.
2. Turn on **Connect over Tailscale** and enter the Linux computer's Tailscale IP or full `.ts.net` name. Bare addresses use port 8765.
3. Open **Server Pairing Page**, generate a four-letter code, return to Looper, and enter it.
4. Choose **Connect with Code**. Check that the selected computer is your Linux host and its connection is Live.

Pairing uses the specified server directly; no camera scan, SSH tunnel, or LAN discovery is needed. Tailscale policy must allow TCP 8765 for setup and TCP/UDP 8766 for session transport. Restrict these ports to devices allowed to control Looper: `--tailscale` allows verified, reachable tailnet peers to generate pairing codes. Requests through public ingress, forwarded headers, or an unverifiable peer are rejected. The installer does not install Tailscale or enable this setting silently.

If the page says **Open setup on this computer using localhost**, check both the installed version and the service's `--tailscale` flag. Run `~/.local/bin/looper --version` and `systemctl --user cat looper.service`. Do not use `localhost` in the iPhone browser: that points at the iPhone itself.

## Remove the installation

```sh
~/.local/bin/looper-linux uninstall --yes
```

The package helper stops its user services and moves owned installed files to a recoverable backup. It preserves configuration and session data by default.

[Installation overview](https://looper.fyi/docs/install) · [Troubleshooting](https://looper.fyi/docs/troubleshooting)
