Selected Work
Production systems I designed and led — the decisions, the trade-offs, and what I’d do differently.
Module Federation micro-frontends
Split a single web-component SPA serving two product lines into three independently deployed applications — a shell plus two product remotes — without duplicating the framework runtime a shared custom-element library depends on. Federation emits real ES modules, so remotes load through the browser's own `import()`, and routes moved into their owning remote one content type at a time.
- Role
- Lead engineer — architecture owner
- Scope
- One shell host plus two product remotes, each deployed on its own cadence · two generated federation containers publishing ~280 shared modules and ~185 design-system elements · one import map resolving the framework runtime for all three builds
Design system runtime integration
Moved 106 design-system packages and the framework runtime out of three application bundles and onto a CDN, resolved by the browser from a single import map. Webpack externals are derived from that map's keys, so a specifier that ships without a resolution rule is unrepresentable — and a design-system upgrade becomes a version bump in one JSON file rather than a rebuild of three apps.
- Role
- Lead engineer — designed and built the dependency-resolution layer
- Scope
- 177 bare specifiers in one map — 106 design-system packages, the framework runtime and its directives, and the federation entry points — resolved by the browser across three independently deployed applications
Prerendering middleware
Decoupled search visibility from the client-side module graph: an Express middleware recognises bot traffic, renders the URL in a pooled headless Chromium, strips the scripts, and returns finished HTML — on the same origin and the same deploy that serves humans the SPA. The decision it turns on is forcing the legacy shadow-DOM polyfill before any application code evaluates, because a site built entirely from custom elements otherwise serialises to a document of empty tags.
- Role
- Lead engineer — design, implementation, rollout across sites
- Scope
- One versioned middleware package consumed by several public sites · ~30 crawler user-agents, two interchangeable cache backends, ~40 short-circuited asset extensions
Trie-based search engine
Built the bilingual full-text search behind three public sites as one Node service with a hand-built character trie in process memory — no search cluster, no network hop on the query path. A prefix trie is the crude stemmer an agglutinative language wants, and read-time transliteration means a Georgian word typed phonetically on a Latin keyboard resolves to the same documents as the Georgian one.
- Role
- Lead engineer — designed the service, wrote the first commit, owned it in production
- Scope
- Three independently deployed content channels × two languages — one index per pair, rebuilt daily in-process; the query path never leaves memory and there is no search cluster to operate
LLM-assisted search API
Put an LLM query-understanding layer in front of an existing keyword index rather than replacing it, so questions and typos resolve to indexed terms — plus a grounded answer card generated only from the pages the index already returned. Every model call falls back to the raw query, so a provider outage degrades to the original search instead of an error.
- Role
- Lead engineer — sole implementer, backend and frontend
- Scope
- Two endpoints, one shared search component with two consumers, two locales
Polymer to React/TS CMS migration
Migrated a daily-use editorial CMS off a dead framework, running both apps side by side behind one reverse proxy so editors never saw a freeze. The real work was rewriting a schema-driven form engine that generates the entire editing UI at runtime from user-defined content types — including the multi-locale coordination Polymer had solved with DOM traversal.
- Role
- Lead engineer — engine owner
- Scope
- ~11k lines of TypeScript across ~95 modules, replacing a ~10k-line Polymer 3 app · 23 schema-driven field types resolved by 20 components · one deployment serving several sites with per-tenant locale sets
Skills
Languages
Frontend
State & Data
Backend & APIs
Data & Storage
Architecture
AI & LLM
Testing & Quality
Tooling & DevOps
Certifications
Side Projects
Things I built on my own time to dig into a specific problem.

Threads App
Focus: Full-Stack Architecture
Social discussion platform inspired by Reddit, built with Next.js 15, React 19, Prisma, and HeroUI. Users can create threads, post content, and engage through nested comments.

Real-time Editor App
Focus: Real-time Systems
Real-time collaborative text editor built using Node.js, Socket.IO, and Quill.js, with storage in Redis and containerized using Docker for deployment/local development. The app allows multiple users to simultaneously edit the same document with instant synchronization across clients.

Excel App
Focus: Framework Internals & Performance
Excel application created with vanilla JavaScript. Implemented custom web framework from the scratch (with state, routing, eventing, storage, DOM manipulations). Used Tailwind CSS for styling.

Search App
Focus: Algorithmic Efficiency
JavaScript search engine built on a Trie (prefix tree) data structure for fast text lookup and autocomplete. Supports instant prefix-based searching, smart suggestions, and relevance-ranked results.
