BloodSweatxED
Guides · No. 001 · Building in public

You have a second brain.
Now give it a front door.

This is the recipe for connecting Obsidian, Claude, and GitHub: a private backup of everything you write, and a public page that shows what you are building. It took me a few weeks of trial and error. It should take you an afternoon.

Written for a colleague on a Mac who has never used git. No prior programming assumed. Everything here is free, and nothing here is permanent, so you can bail at any step without losing your notes.

Start here · the first thirty minutes

This page is long because it answers the questions you will actually have at 10pm when something does not work. You do not have to read it first. Do these five things tonight and stop:

  1. Make a GitHub account. Choose the username carefully, it becomes your web address. Step 1b
  2. Install GitHub Desktop and sign in. This is your window into everything that follows. Step 1d
  3. Make a new repository, set it to Private. Call it life-vault. Step 02
  4. Skim your vault for anything with a patient in it. Five minutes. The only genuinely irreversible step in this guide. Step 02
  5. Push the vault up. Your second brain now exists in two places instead of one.

That is a real win and a complete stopping point. The website, the terminal, and Claude running inside your vault are all still there next weekend. Nothing below expires.

What you are actually building

Read this part twice

Two separate things. Keeping them separate is the single most important decision in this guide, so it comes first.

YOUR MAC Obsidian vault every note you write site folder one index.html CLAUDE WORKS HERE push push GITHUB private repo backup, only you public repo anyone can read it pages live website you.github.io THE WALL: NOTHING CROSSES BY ACCIDENT
Private vault on top, public site on the bottom, and a deliberate act of publishing in between.
Repo
What it is for
Your vault, private
A backup of your Obsidian notes with full history. Nobody sees it. If your laptop dies, your second brain does not. This is worth doing even if you never build a website.
Your site, public
One folder with one HTML file in it. GitHub serves it as a real website at a real URL. This is the front door.
The one rule Your vault is where you think out loud, and thinking out loud includes clinical detail, half-formed opinions about your institution, and things you would not want indexed by Google forever. It stays private, permanently. The public repo only ever receives things you deliberately wrote to be read. Two repos makes that mistake structurally hard to make. One repo makes it a matter of remembering, at midnight, post-shift.
00

The whole of git, in plain English

Five minutes

You do not need to learn git. You need to understand it well enough to tell Claude what you want and to know when something has gone sideways. Here is the entire mental model.

Word
What it actually means
git
A save-point system for folders. It remembers every version of every file, forever, and lets you go back.
repo
A folder that git is watching. Short for repository. Your vault becomes one. Your site becomes another.
commit
One save point, with a short message describing what changed. This is the atom of the whole system.
push
Upload your save points to GitHub. Nothing is backed up until you push.
pull
Download changes from GitHub to your machine. Matters once you use two computers.
GitHub
The website that stores your repos. It is not git, it is a company that hosts git repos and adds a nice interface.
GitHub Pages
A free feature: put an index.html in a public repo, flip a switch, and GitHub serves it as a live website. This is how the site you are reading exists.
main
The default branch, meaning the main timeline of your save points. Ignore branches entirely for now.
The shift that makes it click A commit is not a backup of a file. It is a sentence in a diary that happens to include the file. Six months in, the commit messages are their own record of what you were thinking, and that record turns out to be as useful as the notes themselves.
01

Setup

30 to 45 minutes, once, forever

This is the longest section and it is the only one with any real friction in it. Everything after this is one sentence to Claude and a button. Go slowly here and the rest is easy.

1a. The Terminal, in ninety seconds

If you have never used it: press Command and Space together, type Terminal, press Enter. You get a window with a line of text ending in a % sign. That is the prompt. It means the computer is sitting there waiting for you to tell it something.

You paste a line in, press Enter, it runs. Command + V pastes, same as everywhere else. That is the whole skill.

Four things that feel broken and are not
  • Nothing appears when you type your password. No dots, no stars, nothing. It is recording it. Type it and press Enter.
  • Most commands print nothing when they work. Silence means success. Errors are loud and usually tell you what to do.
  • The $ at the start of lines in this guide is not part of the command. It is just showing you where the prompt is. Copy what comes after it.
  • Some things ask a yes or no question and wait forever until you answer. If the terminal seems frozen, read the last line, it is probably a question.

1b. Make a GitHub account

Go to github.com and sign up. Pick the username carefully: it becomes your web address, so it should be the name you want on the thing. Changing it later breaks every link you have ever shared.

1c. Do you need the Apple developer tools? Probably, and it is not Xcode

Short answer to the question you are about to ask: no, this is not the giant Xcode app. Xcode is the fifteen-plus gigabyte thing in the App Store, and you do not need it. What you need is a smaller bundle called the Command Line Tools, which is what actually puts git on your Mac. On my machine it is about 1.9 GB. Real, but a one-time download, and dozens of other things you will eventually install depend on it.

First, check whether you already have it. Paste this and press Enter:

$ git --version

If it prints something like git version 2.50.1, you are already done, skip ahead. If a dialog pops up offering to install developer tools, click Install and let it run. If you want to trigger it deliberately:

$ xcode-select --install

Then tell git who you are, using the same email as your GitHub account. These two print nothing. That is correct.

$ git config --global user.name "Your Name" $ git config --global user.email "you@example.com"
If 1.9 GB is a genuine dealbreaker GitHub Desktop ships with its own private copy of git, so you can do this entire guide through that app and never install the Command Line Tools at all. You would give up running Claude Code in the terminal, which is most of the fun. My honest advice is to take the 1.9 GB. But it is a real option and nothing here is a dead end if you choose it.

1d. Install GitHub Desktop, whichever lane you pick

Download it from desktop.github.com, open it, and sign in with your GitHub account when it asks.

I originally wrote this guide treating GitHub Desktop as the alternative to the terminal. That was wrong. Install it either way. Its real value is not the buttons, it is the window: it shows you, line by line and in color, exactly what changed since your last save point, which repos you have, and whether you have pushed. Claude Code can tell you all of that, but you have to ask, and when you are learning you do not yet know to ask. Having the picture open next to you is how the model in your head gets built.

Signing in here also handles authentication for anything you push from this app, so it doubles as a safety net if the command line login gives you trouble.

This is the view worth understanding, because it is the whole of git in one picture. Left side: which files changed since your last save point. Right side: exactly what changed inside the file you clicked, green for added, red for removed. Bottom left: the box where you write what you did, and the button that saves it.

 GitHub Desktop · life-vault · main
3 changed files
01-clinical/airway.md M
00-inbox/2026-07-31.md A
CLAUDE.md A
Commit message
Add airway checklist, route inbox
Commit to main
@@ 01-clinical/airway.md ## Pre-intubation- Check the bag valve mask+ Check the bag valve mask and the seal+ Confirm suction is on and within reach ## Post-intubation
An illustration of the layout, not a screenshot, so it will not go stale when GitHub redesigns the app. M means modified, A means newly added. Committing here is the same act as git commit in the terminal, and both write to the same history.

Once you can read that screen, nothing in git is mysterious anymore. A commit is that list of changes plus the sentence you wrote about them. Everything else is logistics.

1e. Sign git in to GitHub, the step that trips absolutely everyone

GitHub stopped accepting plain passwords over the command line years ago. This is why half the tutorials you will find online are wrong, and why the wrong ones send you off to generate a long token and paste it somewhere. Do not do that. Pick one of these two.

Option 1 · easiest

Let GitHub Desktop do it

You already signed in during step 1d. That is it. Push from the app with a button, and do your commits there.

Downside: Claude Code cannot push for you, so you switch to the app for that one action. Perfectly fine for months.

Option 2 · recommended

GitHub's official CLI, gh

One command to install, one to log in, and then everything works from anywhere, including Claude Code pushing on your behalf.

If you do not have Homebrew, the Mac package manager, install it first from brew.sh (one line, paste it, it asks for your Mac password). Or skip Homebrew entirely and download the .pkg installer from cli.github.com, which is a normal double-click install.

$ brew install gh $ gh auth login

gh auth login asks you five questions in a row. Use the arrow keys to move, Enter to choose. Here are the answers, in order, so you are not guessing:

It asks
You answer
What account do you want to log into?
GitHub.com
What is your preferred protocol?
HTTPS
Authenticate Git with your GitHub credentials?
Yes. This is the one that matters. Saying no here is the cause of the password prompt that never accepts your password.
How would you like to authenticate?
Login with a web browser
It shows a one-time code, then waits
Copy the code, press Enter, your browser opens, paste the code, click through the authorization. Come back to the terminal, it will say you are logged in.

To confirm it worked, any time, forever:

$ gh auth status
The thing to never do If any tutorial, forum post, or chatbot tells you to generate a personal access token and paste it into a URL or a config file, stop. That leaves a working key to your account sitting in plain text on your disk, and it will eventually get committed and published. gh auth login and GitHub Desktop both store the credential properly in your Mac keychain instead. I made this exact mistake and had to rotate a token because of it.

1f. Now pick which Claude does the work

These are not competing options so much as three surfaces on the same thing. You will probably end up using all three. What matters is knowing which one to reach for.

Surface
What it is best at here
Claude Code
terminal
Lives inside a folder, reads and writes your actual files, and runs git for you. This is the one that makes the Obsidian connection powerful, because it can read every note without you pasting anything. Install Node from nodejs.org (take the LTS button), then run npm install -g @anthropic-ai/claude-code, then type claude inside any folder.
Cowork
You already use this. It is excellent for the make-me-a-thing steps: drafting the web page, writing the first version of a file, reworking content. Have it produce the file, then commit and push with GitHub Desktop or Claude Code. Best entry point if the terminal is still uncomfortable.
Claude chat
The fallback that always works. Ask, copy, paste into a file, save. Slower, zero setup, and genuinely fine for the first week.
The lowest-friction combination Cowork writes the files, GitHub Desktop shows you what changed and pushes it. That gets you a live site today without ever needing to be fluent in the terminal. Add Claude Code when the copy-paste starts to annoy you, which for you will probably be about a week.
02

Back up the vault, privately

15 minutes

Do this first, before any website. It is the step with real value on day one, and it teaches you the whole loop on something where mistakes cost nothing.

Create the private repo

On GitHub, click New repository. Name it something like life-vault. Choose Private. Do not add a README, a license, or a gitignore, because you want an empty one. Create it, and leave that page open, because it shows you the two commands you need next.

Tell git to ignore Obsidian's noise

Obsidian constantly rewrites a couple of small housekeeping files, like which pane was open and how big the window was. If you track those, every single save looks like a change and your history fills up with junk. So you list them in a file called .gitignore and git pretends they do not exist.

That is the entire concept. You do not need to hand-craft this file. Hand it to Claude:

Paste this to Claude
I have an Obsidian vault at [drag the folder in, or paste the path here]
and I am about to put it in a private GitHub repo.

Create a .gitignore at the root of the vault that ignores Obsidian's
churn files and macOS junk, but KEEPS my themes, hotkeys, and plugin
settings so they restore on a new machine.

Then explain in two sentences what you ignored and why, so I understand
what I just did.

For reference, what it should come out with is roughly four lines: the two Obsidian workspace files, the trash folder, and .DS_Store. If you would rather just make the file yourself, that is in the copy-paste kit at the bottom.

Turn the vault into a repo and push it

If you have Claude Code, open it in the vault folder and say "turn this folder into a git repo and push it to my new private repo called life-vault". It runs all of this for you. If you are on GitHub Desktop, skip to the paragraph after the commands. Either way, read the commands once, because you will see them a hundred times:

$ cd ~/Documents/YourVault # wherever the vault lives $ git init $ git add . $ git commit -m "First snapshot of the vault" $ git branch -M main $ git remote add origin https://github.com/YOURNAME/life-vault.git $ git push -u origin main

In GitHub Desktop instead: choose File, then Add Local Repository, point it at the vault folder, let it create the repo, write a summary, hit Commit, then Publish repository and make sure the "keep this code private" box is checked.

Refresh the GitHub page. Your notes are there, with history. From now on, saving your work is one sentence to Claude or one click in Desktop.

Before you push, one honest look Search your vault for anything with a patient name, an MRN, a date of birth, a screenshot of a chart, or a password. Private repos are private, but "private" is an access setting, not a legal shield, and de-identification is your job not GitHub's. If a note has real identifiers in it, fix the note. This is a five minute pass that you do once, and it is the only genuinely irreversible risk in this whole guide.

Give Claude a map of the vault

This is the piece nobody tells you about, and it is the difference between Claude being a chat window and Claude being something that actually knows your system. You put a file called CLAUDE.md at the root of your vault, describing the layout and the rules. Claude Code reads it automatically, every time, without being asked.

Read this before you change anything If you already have an organization system that works for you, keep it. You do not need my folder names, my numbering, or anyone else's. The point of this step is to describe your system to Claude, not to adopt a new one. A vault you already navigate by muscle memory is worth more than any scheme you read on the internet, including this one. Reorganizing a working vault is the single fastest way to turn a fun evening into a chore and quit.

If your vault is already organized

You do not have to be able to explain your own structure, and you do not have to remember where everything lives. Let Claude read it and write the file for you:

Paste this to Claude Code, inside your vault folder
Look at the structure of this Obsidian vault. Read the folder names,
sample a few notes from each, and work out how I actually organize
things and what my conventions are (frontmatter, naming, tags, where
new notes land).

Then write a CLAUDE.md at the root of the vault that describes it, so
that a future you starting fresh in this folder understands the system
immediately. Include a short "rules" section covering anything you can
infer about how I want files handled.

Do not move, rename, or reorganize anything. Describe what exists.
Show me the file before you write it.

That last line matters. Read what it produces. It will get one or two things subtly wrong about your intentions, you will correct them in a sentence, and the corrected version is better than anything you would have written cold.

If your vault is a pile

Also completely fine, and more common than anyone admits. A folder of 400 loose notes is still a second brain. Ask for a proposal rather than an action:

Paste this to Claude Code, inside your vault folder
This Obsidian vault has grown without a system. Read what is in here
and propose an organization that fits the notes I actually write,
not a generic template.

Give me: the proposed folder structure with one line explaining each
folder, which existing notes would go where, and what you are unsure
about.

Propose only. Do not create, move, or rename a single file yet. I want
to approve the structure first, and then we will move things in small
batches so I can stop you if it feels wrong.

Once you approve a structure and things are in place, run the first prompt to generate the CLAUDE.md.

What one ends up looking like

Mine is longer than this, but this is the shape. Yours will look nothing like it, and should not:

# About this vault This is my Obsidian second brain. I am a physician. ## Structure - `00-inbox/` raw captures, unprocessed. Everything lands here first. - `01-clinical/` teaching notes and clinical references. - `02-projects/` one folder per active project. - `99-archive/` finished or abandoned. Never delete, move here. ## Rules - Notes use YAML frontmatter with `title`, `date`, `tags`. - Never edit files in `00-inbox/` in place. Read them, write the processed version elsewhere, then say what should be archived. - Never invent clinical facts. If unsure, say so and cite nothing.
Why this matters more than it looks Once that file exists you can say "route my inbox" or "find every note where I mentioned that airway case and compile them into one teaching doc" and it just works, because Claude knows the shape of the place. There is a second benefit that surprised me: writing the file forces you to decide what your system actually is. Half of mine only became a real system on the day I had to describe it.
03

Put a page on the internet

15 minutes, genuinely

Separate repo, public this time. The trick that makes this free and permanent: if you name a repo yourusername.github.io, GitHub serves it at https://yourusername.github.io automatically.

  1. New repository. Name it exactly yourusername.github.io, all lowercase, matching your username. Set it Public.
  2. Make a folder on your Mac for it, anywhere. One file inside, called index.html.
  3. Add an empty file called .nojekyll next to it. This tells GitHub not to run an old blog engine over your files. Skipping it is the cause of a specific maddening bug where folders starting with an underscore silently vanish.
  4. Commit and push, same as the vault.
  5. On GitHub: Settings, then Pages in the sidebar. Under Source pick "Deploy from a branch", branch main, folder / (root). Save.
  6. Wait about a minute, then load https://yourusername.github.io. It is live, on the actual internet, with a real address you can text someone.

The page itself: let Cowork build it

Do not write HTML. Describe what you want and have Claude produce the file. This is exactly the kind of contained make-me-a-thing job Cowork is good at, so if that is where you already live, start there and download the file it gives you into your site folder.

Paste this to Cowork, or Claude Code, or plain chat
Build me a single self-contained index.html for a personal build log.
Everything inline, no frameworks, no external files or fonts, so it
works on GitHub Pages with zero setup and still opens if I
double-click it.

Contents:
- A header with my name, one line about who I am, and links to my
  email and GitHub.
- A "What I'm building" section with three project cards. Each card:
  title, one sentence, and a status chip reading LIVE, BUILDING,
  or PARKED.
- A "Log" section, newest first. Each entry is a date and two or
  three sentences.
- A footer with the date it was last updated.

Style: plain and readable, generous whitespace, system fonts, one
accent color. It should look like something a person made on purpose,
not a template. Mobile has to look right, most people will open this
on a phone.

Ask me for the name, the one-liner, and the three projects before
you write it.

That last line is the difference between a page about you and a page full of Lorem Ipsum you then have to edit. Answer the three questions, get the file, drop it in the folder, push it.

When you want to change it later, you do not start over. Open the same file with Claude and say what is different: "add a fourth project card for the asthma tracker, status BUILDING". It edits, you push, it is live in a minute.

Why one file A single self-contained HTML file has no build step, no dependencies, and nothing that can rot. You can open it by double-clicking it. In two years it will still work. Every framework you add is a thing that will break while you are on nights and it will kill the habit. Add complexity only when a real need forces you to, and probably not even then.

Changing the page from then on

Edit index.html, commit, push. Pages redeploys in under a minute. With Claude Code that is one sentence: "add a log entry for today about the intubation checklist, then push it". There is nothing else to it. No deploy pipeline, no server, no cost.

04

The wall between private and public

The part I got wrong first

The temptation, once both repos exist, is to automate the bridge. Sync the vault to the site. Publish a folder. Do not.

Publishing should stay a deliberate act with a human in it, for two reasons. The obvious one is exposure: an automated pipeline eventually publishes the note you wrote at 3am. The less obvious one is that a vault note and a public page are different objects. The note is for you and it is allowed to be raw. The page is for a reader and it owes them a point.

What works instead, and takes ten seconds:

The publishing prompt
Read [the note] in my vault.

Draft a log entry for my site from it: three sentences covering what
I built, what broke, and what's next. No jargon a non-physician would
trip on. Nothing identifiable about any patient.

Show me the draft. Don't touch index.html until I say go.

You read it. You fix the sentence that is not true. Then you say go. That review step is the whole wall, and it costs you almost nothing.

05

The loop that keeps it alive

The only hard part

Setup is an afternoon. The habit is the actual project. What has worked for me, after several versions that did not:

Daily, thirty seconds

End of a work session, one sentence to Claude: "commit and push the vault". That is the entire daily ritual. In GitHub Desktop it is one click. Do not batch this. A week of uncommitted work is a week you will lose to a spilled coffee.

Weekly, ten minutes

Once a week, update the public page. One log entry. It does not need to be a milestone, and "spent four hours on a thing that did not work" is a better entry than silence. The log is a record of effort, not a highlight reel, and the weeks where nothing shipped are the ones that make the record honest.

When the ritual gets repetitive, automate the words not the judgment

Once you have done the same publish steps a dozen times, write them down as a Claude Code skill: a folder in ~/.claude/skills/ with a SKILL.md inside describing the procedure in plain language. After that, one slash command runs the whole sequence. Mine handles updating the board on my site: it recounts the project totals from the page itself, pushes, verifies the change is actually live, and reads the result back to me. That last part is not decoration, it is an ADHD safeguard against believing I shipped something I did not.

The reason to bother A public log is a commitment device. I built mine mostly for my own accountability, on the assumption that nobody would read it, and that assumption was mostly correct for a long time. It worked anyway. Knowing there is a page with a visible date on it changes what you do on a Tuesday. Whatever else it becomes later, that is the part that pays off immediately.
06

When it breaks

It will, and none of it is fatal

Every one of these happened to me. None of them cost me anything except an evening the first time.

The page is live but my change is not showing

Give it sixty seconds, then hard refresh with Command + Shift + R. Browsers cache aggressively. If it is still stale after two minutes, check the Actions tab on GitHub for a red X, and check that you actually pushed rather than only committed.

404, the page never appeared at all

Three usual causes: the repo is private, the file is named something other than index.html, or Pages is pointed at the wrong branch. Settings, Pages, confirm the branch is main and the folder is root. Also confirm the repo name matches your username exactly and is all lowercase.

A folder or file I pushed is being ignored by the website

That is Jekyll, GitHub's built-in blog engine, quietly processing your files. Anything starting with an underscore disappears. Add the empty .nojekyll file at the root and push. That is the whole fix.

git asks for a password and rejects it

Passwords over HTTPS have not worked for years. Run gh auth login and pick HTTPS when it asks. Do not go hunting for a personal access token to paste somewhere: that path ends with a secret sitting in a config file, and secrets in config files eventually get committed.

I committed something I should not have

If it is a password, an API key, or a token, treat it as compromised the moment it was pushed, even to a private repo. Go to the service and revoke it, right now, before you do anything to the repo. Rotating the secret is the fix. Deleting the file is not, because the history still has it. If it is patient information, stop and get help from someone who knows the repo tools rather than improvising, because scrubbing history is one of the few genuinely destructive operations here.

Something about a merge conflict

It means the same file changed in two places, usually because you edited on a second machine. Show Claude the exact error text and say "walk me through fixing this". It is a five-minute problem and the error message contains everything needed to solve it.

I ended up with two copies of the same repo in different folders

Extremely common, and it produces a haunted feeling where your changes keep disappearing. Pick one folder as the real one, confirm it has the newest commits with git log, and delete or rename the other so you stop opening it by accident. I did this to myself and lost an hour before I noticed.

I broke the site and cannot fix it

Nothing here is unrecoverable, that is the entire point of commits. On GitHub, open the repo, click the commit history, find the version from before you broke it, and restore it. Or say to Claude: "revert the site to the last commit that worked". The safety net is real, and knowing it is there is what lets you push things you are not sure about.

07

Four things I wish somebody had told me

No commands in this section

The audience is not the point, and it is also not zero

For a long time the traffic is you, plus a few people you sent the link to. That is fine. The page still does its job as an accountability device on day one. Then at some point somebody you did not expect brings it up, and it turns out to have been a portfolio the whole time. Build it for the first reason. The second one arrives on its own or it does not.

Polish is the trap

The failure mode for people like us is spending four weekends on the design and never posting the log. The bottleneck is contact with a reader, not quality. Ugly and shipped beats beautiful and local, every single time. If you catch yourself picking fonts for the second hour, that is the tell.

Write for the version of you who forgot

The most valuable entries are the ones that record why you chose something, not what you chose. Six months later the what is visible in the code. The why is gone, and it is the only part you actually needed.

Let Claude do the typing, not the deciding

Claude will happily generate the HTML, the commit messages, the whole site. Let it. What you should not outsource is what goes on the page and what stays in the vault. Keep the judgment, delegate the syntax, and you will never be blocked by not knowing a command.

08

Copy-paste kit

Day one, in order

The full sequence

# once, on a new Mac # check first: if `git --version` prints a version, skip this line. # this is the Command Line Tools (~2 GB), NOT the full Xcode app. $ xcode-select --install $ git config --global user.name "Your Name" $ git config --global user.email "you@example.com" # optional but recommended: GitHub's CLI handles login properly $ brew install gh $ gh auth login # optional: Claude Code in the terminal $ npm install -g @anthropic-ai/claude-code # the vault, private $ cd ~/path/to/YourVault $ git init $ git add . $ git commit -m "First snapshot of the vault" $ git branch -M main $ git remote add origin https://github.com/YOURNAME/life-vault.git $ git push -u origin main # the site, public $ cd ~/path/to/site $ touch .nojekyll $ git init $ git add . $ git commit -m "First page" $ git branch -M main $ git remote add origin https://github.com/YOURNAME/YOURNAME.github.io.git $ git push -u origin main # from then on, forever, the only three you need $ git add . $ git commit -m "what changed" $ git push

Starter .gitignore for an Obsidian vault

.obsidian/workspace.json .obsidian/workspace-mobile.json .trash/ .DS_Store *.tmp

Sentences that do the work, once Claude Code is installed

If you only do one thing Do step 02. Get your vault into a private repo tonight. The website can wait a week. A second brain that exists on exactly one laptop is a second brain with a single point of failure, and that is worth fixing regardless of whether you ever build anything public at all.