Grimoire & Quartz — cum trăiește sabin.uk
sabin.uk e Grimoire-ul public — Quartz care servește Z - Published/ din
vault. Pipeline-ul e file-based: pun un fișier într-un folder pe Mac, ~2 min
mai târziu e live pe internet. Aici e cum funcționează în spate + de ce e
PWA installable.
Ce este
Stack-ul quartz-stack pe Gideon (NAS Synology): două containere Docker care
transformă Markdown-ul din AOL/05 - Notes/06 - Grimoire/Z - Published/ în
HTML static, servit prin Cloudflare Tunnel ca sabin.uk.
quartz-builder— poller 60s. CiteșteZ - Published/(bind-mount read-only din replica Syncthing pe Gideon), rebuild static HTML în/volume1/docker/quartz-stack/public/.quartz-nginx— serveștepublic/pe portul 8889. Aresub_filterrules pentru Quartz → Grimoire rewrites (footer text etc.).cloudflared(separat, îndns-stack) — CF Tunnelelegant_noyce, ingresssabin.uk → http://localhost:8889.
Theme: Quartz cu overlay custom “Grimoire” — dark + gold palette, Cinzel display font, Times Roman body. Vault-only branding (zero referință la Quartz în UI vizibil — sub_filter le rewrite-uiește).
Cum funcționează — diagramă
Mac Obsidian (vault root: AOL/, Grimoire la 05 - Notes/06 - Grimoire/)
│
│ Cmd+N → salvez în Z - Published/ sau mut din A - Inbox / B - Projects
│
▼
Syncthing mesh (mesh existent, fără daemon nou)
│ ~10-60s
▼
Gideon replica: /volume1/homes/sabin/Nevermore/AOL/.../Z - Published/
│
│ bind-mount :ro
▼
quartz-builder container (poll 60s)
│ rebuild static HTML
▼
/volume1/docker/quartz-stack/public/
│ bind-mount
▼
quartz-nginx :8889
│ CF Tunnel elegant_noyce
▼
Cloudflare edge → https://sabin.uk
Total latency worst-case: ~2 minute (10-60s Syncthing + 60s builder poll).
Workflow operator
Cel mai simplu mod: scrii direct în Z - Published/. Cmd+N în Obsidian,
salvezi ca destinație Grimoire/Z - Published. Gata.
Mod recomandat (draft → publish): scrii în A - Inbox sau B - Projects.
Când e gata, Cmd+P → Move file to another folder → Z - Published.
Drag & drop: trag direct din panoul Obsidian.
Frontmatter opțional (doar title + date + tags). Fără frontmatter,
Quartz folosește filename-ul ca titlu.
Atașamente: pune-le în Z - Published/_attachments/. Quartz vede DOAR
ce e sub Z - Published/, deci Attachments/ din root vault NU e vizibil.
Referință cu ![[_attachments/imagine.png]] sau Markdown standard.
Scoatere de pe public: mut nota înapoi în orice folder din afara
Z - Published. La următorul rebuild dispare.
Detaliu complet: Cum public o notă.
PWA — installable pe iPhone / Android / desktop
sabin.uk e Progressive Web App de pe 2026-05-27 evening. Pe iPhone:
Safari → Share → Add to Home Screen → primești icon gold-G pe dark cu
splash screen propriu. Pe desktop Chromium-based: bara de adresă → install icon.
PWA assets:
manifest.webmanifest— display, theme color, icons arraysw.js— service worker (cache strategy: stale-while-revalidate pentru HTML, cache-first pentru assets)- 8 icon-uri PNG generate procedural în
_raw/it_tools/nas/quartz-grimoire-stack/branding/pwa-icons/(Cinzel.ttf n-a vrut să se încarce în PIL, deci icon-urile sunt gold “G” pe Times Roman — dacă vrei mai bespoke, regenerezi manual + înlocuiești cele 8 PNG-uri).
Verificat zero issues pe 16 page×viewport combinations (iPhone SE 320 / iPhone 8 375 / iPhone Plus 414 / iPad 768 / desktop 1024-1920 × home + article views).
De ce contează
1. File-based = zero ceremonie de publishing. Nu git push, nu publish
button, nu plugin quartz-syncer care decide ce iese pe public. Doar location
pe disc. Reduce frecarea cognitivă la zero.
2. Vault-canonical. Markdown-ul live în vault e sursa adevărată. NU există “copy pentru publicare” separată care drift-uiește. Audit zilnic: vault md5 vs Gideon live trebuie să matchuiască.
3. Public-by-folder-decision. Z - Published/ e literal singura graniță.
Mut un fișier în A - Inbox → în ≤60s dispare de pe web. Mut-l înapoi →
revine.
4. PWA = offline-capable. Service worker cache-uiește. Pe metrou, sabin.uk încă încarcă din cache.
Cum interacționez cu el
Operator-side:
- Publish:
Z - Published/foo.md→ așteaptă ~2 min →sabin.uk/foo. - Unpublish: mut fișierul afară din folder.
- Verifică build: SSH Gideon →
docker logs quartz-builder --tail 50. - Force rebuild: SSH Gideon →
docker exec quartz-builder /quartz/build.sh. - Install ca app: Safari iPhone → Share → Add to Home Screen.
Limite / gotchas
- Atașamente sub
Z - Published/_attachments/only.Attachments/din root vault e privat, Quartz nu le vede. - Wikilinks între note publicate doar.
[[Altă Notă]]se rezolvă DACĂ target-ul e tot înZ - Published. Spre note private → broken link public (intenționat — publici doar ce vrei). nginx -s reloadNU prinde modificări sub_filter. Acelea sunt compile-time în nginx. După editnginx.conf→docker compose up -d --force-recreate quartz-nginx. Documentat în comentarii nginx.conf.sub_filterNU chain-uiește. Operează pe upstream bytes, nu pe propriul output. Dacă rewrite-uiești text X → Y și apoi vrei să rewrite-uiești Y → Z, al doilea filter trebuie să match-uiască ORIGINAL X, nu Y. Easy trap.- Cloudflare cache-uiește 404-uri. Dacă un block static-assets are
Cache-Control: public, immutable, header-ul se aplică și răspunsurilor 404 → CF cache-uiește 404 transient un an. Fix:error_page 404 = @nocache_404cu explicit no-cache. - Syncthing umask restrictiv pe Gideon. Fișiere ajung mode
700prin Syncthing. nginx (root în container) nu le poate citi — DSM namespace mapping. Quartz entrypoint facechmod -R go+rX /quartz/public/după rsync ca să neutralizeze. - Vault → Gideon drift posibil. Dacă editezi CSS direct pe Gideon (fără sync înapoi pe Mac), versiunile diverg. Audit md5 episodic recomandat.
- PWA icons procedural. Cele 8 PNG-uri sunt generate cu PIL + Times Roman. Dacă vrei design mai bespoke, regenerezi manual + înlocuiești.
Unde sunt documentate
_raw/it_tools/nas/quartz-grimoire-stack/— compose + nginx.conf + theme overlay + PWA assets_raw/it_tools/nas/quartz-grimoire-stack/branding/pwa-icons/— PWA icon set_raw/it_tools/nas/docker_stack_registry.md— stack registry Gideon- Workflow publishing — operator-facing
- Memory
feedback-web-ui-verify-playwright— verify cu Playwright înainte de “done” - Skill
web-ui-verify-before-claim-done— măsurători (getBoundingClientRect- getComputedStyle) obligatorii pentru orice UI change pe Quartz/dashboard