Engineering notes
First-person retrospectives on personal projects and freelance work — RAG, vector databases, DuckDB, neo-brutalist UI, and the occasional opinion.
-
· 6 min read
I deleted my CanActivate classes and my routing got readable
Route guards became plain functions, and the @Injectable ceremony went with them. The CanActivateFn / canMatch / ResolveFn trio, when each one is the right tool, and the redirect pattern that beats returning false.
-
· 5 min read
My route params bind straight to inputs now
withComponentInputBinding() wires path params, query params and resolver data to your component inputs by name. Pair it with signal inputs and the ActivatedRoute subscription disappears entirely.
-
· 7 min read
SignalStore is the first NgRx I'd actually reach for
Classic NgRx asked for actions, reducers, effects and selectors before you'd stored a single value. SignalStore is state as signals, methods that patch it, and rxMethod for the async — composable with custom features, scoped where you want it.
-
· 6 min read
Calibrating a tax simulator against URSSAF's own engine
I built a French freelance-vs-CDI net-income simulator. The hard part wasn't the math — it was proving the math was right. Here's how I used the URSSAF's own engine as an oracle.
-
· 5 min read
@let ended my async-pipe pyramid
Reusing a value in a template used to mean piping it three times or abusing *ngIf 'as' for scope. @let declares a real template variable — reactive, read-only, scoped to where you put it — and the workarounds retire.
-
· 6 min read
Incremental hydration: ship the HTML, hydrate on hover
Full hydration replays your whole app the moment it loads, even the footer nobody scrolls to. Incremental hydration with @defer (hydrate on ...) renders everything on the server but wires up the JavaScript only when each block is about to be used.
-
· 7 min read
effect() is the most misused API in modern Angular
Most signal bugs I see in code review are the same bug: an effect() doing a computed()'s job. The one-line rule that fixes it, the infinite-loop trap, and the rare cases where effect() is actually right.
-
· 7 min read
@defer is the cheapest performance win Angular ever shipped
One template block, and the heavy half of your page leaves the main bundle. Triggers, placeholders, prefetching, the SSR story — and the two mistakes that cancel the win.
-
· 6 min read
inject() and DestroyRef quietly killed my ngOnDestroy boilerplate
Constructor injection, takeUntil subjects, and ngOnDestroy cleanup — three rituals modern Angular DI replaced with inject(), DestroyRef, and takeUntilDestroyed(). What changed, and the injection-context rule you must respect.
-
· 5 min read
The dropdown that wouldn't reset — a linkedSignal story
Every list-with-selection UI has the same bug: the list changes, the selection points at something that's gone. linkedSignal is the primitive that finally fits this shape — derived state the user can still override.
-
· 5 min read
What exactly does track do in @for?
Angular made track mandatory and most of us picked something to make the error go away. Here's what the diffing actually does with it, when $index silently wrecks performance, and a decision rule that takes ten seconds.
-
· 6 min read
Where signals end and RxJS begins
No, signals didn't kill RxJS. They split the work: signals hold state, streams describe events over time. Drawing that line — and crossing it cleanly with toSignal and toObservable — is the actual skill.
-
· 6 min read
My components have no decorators left
input(), model() and output() replaced @Input/@Output in everything I write — but the win isn't cosmetic. Required inputs the compiler enforces, transforms at the boundary, two-way binding that isn't a naming convention.
-
· 5 min read
I stopped guessing when viewChild is ready
static: true or false? ngAfterViewInit or ngOnInit? Signal queries delete the guessing game: viewChild() is a signal, undefined until it isn't, and the reactive graph waits with you.
-
· 6 min read
Your FormGroup was returning any this whole time
Typed reactive forms are years old and half the codebases I open still don't use them properly. The nonNullable trap, why value is Partial, getRawValue() — the four things that make forms actually type-safe.
-
· 6 min read
Auth, retry, logging: three interceptors, zero classes
Functional interceptors turned HTTP middleware into composable functions. The three I install on every project, the ordering rule that isn't optional, and how to skip an interceptor for one request.
-
· 5 min read
Two letters that fixed my LCP: ngSrc
NgOptimizedImage is the rare optimization that argues with you when you use it wrong. Lazy by default, priority for the hero, mandatory dimensions against CLS, and automatic srcset if you tell it where your CDN is.
-
· 6 min read
document is not defined: a survival guide
Turn on SSR and your DOM code starts throwing on the server. afterNextRender is the clean fix — but knowing the four other escape hatches, and which one each situation wants, is what makes SSR boring.
-
· 8 min read
Are we cooked ?
Every software engineer is asking it, usually as a joke, usually not joking. My honest answer: the question splits in two, and only one half is comfortable. On verification, accountability, and the ladder we're burning.
-
· 8 min read
Migration Angular 8 → 17 : retour d'expérience sans downtime
Comment j'ai migré des applications Angular de la v8 à la v17+ en production, sans interruption de service. La stratégie incrémentale, les pièges RxJS/Ivy/standalone, et ce que ça coûte vraiment.
-
· 7 min read
Virtual threads quietly deleted my thread-pool anxiety
Project Loom landed, Spring Boot wired it in with one property, and the thread-pool tuning I used to lose afternoons to mostly evaporated. Here's what actually changed in a real service.
-
· 7 min read
Terraform cured me of clicking around the GCP console
The console is great for looking and terrible for remembering. Moving my GCP infrastructure into Terraform turned 'what did I change last Tuesday' into a diff I can read. Notes from doing it for real.
-
· 6 min read
I reached for MongoDB out of habit. Postgres JSONB was the answer.
I wanted schemaless flexibility for a feature, so my hand went to MongoDB. Then I remembered Postgres has had JSONB for a decade — and I got the flexibility without giving up joins, transactions, or one database.
-
· 7 min read
Angular went zoneless and I'm never going back
Zone.js is finally optional. Zoneless change detection is stable, signals drive the updates, and my Angular apps got faster, smaller, and way easier to debug. Here's what actually changed.
-
· 7 min read
Signal Forms made me like Angular forms again
For years Angular forms meant picking your poison: template-driven or reactive. Signal Forms quietly ended that war. One model signal, a schema for validation, and field state as signals. It's so good.
-
· 6 min read
httpResource deleted half my Angular data-fetching code
resource(), rxResource(), and httpResource() turn async data into signals — value, loading, and error states for free. No subscribe, no unsubscribe, no manual loading booleans. I'm not writing that boilerplate again.
-
· 6 min read
Selectorless Angular: import a component, use it as a tag
No more selector strings, no more imports arrays. You import a component class and write <UserCard /> in the template. It reads like JSX, compiles faster, and kills a whole category of 'why isn't my component rendering' bugs.
-
· 6 min read
full-stack fatigue in the LLM era — the part nobody's saying out loud
Why being a full-stack dev in the LLM era feels weirdly exhausting — not because the work got harder, but because it got faster, flatter, and a little soulless.
-
· 7 min read
How I built aelm.dev: neo-brutalism, react-snap, and a GEO-first stack
A first-person retrospective on shipping a single-page portfolio engineered for AI engines (ChatGPT, Perplexity, Claude) and Google alike — without Next.js or Astro.
-
· 8 min read
Why I picked Ollama + LanceDB + FastAPI for the AI Book Recommender
A small RAG project that runs entirely on a laptop. Notes on choosing local LLMs over OpenAI, embedded vector stores over Qdrant, and shipping in a weekend.
-
· 6 min read
DuckDB for real-time dashboards: lessons from World Data Visualizer
Sub-100 ms queries on multi-million-row aggregates with zero ops overhead. Why DuckDB beat Postgres for a read-heavy market intelligence dashboard.
-
· 7 min read
Building AirAlert: an honest air-quality monitor with an Arduino UNO and three sensors that disagree
BME680, MQ-135, and MH-Z19 do not measure the same thing — and treating them as if they did is how most hobby air-quality projects lie to you. Here is what I actually trust.
-
· 6 min read
Mood Tracker: one slider per day, Supabase RLS, and the discipline of not shipping features
A tracking app that asks you a single 1–10 question. Notes on Supabase Row-Level Security, PWA install prompts, and why streaks are honest tools or engagement bait depending on how you build them.
-
· 6 min read
Boîte à Livre: mapping free neighborhood libraries with Leaflet, OpenStreetMap, and Firebase
A community map of little free libraries in France. Notes on choosing Leaflet over Mapbox, why Firebase Realtime Database still has a niche, and the moderation problem you cannot avoid.
-
· 7 min read
MobiPA: building an inclusive ride-sharing app for a French village, in Flutter
Capstone project for the city council of La Mure: connecting elderly and disabled residents with municipal staff for assisted mobility. Notes on designing for low-tech users, why Flutter, and what 'client work for a town hall' actually looks like.
-
· 6 min read
LogGPX: an Android GPS tracker for ski touring, in Java, before I knew about Kotlin
An Android app I built for ski-touring traces in 2020. Notes on parsing GPX, why GPS altitude is a lie, the battery cost of high-frequency sampling, and what I would build differently five years later.