diff --git a/apps/web/app/(site)/about/opengraph-image.tsx b/apps/web/app/(site)/about/opengraph-image.tsx
deleted file mode 100644
index daf6e71..0000000
--- a/apps/web/app/(site)/about/opengraph-image.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { ImageResponse } from "next/og";
-import { OGImageTemplate } from "../../../src/components/OGImageTemplate";
-import { getOgFonts, OG_IMAGE_SIZE } from "../../../src/lib/og-helper";
-
-export const size = OG_IMAGE_SIZE;
-export const contentType = "image/png";
-export const runtime = "nodejs";
-
-export default async function Image() {
- const fonts = await getOgFonts();
-
- return new ImageResponse(
- ,
- {
- ...OG_IMAGE_SIZE,
- fonts: fonts as any,
- },
- );
-}
diff --git a/apps/web/app/(site)/about/page.tsx b/apps/web/app/(site)/about/page.tsx
index def8a60..fbaaf18 100644
--- a/apps/web/app/(site)/about/page.tsx
+++ b/apps/web/app/(site)/about/page.tsx
@@ -1,230 +1,71 @@
-"use client";
-
-import { Reveal } from "@/src/components/Reveal";
-import { Section } from "@/src/components/Section";
-import { Signature } from "@/src/components/Signature";
+import type { Metadata } from "next";
+import { Container, SectionHeader } from "@/src/components/site";
+import { Timeline } from "@/src/components/about/Timeline";
+import { TagList } from "@/src/components/about/TagList";
import {
- H1,
- H3,
- LeadText,
- BodyText,
- Label,
- MonoLabel,
-} from "@/src/components/Typography";
-import { Button } from "@/src/components/Button";
-import { AbstractCircuit, GradientMesh } from "@/src/components/Effects";
-import { GlitchText } from "@/src/components/GlitchText";
+ NOT_MY_THING,
+ STACK_ITEMS,
+ TIMELINE,
+ WORKING_MODE,
+} from "@/src/components/about/aboutData";
-export default function AboutPage() {
+export const metadata: Metadata = {
+ title: "About",
+ description:
+ "Senior engineer who makes AI-built software dependable. Web since 2011, remote since 2021, now independent.",
+ alternates: { canonical: "/about" },
+};
+
+// TODO(owner): link a CV download here once the PDF exists (no file yet).
+
+export default function Page() {
return (
-
-
- {/* Hero Section */}
-
-
-
-
-
-
-
-
+
+
-
-
-
- WEBENTWICKLER
-
-
-
-
- Über mich.
-
-
-
-
- 15 Jahre Erfahrung. Ein Ziel: Ihnen den Frust mit Websites zu
- ersparen.
-
-
-
-
-
+
+
+ I have worked on the web since 2011, starting with an apprenticeship.
+ Since then I have worked in agencies and product companies, and led
+ the frontend team at an agency. I have been fully remote since 2021
+ and am now independent, while running a small product business.
+
+
+ Design and frontend are my strength. I am comfortable with backend
+ concepts and architecture. Today I mostly write TypeScript and
+ Next.js, plus Rust and Solidity for systems work. The path started
+ with Vue and plain JavaScript, and I would rather say so than pretend
+ I always wrote Rust.
+
+
+
+
+
+ How I work
+
+
+ {WORKING_MODE.map((line) => (
+
{line}
+ ))}
+
- {/* Section 01: Story */}
-
-
-
-
- Aus der Praxis.
- Für die Praxis.
-
-
+
+
+ Timeline
+
+
+
-
-
-
- Ich habe in Agenturen, Konzernen und Startups gearbeitet. Dabei
- habe ich gesehen, woran Projekte scheitern: zu viele Leute, zu
- viel Blabla.
-
-
-
-
-
- Das mache ich anders. Keine Hierarchien, kein Fachchinesisch,
- sondern klare Kommunikation. Fokus auf Ergebnisse statt auf
- endlose Meetings.
-
-
-
-
-
- Sie sprechen immer mit mir.
-
-
-
-
-
- Wir beschränken uns auf das Wesentliche.
-
-
-
- Wenn etwas nicht passt, liegt die Verantwortung allein bei
- mir.
-
-
- Sie beauftragen mich, damit Sie Ruhe haben. Fixpreis bedeutet
- Fixpreis. Wir gehen erst live, wenn Sie zu 100% zufrieden
- sind.
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Section 04: CTA */}
- }
- >
-
-
-
-
- Bereit, das Thema
-
-
- abzuhaken?
-
-
-
-
-
-
-
-
- Schreiben Sie mir einfach – wir finden die beste Lösung für
- Ihre Website.
-
-
-
-
-
-
-
-
+
+
+
+
+
);
}
diff --git a/apps/web/app/(site)/book/page.tsx b/apps/web/app/(site)/book/page.tsx
index de7fa0a..b7c6ba3 100644
--- a/apps/web/app/(site)/book/page.tsx
+++ b/apps/web/app/(site)/book/page.tsx
@@ -1,8 +1,20 @@
import type { Metadata } from "next";
-import { Container } from "@/src/components/site/Container";
-import { SectionHeader } from "@/src/components/site/SectionHeader";
+import { Container, SectionHeader } from "@/src/components/site";
+import { AvailabilityLine } from "@/src/components/book/AvailabilityLine";
+import { BookingEmbed } from "@/src/components/book/BookingEmbed";
-export const metadata: Metadata = { title: "Book a call" };
+export const metadata: Metadata = {
+ title: "Book a call",
+ description:
+ "Book a 20-minute intro call to talk about your project, team and timeline.",
+ alternates: { canonical: "/book" },
+};
+
+const PREPARE: readonly string[] = [
+ "What you are building",
+ "Your team size",
+ "A rough timeline",
+];
export default function Page() {
return (
@@ -11,8 +23,26 @@ export default function Page() {
as="h1"
kicker="/book"
title="Book a call"
- lead="This page is coming soon."
+ lead="20 minutes to check whether we fit: your project, where it is stuck or unproven, and how a weekly capacity block would work."
/>
+