Amit Kanswal

Amit Kanswal·Pune, India·Updated Sep 2026

Amit Kanswal

Senior Software Engineer — Developer Platforms & Developer Experience. I build the tools and systems other engineers build on.

Current role
Senior Software Engineer — Developer Platforms / DevX, Contentstack
Experience
6+ years, all at Contentstack · three promotions
Scale
Platform serving 100,000+ daily active users
Status
Open to senior platform & developer-experience roles

I build the tools other engineers build on.

Contentstack sells the engine behind a website's content — but not the website itself. My job for the last six years has been everything around that engine: the app store where customers find add-ons, the place outside developers go to publish them, the ready-made starter websites, and the toolkit all of it runs on.

It means the people I build for are mostly other engineers — inside the company and at partner companies I'll never meet. That changes the job. A normal feature can be fixed next sprint if it's wrong. A tool that hundreds of developers already built on top of cannot: change it carelessly and you break their work, not just yours. Most of what I've learned is about making things that stay reliable while everything around them keeps moving.

Currently

Senior Software Engineer — Developer Platforms / DevX at Contentstack in Pune, and open to senior platform engineering and developer-experience roles elsewhere.

Six years, measured

Pulled from the systems my team actually worked in — the ticket tracker, the code repository, the engineering wiki. Every figure here traces back to a record rather than to memory.

150+
Repositories worked in
public and private
100,000+
Daily users on the platform
the systems below serve them
5 × 3
Regions × cloud providers
35+ systems made region-aware
1,391
Code changes submitted
1,500+ pieces of work tracked
891
Colleagues' changes reviewed
a large share of them security fixes
563
Bugs owned and fixed
many surfaced by testing I built

Alongside those: 73 design and decision documents written or revised, 14 reference websites and 20+ editor apps built and maintained, and roughly 25 formal production releases assembled and shepherded.

The number I'd point at is the reviews. Reading 891 of other people's changes is not what gets anyone promoted, but it is what a team feels when you leave.

These figures span public and private repositories across six years. A public GitHub profile shows only a fraction of them, because most of this work lived in private company repositories.

Workload by year hover any bar
learning the codebase owning whole areas owning features and their designs setting direction
2026 is a partial year. The drop after 2024 is deliberate, not a slowdown: the work moved from closing tickets to writing the designs that other people's tickets then followed.

What I've built

Six areas, roughly in order of how much they mattered. Each has an optional panel with the technical detail, for anyone who wants it.

Four years · 402 pieces of workThe app store and the developer portal

Two connected products. One is the storefront where customers browse add-ons for their content system and install them. The other is where outside developers go to publish those add-ons — registering an app, setting up its permissions, cutting a version, pushing it live.

Together they decide who can install what, at which version, with which permissions, in which country's data centre. It is the part of the business that lets other companies extend the product, so a mistake here is not a bug in one screen — it is a partner unable to ship.

This was the largest single area of my work, and I stayed with it for four years.

Technical detail
  • Version and release management — release tagging, multiple tags per version, marking a release live, and locking a published app against edits once its release went live
  • Authentication and permissions — multiple OAuth redirect URL support, and surfacing an app's requested permissions to the customer at install time
  • Routing — wrote the design investigations for path aliasing and path rewriting in the app declaration, then implemented both; later wrote the position paper arguing the permissions model and the routing model should be unified rather than diverging
  • Workspace templates — investigation, technical design and the API changes that let a customer provision a pre-populated workspace
  • React 16 → 18 migration of the developer portal
  • Two production incident investigations, including an intermittent regional landing-page failure and a rendering fault affecting private apps

13 seconds → 0.15 secondsMaking it fast

Both products had grown inside one enormous codebase, so any change to either meant rebuilding and re-releasing everything. I was a founding member of the initiative that split them into independently deployable pieces.

The headline result is below. It is worth pressing the button.

Startup time before and after, on the same scale Try it
Beforeone large bundle
13,000 ms
Aftersplit into pieces
150 ms
Both bars run on the same timeline, which is why the second one is barely visible. Sped up 10× by default — the real-speed option is there because waiting the full thirteen seconds makes the point better than the chart does.
Technical detail

Moved onto Webpack Module Federation, giving each surface independent deployment and team-level scalability. The startup improvement came from how shared dependencies are resolved and loaded and from what the host does during initialization — not from code splitting alone.

  • Separate release track for legacy micro-frontends, so the migration never blocked delivery
  • Local development workflow reworked so engineers could run one remote without the whole shell
  • Carried from early architecture discussions through to general availability

Two years as its ownerThe toolkit outside developers build with

Other companies build small apps that live inside Contentstack's content editor — a video picker, a translation panel, a dashboard. For security those apps run walled off from the editor and can't touch it directly. They talk to it through a toolkit, and from 2024 that toolkit was mine to own: the design, the code, the documentation, the releases, and the questions from developers using it.

The interesting constraint is that I could never break anything. Every app already built on it keeps working or partners lose their product. So the work was mostly about adding real capability without disturbing anything already there.

The two largest additions: letting apps securely reach the rest of the platform rather than a short fixed list of actions, and letting them write data back into the editor rather than only read it — delivered in four stages, from simple fields up to whole entries.

Technical detail

A published npm package acting as the integration contract for every third-party app on the platform. Changes to it are effectively public API changes, so backwards compatibility and clear semantics outrank speed.

  • A general-purpose API method — ran as a multi-phase programme across three quarters, letting an app make authenticated calls against the platform's full management API from inside the sandbox, integrating the official management SDK and an HTTP adapter behind it. I ran a structured defect-hunt session against it before release.
  • Write-back across four escalating phases — simple fields, then complex and nested types, then whole entries, then taxonomy values, each with its own validation model. I wrote both the requirements and the technical design, then implemented it.
  • Validation in two layers — synchronous schema enforcement rejects malformed writes outright; slower checks run asynchronously and report back through events, so a rule can never block a keystroke. Failures return field-level error details rather than a rejected blob.
  • Event handling rebuilt, including a performance pass and a root-caused fix for an event-delivery regression
  • A plugin framework letting third-party apps extend the rich-text editor with custom nodes and toolbar actions
  • Automatic regional endpoint resolution, so downstream apps stopped handling it themselves
  • Two customer-originated feature requests taken to roadmap acceptance; a third assessed and closed as not viable, with reasoning

There's a working demonstration of the validation design further down the page.

Seven years · 14 websitesThe starter websites

Contentstack sells the back end of a website without the front end, so customers have to build their own. To save them weeks, the company gave away fourteen ready-made websites — one for each popular way of building them — that a developer could copy, point at their own content, and have running in minutes.

Keeping fourteen websites current for seven years, while every one of those fourteen technologies kept changing underneath, was largely my job. When a new platform capability shipped, getting it into all fourteen and out the door was mine. This fleet holds the single largest concentration of my code changes — more than any other area I worked on.

One of them was accepted into a major framework vendor's own official examples collection, which put it in front of that framework's entire community rather than only customers who already knew where to look.

Technical detail

React, three Next.js rendering variants, Vue, Nuxt 2, Nuxt 3, Angular, Gatsby, Stencil, SvelteKit, Astro, a GraphQL variant, a Java/Spring Boot variant, and a bundled content-plus-code package.

Feature waves carried across the whole fleet:

  • Structured rich-text migration, replacing the legacy field format in every application
  • Live content preview, versions 1 and 2
  • Dynamic page generation — moving from hardcoded routes to routes derived from content
  • Configurable API host and environment handling, the prerequisite for multi-region
  • Full TypeScript conversion of the JavaScript applications
  • On-demand revalidation and static generation for the Next.js variants
  • Sitemaps, security policy files, licence and documentation standardisation

20+ builtThe apps inside the editor

Small, self-contained tools that plug into the content editor and solve one editorial problem each. I built or maintained more than twenty.

The one I'd talk about in an interview is an editorial workflow board: a drag-and-drop board showing every piece of content grouped by where it sits in the approval process, so an editor can see what's in draft, what's in review and what's ready, and move things along directly.

Building it turned out to need a search capability the platform didn't have. Rather than working around it, I added that capability to the shared toolkit and told the rest of the organisation it existed — and other teams went on to use it when they hit the same wall. A requirement for one app became something everyone could build on. That is the version of this job I want more of.

Technical detail
  • The workflow board — 21 items under its epic, a sorting-behaviour design investigation, and the advanced content search capability added to the SDK and documented for other teams
  • An audience targeting plugin migrated from inline to block-level content scope, shipped with a backwards-compatible legacy mode so no existing customer installation broke — my call, communicated to the support organisation before it shipped
  • A structured-content editor for JSON fields, including two production hotfixes
  • A table editor, a colour picker with field-level configuration, a progress bar, a star rating, an image preset picker, a code editor, a highlight tool, a release preview calendar
  • Integrations across video platforms, cloud blob storage and three separate translation vendors
  • Ownership of the shared boilerplate new apps were scaffolded from, plus the design and event inventory for analytics instrumentation across the marketplace apps

Five yearsTesting, and keeping releases safe

Apps that run inside another product's editor are awkward to test: an automated test has to log in, navigate the host product, find the walled-off frame, and only then touch the thing it came to check. No pattern for this existed, so I built one, then rolled it out until every marketplace app had tests standing between it and a bad release.

Alongside that, I was often the person assembling the formal paperwork for a production release — what is shipping, at what version, to which regions, with what evidence — and sequencing the order things went out in. One release bundled twelve interdependent components at different versions.

Technical detail
  • End-to-end Playwright suites across 10+ applications plus the starter fleet, with cross-browser matrices including Safari and client-side error tracking inside the runs
  • Release-gating pipelines running those suites across all five deployment regions
  • Roughly 25 formal change-advisory records authored; dependent pipelines held until the package they relied on was confirmed published
  • Current work: an automated system keeping a central test repository aligned with three upstream product repositories, where each proposed change is scored across five dimensions and thresholds decide whether it lands, opens as a draft for review, or blocks

One rule is written into that design and is not negotiable: when a test fails because it found a real bug, the bug goes to the team that owns the code. The test does not get adjusted to make the pipeline green.

Three yearsThe person things got escalated to

Because I owned the toolkit and much of the app surface, I became the person support and customer success came to when a customer said an app was broken. The work is detective work: take a vague report, reproduce it, and work out whether the fault is ours, the partner's, or the customer's own setup — then fix it or hand it over with a clear explanation.

Most of the time it turned out not to be our fault. Saying so clearly, with evidence, was as much of the job as fixing the ones that were. 269 issues raised and routed to the right team is what that looks like counted up.

Technical detail

Representative diagnoses across retail, media and enterprise software customers:

  • Traced a disabled form control to a cross-origin request failure in the third party's own API, not the platform
  • Established that a rich-text image upload failure reproduced only in one customer's workspace, isolating it from a platform-wide fault, with before-and-after evidence
  • Identified a configuration screen that appeared not to save because an authentication step had not been completed, and documented the expected sequence
  • Assessed a custom-font rendering gap as a genuine product limitation rather than a defect, and converted it into a feature request

Also: 40 security and dependency remediation items across 20+ repositories, one cycle covering eighteen packages in a single repository, and ownership of the security review that gated repositories being made open source.

How I decide

Five things I believe, learned the slow way.

Build the thing everyone needs, not the thing in front of you

Platform work is judged by what other people manage to build on it. Something that still makes sense in three years beats something that perfectly satisfies today's request and quietly blocks the next ten.

Fast checks should block; slow checks should inform

If every check has to finish before anything can happen, you end up with a system that is either unsafe or sluggish — usually both. Separate the two and each can do its job properly.

When a test catches a real bug, the bug moves — not the test

Loosening a test to make the build go green turns a warning into silence, and ships the bug anyway. It is the single easiest way for a team to quietly lose its safety net.

A rewrite that stops everyone else shipping will be abandoned

Big migrations survive by letting the old and new run side by side, so work continues while the change happens underneath. Otherwise the freeze becomes impossible to justify and the migration dies half-finished.

Breaking someone's existing setup is a design failure, not an upgrade

If a change would break what customers already have, it ships with a path that keeps them working — and the people who answer the phones hear about it before the customers do.

Six years, one company, three promotions

  • 2023 → present Senior Software Engineer — Developer Platforms / DevXOwned the developer toolkit; founding member of the micro-frontend rebuild; routing design and position paper Contentstack · Pune
  • 2022 → 2023 Software Engineer IIThe workflow board; built the end-to-end testing approach; co-authored the team's engineering standards Contentstack
  • 2020 → 2022 Application EngineerThe starter website fleet; editor field extensions; first integration designs Contentstack
  • 2019 B.E., Electronics & Telecommunications Mumbai University
  • Runner-up, Contentstack Hackathon — a prototype that was later built into the product.
  • Above & Beyond award, four times — for consistently exceeding expectations and delivering high-impact outcomes.
  • Mentoring and code review — ran internal sessions on performance, TypeScript and testing, and mentored junior engineers throughout.

What I work with

Languages

  • TypeScript
  • JavaScript (ES6+)
  • GraphQL
  • HTML & CSS

Frontend

  • React 16–18
  • Next.js
  • Angular
  • Vue · Nuxt 2 & 3
  • Astro · SvelteKit
  • Gatsby · Stencil
  • Module Federation

Backend

  • Node.js
  • Express.js
  • NestJS
  • REST API design
  • OAuth 2.0

Infrastructure

  • Docker
  • GitHub Actions
  • CI/CD & release gating
  • Vercel · Netlify
  • Multi-cloud regions

Quality

  • Playwright
  • Jest
  • Cross-browser testing
  • Security scanning
  • Code review at scale

Ways of working

  • Technical writing
  • Incident investigation
  • Release management
  • Mentoring
  • MCP tooling

A working piece of it

This one is for engineers, and it is safe to skip.

It is a live, working version of the validation design described above. On the left, a mock third-party app in a genuinely walled-off frame. On the right, the host side that decides what to accept. Press a preset and send it — or edit the data and break it however you like.

  • Send “schema violation” and the fast check rejects it immediately, naming the exact fields at fault. Nothing is saved.
  • Send “valid” and it is accepted and saved, then the slower checks come back clear.
  • Send “soft warnings” and it is saved first, with the warnings arriving afterwards — because a slow rule is not allowed to block someone typing.
Live demo two-layer validation across a real frame boundary Live
the app — untrusted, sandboxed
the host
Fast check — schemaidle
immediate · rejects malformed data before anything is saved
    Slow check — rulesidle
    runs in the background · never blocks the save
      Saved data
      
                    
      messages between the two
      A real sandboxed frame on a null origin, exchanging real postMessage envelopes with this page. The host verifies message source rather than trusting the payload, correlates request and response by envelope id, and reports failures against field paths. The fast-check timings are measured; the slow check is given an 850 ms round trip so the non-blocking behaviour is visible. Nothing leaves your browser.

      Let's talk

      If you're building a platform, a toolkit, or anything where other teams depend on something you own — that's the work I want.

      Set in Newsreader, Public Sans and IBM Plex Mono.