Our articles
Field notes, technical guides and working habits from our team.
Before: a repository hosted in an organization we don't control — 823 issues and pull requests, ~2,300 comments, 160 screenshots, 40 releases.
Nicolas Rouanne

I wanted to fix a label in a generated PDF — replace Heures pleines / Heures creuses with Heures forfaitaires. Five minutes, I figured. It turned into a dive into how PDF fonts actually work, and a good lesson on the difference between « looks right » and « is right ». The script that came out of it fits in one file; the road to get there, much less so.
Nicolas Rouanne
We needed a single video player to play a sequence of short clips back to back — like a playlist, but composed at request time from clips stored separately on Bunny Stream. The naive approach failed. The production-grade approach (double <video> elements) felt heavy. The thing that actually worked was server-side HLS playlist concatenation, with the player doing zero clip-switching logic of its own.
Nicolas Rouanne
I needed to transcribe sensitive recordings — therapy sessions, interviews, conversations that had no business living on OpenAI or Google servers. So, cloud out. A year and a dozen pivots later, the pipeline boils down to five stages, all offline once the models are downloaded.
Nicolas Rouanne
Before: every 3 months, run a script to renew 5 SSL certificates by hand. Copy/paste fullchain and private key into GitHub Actions secrets. Miss the deadline once and production goes down.
Nicolas Rouanne
I use chezmoi to manage my dotfiles across machines, with secrets stored in 1Password. Until recently, everything ran through my personal 1Password account. That worked fine for me alone, but once I started giving AI agents (Claude Code) access to the op CLI, I realized they could see every vault in my account. Not great.
Nicolas Rouanne
Filing the French CII (Crédit d'Impôt Innovation) is a yearly chore. The dossier needs personnel data, time tracking, payroll figures, and a project description detailed enough that a tax inspector won't bounce it.
Nicolas Rouanne

I use Claude Code daily. It's great for writing code, but it has one annoying habit: it sometimes edits my .zshrc and breaks things. Last week it removed an alias I use constantly — cc for claude --worktree. The week before, it messed up my shell config in a different way. Both times, I had to manually fix it.
Nicolas Rouanne
I wanted a blog for the Qraft website, but I didn't want to build a full CMS or manage a database. We already use Notion internally, and it has a solid API. So the idea was simple: write articles in Notion, render them on the site with Next.js, and use Vercel's caching to keep things fast. It took 5 PRs to get there, and the final architecture turned out cleaner than I expected.
Nicolas Rouanne
I wanted to generate a monthly timesheet from Toggl — one that shows, per day, how many half-days I worked for each client. Simple enough on the surface. The tricky part turned out to be the rounding.
Nicolas Rouanne