Threadwell
Recovered threads and submerged records.
An Obsidian vault published with Quartz 5 to GitHub Pages. The site is a convenient host for Twitter/X threads and other material that is not reliably web-indexed.
Live (after Pages is enabled): https://ed94.github.io/Threadwell
Layout
Open this repo root as the Obsidian vault. Quartz is only the publisher; it lives in site/.
archive/ # public — primary sources
threads/ # Twitter/X and similar
sources/ # talks, pages, other records
canvases/ # public — .canvas maps
notes/ # public — authored / distilled writing
templates/ # not published
meta/ # not published — conventions, local attachments
private/ # not published, not pushed
publish/ # tracked overlay: quartz.config.yaml
site/ # local Quartz clone (gitignored; own remotes)
.obsidian/
.github/workflows/deploy.yml
archive/, canvases/, and notes/ are public by default. site/ is a separate git checkout of Quartz (origin → jackyzha0/quartz). Threadwell's only remote is Ed94/Threadwell.
Frontmatter
| Field | Values |
|---|---|
type |
archive | canvas | note |
source |
twitter | youtube | odysee | article | original | other |
source_url |
original URL |
author |
original author |
date |
original date YYYY-MM-DD |
archived |
capture date |
status |
draft | review | published |
draft |
true omits the page from the site |
tags, description, aliases |
as usual |
draft: true only hides a page from the site. A public GitHub repo still contains the file. Use private/ for anything that must not be pushed.
Templates: templates/archive-source.md, templates/authored-note.md (Templater placeholders).
Images and embeds
Images: absolute HTTPS URLs on your image host. Do not commit local binaries for published notes.

YouTube and tweets (Quartz Obsidian-flavored Markdown):


Odysee (iframe; copy the embed URL from Odysee share):
<iframe width="560" height="315" src="https://odysee.com/$/embed/SLUG/CLAIM" allowfullscreen></iframe>
Remote URLs and iframes are left as-is in the static build.
Obsidian plugins
| Plugin | Why |
|---|---|
| Templater | Fills dates/titles in the starter templates |
| Dataview | Local queries by type / source / status (not rendered on the site) |
| Linter | Consistent YAML |
| Media Extended | Better in-vault YouTube playback |
| Advanced Canvas | Stronger canvas editing; site still uses stock JSON Canvas |
Core: Canvas, Templates (folder templates), Backlinks, Graph, Properties, Page preview.
See meta/obsidian-setup.md and meta/conventions.md.
Local preview
Needs Node 22+ and npm 10.9.2+.
cd C:\projects\Threadwell
.\publish\setup.ps1
cd site
npx quartz build -d .. --serve
publish/setup.ps1 clones Quartz into site/ if needed, then copies publish/quartz.config.yaml over the stock config.
GitHub Pages
- Repo Settings → Pages → Source: GitHub Actions
- If an old
github-pagesenvironment blocks the first deploy, delete it under Settings → Environments. The workflow recreates it. - Push
main. CI clones Quartz intosite/, appliespublish/quartz.config.yaml, builds with-d ... - Site:
https://ed94.github.io/Threadwell
baseUrl lives in publish/quartz.config.yaml. Change it if you attach a custom domain.
Add content and republish
- New thread: Templater →
archive-source→ save underarchive/threads/ - Transcribe posts in order. Host images. Optional YouTube/Odysee/tweet embeds.
- Distill in
notes/withauthored-note. Wikilink the archive record. - Set
draft: falseandstatus: published - Preview:
cd site; npx quartz build -d .. --serve - Commit and push
main(vault +publish/, neversite/)
Threadwell remotes: origin → https://github.com/Ed94/Threadwell.git only.
Quartz remotes live in site/ (cd site; git pull). After a Quartz pull, re-copy publish/quartz.config.yaml.
Quartz notes
Current major is Quartz 5. Edit publish/quartz.config.yaml, not the clone. Canvas uses @quartz-community/canvas-page. Drafts use @quartz-community/remove-draft.
Engine license: MIT (Quartz). Vault content: Unlicense (LICENSE).