2026-06-24 Remote MCP Migration Complete

What I set out to do

Finish moving the remote Obsidian MCP off the MacBook onto the always-on OCI box, declaratively, and make vault sync fast. Picks up from 2026-06-21 Remote Obsidian MCP Connector and 2026-06-22 Remote MCP One-Month Access Sessions; full status in Remote Obsidian MCP Cloud Host.

What I actually did

  • Landed the A1. The PAYG upgrade finally propagated and the VM.Standard.A1.Flex (6 GB aarch64) came up on the first tofu apply — capacity was purely a free-tier gate. Then terminated the interim micro and deleted its VCN to stay under the 2-VCN cap.
  • Phase 2 — NixOS. Wrote nix/hosts/obsidian-mcp/ (disko + services.obsidianRemoteMcp: mcp-proxy → mcpvault, cloudflared), wired nixosConfigurations, installed via nixos-anywhere --build-on remote. One real bug: the bridge crash-looped with spawn sh ENOENT because npm’s exec shells out and the systemd unit’s PATH only had node — fixed by adding bash+coreutils.
  • Phase 4 — git vault sync. Headless commit→merge→push on a timer, write-scoped GitHub deploy key, and a never-pause keep-both conflict resolver (keeps both sides as .conflict- sidecars rather than blocking or losing edits).
  • Cutover. Added a runTunnel toggle so the Mac keeps its loopback bridge (for Claude Code + Open WebUI) but stops serving the public tunnel; only the box does now. Verified from the Claude desktop app — real requests hit the box (Cloudflare edge source IPs, 200/202).
  • Review + hardening. Ran an independent code review; tightened the conflict guard, added an AD-index validation, zramSwap, and a serial console for OOB recovery.
  • Sync speed. Walked the latency down: box timer to 30s, then the Mac’s obsidian-git from 15 min → 1 min → 30s. The unlock was reading the plugin source: it multiplies the “minutes” interval by 60000 with no flooring, so 0.5 = 30s even though the UI only shows whole minutes. End-to-end is now ~30-60s both ways.
  • Merged feat/oci-obsidian-mcp-declarative to main (9 commits).

What was striking

  • PAYG was the whole story. ~40 failed free-tier A1 attempts over weeks, then instant success the second billing flipped. The shortage is deprioritization, not absence.
  • “Minutes” was a lie in the best way. I’d told myself 1 min was obsidian-git’s floor; the source said otherwise. Worth checking the code instead of the settings UI.
  • No transport beats the topology. Spent real thought on Syncthing, rclone box↔Mac, and iCloud-on-Linux — all worse than git for a headless box, and none fix the real bottleneck (the Mac bridging the iCloud world and the git world). The iOS Obsidian app needs iCloud; the headless box needs git; the Mac is the unavoidable seam. ~30-60s is the floor and that’s fine.
  • iCloud + .git is the lingering footgun on the Mac side (the box clone is clean). Not fixed because the iPhone app needs iCloud; the gitdir-pointer move is the documented fix if it ever bites.