Hello, Weave

Weave is still under construction.

This is the seed post for the weave blog. It exists to exercise the full content pipeline: GFM, build-time syntax highlighting, KaTeX math, footnotes1, and the data-block selection contract2.

Typography

Body text is set in Inter at 0.875rem with a 460 weight. Emphasis swaps to a serif italic, strong stays Inter, and inline code uses the mono stack. Links look like this one to MDX.

Blockquotes mark the inner paragraph as the selectable block, not the quote wrapper — blocks never nest.

Highlights

Marker syntax wraps text in a yellow highlighter stroke by default. Single-letter color codes pick a variant: red for pitfalls, green for confirmed results, blue for references, purple for open questions and orange for todos. A highlight that runs long enough to wrap across lines gets an independent stroke on every line, ink pooling at both ends, exactly like a real marker dragged across the page — while a == b inside inline code stays untouched.

Lists

  • Tight list items are blocks themselves
  • Including ones with inline code
  • And a third for good measure
  1. Ordered lists work the same way
  2. Second item

Code

example.tsx
export function Greeting({ name }: { name: string }) {
  return <p>Hello, {name}</p>;
}

Math

Inline math like flows with the text, while display math stands alone:

Media

An elephant silhouetted against a sunset, birds scattered across the sky
An elephant silhouetted against a sunset, birds scattered across the sky
Video embeds are atomic units too.

Components

This paragraph is bracketed by a rough-notation stroke when it scrolls into view — one of the ported benji components.

Interactive islands can follow any paragraph. This poll is a client component hydrated inside the static article: your vote goes through a route handler into D1, and the results below come back from the database.

Which embedded block should this blog explore next?

0 votes · stored in D1

Islands aren't limited to request/response either. The chat room below holds a WebSocket to a Cloudflare Durable Object — messages are pushed to everyone in the room the moment they're sent, and the last hundred survive in the object's own SQLite storage.

lobby

Pick a name to join the chat.

Read more about MDX

mdxjs.com

Footnotes

  1. Footnotes render GitHub-style at the bottom of the article.

  2. The tail-list styling here follows userinterface.wiki — clicking anywhere on a note (outside a link) jumps back to its reference.