<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Luke Manning - Blog — Obsidian</title>
        <link>https://lukemanning.ie/</link>
        <description>Breaking things. Building things. Writing about it. (tag: Obsidian)</description>
        <lastBuildDate>Wed, 30 Sep 2026 12:46:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved 2026, Luke Manning</copyright>
        <atom:link href="https://lukemanning.ie/feeds/obsidian.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Dropping Obsidian Sync for Syncthing: What I Learned Setting Up a Headless Linux Sync Hub]]></title>
            <link>https://lukemanning.ie/blog/syncthing-obsidian-vault-sync</link>
            <guid isPermaLink="true">https://lukemanning.ie/blog/syncthing-obsidian-vault-sync</guid>
            <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>Obsidian Sync costs up to $120 a year if you're on Sync Plus, and paying monthly. That's the number that made me actually do something about it.</p>
<p>I was curious about using Obsidian Sync because people generally were happy that it worked. At least people on reddit were. However I did not want yet another subscription. As much as I like the work that Obsidian do, I just couldn't justify it.</p>
<p>I went with Syncthing because it's peer-to-peer (no third-party server holding my files), it's free, and I've read several threads and watched a few YouTube videos where people swear by it. My always-on NucBox (Ubuntu 24.04, headless) acts as the hub. Windows desktop and Android phone sync to it. I genuinely forget it's there most of the time.</p>
<p>This post isn't a tutorial. The Syncthing docs are fine. What I kept running into was the specific problem of configuring a headless Linux machine without a browser, and nobody really spelled that part out clearly. So here's my setup, including the bits I had to figure out myself.</p>
<h2>Getting to the Web UI</h2>
<p>Most Syncthing guides assume you can just open <code>localhost:8384</code> in a browser on the same machine running Syncthing. My NucBox doesn't have a browser. Or a screen. It's just a small fanless PC sitting under my desk running Ubuntu without a Desktop environment.</p>
<p>My first thought was to install a VNC server or something. I wasn't a fan of that approach and after some more time Googling around I eventually found the SSH tunnel approach, which is way simpler than I expected.</p>
<p>Syncthing's web UI runs on port 8384 on the NucBox. I mapped that to a local port on my Windows machine over SSH:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">ssh</span><span style="color:#79B8FF"> -L</span><span style="color:#9ECBFF"> 9384:localhost:8384</span><span style="color:#9ECBFF"> luke@</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">nucbox-i</span><span style="color:#E1E4E8">p</span><span style="color:#F97583">></span><span style="color:#79B8FF"> -N</span></span></code></pre>
<p>Then opened <code>localhost:9384</code> in my browser on my desktop. Syncthing defaults to no auth on the web UI, and I didn't love the idea of an unauthenticated interface accessible over the network. However given this was all running on localhost, I figured that was a problem for another day.</p>
<p>I was already running Syncthing on Windows, which was using port 8384. That's why I mapped to 9384 instead. Anything unused works.</p>
<h2>What I Ran on the NucBox</h2>
<p>Three commands:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> apt</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> syncthing</span></span>
<span class="line"><span style="color:#B392F0">systemctl</span><span style="color:#79B8FF"> --user</span><span style="color:#9ECBFF"> enable</span><span style="color:#9ECBFF"> syncthing</span></span>
<span class="line"><span style="color:#B392F0">systemctl</span><span style="color:#79B8FF"> --user</span><span style="color:#9ECBFF"> start</span><span style="color:#9ECBFF"> syncthing</span></span></code></pre>
<p>After those, I checked the service was actually running with <code>systemctl --user status syncthing</code>. Active and running. That was my "okay, it's alive" moment.</p>
<p>Actually, one thing I assumed I'd have to deal with. <code>systemctl --user</code> services on a headless machine don't survive logout unless you enable "lingering." Without it, Syncthing stops the second you close your SSH session. I checked mine:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">loginctl</span><span style="color:#9ECBFF"> show-user</span><span style="color:#9ECBFF"> luke</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> grep</span><span style="color:#9ECBFF"> Linger</span></span></code></pre>
<p>Turns out it was already enabled (<code>Linger=yes</code>). I'm guessing something during the Ubuntu install set it up — I definitely never ran <code>loginctl enable-linger</code> myself. But if yours shows <code>Linger=no</code>, you'll need:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">loginctl</span><span style="color:#9ECBFF"> enable-linger</span><span style="color:#9ECBFF"> luke</span></span></code></pre>
<p>This is probably the most headless-specific gotcha in the whole setup. And I suspect a lot of guides skip it because they assume you have a desktop login session.</p>
<p>The Ubuntu package is fine. I didn't need any third-party repos.</p>
<p>Once the tunnel was up it was the standard Syncthing workflow. I added a folder, pointed it at my vault, and shared it with my other devices. I installed Syncthing-Fork on Android from the F-Droid store. Paired devices using the Device ID from <strong>Actions → Show ID</strong>.</p>
<p>The Android app can scan a QR code from that same screen, which is much easier than typing out a 60-character device ID by hand. It can also discover other Syncthing devices on the same network, which was super useful for me.</p>
<h2>The .stignore Thing</h2>
<p>I'd been running Syncthing for maybe a day when I started seeing orange warning triangles in the UI. Low-level conflicts on <code>.obsidian/workspace.json</code> and <code>.obsidian/workspace-mobile.json</code>. Nothing catastrophic, but it was noise I didn't need.</p>
<p>Turns out Obsidian rewrites those files every time you open it — they store open tabs, cursor positions, that kind of thing. Different on every device, changing constantly. No wonder Syncthing was confused.</p>
<p>A bit of searching told me about <code>.stignore</code>. I added this at the root of the vault:</p>
<pre><code>.obsidian/workspace.json
.obsidian/workspace-mobile.json
.trash/
</code></pre>
<p>The rest of <code>.obsidian/</code> (plugins, themes, settings) syncs fine. That's the stuff I actually want consistent across machines.</p>
<h2>A Few Weeks In</h2>
<p>On the same LAN it syncs in seconds. Over the internet it handles NAT traversal automatically. I didn't have to configure any port forwarding or open firewall ports. The NucBox isn't running ufw, so there was nothing to touch there. It just worked.</p>
<p>Syncthing apparently used to use relay servers for this, but they were removed a while back (I think around v1.27). Whatever it's doing now, I didn't have to think about it.</p>
<p>I've had this running for a few days now across the NucBox, my Windows desktop, and my Android phone. I haven't thought about it once since setting it up, which is exactly what I wanted.</p>
<p>The $120 a year I was considering paying Obsidian Sync? Going toward something else now.</p>]]></description>
            <content:encoded><![CDATA[<p>Obsidian Sync costs up to $120 a year if you're on Sync Plus, and paying monthly. That's the number that made me actually do something about it.</p>
<p>I was curious about using Obsidian Sync because people generally were happy that it worked. At least people on reddit were. However I did not want yet another subscription. As much as I like the work that Obsidian do, I just couldn't justify it.</p>
<p>I went with Syncthing because it's peer-to-peer (no third-party server holding my files), it's free, and I've read several threads and watched a few YouTube videos where people swear by it. My always-on NucBox (Ubuntu 24.04, headless) acts as the hub. Windows desktop and Android phone sync to it. I genuinely forget it's there most of the time.</p>
<p>This post isn't a tutorial. The Syncthing docs are fine. What I kept running into was the specific problem of configuring a headless Linux machine without a browser, and nobody really spelled that part out clearly. So here's my setup, including the bits I had to figure out myself.</p>
<h2>Getting to the Web UI</h2>
<p>Most Syncthing guides assume you can just open <code>localhost:8384</code> in a browser on the same machine running Syncthing. My NucBox doesn't have a browser. Or a screen. It's just a small fanless PC sitting under my desk running Ubuntu without a Desktop environment.</p>
<p>My first thought was to install a VNC server or something. I wasn't a fan of that approach and after some more time Googling around I eventually found the SSH tunnel approach, which is way simpler than I expected.</p>
<p>Syncthing's web UI runs on port 8384 on the NucBox. I mapped that to a local port on my Windows machine over SSH:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">ssh</span><span style="color:#79B8FF"> -L</span><span style="color:#9ECBFF"> 9384:localhost:8384</span><span style="color:#9ECBFF"> luke@</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">nucbox-i</span><span style="color:#E1E4E8">p</span><span style="color:#F97583">></span><span style="color:#79B8FF"> -N</span></span></code></pre>
<p>Then opened <code>localhost:9384</code> in my browser on my desktop. Syncthing defaults to no auth on the web UI, and I didn't love the idea of an unauthenticated interface accessible over the network. However given this was all running on localhost, I figured that was a problem for another day.</p>
<p>I was already running Syncthing on Windows, which was using port 8384. That's why I mapped to 9384 instead. Anything unused works.</p>
<h2>What I Ran on the NucBox</h2>
<p>Three commands:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> apt</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> syncthing</span></span>
<span class="line"><span style="color:#B392F0">systemctl</span><span style="color:#79B8FF"> --user</span><span style="color:#9ECBFF"> enable</span><span style="color:#9ECBFF"> syncthing</span></span>
<span class="line"><span style="color:#B392F0">systemctl</span><span style="color:#79B8FF"> --user</span><span style="color:#9ECBFF"> start</span><span style="color:#9ECBFF"> syncthing</span></span></code></pre>
<p>After those, I checked the service was actually running with <code>systemctl --user status syncthing</code>. Active and running. That was my "okay, it's alive" moment.</p>
<p>Actually, one thing I assumed I'd have to deal with. <code>systemctl --user</code> services on a headless machine don't survive logout unless you enable "lingering." Without it, Syncthing stops the second you close your SSH session. I checked mine:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">loginctl</span><span style="color:#9ECBFF"> show-user</span><span style="color:#9ECBFF"> luke</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> grep</span><span style="color:#9ECBFF"> Linger</span></span></code></pre>
<p>Turns out it was already enabled (<code>Linger=yes</code>). I'm guessing something during the Ubuntu install set it up — I definitely never ran <code>loginctl enable-linger</code> myself. But if yours shows <code>Linger=no</code>, you'll need:</p>
<pre class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">loginctl</span><span style="color:#9ECBFF"> enable-linger</span><span style="color:#9ECBFF"> luke</span></span></code></pre>
<p>This is probably the most headless-specific gotcha in the whole setup. And I suspect a lot of guides skip it because they assume you have a desktop login session.</p>
<p>The Ubuntu package is fine. I didn't need any third-party repos.</p>
<p>Once the tunnel was up it was the standard Syncthing workflow. I added a folder, pointed it at my vault, and shared it with my other devices. I installed Syncthing-Fork on Android from the F-Droid store. Paired devices using the Device ID from <strong>Actions → Show ID</strong>.</p>
<p>The Android app can scan a QR code from that same screen, which is much easier than typing out a 60-character device ID by hand. It can also discover other Syncthing devices on the same network, which was super useful for me.</p>
<h2>The .stignore Thing</h2>
<p>I'd been running Syncthing for maybe a day when I started seeing orange warning triangles in the UI. Low-level conflicts on <code>.obsidian/workspace.json</code> and <code>.obsidian/workspace-mobile.json</code>. Nothing catastrophic, but it was noise I didn't need.</p>
<p>Turns out Obsidian rewrites those files every time you open it — they store open tabs, cursor positions, that kind of thing. Different on every device, changing constantly. No wonder Syncthing was confused.</p>
<p>A bit of searching told me about <code>.stignore</code>. I added this at the root of the vault:</p>
<pre><code>.obsidian/workspace.json
.obsidian/workspace-mobile.json
.trash/
</code></pre>
<p>The rest of <code>.obsidian/</code> (plugins, themes, settings) syncs fine. That's the stuff I actually want consistent across machines.</p>
<h2>A Few Weeks In</h2>
<p>On the same LAN it syncs in seconds. Over the internet it handles NAT traversal automatically. I didn't have to configure any port forwarding or open firewall ports. The NucBox isn't running ufw, so there was nothing to touch there. It just worked.</p>
<p>Syncthing apparently used to use relay servers for this, but they were removed a while back (I think around v1.27). Whatever it's doing now, I didn't have to think about it.</p>
<p>I've had this running for a few days now across the NucBox, my Windows desktop, and my Android phone. I haven't thought about it once since setting it up, which is exactly what I wanted.</p>
<p>The $120 a year I was considering paying Obsidian Sync? Going toward something else now.</p>]]></content:encoded>
            <category>homelab</category>
            <category>obsidian</category>
            <category>ubuntu</category>
        </item>
    </channel>
</rss>