Oct 2, 2026· 15 min read ·292 views

Built an App for My Own Flat. Then 68 People Started Using It

Real admin screenshots from two live sites: who uses them, when, and on which device. Plus the two paisa that quietly break most bill-splitting apps, how a whole month settles in just 5 payments, and a 75-lesson course you can unlock with one word.

product-engineeringread-user-analysis

Note: This is the first post in a series about the sites I actually run in production: Bachelor Point , Team Sober , Mila Mart and Love . No toy demos here. These are real users, r…

Sep 26, 2026· 29 min read ·424 views

Logging and Observability

One request, one correlation id, every step on record.** PayNexa writes structured logs with Serilog from every service. Each log goes to three places at once: the console, a rolling JSON file, and Seq, a searchable log server running in Docker. OpenTelemetry traces go to Seq as well. Every line from the first byte of a request to the last Kafka message it causes carries the same `CorrelationId`: HTTP, validation, SQL Server, MongoDB, Redis, the outbox, Kafka and calls to other services. Personal data and secrets are masked before anything is written. This document uses the **Customer API** as the worked example. Every other PayNexa service gets the same behavior from the shared building blocks with no extra code.

SerilogSeqOpenTelemetryPII maskingKafkaLifecycle logging

Contents 0. Github Open Source 1. The big picture 2. Where Serilog runs and where logs go 3. Prerequisites 4. Startup: how logging is switched on 5. The HTTP pipeline: what wraps e…

Aug 14, 2026· 2 min read ·92 views

Docker Compose Cheatsheet

Quick reference for running Bachelor Point's local Docker stack (`docker-compose.yml`) with Docker Desktop — building the image, applying Prisma migrations, and managing the `db`, `migrate` and `app` containers.

dockerpostgresprismamigration

Stack overview All commands below assume your terminal's working directory is the project root (where docker compose.yml lives). Docker Compose reads .env in that same folder autom…

Jul 30, 2026· 12 min read ·115 views

Jenkins Setup — step by step

Wiring the Jenkins server at **<http://16.171.254.209:8080>** so that every push to the `develop` branch automatically builds and deploys to the k3s server at `54.251.180.71`. Written for someone who has not set up a Jenkins pipeline before. Follow the steps in order — each one depends on the one before it.

jenkins

What you are building Three separate machines are involved. Keeping them straight makes the rest much easier: | Machine | Address | Role | | | | | | Jenkins | 16.171.254.209 | Runs…

Jul 30, 2026· 6 min read ·114 views

Email setup — Gmail + Cloudflare Email Routing

How `admin@team-sober.com` sends and receives mail, for free. Without this configured **members cannot self-register**: registration creates the account and issues a password-setup token, but the link never reaches anyone.

mailsmtp

1. How the app decides to send isMailConfigured() in src/lib/mailer.ts is the whole gate: Both SMTP HOST and SMTP FROM must be non empty. If either is missing, sendMail() returns e…

Jul 22, 2026· 4 min read ·142 views

How to Run This NestJS Blog Project in Docker: Building the Image, Starting the Container, and Opening It

A step-by-step guide for students new to Docker — three commands take you from source code to a running blog at localhost:3000, with an explanation of what each one does.

Goal Run this blog on your own machine inside a Docker container, without installing Node.js. Everything the project needs — Node 20, the dependencies, the compiled code — is built…

Jul 22, 2026· 16 min read ·146 views

A step-by-step guide to the CI/CD journey: understand each component's role, trace a commit from development to production, and see a real Jenkins pipeline in action

Part 1 — The Roles: Who Does What People often blur these three together. They are separate concerns: | Piece | What it actually is | Responsibility | | CI/CD | A practice / method…

Jul 22, 2026· 3 min read ·118 views

Ensuring the Same Configuration Across Development, QA, and Production

One of the biggest deployment challenges is making sure the application behaves consistently across all environments while allowing environment-specific settings (like connection strings and API keys).

1. Keep Configuration Outside the Code (12 Factor App) Never hardcode environment specific values. Bad Good Store values in configuration files, environment variables, or a secret…

Jul 21, 2026· 3 min read ·136 views

ORM (Object-Relational Mapping) in ASP.NET Core

ORM (Object-Relational Mapping) is a technique that enables developers to interact with a relational database using programming language objects instead of writing raw SQL queries. It maps database tables to classes, rows to objects, and columns to properties, simplifying data access and improving productivity, maintainability, and code readability. In ASP.NET Core, **Entity Framework Core (EF Core)** is the most commonly used ORM.

ORMLINQASP.NET Core

What is ORM? ORM (Object Relational Mapping) is a technique that allows developers to work with a database using C objects instead of writing raw SQL queries. It maps: 1. Database…

Jul 10, 2026· 2 min read ·109 views

Idempotency keys, or how to make retries safe

The network failed after the charge but before the response — now what

Key takeaways
  • A timeout tells you nothing about whether the work happened.
  • Idempotency is a property of the endpoint, not of the client.
  • Store the key with the result, not just the key.

A client calls POST /payments . The charge succeeds. The response times out on the way back. The client has no idea whether it worked. If it retries, you might charge twice. If it…

Jul 9, 2026· 2 min read ·114 views

The N+1 query problem, and why your ORM hides it

One query for the list, then one more per row, forever

Key takeaways
  • Loop bodies that touch the database are the smell.
  • Log your SQL in development — the count is the tell.
  • Fix it by fetching related rows in one query, not by caching the symptom.

You fetch 50 posts. Then, for each one, you read its author. That is 1 + 50 = 51 queries where 2 would do. It looks harmless because each individual query is fast. The problem is t…

Jul 6, 2026· 2 min read ·114 views

The sliding window, four patterns deep

Turning O(n·k) into O(n) by not throwing away work you already did

Key takeaways
  • When windows overlap, do not rebuild them — update them.
  • The inner while loop is still O(n): left only ever moves forward.
  • Contiguous means window; subsequence does not.

Most array problems have an obvious brute force answer: check every window, take the best one. It works, and it is O(n·k). Consecutive windows overlap almost completely. Only one e…