Console.WriteLine( "xin chào" );
Available for hire
duydang

Turning ideas into software.

1. About Me

I'm an early-career software engineer and a fan of learning through hands-on experience. I build functional apps for web and desktop, occasionally contributing to open-source works that are powering them.

Loading GitHub contributions...
Back-end

I enjoy building back-ends using .NET where performance matters and Node.js for smaller, agile services.

Platforms
.NET
Node.js
Cloudflare Workers
Frameworks
FastEndpoints
ASP.NET (Minimal APIs / MVC)
Elysia.js
Hono.js
Data
SQL (Raw / ORM)
Entity Framework Core
MongoDB
Drizzle ORM
Front-end

I work across both Svelte and React ecosystems, but regardless of the framework, I have an interest in building my components on top of unstyled UI libraries. I love customization!

Platforms
Browser (TS/JS)
Frameworks
Svelte
React
Tailwind CSS
Tooling
Bun/pnpm/npm
Vite
Turborepo
tsdown
tsup
Desktop

I use Avalonia UI for a stable, lightweight, cross-platform, modern desktop app, and Rust for exploring its immature but rapidly growing ecosystem.

Platforms
.NET
Rust
Frameworks
Avalonia UI
Tauri
egui
fltk-rs
Windows Forms
.NET MAUI
Architectures & Patterns
MVVM
Reactive
Vertical Slice
Infrastructure

These days, I like Docker for containerization, Cloudflare for its robust cloud services, and mise/just for development workflow.

Data
PostgreSQL
MariaDB
MongoDB
SQLite
Messaging
NATS.io
SignalR
WebSockets
DevOps
Podman
Docker
Cloudflare
Supabase
Vercel
Tooling
mise
just
Extras

Some knowledge I gained from solving specific and less common problems.

.NET Source Generators
Generated source code to eliminate repetitive boilerplate at compile-time.
.NET Dynamic Expression
Dynamically composed expressions for flexible EF Core queries at runtime.
C/C# Interop (FFI)
Called native C functions from C# via declared bindings.
C/Rust Interop (FFI)
Called native C functions from Rust via bindings generated by `bindgen`.
Functional Programming
Applied FP principles like pipelines, immutability, and errors-as-values for explicit behavior and predictable code.

3. Contact

I'm always open to new opportunities, feedback, or a quick chat.