# Threadwell Recovered threads and submerged records. An [Obsidian](https://obsidian.md) vault published with [Quartz 5](https://quartz.jzhao.xyz) to GitHub Pages. The site keeps Twitter/X threads and other material that search does not keep. Live: [threadwell.edsabode.dev](https://threadwell.edsabode.dev) This has only been around since Aug 22nd, 2026. If you have suggestions on how to render archive artifacts or maybe something better than the current techstack to wrangle the artifacts I'm open ears. ![preview](./preview.png) ## Post an issue for an inaccuracy I'll correct it. ## Layout Open **this repo root** as the Obsidian vault. Quartz lives in `site/` and only publishes. ``` archive/ # public — primary sources threads/// # one thread: index.md is the author's chain sources/ # talks, pages, other records canvases/ # public — .canvas maps notes/ # public — authored 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/` publish by default. `site/` is a separate checkout of Quartz (`origin` → `jackyzha0/quartz`). This repo's 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` 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 Notes cite the original host URL. ```md ![](https://pbs.twimg.com/media/FhAidkhUoAA3FJz?format=png&name=orig) ``` Keep local copies in `assets/` (not committed). Notes do not point at `assets/` or `./media/`. YouTube and tweets (Quartz Obsidian-flavored Markdown): ```md ![](https://www.youtube.com/watch?v=VIDEO_ID) ![](https://x.com/user/status/ID) ``` Odysee (iframe; copy the embed URL from Odysee share): ```html ``` Remote URLs and iframes stay as written 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+. ```powershell cd C:\projects\Threadwell .\publish\setup.ps1 cd site npx quartz build -d .. --serve ``` Open http://localhost:8080 `publish/setup.ps1` clones Quartz into `site/` if needed, then copies `publish/quartz.config.yaml` over the stock config. ## GitHub Pages 1. Repo Settings → Pages → Source: **GitHub Actions** 2. If an old `github-pages` environment blocks the first deploy, delete it under Settings → Environments. The workflow recreates it. 3. Push `main`. CI clones Quartz into `site/`, applies `publish/quartz.config.yaml`, builds with `-d ..`. 4. Site: `https://threadwell.edsabode.dev` `baseUrl` lives in `publish/quartz.config.yaml`. Change it if you attach a custom domain. ## Add content and republish 1. New thread: create `archive/threads///`. Templater → `archive-source` → save as `index.md` (the author's chain). Off-spine replies get their own notes in that folder. See `notes/How threads are organized.md`. 2. Transcribe posts in order. Paste the original HTTPS image URL. Optional YouTube/Odysee/tweet embeds. 3. Distill in `notes/` with `authored-note`. Wikilink the archive record. 4. Set `draft: false` and `status: published` when the capture has been reviewed. 5. Preview: `cd site; npx quartz build -d .. --serve` 6. Commit and push `main` (vault + `publish/`, never `site/`, never `assets/` or `secrets/`) 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 exists because it didn't, so it was done badly.