Apps / AI / :3100

Paperclip

Run a company of AI agents and watch their work.

No MiniControl yet? Download MiniControl, then install Paperclip from its catalog.

Paperclip organises AI coding agents into a company: an org chart, goals, budgets and a board of tasks they work through on their own. You approve hires and plans, and follow every run from a web dashboard. It's open source and keeps its data on the machine.

Why on a Mac: Agents work for hours at a time, and a Mac mini runs all day for a few watts.

After the install: Open it to set up your first company.

Free, like the whole catalog.

What MiniControl installs

Packages
brew install node
Web page
Port 3100
Keeps running
As LaunchAgent ing.paperclip.paperclipai, also after a restart
Its data
~/.paperclip
Memory
300–600 MB, plus the agents it runs
Licence
MIT
The install script

What MiniControl runs on your server, word for word. The app shows the same script before it installs.

#!/bin/bash
# Generated by MiniControl for Paperclip. Runs on the machine.
set -euo pipefail
export HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_ENV_HINTS=1 NONINTERACTIVE=1
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:$PATH"
step() { echo "STEP|$1|$2"; }
fail() { echo "ERR|$1"; exit 1; }
U=$(id -u)
BREW=$(command -v brew || true)
[ -n "$BREW" ] || fail "Homebrew isn't installed. Server Setup → Homebrew installs it."
BP=$("$BREW" --prefix)
step 1 "Checking the machine"
for f in "$HOME"/Library/LaunchAgents/*.plist; do
  if grep -qsF -- 'paperclipai' "$f"; then fail "Paperclip is already set up here, as $(basename "$f" .plist)."; fi
done
if lsof -nP -iTCP:3100 -sTCP:LISTEN >/dev/null 2>&1; then
  fail "Something else already uses port 3100: $(lsof -nP -iTCP:3100 -sTCP:LISTEN | awk 'NR == 2 {print $1}')."
fi
step 2 "Installing with Homebrew"
"$BREW" list --formula node >/dev/null 2>&1 || "$BREW" install node
step 3 "Setting it up"
mkdir -p "$HOME/services/paperclip/log" "$HOME/Library/LaunchAgents"
step 4 "Starting Paperclip"
PC="$HOME/.local/bin/paperclipai"
[ -x "$PC" ] || npx -y paperclipai install --yes
[ -x "$PC" ] || PC=$(command -v paperclipai)
# Reachable over Tailscale when it's up, else over the home network.
BIND=lan
for t in "$BP/bin/tailscale" /usr/local/bin/tailscale; do
  if [ -x "$t" ] && "$t" status >/dev/null 2>&1; then BIND=tailnet; break; fi
done
"$PC" onboard --yes --bind "$BIND" --install-service
step 5 "Waiting for it to answer"
# Localhost, and the Tailscale IP for apps that bind only to it.
# `|| true`: with set -e, a failed substitution in an assignment would end the script.
HOSTS="127.0.0.1 $(for t in "$BP/bin/tailscale" /usr/local/bin/tailscale; do [ -x "$t" ] && "$t" ip -4 2>/dev/null && break; done | head -1 || true)"
ok=0
for i in $(seq 1 45); do
  for h in $HOSTS; do
    if curl -fsS -m 3 -o /dev/null "http://$h:3100/api/health" 2>/dev/null; then ok=1; break 2; fi
  done
  sleep 2
done
[ "$ok" = 1 ] || echo "WARN|It started, but isn't answering on port 3100 yet. Big apps can take a minute on first start."
echo "DONE"

MiniControl isn’t affiliated with Paperclip. Questions about Paperclip itself go to its makers; about installing it, to hello@minicontrol.app.