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ște Z - Published/ (bind-mount read-only din replica Syncthing pe Gideon), rebuild static HTML în /volume1/docker/quartz-stack/public/.
  • quartz-nginx — servește public/ pe portul 8889. Are sub_filter rules pentru Quartz → Grimoire rewrites (footer text etc.).
  • cloudflared (separat, în dns-stack) — CF Tunnel elegant_noyce, ingress sabin.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+PMove file to another folderZ - 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 array
  • sw.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 în Z - Published. Spre note private → broken link public (intenționat — publici doar ce vrei).
  • nginx -s reload NU prinde modificări sub_filter. Acelea sunt compile-time în nginx. După edit nginx.confdocker compose up -d --force-recreate quartz-nginx. Documentat în comentarii nginx.conf.
  • sub_filter NU 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_404 cu explicit no-cache.
  • Syncthing umask restrictiv pe Gideon. Fișiere ajung mode 700 prin Syncthing. nginx (root în container) nu le poate citi — DSM namespace mapping. Quartz entrypoint face chmod -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