TL;DR (for the impatient homies)
- We write in Obsidian like goblins hoarding markdown loot, sync the vault into this repo, let Quartz turn it into a shiny static site, then GitHub Actions yeets it to Pages. End of movie. đŹ
- Local edits?
npx quartz build --servegives us a vibe-check preview athttp://localhost:8080. - Push to
mainand the action pipeline does the deploy dance. No FTP, no drama, just vibes. - Custom domain?
blog.420360.xyzflexing via CNAME inquartz/static/CNAMEand DNS. - If something explodes, check the Actions logs, touch grass, fix markdown frontmatter, rebuild, push. Repeat.
Why This Post Exists (aka âfine, Iâll document itâ)
People keep asking âhow does this repo actually work?â and âhow do you glue Obsidian, Quartz, and GitHub without summoning a cursed merge conflict?â Consider this the canonical, slightly unhinged answer. Itâs half developer diary, half ops guide, and 100% meme-powered. Bookmark it, roast it, ship it.
The Core Stack, in Human Words
- Obsidian Vault: Where we brain-dump, link, and refactor notes. Pure markdown, backlinks, and enough graph energy to power a small moon.
- Quartz v4: Static site generator tuned for digital gardens. Transforms markdown in
content/into a production-ready site inpublic/. - GitHub Actions: Automation overlord. On push to
main, it installs deps, builds Quartz, and deploys to GitHub Pages. - GitHub Pages + CNAME: Hosting and domain wiring.
quartz/static/CNAME+ Pages settings makeblog.420360.xyzthe canonical home.
Folder Safari (what goes where)
content/: The source of truth. Notes, posts, pages. If itâs here, itâs considered canonical.posts/: Long-form blog entries with frontmatter. Publish-ready oncedraft: false.pages/: Evergreen docs likeSTART_HERE,QUICK_REFERENCE, etc.developer notes/: Meta posts like this oneâdev logs, process docs, spicy rants.assets/: Supporting media (css/images/js) referenced by content.
quartz/: The engine room. Config, components, processors, plugins, styles. Tweaks here change how the site is built/rendered.public/: Build output. Generated bynpx quartz build. Do not hand-editâchanges get nuked on next build..github/workflows/deploy.yaml: CI/CD brain. Runs on push tomain, builds, deploys to Pages.quartz/static/.nojekyll: Stops GitHub Pages from messing with our build.quartz/static/CNAME: Points toblog.420360.xyzfor custom domain flex.
The Obsidian â Quartz â GitHub â Pages Pipeline (step-by-step, no fluff)
- Write in Obsidian đïž
- Draft in the vault under
content/(mirrors repo). Use frontmatter:title,date,tags,draft. - Want backlinks? Use regular
[[wiki-links]]; Quartz resolves them to nice URLs.
- Local Preview đ
- Install deps once:
npm install(orpnpm installif you roll that way; repo uses npm by default). - Run:
npx quartz build --serve - Visit
http://localhost:8080to sanity-check layout, links, tags, and memes. Fix typos before the internet sees them.
- Commit + Push đ
git add .git commit -m "chore: update notes"(or something less feral)git push origin main
- GitHub Actions Deploy đ€
- Workflow installs deps, runs
npx quartz build, publishespublic/to Pages. - Progress lives in GitHub â Actions. Green check = we vibinâ. Red X = read logs, fix, rerun.
- Live Site đ
- Default Pages URL:
https://woodmurderedhat.github.io/blog420/ - Custom domain:
https://blog.420360.xyz(once DNS + CNAME are set).
Frontmatter Rules (or âhow not to brick the buildâ)
layout: Usuallypost. Quartz uses it to pick templates.title: Human-readable. Also used in meta tags and listings.date: ISO-ishYYYY-MM-DD. Keep it real so sorting works.author: Cred. Default towoodyunless youâre guesting.tags: Array of vibes. Drives tag pages.excerpt: Short teaser. Shows up in cards/previews.draft:trueto hide from build outputs. Set tofalseto publish. Remember to flip it!
Naming & URLs
- Posts live at
content/posts/YYYY-MM-DD-slug.md. URL slug follows file name. - Pages live in
content/pages/with friendly names (e.g.,START_HERE.md). - Developer logs (like this) in
content/developer notes/â spaces are fine; Quartz handles URL encoding. - Assets: prefer relative links (
/assets/images/...). Keep them undercontent/assets/so theyâre copied over.
Obsidian Conventions (so links donât cry)
- Use wikilinks
[[Some Page]]; Quartz resolves to/some-pagewhen file names align. - For explicit paths, use
[text](/path)to avoid ambiguity. - Keep internal media near the note or in
content/assets/images/to avoid path hell. - Avoid absolute Windows paths in embeds; relative paths survive sync.
Git Hygiene (no cursed merge conflicts)
- Branching:
mainis prod. If youâre experimenting, branch off and PR, but solo dev can commit straight tomain(you rebel). - Keep
public/untracked (itâs build output). Donât edit it manually. - Add meaningful commit messages. Future-you will thank present-you.
- If Actions fails, read logs before panic-pushing.
Custom Domain Flex
- File:
quartz/static/CNAMEâ containsblog.420360.xyz. - DNS: CNAME
blogâwoodmurderedhat.github.io(or A records to GitHub Pages IPs). - In repo settings â Pages: Source = GitHub Actions, Custom domain =
blog.420360.xyz, Enforce HTTPS checked.
Theme & Layout Shapeshifting
- Entry points:
quartz.config.tsandquartz.layout.tsfor site meta, nav, and component wiring. - Components:
quartz/components/holds UI bits (titles, cards, headers). Edit with taste. - Styles:
quartz/styles/andpublic/index.css(generated) guide the vibe. Prefer editing source styles, not built CSS. - Plugins/Processors:
quartz/plugins/andquartz/processors/customize rendering, syntax highlighting, link behaviors.
Build Commands (tattoo these on your terminal history)
- Local serve:
npx quartz build --serve - Clean build (if cache demons appear): delete
.quartz-cachethen rerun build. - Deploy (CI): push to
main; Actions handles it.
Frequent Oh-Noâs (and fixes)
- Broken links: Check for renamed files; use wikilinks; rebuild locally to spot 404s early.
- Draft not publishing: Set
draft: false. Yes, seriously. - CSS not loading on Pages: Ensure
.nojekyllexists inquartz/static/(it does). Clear cache. - Wrong domain: Confirm CNAME file + DNS + Pages settings are aligned. Wait for DNS propagation.
- Action failed: Open Actions logs. Usually missing deps or frontmatter typos.
The Philosophy (a slightly chaotic manifesto)
This blog is part lab notebook, part soapbox. We optimize for:
- Low friction: Obsidian-first authoring keeps the writing flow high. No CMS logins, no WYSIWYG rage.
- Versioned everything: Git is the source of truth. History matters. Reverts are cheap.
- Static by default: Fewer moving parts. Speedy, secure, cache-friendly.
- Memetic energy: Docs donât have to be dry. If memes help you remember the pipeline, thatâs a feature.
The Long Story (strap in, nerds)
Origins: Why Quartz over $RANDOM_STATIC_SITE_GENERATOR?
Hugo? Fast but opinionated. Jekyll? Classic but Ruby dependency vibes. Next.js? Overkill for a garden. Quartz hits the sweet spot: markdown-native, backlink-aware, batteries-included for digital gardens, and zero-config hosting on Pages. It respects the Obsidian mental modelânotes as nodes, links as edgesâwithout forcing a monolithic CMS.
Obsidian as the Content OS
Obsidian is the note engine. We lean on:
- Backlinks: Knowledge graph without manual nav menus.
- Transclusion: Embeds keep DRY content DRY.
- Tagging: Quick theming for Quartz to surface.
- Folder discipline: Mirrors repo, so git diff = Obsidian diff.
We avoid heavy plugins that mutate frontmatter or file headers. Keep it lean to keep CI happy.
The Quartz Build Internals (reader-mode)
- Input: Everything under
content/with valid frontmatter. - Processing: Plugins handle markdown, syntax highlighting, link resolution, RSS, sitemap.
- Output:
public/with HTML, CSS, JS, RSS feed, sitemap, tag pages. - Cache:
.quartz-cacheaccelerates builds; nuke it when weirdness appears.
Deployment Pipeline Deep Dive
- Trigger: Push to
main. - CI Steps:
- Checkout code
- Setup Node
- Install deps (
npm cipreferred for lockfile determinism) - Build (
npx quartz build) - Upload artifact / deploy to Pages
- Result: Pages serves the freshly built
public/. CNAME ensures custom domain sticks.
Local Dev QoL Tips
- Use
npx quartz build --serveand leave it running while editing. Hot-ish reload saves brain cycles. - Lint frontmatter mentallyâthereâs no strict linter yet, but consider adding one if youâre feeling fancy.
- Keep image sizes sane; static hosting loves optimized assets.
Content Lifecycle
- Ideate in Obsidian (rough notes, bullets, memes).
- Draft in
content/posts/orcontent/developer notes/with full frontmatter. - Preview locally, fix links.
- Mark
draft: falsewhen ready. - Commit, push, ship.
Backups & Safety
- Git is the backup. Push often.
- Optionally mirror the vault via cloud sync, but repo remains canonical for deploy.
Performance & SEO Cheatsheet
- Quartz ships a sitemap and RSS. Donât break them; keep frontmatter dates real.
- Add
excerptfor better link previews. - Use headings hierarchically; Quartz uses them for TOC/nav.
Accessibility & Legibility
- Keep heading levels sensible.
- Use alt text on images.
- Avoid cursed color contrasts when theming.
Meme Break (because dopamine)
- âIt works on my machineâ â famous last words before a red Actions check.
- âJust one more tweakâ â commits at 3:17 AM, vibes immaculate, syntax questionable.
- âStatic sites are boringâ â says who? This oneâs blasting at PageSpeed 100 and wearing sunglasses.
Mini FAQ
- Can I edit
public/? No. Itâs a build artifact. Touch it and the next build yeets your changes. - Where do I put images?
content/assets/images/. Reference with/assets/images/.... - Why is my note not showing? Probably
draft: trueor missing frontmatter. - Do I need Docker? Nope. Node + npm is enough. Thereâs a Dockerfile if you like containers.
- Can I use PNPM? Sure locally, but CI uses npm. Keep lockfiles consistent.
The Vibe Guide (style + voice)
- Emojis are welcome. Profanity is seasoningâuse responsibly.
- Keep intros short, jump to value.
- Link other notes; the garden thrives on connections.
Ship Checklist (before pushing)
- Frontmatter valid?
draftflipped? - Links resolve? (local preview says yes?)
- Images present and pathed correctly?
- Commit message not âfix stuff again lolâ? (âŠbut also, live your life.)
Future Enhancements (aka TODO, but make it fun)
- Add a frontmatter linter to catch missing fields.
- Consider scheduled builds to refresh caches even without content changes.
- Add visual diffing for CSS tweaks.
- Build a âToday I Learnedâ template for rapid-fire posts.
Closing Hype
This repo is a vibes-first, automation-backed, markdown-native blog stack. Obsidian keeps writing joyful, Quartz keeps pages fast, and GitHub keeps us versioned and deployed. The rest is just us, typing into the void and hoping the void leaves a nice comment. Now go write something unreasonably good and yeet it to main. đ