Blog
Featured

S3, Sharp, and CloudFront: the ReD Sposi media pipeline
Why GridFS wasn't enough for a wedding app gallery, how I structured the upload pipeline with Sharp, and why CloudFront is the quietest but most important part.

Building a Wedding App for My Own Wedding
I'm getting married in August 2026. Instead of a static website, I built a full-stack mobile app for our guests — RSVP, schedule, photo gallery, a betting game, and a chat. Here's what that looked like.

Claude Code: What It's Actually Like to Use It
I was skeptical about AI coding tools. After months of regular use, I have a more honest take than the hype suggests.

Building with InvoiceTronic: Italian E-Invoicing Without the Pain
I built a full accounting system for my sole proprietorship. The hardest part wasn't the accounting logic — it was the SDI. Here's how InvoiceTronic made it manageable.

Barba Studio is Live
After months of building in the margins of everything else, Barba Studio — a booking management app purpose-built for Italian barbershops — is officially launched.

My Go-To Stack: Node.js, React, and React Native
Why I've built every product I've ever shipped on the same four technologies — and why I wouldn't change a thing.
All posts

The Group Chat That Runs During the Wedding
The betting game is asynchronous — answers wait. The chat is live, it runs on the wedding day, and that day I can't be at a laptop. That changes everything.


Sharing Types Across Four Apps
ReD Sposi is a monorepo with Expo, Express, React + Vite, and Next.js. Keeping TypeScript types aligned across all four without a formal shared package is a pragmatic choice with a price.


NativeWind: Tailwind CSS on React Native
I used NativeWind in ReD Sposi from the start. It works, and it lowers the cognitive cost of working across web and mobile. But it's not Tailwind — and conflating them is costly.


Lead Engineer by Day, Indie Developer by Night
I've been doing both in parallel for years. The two modes talk to each other more than it seems — but the context switching has a cost that's invisible from the outside.


The Accounting System I Built for Myself
At some point I stopped adapting to existing accounting software and built my own. Not to sell it, not to show it off — just because nothing that existed actually worked for my case.


Mobile Push Notifications: What You Only Learn by Getting It Wrong
Expo Push Notifications look simple in the docs. In production there are tokens that expire, permissions that don't land, and a fundamental iOS/Android difference you learn the hard way.


The Admin Panel Nobody Sees
Every product I've built has an admin panel. Nobody shows it, it doesn't make it into case studies, it doesn't appear in screenshots. But it's the part that makes everything else possible.


Products With an Expiry Date Baked In
ReD Sposi ends in August. That's not a design bug — it's a feature. Building software with a predetermined end date changes every decision you make along the way.


My Production Server Doesn't Use Containers
ReD Sposi, Barba Studio, Gestionale Molinari: all running on Ubuntu with PM2, no Docker, no orchestration. It's not laziness — it's a deliberate choice that still holds.


Expo Router Changed How I Think About Navigation
I used to configure stacks and tabs in code. Now I create files. It sounds like a syntax detail, but it's a deeper shift in mental model than it appears.


Auth for People You Already Know
Most authentication systems are designed for strangers. ReD Sposi was different: I already knew every single user. What seems like a detail changed every design decision.


Closing the Quarter as an Independent
March 31 isn't just the end of Q1 — it's a fixed appointment with reality. Invoices, tax filings, products: how I do a quarterly review.


A credit LiPE: the XML format field by field
The XML file sent to the Italian tax authority for an all-credit LiPE has some non-obvious quirks: conditional tags, absent fields, and a credit that propagates from module to module.


Anatomy of a LiPE
Italy's periodic VAT settlement form explained field by field: what the VP section contains, how the amount to pay is calculated, and what the structure of the form reveals about the Italian tax system.


Who cries first: the ReD Sposi betting game
How I built the quiz and leaderboard system — a simple state machine, Socket.io for real-time updates, and a few design decisions I didn't expect to find interesting.


Anatomy of a FatturaPA
Italy's electronic invoice XML format reveals more than it seems: bureaucracy encoded in markup, interesting design decisions, and a few quirks worth knowing.


API Design Is UX
The endpoints you expose are a product. The developer calling them is your user. Bad DX compounds in ways that bad UI never does.


Working Without a Designer
Most solo developers try to design everything themselves. The better move is to make as few design decisions as possible — and let a system make the rest.


Naming Things for AI
Good names have always mattered. With AI coding tools, they matter more. An LLM reads your code the way a new engineer would — inferring intent from names, not from runtime behavior.


The Interface Is the Contract
Implementations are cheap to change. Interfaces are not. The most expensive line of code you'll write isn't in the logic — it's in the type signature.


Errors Are Data
The instinct when something goes wrong is to catch it and move on. That instinct is wrong. Errors are information about what your system is actually doing — and ignoring them is how silent failures happen.


Testing Is a Design Problem
Most developers think they have a testing problem. They have a design problem. Untestable code is a symptom — and the fix is rarely about the tests.


The Async Mindset
Most performance problems aren't about making things faster — they're about doing work at the wrong time. The synchronous default is a cognitive trap, and escaping it is mostly a shift in how you think.


Scope Is the Real Product
The feature backlog is a graveyard of good ideas that would have killed the product. The hardest skill in indie dev isn't building — it's deciding what not to build.


Version Your Decisions
Git tells you what changed. It doesn't tell you why you made the call. That missing context is what turns a reasonable decision into a mystery six months later.


Prompting Is Programming
Most people treat prompting as guessing. It's actually an engineering discipline — with the same feedback loops, debugging techniques, and abstraction principles as any other code.


The Cost of Dependencies
Every package you add is a bet that someone else will maintain it longer than you need it. That bet is worth thinking about before you run npm install.


Real-Time Is Harder Than It Looks
WebSockets look simple until production. WebRTC looks simple until you need it to work everywhere. Here's what building Clover and Argan actually taught me.


How I Think About Database Design
Schema design is the hardest part of building software to change later. The way to get it right is to start with your queries, not your entities.


When to Rewrite, When to Refactor
The rewrite conversation is one of the most emotionally loaded in engineering. Here's how to tell which one you actually need.


The Second Version
The first version gets you in the room. The second version is where the real work starts.


Shipping Is a Skill
The difference between engineers who finish things and those who don't isn't talent or motivation. It's a set of habits you can actually learn.


Most Developer Portfolios Are Broken
What hiring managers actually look for, and why most portfolios miss it completely.


IoT Meets Web: What I Learned Moving Between Hardware and Frontend
Working across IoT and web development teaches you things neither world tells you on its own.


MongoDB Without Mongoose
Mongoose is the default choice for MongoDB in Node.js. I stopped using it — here's why the native driver is often the better option.


Building in the Margins
A full-time job, a master's degree, client projects, and two products in production. Here's how that actually works.


Why Expo Changed the Way I Build Mobile Apps
I used to dread mobile development. Expo fixed that — here's exactly how.


Next.js App Router: What I Actually Use After One Year
A practical take on which App Router features earn their place — and which ones I've learned to skip.
