"use client"; import { useState } from "react"; import { useTheme } from "./useTheme"; import { codingProjects, friends, socials, techProjects } from "../data"; import { Contributions, Reveal, Section, SectionHeading, ServiceRow, SocialGlyph, Stat, TerminalCard, type ServiceAccess, } from "./editorial-ui"; /* --------------------------------------------------------------- content */ const NAV = [ { href: "#about", label: "About" }, { href: "#services", label: "Services" }, { href: "#projects", label: "Projects" }, { href: "#hardware", label: "Hardware" }, { href: "#friends", label: "Friends" }, { href: "#contact", label: "Contact" }, ]; const SERVICES: { name: string; desc: string; url: string; access?: ServiceAccess; checkUrl?: string; disabled?: boolean; }[] = [ { name: "Proxmox", desc: "Server management — private.", url: "https://proxmox.dvorakmortonxd.dev/", access: "private", disabled: true }, { name: "Llama.cpp", desc: "Local AI server on a GPU-passthrough RTX 3070.", url: "https://ai.dvorakmortonxd.dev/", access: "on_request" }, { name: "Jellyfin", desc: "Self-hosted media streaming.", url: "https://jelly.dvorakmortonxd.dev/", access: "on_request" }, { name: "SMP", desc: "My survival Minecraft server.", url: "https://discord.gg/vyvhk7d8bX", checkUrl: "minecraft://mc.dvorakmortonxd.dev:25565", access: "on_request" }, { name: "Navidrome", desc: "My music, streamed from home.", url: "https://navidrome.dvorakmortonxd.dev/", access: "private" }, { name: "GitDXD", desc: "My self-hosted Forgejo instance.", url: "https://git.dvorakmortonxd.dev", access: "public" }, ]; const LIFTS = [ { lift: "Squat", weight: "125 kg", date: "5 Jan 2025" }, { lift: "Bench", weight: "111 kg", date: "29 May 2026" }, { lift: "Deadlift", weight: "165 kg", date: "17 Dec 2024" }, ]; /** Titles carry their state in parentheses, e.g. "dxdwm (Discontinued)". */ function splitStatus(title: string) { const m = title.match(/^(.*?)\s*\(([^)]+)\)\s*$/); return m ? { name: m[1], status: m[2] } : { name: title, status: null }; } /* ------------------------------------------------------------------ page */ export default function EditorialSite() { const { setTheme } = useTheme(); const [menuOpen, setMenuOpen] = useState(false); const stats = [ { value: String(SERVICES.length), label: "self-hosted services", sub: "git, media, music, AI, game server" }, { value: String(codingProjects.length), label: "coding projects", sub: "games, tools, plugins, forks" }, { value: String(techProjects.length), label: "machines collected", sub: "2009 – 2025, mostly e-waste" }, { value: "401 kg", label: "best SBD total", sub: "squat 125 · bench 111 · deadlift 165" }, ]; return ( <> {/* ------------------------------------------------------------- nav */}
dvorakmortonxd.dev I use gentoo btw
{menuOpen ? (
) : null}
{/* ---------------------------------------------------------- hero */}

September 2026  ·  Czech Republic  ·  IT student

I host my own internet, and I write code for fun.

I’m Martin Dvořák — 17 years old, studying network management in Czechia. I self-host everything from Git to music, collect old laptops, build small games, and lift when I’m not doing any of that.

Self-hosted services  ·  retro hardware  ·  pygame game jams

{/* ----------------------------------------------------------- stats */}
{stats.map((s) => ( ))}
{/* ----------------------------------------------------------- about */}
Who is behind the terminal} lead="A student who would rather run the whole stack himself than rent it. The parts of it that are actually interesting:" />

I’m a sophomore at sssvt.cz , specializing in network management and administration. I wanted to go there since 7th grade, so getting in was a good day. If you’re in middle school and into IT, it’s worth a look.

I’m a homelabber and self-hosting obsessive — I run my own Git, media, music, AI and game servers. I write code for game jams, tinker with GNU/Linux and musl systems, and rescue old hardware. My laptop collection spans 2009 to 2025; most of it came out of e-waste.

{/* ------------------------------------------------------------- now */}
What I’m doing right now} lead="A snapshot, not a feed." />

I’m hosting an SMP — message me on Discord if you want in. I’m also cooking most days, bulking through the non-summer seasons.

Me and my friend Pepa {" "}are building an education app so we can study more efficiently. It’s called{" "} maturita.c .

{/* -------------------------------------------------------- services */}
Services I run from home} lead="Live status is checked through this site. Some are private or shared on request — that’s what the label means." />
    {SERVICES.map((s) => (
  • ))}
{/* -------------------------------------------------------- projects */}
Things I’ve built} lead="Games, a browser, a window manager, a stack of abandoned servers and one very persistent Discord bot phase. Status in the margin." />
    {codingProjects.map((p, i) => { const { name, status } = splitStatus(p.title); return (
  1. {String(i + 1).padStart(2, "0")} {status ? {status} : null}
    {name}

    {p.desc}

  2. ); })}
{/* -------------------------------------------------------- hardware */}
The hardware pile} lead="From a 2009 ThinkPad to a 2025 MacBook Air — specs are whatever the machine actually shipped with." />
{techProjects.map((t) => (

{t.title}

{t.desc}

))}
{/* ----------------------------------------------------- contributions */}
Commits, on my own forge} lead={ <> I run a Forgejo instance at{" "} git.dvorakmortonxd.dev . It started as a way to stop renting GitHub; it’s public now. } />
{/* --------------------------------------------------------- friends */}
People worth visiting} lead="Sites built by friends — go look at them." />
{/* --------------------------------------------------------- lifting */}
SBD, five days a week} lead="A PPL split focused on strength. Current best singles at 73 kg bodyweight:" />
{LIFTS.map((l) => ( ))}
{/* --------------------------------------------------------- contact */}
Find me elsewhere} lead={ <> Fastest reply is Discord or Instagram. For anything longer, mail{" "} dvorak@dvorakmortonxd.dev . } />
{socials.map((s) => ( {s.name} ))}
{/* ---------------------------------------------------------- footer */} ); }