142 lines
5.5 KiB
Markdown
142 lines
5.5 KiB
Markdown
# 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.
|
|
The goal is archival purposes, for mainly old posts that are hard to scavange, track, or lack of trust in x.com to remain publishing the original content or the user deciding to not preserve said content on-site.
|
|
|
|
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.
|
|
|
|

|
|
|
|
## 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/<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 writing
|
|
templates/ # not published
|
|
meta/ # not published — conventions
|
|
assets/ # not published, gitignored — working media
|
|
secrets/ # not published, gitignored
|
|
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`).
|
|
|
|
## 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
|
|

|
|
```
|
|
|
|
Keep local copies in `assets/` (not committed). Notes do not point at `assets/` or `./media/`.
|
|
|
|
YouTube (Quartz Obsidian-flavored Markdown):
|
|
|
|
```md
|
|

|
|
```
|
|
|
|
Odysee (iframe; copy the embed URL from Odysee share):
|
|
|
|
```html
|
|
<iframe width="560" height="315" src="https://odysee.com/$/embed/SLUG/CLAIM" allowfullscreen></iframe>
|
|
```
|
|
|
|
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/<handle>/<YYYY-MM-DD-slug>/`. 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`).
|