Draft
Conversation
Owner
jackharrhy
commented
Mar 17, 2026
- feat: replace logseq-based site with obsidian-based foundation
- feat: port all components, layout, and page system from old site
- feat: port RSS feeds, tools pages, and infrastructure
- fix: graceful handling when vault is absent, use mime for asset types
- ignore vault folder when symlink is there
Remove the old site/ directory with its Python (garden.py) pipeline that required a running Logseq instance. Replace with the new Obsidian-based Astro site that reads .md files directly from an Obsidian vault via custom remark/rehype plugins. - Remove garden.py, pyproject.toml, uv.lock, .python-version - Remove site/ (old Logseq-based Astro project) - Promote tmp/new-website to repo root - Clean up dead files (quartz-plugins, superseded plugins, test harnesses) - Make vault path configurable via GARDEN_VAULT_PATH env var - Add site URL to astro config - Update .gitignore for new structure - Preserve static assets (favicon, quake-bg, RSS stylesheets)
- Port full Layout.astro with htmx, GoatCounter, view transitions, OG tags, custom fonts, Phosphor Icons, and RSS link alternates - Port Page.astro component with custom layouts (quake, terminal), breadcrumb navigation, and component injection - Port all UI components: Mug (picoCAD 3D), Feed, FeedTree, Project, NowPlaying (htmx/Last.fm), Spinner - Port feeds.ts (linkblog/devblog post querying and tree building) - Port utils.ts (slugify, CORS, RSS image helpers) - Simplify page routing: index uses Page component, catch-all handles all public garden entries including about/projects/now - Install htmx.org, @astrojs/rss, mime, cheerio dependencies
- Add RSS endpoints for linkblog, devblog, and posts with 8AM NST embargo - Port Last.fm now-playing endpoint and page - Port YouTube thumbnail fetcher and tweet archiver tools - Update Dockerfile for repo-root site structure - Update compose.yml env_file path - Simplify justfile (remove garden.py/Python references) - Expand .env.dist with all required env vars
- index.astro: show placeholder when home entry not in vault - Page.astro: use Astro.rewrite for 404 instead of throw - asset endpoint: use mime package for content-type detection - asset endpoint: make vault assets path configurable via env var - tsconfig: add node types - .env.dist: document GARDEN_VAULT_ASSETS_PATH - Remove dist/ from repo (build artifact)
Adds a new remark transform that converts ```component``` fenced code
blocks in Obsidian markdown files into custom HTML elements. Astro's
Content component then maps these elements to real Astro components.
Syntax:
```component
Feed
source: linkblog
limit: 5
```
Emits: <x-feed source="linkblog" limit="5"></x-feed>
Mapped in Page.astro: { "x-feed": Feed, "x-mug": Mug, ... }
Also:
- Add Letterbird.astro component (contact form embed)
- Add resolveOgImage() to utils to strip Obsidian wikilink syntax
from og-image frontmatter values (e.g. ![[file.png]])
- Apply resolveOgImage in Page.astro and RSS endpoints
- Remove debug appendFileSync from rehype-obsidian.mjs
- Rewrite vault pages (Home, About, Now, Linkblog, Devblog, Projects)
from Logseq block format to clean Obsidian markdown with component
blocks — About and Now are now plain paragraphs, no more `- ` bullets
- Move all PicoCADViewer initialization inside astro:page-load so the canvas element is guaranteed to exist in the DOM before we touch it - Rename canvas id from 'canvas' to 'mug-canvas' to avoid collision with any other canvas elements on the page - Viewer instance is lazily created once and reused across navigations (transition:persist keeps the DOM node alive)
The components prop on Astro's <Content /> only works with MDX, not plain
.md files. For pages with ```component blocks, we now:
1. Parse the raw markdown body and split it into interleaved prose +
component segments using splitIntoSegments()
2. Run each prose segment through the full unified/remark/rehype pipeline
(remarkObsidian + rehypeObsidian) to get properly transformed HTML
3. Render each segment: prose as <Fragment set:html={...} />, component
blocks as real Astro components (Mug, Feed, FeedTree, Project, etc.)
Pages without any component blocks continue using Astro's native render()
for better performance.
Also removes dead AstroContainer/renderEntry code from earlier attempt.
- feeds.ts: use getCollection filter fn so only public entries are ever fetched for linkblog and devblog (removes the need to filter afterwards) - Page.astro: 404 if entry exists but is not public; only link breadcrumb segments to entries that are public - Feed.astro: fix href missing leading slash; show description after date link
…wn plugins - Replace npm with pnpm: remove package-lock.json, add pnpm-lock.yaml, update Dockerfile to use corepack + pnpm, upgrade @astrojs/node and astro to latest - Upgrade Tailwind v3 → v4: swap @astrojs/tailwind integration for @tailwindcss/vite plugin, add src/styles/global.css, update tailwind.config.mjs content paths - Rewrite remark-obsidian: add pass for tab-indented continuation lines (Obsidian nesting), replace raw HTML nodes with proper MDAST hast data for YouTube iframes and video/audio embeds so they survive remark-rehype correctly - Fix rehype-obsidian: handle raw and block-level element nodes (video, audio, iframe) to avoid nesting block elements inside <p> - Migrate content config from src/content/config.ts (legacy) to src/content.config.ts using Astro v6 glob loader API - Add src/pages/404.astro with garden-entry fallback - Add scripts/delogseq.mjs and scripts/retab-linkblog.mjs utilities with tests - Add docs/plans for linkblog tab-grouping design and implementation
- Convert /debug to SSR; return JSON when Accept: application/json is sent - Add /debug/compare?path=... with two iframes (local vs prod) and a path picker populated from the JSON endpoint
- Skip list-to-paragraph flattening in rehypeObsidian when parent is a blockquote, preserving genuine ol/ul inside quoted content - Add watch-lib integration to astro.config.mjs so changes to lib/ trigger a dev server restart, working around Astro not tracking config dependencies
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.