⋯ 42 unchanged lines
background: var(--paper);
}
section[id] { scroll-margin-top: 5.5rem;
}
body { margin: 0;
background: var(--paper);
⋯ 95 unchanged lines
}
.simple-hero .hero-inner { width: min(100%, 76ch);
width: min(100%, 83rem);
margin: 0 auto;
padding: clamp(3.5rem, 7.8vw, 7rem) clamp(1rem, 4vw, 4.5rem);
}
⋯ 50 unchanged lines
display: inline-block;
}
.proof-strip { display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
margin: clamp(2rem, 4vw, 3.25rem) 0 0;
padding: 0;
border-block: 1px solid var(--line);
list-style: none;
}
.proof-strip li { padding: 1rem clamp(0.8rem, 2vw, 1.5rem);
color: var(--ink-soft);
font-size: 0.95rem;
line-height: 1.4;
}
.proof-strip li:first-child { padding-left: 0;
}
.proof-strip li + li { border-left: 1px solid var(--line);
}
.proof-strip strong { display: block;
color: var(--ink);
font-family: var(--display);
font-size: 1.2rem;
line-height: 1.15;
}
.simple-hero .portfolio-scope { max-width: 78ch;
margin-top: 1rem;
color: var(--ink-soft);
font-size: 0.92rem;
}
.section-shell { width: min(100%, 92rem);
margin: 0 auto;
⋯ 10 unchanged lines
.timeline-heading h2,
.patterns h2,
.ai-assisted h2,
.discovery h2 { margin: 0;
font-family: var(--display);
font-size: clamp(3.5rem, 7vw, 7.5rem);
font-size: clamp(3.25rem, 6vw, 6rem);
font-weight: 600;
letter-spacing: -0.025em;
line-height: 0.9;
⋯ 144 unchanged lines
line-height: 1.48;
}
.case-meta { display: block;
max-width: 60ch;
color: var(--signal-deep);
font-size: 0.88rem;
font-weight: 750;
line-height: 1.4;
}
.case-body { overflow: hidden;
opacity: 0;
⋯ 128 unchanged lines
.case-facts { display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: clamp(1.5rem, 3vw, 3rem);
margin-top: 2rem;
}
⋯ 111 unchanged lines
color: #cec6b9;
}
.pattern-list .case-proof { margin-top: 0.7rem;
color: var(--signal-wash);
font-size: 0.88rem;
font-weight: 700;
}
.case-proof span { color: var(--paper-bright);
}
.ai-assisted { padding-block: clamp(5rem, 10vw, 9rem);
border-bottom: 1px solid var(--line);
background: var(--paper-bright);
}
.ai-assisted .section-shell { display: grid;
grid-template-columns: minmax(16rem, 0.7fr) minmax(0, 1.3fr);
gap: clamp(3rem, 8vw, 9rem);
align-items: start;
}
.ai-assisted header p { max-width: 58ch;
margin: 1.5rem 0 0;
color: var(--ink-soft);
}
.ai-accountability { display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin: 0;
border-block: 1px solid var(--line);
}
.ai-accountability div { padding: 1.5rem clamp(1rem, 2.5vw, 2rem);
}
.ai-accountability div:first-child { padding-left: 0;
}
.ai-accountability div + div { border-left: 1px solid var(--line);
}
.ai-accountability dt { margin-bottom: 0.65rem;
font-family: var(--display);
font-size: 1.2rem;
font-weight: 750;
}
.ai-accountability dd { margin: 0;
color: var(--ink-soft);
font-size: 0.98rem;
}
.discovery { background: var(--signal);
color: var(--ink);
⋯ 103 unchanged lines
@media (max-width: 980px) { .timeline-heading,
.patterns .section-shell,
.ai-assisted .section-shell,
.discovery-intro,
.discovery-output { grid-template-columns: 1fr;
⋯ 17 unchanged lines
.case-facts { grid-template-columns: 1fr 1fr;
}
.case-facts section:last-child { grid-column: 1 / -1;
}
}
@media (max-width: 700px) { section[id] { scroll-margin-top: 8rem;
}
.site-header { grid-template-columns: 1fr;
}
⋯ 6 unchanged lines
justify-content: flex-start;
}
.proof-strip { grid-template-columns: 1fr 1fr;
}
.proof-strip li,
.proof-strip li:first-child { padding: 1rem;
}
.proof-strip li:nth-child(odd) { padding-left: 0;
border-left: 0;
}
.proof-strip li:nth-child(n + 3) { border-top: 1px solid var(--line);
}
.ai-accountability { grid-template-columns: 1fr;
}
.ai-accountability div,
.ai-accountability div:first-child { padding: 1.25rem 0;
}
.ai-accountability div + div { border-top: 1px solid var(--line);
border-left: 0;
}
.discovery-weeks { grid-template-columns: 1fr;
}
⋯ 69 unchanged lines
border-bottom: 0;
}
.case-facts section:last-child { grid-column: auto;
}
.discovery-week,
.discovery-week + .discovery-week { padding: 1.5rem 0 2rem;
⋯ 33 unchanged lines
<header class="site-header">
<a class="wordmark" href="#top" aria-label="Unravel modernization work home">unravel / modernization work</a>
<nav aria-label="Document navigation">
<a href="#patterns">What we learned</a>
<a href="#timeline">Timeline</a>
<a href="#patterns">How we modernize</a>
<a href="#ai-assisted">AI-assisted delivery</a>
<a href="#timeline">Evidence</a>
<a href="#discovery">Three-week discovery</a>
</nav>
</header>
⋯ 7 unchanged lines
<section class="simple-hero reveal" id="top" aria-labelledby="hero-title">
<div class="hero-inner">
<h1 id="hero-title">
<span class="hero-title-main">Changing core systems.</span>
<span class="hero-title-continue">Without stopping the business.</span>
<span class="hero-title-main">Modernize critical systems.</span>
<span class="hero-title-continue">Without betting the business.</span>
</h1>
<p>Eight verified modernization efforts across frontend, cloud, data, SDK, and backend systems. Each case leads with business impact, elapsed duration, and complexity, then explains continuity constraints and execution choices.</p>
<p class="accent-pill" aria-label="Page tone">Focused on judgment before mechanism.</p>
<p>Eight verified efforts show the same operating model: protect continuity, make change reversible, and prove contracts before changing production. In recent work, AI accelerated analysis, implementation, and verification while humans retained architecture, sequencing, and release accountability.</p>
<ul class="proof-strip" data-proof-strip aria-label="Selected portfolio evidence">
<li><strong>Almost $1M</strong>annual infrastructure savings</li>
<li><strong>$80K</strong>annual workflow savings</li>
<li><strong>4-week</strong>AI-assisted backend rebuild</li>
<li><strong>10x growth</strong>supported as accuracy reached 99.99%</li>
</ul>
<p class="portfolio-scope" data-portfolio-scope><strong>Portfolio scope:</strong> This portfolio combines work delivered through Unravel with modernization experience gained in prior operating roles.</p>
</div>
</section>
<section class="patterns" id="patterns" aria-labelledby="patterns-title">
<div class="section-shell">
<header class="reveal">
<p class="kicker">What repeated</p>
<p class="kicker">Operating model</p>
<h2 id="patterns-title">Judgment before machinery.</h2>
</header>
<ol class="pattern-list reveal">
<li><div><h3>Business continuity sets architecture.</h3><p>Zero downtime, customer-paced upgrades, and continuous feature work each demand different modernization shapes.</p></div></li>
<li><div><h3>Parallel paths buy reversibility.</h3><p>Dual databases, coexistence, staged customer cohorts, and versioned opt-in reduce irreversible cutover risk.</p></div></li>
<li><div><h3>Contracts beat source translation.</h3><p>Consumers, wire formats, and data invariants define what must survive. Languages and frameworks are implementation choices.</p></div></li>
<li><div><h3>AI speed needs stronger gates.</h3><p>Four-week delivery was possible because human-defined contracts and live-stack checks could reject machine-speed mistakes.</p></div></li>
<li data-operating-step><div><h3>Bound business risk.</h3><p>Define continuity, customer, revenue, and data constraints before choosing target architecture.</p><p class="case-proof" data-case-proof><span>Proof:</span> AWS continuity, HealthTech checkout, YUI coexistence.</p></div></li>
<li data-operating-step><div><h3>Map contracts and dependencies.</h3><p>Identify consumers, readers, writers, wire formats, and invariants that must survive.</p><p class="case-proof" data-case-proof><span>Proof:</span> Celerity mobile contracts, OneStudyTeam data contracts.</p></div></li>
<li data-operating-step><div><h3>Create reversible paths.</h3><p>Use coexistence, dual operation, staged cohorts, and versioned opt-in instead of one-way cutovers.</p><p class="case-proof" data-case-proof><span>Proof:</span> YugabyteDB dual paths, AWS cohorts, shared SDK opt-in.</p></div></li>
<li data-operating-step><div><h3>Accelerate bounded work with AI.</h3><p>Let AI analyze, implement, and test only after humans define architecture, acceptance gates, and release safety.</p><p class="case-proof" data-case-proof><span>Proof:</span> Celerity and OneStudyTeam.</p></div></li>
</ol>
</div>
</section>
<section class="ai-assisted" id="ai-assisted" aria-labelledby="ai-assisted-title">
<div class="section-shell">
<header class="reveal">
<h2 id="ai-assisted-title">AI changes throughput. Not accountability.</h2>
<p>Recent work uses AI where the modernization boundary is explicit and machine-speed output can be checked against real behavior.</p>
</header>
<dl class="ai-accountability reveal">
<div>
<dt>Humans own</dt>
<dd>Architecture, contracts, sequencing, stakeholder trade-offs, continuity, and release safety.</dd>
</div>
<div>
<dt>AI accelerates</dt>
<dd>Codebase analysis, implementation, synthetic data, property-based tests, and verification work.</dd>
</div>
<div>
<dt>Evidence gates</dt>
<dd>Celerity used 101 client contract assertions and 247 live-stack checks. OneStudyTeam used synthetic data and property-based tests to fuzz data combinations.</dd>
</div>
</dl>
</div>
</section>
<section id="timeline" class="section-shell" aria-labelledby="timeline-title">
<header class="timeline-heading reveal">
<h2 id="timeline-title">The crossings.</h2>
<p>Each entry leads with business impact, elapsed duration, and a complexity rating with reasons. Technical details follow only to explain how value and continuity were protected.</p>
<h2 id="timeline-title">Three cases show speed, business value, and production continuity.</h2>
<p>Start with an AI-assisted backend rebuild, a customer-workflow replacement, and a zero-downtime cloud modernization. Expand the timeline for broader experience across frontend, data, databases, and SDKs.</p>
</header>
<ol class="route-list" id="migration-timeline">
<li class="migration-case reveal" data-case="celerity-java-to-python" data-evidence="confirmed" data-sort="2026.5" data-timeline-priority="true">
<li class="migration-case reveal" data-case="celerity-java-to-python" data-evidence="confirmed" data-sort="2026.5" data-timeline-priority="true" data-proof-role="ai-assisted-speed">
<div class="case-year">2026</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure">
<summary class="case-summary" aria-controls="celerity-java-to-python-details">
<span class="case-title" role="heading" aria-level="3">Celerity<br>Java → Python backend</span>
<span class="case-preview">Returned direct product change control and reduced maintenance surface by 55%.</span>
<span class="case-meta">4 active weeks · High complexity · AI-assisted · Unreleased target</span>
</summary>
<div class="case-body case-content" id="celerity-java-to-python-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>High. Two strict mobile contracts, Kafka compatibility, hidden framework behavior, data and storage invariants, and a compressed finish.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>Java Quarkus monolith to Python FastAPI API, consumer, renderer, and dispatcher.</p></section>
<section><h4>The constraint</h4><p>Live iOS and Android clients defined compatibility, but Python target was unreleased. This was not a live production cutover.</p></section>
<section><h4>The method</h4><ul><li>Extract contracts from mobile clients.</li><li>Verify API, database, and storage behavior against real stack.</li><li>Use 101 client contract assertions and 247 live-stack checks per gate.</li></ul></section>
<section><h4>Why it was hard</h4><p>Replacing a Java Quarkus monolith with four Python FastAPI processes had to preserve live iOS, Android, Kafka, data, and storage contracts. The target remained unreleased, so this was not a production cutover.</p></section>
<section><h4>How risk was controlled</h4><ul><li>Extract contracts from mobile clients.</li><li>Verify API, database, and storage behavior against the real stack.</li><li>Run 101 client contract assertions and 247 live-stack checks at each gate.</li></ul></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>Yes. Claude Code agents did substantial build and verification work; humans defined contracts, gates, and architectural boundaries.</p>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/ajaymadhok/" data-case-reference="ajay-madhok" rel="noopener">Ajay Madhok, CEO, Celerity Studio</a></p>
<a class="deep-dive" data-deep-dive href="https://thing.unravel.tech/kapil/terra-incognita-before-you-migrate" rel="noopener">Read Terra Incognita, the detailed modernization account →</a>
</div>
</details>
</li>
<li class="migration-case reveal" data-case="reify-retool-to-react-and-clojure" data-evidence="confirmed" data-sort="2025.5" data-timeline-priority="true">
<li class="migration-case reveal" data-case="reify-retool-to-react-and-clojure" data-evidence="confirmed" data-sort="2025.5" data-timeline-priority="true" data-proof-role="workflow-value">
<div class="case-year">2025</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure">
<summary class="case-summary" aria-controls="reify-retool-to-react-and-clojure-details">
<span class="case-title" role="heading" aria-level="3">OneStudyTeam<br>Retool → React + Clojure</span>
<span class="case-preview">$80K annual savings, with no downtime, no outage, and no loss of customizations.</span>
<span class="case-meta">Under 3 months · Medium complexity · AI-assisted · Live workflow rollout</span>
</summary>
<div class="case-body case-content" id="reify-retool-to-react-and-clojure-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>Medium. Integrations and data contracts, relational schema with 2,000 columns, production data movement, and multi-team/stakeholder coordination. Warehouse redesign was included for performance under human judgment.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p><a href="https://www.onestudyteam.com/" data-case-reference="onestudyteam">OneStudyTeam</a> used Retool for weekly customer onboarding, updates, customization handoff, and sales/customer-success upselling across teams. The system contained more than 30,000 lines with a large custom workflow surface.</p></section>
<section><h4>The constraint</h4><p>The original developer had left, the system was unmaintained, customizations were frequently lost, and customer NPS dropped. A previous replacement effort exposed a complex database transition and coordination across multiple teams and owners.</p></section>
<section><h4>The method</h4><ul><li>Move one Retool workflow at a time after interviews and boundary definition with users and owners.</li><li>Scope backend, frontend, and data changes together and redesign when needed (including warehouse performance changes).</li><li>Deploy every workflow to test, collect feedback, iterate, then ship to production and retire the old Retool workflow.</li></ul></section>
<section><h4>Why it was hard</h4><p><a href="https://www.onestudyteam.com/" data-case-reference="onestudyteam">OneStudyTeam</a> depended on an unmaintained Retool system with more than 30,000 lines, frequent customization loss, falling customer NPS, a 2,000-column relational schema, and multiple teams and owners.</p></section>
<section><h4>How risk was controlled</h4><ul><li>Define boundaries with users and owners, then move one workflow at a time.</li><li>Scope backend, frontend, data, and warehouse performance together.</li><li>Test, gather feedback, iterate, ship, then retire each old workflow.</li></ul></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>Yes. AI analyzed the 2,000-column relational schema and existing codebase, then generated synthetic data and property-based tests to fuzz data combinations.</p>
<p class="case-judgment"><span>Human judgment</span>2 senior engineers owned workflow sequencing, integration and data-contract boundaries, continuity gates, cross-team decisions, stakeholder alignment, and a warehouse redesign to improve performance.</p>
⋯ 9 unchanged lines
<summary class="case-summary" aria-controls="healthtech-angular-to-react-checkout-details">
<span class="case-title" role="heading" aria-level="3">HealthTech<br>Angular checkout → React</span>
<span class="case-preview">Checkout conversion increased 6 to 8%, and disruption from navigation or payment windows fell 30%.</span>
<span class="case-meta">About 3 months · Medium complexity · AI-assisted · Anonymous client</span>
</summary>
<div class="case-body case-content" id="healthtech-angular-to-react-checkout-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>Medium. Revenue-critical flow, navigation and payment state risk, bounded frontend scope, and one cutover.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>Angular checkout to React, with checkout reliability improvements delivered during modernization.</p></section>
<section><h4>The constraint</h4><p>Protect customer progress and transaction completion through refreshes, back navigation, and payment-window closure.</p></section>
<section><h4>The method</h4><ul><li>Persist early checkout state in local storage.</li><li>Use a reopenable payment popup.</li><li>Release through one controlled cutover.</li></ul></section>
<section><h4>Why it was hard</h4><p>A revenue-critical Angular checkout had to become React without losing customer progress or transaction completion through refreshes, back navigation, or payment-window closure.</p></section>
<section><h4>How risk was controlled</h4><ul><li>Persist early checkout state in local storage.</li><li>Use a reopenable payment popup.</li><li>Release through one controlled cutover.</li></ul></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>Yes.</p>
</div>
⋯ 7 unchanged lines
<summary class="case-summary" aria-controls="helpshift-hadoop-hive-to-spark-redshift-details">
<span class="case-title" role="heading" aria-level="3">Helpshift<br>Hadoop + Hive → Spark + Redshift</span>
<span class="case-preview">Supported 10x platform growth and improved data accuracy from 90% to 99.99% in one year.</span>
<span class="case-meta">About 6 months · High complexity · Human-led delivery · Live data platform</span>
</summary>
<div class="case-body case-content" id="helpshift-hadoop-hive-to-spark-redshift-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>High. 2 billion devices, 1 PB daily ingestion, live accuracy requirements, and a broad warehouse change.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>Hadoop and Hive to Spark and Redshift. Supporting stack included Hudi, PostgreSQL, Arrow, Airflow, and DBT.</p></section>
<section><h4>The constraint</h4><p>Maintain processing continuity and data correctness at petabyte daily scale.</p></section>
<section><h4>The method</h4><p>Modernize processing and warehouse architecture around Spark and Redshift, supported by Hudi, PostgreSQL, Arrow, Airflow, and DBT.</p></section>
<section><h4>Why it was hard</h4><p>Moving Hadoop and Hive to Spark and Redshift had to preserve processing continuity and data correctness across 2 billion devices and 1 PB of daily ingestion.</p></section>
<section><h4>How risk was controlled</h4><p>Stage processing and warehouse changes around Spark and Redshift, with Hudi, PostgreSQL, Arrow, Airflow, and DBT supporting continuity and correctness.</p></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>No.</p>
<p class="case-ai"><span>Delivery model</span>Human-led; no AI-assisted coding.</p>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/akshay-vaidya-908702/" data-case-reference="akshay-vaidya" rel="noopener">Akshay Vaidya, Head of Engineering, Helpshift</a></p>
</div>
</details>
</li>
⋯ 5 unchanged lines
<summary class="case-summary" aria-controls="helpshift-mongodb-to-yugabyte-details">
<span class="case-title" role="heading" aria-level="3">Helpshift<br>MongoDB → YugabyteDB</span>
<span class="case-preview">More consistent data operations, greater scalability, and headroom for future load.</span>
<span class="case-meta">About 6 months · High complexity · Zero downtime · Human-led delivery</span>
</summary>
<div class="case-body case-content" id="helpshift-mongodb-to-yugabyte-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>High. Live 2 TB store, data integrity, dual reads and writes, and a 20-plus phase roadmap.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>MongoDB primary store to YugabyteDB distributed SQL, with supporting service extraction.</p></section>
<section><h4>The constraint</h4><p>Preserve data integrity and customer availability throughout cutover.</p></section>
<section><h4>The method</h4><ul><li>Build staging environment.</li><li>Run both databases through dual reads and writes.</li><li>Move gradually across more than 20 phases.</li></ul></section>
<section><h4>Why it was hard</h4><p>A live 2 TB MongoDB primary store had to move to YugabyteDB distributed SQL, with supporting service extraction, without compromising data integrity or customer availability.</p></section>
<section><h4>How risk was controlled</h4><ul><li>Build a staging environment.</li><li>Run both databases through dual reads and writes.</li><li>Move gradually across more than 20 phases.</li></ul></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>No.</p>
<p class="case-ai"><span>Delivery model</span>Human-led; no AI-assisted coding.</p>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/akshay-vaidya-908702/" data-case-reference="akshay-vaidya" rel="noopener">Akshay Vaidya, Head of Engineering, Helpshift</a></p>
</div>
</details>
</li>
⋯ 5 unchanged lines
<summary class="case-summary" aria-controls="helpshift-native-sdks-to-js-details">
<span class="case-title" role="heading" aria-level="3">Helpshift<br>Native SDKs → shared JS core</span>
<span class="case-preview">Faster SDK delivery, consistent behavior across platforms, and lower duplicated maintenance cost.</span>
<span class="case-meta">4 to 6 months · High complexity · Customer-paced rollout · Human-led delivery</span>
</summary>
<div class="case-body case-content" id="helpshift-native-sdks-to-js-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>High. Multi-platform compatibility, version support, customer-controlled upgrades, and coordinated releases.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>Separate iOS, Android, and Unity or game-engine SDK implementations to a shared JavaScript core.</p></section>
<section><h4>The constraint</h4><p>Keep existing native versions supported while customers choose their upgrade timing.</p></section>
<section><h4>The method</h4><p>Validate shared behavior across all three platform families, then release through versioned opt-in.</p></section>
<section><h4>Why it was hard</h4><p>Separate iOS, Android, and Unity or game-engine SDKs had to converge on a shared JavaScript core while existing native versions remained supported on customer-controlled timelines.</p></section>
<section><h4>How risk was controlled</h4><p>Validate shared behavior across all three platform families, then release through versioned opt-in so customers controlled upgrade timing.</p></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>No.</p>
<p class="case-ai"><span>Delivery model</span>Human-led; no AI-assisted coding.</p>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/akshay-vaidya-908702/" data-case-reference="akshay-vaidya" rel="noopener">Akshay Vaidya, Head of Engineering, Helpshift</a></p>
</div>
</details>
</li>
<li class="migration-case reveal" data-case="helpshift-aws-california-to-virginia" data-evidence="confirmed" data-sort="2021" data-timeline-priority="true">
<li class="migration-case reveal" data-case="helpshift-aws-california-to-virginia" data-evidence="confirmed" data-sort="2021" data-timeline-priority="true" data-proof-role="operational-scale">
<div class="case-year">2021</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure">
<summary class="case-summary" aria-controls="helpshift-aws-california-to-virginia-details">
<span class="case-title" role="heading" aria-level="3">Helpshift<br>AWS California → Virginia</span>
<span class="case-preview">Almost $1M annual infrastructure savings, completed with zero downtime and no data corruption.</span>
<span class="case-meta">9 months · High complexity · Zero downtime · Human-led delivery</span>
</summary>
<div class="case-body case-content" id="helpshift-aws-california-to-virginia-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>High. About 1,000 instances, 120 application services, 60K requests per second, 1 PB of S3 data, 150 TB of Kylin data, and multiple state and traffic strategies.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>AWS Northern California to Northern Virginia, including state, applications, traffic, release, monitoring, and infrastructure baselines.</p></section>
<section><h4>The constraint</h4><p>Move a B2B customer portfolio without interruption, including a long tail and very large customers.</p></section>
<section><h4>The method</h4><ul><li>Map service dependencies, readers, writers, and data entities.</li><li>Establish replicated event and state paths.</li><li>Move traffic by customer cohort, from test domains to top accounts.</li></ul></section>
<section><h4>Why it was hard</h4><p>State, applications, traffic, release, monitoring, and infrastructure baselines had to move between AWS regions for a B2B portfolio spanning a long tail and very large customers.</p></section>
<section><h4>How risk was controlled</h4><ul><li>Map service dependencies, readers, writers, and data entities.</li><li>Establish replicated event and state paths.</li><li>Move traffic by customer cohort, from test domains to top accounts.</li></ul></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>No.</p>
<p class="case-ai"><span>Delivery model</span>Human-led; no AI-assisted coding.</p>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/akshay-vaidya-908702/" data-case-reference="akshay-vaidya" rel="noopener">Akshay Vaidya, Head of Engineering, Helpshift</a></p>
<a class="deep-dive" data-case-deep-dive="aws-virginia" href="https://thing.unravel.tech/unravel/aws-virginia-migration">Read the full AWS modernization deep dive →</a>
</div>
</details>
⋯ 6 unchanged lines
<summary class="case-summary" aria-controls="helpshift-yui-to-react-details">
<span class="case-title" role="heading" aria-level="3">Helpshift<br>YUI → React</span>
<span class="case-preview">Product roadmap never paused while React improved future delivery and stability.</span>
<span class="case-meta">About 2 years · High complexity · Live system · Human-led delivery</span>
</summary>
<div class="case-body case-content" id="helpshift-yui-to-react-details">
<header class="case-header">
⋯ 5 unchanged lines
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>High. Live product, broad UI surface, long coexistence, and uninterrupted feature work.</p>
</div>
<div class="case-facts">
<section><h4>The change</h4><p>YUI frontend to React.</p></section>
<section><h4>The constraint</h4><p>Keep shipping product features throughout modernization.</p></section>
<section><h4>The method</h4><p>Move incrementally by product surface while YUI and React coexist.</p></section>
<section><h4>Why it was hard</h4><p>A broad, live YUI frontend had to become React while product teams continued shipping features without pausing the roadmap.</p></section>
<section><h4>How risk was controlled</h4><p>Move incrementally by product surface while YUI and React coexist, preserving delivery throughout the two-year transition.</p></section>
</div>
<p class="case-ai"><span>AI-assisted?</span>No. Pre-LLM delivery.</p>
<p class="case-ai"><span>Delivery model</span>Human-led; pre-LLM delivery.</p>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/akshay-vaidya-908702/" data-case-reference="akshay-vaidya" rel="noopener">Akshay Vaidya, Head of Engineering, Helpshift</a></p>
</div>
</details>
</li>
⋯ 14 unchanged lines
<p class="kicker">Modernization phase zero</p>
<h2 id="discovery-title">Three weeks to find the right first move.</h2>
</div>
<p>Discovery diagnoses the business problem before recommending architecture. It produces a phase-one decision that stands on evidence, even if another team implements it.</p>
<p>Every case above started by finding what could not break. Discovery maps those constraints, tests the highest-risk seams, and produces an executable phase one before architecture hardens into commitment.</p>
</header>
<div class="discovery-weeks reveal">
⋯ 27 unchanged lines
</div>
<div class="discovery-output reveal">
<h3>One decision: Approve phase one.</h3>
<h3>Decision at week three: Approve phase one.</h3>
<div>
<p><strong>Cadence:</strong> kickoff, two weekly reviews, and final readout.</p>
<p><strong>Team shape:</strong> decided after access call, based on system criticality and evidence access.</p>
<p><strong>Decision package:</strong> known constraints, tested risks, explicit acceptance gates, and an executable phase-one plan.</p>
<p><strong>Sequence:</strong> diagnose correctly, modernize safely, then use AI where verification makes acceleration responsible.</p>
</div>
</div>
⋯ 117 unchanged lines