Tangible products, deliberate architectures.

Personal projects — from a multiplayer AI TTRPG to a voice-driven remote desktop — each anchored in a precise product problem, with deliberate stack and distribution choices.

7 projectsProduction, development and launch
Consolidated stack

Ideas that were missing — designed and shipped to production.

I spot a use case nobody serves well, design the solution and take it all the way to a live product — every time a first, or a notch above the state of the art.

7 projects4 in productiondesigned & shipped solo

All built with state-of-the-art LLM-assisted dev —Claude CodeCodexCursor

See the full tech stack

Deduplicated aggregation of all technologies used across the projects, grouped by playground.

Frontend & UI
Angular 21Angular SignalsAngular SSGAstro 5Fuse.jshls.jsJavaScriptjsPDFNode.jsPostCSSPySide6 (Qt)React 18RxJSSCSSTailwind CSSTailwind CSS 4TypeScriptViteVite 8
Backend & APIs
AxumFastAPIJWT + bcryptOBS WebSocketPydantic v2PythonPython 3.12RustTyper + RichWebSocket
AI, voice & ML
ChatGPT (OpenAI)Claude (Anthropic)CUDAGemini (Google)Ollama / llama.cpp / vLLMOpenAIPyTorchQwen-TTS (Alibaba)Whisper (OpenAI)
Mobile & Cross-platform
AndroidFlutterLinux (X11 / Wayland)PipeWireRustDesk (fork)
Integration & DevOps
async SQLiteDockerEd25519FFmpegNDI SDKOpenCVSQLite
Other
CargoCloudflare PagesMCP (Model Context Protocol)Media3 / ExoPlayerMineflayerngx-translatepnpmPWA / Service WorkerSolid 1.9Tauri 2VitestWASMWeb Workers
Project 01

MultiPOV — synchronised multi-POV viewer for YouTube, Twitch & Kick

In production

A public web product for synchronised YouTube, Twitch and Kick multi-POV viewing, extended by a Rust/WASM media core and an Android app validated on device.

  • Real production productwatchmultipov.app is live: shareable multi-POV sessions, a Solid + TypeScript PWA and a bilingual FR/EN interface.
  • Rust/WASM media coreA shared Rust engine carries sync, clock, offset, liveness and fallback rules; it is exposed as WASM on the web and compiled natively on Android.
  • Session encoded in the URLThe whole configuration lives in the /s/ path, with no account or session backend: a link you can drop in a comment or a DM.
  • Android app validated on deviceThe Tauri 2 app embeds the real web control room with a shared Rust core, native Media3/ExoPlayer players and live sync validated on device.
RustWASMTauri 2AndroidMedia3 / ExoPlayerSolid 1.9TypeScriptVite 8Cloudflare Pageshls.jsWeb WorkersPWA / Service WorkerVitestCargopnpm

See it in practice

Multi-POV control room in production

Open the public web application to test a shareable session and compare YouTube, Twitch and Kick synchronisation in real conditions.

How it works

Synchronised multi-POV viewing product for Discord sessions and events: several YouTube, Twitch and Kick POVs in one control room, aligned in VOD through audio sync and maintained by clock/offset logic. The web product is live at watchmultipov.app with Solid, TypeScript, Vite, PWA and hls.js. The current media core is a shared Rust engine exposed as WASM on the web and compiled natively in the app. The Android app uses Tauri 2, embeds the real web control room, shares the Rust core, uses native Media3/ExoPlayer players and has live sync validated on device.

  • Web VOD sync: GCC-PHAT measures audio offsets, then a master clock and offsets keep POVs aligned after pause, seek or layout changes
  • Shared Rust core: common media engine exposed as WASM on the web and compiled natively on Android to centralise timing, offsets, provider capabilities, errors and fallbacks
  • Three platforms in one view — YouTube, Twitch and Kick — behind a unified provider layer so web/native UI never special-cases a platform
  • Account-free shareable sessions encoded in the URL path (/s/), portable in a comment or a DM
  • Configurable layout engine: auto grid, spotlight, theater and stacks; drag, resize and saved layouts (localStorage)
  • Immersive fullscreen mode: Fullscreen API on the whole stage, with landscape orientation lock and Wake Lock to keep the screen on during playback
  • Unified chat overlay (Twitch/YouTube/Kick): repositionable per-POV ephemeral overlay or side dock, messages merged with a per-platform colour dot and aligned to the timeline in VOD
  • Android native app: Tauri 2, embedded web control room, shared Rust core, native Media3/ExoPlayer players and live sync validated on device
  • Method: specified, implemented, reviewed with Claude/Codex, verified in production and on device with scoped commits
Project 02

Aidventures — Community narrative TTRPG platform powered by generative AI

Production launch

What if you designed a tabletop RPG system entirely built for an AI to run? That's Aidventures: an AI plays the game master while the engine keeps control of the rules.

  • A game system built for the LLMOriginal mechanics (2d6+stat, Vows & Clocks, GM Moves) and a deterministic engine (HP, momentum, checkpoints) designed so a model can run them without ever drifting — the innovation is in the game design as much as the code.
  • 19-invariant drift gateEvery LLM output is validated then clamped before it touches state — the game stays playable whatever the model.
  • The right model at the right timeHaiku validates and extracts, Sonnet drives the narrative, Opus settles dilemmas — all switchable to Gemini, OpenAI or a local model.
  • A direction for the playerVows & Clocks trace a clear path, and on every turn the game offers three suggested actions — or lets you write a free-text response.
Python 3.12FastAPIWebSocketPydantic v2Claude (Anthropic)Gemini (Google)OpenAIOllama / llama.cpp / vLLMasync SQLiteViteDockerQwen-TTS (Alibaba)JWT + bcryptTyper + Rich

See it in practice

Production launch

Explore the web application and its narrative game loop: the AI runs the session while the engine keeps the rules and game state under control.

How it works

Multiplayer text-based TTRPG web platform where a generative AI acts as the game master. Original game system (2d6+stat, GM Moves, Trait Cards, Vows & Clocks, 5 pacing modes) secured by a 19-invariant 'drift gate' that validates every LLM output before applying state. Designed with Claude (Anthropic) as primary provider, the application also supports Gemini, OpenAI or a local model (Ollama, llama.cpp, vLLM via OpenAI-compatible API) through an adapter architecture. The community creates its own universes via an 11-step wizard in 4 phases (Fandom import, AI-assisted generation, voice profiles, lore by season/episode, translation) and publishes after moderation. Python 3.12 / FastAPI + WebSocket backend, asynchronous SQLite, Vite frontend, multi-container Qwen TTS pool and a free tier with virtual Flares currency.

  • Dice-first game system: the 2d6+stat roll is resolved by the engine BEFORE the LLM call (frozen roll handed over as established fact), deterministic Position & Effect, 5 pacing modes, Bold Move, HP/Momentum managed 100% by the engine (never by the LLM)
  • Objectives & clocks driven by the LLM: the Architect agent defines Vows (objectives from 0 to 10) and Clocks of 4, 6 or 8 segments — at setup or created dynamically mid-game — which the engine advances and aggregates deterministically
  • 19-invariant drift gate: each AI response validated before state patch (automatic clamp if drift detected on HP, momentum, pacing, position, effects)
  • Multi-provider via adapters: optimised for Claude (Sonnet for turns, Haiku for validation and extraction, Opus for moral dilemmas), also compatible with Gemini, OpenAI and local models (Ollama, llama.cpp, vLLM) via OpenAI-compatible API
  • Community universe creation: 11-step wizard in 4 phases with Fandom import (scraping → Haiku extraction → Sonnet builder), AI Generate buttons per step, WAV voice profiles per character/language, lore enrichment by season/episode and EN ↔ FR translation
  • Lifecycle & moderation: draft → pending → published → flagged → removed, user reports, DMCA/LCEN/DSA takedown procedure, email notifications to creators
  • Public landing + authenticated SPA: universe gallery served with HTTP 60s cache, auth redirect on /app, user accounts (JWT, bcrypt, OAuth, magic-link)
  • Free tier with virtual Flares currency: inscription credit, daily claim, rewarded ads (dynamic CSP per user, service worker exclusion)
  • Immersive audio with cloned voices: multi-container Docker Qwen TTS pool synthesising a cloned voice per character and per language (from a reference sample), with least-connections dispatch, per-user semaphore, LRU cache for voice profiles, intro music per universe and mood-categorised track catalog
  • Observability tools: JSONL traces, 0-API replay, narrative/mechanical audit, per-session cost tracker, HMAC-auth admin panel
Project 03

Nomad — Joy-Con + voice remote desktop for mobile Linux coding

In production

From an Android phone, use Claude Code or Codex on your remote Linux machine: dictate prompts by voice and use a Joy-Con for mouse and shortcuts, with no physical keyboard.

  • Your phone as a mobile workstationThe Android displays the remote Linux machine; the Joy-Con held in the other hand drives the mouse with its stick and triggers CLI shortcuts through button combinations.
  • Voice that codes, in one tapFrom the Android, one tap starts dictation: local STT transcribes speech and injects it straight into Claude Code, Codex or another CLI on the Linux machine.
  • The daemon does the dirty workAs soon as a RustDesk client connects, display, audio and voice transcription are orchestrated automatically on the Linux side.
  • From idea to production, soloPatched RustDesk fork, standalone Ed25519 license server and a bilingual distribution site — a complete product, end-to-end.
RustAxumSQLiteEd25519RustDesk (fork)FlutterAstro 5Tailwind CSS 4Linux (X11 / Wayland)PipeWire

See it in practice

Product and distribution

Discover the product and its distribution site: an Android phone, voice and a Joy-Con become a complete interface for coding on Linux remotely.

How it works

Remote desktop solution dedicated to voice-driven development from an Android terminal, allowing users to operate a Linux machine as if sitting in front of it. Key differentiator: native Nintendo Switch Joy-Con integration as a companion peripheral — the phone stays free for voice dictation while the Joy-Con (held in the other hand) drives the mouse via its analog stick and triggers keyboard shortcuts through configurable button-combo profiles (Claude code, Open code, codex...), covering most actions of these CLIs without ever putting down the phone. The ecosystem combines a Linux daemon that automatically orchestrates display, audio and transcription as soon as a mobile client connects via RustDesk, a patched RustDesk fork (Joy-Con gamepad mapping, voice call, rebranding), a standalone Axum + SQLite + Ed25519 license server with offline and expiry grace handling, and a bilingual EN/FR distribution website. A complete product concept, designed and implemented end-to-end, from initial proposal to production release on nomadrust.dev.

  • Concept design: use an Android as a voice terminal to drive a remote Linux machine through RustDesk
  • Nintendo Switch Joy-Con integration: optimal companion peripheral that frees the phone for dictation — mouse movement via analog stick and keyboard shortcuts triggered by button combinations
  • Configurable button profiles (Claude code, Open code, codex...) providing enough actions to operate these CLIs without a physical keyboard
  • Voice dictation to talk to the LLM: the Android app opens a voice call (RustDesk) to the daemon, which transcribes speech locally (Voxtype / Whisper large-v3-turbo) and injects the text as keystrokes (wtype on Wayland, xdotool on X11) straight into the target CLI (Claude Code, Codex…) — you speak, the text types itself into the terminal
  • Linux daemon automatically orchestrating screen, audio and transcription as soon as a mobile client connects
  • Custom RustDesk fork with dedicated patches (Joy-Con gamepad mapping, voice call, rebrand)
  • Standalone license server (Axum + SQLite + Ed25519) with offline and expiry grace periods
  • Bilingual EN/FR website (Astro 5 + Tailwind CSS 4) for distribution
  • Owned product decisions: simple pricing (€5/month or €50 lifetime), no trial, scoped V1.0 to Linux only
Project 04

Professional Angular Portfolio — Angular 21 SSG and Lighthouse 100/100

Production

A portfolio built like a product: SSG, SEO and performance dialed in, bilingual and alive.

  • Lighthouse 100/100Angular 21 SSG architecture with Core Web Vitals held (LCP < 2.5s, INP < 200ms, CLS < 0.1) on every page.
  • A real image every dayEach day, the pipeline selects a real astronomy image from NASA APOD, ESA/Hubble, ESA/Webb or ESO, then rejects flat, annotated or repeated visuals with dedicated filters.
  • Performant animated backgroundVoronoi fragments, sparkles, an energy field and shooting stars add depth; the day's palette flows into surfaces, cards and accents without sacrificing smoothness.
  • Stellar easter eggA shooting star occasionally crosses the screen, with a colour sampled from bright zones and a subtle trail echoed through the fragments.
Angular 21TypeScriptTailwind CSS 4Angular SSGngx-translateRxJSAngular SignalsSCSSPostCSSjsPDF

See it in practice

The animated background, live

Compare the source image with the animated result and its integrated effects.

How it works

Modern portfolio website developed with Angular 21 and optimized for organic search (SEO). SSG (Static Site Generation) architecture for maximum performance and search engine visibility. Bilingual FR/EN interface with a cosmic background updated daily, layered animation and a static fallback when device capabilities or preferences require it. Responsive design using Tailwind CSS 4 with a dynamic PDF CV generator.

  • Angular 21 SSG (Static Site Generation) architecture for optimal SEO indexing
  • Core Web Vitals: LCP < 2.5s, INP < 200ms, CLS < 0.1
  • Lighthouse score 100/100 on performance, accessibility, best practices and SEO
  • Bilingual FR/EN switch through canonical routes: FR on /, EN on /en/*
  • Daily multi-source cosmic background: a script (images:fetch via GitHub Actions) selects a real image each day from NASA APOD, ESA Hubble, ESA Webb or ESO Picture of the Week; brightness and entropy filters, an OCR guard, host allowlist, denylist and anti-stagnation guard reject flat, annotated or repeated images, with a local-cache fallback
  • Layered background animation: around 300 Voronoi fragments modulated by an energy field, sparkles detected on bright zones and occasional shooting stars
  • Performance by design: the energy loop is capped at 30 FPS, fragment computation runs in a Web Worker, loading is deferred and animation is disabled for mobile or low-capability profiles
  • Glassmorphism design: translucent backdrop-filter surfaces (blur + saturate), per-card hue rotation and background sampling (photo-tint) for coherent highlights
  • Progressive CSS animations between pages and on scroll, with reduced-motion support
  • Dynamic PDF CV generator: on-the-fly creation of stylized CV from JSON data with jsPDF
  • Tailwind CSS 4 integration with mobile-first responsive design and smooth animations
  • WebP image optimization + lazy loading for minimal loading times
  • Dynamic meta tags, Open Graph, Twitter Cards and JSON-LD for optimized SEO and social sharing
  • GitHub Actions CI/CD: automatic static prerender build and SFTP deployment on each push
  • Modern architecture: Angular Signals, standalone components, static prerendering and HTTP cache
Project 05

Intelligent Podcast Analyzer — Generative AI and multi-engine transcription

In development

Turn hours of podcast audio into structured, searchable data while keeping the API budget in check.

  • Whisper anti-hallucinationDetecting and correcting transcription errors cuts API calls by 55% while preserving accuracy.
  • AI-extracted metadataGuests, topics and key moments are pulled out automatically with precise timestamps, ready for real-time fuzzy search.
PythonReact 18TypeScriptChatGPT (OpenAI)Whisper (OpenAI)PyTorchFFmpegCUDAViteTailwind CSSFuse.jsSQLite

See it in practice

Demo in development

Open the demo to browse search across transcripts and AI-extracted metadata from podcast catalogues.

How it works

Automated podcast content analysis platform using AI to transform audio into transcription then into structured data. High-precision transcription via Whisper (~2 hours of processing per 1 hour of audio) and analysis with ChatGPT and precise prompts, all in a modern React interface. Personal project having processed 20% of the Floodcast catalog and 10% of the TFTC podcast.

  • Multi-engine transcription: local Whisper (GPU/CPU) + OpenAI API with automatic chunking of large files
  • Anti-hallucination system: Whisper error detection/correction (-55% API calls)
  • AI metadata extraction: guests, topics, key moments with precise timestamps
  • React 18 + TypeScript mobile-first interface with Fuse.js real-time fuzzy search
  • Automatic CUDA GPU acceleration (8-15x faster on RTX)
  • Integrated Spotify widget with timestamp-synchronized playback
  • Advanced CLI: 25+ commands with batch mode for bulk processing
  • Clean Architecture: decoupled services, factory pattern, dependency injection
Project 06

NDI Video Automation System — Real-time visual detection and OBS Studio control

In development

Automate a live stream control room in real time: the video itself triggers OBS scene changes.

  • Visual detection at 100 msA CUDA-accelerated OpenCV pipeline spots patterns in configurable zones and drives OBS over WebSocket, hands-free.
  • Drag-and-drop zonesThe operator draws detection zones and maps them to OBS actions right in the UI, without touching the code.
PythonPySide6 (Qt)OpenCVNDI SDKOBS WebSocketCUDA
How it works

Live video production automation application for personal streaming (Call of Duty, TikTok). Real-time visual pattern detection on NDI stream with OBS Studio automation (100ms latency). PySide6 interface with OpenCV image processing + CUDA GPU acceleration for optimal performance.

  • High-performance NDI video stream capture over IP network
  • Real-time visual pattern detection with OpenCV (CUDA-accelerated)
  • Complete OBS Studio automation (scene changes, source control)
  • Advanced GUI with real-time preview
  • Customizable detection zones system via drag-and-drop
  • CUDA GPU support for high-performance image processing
Project 07

Autonomous Minecraft bot — learning how to give an LLM rules and context

Sandbox

By having an LLM play Minecraft for fun, I figured out how to give it rules and the right context — the foundation I reused in Aidventures and in how I develop with Claude Code.

  • LLM = brain, bot = mute armThe bot only runs atomic actions and decides nothing; all strategy lives in the LLM. No hidden decision logic in the code.
  • Sensors, not ordersOn every block broken, raw context is returned — new blocks, water, void, hazards — and the LLM reasons over that data instead of fixed instructions.
  • Quality comes from the rulesDigging stairs, mining a vein without losing drops: the outcome depends entirely on how well the rules are framed for the model.
Node.jsMineflayerMCP (Model Context Protocol)Claude (Anthropic)SQLiteJavaScript
How it works

Autonomous Minecraft bot driven by an LLM through the Model Context Protocol (MCP). A deliberately strict "atomic" architecture: the Mineflayer bot is only an executing arm (unit actions, no decisions), while the LLM reasons over raw data surfaced by sensors (discovered blocks, hazards, inventory, Y-levels) to decide what to mine, build or flee. Three MCP servers separate actions, Minecraft knowledge (recipes, Y-levels, tools) and a persistent spatial memory in SQLite. A learning project that taught me, through play, how to frame explicit rules and provide the right context to an LLM — a skill directly reused in the Aidventures drift gate and in the way I scope Claude Code-assisted development.

  • Atomic architecture: the bot runs unit actions (dig, place, equip) and makes no decisions — all reasoning is delegated to the LLM
  • Sensors returning raw data (surrounding blocks, water/void, hazards, optimal Y-levels, inventory) instead of orders, so the LLM reasons over the real context
  • Three separate MCP servers: actions, Minecraft knowledge (recipes, Y-levels, tools) and persistent spatial memory in SQLite (known staircases, houses and veins)
  • Explicit gameplay rules (vein mining order, scaffolding technique to avoid trapping yourself) showing that output quality depends on the quality of the rules given
  • Parallel agents (perception, safety, reasoning) that collect and analyse world state before each action