Setup
From nothing to a live site. Assumes Node 20+ and a GitHub account. Everything below is free.
1. Scaffold
npm create obsidiary@latest my-notes
It asks two things: a title, and whether your notes are a local folder or a GitHub repository. Either is fine — you can change it later in one line.
cd my-notes
npm install
npm run dev
Open http://localhost:4321. The sample vault is there so the site isn't empty; delete it once you have your own notes.
2. Add your notes
Local folder. Put markdown in vault/. Point Obsidian at that folder and use
it exactly as you normally would — Obsidiary re-reads it on every save.
Your existing vault. Copy it in, or replace vault/ with a symlink to it:
rm -rf vault && ln -s ~/Documents/MyVault vault
A repository. See Notes in their own repo.
A public repository means a public site — including attachments. Read Publishing only some notes first. It takes two minutes and it is the one mistake that is genuinely hard to undo.
3. Put it on GitHub
git init
git add -A
git commit -m "my notes site"
gh repo create my-notes --public --source=. --push
No gh? Create the repo on github.com and follow the instructions it gives you.
4. Deploy
Pick one — full walkthroughs in Deploying.
| Host | What you run |
|---|---|
| Cloudflare | npx wrangler deploy |
| Vercel | import the repo on vercel.com |
| Netlify | import the repo on netlify.com |
| GitHub Pages | Settings → Pages → Source → GitHub Actions |
Cloudflare is the recommendation: unlimited bandwidth, free custom domains, no restriction on commercial use.
5. Keep it updated
npm update obsidiary @obsidiary/astro
That is the whole upgrade. Your notes and your config are yours; the engine is a dependency, so there is never a merge to resolve.
Configuration
Everything lives in astro.config.mjs:
obsidiary({
vault: './vault', // or: repo: 'you/notes'
title: 'My Notes',
description: '',
explicitPublish: false, // true → only notes with `publish: true`
removeDrafts: true, // drop `draft: true`
ignore: ['private/'], // folders to skip entirely
base: '', // serve under a subpath, e.g. '/notes'
live: false, // add /live, which renders any public vault
})
What you get for free
Three routes are added without any wiring:
/graph— the whole vault as a graph/search-index.json— powers ⌘K, fetched on first search only/vault-index.json— the entire parsed vault as data, for anything else