Solanasis Docs Web Viewer — Setup & Usage Guide
Last Updated: 2026-03-28 Status: Active — local Docker deployment via Cloudflare Tunnel
Architecture Overview
┌─────────────────┐ ┌──────────────────┐ CF Tunnel ┌───────────────────┐
│ Obsidian / │ file edits │ Quartz Docker │ ──────────> │ docs.solanasis.com │
│ SilverBullet │ ────────────> │ (localhost:3003) │ │ (Cloudflare Access)│
└─────────────────┘ └──────────────────┘ └───────────────────┘
│ volume mount
v
/home/zasage/_my/
_solanasis/solanasis-docs/
┌─────────────────┐ CF Tunnel ┌──────────────────┐
│ SilverBullet │ <──────────> │ edit.solanasis.com│
│ (Docker:3000) │ │ (Cloudflare Access)│
└─────────────────┘ └──────────────────┘
Two subdomains, two tools:
docs.solanasis.com— Beautiful read-only viewer (Quartz, local Docker via Cloudflare Tunnel)edit.solanasis.com— Editor with auto-save (SilverBullet via Cloudflare Tunnel)
Both protected by Cloudflare Access (email OTP authentication).
Phase 1: Create GitHub Repo for the Site
- Go to github.com/dzinreach and create a new private repo:
solanasis-docs-site - Push the local site repo:
cd C:/_my/_solanasis/solanasis-docs-site git add -A git commit -m "Initial Quartz setup for Solanasis docs" git remote add origin https://github.com/dzinreach/solanasis-docs-site.git git push -u origin main
Phase 2: Configure GitHub Secrets
You need secrets in both repos:
In solanasis-docs-site repo (Settings > Secrets and variables > Actions):
| Secret | Value | How to get it |
|---|---|---|
DOCS_REPO_TOKEN | GitHub PAT with repo scope | github.com > Settings > Developer settings > Personal access tokens > Fine-grained tokens > create one with read access to solanasis-docs |
CLOUDFLARE_API_TOKEN | Cloudflare API token | Cloudflare dashboard > My Profile > API Tokens > Create Token > “Edit Cloudflare Workers” template (needs Pages read/write) |
CLOUDFLARE_ACCOUNT_ID | Your Cloudflare account ID | Cloudflare dashboard > any domain > right sidebar “Account ID” |
In solanasis-docs repo (Settings > Secrets and variables > Actions):
| Secret | Value | How to get it |
|---|---|---|
SITE_REPO_TOKEN | GitHub PAT with repo scope | Same token as above works, or create a separate one with write access to solanasis-docs-site |
Phase 3: Start Quartz Docs Server
cd /home/zasage/_my/_solanasis/solanasis-scripts
# Build and start Quartz docs server
docker compose -f docker-compose.quartz.yml up -d --build
# Verify it's running
docker compose -f docker-compose.quartz.yml ps
# Check logs (first build takes ~3 minutes for 500+ files)
docker compose -f docker-compose.quartz.yml logs -f
# Test locally
curl -s http://localhost:3003 | head -5Rebuild after Quartz config changes:
docker compose -f docker-compose.quartz.yml up -d --buildContent changes (edits to solanasis-docs/) are picked up automatically by Quartz’s --serve mode.
Note: The Cloudflare Pages project (
solanasis-docs) and GitHub Actions workflow are preserved as fallback. To rollback:python3 switch_docs_to_tunnel.py --rollback
Phase 4: Start SilverBullet
cd /home/zasage/_my/_solanasis/solanasis-scripts
# Get password from Infisical
export SB_PASSWORD=$(secret get SB_PASSWORD -f shared --plain)
# Start SilverBullet
docker compose -f docker-compose.silverbullet.yml up -d
# Verify it's running
docker compose -f docker-compose.silverbullet.yml ps
# Check logs
docker compose -f docker-compose.silverbullet.yml logs -fTest locally: Visit http://localhost:3000 — you should see your vault files.
Add to Cloudflare Tunnel
- Cloudflare Zero Trust dashboard > Networks > Tunnels
- Select your existing tunnel (or create one)
- Public Hostname > Add:
- Subdomain:
edit - Domain:
solanasis.com - Service:
http://localhost:3000
- Subdomain:
- Save
Phase 5: Configure Cloudflare Access (Auth)
For docs.solanasis.com
- Zero Trust > Access > Applications > Add Application > Self-hosted
- Application name:
Solanasis Docs (Read) - Subdomain:
docs, Domain:solanasis.com - Session duration: 7 days
- Add policy:
- Name:
Allow Solanasis Team - Action: Allow
- Include > Emails:
dmitri@solanasis.com(add contractor emails as needed)
- Name:
- Identity providers: check “One-time PIN”
For edit.solanasis.com
- Repeat the above but:
- Application name:
Solanasis Docs (Edit) - Subdomain:
edit - Consider restricting to just Dmitri’s email (more restrictive than read access)
- Application name:
Test Auth
- Open an incognito window
- Visit
docs.solanasis.com - You should see Cloudflare’s login page
- Enter your email, check for the OTP email, enter the code
- You should now see the Quartz site
Phase 6: Start the Auto-Push Watcher
# Install dependency
pip install watchdog
# Run the watcher (keeps running in foreground)
python C:/_my/_solanasis/solanasis-scripts/docs-auto-push.py
# Or with custom settings
python docs-auto-push.py --repo-path C:/_my/_solanasis/solanasis-docs --debounce 60Run as Background Service (Optional)
To keep it running after closing the terminal, create a Windows Task Scheduler task:
- Program:
python - Arguments:
C:/_my/_solanasis/solanasis-scripts/docs-auto-push.py - Trigger: At system startup
- Run whether user is logged on or not
Daily Usage
Viewing Docs
- Go to
docs.solanasis.com - Authenticate with email OTP (once per 7 days)
- Browse with sidebar explorer, search, graph view
- Everything renders beautifully — wikilinks, callouts, tables, code blocks
Editing Docs
- Go to
edit.solanasis.com - Authenticate with email OTP
- Navigate to the file you want to edit
- Edit — changes auto-save immediately to disk
- Quartz auto-detects file changes and rebuilds (~5-10 seconds)
- Changes appear on docs.solanasis.com immediately after rebuild
Quick Edit from Reader
- When viewing a doc on
docs.solanasis.com, click the link in the footer to jump toedit.solanasis.com
Excluding Files from Publishing
Entire folders (.quartzignore in quartz.config.ts)
Already excluded:
solanasis-client-files/*credential**secret*.env*.obsidian/_to_organize_categorize/
Individual files (frontmatter)
Add to any .md file’s frontmatter:
---
publish: false
---This file will be visible in SilverBullet but NOT on docs.solanasis.com.
Troubleshooting
Quartz docs not accessible
- Check container:
docker compose -f docker-compose.quartz.yml ps - Check logs:
docker compose -f docker-compose.quartz.yml logs --tail 50 - Test locally:
curl -s http://localhost:3003 | head -5 - Rebuild:
docker compose -f docker-compose.quartz.yml up -d --build - Check Cloudflare Tunnel:
sudo systemctl status cloudflared
Site not updating after edit
- Check Quartz logs for rebuild:
docker compose -f docker-compose.quartz.yml logs --tail 10 - Quartz
--servemode should auto-detect changes; if not, restart:docker compose -f docker-compose.quartz.yml restart
SilverBullet not accessible
- Check container:
docker compose -f docker-compose.silverbullet.yml ps - Check logs:
docker compose -f docker-compose.silverbullet.yml logs - Restart:
docker compose -f docker-compose.silverbullet.yml restart - Check Cloudflare Tunnel is running and routing
edit.solanasis.com
Cloudflare Access blocking you
- Check your email is in the Access policy
- Check the OTP email didn’t go to spam (sender:
noreply@notify.cloudflare.com) - Try incognito window to clear cached auth cookies
Quartz build failing
- Check container logs:
docker compose -f docker-compose.quartz.yml logs - Common issue: malformed frontmatter in an .md file
- Rebuild:
docker compose -f docker-compose.quartz.yml up -d --build
Costs
| Component | Cost |
|---|---|
| Quartz | Free (MIT license) |
| SilverBullet | Free (MIT license) |
| Docker (local) | Free (runs on existing WSL host) |
| Cloudflare Access | Free tier (50 users) |
| Cloudflare Tunnel | Free |
| Total | $0/month |