Skip to content
Senior .NET engineer, Kathmanduopen to senior and lead roles

Ejan
Shrestha

I build the .NET backends that insurance and payments in Nepal run on, and keep them running in production. Right now that's a 50-project insurance platform and the portals its customers buy and claim through.

Or write to sthaejan00@gmail.com

Download the portfolio as a book(PDF)
.NET projects
50
services rebuilt on .NET 8
9
HttpClient call sites fixed
397
portal API endpoints
298

Projects

The project book.

Eleven things I've built or run, from the insurance platform I look after at work to my own products.

  1. Chapter 01

    A 50-project insurance platform

    2022 – present / Vendor engineer, then senior engineer in-house

    Problem
    Policy, claims, accounting, reinsurance and reporting services, most on end-of-life .NET, each logging its own way and failing under load.
    What I did
    Built co-insurance accounting and receipts as a vendor engineer. In-house, rebuilt nine services on .NET 8, moved Hangfire to .NET 8, replaced 397 per-call HttpClients with IHttpClientFactory, and put every service on one Serilog and Seq library with correlation IDs.
    Result
    The platform went from zero to thirteen .NET 8 projects without stopping, and outbound HTTP stopped exhausting sockets.

    9

    services rebuilt on .NET 8

    Shape of the system

    Stack

    • .NET Core 2.2 → .NET 8
    • PostgreSQL
    • Hangfire
    • IdentityServer4
    • Serilog + Seq
    • Docker
    • Kubernetes
  2. Chapter 02

    An insurer's online portals

    2024 – present / Main backend author; started the admin console

    Problem
    Customers had to visit a branch to buy, renew or claim, and agents, corporate clients and partners had no way in at all.
    What I did
    Built the API behind the customer, agent, corporate, merchant and admin portals: KYC, 2FA, quotes, purchase, renewals, claims and policy PDFs. eSewa, Khalti and ConnectIPS sit behind one payment interface, a typed client covers 62 core-system endpoints, and partners use a merchant API with HMAC signing and idempotency keys.
    Result
    Customers, agents and partners buy, renew and claim online, and staff run it from one permissioned console.

    298

    endpoints across eight portal APIs, most of them mine

    Shape of the system

    Stack

    • .NET 8
    • PostgreSQL
    • Hangfire
    • SignalR
    • Refit
    • Serilog + Seq
    • Next.js 16
  3. Chapter 03

    Reports that don't slow the platform down

    2022 – present / Backend engineer, then senior engineer

    Problem
    Heavy reports ran on the databases that issue policies, data was split across one database per service, and the busiest tables kept growing.
    What I did
    Generated goAML anti-money-laundering reports from a Postgres function read with Dapper. Joined service databases with views and dblink, partitioned the high-volume tables, kept multi-service writes consistent, and moved big exports to a Hangfire queue that streams to MinIO.
    Result
    Reports and regulator files come out without slowing policy issuance, and large tables stay fast as they grow.

    goAML

    anti-money-laundering reports, generated in Postgres

    Shape of the system

    Stack

    • PostgreSQL
    • Views
    • dblink
    • Partitioning
    • Dapper
    • Hangfire
    • MinIO
  4. Chapter 04

    Keeping the cluster running

    2025 – present / Hands-on on the production servers

    Problem
    The platform runs as dozens of workloads on Kubernetes, and when one misbehaves in production the cause is rarely in the code you're looking at.
    What I did
    Roll out and roll back services, image tags, config maps and secrets. Debug production pods from logs and shells, as when SocketException 98 in the underwriting pod traced back to exhausted ports. Manage ingress, TLS certificates and service routing, and set resources, replicas, probes and persistent volumes.
    Result
    Releases and incidents are handled on the cluster itself, not escalated and waited on.

    98

    SocketException 98, traced from a pod back to the code

    Shape of the system

    Stack

    • Kubernetes
    • kubectl
    • nginx ingress
    • cert-manager
    • Docker
    • Persistent volumes
  5. Chapter 05

    A digital wallet and agent network

    2023 – 2025 / Backend engineer and reviewer, at EKbana

    Problem
    A wallet needed customers, agents and staff on one platform for KYC, transfers, remittance and bill payments, without paying a remittance out twice.
    What I did
    Built agent, branch, customer and KYC modules, OTP, lockouts and PDF and Excel statements. Stopped double payouts with a five-minute claim lock and an auto-unlock job, integrated AML screening, and reviewed and merged teammates' work into qa, uat and live.
    Result
    One API family serves three apps through 238 gRPC calls to the wallet engine, and a remittance can only be paid once.

    2,119

    of my commits on its core API, 165 teammates' merge requests reviewed

    Shape of the system

    Stack

    • .NET 7
    • gRPC
    • PostgreSQL
    • EF Core
    • Hangfire
    • Firebase
    • MinIO
    • Jenkins
  6. Chapter 06

    A partner API I designed for a wallet

    2023 – 2024 / Designed and bootstrapped it; the team built features on it

    Problem
    Payment partners needed to pay out remittances, validate customers and push payments into the wallet without touching the core apps.
    What I did
    Started the service and wrote 94% of its first code: partner auth with IP allow-lists, gRPC to the wallet engine, Dapper reads of the core database, audit logs, permissions and a two-tier per-IP rate limiter. Pay tokens are single-use, expire, and can't be issued twice.
    Result
    Partners integrate through one audited API, and the team added payout, utility and QR features on its structure.

    53

    partner endpoints on the structure I set up

    Shape of the system

    Stack

    • .NET 7 → 8
    • gRPC
    • Dapper
    • PostgreSQL
    • Rate limiting
    • Serilog
    • Docker
  7. Chapter 07

    Accounting data out of QuickBooks

    2024 / Main backend developer, at EKbana

    Problem
    An accounting firm's clients kept their books in QuickBooks Online, and staff rebuilt trial balances and ledgers by hand in spreadsheets.
    What I did
    Built the QuickBooks OAuth connection with encrypted tokens and a scheduled refresh job, imported sixteen kinds of accounting record with bulk inserts, and built the trial balance and general ledger with an accounting-method switch, saved column choices and Excel export.
    Result
    Staff connect a client once and pull ready reports, instead of retyping them.

    16

    kinds of accounting record imported

    Shape of the system

    Stack

    • .NET 8
    • QuickBooks API
    • OAuth 2.0
    • PostgreSQL
    • Hangfire
    • EPPlus
    • Jenkins
  8. Chapter 08

    An insurer's website its team edits in two languages

    2026 / Lead developer: site, CMS and deployment, with a junior developer

    Problem
    Content changes on an insurer's website needed a developer, and Nepali pages lagged behind the English ones.
    What I did
    Built a Next.js site on Strapi 5 in English and Nepali: product pages with lead forms, careers with CV uploads and bulk export, news and insights. Deployed with Docker behind nginx, wrote the incident runbooks, and reviewed the junior developer's work.
    Result
    The marketing team publishes in both languages from one admin, without a developer.

    2

    languages, edited from one admin

    Shape of the system

    Stack

    • Next.js 15
    • React 19
    • Strapi 5
    • PostgreSQL
    • i18n
    • Docker
    • nginx
  9. Chapter 09

    Book a court from your phone

    2025 – 2026 / Lead backend developer, with three contributors

    Problem
    Players booked futsal courts by phone, venues tracked slots by hand, and two people could pay for the same hour.
    What I did
    Built the booking API: slots are held for a limited time while you pay and released by a background job, pending payments expire, and eSewa pays each venue owner directly with the venue's own credentials. Added recurring bookings, pricing rules, wallets, loyalty points, teams, tournaments, organiser sign-up with OTP and Google sign-in.
    Result
    One API serves the player app, the web app and the venue owners, and a slot can't be sold twice.

    237

    endpoints across 18 booking modules

    Shape of the system

    Stack

    • .NET 8
    • PostgreSQL
    • Hangfire
    • MinIO
    • eSewa
    • Next.js 16
  10. Chapter 10

    A pharmacy system built for Nepal

    2025 – 2026 / Solo, on the open-source fullstackhero kit, paired with AI

    Problem
    Nepali pharmacies juggle stock, VAT, tax deductions and IRD paperwork across separate tools.
    What I did
    Added thirteen modules to a .NET 10 modular monolith, from accounting and inventory to payroll and prescriptions: IRD CBMS e-billing and VAT returns, TDS and SSF payroll, Fonepay QR, weighted-average batch costing, a narcotics register and Nepali invoices.
    Result
    One multi-tenant system covers a pharmacy from purchase to tax return, backed by a large test suite.

    1,900

    tests in the modules I wrote

    Shape of the system

    Stack

    • .NET 10
    • Modular monolith
    • PostgreSQL
    • Redis
    • Next.js 16
    • React 19
    • Aspire
  11. Chapter 11

    A life and money dashboard my AI can read

    2026 / Solo build

    Problem
    Expenses, habits, loans and a NEPSE share portfolio lived in separate spreadsheets that nothing could reason over.
    What I did
    Built one dashboard for budgets, habits, journal, health, loans and investments, with candlestick charts, price-history backfill and gold and silver valuation. Added an AI analyst and a daily market brief on the Anthropic SDK, and a read-only MCP server secured with hashed personal tokens so assistants can query the portfolio.
    Result
    I ask an AI assistant about my own money and it answers from live data, read-only.

    MCP

    server, so AI assistants can query my portfolio

    Shape of the system

    Stack

    • Next.js 16
    • React 19
    • Supabase
    • Anthropic SDK
    • MCP
    • Recharts

Swipe to turn the page

Deep dives.

Six problems from the projects above, written the way I'd brief a new engineer. Open one to see what broke, what I changed and what it bought us.

  • 397Insurance platformEnding socket exhaustion across the platformnew HttpClient() call sites retired
    Problem
    Under load, outbound calls failed with address-already-in-use errors, and the underwriting pod's database connections broke with them.
    What I did
    Traced it to new HttpClient() created on every call and left in TIME_WAIT. Replaced 397 call sites in 123 files with IHttpClientFactory named and typed clients, and gave every client the correlation-ID handler.
    Result
    Occurrences went from 414 to 17, all of them intentional or commented out, and the error class left production logs.
  • 1 IDInsurance platformOne trace from gateway to databasefollows a request across every service
    Problem
    Every service carried its own copy of logging code, and the .NET Core 2.2 services logged almost nothing useful.
    What I did
    Moved Serilog, Seq and correlation-ID code into one shared library, built a mirror of it for the 2.2 services with global exception middleware, and put the partner API and IdentityServer on it.
    Result
    Every response carries an X-Correlation-ID, one ID follows a request end to end in Seq, and errors return a safe body instead of internals.
  • 0 → 13Insurance platformFrom end-of-life .NET to .NET 8.NET 8 projects in the platform
    Problem
    When I joined in-house, 36 of the platform's 37 projects ran on .NET Core 2.2, 3.1 or 5, all out of support.
    What I did
    Built new .NET 8 versions of nine services, among them accounting, claims, reinsurance, CRM and underwriting, moved Hangfire to .NET 8, and started the partner API's move to .NET 10.
    Result
    The platform went from zero to thirteen .NET 8 projects, and accounting, claims and reinsurance features now ship on the new services.
  • 5 minDigital walletPaying a remittance out only onceclaim lock on every remittance payout
    Problem
    Two agents could look up and pay out the same cash-pickup remittance at the same time, and the money would leave twice.
    What I did
    Gave every remittance a five-minute claim: the first agent to track it locks it and others are turned away, a background job releases stale locks, and back-office staff can unlock one by hand. Partner payouts use single-use pay tokens that expire.
    Result
    A remittance can be claimed by one agent at a time and paid out only once.
  • 1×Insurance platformBackground jobs that run oncejob registration at startup, not per request
    Problem
    Recurring jobs were scheduled from request handling, so every request re-registered all of them, and full-year report exports timed out inside the web request.
    What I did
    Moved scheduling into a hosted service that runs once at startup. Built background exports on a dedicated Hangfire queue with concurrency caps, streaming rows to Excel or CSV and storing files in MinIO for seven days.
    Result
    Jobs register once, and large reports finish in the background instead of timing out.
  • 3Online portalsPayments partners can't send twicepayment gateways behind one interface
    Problem
    The portals needed eSewa, Khalti and ConnectIPS, and partners retrying a request could have created the same policy twice.
    What I did
    Put the three gateways behind one payment interface, and gave the merchant API HMAC request signing and idempotency keys stored per partner, method, path and key, with expiry.
    Result
    Adding a gateway doesn't touch purchase code, and a retried partner request returns the first result instead of acting again.

Experience

From first commit to platform owner.

BSc Computer Science and Information Technology
Vedas College, 2017 – 2022

  1. Jan 2025 – presentnow

    Senior Software Engineer

    Himalayan Everest Insurance, Kathmandu, hybrid

    • Own backend reliability and modernisation for an insurance platform of 50 .NET projects on Kubernetes, across policy, claims, accounting, reinsurance and reporting.
    • Rebuilt nine services on .NET 8 and moved Hangfire to .NET 8; replaced 397 per-call HttpClients with IHttpClientFactory to end socket exhaustion.
    • Main backend author of the online portals: 298 endpoints for customers, agents, corporates, merchants and staff, with eSewa, Khalti and ConnectIPS payments.
    • Built one Serilog and Seq logging library with correlation IDs; reporting on PostgreSQL views, dblink and partitioned tables; hands-on with the production Kubernetes cluster.
    • Integrate and review the team's work: about 320 teammates' branches merged from some 13 developers since 2025.
  2. Jul 2022 – Nov 2024

    .NET Developer

    EKbana Solutions, Lalitpur, on-site

    • Vendor engineer on the insurance platform: co-insurance accounting, receipts, trial balance optimisation, and goAML anti-money-laundering reports built in PostgreSQL and read with Dapper.
    • Backend engineer on a digital wallet and agent network (2,119 commits); designed its partner API and stopped double remittance payouts with a claim lock.
    • Reviewed and merged 165 merge requests from seven teammates, and promoted releases through qa, uat and live.
    • Built a QuickBooks Online integration for an accounting firm, and the base API (auth, permissions, Hangfire, audit and request logging, rate limiting) later used for the insurer's portals.
  3. Jan 2022 – Jun 2022

    .NET Developer

    NBIT, Lalitpur

    • Built and maintained .NET Framework applications for client projects.

Anatomy of an incident

The day the ports ran out.

A real production incident on the insurance platform, replayed as the trace I followed. Step through it: what users saw, how I found the cause, and what the fix changed.

POST/api/underwriting/policies

trace 7f3a…c91e

500

2,140ms

  1. ingress POST /policies2,140ms
  2. └underwriting issue policy2,120ms
  3. └http → accounting2,030ms
  4. └postgres open connection52ms
  5. └serilog → seq12ms

Step 1/5

What users saw

Under load, issuing a policy started failing with 500 errors, and every retry made it worse.

Read the deep diveHttpClient, done properly

Timings are illustrative; the chain of failures is the real one.

Journey

From the controller to architecture, and back.

One feature, issuing a policy, written the way engineers write it from their first year to the architect's chair. Pick a stage.

Make it work.

Everything lives in the controller: SQL, business rules, email, all of it. It works on my machine and nobody knows why.

Controllers/PolicyController.cs
[HttpPost("save")]
public IActionResult Save(PolicyDto dto)
{
    var conn = new SqlConnection("Server=prod;User=sa;Password=123");
    conn.Open();
    var sql = "INSERT INTO Policy VALUES ('" + dto.Name + "', " + dto.Premium + ")";
    new SqlCommand(sql, conn).ExecuteNonQuery();

    if (dto.Premium > 100000)
        new SmtpClient("mail").Send("boss@co", "Big policy!", dto.Name, "");

    return Ok("saved"); // works on my machine
}
stage 01/07

Writing

Notes from production.

14 articles on .NET, infrastructure and running a team. Most started as an incident.

Places

Where I've been.

Every place I've lived, worked or travelled to. Mostly the Kathmandu valley so far, so the map has plenty of room.

2 places in 1 country so far

Bookshelf

What's on the shelf.

Books that shaped how I build and run systems. Pull one off the shelf.

2017 / 616 pages

Designing Data-Intensive Applications

Martin Kleppmann

Why it's here

Replication, partitioning and consistency, explained from first principles. The trade-offs behind read replicas and an outbox.

Contact

Got a system that needs a steady hand?

Open to senior and lead roles in backend architecture and .NET modernisation, in Kathmandu or remote.

PDF, A4, every project and article in one file

Local time in Kathmandu: KTM, UTC+5:45

ejan@kathmandu: ~

➜ ~ whoami

Ejan Shrestha, Senior Software Engineer, Kathmandu, Nepal

➜ ~ contact --email

➜ ~

Ejan Shresthaइजन श्रेष्ठ

Senior Software Engineer, backend and .NET modernisation

Senior software engineer in Kathmandu with 4+ years shipping .NET for insurance, payments and enterprise. I look after an insurance platform of 50 .NET projects on Kubernetes: I rebuilt nine of its services on .NET 8, ended socket exhaustion across 397 HttpClient call sites, and wrote most of the API behind its customer, agent, partner and admin portals. Before that I built a digital wallet's agent platform and designed its partner API.

Selected impact

  • 397Ending socket exhaustion across the platform. Occurrences went from 414 to 17, all of them intentional or commented out, and the error class left production logs.
  • 1 IDOne trace from gateway to database. Every response carries an X-Correlation-ID, one ID follows a request end to end in Seq, and errors return a safe body instead of internals.
  • 0 → 13From end-of-life .NET to .NET 8. The platform went from zero to thirteen .NET 8 projects, and accounting, claims and reinsurance features now ship on the new services.
  • 5 minPaying a remittance out only once. A remittance can be claimed by one agent at a time and paid out only once.
  • 1×Background jobs that run once. Jobs register once, and large reports finish in the background instead of timing out.
  • 3Payments partners can't send twice. Adding a gateway doesn't touch purchase code, and a retried partner request returns the first result instead of acting again.

Experience

  1. Senior Software Engineer, Himalayan Everest Insurance

    Jan 2025 – present

    Kathmandu, hybrid

    • Own backend reliability and modernisation for an insurance platform of 50 .NET projects on Kubernetes, across policy, claims, accounting, reinsurance and reporting.
    • Rebuilt nine services on .NET 8 and moved Hangfire to .NET 8; replaced 397 per-call HttpClients with IHttpClientFactory to end socket exhaustion.
    • Main backend author of the online portals: 298 endpoints for customers, agents, corporates, merchants and staff, with eSewa, Khalti and ConnectIPS payments.
    • Built one Serilog and Seq logging library with correlation IDs; reporting on PostgreSQL views, dblink and partitioned tables; hands-on with the production Kubernetes cluster.
    • Integrate and review the team's work: about 320 teammates' branches merged from some 13 developers since 2025.
  2. .NET Developer, EKbana Solutions

    Jul 2022 – Nov 2024

    Lalitpur, on-site

    • Vendor engineer on the insurance platform: co-insurance accounting, receipts, trial balance optimisation, and goAML anti-money-laundering reports built in PostgreSQL and read with Dapper.
    • Backend engineer on a digital wallet and agent network (2,119 commits); designed its partner API and stopped double remittance payouts with a claim lock.
    • Reviewed and merged 165 merge requests from seven teammates, and promoted releases through qa, uat and live.
    • Built a QuickBooks Online integration for an accounting firm, and the base API (auth, permissions, Hangfire, audit and request logging, rate limiting) later used for the insurer's portals.
  3. .NET Developer, NBIT

    Jan 2022 – Jun 2022

    Lalitpur

    • Built and maintained .NET Framework applications for client projects.