Skip to content

Pivot site from Jekyll to Interleaved#8

Open
lilith wants to merge 7 commits into
gh-pagesfrom
interleaved
Open

Pivot site from Jekyll to Interleaved#8
lilith wants to merge 7 commits into
gh-pagesfrom
interleaved

Conversation

@lilith
Copy link
Copy Markdown
Member

@lilith lilith commented Apr 29, 2026

Summary

Migrates imageflow.io from Jekyll to Interleaved, the Claude-native CMS we've been building. The original Jekyll source is left in place under _layouts/_includes/_pages/_posts/_data/_config.yml for reference; the new Interleaved layout lives alongside it.

New layout:

  • templates/ — Liquid layouts + partials (LiquidJS, runs identically in Node and Cloudflare Workers)
  • content/ — markdown + HTML pages, posts under content/posts/
  • data/site.toml, authors.toml, tokens.toml (TOML preferred for new files; YAML still works on existing)
  • static/ — css, js, fonts, images, CNAME, robots.txt, sitemap, feed
  • .pages.yml — Interleaved admin schema, makes the site editable through the admin UI
  • PORT-NOTES.md — what changed and the remaining Jekyll gaps

What works today:

  • Builds 23 pages in ~80 ms via npx tsx ../interleaved/scripts/build-site.ts --src . --out _site
  • Editing through the Interleaved admin UI
  • All static pages, all blog posts
  • site.posts, site.pages, site.categories.<x>, site.tags.<x> populated from frontmatter (Jekyll-compat globals — recently shipped in Interleaved main)
  • Header navigation curated from site.nav in data/site.toml
  • Footer with social icons from site.social
  • Landing page: greeting, platforms, recent-posts blocks (last one uses site.posts | sortBy: "date", "desc")

Open Jekyll gaps (each documented in PORT-NOTES.md with a workaround):

  • paginator — Jekyll's built-in pagination
  • site.time — render-time clock; replaced with hard-coded site.this_year in site.toml
  • jekyll.environment — replaced with site.production toggle
  • Sitemap + RSS feed auto-update (currently the static files are copied verbatim)
  • Excerpt auto-extraction
  • The original landing-page "site.pages spotlight" block (depends on auto-derived page list — replaceable with site.pages now if desired)

Hosting note

GitHub Pages serves one site per repo. To run both Jekyll and Interleaved side-by-side during the cutover, recommend Cloudflare Pages — two projects against this same repo, different build configs and subdomains (e.g. www.imageflow.io for the Jekyll build, next.imageflow.io for the Interleaved build). Vercel and Netlify support the same pattern. Details in comment thread on request.

Test plan

  • Review PORT-NOTES.md for the gap list
  • npx tsx ../interleaved/scripts/build-site.ts --src . --out _site produces 23 pages
  • Diff a few rendered pages against the current Jekyll build to verify visual parity
  • Decide hosting: Cloudflare Pages (recommended), Vercel, Netlify, or stay-with-Jekyll-and-merge-later
  • Confirm whether to delete _layouts/_includes/_pages/_posts/_data/_config.yml/_sass after the cutover or keep them indefinitely

lilith added 2 commits April 29, 2026 14:51
Migrates imageflow-web from Jekyll to the Interleaved CMS. Old
_layouts/_includes/_pages/_posts/_data/_sass/_config.yml directories
are still tracked for reference; new content lives in:

  templates/    — Liquid layouts + partials
  content/      — markdown + HTML pages, posts under content/posts/
  data/         — site.toml, authors.toml, tokens.toml
  static/       — css, js, fonts, images, CNAME, robots.txt, sitemap, feed
  .pages.yml    — Interleaved admin schema
  PORT-NOTES.md — what changed and the gap list

Engine: Liquid (LiquidJS), same syntax family as Jekyll. Most existing
template logic ports directly. Filters that diverged (strip_html →
striphtml, truncatewords → excerpt, etc.) are documented in
PORT-NOTES.md.

Frontmatter: TOML (+++…+++) preferred for new files; YAML (---…---)
still works on the existing posts.

Builds 23 pages in ~70 ms via:
  npx tsx ../interleaved/scripts/build-site.ts --src . --out _site

Known gaps (deferred — see PORT-NOTES.md): site.posts/site.pages/
site.tags/site.categories globals, paginator, jekyll.environment, the
landing-page spotlight + featured-posts blocks, sitemap/feed auto-update.
@lilith lilith self-assigned this Apr 29, 2026
lilith added 5 commits April 29, 2026 15:25
Vendors the minimum Interleaved build pieces (lib/renderer/ + lib/serialization.ts
+ build script) so the site builds standalone with `npm install && npm run build`.
Cloudflare Pages picks this up automatically.

Workflow:
  npm install         # one-time
  npm run build       # produces _site/
  npm run preview     # builds + serves on http://localhost:8000

Vendored files mirror upstream imazen/interleaved at f346f11. When we want
the latest renderer features (e.g. when site.time, paginator, or pluggable
markdown renderers ship), `cp -R` from the upstream lib/renderer/ tree.

Initial deploy live at https://imageflow-web.pages.dev/ (Cloudflare Pages
project: imageflow-web, production branch: interleaved).
The Jekyll site's static/css/ contained .scss source files with Jekyll-
specific Liquid + include_relative directives. Sass alone can't process
them (frontmatter, {{ site.baseurl }}, {% include_relative %}). The
Cloudflare Pages build had no compiled main.css, so /css/main.css 404'd
back to the SPA fallback (delivering index.html with text/html, breaking
all styling).

Replaced the source .scss files with the already-compiled .css served by
the live www.imageflow.io site. main.css, fonts.css, ie8.css, ie9.css
ship as static assets — no build-time sass step needed.

If we later want to edit styles, options are:
  - Edit the .css files directly (simplest)
  - Restore the .scss sources to a separate sass/ dir, add a sass build
    step that pre-resolves the Jekyll-specific syntax
  - Migrate to a different styling approach (Tailwind, plain CSS)

Live: https://imageflow-web.pages.dev/css/main.css
Same root cause as ddf97c0 (CSS): static/js/all-except-main-and-ie8.js
was a Jekyll-source bundle with `{% include_relative %}` directives, not
real JavaScript. Browsers received 11 lines of frontmatter + Liquid tags
and did nothing.

Replaced with the already-bundled output served by www.imageflow.io
(jQuery 1.11.3 + scrollex + scrolly + skel + skel-layout + util,
605 lines minified).
The original Jekyll landing.html doesn't show a recent-posts section.
What looked like blog posts under content/posts/ are actually categorised
content for the /works/ and /topics/ subpages (categories: works, topics)
and were never meant to appear on the home page.

Restores visual parity with the live www.imageflow.io. site.posts is still
exposed as a render global; templates that want a blog feed can opt in
with `{% for p in site.posts | where: "categories", "blog" %}` once a
real blog post exists.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant