Post

Auto-start Syncthing on macOS Boot with launchd

How to configure Syncthing to run silently in the background on every macOS login using a native launchd plist — no terminal required after setup.

Auto-start Syncthing on macOS Boot with launchd

By default, Syncthing on macOS requires you to open a terminal and type syncthing each time you reboot. This guide sets it up as a native macOS background service using launchd, so it starts automatically on every login with no manual intervention.

Prerequisites

  • Syncthing installed via Homebrew (brew install syncthing)
  • Terminal access

Step 1 — Find your Syncthing binary path

1
which syncthing

Note the output. On Apple Silicon Macs (M1/M2/M3) this will typically be:

1
/opt/homebrew/bin/syncthing

On Intel Macs it is usually:

1
/usr/local/bin/syncthing

Step 2 — Create the LaunchAgents directory

This directory may not exist by default:

1
mkdir -p ~/Library/LaunchAgents

Step 3 — Create the plist file

1
nano ~/Library/LaunchAgents/com.syncthing.syncthing.plist

Paste the following content, making sure the binary path matches your output from Step 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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>com.syncthing.syncthing</string>

  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/syncthing</string>
    <string>serve</string>
    <string>--no-browser</string>
    <string>--no-restart</string>
  </array>

  <key>KeepAlive</key>
  <true/>

  <key>RunAtLoad</key>
  <true/>

  <key>StandardOutPath</key>
  <string>/tmp/syncthing.log</string>

  <key>StandardErrorPath</key>
  <string>/tmp/syncthing.err</string>
</dict>
</plist>

Save with Ctrl+O, Enter, then exit with Ctrl+X.

If you are on an Intel Mac, replace /opt/homebrew/bin/syncthing with /usr/local/bin/syncthing.

Step 4 — Load the service

No reboot required — load it immediately:

1
launchctl load ~/Library/LaunchAgents/com.syncthing.syncthing.plist

Step 5 — Verify it is running

1
pgrep -x syncthing && echo "running"

You should see one or two PIDs followed by running. Two PIDs is normal — Syncthing spawns a child process.

You can also open the Syncthing web UI to confirm:

1
http://127.0.0.1:8384

How it works

Key Purpose
RunAtLoad Starts the service immediately when the plist is loaded
KeepAlive Automatically restarts Syncthing if it crashes
--no-browser Prevents Syncthing from opening a browser tab on launch
--no-restart Lets launchd handle restarts rather than Syncthing’s own watchdog

Managing the service

Stop and disable:

1
launchctl unload ~/Library/LaunchAgents/com.syncthing.syncthing.plist

View logs:

1
2
tail -f /tmp/syncthing.log
tail -f /tmp/syncthing.err

Restart:

1
2
launchctl unload ~/Library/LaunchAgents/com.syncthing.syncthing.plist
launchctl load ~/Library/LaunchAgents/com.syncthing.syncthing.plist

Syncthing will now start silently in the background on every login, accessible at http://127.0.0.1:8384.

This post is licensed under CC BY 4.0 by the author.