# Gururaj J

Frontend Platform Engineer | Design Systems & Full-Stack

I build web platforms for both humans and AI agents. At IBM I own core Carbon Design System components, and on my own I build full-stack products like KnotCMS.

Five years of TypeScript and React in production, since 2024 on IBM's Carbon Design System, where I own 4 core components end to end and the docs platform that decides whether teams adopt them. Outside work I build and ship full-stack products on Cloudflare, including KnotCMS, a Notion to Framer sync that won 3 paying customers from 20 signups with zero ad spend.

- Site: https://jdotgururaj.dev
- Résumé (PDF): https://jdotgururaj.dev/resume.pdf
- GitHub: https://github.com/Gururajj77
- LinkedIn: https://www.linkedin.com/in/jgururaj/
- Email: jdotgururaj@gmail.com
- Location: Bengaluru, IND · UTC +05:30

## Production footprint: Carbon Design System · IBM

- 100+ product teams ship on components I maintain
- 6 major upgrades · 0 unplanned breaking changes
- 5,000+ developers served
- 190K+ weekly npm downloads
- 4 core components owned end to end

## Featured project: KnotCMS

Solo product · alongside IBM · since Jun 2026

Notion becomes a Framer CMS, kept in sync. Live, with 3 paying customers from 20 signups and zero ad spend. Auth, billing, webhooks and support are all mine.

- **Why it matters:** I have carried a product from idea to invoices, so I understand the cost of the decisions I ask platform teams to make.
- **Traction:** 3 paying customers from 20 signups, all organic through AEO and the Framer marketplace, zero ad spend.
- **Running now:** self-service signup, subscription billing, and a sync that recovers itself when Notion rate-limits.
- **Architecture:** event-driven Workers, D1 for state, KV for sync cursors, queues for retries, OAuth against Notion and Framer.
- **Hard part:** idempotent replay — a webhook can arrive twice, late, or out of order, and the CMS must still converge on one correct tree.

Where it broke: Problem: 7,000 rows → Diagnosis: Workers subrequest fan-out failure → Change: Moved the sync out of the request path → Outcome: Rebuilt the sync pipeline on Queues with batched invocations

- Live product: https://knotcms.com
- Case study: https://jdotgururaj.dev/work/knotcms (markdown: https://jdotgururaj.dev/work/knotcms.md)

Currently shipping: KnotCMS, billing webhooks. Live, shipped Jul 2026. Workers / D1 / Queues.

## Experience

### Frontend developer, IBM India · Carbon Design System

Feb 2024 – present

5,000+ developers · 190K+ weekly npm downloads · 3,400+ implementations · 4 components owned

- **Agent-readable docs:** Built AI-agent support for the Carbon docs: any page is served as markdown through a .md URL suffix or Accept: text/markdown content negotiation. The site's content is also the main data source for the team's MCP search server.
- **Docs search:** Built the docs search frontend end to end: server-rendered and URL-based for SEO and fewer client API calls, with keyword tracking through Amplitude and Segment.
- **Launch safety:** Owned the redirect strategy for the Oct 1 GA cutover. Verified about 400 legacy URLs with Playwright and set up the Cloudflare bulk-redirect workflow from CSV to production, with zero broken redirects at launch.
- **Accessibility:** Automated accessibility statuses for about 100 components, read directly from Playwright output in each Carbon package, removing nearly all manual CMS updates. Added edit restrictions and SSO gating for IBM-only data.
- **CI reliability:** Traced CI failures to a GitHub Actions cache keyed on the whole runner filesystem. Rescoped it to Next.js build inputs, cutting the step from over 2 minutes to under 30 seconds and failing PRs from about 80% to under 10%.

### Project engineer, Wipro · Wells Fargo

Sep 2021 – Feb 2024

5 enterprise apps · WebForms → Angular

## How I work

1. **The API is the product.** A component's props outlive its markup. I design the interface first and defend it in review, because every prop is a promise someone else will hold me to.
2. **A breaking change ships with its migration.** Codemod, lint rule, dual-support window, dated deprecation. If I can't automate the upgrade, the change isn't ready.
3. **Docs are adoption, not decoration.** Nobody adopts what they can't understand alone at 11pm. I measure a component by how few questions it generates.
4. **The flow that technically works can still be broken.** Filtering our side navigation returned the matched page and hid everything beneath it, so anyone searching for a section landed at a dead end. It passed every test. I rebuilt it without waiting for a spec, design adopted it, and our SUPR-Q score went up.

## Toolkit

- Every day (5 years+): TypeScript, React, Lit, Design systems, Storybook, Payload CMS
- Reach for (shipped with): Next.js, Cloudflare Workers, Angular, MongoDB, Playwright, Amplitude, Segment
- UI: TypeScript, React, Lit, Design systems, Storybook
- Product: Next.js, Payload CMS, Angular, REST APIs, MongoDB, Amplitude, Segment
- Testing: Playwright
- Platform: Workers, D1, KV, Queues, OAuth, Webhooks

## Contact

Open to frontend platform, design systems and full-stack product roles.

Bengaluru or remote · UTC +05:30 · 60-day notice · I reply within a day

Email jdotgururaj@gmail.com with the team, the problem you're hiring against, and the level. I reply within a day with a straight yes or no on fit.
