Software engineering for complex products
I design and build web products, data platforms and AI features
Full-stack, from the database schema to the interface.
How a problem gets solved, step by step
Brief
Records arrive from three systems, each with its own ID. Search shows the same thing three times, and reports disagree.
$ inspect sources. › source a id: integer. › source b id: uuid. › source c id: "B-" + number. › overlap name · date · location. › goal one record, one id
Tools I ship with
web apps
React and Next.js
Product front ends with server rendering
- Tailwind
- shadcn/ui
- Radix
web apps
Svelte and SvelteKit
Lighter, faster interfaces
- Vite
- TypeScript
apis
TypeScript and Node.js
APIs with typed contracts
- Hono
- zod
- OpenAPI 3.1
app data
PostgreSQL and Search
Relational schemas and full-text relevance
- MySQL
- Drizzle
- OpenSearch
- Elasticsearch
- Meilisearch
analytics
ClickHouse and Redis
Live ingestion and analytical storage
- Redis Streams
- Parquet
- S3
systems
Rust and Axum
Deterministic engines and live services
- WebSockets
- WebAssembly
machine learning
Python and PyTorch
Model training, from boosted trees to GNNs
- XGBoost
- LightGBM
- GNNs
- C++
ai
LLM agents and tool calling
Typed tools, retrieval, cost budgets
- Vercel AI SDK
- Mastra
- Qdrant
- pgvector
platforms
WordPress and PHP
Multi-tenant plugins and custom themes
- Elementor
- Shopify
- WP-CLI
delivery
Docker and CI
Releases that are gated and repeatable
- Traefik
- Playwright
- Lighthouse
What I do
Six ways I help teams ship software that holds up
-
[01]
Product engineering
Web products built end to end: architecture, front end, back end and the details in between.
- Next.js, React & SvelteKit apps
- TypeScript across the stack
- Auth, admin tools and dashboards
- Component libraries
“We have a prototype. We need a product people can rely on.”
-
[02]
Data platforms & APIs
Pipelines, schemas and APIs that give a product one reliable source of truth.
- Ingestion & normalization
- PostgreSQL & ClickHouse
- REST APIs with OpenAPI contracts
- Search on OpenSearch & Elasticsearch
“Our data comes from five places and none of them agree.”
-
[03]
AI features & agents
Assistants and agents that work on your real data, with guardrails and a budget.
- Tool-calling agents
- Retrieval over your own data
- Cost, rate and quota controls
- Evaluation before release
“We want an assistant, not a surprise bill.”
-
[04]
Performance & accessibility
Fast, accessible front ends that pass Core Web Vitals and WCAG, and keep passing them.
- Core Web Vitals work
- WCAG 2.2 audits and fixes
- Performance budgets in CI
- Rendering and loading strategy
“Our site is slow and we just failed an accessibility audit.”
-
[05]
WordPress & commerce platforms
Custom plugins, multi-site platforms, CRM integrations and Shopify storefronts that stay maintainable.
- Custom themes & plugin suites
- CRM & API integrations
- Page-builder components
- Shopify stores
“Our platform grew into something nobody wants to touch.”
-
[06]
Retainer & care
Ongoing development, monitoring and upgrades for platforms that can't stand still.
- Monthly development time
- Updates, backups & security
- Monitoring & incident fixes
- Planned upgrades
“We need someone who knows the system, every month.”
Problems I solve
The problems teams bring me in for
Problem
Data from many sources, and no single truth
How I solve it
- Keep every source's raw data first, so nothing is lost and anything can be replayed.
- Normalize into an analytical store, and keep application state in its own database.
- Give every real-world entity one internal identity, and keep source IDs behind the API.
Where I've done it
A football analytics platform I designed and built: live provider data streamed into ClickHouse, PostgreSQL for application state, and one identity for hundreds of thousands of entities.
- TypeScript
- ClickHouse
- PostgreSQL
- Redis Streams
Problem
One codebase that has to serve many clients
How I solve it
- Tenant isolation by design, checked automatically, so one client's data never reaches another.
- Integrations over authenticated, signed REST calls, with a retry queue when a partner is down.
- Signed, reproducible releases, gated by automated checks.
Where I've done it
As lead engineer at a real-estate technology company: one plugin platform that runs many brokerage websites, synced with the company's CRM.
- PHP 8
- TypeScript
- WordPress
- MySQL
Problem
Search and maps that must be fast and exact
How I solve it
- Spatial SQL for bounding-box, polygon and radius queries, backed by the right indexes.
- Full-text relevance and facets in OpenSearch or Elasticsearch, with filters defined once in a single registry.
- Render on the server first, then let a small client runtime take over.
Where I've done it
Map-based property search for many brokerage sites, and typo-tolerant player and team search with a database fallback.
- OpenSearch
- Elasticsearch
- Meilisearch
- MySQL spatial
- PostgreSQL
Problem
AI features that have to stay affordable
How I solve it
- Typed tools the model calls, instead of letting it write queries.
- A budget on every request: steps, tool calls, time and tokens.
- A credit ledger per plan, so usage matches what a user pays for.
Where I've done it
An AI assistant for a football analytics product, built on tool calling with per-request cost budgets.
- TypeScript
- Tool calling
- Redis
Problem
Results you can reproduce and trust
How I solve it
- Deterministic by default: the same inputs give the same output, byte for byte.
- Train and calibrate models on real data, and measure how close they are.
- Statistical tests before a change ships, not impressions.
Where I've done it
A 2D match simulation engine written in Rust, and machine-learning models, from gradient-boosted trees to graph neural networks (GNNs), with reproducible training and evaluation.
- Rust
- Python
- PyTorch
- GNNs
- C++
Problem
Front ends that are slow or hard to use
How I solve it
- Measure first, with Lighthouse, axe and real devices.
- Fix the render path: load on intent, prioritize the largest image, choose a font strategy.
- Build accessible UI primitives once, and keep the checks in CI.
Where I've done it
A performance pipeline and framework-free, accessible UI primitives for a multi-tenant platform, and a website audit tool.
- TypeScript
- Playwright
- Lighthouse
- axe
Problem
A platform that has to be built from nothing
How I solve it
- A custom theme and plugins instead of stacking off-the-shelf add-ons.
- A learning management system shaped around how the business actually sells.
- A retainer afterwards, so the platform keeps moving with the business.
Where I've done it
An online education business: its theme, plugin suite and LMS, built from scratch, plus its Shopify storefronts.
- WordPress
- PHP
- Shopify
Activity
The last twelve months on GitHub
My repositories are private, so this shows counts only, never names or code.
- contributions
- 6,747
- active days
- 256
- longest streak
- 57 days
About
More than a decade building for the web
From designer–developer to full-stack product engineer.
- whoami
- Ugurcan Bulut, software engineer
- cat focus
- web products · data platforms · AI features
- cat started-as
- designer–developer, clients around the world
- cat principles
- own the whole productmake correctness visiblespend where it matters
- cat workflow
- AI coding agents, behind specs and verification gates
How I work
A process that shows its work
- 01
Discovery
The business, the users and the data, before any code.
- 02
Specification
Contracts and acceptance checks, agreed on paper.
- 03
Development
Small, reviewable steps with previews you can click.
- 04
Quality
Tests, accessibility and performance gate every change.
- 05
Launch & care
A monitored release, and a retainer if you want me to stay.