Blog

Featured

S3, Sharp, and CloudFront: the ReD Sposi media pipeline

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.

27 March 2026awss3cloudfrontnode.jssharp
Building a Wedding App for My Own Wedding

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.

25 March 2026react nativeexpoproductpersonal
Claude Code: What It's Actually Like to Use It

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.

8 March 2026aitoolingproductivityengineering
Building with InvoiceTronic: Italian E-Invoicing Without the Pain

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.

3 March 2026invoicetronicfattura elettronicaapiengineering
Barba Studio is Live

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.

1 March 2026barba studioreact nativeproductlaunch
My Go-To Stack: Node.js, React, and React Native

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.

28 February 2026node.jsreactreact nativeelectronengineering

All posts

The Group Chat That Runs During the Wedding

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.

11 April 2026react nativesocket.ionode.jsmongodbred sposi
Sharing Types Across Four Apps

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.

10 April 2026typescriptmonoreporeact nativenode.jsarchitecture
NativeWind: Tailwind CSS on React Native

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.

9 April 2026react nativenativewindtailwindmobilestyling
Lead Engineer by Day, Indie Developer by Night

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.

8 April 2026indie devcareerpersonalhoneyside
The Accounting System I Built for Myself

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.

7 April 2026indie devmerninvoicinghoneysideproduct
Mobile Push Notifications: What You Only Learn by Getting It Wrong

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.

6 April 2026react nativeexpomobilepush notifications
The Admin Panel Nobody Sees

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.

5 April 2026productreactviteinternal toolsindie dev
Products With an Expiry Date Baked In

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.

4 April 2026productdesignred sposipersonal
My Production Server Doesn't Use Containers

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.

3 April 2026devopsdeploypm2indie devproduct
Expo Router Changed How I Think About Navigation

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.

2 April 2026react nativeexpoexpo routermobile
Auth for People You Already Know

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.

1 April 2026react nativeexpoproductauthred sposi
Closing the Quarter as an Independent

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.

31 March 2026indie devtaxespersonalprocess
A credit LiPE: the XML format field by field

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.

30 March 2026vattaxitalyxml
Anatomy of a LiPE

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.

29 March 2026vattaxitalyinvoicing
Who cries first: the ReD Sposi betting game

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.

28 March 2026react nativenode.jssocket.iomongodbproduct
Anatomy of a FatturaPA

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.

26 March 2026fattura elettronicaxmlfatturapaitaly
API Design Is UX

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.

24 March 2026engineeringarchitecturebackendapi
Working Without a Designer

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.

23 March 2026engineeringindie devuifrontend
Naming Things for AI

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.

22 March 2026engineeringaitoolingprocess
The Interface Is the Contract

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.

21 March 2026engineeringarchitecturetypescriptbackend
Errors Are Data

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.

20 March 2026engineeringbackendarchitectureindie dev
Testing Is a Design Problem

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.

19 March 2026engineeringarchitecturetestingindie dev
The Async Mindset

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.

18 March 2026engineeringarchitecturebackendperformance
Scope Is the Real Product

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.

17 March 2026indie devproductengineeringprocess
Version Your Decisions

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.

16 March 2026engineeringarchitectureprocessindie dev
Prompting Is Programming

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.

15 March 2026aiengineeringproductivitytooling
The Cost of Dependencies

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.

14 March 2026engineeringarchitectureindie devjavascript
Real-Time Is Harder Than It Looks

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.

13 March 2026engineeringreal-timewebrtcwebsocketsarchitecture
How I Think About Database Design

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.

12 March 2026engineeringdatabasesmongodbarchitecture
When to Rewrite, When to Refactor

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.

11 March 2026engineeringarchitectureindie dev
The Second Version

The Second Version

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

10 March 2026engineeringindie devproductivitypersonal
Shipping Is a Skill

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.

9 March 2026engineeringproductivityindie devpersonal
Most Developer Portfolios Are Broken

Most Developer Portfolios Are Broken

What hiring managers actually look for, and why most portfolios miss it completely.

7 March 2026careerengineeringhiring
IoT Meets Web: What I Learned Moving Between Hardware and Frontend

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.

6 March 2026iotwebengineeringarchitecture
MongoDB Without Mongoose

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.

5 March 2026mongodbnode.jstypescriptengineering
Building in the Margins

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.

4 March 2026indie devproductivitypersonalhoneyside
Why Expo Changed the Way I Build Mobile Apps

Why Expo Changed the Way I Build Mobile Apps

I used to dread mobile development. Expo fixed that — here's exactly how.

2 March 2026exporeact nativemobileengineering
Next.js App Router: What I Actually Use After One Year

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.

27 February 2026next.jsreactwebengineering