Runbook — Deploy the Project as a Private Team Wiki (Quartz + git)
Goal: publish this computer-vision project as a browsable HTML wiki for the team, deployed through git, access-controlled to your team only. Decisions locked: Quartz (Obsidian-native), private/team-only hosting, whole project included.
Why Quartz: it’s purpose-built to turn an Obsidian vault into a website — it preserves our [[wikilinks]], auto-generates backlinks, a graph view, and full-text search with zero rewriting. All the cross-linking we built becomes the wiki’s navigation.
Skill level: comfortable with a terminal + git. ~1–2 hours first time. No coding.
Architecture (how the pieces fit)
your vault (PRIVATE, never deployed)
Projects/computer-vision/ ──[ sync-to-wiki.sh ]──► pharyvac-cv-wiki/ ──[ git push ]──► Cloudflare Pages
(the source notes) (a separate Quartz repo) + Access (team-only gate)
Key idea: a separate repo for the wiki. We do not put the whole private vault in git — only this one project’s notes get copied into the Quartz repo. That keeps the rest of your vault off the internet and lets you share exactly this project.
0. Prerequisites
- Node.js 20+ and git installed. Check:
node -v,git -v. - A GitHub (or GitLab) account for the repo.
- A Cloudflare account (free) for private hosting (§6). Alternatively GitHub Pages, but that’s public on free plans — see §6 note.
1. Scaffold Quartz
cd ~
git clone https://github.com/jackyzha0/quartz.git pharyvac-cv-wiki
cd pharyvac-cv-wiki
npm install
npx quartz create # choose "Empty Quartz" when promptedThis gives you a Quartz repo at ~/pharyvac-cv-wiki with a content/ folder (where your notes go) and quartz.config.ts (settings).
2. Get your content in (the sync script)
Use sync-to-wiki.sh (in this project’s scripts/). Open it, confirm the two paths at the top (SRC = this project, WIKI = ~/pharyvac-cv-wiki), then:
bash "/Users/jaymarc/Dropbox/Pharyvac Vault/Projects/computer-vision/scripts/sync-to-wiki.sh"It copies the project into content/, maps README.md → index.md (the wiki home), and skips noise (.DS_Store, the empty CSV detections/, self-test output). Re-run it any time you update the project, then commit.
3. Configure Quartz
Edit quartz.config.ts — the few fields that matter:
configuration: {
pageTitle: "Pharyvac CV — Intraoperative Detection & Validation",
baseUrl: "cv-wiki.pharyvac.com", // or your Cloudflare *.pages.dev URL
// theme/colors optional
},Leave the default plugins on — they give you backlinks, graph, search, and [[wikilink]] resolution out of the box.
Make onboarding obvious: the home page (README) already links Start-here and Glossary at the top — those are the plain-language entry points for non-CV team members. Optionally pin them in the Quartz explorer/nav order so they sit at the top of the sidebar.
4. Build & preview locally
cd ~/pharyvac-cv-wiki
npx quartz build --serve
# open http://localhost:8080Click through: the README is the home page, the specs/ research/ notes/ folders appear in nav, wikilinks resolve, backlinks and the graph populate. Fix anything odd before deploying (see Caveats).
5. Put it in git
cd ~/pharyvac-cv-wiki
git add .
git commit -m "Pharyvac CV wiki — initial"
git remote add origin git@github.com:<you>/pharyvac-cv-wiki.git # make this repo PRIVATE
git push -u origin mainMake the GitHub repo private. The repo holds your grant strategy + prelim data — it should not be public even though only the built site is what the team views.
6. Deploy — PRIVATE / team-only
Recommended: Cloudflare Pages + Cloudflare Access (free, and gives real team-only gating).
- Cloudflare dashboard → Workers & Pages → Create → Pages → Connect to Git → pick
pharyvac-cv-wiki. - Build settings: Build command
npx quartz build, Output dirpublic. - Deploy. You get a
*.pages.devURL (and can map a custom domain). - Lock it down: Cloudflare Zero Trust → Access → Applications → Add → self-hosted → your Pages URL → policy = allow only emails / your team’s domain. Now only logged-in team members can open it.
Every git push (after a sync-to-wiki.sh re-run) auto-rebuilds and redeploys.
GitHub Pages note: simpler, but on free plans Pages from a private repo is public. Only use it if you switch to the curated subset scope. For whole-project + private, Cloudflare Pages + Access (above) is the clean free path. (Netlify/Vercel password protection also work but gate fewer free seats.)
6b. Tailored to your stack (iloretamdnycsinus.com)
What we found: your main site is hand-written static HTML served by Netlify at iloretamdnycsinus.com, with Cloudflare in front. The Dropbox Website/ folder is a synced copy (no .git) — the real deploy source is your GitHub site repo, so any live-site edit happens there, not in the Dropbox folder.
Cleanest path (recommended): host the wiki on Cloudflare Pages, gate with Cloudflare Access, share the URL. This keeps the wiki entirely separate from the patient-facing medical site (you likely do not want a visible “research login” link on a public practice site) and consolidates on Cloudflare, which you already run.
- Step 0 — build the wiki repo (your terminal; §§1–5 above). Quartz wiki content synced in, pushed to a new private GitHub repo
pharyvac-cv-wiki. (This is the one step that needs your terminal — it can’t be done from a dashboard.) - Step 1 — Cloudflare Pages. Cloudflare → Workers & Pages → Create → Pages → Connect to Git → pick
pharyvac-cv-wiki. Build commandnpx quartz build, output dirpublic. Deploy → you getpharyvac-cv-wiki.pages.dev. - Step 2 — (optional) custom subdomain. On the Pages project add
research.iloretamdnycsinus.com. Because Cloudflare manages your DNS, it creates the record automatically. - Step 3 — gate it (Cloudflare Access). Zero Trust → Access → Applications → Add → Self-hosted → hostname = the
.pages.devURL (orresearch.subdomain) → policy = Allow → emails/email-domain of your team (or a one-time-passcode list). Save. Now only logged-in team members can open it. Free up to 50 users. - Step 4 — share. Send the team the URL. They log in via the Access screen. Done.
Optional — a discreet link from the main site. If you do want a link, add it to the GitHub site repo (not the Dropbox copy) — e.g. a small footer item. A snippet matching your existing nav style:
<!-- footer: internal research team -->
<a href="https://research.iloretamdnycsinus.com"
style="color: inherit; text-decoration: none; border-bottom: 1px solid var(--rule);">Research team</a>Place it in a footer rather than the public #research section, since that section is patient-facing SEO content. (The Access gate means the public never gets past the login anyway.)
Netlify alternative: if you’d rather keep everything on Netlify, create a second Netlify site from pharyvac-cv-wiki (build npx quartz build, publish public), point research.iloretamdnycsinus.com at it via a Cloudflare CNAME, and put the same Cloudflare Access app in front. Cloudflare Pages is slightly cleaner because hosting + gating are then one vendor.
7. Update flow (day to day)
# after editing notes in Obsidian:
bash ".../computer-vision/scripts/sync-to-wiki.sh"
cd ~/pharyvac-cv-wiki && git add . && git commit -m "update" && git push
# Cloudflare rebuilds automaticallyConsider a scheduled task to run the sync+push nightly if the team wants it always-fresh.
Caveats & fixes (read before first deploy)
| Issue | What happens | Fix |
|---|---|---|
Links outside this project — e.g. [[Projects/Pharyvac Surgical Technologies]], [[Intelligence/market/FESS Market Research MOC]], [[cv-in-surgery-literature-review]] | Show as unresolved (the target isn’t in the wiki) | Either (a) accept them as dead links, (b) copy those specific notes into content/ too, or (c) edit them to plain text before sync. Listed below. |
Links to non-page assets — [[cvat-labels.json]], [[evaluate_detections.py]], [[sync-to-wiki.sh]] | Quartz renders markdown pages, not code/JSON, so these won’t be clickable pages | Keep them as repo files (team reads them in GitHub), or link to the GitHub file URL instead of a wikilink |
The grant PDF (ARS DWK Innovation Grant 2026.pdf) | Quartz can serve it as a static download | Fine as-is; it’ll be a download link |
(C) / frontmatter | Quartz reads YAML frontmatter (status/tags/type) and can show tags | No action; optionally enable the tags/explorer features |
| Private data | The built site is gated by Access, but the repo also holds it | Keep the repo private (§5); don’t invite outside collaborators |
External links currently in this project (decide per the table above before deploy):
[[Projects/Pharyvac Surgical Technologies]](and its sub-notes) — from README + MOC[[Intelligence/market/FESS Market Research MOC]]— from MOC[[cv-in-surgery-literature-review]]— from MOC
Maintenance
- Quartz updates:
git pull upstreamperiodically (the runbook clone tracks the Quartz repo) — or just re-clone occasionally; your content lives incontent/. - Backups: the source of truth is the vault, not the wiki repo — the wiki is a derived artifact you can always rebuild from
sync-to-wiki.sh.
Links
- sync-to-wiki.sh — the content sync script this runbook drives
- README — becomes the wiki home page
- Quartz docs: https://quartz.jzhao.xyz/
- Cloudflare Pages: https://developers.cloudflare.com/pages/ · Access: https://developers.cloudflare.com/cloudflare-one/applications/