Now hiring meSeven services standing30+ screens shippedRabbitMQ hummingZero downtime since last TuesdayCoffee consumed: 1,284 cupsOpen to relocateReferences availableNow hiring meSeven services standing30+ screens shippedRabbitMQ hummingZero downtime since last TuesdayCoffee consumed: 1,284 cupsOpen to relocateReferences available
Vol. I · No. 04
Thursday, 15 May 2026
The portfolio edition
The Stack.

“All the code that’s fit to ship.”

Issue Price · Free*
Circulation: One reader
*Hiring me costs more
Sections within →Filed: 15·V·2026
Lead Story · Engineering desk · 4 min read

A full-stack app,
builtfrom scratch.

By Hank Karpinen · Filed from localhost

View the workExplore the modulesTry the demo

It started because microservices articles always handwave the boundaries. Six services, six Postgres databases, one Compose file. Within a week you find out which of your choices were lazy. Some were mine. I rewrote the Household service twice.

“Identity, Household, Finance, Forum, Notifications. Six services. One frontend that ties them together.”

.NET 8 on the back, Next.js on the front, Postgres for storage, RabbitMQ for the bus, Nginx in front. No Auth0 — I wanted to know what JWT rotation actually looked like.

The figures, at a glance →
07Modules shipped
30+Screens designed
07Services standing
100%TypeScript frontend
№ 01

Dispatches from the architecture

Continued on this page · Filed by engineering

Dispatch 01 — Topology

Five services, five Postgres databases, one Compose file.

Each service can deploy without touching the others. The cost is repetition. Every service has its own auth middleware to wire up, and I wired up every one of them. The win shows up on the third week, when one team can break their service and the rest stay green.

ASP.NET Core Docker Nginx

Dispatch 02 — Messaging

Services publish events. They don’t call each other.

Domain events on RabbitMQ via MassTransit. Bills emits bill.split.created and walks away. Notifications picks it up and pushes an SSE down to whoever's looking. The first version retried forever on bad payloads and ate a weekend. The second has a poison queue.

RabbitMQ MassTransit SSE

Dispatch 03 — Security

Auth, written by hand. On purpose.

JWT with refresh-token rotation, TOTP 2FA, RBAC, mod permissions per community. No Auth0, no Clerk, no IdentityServer. I wanted to know what every header meant. It took longer than buying would have. I learned more than I would have, too.

JWT TOTP 2FA RBAC
№ 02

The modules, in brief.

Tap to open the live screens

№ 03

The stack, set in type.

Twelve tools. One app. Each chosen for a reason — none for fashion.

.NET 8Service runtime
ASP.NET CoreHTTP & APIs
EF CoreORM
PostgreSQLSource of truth
RabbitMQEvent bus
MassTransitMessaging layer
Next.js 14Frontend app
TypeScriptStrict mode
React QueryServer state
Tailwind CSSStyling
Docker ComposeOrchestration
NginxReverse proxy

Wanted

Full-Stack Roles

Apply within
References on file
Reward: gainful employment

Let’s work together.

Currently open to full-stack engineering roles — remote, hybrid, or on-site for the right team. Senior or staff. I write the database migrations, the auth flows, and the marketing site.

BasedPullman, WA · open to relocate
Reply by postTour the work
Colophon

Set in Instrument Serif for display and JetBrains Mono for body copy. Printed on the web at 96 DPI. No models were prompted in the making of this page.

Departments
Front PageArchitecture DeskModule ClassifiedsThe StackWant Ads
Contact the editor
hank@thestack.devgithub.com/hkarpinenlinkedin.com/in/hank-karpinen
— 30 —