Khashayar Nourian


Software Engineer | Technical Consultant

Reliable software systems, practical architecture, and AI-enabled applications.

I design and modernize software platforms, improve performance, and help teams ship reliable software without unnecessary complexity.

Selected work

Projects I've built

All projects

PulseDevelopment: Started - Updated

Pulse checks whether a service behaves correctly from different networks, not merely whether one monitor can reach it. A central ASP.NET control plane distributes definitions to deployable agents, which return measurements over HTTP.

HTTP, ping, and TCP checks record latency and failures; the dashboard compares recent results and agent health. SQLite keeps the first deployment simple, while shared contracts keep the server, agents, and Blazor UI aligned.

Read more ...

cowork-serverDevelopment: Started - Updated

cowork-server is a C# API for shared coworking meeting rooms. It checks access, room availability, opening hours, booking windows, duration limits, conflicts, and price snapshots before saving a reservation.

Commands and queries stay separate inside one application and database. The booking lock coordinates competing requests only within one process, so a multi-instance deployment would need another concurrency mechanism.

Read more ...

From the notebook

Latest writing

All posts

CQRS with a separate read store: useful projections, new guaranteesPublished At:

A separate read store lets a query model match its screen or report instead of the write model. It can remove expensive joins and let read traffic scale independently.

The new boundary also creates a synchronization problem. Reads can be stale, projections must recover safely, and the system has to state what a user should expect after a command.

engineering architecture #architecture #cqrs #projections #eventual-consistency #dotnet #csharp

Read more ...

Minimal CQRS: separate code paths, keep one application and one databasePublished At:

Minimal CQRS keeps commands and queries in one deployed application using one database. The paths differ because commands protect state changes while queries return data shaped for a caller.

This retains transactions and immediate reads after a command. It does not provide independent read scaling, denormalized reporting projections, or isolation from a busy write workload.

engineering architecture #architecture #cqrs #cqs #dotnet #csharp

Read more ...

CQS and commands: make the application understand intentPublished At:

A changed DTO can show a new state without naming the action a user asked the application to perform. A command such as `DeactivateInventoryItem` makes the action and required reason visible.

That gives validation, authorization, state rules, and later consequences one place to live. CQS is a small API rule, not a requirement for separate services, databases, or an event bus.

engineering architecture #architecture #cqrs #cqs #dotnet #csharp

Read more ...

When CRUD stops describing the workPublished At:

CRUD is a good fit for simple data changes such as a display name or team setting. It becomes vague when an edited DTO hides the action, rules, permissions, and consequences behind changed fields.

The post traces the move from generic updates to CQS and CQRS. The point is not replacing every update, but naming business actions when the application needs to understand them.

engineering architecture #architecture #cqrs #cqs #dotnet #csharp

Read more ...