import type { Metadata } from "next"; import { DecodeText } from "@/src/components/bits/DecodeText"; import { Block } from "@/src/components/home/Block"; import { ClosingCta } from "@/src/components/home/ClosingCta"; import { Faq } from "@/src/components/home/Faq"; import { HeroStatement } from "@/src/components/home/HeroStatement"; import { HomeJsonLd } from "@/src/components/home/HomeJsonLd"; import { PathPicker } from "@/src/components/home/PathPicker"; import { PortraitSection } from "@/src/components/home/PortraitSection"; import { StickyBook } from "@/src/components/home/StickyBook"; import { AutomationFlow } from "@/src/components/illustrations/AutomationFlow"; import { CareerLine } from "@/src/components/illustrations/CareerLine"; import { ContactDiagram } from "@/src/components/illustrations/ContactDiagram"; import { PipelineRun } from "@/src/components/illustrations/PipelineRun"; import { WorkShowcase, type WorkItem, } from "@/src/components/illustrations/WorkShowcase"; import { Reveal } from "@/src/components/Reveal"; import { CAREER, FIT, TECH } from "@/src/content/about"; import { SITE_DESCRIPTION, SITE_TITLE } from "@/src/content/site"; import { AUTOMATION_NOTES } from "@/src/content/automation"; export const metadata: Metadata = { title: { absolute: SITE_TITLE }, description: SITE_DESCRIPTION, alternates: { canonical: "/" }, }; const MUTED = "text-slate-400"; const BODY = "m-0 font-sans text-lg leading-relaxed text-slate-500 md:text-xl"; const MONO = "font-mono text-[11px] uppercase tracking-[0.2em] text-slate-500"; const PRINCIPLES = [ { title: "One contact", text: "You talk to me, and I am the one who does the work.", }, { title: "Hours you can check", text: "I track my time. The monthly invoice shows what the hours were spent on.", }, { title: "Careful work", text: "I test what I build before I hand it over, and I say so when something is not finished or I am not sure.", }, { title: "What I build is yours", text: "Code and design belong to you. You can hand them to another developer.", }, ] as const; const WORK: readonly WorkItem[] = [ { name: "klz-cables.com", href: "https://klz-cables.com", client: "Cable supplier", text: "The company website of a supplier of energy cables, in German and English.", did: [ "Product catalogue with categories and detail pages", "Datasheets generated from the product data", "Content the client can edit in a CMS", ], tech: ["Next.js", "TypeScript", "Headless CMS", "Two languages"], desktop: { src: "/work/klz-long.webp", width: 1200, height: 1680 }, mobile: { src: "/work/klz-mobile.webp", width: 390, height: 3600 }, }, { name: "e-tib.com", href: "https://e-tib.com", client: "Cable network construction", text: "The company website of a group in cable network construction, in German and English.", did: [ "Pages for services, references, careers and events", "The same content in two languages", "Works on phone, tablet and desktop", ], tech: ["Next.js", "TypeScript", "Headless CMS", "Two languages"], desktop: { src: "/work/etib-long.webp", width: 1200, height: 4333 }, mobile: { src: "/work/etib-mobile.webp", width: 390, height: 3600 }, }, ]; export default function LandingPage() { return (
I am Marc.} >

I have been building for the web for 15 years: first in agencies, later as a senior developer, and now on my own.

My strength is the part people see and use: design and interface. I am also at home with what lies behind it, so I can build a complete application and not just its surface.

You work with me directly. Whether you run a product team or are commissioning something like this for the first time.

The path so far

What do you need? Four typical cases. } > Let the systems do the copying. } >

In most companies, people move information from one tool to another: read it here, type it in there, send an email about it. Automation connects those tools so that the work passes from one to the next on its own. Three typical examples:

{AUTOMATION_NOTES.map((group, i) => (

{group.title}

    {group.items.map((item) => (
  • {item}
  • ))}
))}
Which projects I am right for. } >
{FIT.map((group, i) => (

{group.title}

    {group.items.map((item) => (
  • {item}
  • ))}
))}

What I work with

{TECH.map((group) => (

{group.area}

    {group.items.map((item) => (
  • ))}
))}

What happens before a change goes live.

Software is connected: a change in one place can break another. I secure what I build with automated tests, and every change has to pass them before it is released. This is what such a run looks like.

How I work. Nothing unusual. } >
{PRINCIPLES.map((item, i) => (

{item.title}

{item.text}

))}
Two sites I built. Both are live. } >

Besides client work I build my own software, among other things a system in Rust and Solidity that runs on seven blockchains.

Good to know before we talk. } >
); }