Apps / Files / :8384
Syncthing
Keep folders in sync between your devices, without a cloud.
No MiniControl yet? Download MiniControl, then install Syncthing from its catalog.
Syncthing keeps folders the same on all your devices, copying changes straight between them, encrypted, with no account or cloud in the middle. With the machine always on, every device stays current even when the others are asleep.
After the install: In Syncthing's web page, set a user name and password first (Actions → Settings → GUI): it's reachable from your network.
Free, like the whole catalog.
What MiniControl installs
- Packages
brew install syncthing- Web page
- Port 8384
- Keeps running
- As LaunchAgent
app.minicontrol.syncthing, also after a restart - Its data
~/Library/Application Support/Syncthing- Memory
- 50–150 MB
- Licence
- MPL-2.0
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 Syncthing. 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 -- 'bin/syncthing' "$f"; then fail "Syncthing is already set up here, as $(basename "$f" .plist)."; fi
done
if lsof -nP -iTCP:8384 -sTCP:LISTEN >/dev/null 2>&1; then
fail "Something else already uses port 8384: $(lsof -nP -iTCP:8384 -sTCP:LISTEN | awk 'NR == 2 {print $1}')."
fi
step 2 "Installing with Homebrew"
"$BREW" list --formula syncthing >/dev/null 2>&1 || "$BREW" install syncthing
step 3 "Setting it up"
mkdir -p "$HOME/services/syncthing/log" "$HOME/Library/LaunchAgents"
PL="$HOME/Library/LaunchAgents/app.minicontrol.syncthing.plist"
cat > "$PL" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>app.minicontrol.syncthing</string>
<key>ProgramArguments</key>
<array>
<string>$BP/opt/syncthing/bin/syncthing</string>
<string>--no-browser</string>
<string>--no-restart</string>
<string>--gui-address=0.0.0.0:8384</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>ThrottleInterval</key><integer>10</integer>
<key>ProcessType</key><string>Background</string>
<key>StandardOutPath</key><string>$HOME/services/syncthing/log/launchd.out.log</string>
<key>StandardErrorPath</key><string>$HOME/services/syncthing/log/launchd.err.log</string>
</dict>
</plist>
EOF
plutil -lint "$PL" >/dev/null
[ -x "$BP/opt/syncthing/bin/syncthing" ] || fail "$BP/opt/syncthing/bin/syncthing isn't there after the install."
step 4 "Starting Syncthing"
# Services run in the logged-in user's session (gui/<uid>), like every service in the panel.
launchctl bootstrap "gui/$U" "$PL" || fail "launchd didn't start it. Services run while you're logged in on the machine; Server Setup's \"Log in automatically after a restart\" fixes that."
if /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -q enabled; then echo "FW|$BP/opt/syncthing/bin/syncthing"; fi
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:8384/rest/noauth/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 8384 yet. Big apps can take a minute on first start."
echo "DONE"
MiniControl isn’t affiliated with Syncthing. Questions about Syncthing itself go to its makers; about installing it, to hello@minicontrol.app.