Item 8 — wire the 5 real articles into /blog, retire the backdated orphan

The live /blog showed "How to Read Line Movement Like a Sharp" dated 2026-03-22
— an orphaned, uncommitted file that predates the product. Meanwhile 5
genuinely-real articles sat in content/articles/, unwired.

- blog.ts now reads content/articles (not the untracked content/blog). Maps
  `excerpt` → description, skips `status: draft`, reads explicit `slug`.
- Added honest dates (2026-07-17, the real publish day) + flipped the 5
  articles to `status: published`. Real content: how-vyndr-grades-a-prop,
  why-our-misses-are-public, what-clv-is, how-streaks-lie, the-vyndr-originals.
- Retired the orphan: /blog/line-movement-guide 301s to /blog (next.config).
- Added a minimal, dependency-free, XSS-safe markdown renderer so headers/bold
  render as HTML instead of literal "##". Each article keeps title/date/
  read-time + the existing OG/JSON-LD metadata (affiliate-review ready). Richer
  media (images/charts) is the separate design train.

Web build exit 0 (SSGs all 5 slugs); backend suite unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-17 15:56:09 -04:00
parent 41fc2b90e2
commit 3b7a1f59bc
8 changed files with 78 additions and 27 deletions
+5 -4
View File
@@ -1,4 +1,4 @@
import { getAllPosts, getPostBySlug } from '@/lib/blog';
import { getAllPosts, getPostBySlug, renderMarkdown } from '@/lib/blog';
import { notFound } from 'next/navigation';
import type { Metadata } from 'next';
@@ -48,9 +48,10 @@ export default async function BlogPost({ params }: { params: Promise<{ slug: str
))}
</div>
)}
<div className="prose prose-invert max-w-none text-[var(--text)] leading-relaxed whitespace-pre-wrap">
{post.content}
</div>
<div
className="prose prose-invert max-w-none text-[var(--text)] leading-relaxed"
dangerouslySetInnerHTML={{ __html: renderMarkdown(post.content) }}
/>
</div>
<script