hey, i'm adrien
i like to build things. applied ai first: speech, llm apps, models that run on the device. also native apple apps, web products, 3d imaging and typefaces.
available april 2027, looking for a full-time ai engineer role
pinned
minuteopen source
live meeting transcription that knows who's speaking. online, or on your own server.
whisper (groq, whisper.cpp)
A fictional meeting, written for the demo.
Minute transcribes meetings live from the mic and system audio, with no bot in the call. Speaker clustering runs on the machine, calibrated on a real meeting where it went from 28 voices down to 3.
the hard part: Groq's free tier bills each request at least 10 seconds, so one request per sentence drained the hourly quota. Minute now batches sentences and splits them back with Whisper's word timestamps.
source code ↗download ↗2026shippedopen sourcecopy link
eliopen source
a face for your llm: a small robot that listens, answers out loud and moves its lips in time.
piper ttswhispervosk
Hold Space and talk. Eli transcribes with Whisper, streams the question to an LLM and reads the answer sentence by sentence with Piper while the rest is still being written.
the hard part: Lip sync. Mouth shapes come from Piper's phoneme timings, timed to when the sound is actually heard, output latency included, and 50 ms early, since a late mouth shows immediately.
source code ↗download ↗2026shippedopen sourcecopy link
stuff i make/made
texturopen source
feel linen, wood or gravel under your finger, on the mac's trackpad.
0 dependencies

The video is an animation, not a screen recording.
A menu bar app that uses the Force Touch trackpad's motor to put one of six materials under your finger. Grains follow how far the finger travels on the glass, so tracking speed doesn't change the feel.
the hard part: The public API offers three patterns and macOS ignores it for background menu bar apps. So Textur loads the private MultitouchSupport framework at runtime, with waveforms read from its binary.
source code ↗download ↗2026shippedopen sourcecopy link
liveloopopen source
step away, stay on camera.
system extension

The person on the webcam is AI-generated (Google Veo); the other participants are Pexels stock footage.
LiveLoop records a short loop of you and serves it through a virtual camera that Zoom, Meet and Teams see as an ordinary device. Your audio keeps passing through live.
the hard part: On modern macOS a virtual camera is a signed, user-approved CoreMediaIO system extension in its own process. The work is lifecycle, format negotiation and a loop with no visible seam.
source code ↗2026shippedopen sourcecopy link
auraopen source
a native player for your self-hosted music, on iphone, apple watch and carplay.
subsonic api
Captured on Navidrome's demo server, with freely licensed music.
Aura plays the music on your own server, Navidrome or any Subsonic-compatible one. Word-by-word lyrics, the whole library offline, no tracking.
the hard part: Offline. Staying usable when the server is unreachable takes a real synced local model, not an opportunistic cache, and a UI that never lies about what is actually available.
source code ↗website ↗2026shippedopen sourcecopy link
screenhereopen source
⇧⌘3 captures the screen you're looking at, not the main one.
0 dependencies
On a multi-display Mac, when ⇧⌘3 copies to the clipboard, macOS silently keeps only the main display. ScreenHere points it at the display under your cursor, plus text capture and clipboard history.
the hard part: The app takes over macOS symbolic hotkeys 28/29 instead of registering new ones. An ad-hoc signature silently breaks its Screen Recording grant, so a Developer ID certificate is mandatory.
source code ↗2026shippedopen sourcecopy link
hazeopen source
live wallpapers, a matching screensaver, and animated metal gradients.
sparkle
Haze turns videos, GIFs, images and animated Metal gradients into a live wallpaper and a screensaver, driven by one shared rendering core. Gradients are tuned live or picked from dozens of presets.
the hard part: Thermals. Orphaned legacyScreenSaver instances kept rendering after the screensaver stopped; strict visibility and active-display gating means nothing draws when nobody is looking.
source code ↗2026shippedopen sourcecopy link
presbutan rebornopen source
make macos finder behave like windows explorer.
accessibility apici

The video is an animation, not a screen recording; the file names are made up.
Return opens the file instead of renaming it, Delete trashes it, ⇧Delete removes it for good after Finder's confirmation. A maintained successor to the original PresButan, untouched since 2012.
the hard part: Never firing at the wrong moment: telling a Finder selection apart from a rename or a search field, and leaving every other app untouched. A context problem, not a key-capture problem.
source code ↗2026shippedopen sourcecopy link
podfidelityopen source
keep your airpods in high fidelity, even when an app opens the mic.
0 dependenciesci
The menu is redrawn as a vector, not captured.
Classic Bluetooth can't carry high-quality stereo and a mic at once, so when an app opens the AirPods mic, macOS flips the codec to telephone audio. PodFidelity stops that flip automatically.
the hard part: Staying correct from macOS 13 onward with zero dependencies, hooked onto CoreAudio behaviour Apple never documented as an extension point.
source code ↗2026shippedopen sourcecopy link
stazione
a split-flap departure board showing your station's real trains.
macos + iosviaggiatreno
A macOS and iOS app that turns a screen into a split-flap departure board, fed live by ViaggiaTreno (Italy) and the SNCF API (France). Every character runs through its drum before it settles.
the hard part: ViaggiaTreno's API is undocumented and wants the date in the URL path, formatted like a JavaScript Date.toString(). The flap illusion comes from each drum running in order, not the typeface.
2026researchunpublishedcopy link
florinopen source
personal finance with no middleman: real bank sync, data stays yours.
Invented demo accounts, shipped with the app.
Florin is an iPhone app, a Mac app and a self-hosted web app for YNAB-style budgeting and net worth. Bank sync runs over PSD2 across 2,000+ European banks, with no Florin server.
the hard part: Getting the numbers right to the cent. Loan amortisation solves the periodic rate from principal, payment and term so the outstanding balance matches the bank exactly.
source code ↗2026activeopen sourcecopy link
walletcastopen source
lock-screen notifications without an app, through an apple or google wallet card.
apnsgoogle wallet apipglite

The video and diagram are illustrations; no real subscribers.
Customers add a business's Wallet card from a QR code, then its messages land on their lock screen like app notifications. Validated on a real iPhone; the Google path is untested with a real issuer.
the hard part: Wallet alerts only when a card update changes a field's text, so a repeated message shows nothing. Design edits must also bump each subscriber's update timestamp, or Apple sees no change.
source code ↗2026activeopen sourcecopy link
gabbiano
a seagull flight sim over the real rome, without a single api key.
no api key
Esri aerial imagery on the ground, OpenStreetMap buildings in 3D, AWS Terrain Tiles for relief, and a procedural gull that can perch on a roof. On top sits a game with seven landmarks to claim.
the hard part: Through a canvas, colour management shifts a Terrarium tile's red channel by one (±256 m) and the ground sprouts spikes. The fix is createImageBitmap with colorSpaceConversion: 'none'.
2026shippedunpublishedcopy link
vavinopen source
a libre typeface with a tall x-height, derived from eb garamond for reading on screens.
fonttoolsofl3 families, 9 styles
Nine free fonts derived from EB Garamond for reading on screens. The lowercase reaches 0.72 of the cap height instead of 0.62 (+16%), so at the same point size a line reads larger and sets 6% shorter.
the hard part: The hard part was legal: deriving from EB Garamond was free, but the name Mazarine hit a class-9 trademark filing. Every name is now screened on branddb.wipo.int in classes 9, 16 and 42.
source code ↗website ↗2026shippedopen sourcecopy link
icarus
a twelve-track album under the name goldian: ai-generated, then selected, arranged and mastered.
udioableton liveizotope ozone
Twelve tracks, just over 42 minutes, that came out of music generators (Suno, Udio). My work was to sort, cut, arrange and master them, then make the whole thing hold together as an album.
the hard part: The mastering, redone. The first versions of "OUVERTURE" and "BIENVENUE" came out too loud, and on an album a track is judged against the other eleven, not on its own.
2025shippedunpublishedcopy link
sillage
spotting the ships that switch off their transponder near submarine cables.
aissardata fusiongeoint
A GEOINT demonstrator that flags dark ships near submarine cables by checking AIS against SAR detections. Cables are real data; the demo runs on a staged scenario with simulated vessels and SAR detections.
the hard part: A ship missing from AIS may be out of coverage, broken or deliberately silent, and all three look alike. The work is qualifying that gap, not raising an alarm on every hole.
2026researchunpublishedcopy link
tagitopen source
real tags for the music you already have, from the terminal, with no api key.
mutagen
tagit looks each file up on Deezer, Apple and MusicBrainz and fills the fields a library app uses, plus cover, lyrics and ReplayGain. It shows each change before → after and writes nothing without a yes.
the hard part: The same song exists as a single, on an album, on a compilation and in a reissue. Each candidate is scored on title, artist and duration, and among near ties the earliest release wins.
source code ↗2026shippedopen sourcecopy link
how i work
- i start from a concrete irritation, never from an idea.
- i take over what already exists when it's good: several of these are successors to abandoned software.
- i ship local first: no account, no telemetry, and the network only where the job needs it.
- i write the traps down. they're often worth more than the code.
elsewhere