prepping
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
* text=auto eol=lf
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
name: Deploy Quartz site to GitHub Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: "pages"
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout vault
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Checkout Quartz
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
repository: jackyzha0/quartz
|
||||||
|
ref: v5
|
||||||
|
path: site
|
||||||
|
- name: Apply publish overlay
|
||||||
|
run: cp publish/quartz.config.yaml site/quartz.config.yaml
|
||||||
|
- uses: actions/setup-node@v6
|
||||||
|
with:
|
||||||
|
node-version: 24
|
||||||
|
- name: Cache dependencies
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ~/.npm
|
||||||
|
key: ${{ runner.os }}-node-${{ hashFiles('site/package-lock.json') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-node-
|
||||||
|
- name: Cache Quartz plugins
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: site/.quartz/plugins
|
||||||
|
key: ${{ runner.os }}-plugins-${{ hashFiles('site/package-lock.json') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-plugins-
|
||||||
|
- name: Install Dependencies
|
||||||
|
working-directory: site
|
||||||
|
run: npm ci
|
||||||
|
- name: Install Quartz plugins
|
||||||
|
working-directory: site
|
||||||
|
run: npx quartz plugin install --from-config
|
||||||
|
- name: Build Quartz
|
||||||
|
working-directory: site
|
||||||
|
run: npx quartz build -d ..
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: site/public
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
needs: build
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
.DS_Store
|
||||||
|
.trash/
|
||||||
|
.replit
|
||||||
|
replit.nix
|
||||||
|
|
||||||
|
site/
|
||||||
|
|
||||||
|
private/*
|
||||||
|
!private/.gitkeep
|
||||||
|
meta/attachments/*
|
||||||
|
!meta/attachments/.gitkeep
|
||||||
|
|
||||||
|
.obsidian/workspace.json
|
||||||
|
.obsidian/workspace-mobile.json
|
||||||
|
.obsidian/plugins/
|
||||||
|
.obsidian/themes/
|
||||||
|
.obsidian/snippets/
|
||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"alwaysUpdateLinks": true,
|
||||||
|
"newFileLocation": "folder",
|
||||||
|
"newFileFolderPath": "notes",
|
||||||
|
"attachmentFolderPath": "meta/attachments",
|
||||||
|
"newLinkFormat": "shortest",
|
||||||
|
"useMarkdownLinks": false,
|
||||||
|
"showUnsupportedFiles": true,
|
||||||
|
"promptDelete": true,
|
||||||
|
"userIgnoreFilters": [
|
||||||
|
"site/",
|
||||||
|
".github/"
|
||||||
|
]
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"accentColor": "",
|
||||||
|
"baseFontSize": 16,
|
||||||
|
"theme": "obsidian",
|
||||||
|
"cssTheme": "",
|
||||||
|
"nativeMenus": false
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
[
|
||||||
|
"templater-obsidian",
|
||||||
|
"dataview",
|
||||||
|
"obsidian-linter",
|
||||||
|
"media-extended",
|
||||||
|
"advanced-canvas"
|
||||||
|
]
|
||||||
Vendored
+29
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"file-explorer": true,
|
||||||
|
"global-search": true,
|
||||||
|
"switcher": true,
|
||||||
|
"graph": true,
|
||||||
|
"backlink": true,
|
||||||
|
"canvas": true,
|
||||||
|
"outgoing-link": true,
|
||||||
|
"tag-pane": true,
|
||||||
|
"footnotes": true,
|
||||||
|
"properties": true,
|
||||||
|
"page-preview": true,
|
||||||
|
"templates": true,
|
||||||
|
"note-composer": true,
|
||||||
|
"command-palette": true,
|
||||||
|
"markdown-importer": true,
|
||||||
|
"word-count": true,
|
||||||
|
"file-recovery": true,
|
||||||
|
"sync": false,
|
||||||
|
"publish": false,
|
||||||
|
"webviewer": false,
|
||||||
|
"slides": false,
|
||||||
|
"audio-recorder": false,
|
||||||
|
"workspaces": false,
|
||||||
|
"slash-command": false,
|
||||||
|
"editor-status": true,
|
||||||
|
"bookmarks": true,
|
||||||
|
"outline": true
|
||||||
|
}
|
||||||
Vendored
+32
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"collapse-filter": false,
|
||||||
|
"search": "",
|
||||||
|
"showTags": true,
|
||||||
|
"showAttachments": false,
|
||||||
|
"hideUnresolved": false,
|
||||||
|
"showOrphans": true,
|
||||||
|
"collapse-color-groups": false,
|
||||||
|
"colorGroups": [
|
||||||
|
{
|
||||||
|
"query": "path:archive",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 14701138
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "path:notes",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 5431473
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"query": "path:canvases",
|
||||||
|
"color": {
|
||||||
|
"a": 1,
|
||||||
|
"rgb": 5431378
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"folder": "templates"
|
||||||
|
}
|
||||||
Vendored
+16
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"types": {
|
||||||
|
"aliases": "aliases",
|
||||||
|
"tags": "multitext",
|
||||||
|
"cssclasses": "multitext",
|
||||||
|
"type": "text",
|
||||||
|
"source": "text",
|
||||||
|
"source_url": "text",
|
||||||
|
"author": "text",
|
||||||
|
"date": "date",
|
||||||
|
"archived": "date",
|
||||||
|
"status": "text",
|
||||||
|
"draft": "checkbox",
|
||||||
|
"description": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
# 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 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.
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
YouTube and tweets (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 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+.
|
||||||
|
|
||||||
|
```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://ed94.github.io/Threadwell`
|
||||||
|
|
||||||
|
`baseUrl` lives in `publish/quartz.config.yaml`. Change it if you attach a custom domain.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
3. Distill in `notes/` with `authored-note`. Wikilink the archive record.
|
||||||
|
4. Set `draft: false` and `status: published`
|
||||||
|
5. Preview: `cd site; npx quartz build -d .. --serve`
|
||||||
|
6. Commit and push `main` (vault + `publish/`, never `site/`)
|
||||||
|
|
||||||
|
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`).
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
title: Archive
|
||||||
|
type: note
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
description: Primary-source records. Not commentary.
|
||||||
|
tags:
|
||||||
|
- archive
|
||||||
|
---
|
||||||
|
|
||||||
|
Objective references: scrapes, transcripts, and source notes. Distilled writing lives in [[notes/index|Notes]].
|
||||||
|
|
||||||
|
- [[archive/threads/index|Threads]] — Twitter/X and similar sequential posts
|
||||||
|
- [[archive/sources/index|Sources]] — talks, essays, pages, and other records
|
||||||
|
|
||||||
|
Use the `archive-source` template. Keep the source text here; put interpretation in a linked note.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: Sources
|
||||||
|
type: note
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
description: Non-thread primary sources — talks, pages, videos, documents.
|
||||||
|
tags:
|
||||||
|
- archive
|
||||||
|
---
|
||||||
|
|
||||||
|
Talks, essays, videos, and other records that are not sequential threads. Same `archive-source` template; set `source` to `youtube`, `odysee`, `article`, or `other`.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
title: How to archive a thread
|
||||||
|
type: archive
|
||||||
|
source: twitter
|
||||||
|
source_url: https://x.com/
|
||||||
|
author: ""
|
||||||
|
date: 2026-08-22
|
||||||
|
archived: 2026-08-22
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
tags:
|
||||||
|
- archive
|
||||||
|
- twitter
|
||||||
|
- how-to
|
||||||
|
description: Worked example of an archived thread note. Replace this when real threads land.
|
||||||
|
aliases:
|
||||||
|
- example-thread
|
||||||
|
---
|
||||||
|
|
||||||
|
> [!info] Provenance
|
||||||
|
> Replace this file with a real thread. The shape is what matters: frontmatter, then posts in order, then optional media.
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
- URL:
|
||||||
|
- Author:
|
||||||
|
- Posted:
|
||||||
|
|
||||||
|
## Thread
|
||||||
|
|
||||||
|
**1/** First post. Copy the text. Do not summarize here.
|
||||||
|
|
||||||
|
**2/** Next post. Keep numbering. Preserve links as written.
|
||||||
|
|
||||||
|
**3/** Last post.
|
||||||
|
|
||||||
|
## Media
|
||||||
|
|
||||||
|
Images use absolute URLs on the image host:
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
Optional live tweet (not a substitute for the transcript):
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- Distilled note: [[What this archive is for]]
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Threads
|
||||||
|
type: note
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
description: Archived Twitter/X threads and similar sequential posts.
|
||||||
|
tags:
|
||||||
|
- archive
|
||||||
|
---
|
||||||
|
|
||||||
|
One note per thread. Transcribe the posts in order. Do not rely on a live embed as the only copy.
|
||||||
|
|
||||||
|
Example: [[How to archive a thread]]
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Canvases
|
||||||
|
type: note
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
description: Public JSON Canvas maps.
|
||||||
|
tags:
|
||||||
|
- canvas
|
||||||
|
---
|
||||||
|
|
||||||
|
Obsidian `.canvas` files in this folder render as pannable pages on the site.
|
||||||
|
|
||||||
|
Starter map: [[overview.canvas|overview]]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"nodes":[
|
||||||
|
{"id":"title","type":"text","text":"# Threadwell\nRecovered threads and submerged records.","x":-360,"y":-80,"width":320,"height":140,"color":"5"},
|
||||||
|
{"id":"home","type":"file","file":"index.md","x":40,"y":-160,"width":260,"height":80},
|
||||||
|
{"id":"archive","type":"file","file":"archive/index.md","x":400,"y":-280,"width":280,"height":100},
|
||||||
|
{"id":"threads","type":"file","file":"archive/threads/index.md","x":760,"y":-360,"width":260,"height":80},
|
||||||
|
{"id":"sources","type":"file","file":"archive/sources/index.md","x":760,"y":-220,"width":260,"height":80},
|
||||||
|
{"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":"example-note","type":"file","file":"notes/What this archive is for.md","x":760,"y":80,"width":300,"height":80}
|
||||||
|
],
|
||||||
|
"edges":[
|
||||||
|
{"id":"e1","fromNode":"title","fromSide":"right","toNode":"home","toSide":"left"},
|
||||||
|
{"id":"e2","fromNode":"home","fromSide":"right","toNode":"archive","toSide":"left"},
|
||||||
|
{"id":"e3","fromNode":"home","fromSide":"right","toNode":"canvases","toSide":"left"},
|
||||||
|
{"id":"e4","fromNode":"home","fromSide":"right","toNode":"notes","toSide":"left"},
|
||||||
|
{"id":"e5","fromNode":"archive","fromSide":"right","toNode":"threads","toSide":"left"},
|
||||||
|
{"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"}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
title: Threadwell
|
||||||
|
type: note
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
description: Recovered threads and submerged records.
|
||||||
|
tags: []
|
||||||
|
---
|
||||||
|
|
||||||
|
An archive of material that is not reliably web-indexed: Twitter/X threads, talks, and other primary sources, plus the notes distilled from them.
|
||||||
|
|
||||||
|
- [[archive/index|Archive]] — objective records of threads and other sources
|
||||||
|
- [[canvases/index|Canvases]] — maps and relationship diagrams
|
||||||
|
- [[notes/index|Notes]] — authored essays and syntheses
|
||||||
|
|
||||||
|
Start a new record from the templates in `templates/`. Public folders publish by default; set `draft: true` to keep a note off the site.
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
title: Conventions
|
||||||
|
type: note
|
||||||
|
status: draft
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Frontmatter
|
||||||
|
|
||||||
|
| 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 |
|
||||||
|
| `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 |
|
||||||
|
| `description` | string | Search / OG preview |
|
||||||
|
| `aliases` | list | Extra names |
|
||||||
|
|
||||||
|
`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).
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
|
||||||
|
| Path | Published | Role |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `archive/` | yes | Primary sources |
|
||||||
|
| `canvases/` | yes | `.canvas` maps |
|
||||||
|
| `notes/` | yes | Authored writing |
|
||||||
|
| `templates/` | no | Templater / core templates |
|
||||||
|
| `meta/` | no | Vault rules, local attachments |
|
||||||
|
| `private/` | no, gitignored | Never publish, never push |
|
||||||
|
| `site/` | no, gitignored | Local Quartz clone (own remotes) |
|
||||||
|
| `publish/` | no | Tracked Quartz overlay |
|
||||||
|
|
||||||
|
# Images
|
||||||
|
|
||||||
|
Always absolute HTTPS URLs on the image host. Do not commit local binaries for published notes.
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
Scratch files may sit in `meta/attachments/` (gitignored).
|
||||||
|
|
||||||
|
# Video
|
||||||
|
|
||||||
|
YouTube / tweet (Quartz OFM):
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
Odysee (raw iframe; survives the static build):
|
||||||
|
|
||||||
|
```html
|
||||||
|
<iframe width="560" height="315" src="https://odysee.com/$/embed/SLUG/CLAIM" allowfullscreen></iframe>
|
||||||
|
```
|
||||||
|
|
||||||
|
Get the embed URL from Odysee share → embed. Do not use the watch URL as the iframe `src`.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
title: Obsidian setup
|
||||||
|
type: note
|
||||||
|
status: draft
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Open **`C:\\projects\\Threadwell`** as the vault (the repo root). `site/` is a local Quartz checkout and is hidden from the file explorer.
|
||||||
|
|
||||||
|
# Core plugins
|
||||||
|
|
||||||
|
Enable: Files, Search, Quick switcher, Graph, Backlinks, Canvas, Outgoing links, Tags, Page preview, Templates, Note composer, Command palette, Properties, Word count, File recovery.
|
||||||
|
|
||||||
|
Templates folder: `templates`.
|
||||||
|
|
||||||
|
# Community plugins
|
||||||
|
|
||||||
|
| Plugin | Why |
|
||||||
|
| --- | --- |
|
||||||
|
| Templater | Date/title fill-in for the two starter templates |
|
||||||
|
| Dataview | Local queries over `type`, `source`, `status` (not rendered by Quartz) |
|
||||||
|
| Linter | YAML key order and tag consistency |
|
||||||
|
| Media Extended | Better YouTube/timestamp playback inside Obsidian |
|
||||||
|
| Advanced Canvas | Groups, presentation, nicer maps; Quartz still reads stock JSON Canvas |
|
||||||
|
|
||||||
|
Install from Community Plugins using `.obsidian/community-plugins.json`.
|
||||||
|
|
||||||
|
# Templater
|
||||||
|
|
||||||
|
Template folder: `templates`. Enable "Trigger Templater on new file creation" if you want folder templates later.
|
||||||
|
|
||||||
|
# Linter (suggested)
|
||||||
|
|
||||||
|
- YAML: insert `date` as `YYYY-MM-DD`
|
||||||
|
- Deduplicate and sort tags
|
||||||
|
- Do not rewrite wikilinks to markdown links
|
||||||
|
|
||||||
|
# Link settings
|
||||||
|
|
||||||
|
Already set in `app.json`: wikilinks, shortest path, update links on rename.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
title: What this archive is for
|
||||||
|
type: note
|
||||||
|
source: original
|
||||||
|
date: 2026-08-22
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
tags:
|
||||||
|
- note
|
||||||
|
- how-to
|
||||||
|
description: Why Threadwell exists and how archive notes relate to authored notes.
|
||||||
|
aliases:
|
||||||
|
- about-threadwell
|
||||||
|
---
|
||||||
|
|
||||||
|
Threadwell holds material that search engines and platform pages do not keep reliably. The split is strict:
|
||||||
|
|
||||||
|
| Folder | Role |
|
||||||
|
| --- | --- |
|
||||||
|
| `archive/` | Primary source. What was said. |
|
||||||
|
| `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.
|
||||||
|
|
||||||
|
Set `draft: true` until a note is ready. `archive/`, `canvases/`, and `notes/` publish otherwise.
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: Notes
|
||||||
|
type: note
|
||||||
|
status: published
|
||||||
|
draft: false
|
||||||
|
description: Authored and distilled writing.
|
||||||
|
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]]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
This folder is gitignored except this file. Put unpublished private notes here.
|
||||||
@@ -0,0 +1,319 @@
|
|||||||
|
# yaml-language-server: $schema=./quartz/plugins/quartz-plugins.schema.json
|
||||||
|
configuration:
|
||||||
|
pageTitle: Threadwell
|
||||||
|
pageTitleSuffix: " · recovered threads"
|
||||||
|
enableSPA: true
|
||||||
|
enablePopovers: true
|
||||||
|
analytics: null
|
||||||
|
locale: en-US
|
||||||
|
baseUrl: ed94.github.io/Threadwell
|
||||||
|
ignorePatterns:
|
||||||
|
- site
|
||||||
|
- .github
|
||||||
|
- .git
|
||||||
|
- private
|
||||||
|
- templates
|
||||||
|
- meta
|
||||||
|
- .obsidian
|
||||||
|
- publish
|
||||||
|
- README.md
|
||||||
|
- LICENSE
|
||||||
|
- .gitignore
|
||||||
|
- .gitattributes
|
||||||
|
theme:
|
||||||
|
fontOrigin: googleFonts
|
||||||
|
cdnCaching: true
|
||||||
|
typography:
|
||||||
|
header: Schibsted Grotesk
|
||||||
|
body: Source Sans Pro
|
||||||
|
code: IBM Plex Mono
|
||||||
|
colors:
|
||||||
|
lightMode:
|
||||||
|
light: "#faf8f8"
|
||||||
|
lightgray: "#e5e5e5"
|
||||||
|
gray: "#b8b8b8"
|
||||||
|
darkgray: "#4e4e4e"
|
||||||
|
dark: "#2b2b2b"
|
||||||
|
secondary: "#284b63"
|
||||||
|
tertiary: "#84a59d"
|
||||||
|
highlight: rgba(143, 159, 169, 0.15)
|
||||||
|
textHighlight: "#fff23688"
|
||||||
|
darkMode:
|
||||||
|
light: "#161618"
|
||||||
|
lightgray: "#393639"
|
||||||
|
gray: "#646464"
|
||||||
|
darkgray: "#d4d4d4"
|
||||||
|
dark: "#ebebec"
|
||||||
|
secondary: "#7b97aa"
|
||||||
|
tertiary: "#84a59d"
|
||||||
|
highlight: rgba(143, 159, 169, 0.15)
|
||||||
|
textHighlight: "#b3aa0288"
|
||||||
|
plugins:
|
||||||
|
- source: "@quartz-community/created-modified-date"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
defaultDateType: modified
|
||||||
|
priority:
|
||||||
|
- frontmatter
|
||||||
|
- git
|
||||||
|
- filesystem
|
||||||
|
order: 10
|
||||||
|
- source: "@quartz-community/syntax-highlighting"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
theme:
|
||||||
|
light: github-light
|
||||||
|
dark: github-dark
|
||||||
|
keepBackground: false
|
||||||
|
order: 20
|
||||||
|
- source: "@quartz-community/obsidian-flavored-markdown"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
comments: true
|
||||||
|
highlight: true
|
||||||
|
wikilinks: true
|
||||||
|
callouts: true
|
||||||
|
mermaid: true
|
||||||
|
parseTags: true
|
||||||
|
parseArrows: true
|
||||||
|
parseBlockReferences: true
|
||||||
|
enableInHtmlEmbed: false
|
||||||
|
enableYouTubeEmbed: true
|
||||||
|
enableTweetEmbed: true
|
||||||
|
enableVideoEmbed: true
|
||||||
|
enableCheckbox: true
|
||||||
|
order: 30
|
||||||
|
- source: "@quartz-community/github-flavored-markdown"
|
||||||
|
enabled: true
|
||||||
|
order: 40
|
||||||
|
- source: "@quartz-community/table-of-contents"
|
||||||
|
enabled: true
|
||||||
|
order: 50
|
||||||
|
layout:
|
||||||
|
position: right
|
||||||
|
priority: 30
|
||||||
|
- source: "@quartz-community/crawl-links"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
markdownLinkResolution: shortest
|
||||||
|
order: 60
|
||||||
|
- source: "@quartz-community/description"
|
||||||
|
enabled: true
|
||||||
|
order: 70
|
||||||
|
- source: "@quartz-community/latex"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
renderEngine: katex
|
||||||
|
order: 80
|
||||||
|
- source: "@quartz-community/citations"
|
||||||
|
enabled: false
|
||||||
|
order: 85
|
||||||
|
- source: "@quartz-community/hard-line-breaks"
|
||||||
|
enabled: true
|
||||||
|
order: 90
|
||||||
|
- source: "@quartz-community/ox-hugo"
|
||||||
|
enabled: false
|
||||||
|
order: 91
|
||||||
|
- source: "@quartz-community/roam"
|
||||||
|
enabled: false
|
||||||
|
order: 92
|
||||||
|
- source: "@quartz-community/quartz-fonts"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-themes/core"
|
||||||
|
enabled: false
|
||||||
|
options:
|
||||||
|
theme: default
|
||||||
|
mode: both
|
||||||
|
- source: "@quartz-community/remove-draft"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/explicit-publish"
|
||||||
|
enabled: false
|
||||||
|
- source: "@quartz-community/unlisted-pages"
|
||||||
|
enabled: true
|
||||||
|
options: {}
|
||||||
|
order: 45
|
||||||
|
- source: "@quartz-community/encrypted-pages"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
iterations: 600000
|
||||||
|
passwordField: password
|
||||||
|
unlistWhenEncrypted: false
|
||||||
|
outputPath: static/encryptedContentIndex.json
|
||||||
|
- source: "@quartz-community/stacked-pages"
|
||||||
|
enabled: false
|
||||||
|
layout:
|
||||||
|
position: afterBody
|
||||||
|
priority: 50
|
||||||
|
display: all
|
||||||
|
- source: "@quartz-community/alias-redirects"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/content-index"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
enableSiteMap: true
|
||||||
|
enableRSS: true
|
||||||
|
- source: "@quartz-community/favicon"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/og-image"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/cname"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/canvas-page"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
enableInteraction: true
|
||||||
|
initialZoom: 1
|
||||||
|
defaultFullscreen: false
|
||||||
|
- source: "@quartz-community/content-page"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/folder-page"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/tag-page"
|
||||||
|
enabled: true
|
||||||
|
- source: "@quartz-community/explorer"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 50
|
||||||
|
- source: "@quartz-community/graph"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: right
|
||||||
|
priority: 10
|
||||||
|
- source: "@quartz-community/search"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 20
|
||||||
|
group: toolbar
|
||||||
|
groupOptions:
|
||||||
|
grow: true
|
||||||
|
- source: "@quartz-community/backlinks"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: right
|
||||||
|
priority: 50
|
||||||
|
- source: "@quartz-community/article-title"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: beforeBody
|
||||||
|
priority: 10
|
||||||
|
- source: "@quartz-community/content-meta"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: beforeBody
|
||||||
|
priority: 20
|
||||||
|
- source: "@quartz-community/tag-list"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: beforeBody
|
||||||
|
priority: 30
|
||||||
|
- source: "@quartz-community/page-title"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 10
|
||||||
|
- source: "@quartz-community/darkmode"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 30
|
||||||
|
group: toolbar
|
||||||
|
- source: "@quartz-community/reader-mode"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 35
|
||||||
|
group: toolbar
|
||||||
|
- source: "@quartz-community/breadcrumbs"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: beforeBody
|
||||||
|
priority: 5
|
||||||
|
condition: not-index
|
||||||
|
- source: "@quartz-community/comments"
|
||||||
|
enabled: false
|
||||||
|
options:
|
||||||
|
provider: giscus
|
||||||
|
options: {}
|
||||||
|
layout:
|
||||||
|
position: afterBody
|
||||||
|
priority: 10
|
||||||
|
- source: "@quartz-community/footer"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
links:
|
||||||
|
GitHub: https://github.com/Ed94/Threadwell
|
||||||
|
layout:
|
||||||
|
position: footer
|
||||||
|
priority: 50
|
||||||
|
- source: "@quartz-community/recent-notes"
|
||||||
|
enabled: true
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 60
|
||||||
|
- source: "@quartz-community/spacer"
|
||||||
|
enabled: true
|
||||||
|
options: {}
|
||||||
|
order: 25
|
||||||
|
layout:
|
||||||
|
position: left
|
||||||
|
priority: 25
|
||||||
|
display: mobile-only
|
||||||
|
- source: "@quartz-community/bases-page"
|
||||||
|
enabled: true
|
||||||
|
options: {}
|
||||||
|
order: 50
|
||||||
|
- source: "@quartz-community/note-properties"
|
||||||
|
enabled: true
|
||||||
|
options:
|
||||||
|
includeAll: false
|
||||||
|
includedProperties:
|
||||||
|
- type
|
||||||
|
- source
|
||||||
|
- status
|
||||||
|
- date
|
||||||
|
- tags
|
||||||
|
- description
|
||||||
|
- aliases
|
||||||
|
excludedProperties: []
|
||||||
|
hidePropertiesView: false
|
||||||
|
delimiters: ---
|
||||||
|
language: yaml
|
||||||
|
order: 5
|
||||||
|
layout:
|
||||||
|
position: beforeBody
|
||||||
|
priority: 15
|
||||||
|
display: all
|
||||||
|
- source: "@quartz-community/obsidian-plugin-excalidraw"
|
||||||
|
enabled: false
|
||||||
|
options:
|
||||||
|
enableInteraction: true
|
||||||
|
darkMode: auto
|
||||||
|
exportPadding: 20
|
||||||
|
order: 50
|
||||||
|
layout:
|
||||||
|
groups:
|
||||||
|
toolbar:
|
||||||
|
priority: 35
|
||||||
|
direction: row
|
||||||
|
gap: 0.5rem
|
||||||
|
byPageType:
|
||||||
|
"404":
|
||||||
|
positions:
|
||||||
|
beforeBody: []
|
||||||
|
left: []
|
||||||
|
right: []
|
||||||
|
content: {}
|
||||||
|
folder:
|
||||||
|
exclude:
|
||||||
|
- reader-mode
|
||||||
|
positions:
|
||||||
|
right: []
|
||||||
|
tag:
|
||||||
|
exclude:
|
||||||
|
- reader-mode
|
||||||
|
positions:
|
||||||
|
right: []
|
||||||
|
canvas: {}
|
||||||
|
bases: {}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
$root = Split-Path -Parent $PSScriptRoot
|
||||||
|
$site = Join-Path $root "site"
|
||||||
|
$config = Join-Path $PSScriptRoot "quartz.config.yaml"
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath (Join-Path $site ".git"))) {
|
||||||
|
git clone --branch v5 --single-branch https://github.com/jackyzha0/quartz.git $site
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy-Item -LiteralPath $config -Destination (Join-Path $site "quartz.config.yaml") -Force
|
||||||
|
Set-Location -LiteralPath $site
|
||||||
|
npm ci
|
||||||
|
npx quartz plugin install --from-config
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
title: <% tp.file.title %>
|
||||||
|
type: archive
|
||||||
|
source: twitter
|
||||||
|
source_url:
|
||||||
|
author:
|
||||||
|
date: <% tp.date.now("YYYY-MM-DD") %>
|
||||||
|
archived: <% tp.date.now("YYYY-MM-DD") %>
|
||||||
|
status: draft
|
||||||
|
draft: true
|
||||||
|
tags:
|
||||||
|
- archive
|
||||||
|
description:
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
> [!info] Provenance
|
||||||
|
> Primary source record. Do not editorialize here. Interpretation goes in a `notes/` page.
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
- URL: <% tp.file.cursor() %>
|
||||||
|
- Author:
|
||||||
|
- Posted:
|
||||||
|
|
||||||
|
## Record
|
||||||
|
|
||||||
|
**1/**
|
||||||
|
|
||||||
|
## Media
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
YouTube:
|
||||||
|
|
||||||
|
```md
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
Odysee:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<iframe width="560" height="315" src="https://odysee.com/$/embed/SLUG/CLAIM" allowfullscreen></iframe>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: <% tp.file.title %>
|
||||||
|
type: note
|
||||||
|
source: original
|
||||||
|
date: <% tp.date.now("YYYY-MM-DD") %>
|
||||||
|
status: draft
|
||||||
|
draft: true
|
||||||
|
tags:
|
||||||
|
- note
|
||||||
|
description:
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
<% tp.file.cursor() %>
|
||||||
|
|
||||||
|
## Sources
|
||||||
|
|
||||||
|
-
|
||||||
Reference in New Issue
Block a user