Never Lose a Homelab Note Again: A Git + Markdown Vault

Build a homelab knowledge base on Git and Markdown — the substrate that gives you version history, plain-text durability, and one authoritative copy. Includes the SSHFS-over-bashrc mount pattern.

On this page
  1. Why this substrate wins
  2. Where the vault lives
  3. Folder taxonomy: PARA with stable URLs
  4. Frontmatter: structured metadata on every page
  5. Editing the vault from your laptop
  6. The swap-in box
  7. What you have now

The previous post argued why you want a second brain and gave you the one rule: every durable fact has exactly one home. This post builds the home. The substrate is deliberately boring — Git plus Markdown — and boring is the point. Boring outlives every hosted note app that will shut down in the next decade.

The principle

Your knowledge base should be plain text under version control. Plain text is readable by any tool forever; version control gives you history, blame, and a single authoritative copy. Everything fancier is a view built on top of this — never a replacement for it.

First: make these values your own

The commands below use example stand-ins from my lab — don’t paste them verbatim. Substitute your own values first: 10.0.0.76 → your vault host’s IP address; vaultwriter → the username you create; /wiki-data/git → wherever your repo lives; ~/wiki → your chosen local mount point; CT 106 is just my container’s label, yours will differ. Rule of thumb: if a value looks specific to one machine, it’s a placeholder to change — not a literal to copy.


Why this substrate wins

Three properties, and every other choice in this series depends on them:

Git + Markdown vaultDurableplain text, norenderer requiredVersionedfull history,every change traceableSingle copyone authoritativerepo, many viewsbuildahomelab.dev
  • Durable: a Markdown file is legible in cat, in your editor, in a browser, and in whatever tool exists in fifteen years. No proprietary database, no export dance.
  • Versioned: git log on a note tells you what changed, when, and — if you write good commit messages — why. You can revert a bad edit and blame a line to a date. (If Git is new to you, the free Pro Git book is the authoritative reference.)
  • Single copy: the repository is the authority. Obsidian, a published wiki, and a search index are all downstream views of this one repo, never independent forks of the truth.

Where the vault lives

The authoritative repository lives on an always-on machine. In my lab that’s a Proxmox LXC container (call it CT 106) holding a bare Git repo at /wiki-data/git. My laptop never holds the only copy — it mounts the container’s repo over the network and edits the real files in place.

Why a container, not the laptop

If the vault’s only home is your laptop, the vault is offline whenever the laptop is. Putting the authority on an always-on container means your cluster services, your phone, and later your AI agents can all reach the same single copy — and your laptop becomes just one editing client among several.

One canonical copy, many clientsalways-on host (CT)/wiki-data/git — the authoritylaptop ~/wikiObsidian, edits liveSSHFSno sync stepdownstream views (built later in this series)published wikia projectionsearch indexa projectionbackup mirrora projectionevery view derives from the one repo — never forks it

Folder taxonomy: PARA with stable URLs

Structure the vault so a page’s location reflects what it is, not what state it’s in. I use a lightly-adapted PARA layout:

Vault top-level layout

wiki/
home.md              # the map — links out to every hub
infrastructure.md    # hub: hardware, network, storage
services.md          # hub: deployed apps
projects.md          # hub: finite outcomes in progress
runbooks/            # executable procedures
decisions/           # durable choices + rationale
reference/           # reusable domain knowledge
journal/             # dated evidence, session records
Identity over status — the trap to avoid now

Do not organize by lifecycle. It is tempting to move a page from projects/ to archive/ when a project finishes — don’t. Moving a page changes its URL and breaks every link and bookmark pointing at it. A page’s folder should describe its kind, permanently; its status belongs in frontmatter. We devote a whole post to this later, but adopt the discipline from your first commit.


Frontmatter: structured metadata on every page

Every note opens with a YAML frontmatter block. This is what lets tools reason about your notes — filter by status, build indexes, and (later in this series) generate the graph.

Standard frontmatter schema

---
title: "Proxmox Cluster"
description: "The 4-node cluster: hosts, quorum, and shared storage."
type: topic
status: active
tags: [infrastructure, proxmox, region/infrastructure]
topic: proxmox-cluster
relates: [storage-layout, cluster-networking]
created: 2026-06-17
updated: 2026-07-15
---

The fields that earn their keep: status (so lifecycle lives in metadata, not the path), topic (the canonical owner id for this subject), and relates (the links that later become the graph’s synapses). We build the generator that consumes topic and relates in a later post.


Editing the vault from your laptop

Here’s the exact pattern I use. The canonical repo lives on the container; the laptop mounts it over SSHFS so Obsidian edits the real files directly — no sync step, no second copy.

1Install SSHFS and set up key-based SSH5 min
On your laptop

# Debian/Ubuntu/openSUSE
sudo zypper install sshfs   # or: sudo apt-get install -y sshfs

# Key-based auth to the vault host (no password prompts on mount)
ssh-copy-id vaultwriter@10.0.0.76
2Create a mountpoint and mount the vault2 min
On your laptop

mkdir -p ~/wiki
sshfs vaultwriter@10.0.0.76:/wiki-data/git ~/wiki \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

The reconnect and ServerAlive options keep the mount alive across brief network drops instead of leaving a dead handle.

3Auto-mount on shell start (the bashrc pattern)3 min

Rather than a fragile fstab entry, mount lazily from your shell rc so it’s there whenever you open a terminal:

Append to ~/.bashrc

# Mount the canonical vault if it isn't already
if ! mountpoint -q "$HOME/wiki"; then
sshfs vaultwriter@10.0.0.76:/wiki-data/git "$HOME/wiki" \
  -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 2>/dev/null
fi
Point Obsidian at the mount

Open ~/wiki as an Obsidian vault. Obsidian now reads and writes the canonical files directly — graph view, backlinks, and daily notes all operate on the one true copy.

4Commit your first note2 min
On your laptop, inside ~/wiki

cd ~/wiki
$EDITOR home.md          # write your map page
git add home.md
git commit -m "Add vault home page"

For the full copy-paste version with the interface-detection and teardown steps, use the paired playbook: Stand Up a Git + Markdown Vault.


The swap-in box

The principle is tool-agnostic — only the worked example above is mine:

On other tools

Logseq / Dendron: both are Markdown-on-Git already — point them at the same mounted repo. Notion / Confluence: you can start there, but you don’t own the files; plan an export-to-Markdown escape hatch early. Plain Git, no editor: everything here works with git and $EDITOR alone — Obsidian is a convenience, not a requirement. No always-on host yet: a free-tier VPS or even a Raspberry Pi is enough to hold the canonical repo until you have a cluster.


What you have now

One authoritative, versioned, plain-text vault that you edit from your laptop as if it were local. That’s the substrate. Everything else in this series — the graph, the published wiki, the AI integration — is a view or a guard built on top of it.

The very next thing to get right, before the vault has anything valuable in it, is making sure you never commit a secret to it. That’s the next post.


Related posts:

Comments

Comments are powered by GitHub Discussions — sign in with a GitHub account to join the conversation.