Menu
AboutAbu Dhabi, United Arab Emirates

I build software
from the inside out.

My work spans application development, framework design, language experiments, and the architecture that connects them.

JP
01Story

Difficult systems should still be understandable.

My background is rooted in web application development. Building products pushed me deeper into frameworks, programming-language experiments, frontend systems, and developer-facing APIs.

The recurring question is how much complexity the system can absorb so the developer has less mechanical work without losing clarity.

02What I care about
01

Application engineering

Building maintainable web applications with clear domain boundaries, deliberate data flows, and interfaces that support the work rather than compete with it.

02

Framework design

Exploring how conventions, defaults, tooling, and framework-managed plumbing can make application development more coherent.

03

Developer experience

Treating names, APIs, errors, documentation, and common workflows as parts of the product developers actually use.

04

Systems learning

Using framework, language, and runtime experiments to understand the trade-offs beneath higher-level application abstractions.

03Engineering
01

Clarity before cleverness

Names, boundaries, APIs, and control flow should help a developer form an accurate mental model of the system.

02

Conventions should remove decisions

Good defaults reduce repeated mechanical choices while preserving explicit escape hatches for cases that genuinely differ.

03

Developer experience is a system property

Documentation cannot repair an incoherent API. The architecture itself should make the intended path easy to discover and hard to misuse.

04

Measure before optimizing

Performance work should respond to evidence and constraints. Complexity added for hypothetical speed is still complexity that must be maintained.

04Process

Less ceremony.
More signal.

A process matters when it improves the decisions made inside it.

  1. 01Understand

    Define the problem, constraints, and users before choosing architecture.

  2. 02Simplify

    Remove concepts and mechanical work that do not improve the outcome.

  3. 03Design

    Set clear boundaries, contracts, data flow, and failure behavior.

  4. 04Build

    Implement the smallest coherent version that proves the direction.

  5. 05Verify

    Test behavior, edge cases, assumptions, and developer experience.

  6. 06Refine

    Use implementation evidence to improve the API and architecture.

05Technology
TypeScriptJavaScriptPHPC#RustC++LaravelReactNext.js.NETNode.jsSQLGitGitHubDocker
See the work ↗