From 10c994b25245daf197a18baf1a1b2ff8fa5bfd88 Mon Sep 17 00:00:00 2001 From: colinislit Date: Tue, 14 Jul 2026 22:21:20 +0200 Subject: [PATCH] =?UTF-8?q?chore(strip):=20fase=200=20=E2=80=94=20verwijde?= =?UTF-8?q?r=20marketing,=20leads,=20archive=20en=20sitemap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prototype-ballast verwijderd als eerste stap van de ECD-rebuild: - app/(marketing) incl. blog, contact, documentatie + lib/mdx, lib/content, content/ - /api/leads en publieke marketing-routes uit middleware - app/epd/_archive (backup van clients-module) - sitemap.ts (verwees alleen naar blog), globals.css.backup - root / redirect naar /login; robots.txt op disallow-all (afgeschermd systeem) FHIR-routes blijven bewust staan: /api/fhir/Patient is de facto de patienten-API voor dossier, agenda en Cortex — vervangen volgt in fase 3. Co-Authored-By: Claude Fable 5 --- app/(marketing)/blog/page.tsx | 169 -- .../blog/serie/[serieId]/[slug]/page.tsx | 324 ---- app/(marketing)/blog/serie/[serieId]/page.tsx | 178 -- .../components/auth-code-handler.tsx | 38 - app/(marketing)/components/build-timeline.tsx | 273 --- app/(marketing)/components/hero-quote.tsx | 58 - .../components/hero-section-client.tsx | 33 - app/(marketing)/components/insight-box.tsx | 32 - .../components/marketing-shader.tsx | 83 - app/(marketing)/components/minimal-nav.tsx | 154 -- .../components/reading-progress.tsx | 69 - .../components/statement-section.tsx | 51 - app/(marketing)/contact/contact-form.tsx | 326 ---- app/(marketing)/contact/page.tsx | 55 - .../documentatie/[category]/page.tsx | 202 --- .../components/mdx-components.tsx | 191 --- .../components/release-sidebar-wrapper.tsx | 23 - .../components/release-sidebar.tsx | 304 ---- app/(marketing)/documentatie/layout.tsx | 51 - app/(marketing)/documentatie/page.tsx | 155 -- app/(marketing)/layout.tsx | 45 - app/(marketing)/page.tsx | 239 --- app/api/leads/route.ts | 116 -- .../[...path]/route.ts | 31 - .../[id]/components/client-tabs.tsx | 91 - .../[id]/components/intake-tab.tsx | 56 - .../[id]/components/plan-tab.tsx | 143 -- .../[id]/components/profile-tab.tsx | 122 -- .../[id]/dashboard/page.tsx | 101 -- .../[id]/diagnose/page.tsx | 27 - .../[id]/edit/page.tsx | 49 - .../[id]/intake/page.tsx | 27 - .../[intakeId]/components/intake-header.tsx | 65 - .../[intakeId]/components/intake-tabs.tsx | 52 - .../[id]/intakes/[intakeId]/layout.tsx | 29 - .../[id]/intakes/[intakeId]/page.tsx | 52 - .../[id]/intakes/actions.ts | 83 - .../[id]/intakes/components/intake-card.tsx | 70 - .../[id]/intakes/components/intake-list.tsx | 50 - .../intakes/components/new-intake-form.tsx | 137 -- .../[id]/intakes/new/page.tsx | 33 - .../clients_backup_20251122/[id]/page.tsx | 18 - .../[id]/plan/page.tsx | 27 - .../[id]/reports/page.tsx | 27 - .../clients_backup_20251122/actions.ts | 146 -- .../coming-soon-backup.tsx | 191 --- .../components/client-form.tsx | 149 -- .../components/client-list-skeleton.tsx | 56 - .../components/client-list.tsx | 260 --- .../clients_backup_20251122/new/page.tsx | 29 - .../_archive/clients_backup_20251122/page.tsx | 10 - app/globals.css.backup | 248 --- app/page.tsx | 5 + app/robots.ts | 24 +- app/sitemap.ts | 84 - components/ui/why-me.tsx | 117 -- content/nl/about.json | 95 -- content/nl/blog/_series.json | 21 - content/nl/blog/ai-speedrun/01-kickoff.mdx | 33 - .../ai-speedrun/02-authentication-docs.mdx | 48 - .../nl/blog/ai-speedrun/03-fhir-datamodel.mdx | 56 - content/nl/blog/ai-speedrun/04-de-valkuil.mdx | 62 - .../blog/ai-speedrun/05-spraakherkenning.mdx | 33 - .../blog/ai-speedrun/06-ai-tool-of-baas.mdx | 45 - .../nl/blog/ai-speedrun/07-ai-assistent.mdx | 54 - .../blog/ai-speedrun/08-week-4-spruitjes.mdx | 49 - .../09-verpleegkundige-overdracht.mdx | 51 - .../blog/ai-speedrun/10-stop-met-klagen.mdx | 65 - .../11-performance-optimalisatie.mdx | 47 - content/nl/blog/ai-speedrun/12-de-cijfers.mdx | 59 - content/nl/blog/ai-speedrun/13-learnings.mdx | 134 -- content/nl/blog/cortex-intent/introductie.mdx | 18 - content/nl/common.json | 15 - content/nl/contact.json | 118 -- content/nl/documentatie/_index.json | 216 --- content/nl/documentatie/agenda-systeem.mdx | 234 --- .../ai-documentatie-assistent.mdx | 208 --- content/nl/documentatie/authentication.mdx | 198 --- content/nl/documentatie/build-errors-fix.mdx | 79 - content/nl/documentatie/client-management.mdx | 61 - content/nl/documentatie/cortex-blocks.mdx | 176 -- .../nl/documentatie/cortex-intent-systeem.mdx | 154 -- .../cortex-keyboard-shortcuts.mdx | 142 -- .../documentatie/cortex-mention-systeem.mdx | 157 -- content/nl/documentatie/cortex-nudge.mdx | 167 -- content/nl/documentatie/cortex-overzicht.mdx | 121 -- content/nl/documentatie/diagnose-systeem.mdx | 211 --- content/nl/documentatie/fhir-api.mdx | 1508 ----------------- content/nl/documentatie/fhir-datamodel.mdx | 476 ------ content/nl/documentatie/intake-system.mdx | 203 --- content/nl/documentatie/interface-design.mdx | 643 ------- .../nl/documentatie/release-notes-system.mdx | 397 ----- content/nl/documentatie/screening-system.mdx | 203 --- .../spraakgestuurde-verslaglegging.mdx | 152 -- .../nl/documentatie/treatment-planning.mdx | 73 - .../verpleegkundige-overdracht.mdx | 231 --- .../voice-controlled-reporting.mdx | 134 -- .../webpack-module-resolution.mdx | 342 ---- content/nl/epd.json | 80 - content/nl/manifesto.json | 121 -- content/nl/metadata.json | 11 - content/nl/navigation.json | 18 - content/nl/timeline.json | 160 -- content/schemas/manifesto.ts | 248 --- lib/content/loader.ts | 70 - lib/content/markdown-parser.ts | 62 - lib/mdx/blog.ts | 259 --- lib/mdx/documentatie.ts | 240 --- middleware.ts | 5 - 109 files changed, 8 insertions(+), 14533 deletions(-) delete mode 100644 app/(marketing)/blog/page.tsx delete mode 100644 app/(marketing)/blog/serie/[serieId]/[slug]/page.tsx delete mode 100644 app/(marketing)/blog/serie/[serieId]/page.tsx delete mode 100644 app/(marketing)/components/auth-code-handler.tsx delete mode 100644 app/(marketing)/components/build-timeline.tsx delete mode 100644 app/(marketing)/components/hero-quote.tsx delete mode 100644 app/(marketing)/components/hero-section-client.tsx delete mode 100644 app/(marketing)/components/insight-box.tsx delete mode 100644 app/(marketing)/components/marketing-shader.tsx delete mode 100644 app/(marketing)/components/minimal-nav.tsx delete mode 100644 app/(marketing)/components/reading-progress.tsx delete mode 100644 app/(marketing)/components/statement-section.tsx delete mode 100644 app/(marketing)/contact/contact-form.tsx delete mode 100644 app/(marketing)/contact/page.tsx delete mode 100644 app/(marketing)/documentatie/[category]/page.tsx delete mode 100644 app/(marketing)/documentatie/components/mdx-components.tsx delete mode 100644 app/(marketing)/documentatie/components/release-sidebar-wrapper.tsx delete mode 100644 app/(marketing)/documentatie/components/release-sidebar.tsx delete mode 100644 app/(marketing)/documentatie/layout.tsx delete mode 100644 app/(marketing)/documentatie/page.tsx delete mode 100644 app/(marketing)/layout.tsx delete mode 100644 app/(marketing)/page.tsx delete mode 100644 app/api/leads/route.ts delete mode 100644 app/epd/_archive/clients_backup_20251122/[...path]/route.ts delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/components/client-tabs.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/components/intake-tab.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/components/plan-tab.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/components/profile-tab.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/dashboard/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/diagnose/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/edit/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intake/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/[intakeId]/components/intake-header.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/[intakeId]/components/intake-tabs.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/[intakeId]/layout.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/[intakeId]/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/actions.ts delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/components/intake-card.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/components/intake-list.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/components/new-intake-form.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/intakes/new/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/plan/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/[id]/reports/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/actions.ts delete mode 100644 app/epd/_archive/clients_backup_20251122/coming-soon-backup.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/components/client-form.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/components/client-list-skeleton.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/components/client-list.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/new/page.tsx delete mode 100644 app/epd/_archive/clients_backup_20251122/page.tsx delete mode 100644 app/globals.css.backup create mode 100644 app/page.tsx delete mode 100644 app/sitemap.ts delete mode 100644 components/ui/why-me.tsx delete mode 100644 content/nl/about.json delete mode 100644 content/nl/blog/_series.json delete mode 100644 content/nl/blog/ai-speedrun/01-kickoff.mdx delete mode 100644 content/nl/blog/ai-speedrun/02-authentication-docs.mdx delete mode 100644 content/nl/blog/ai-speedrun/03-fhir-datamodel.mdx delete mode 100644 content/nl/blog/ai-speedrun/04-de-valkuil.mdx delete mode 100644 content/nl/blog/ai-speedrun/05-spraakherkenning.mdx delete mode 100644 content/nl/blog/ai-speedrun/06-ai-tool-of-baas.mdx delete mode 100644 content/nl/blog/ai-speedrun/07-ai-assistent.mdx delete mode 100644 content/nl/blog/ai-speedrun/08-week-4-spruitjes.mdx delete mode 100644 content/nl/blog/ai-speedrun/09-verpleegkundige-overdracht.mdx delete mode 100644 content/nl/blog/ai-speedrun/10-stop-met-klagen.mdx delete mode 100644 content/nl/blog/ai-speedrun/11-performance-optimalisatie.mdx delete mode 100644 content/nl/blog/ai-speedrun/12-de-cijfers.mdx delete mode 100644 content/nl/blog/ai-speedrun/13-learnings.mdx delete mode 100644 content/nl/blog/cortex-intent/introductie.mdx delete mode 100644 content/nl/common.json delete mode 100644 content/nl/contact.json delete mode 100644 content/nl/documentatie/_index.json delete mode 100644 content/nl/documentatie/agenda-systeem.mdx delete mode 100644 content/nl/documentatie/ai-documentatie-assistent.mdx delete mode 100644 content/nl/documentatie/authentication.mdx delete mode 100644 content/nl/documentatie/build-errors-fix.mdx delete mode 100644 content/nl/documentatie/client-management.mdx delete mode 100644 content/nl/documentatie/cortex-blocks.mdx delete mode 100644 content/nl/documentatie/cortex-intent-systeem.mdx delete mode 100644 content/nl/documentatie/cortex-keyboard-shortcuts.mdx delete mode 100644 content/nl/documentatie/cortex-mention-systeem.mdx delete mode 100644 content/nl/documentatie/cortex-nudge.mdx delete mode 100644 content/nl/documentatie/cortex-overzicht.mdx delete mode 100644 content/nl/documentatie/diagnose-systeem.mdx delete mode 100644 content/nl/documentatie/fhir-api.mdx delete mode 100644 content/nl/documentatie/fhir-datamodel.mdx delete mode 100644 content/nl/documentatie/intake-system.mdx delete mode 100644 content/nl/documentatie/interface-design.mdx delete mode 100644 content/nl/documentatie/release-notes-system.mdx delete mode 100644 content/nl/documentatie/screening-system.mdx delete mode 100644 content/nl/documentatie/spraakgestuurde-verslaglegging.mdx delete mode 100644 content/nl/documentatie/treatment-planning.mdx delete mode 100644 content/nl/documentatie/verpleegkundige-overdracht.mdx delete mode 100644 content/nl/documentatie/voice-controlled-reporting.mdx delete mode 100644 content/nl/documentatie/webpack-module-resolution.mdx delete mode 100644 content/nl/epd.json delete mode 100644 content/nl/manifesto.json delete mode 100644 content/nl/metadata.json delete mode 100644 content/nl/navigation.json delete mode 100644 content/nl/timeline.json delete mode 100644 content/schemas/manifesto.ts delete mode 100644 lib/content/loader.ts delete mode 100644 lib/content/markdown-parser.ts delete mode 100644 lib/mdx/blog.ts delete mode 100644 lib/mdx/documentatie.ts diff --git a/app/(marketing)/blog/page.tsx b/app/(marketing)/blog/page.tsx deleted file mode 100644 index e50f785..0000000 --- a/app/(marketing)/blog/page.tsx +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Blog Overview Page - * - * Landing page with series cards and recent posts - */ - -import Link from 'next/link' -import { getAllPosts, getSeriesWithCounts, type BlogSeries } from '@/lib/mdx/blog' - -export const metadata = { - title: 'Blog - AI Speedrun', - description: 'Artikelen over AI-gestuurde software ontwikkeling, healthcare IT en het bouwen van een EPD.', - openGraph: { - title: 'Blog - AI Speedrun', - description: 'Artikelen over AI-gestuurde software ontwikkeling, healthcare IT en het bouwen van een EPD.', - type: 'website', - siteName: 'AI Speedrun', - locale: 'nl_NL', - }, - twitter: { - card: 'summary', - title: 'Blog - AI Speedrun', - description: 'Artikelen over AI-gestuurde software ontwikkeling, healthcare IT en het bouwen van een EPD.', - }, - alternates: { - canonical: `${process.env.NEXT_PUBLIC_APP_URL || 'https://aispeedrun.vercel.app'}/blog`, - }, -} - -export default async function BlogPage() { - const series = await getSeriesWithCounts() - const posts = await getAllPosts() - - return ( -
-
- {/* Header */} -
-

- Blog -

-

- Artikelen over AI-gestuurde ontwikkeling en de reis van het bouwen van een EPD. -

-
- - {/* Series Section */} - {series.length > 0 && ( -
-

- Series -

-
- {series.map((serie) => ( - - ))} -
-
- )} - - {/* Recent Posts Section */} -
-

- Recente Posts -

- {posts.length === 0 ? ( -

- Nog geen blogposts gepubliceerd. -

- ) : ( -
- {posts.map((post) => ( - -
- - {post.seriesId.replace('-', ' ')} - - - - - {post.readingTime} min leestijd -
-

- {post.frontmatter.title} -

-

- {post.frontmatter.description} -

- {post.frontmatter.tags && post.frontmatter.tags.length > 0 && ( -
- {post.frontmatter.tags.map((tag) => ( - - {tag} - - ))} -
- )} - - ))} -
- )} -
-
-
- ) -} - -function SeriesCard({ series }: { series: BlogSeries & { postCount: number } }) { - const colorStyles = { - teal: { - bg: 'bg-teal-50', - border: 'border-teal-200 hover:border-teal-400', - badge: 'bg-teal-100 text-teal-700', - dot: 'bg-teal-500', - }, - amber: { - bg: 'bg-amber-50', - border: 'border-amber-200 hover:border-amber-400', - badge: 'bg-amber-100 text-amber-700', - dot: 'bg-amber-500', - }, - slate: { - bg: 'bg-slate-50', - border: 'border-slate-200 hover:border-slate-400', - badge: 'bg-slate-100 text-slate-700', - dot: 'bg-slate-500', - }, - } - - const styles = colorStyles[series.color] || colorStyles.slate - const statusLabels = { - completed: 'Voltooid', - active: 'Actief', - planned: 'Gepland', - } - - return ( - -
-
- - {statusLabels[series.status]} - -
-

{series.title}

-

{series.description}

-
- {series.postCount} {series.postCount === 1 ? 'deel' : 'delen'} -
- - ) -} - diff --git a/app/(marketing)/blog/serie/[serieId]/[slug]/page.tsx b/app/(marketing)/blog/serie/[serieId]/[slug]/page.tsx deleted file mode 100644 index 0c9932f..0000000 --- a/app/(marketing)/blog/serie/[serieId]/[slug]/page.tsx +++ /dev/null @@ -1,324 +0,0 @@ -/** - * Individual Blog Post Page - * - * Renders MDX content with series navigation - */ - -import { notFound } from 'next/navigation' -import Link from 'next/link' -import { MDXRemote } from 'next-mdx-remote/rsc' -import { getPost, getSeries, getPostsBySeries, getSeriesNavigation, getAllPosts } from '@/lib/mdx/blog' -import { mdxComponents } from '../../../../documentatie/components/mdx-components' - -interface PostPageProps { - params: Promise<{ serieId: string; slug: string }> -} - -export async function generateStaticParams() { - const posts = await getAllPosts() - return posts.map((post) => ({ - serieId: post.seriesId, - slug: post.slug, - })) -} - -export async function generateMetadata({ params }: PostPageProps) { - const { serieId, slug } = await params - const post = await getPost(serieId, slug) - const series = await getSeries(serieId) - - if (!post || !series) { - return { title: 'Post niet gevonden' } - } - - const siteUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://aispeedrun.vercel.app' - const postUrl = `${siteUrl}/blog/serie/${serieId}/${slug}` - // Use post-specific image if provided, otherwise fall back to default - const ogImageUrl = post.frontmatter.image - ? `${siteUrl}${post.frontmatter.image.startsWith('/') ? '' : '/'}${post.frontmatter.image}` - : `${siteUrl}/og-blog-default.png` - - return { - title: `${post.frontmatter.title} - ${series.title}`, - description: post.frontmatter.description, - authors: [{ name: 'Colin van der Heijden', url: 'https://ikbenlit.nl' }], - keywords: post.frontmatter.tags || [], - openGraph: { - title: post.frontmatter.title, - description: post.frontmatter.description, - type: 'article', - publishedTime: post.frontmatter.date, - authors: ['Colin van der Heijden'], - siteName: 'AI Speedrun', - locale: 'nl_NL', - images: [ - { - url: ogImageUrl, - width: 1200, - height: 630, - alt: post.frontmatter.title, - }, - ], - }, - twitter: { - card: 'summary_large_image', - title: post.frontmatter.title, - description: post.frontmatter.description, - images: [ogImageUrl], - }, - alternates: { - canonical: postUrl, - }, - } -} - -export default async function PostPage({ params }: PostPageProps) { - const { serieId, slug } = await params - const post = await getPost(serieId, slug) - const series = await getSeries(serieId) - - if (!post || !series) { - notFound() - } - - const navigation = await getSeriesNavigation(serieId, slug) - const { frontmatter, content, readingTime } = post - - // Generate Article structured data for SEO - const siteUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://aispeedrun.vercel.app' - const postUrl = `${siteUrl}/blog/serie/${serieId}/${slug}` - // Use post-specific image if provided, otherwise fall back to default - const articleImage = frontmatter.image - ? `${siteUrl}${frontmatter.image.startsWith('/') ? '' : '/'}${frontmatter.image}` - : `${siteUrl}/og-blog-default.png` - const articleSchema = { - '@context': 'https://schema.org', - '@type': 'Article', - headline: frontmatter.title, - description: frontmatter.description, - image: articleImage, - datePublished: frontmatter.date, - dateModified: frontmatter.date, - author: { - '@type': 'Person', - name: 'Colin van der Heijden', - url: 'https://ikbenlit.nl', - }, - publisher: { - '@type': 'Organization', - name: 'AI Speedrun', - url: siteUrl, - logo: { - '@type': 'ImageObject', - url: `${siteUrl}/images/aispeedrun-logo.webp`, - }, - }, - mainEntityOfPage: { - '@type': 'WebPage', - '@id': postUrl, - }, - articleSection: series.title, - keywords: frontmatter.tags?.join(', ') || '', - wordCount: content.split(/\s+/).length, - timeRequired: `PT${readingTime}M`, - } - - // Generate BreadcrumbList structured data - const breadcrumbSchema = { - '@context': 'https://schema.org', - '@type': 'BreadcrumbList', - itemListElement: [ - { - '@type': 'ListItem', - position: 1, - name: 'Home', - item: siteUrl, - }, - { - '@type': 'ListItem', - position: 2, - name: 'Blog', - item: `${siteUrl}/blog`, - }, - { - '@type': 'ListItem', - position: 3, - name: series.title, - item: `${siteUrl}/blog/serie/${serieId}`, - }, - { - '@type': 'ListItem', - position: 4, - name: frontmatter.title, - item: postUrl, - }, - ], - } - - const colorStyles = { - teal: { - badge: 'bg-teal-100 text-teal-700 border-teal-200', - link: 'text-teal-600 hover:text-teal-700', - }, - amber: { - badge: 'bg-amber-100 text-amber-700 border-amber-200', - link: 'text-amber-600 hover:text-amber-700', - }, - slate: { - badge: 'bg-slate-100 text-slate-700 border-slate-200', - link: 'text-slate-600 hover:text-slate-700', - }, - } - - const styles = colorStyles[series.color] || colorStyles.slate - - return ( -
- {/* Structured Data for SEO */} -