# AGENTS.md — AI Agent Handoff Guide This file is for the **next AI agent** working on this project. Read this before making any changes. ## What Is This Project? **malxte.de** is a single-page personal website for **Malxte** (aka ByteMalte) — a Rust programmer, Nostr enthusiast, and content creator. The site introduces who he is, links to his social profiles, and showcases his projects. - **Live at**: [malxte.de](https://malxte.de) - **Stack**: SvelteKit 2 + Svelte 5 + TypeScript + Vite + pnpm - **Type**: Static personal about page (no backend, no database, no API) ## Critical Files | File | What It Does | Edit When | |------|-------------|-----------| | `src/routes/+page.svelte` | ALL page content — hero, about, connect, projects | Adding/changing content, links, styling | | `src/routes/+layout.svelte` | Global shell — header, nav, footer, global CSS | Changing navigation, layout structure, global styles | | `src/app.html` | HTML shell — font loading | Adding fonts, meta tags, scripts | | `BYTEMALTE.md` | Design system spec (colors, typography, components) | Updating design tokens | | `package.json` | Dependencies and scripts | Adding/removing packages | ## Design System **Always follow the BYTEMALTE Design System** (see `BYTEMALTE.md`). ### Current Color Tokens (v1.1) | Token | Hex | Used For | |-------|-----|----------| | Primary | `#8888FF` | Buttons, links, brand accents, hover states | | Secondary | `#3DDC84` | Tags, success indicators | | Background | `#0F172A` | Page background | | Surface | `#1E293B` | Cards, sections, modals | | Text High | `#F8FAFC` | Headings, primary text | | Text Muted | `#B0BDD0` | Descriptions, footer, secondary text | | Error | `#EF4444` | Destructive actions | ### When using these colors in CSS: - **Primary**: `#8888ff` (hex) or `rgba(136, 136, 255, X)` (for transparency) - **Primary hover**: `#9a9aff` - **Secondary**: `#3ddc84` or `rgba(61, 220, 132, X)` - **Muted text**: `#b0bdd0` ### Border Radii - Buttons: `8px` - Cards/Containers: `16px` - Profile images: `50%` (circle) ### Typography - Font: `Inter, system-ui, sans-serif` - h1: `2.5rem`, weight 700 - h2: `1.8rem`, weight 600 - h3: `1.2rem`, weight 500 - Body: `1rem`, weight 400, line-height 1.6 ## How Content Is Organized All page content lives in `src/routes/+page.svelte`. Data is defined as static arrays: ```typescript // Social links — add/remove/edit entries here const connectLinks = [ { title: '...', description: '...', icon: '...', href: '...', cta: '...' }, ]; // Projects — add/remove/edit entries here const projects = [ { title: '...', description: '...', tags: ['...'], link: '...' | null }, ]; ``` SVG icons are inline strings (not components). Copy from [Lucide](https://lucide.dev/) or similar. ## Nostr Identity The site displays Malxte's Nostr credentials in the hero section: - **NIP-05**: `_@bytemalte.de` - **npub**: `npub1guff8dkdz7k47zh0mx26y0mmx5l6np57jjkvmhnyrak0n50r5hxqjdnsra` Both have copy-to-clipboard buttons. State is managed via: ```typescript let copiedField = $state(''); function copyToClipboard(text: string, field: string) { ... } ``` ## Common Tasks ### Adding a new social link 1. Open `src/routes/+page.svelte` 2. Add an entry to the `connectLinks` array 3. For the icon, use an inline SVG string (24x24 viewBox, stroke-based) ### Adding a new project 1. Open `src/routes/+page.svelte` 2. Add an entry to the `projects` array 3. Use `link: null` if there's no external URL ### Changing colors 1. Update `BYTEMALTE.md` with the new values 2. Find-and-replace in `src/routes/+layout.svelte` and `src/routes/+page.svelte` 3. Don't forget `rgba()` variants (e.g., `rgba(136, 136, 255, 0.1)`) ### Adding a new page 1. Create `src/routes/new-page/+page.svelte` 2. It will automatically be available at `/new-page` 3. Add a nav link in `src/routes/+layout.svelte` ### Updating the footer links Edit the footer section in `src/routes/+layout.svelte` (around line 189-196). ## Verification Checklist After making changes, always run: ```bash pnpm check # 0 errors, 0 warnings expected pnpm build # Must succeed ``` ## Svelte 5 Patterns Used - **`$state()`** — Reactive state declaration - **`$props()`** — Component props (layout uses `let { children } = $props()`) - **`{@render children()}`** — Slot rendering (replaces ``) - **`{#each}` / `{#if}`** — Control flow blocks - **Scoped `