PROJECTS

Software Engineer

.NET & C#

Two projects on this track. Vela Commerce works through the parts of e-commerce that are actually hard: money that must not lose a cent, stock two shoppers are racing for, and a checkout that gets submitted twice. Stockroom is the classic line-of-business stack — SQL Server, ASP.NET Core MVC, jQuery and Power BI. In both, the rules are enforced by the database, not only by C#.

Back to Projects

Vela Commerce Live

A working ship-chandlery storefront, built to show how I use .NET 10 end to end — domain model, EF Core, Blazor WebAssembly, and a real PostgreSQL database behind it. It is a demo rather than a shop: nothing is charged, and no card is ever asked for.

  • The shop works while the backend is asleep. Browsing, search, filtering and sorting all run in your browser, so the catalogue is instant. Only the cart and checkout talk to the server.
  • The hard cases are settled by the database, not by C#. Fifty shoppers racing for the last five units, a double-clicked checkout, a payment notification that arrives twice — each one handled where it can actually be made safe.
  • Money is whole numbers, never a float. Prices, totals and refunds are integer minor units with a currency attached, and overflow throws rather than silently wrapping.
  • Tested properly. 415 tests, including real PostgreSQL running in containers, all of it on every push — plus a Demo Lab in the shop itself where you can fire those failure cases and watch what happens.
.NET 10 C# 14 Blazor WebAssembly EF Core 10 PostgreSQL 18 xUnit Testcontainers ArchUnitNET GitHub Actions CodeQL

The whole catalog is one static file the browser fetches once — search, sort and category filtering then run in memory, with no API call behind them.

Product page

Product pages render from the same snapshot: per-variant price and SKU, a quantity stepper, and a spec sheet under the fold.

Recorded run

Recorded against the shop actually running: catalog, search, a product page, add to cart, the cart drawer, checkout with an address, then order VELA-PPTNK4G moving Placed → Paid → Packed → Shipped and the page stopping its polling at the terminal state. Real PostgreSQL, real background workers. It plays only when pressed, so the megabyte is not spent on anyone who did not ask for it.

Stockroom Live

A small internal inventory app on the stack a lot of line-of-business software runs on: SQL Server, ASP.NET Core MVC, jQuery and Power BI. Stock across three warehouses: add products, transfer and adjust stock, receive purchase orders — with a Power BI report on top.

  • The rules live in SQL Server. Stock can’t go negative, every ledger entry updates the balances through a trigger, and a transfer or a purchase-order receipt happens completely or not at all — whatever calls the database.
  • The web app can’t go around them. Its database user can read, and can run the app’s four stored procedures, and nothing else. A direct INSERT, UPDATE or DELETE is refused with permission denied.
  • Errors people can act on. When SQL Server refuses a transfer, the page says why — “Insufficient stock at WH-EAST: have 60, need 9999” — under the Quantity field, where jQuery validation shows its own messages.
  • A Power BI report kept as code. A star-schema reporting layer with its own read-only user, 25 DAX measures, and the model and report stored as text in git. Every total was checked against SQL.
.NET 10 C# ASP.NET Core MVC jQuery SQL Server T-SQL Dapper Power BI DAX Azure GitHub Actions

SQL Server refuses a transfer bigger than the stock on hand. The stored procedure’s own message appears under Quantity, and nothing is written.

Power BI report

An Import-mode model over six star-schema views. The cards match SQL exactly: 2,781 units, $220,008 at cost, 7 balances below their reorder point.

Purchase orders

Fill rate counts only orders that were placed, so a draft doesn’t drag it down: 92 of 365 units received, 25.2%.