The personal site of Aymeric Dijoux — agentic developer and indie builder, based in Réunion Island and Paris.
Live at aymeric.dijoux.dev.
I ship production apps with agents, and I write down what actually holds. A hub for the apps I build (Noan, Ti Boug, VoiceJournal, Tookta), my path so far, my notes on the craft, and a door for the right kind of work together.
The notes are the point: articles in French, mirrored in English, on agentic development, spec-driven work, and the traps that only surface once something is live. The method behind them is public too — skills and claude-md-templates.
| Layer | Choice |
|---|---|
| Framework | Astro 6 (static output, zero JS by default) |
| Styling | Tailwind 4 with @theme + CSS variables |
| Content | Astro Content Collections + MDX, Zod-validated frontmatter |
| Code highlighting | Shiki (github-light / github-dark) |
| Icons | astro-icon + iconify (lucide, simple-icons) |
| Fonts | Self-hosted via @fontsource-variable — Inter Tight + JetBrains Mono |
| i18n | Native Astro i18n, default locale fr with no prefix, EN under /en/ |
| SEO / GEO | Sitemap + <JsonLd> entity graph + llms.txt + AI-crawler-friendly robots.txt |
| Tests / CI | Lighthouse CI · @axe-core/playwright · custom JSON-LD validator |
| Deploy | GitHub Pages via GitHub Actions on aymeric.dijoux.dev |
No JS framework on top of Astro. No React, no Vue, no Svelte. Hydration cost = 0 by default.
- 100% sans-serif Inter Tight Variable, no body serif
- Accent: fluo highlighter
#ccff00on a word in titles - 2px black borders everywhere, zero border-radius
- Mono pills (JetBrains Mono) for tags, dates, technical metadata
- Strong block pattern (label on
#0a0a0awith fluo text) that inverts in dark mode - All design tokens live in
src/styles/theme.css— including dark mode overrides under[data-theme="dark"]
The full design rationale lives in docs/superpowers/specs/2026-05-21-portfolio-design.md.
src/
├─ assets/ avatars, app logos, portrait
├─ components/
│ ├─ atoms/ Avatar, StatusBadge, ThemeToggle, Icon, Highlight, JsonLd, SectionLabel
│ ├─ molecules/ SocialLink, AppCell, NoteRow, Chapter, FAQItem, ProcessStep, ServiceCard, StackGroup, LangToggle
│ ├─ organisms/ Nav, Hero, AppsGrid, SocialBar, Footer, CollabBand, AboutExcerpt, NotesSection
│ └─ prose/ Callout, FileBlock (MDX components)
├─ content/
│ ├─ config.ts Zod schema for the notes collection
│ └─ notes/
│ ├─ fr/ FR articles (.mdx)
│ └─ en/ EN articles (.mdx)
├─ data/ profile, projects, socialLinks, services, faq, chapters, stack
├─ i18n/ ui strings (FR/EN), useTranslations, localizePath, alternateLocale
├─ layouts/ MainLayout, NoteLayout
├─ lib/ constants, dates, readingTime, notes, jsonLd, geo
├─ pages/
│ ├─ index.astro Home FR
│ ├─ a-propos.astro About FR
│ ├─ collaborer.astro Work-together FR
│ ├─ notes/ index, [slug], tags/[tag]
│ ├─ robots.txt.ts AI-crawler allow list + sitemap link
│ ├─ llms.txt.ts GEO summary for LLM consumption
│ ├─ llms-full.txt.ts Exhaustive GEO content dump
│ ├─ ai.txt.ts AI usage policy
│ ├─ rss.xml.ts RSS FR
│ └─ en/ EN mirror — same routes with translated slugs (about, writing, work) + en/rss.xml.ts
├─ styles/ global.css, theme.css, prose.css
└─ types/ shared TypeScript interfaces
This site is designed to be surfaced and cited by AI search engines (ChatGPT, Claude, Perplexity, Google AI Overviews).
/llms.txtat the root, structured for LLM ingestion (per llmstxt.org)/llms-full.txtwith the full exhaustive content/robots.txtexplicitly allowsGPTBot,ClaudeBot,PerplexityBot,Google-Extended,Applebot-Extended,CCBotand others/ai.txtdeclares AI usage policy- JSON-LD entity graph on every public page:
Person(canonical with@id),WebSite,SoftwareApplicationfor each app,BlogPostingfor each note,FAQPageon the work-together page,BreadcrumbListon navigable pages hreflangdeclarations on every bilingual page- A CI validator (
scripts/validate-jsonld.mjs) checks that no public page ships withoutPersonJSON-LD
npm install # install deps
npm run dev # http://localhost:4321
npm run build # output → ./dist (static)
npm run preview # serve ./dist locally
npm run astro check # TypeScript + Astro diagnostics
npm run lint # ESLint
npm run lint:fix # ESLint --fix
npm run format # Prettier write
npm run format:check # Prettier check
npm run validate:jsonld # custom GEO validator (run after build)Every push to main runs in CI:
astro check(TS + Astro diagnostics) — must passeslint+prettier --check— must passastro build— must passvalidate-jsonld.mjs— must find a Person JSON-LD on every public page@axe-core/playwright— must report zero a11y violations on/,/a-propos,/notes,/collaborerand their EN mirrors@lhci/cli— must hit Performance ≥ 95, Accessibility = 100, Best Practices ≥ 95, SEO = 100
If any of those fail, the site does not deploy.
The repo uses a CLAUDE.md at the root that documents the coding conventions enforced across the codebase: file-size limits, TypeScript strictness, naming, no hardcoded colors or UI strings, A11y rules, performance budgets, conventional commits.
That file is loaded by Claude Code on every session and serves as the engineering contract for any contributor — human or agent.
Code: MIT. Content (articles, design): all rights reserved.
If you're forking this for your own portfolio, the code is yours to take. The Mind Score concept, the D1 design system identity, and the written articles stay with me.
- Live: aymeric.dijoux.dev
- Apps: Noan · Ti Boug · VoiceJournal · Tookta · KaribTeck
- Agentic artifacts: skills · claude-md-templates
- LinkedIn: linkedin.com/in/aymeric-dijoux
- GitHub: github.com/newBie974