5.5 KiB
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): threadwell.edsabode.dev
Post an issue for an inaccuracy
I'll correct it.
Layout
Open this repo root as the Obsidian vault. Quartz is only the publisher; it lives in site/.
archive/ # public — primary sources
threads/<handle>/<YYYY-MM-DD-slug>/
# one thread: index.md is the author's chain
sources/ # talks, pages, other records
canvases/ # public — .canvas maps
notes/ # public — authored / distilled writing
templates/ # not published
meta/ # not published — conventions
assets/ # not published, gitignored — working media
secrets/ # not published, gitignored — cookies, host keys
scripts/ # not published — local tooling (tracked)
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 display name |
handle |
username without @ |
post_id |
Twitter status id |
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 from the original provider when possible. Notes do not embed local binaries.

Keep local copies in assets/ (not committed). Do not point notes at assets/ or ./media/.
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://threadwell.edsabode.dev
baseUrl lives in publish/quartz.config.yaml. Change it if you attach a custom domain.
Add content and republish
- New thread: create
archive/threads/<handle>/<YYYY-MM-DD-slug>/. Templater →archive-source→ save asindex.md(the author's chain). Off-spine replies get their own notes in that folder. Seenotes/How threads are organized.md. - Transcribe posts in order. Upload images to the image host; paste HTTPS URLs. Optional YouTube/Odysee/tweet embeds.
- Distill in
notes/withauthored-note. Wikilink the archive record. - Set
draft: falseandstatus: publishedwhen the capture has been reviewed. - Preview:
cd site; npx quartz build -d .. --serve - Commit and push
main(vault +publish/, neversite/, neverassets/orsecrets/)
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).
Notice
I'm not a web dev. Look away at the scripts this is just done because it doesn't exist, so it was done badly.