diff --git a/src/pages/index.astro b/src/pages/index.astro index 113ef5d..72a1769 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -8,14 +8,31 @@ const posts = await getCollection('posts'); const sortedPosts = posts.sort((a, b) => b.data.date.getTime() - a.data.date.getTime()); const base = import.meta.env.BASE_URL.replace(/\/?$/, '/'); +// Match rage series titles to actual published posts by slug +const ragePosts: Record = { + 'Your Build Cache Is Lying to You': 'your-build-cache-is-lying-to-you', + 'Two-Phase Fingerprinting: BuildXL\u2019s Deep Magic': 'two-phase-fingerprinting-buildxls-deep-magic', + 'Hooking Syscalls Without a Kernel Driver': 'hooking-syscalls-without-a-kernel-driver', + 'TypeScript 7 Makes the Build Harness More Important': 'typescript-7-makes-the-build-harness-more-important', +}; + const rageSeries = [ - { title: 'Your Build Cache Is Lying to You', status: 'coming-soon' }, - { title: 'Two-Phase Fingerprinting: BuildXL\u2019s Deep Magic', status: 'coming-soon' }, - { title: 'Hooking Syscalls Without a Kernel Driver', status: 'coming-soon' }, - { title: 'TypeScript 7 Makes the Build Harness More Important', status: 'coming-soon' }, - { title: 'node_modules in a Content-Addressed Store', status: 'coming-soon' }, - { title: 'What I Learned Maintaining Lage and Why I Rewrote It', status: 'coming-soon' }, -]; + 'Your Build Cache Is Lying to You', + 'Two-Phase Fingerprinting: BuildXL\u2019s Deep Magic', + 'Hooking Syscalls Without a Kernel Driver', + 'TypeScript 7 Makes the Build Harness More Important', + 'node_modules in a Content-Addressed Store', + 'What I Learned Maintaining Lage and Why I Rewrote It', +].map(title => { + const slug = ragePosts[title]; + const post = slug ? posts.find(p => p.id === slug) : null; + return { + title, + slug: slug || null, + published: !!post, + readingTime: post?.body ? getReadingTime(post.body) : null, + }; +}); --- @@ -24,7 +41,7 @@ const rageSeries = [

Crash Test Dev

Engineering judgment, tested against reality.

- +

@@ -46,9 +63,18 @@ const rageSeries = [

A six-part investigation into rage, a Rust monorepo build system that fuses BuildXL's provable correctness with lage's ergonomics. From syscall sandboxing to content-addressed storage.

    {rageSeries.map((item) => ( -
  1. - {item.title} - Coming soon +
  2. + {item.published ? ( + + {item.title} + {item.readingTime} min + + ) : ( + <> + {item.title} + Coming soon + + )}
  3. ))}
@@ -222,6 +248,39 @@ const rageSeries = [ margin-left: var(--space-2); } + .series-item-link { + display: flex; + justify-content: space-between; + align-items: baseline; + width: 100%; + text-decoration: none; + color: inherit; + } + + .series-item-link:hover { + text-decoration: none; + } + + .series-item-link:hover .series-item-title { + color: var(--accent-primary); + } + + .series-item-meta { + font-family: var(--font-evidence); + font-size: var(--type-xs); + color: var(--text-tertiary); + flex-shrink: 0; + margin-left: var(--space-2); + } + + .series-item.published { + border-color: var(--border-default); + } + + .series-item.published .series-item-title { + transition: color var(--duration-fast) var(--ease-default); + } + /* All posts */ .all-posts { margin-bottom: var(--space-12);