Inspired by Pranav Bhardwaj’s XDA article, I built this site in a couple of hours using Quartz, a static site generator designed specifically for publishing Obsidian vaults. With this post written mostly by Claude after we finished, here’s a complete guide to setting up your own Obsidian-powered blog in under two hours (or faster if you don’t take as much hand holding as I did).
Prerequisites
- A DigitalOcean droplet (or any Ubuntu server)
- Optional: Install Claude Code on your droplet (see Installing Claude Code on a DigitalOcean Droplet - A Step-by-Step Guide )
- A domain name pointed to your server’s IP
- An Obsidian vault (or create one)
- Basic familiarity with terminal commands (or learn how)
Part 1: Server Setup and Quartz Installation
1. Prepare Your Server
SSH into your server and install Node.js (Quartz requires Node 18+):
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs2. Clone and Install Quartz
Create a project directory and clone Quartz:
mkdir -p ~/workbus
cd ~/workbus
git clone https://github.com/jackyzha0/quartz.git .
npm install3. Configure Quartz
Edit quartz.config.ts to customize your site:
pageTitle: "Your Site Name",
baseUrl: "yourdomain.com",Create a starter page in content/index.md:
---
title: Welcome
---
# Welcome to My Digital Garden
Start writing your content here!4. Build Your Site
npx quartz buildThis generates static HTML files in the public/ directory.
Part 2: Web Server Configuration
1. Install and Configure Nginx
sudo apt install -y nginxCreate an Nginx configuration file at /etc/nginx/sites-available/yourdomain.com:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /home/youruser/workbus/public;
index index.html;
location / {
try_files $uri $uri.html $uri/ =404;
}
}Enable the site:
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx2. Set Up SSL with Certbot
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.comCertbot will automatically configure HTTPS and set up auto-renewal.
Important: Fix directory permissions so Nginx can access your files:
chmod 755 /home/youruserPart 3: GitHub Integration
1. Create a GitHub Repository
- Go to github.com/new
- Create a private repository (e.g.,
myblog) - Don’t add README or .gitignore
2. Connect Your Server to GitHub
cd ~/workbus
git init
git remote add origin https://github.com/username/myblog.git
git config user.name "Your Name"
git config user.email "your@email.com"
git add -A
git commit -m "Initial commit"
git branch -M main
git push -u origin mainYou’ll need a GitHub Personal Access Token (create at github.com/settings/tokens) instead of your password.
Part 4: Obsidian Vault Setup
1. Organize Your Local Vault
Move your Obsidian vault to a local directory (not iCloud):
cp -R "/path/to/vault" ~/Documents/myblogOpen Obsidian and add this new location as a vault.
2. Clone the Repository
cd ~/Documents/myblog
git init
git remote add origin https://github.com/username/myblog.git
git config user.name "Your Name"
git config user.email "your@email.com"
git pull origin main --allow-unrelated-histories3. Organize Content
Move your markdown files into a content/ folder:
mkdir -p content
mv *.md content/
git add .
git commit -m "Move content to content folder"
git push origin mainPart 5: Automation
1. Create a Sync Script (Local)
Create ~/Documents/myblog/sync.sh:
#!/bin/bash
cd ~/Documents/myblog
if [[ -z $(git status -s) ]]; then
echo "No changes to sync."
exit 0
fi
git add .
git commit -m "Update notes - $(date '+%Y-%m-%d %H:%M')"
git push origin main
echo "✓ Synced successfully!"Make it executable:
chmod +x ~/Documents/myblog/sync.sh2. Server Auto-Update Script
Create /home/youruser/workbus/update-blog.sh:
#!/bin/bash
cd /home/youruser/workbus
git fetch origin main
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/main)
if [ $LOCAL != $REMOTE ]; then
echo "$(date): New changes detected, updating..."
git pull origin main
npx quartz build
echo "$(date): Blog updated successfully!"
fiMake it executable and add a cron job:
chmod +x ~/workbus/update-blog.sh
crontab -eAdd this line to check for updates every 5 minutes:
*/5 * * * * /home/youruser/workbus/update-blog.sh >> /home/youruser/workbus/update.log 2>&1
Your Workflow
Now publishing is simple:
- Write or edit notes in Obsidian
- Run your sync script:
~/Documents/myblog/sync.sh - Wait 5 minutes for auto-deployment
- Your changes appear live on your website
Customization Tips
Themes
Install community themes from quartz-themes:
cd ~/workbus
curl -s -S -o action.sh https://raw.githubusercontent.com/saberzero1/quartz-themes/master/action.sh
chmod +x action.sh
./action.sh tokyo-night
npx quartz buildCustom Logo
Replace the text title with a logo by modifying quartz/components/PageTitle.tsx.
Dark Mode Default
Edit quartz.layout.ts and set:
Component.Darkmode({ defaultMode: "dark" })Conclusion
You now have a professional publishing system that combines Obsidian’s writing experience with Quartz’s beautiful output. Your personal knowledge base is version-controlled, automatically backed up to GitHub, and publishes seamlessly to the web.
The beauty of this setup is that it grows with you. Start with simple notes, add themes as you explore, customize components when you need them. Your digital garden is ready to cultivate.
Happy writing!
