diff --git a/README.md b/README.md index 03d753d..4a5d0b9 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,15 @@ Open **this repo root** as the Obsidian vault. Quartz is only the publisher; it ``` archive/ # public — primary sources - threads/ # Twitter/X and similar + threads/// + # 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, local attachments +meta/ # not published — conventions +assets/ # not published, gitignored — working media +secrets/ # not published, gitignored — cookies, host keys private/ # not published, not pushed publish/ # tracked overlay: quartz.config.yaml site/ # local Quartz clone (gitignored; own remotes) @@ -34,7 +37,9 @@ site/ # local Quartz clone (gitignored; own remotes) | `type` | `archive` \| `canvas` \| `note` | | `source` | `twitter` \| `youtube` \| `odysee` \| `article` \| `original` \| `other` | | `source_url` | original URL | -| `author` | original author | +| `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` | @@ -50,9 +55,11 @@ Templates: `templates/archive-source.md`, `templates/authored-note.md` (Template Images: absolute HTTPS URLs on your image host. Do not commit local binaries for published notes. ```md -![](https://YOUR-IMAGE-HOST/archive/slug.png) +![](https://files.catbox.moe/example.png) ``` +Keep local copies in `assets/` (not committed). Do not point notes at `assets/` or `./media/`. + YouTube and tweets (Quartz Obsidian-flavored Markdown): ```md @@ -108,12 +115,12 @@ Open http://localhost:8080 ## Add content and republish -1. New thread: Templater → `archive-source` → save under `archive/threads/` -2. Transcribe posts in order. Host images. Optional YouTube/Odysee/tweet embeds. +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. Upload images to the image host; paste HTTPS URLs. Optional YouTube/Odysee/tweet embeds. 3. Distill in `notes/` with `authored-note`. Wikilink the archive record. -4. Set `draft: false` and `status: published` +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/`) +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`. diff --git a/archive/threads/How to archive a thread.md b/archive/threads/How to archive a thread.md index f36448b..57abdb8 100644 --- a/archive/threads/How to archive a thread.md +++ b/archive/threads/How to archive a thread.md @@ -4,6 +4,8 @@ type: archive source: twitter source_url: https://x.com/ author: "" +handle: "" +post_id: "" date: 2026-08-22 archived: 2026-08-22 status: published @@ -12,13 +14,14 @@ tags: - archive - twitter - how-to -description: Worked example of an archived thread note. Replace this when real threads land. +description: Worked example of a spine note. Real threads use a folder per thread. aliases: - example-thread +in_reply_to: "" --- > [!info] Provenance -> Replace this file with a real thread. The shape is what matters: frontmatter, then posts in order, then optional media. +> Stub for the note shape. A real thread is a folder: `archive/threads///index.md` plus optional branch notes. See [[How threads are organized]]. ## Source @@ -36,13 +39,13 @@ aliases: ## Media -Images use absolute URLs on the image host: +Images use absolute HTTPS URLs: ```md -![](https://YOUR-IMAGE-HOST/archive/example.png) +![](https://files.catbox.moe/example.png) ``` -Optional live tweet (not a substitute for the transcript): +A live tweet embed is optional and is not the archive: ```md ![](https://x.com/user/status/123) @@ -50,4 +53,5 @@ Optional live tweet (not a substitute for the transcript): ## Related +- How folders work: [[How threads are organized]] - Distilled note: [[What this archive is for]] diff --git a/archive/threads/index.md b/archive/threads/index.md index 9dfba9e..f0e07c1 100644 --- a/archive/threads/index.md +++ b/archive/threads/index.md @@ -8,6 +8,8 @@ tags: - archive --- -One note per thread. Transcribe the posts in order. Do not rely on a live embed as the only copy. +Threads are filed by author handle, then by date and title. The main note in each folder is that author's own chain. Replies live beside it. -Example: [[How to archive a thread]] +How to read a folder: [[How threads are organized]]. + +Example of the note shape (single spine, no branches): [[How to archive a thread]] diff --git a/canvases/overview.canvas b/canvases/overview.canvas index 033b59d..5620eb1 100644 --- a/canvases/overview.canvas +++ b/canvases/overview.canvas @@ -8,6 +8,7 @@ {"id":"canvases","type":"file","file":"canvases/index.md","x":400,"y":-80,"width":280,"height":80}, {"id":"notes","type":"file","file":"notes/index.md","x":400,"y":80,"width":280,"height":100}, {"id":"example-thread","type":"file","file":"archive/threads/How to archive a thread.md","x":760,"y":-40,"width":300,"height":80}, + {"id":"how-organized","type":"file","file":"notes/How threads are organized.md","x":1100,"y":-40,"width":320,"height":80}, {"id":"example-note","type":"file","file":"notes/What this archive is for.md","x":760,"y":80,"width":300,"height":80} ], "edges":[ @@ -19,6 +20,7 @@ {"id":"e6","fromNode":"archive","fromSide":"right","toNode":"sources","toSide":"left"}, {"id":"e7","fromNode":"threads","fromSide":"bottom","toNode":"example-thread","toSide":"top"}, {"id":"e8","fromNode":"notes","fromSide":"right","toNode":"example-note","toSide":"left"}, - {"id":"e9","fromNode":"example-thread","fromSide":"bottom","toNode":"example-note","toSide":"top","label":"distills"} + {"id":"e9","fromNode":"example-thread","fromSide":"bottom","toNode":"example-note","toSide":"top","label":"distills"}, + {"id":"e10","fromNode":"example-thread","fromSide":"right","toNode":"how-organized","toSide":"left","label":"folder shape"} ] } diff --git a/index.md b/index.md index d6f977f..679d140 100644 --- a/index.md +++ b/index.md @@ -12,5 +12,6 @@ An archive of material that is not reliably web-indexed: Twitter/X threads, talk - [[archive/index|Archive]] — objective records of threads and other sources - [[canvases/index|Canvases]] — maps and relationship diagrams - [[notes/index|Notes]] — authored essays and syntheses +- [[How threads are organized]] — how a thread folder is laid out Start a new record from the templates in `templates/`. Public folders publish by default; set `draft: true` to keep a note off the site. diff --git a/meta/conventions.md b/meta/conventions.md index 33c8bed..8106343 100644 --- a/meta/conventions.md +++ b/meta/conventions.md @@ -10,16 +10,20 @@ draft: true | Field | Values | Notes | | --- | --- | --- | | `type` | `archive` \| `canvas` \| `note` | Required | -| `source` | `twitter` \| `youtube` \| `odysee` \| `article` \| `original` \| `other` | Archive + media notes | -| `source_url` | URL | Canonical original | -| `author` | string | Original author, not you | +| `source` | `twitter` \| `discord` \| `youtube` \| `odysee` \| `article` \| `original` \| `other` | Archive + media notes | +| `source_url` | URL | This note's post, not always the thread root | +| `author` | string | Display name | +| `handle` | string | Username without `@` | +| `post_id` | string | Twitter status id (spine root or branch root) | | `date` | `YYYY-MM-DD` | Original publication date | | `archived` | `YYYY-MM-DD` | When you captured it | | `status` | `draft` \| `review` \| `published` | Human workflow | | `draft` | `true` \| `false` | Quartz omit-from-site flag | -| `tags` | list | Prefer `archive`, `twitter`, `note`, topic slugs | +| `tags` | list | Ingest: `archive`, `twitter`, handle. Topics by hand | | `description` | string | Search / OG preview | | `aliases` | list | Extra names | +| `in_reply_to` | string | Foreign parent of a spine, if any | +| `parent_post_id` | string | Branch notes only: post this branch replies to | `draft: true` hides the page from the built site. It does **not** hide the file from a public GitHub repo. Truly private material goes in `private/` (gitignored). @@ -28,24 +32,27 @@ draft: true | Path | Published | Role | | --- | --- | --- | | `archive/` | yes | Primary sources | +| `archive/threads///` | yes | One Twitter thread. `index.md` is the author's chain | | `canvases/` | yes | `.canvas` maps | | `notes/` | yes | Authored writing | | `templates/` | no | Templater / core templates | | `meta/` | no | Vault rules, local attachments | +| `assets/` | no, gitignored | Working media before upload | +| `secrets/` | no, gitignored | Cookies and image-host credentials | | `private/` | no, gitignored | Never publish, never push | | `site/` | no, gitignored | Local Quartz clone (own remotes) | | `publish/` | no | Tracked Quartz overlay | +A thread folder holds `index.md` (spine) and one markdown file per off-spine reply tree. Reading guide: `notes/How threads are organized.md`. + # Images -Always absolute HTTPS URLs on the image host. Do not commit local binaries for published notes. +Always absolute HTTPS URLs on the image host (catbox after upload). Do not commit local binaries for published notes. Working files sit in `assets/` (gitignored), not in `meta/attachments/` except unrelated Obsidian drops. ```md -![](https://YOUR-IMAGE-HOST/archive/slug.png) +![](https://files.catbox.moe/example.png) ``` -Scratch files may sit in `meta/attachments/` (gitignored). - # Video YouTube / tweet (Quartz OFM): diff --git a/notes/How threads are organized.md b/notes/How threads are organized.md new file mode 100644 index 0000000..964774e --- /dev/null +++ b/notes/How threads are organized.md @@ -0,0 +1,44 @@ +--- +title: How threads are organized +type: note +source: original +date: 2026-08-23 +status: published +draft: false +tags: + - note + - how-to +description: How archived Twitter/X threads are filed and read. +--- + +Threads are grouped by **author handle**, then by **date and a short title**. + +``` +archive/threads/// + index.md ← the author's own chain (the spine) + YYYY-MM-DD-who-slug.md ← one file per reply that left that chain +``` + +## Spine + +`index.md` is only what the author posted as a single chain: each post replies to the previous one of theirs. Posts are numbered **1/** **2/** in that order. Other people do not appear in this numbering. + +If the first post is a reply to someone else, that other tweet is quoted at the top as context. It is not numbered as part of the spine. + +## Branches + +A reply from someone else, or a second chain the author started from an earlier post, is its own note in the same folder. Follow-ups on that reply stay in that note, including if the original author answers there. + +The spine links out under the post that grew the branch. Each branch note links back to `index`. + +## Tags + +Every imported thread starts with `archive`, `twitter`, and the author's handle. Topic tags (`vulkan`, `crt`, `alsa`, …) are added by hand when the thread is reviewed. + +## Images + +Pictures on the site are ordinary HTTPS URLs. Working copies of files live outside what GitHub Pages serves. A note that is still being prepared is marked `draft: true` and does not appear on the site. + +## Reading + +Start at [[archive/threads/index|Threads]], pick a handle, then a date. The spine is the essay. Branch files are the conversation around it. diff --git a/notes/What this archive is for.md b/notes/What this archive is for.md index 35c655f..9224018 100644 --- a/notes/What this archive is for.md +++ b/notes/What this archive is for.md @@ -21,6 +21,8 @@ Threadwell holds material that search engines and platform pages do not keep rel | `notes/` | Your writing. What it means. | | `canvases/` | Spatial maps between the two. | -An authored note should [[How to archive a thread|link the archive record]] instead of pasting the thread again. +How a thread is filed: [[How threads are organized]]. + +An authored note should wikilink the archive record instead of pasting the thread again. Set `draft: true` until a note is ready. `archive/`, `canvases/`, and `notes/` publish otherwise. diff --git a/notes/index.md b/notes/index.md index c44c4b3..f5e5eba 100644 --- a/notes/index.md +++ b/notes/index.md @@ -10,3 +10,5 @@ tags: [] Essays and syntheses. Link back to [[archive/index|archive]] records instead of restating the primary source. Use the `authored-note` template. Example: [[What this archive is for]] + +Convention: [[How threads are organized]] diff --git a/templates/archive-source.md b/templates/archive-source.md index 4acd213..a0b0a9a 100644 --- a/templates/archive-source.md +++ b/templates/archive-source.md @@ -4,14 +4,19 @@ type: archive source: twitter source_url: author: +handle: +post_id: "" date: <% tp.date.now("YYYY-MM-DD") %> archived: <% tp.date.now("YYYY-MM-DD") %> status: draft draft: true tags: - archive + - twitter description: aliases: [] +in_reply_to: "" +parent_post_id: "" --- > [!info] Provenance @@ -23,26 +28,10 @@ aliases: [] - Author: - Posted: -## Record +## Thread **1/** -## Media - -```md -![](https://YOUR-IMAGE-HOST/archive/slug.png) -``` - -YouTube: - -```md -![](https://www.youtube.com/watch?v=VIDEO_ID) -``` - -Odysee: - -```html - -``` - ## Related + +- Spine: [[index]]