Skip to content
TJ Miller

Heading 1 — The Quick Brown Fox

A lead paragraph to set the measure. This is what body copy looks like at the default size, with bold text, italic text, bold italic, strikethrough, inline code, and a regular link mixed in. Typography should feel calm enough to read a thousand words of it.

Heading 2 — Sentence Rhythm

Another paragraph so we can judge the space between blocks. The gap between two paragraphs matters more than almost anything else on a reading page.

Heading 3 — Subsection

Text under a level-three heading.

Heading 4 — Minor

Text under a level-four heading.

Heading 5
Heading 6

Blockquotes

A single-line blockquote. Short, quotable, and it should feel distinct from body copy without shouting.

A multi-paragraph blockquote. The first paragraph sets up the idea and runs long enough to wrap onto a second line so we can check the left rule and the leading.

The second paragraph continues the thought. Both paragraphs should share one continuous rule down the left edge.

Blockquotes can contain other things too — a link, some inline code, and bold text.

— Someone Worth Quoting

Lists

Unordered:

  • First item in the list
  • Second item, which is deliberately long enough to wrap onto a second line so we can see how the hanging indent behaves
  • Third item
    • Nested item one
    • Nested item two
      • Third level
  • Fourth item

Ordered:

  1. Install the package
  2. Configure the provider
  3. Ship it
    1. Nested ordered item
    2. Another nested item
  4. Celebrate

Task list:

  • Port every post
  • Rebuild the OG images
  • Decide on the syntax theme

Code

Inline composer require echolabs/prism inside a sentence, plus a longer \App\Services\MemoryConsolidator::class reference.

<?php
namespace App\Services;
use EchoLabs\Prism\Prism;
use Illuminate\Support\Collection;
class MemoryConsolidator
{
public function __construct(
private readonly int $maxGeneration = 3,
) {}
/** Merge semantically similar memories into denser ones. */
public function consolidate(Collection $memories): Collection
{
return $memories
->groupBy(fn ($memory) => $memory->cluster_id)
->map(function (Collection $cluster) {
if ($cluster->count() === 1) {
return $cluster->first();
}
return Prism::text()
->using('anthropic', 'claude-opus-5')
->withPrompt($this->prompt($cluster))
->generate();
})
->values();
}
}
// A small async helper with a few token types.
const THRESHOLD = 0.82;
export async function findSimilar(embedding, { limit = 10 } = {}) {
const response = await fetch("/api/memories/search", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ embedding, limit }),
});
if (!response.ok) {
throw new Error(`Search failed: ${response.status}`);
}
const { results } = await response.json();
return results.filter((r) => r.score >= THRESHOLD);
}
Terminal window
# Shell, with comments and flags
pnpm install
pnpm build --verbose
rsync -avz --delete ./dist/ deploy@tjmiller.me:/var/www/
{
"name": "tjmiller.me",
"version": "5.0.0",
"private": true,
"scripts": {
"dev": "astro dev",
"build": "astro check && astro build"
}
}
const theme = "poimandres";
const theme = vaporwaveDark;
export default defineConfig({ themes: [theme] });

A code block with a title and highlighted lines:

src/data/post.ts
export async function getAllPosts() {
return await getCollection("post", ({ data }) => {
return import.meta.env.PROD ? data.draft !== true : true;
});
}

A long line that must scroll horizontally rather than break the page layout:

this is a deliberately long single line of code intended to overflow the container so we can confirm that horizontal scrolling works correctly and nothing bleeds out of the article column

Tables

ProviderModelContextStreaming
Anthropicclaude-opus-5200,000
OpenAIgpt-5128,000
Ollamallama-3.3-70b8,192
Groqmixtral-8x7b32,768

Images

A screenshot of the Iris memory card interface

Footnotes

Here is a claim that needs a citation1, and another one that needs a different citation2.

Everything Else

Term lists, keyboard keys like + K, and abbreviations such as LLM all show up occasionally.

A final paragraph to close the page out and confirm the bottom spacing feels right before the footer takes over.

Footnotes

  1. The first footnote, with a link inside it.

  2. A named footnote. These render at the bottom of the article.