<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="A chronological record of Unravel migration work across product, cloud, data, SDK, and backend systems.">
<title>Migration Work (Confidential) | Unravel</title>
<meta name="description" content="A chronological record of Unravel modernization work across product, cloud, data, SDK, and backend systems.">
<title>Modernization Work (Confidential) | Unravel</title>
<style>
:root { --paper: #f4f6f9;
⋯ 247 unchanged lines
align-items: start;
}
.migration-case[hidden] { display: none;
}
.migration-case:last-child { border-bottom: 1px solid var(--line);
}
⋯ 622 unchanged lines
<a class="skip-link" href="#main-content">Skip to main content</a>
<header class="site-header">
<a class="wordmark" href="#top" aria-label="Unravel migration work home">unravel / migration work</a>
<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="#discovery">Three-week discovery</a>
</nav>
</header>
<main id="main-content">
<aside class="confidentiality-notice" data-confidentiality-notice>
<strong>For your eyes only</strong>
<span>Confidential working document. OneStudyTeam has approved public use of its name and reference; supporting operational details remain private. Share only with intended recipients through controlled Thing access.</span>
<strong>Confidential working document.</strong>
<span>Share only with intended recipients.</span>
</aside>
<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>
</h1>
<p>Eight verified migrations 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>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>
</div>
</section>
⋯ 5 unchanged lines
<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 migration shapes.</p></div></li>
<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>
⋯ 11 unchanged lines
<li class="migration-case reveal" data-case="celerity-java-to-python" data-evidence="confirmed" data-sort="2026.5" data-timeline-priority="true">
<div class="case-year">2026</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure" open>
<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>
⋯ 13 unchanged lines
<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>
</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>
<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 migration account →</a>
<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">
<div class="case-year">2025</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure" open>
<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>
</summary>
<div class="case-body case-content" id="reify-retool-to-react-and-clojure-details">
<header class="case-header">
<span class="case-status">B2B healthcare SaaS</span>
</header>
<div class="case-metrics">
<p class="metric" data-field="impact"><span class="metric-label">Business impact</span>$80K saved per year, zero downtime, and no outage with no loss of customizations. Customer UX improved while the migrated stack stayed maintainable by the engineering team.</p>
<p class="metric" data-metric="duration"><span class="metric-label">Duration</span>April through June 2025, under 3 months elapsed. 2 senior engineers focused on AI-assisted migration delivery.</p>
<p class="metric" data-metric="complexity"><span class="metric-label">Complexity</span>Medium. Integrations and data contracts, relational schema with 2,000 columns, data migration, and multi-team/stakeholder coordination. Warehouse redesign was included for performance under human judgment.</p>
<p class="metric" data-field="impact"><span class="metric-label">Business impact</span>$80K saved per year, zero downtime, and no outage with no loss of customizations. Customer UX improved while the modernized stack stayed maintainable by the engineering team.</p>
<p class="metric" data-metric="duration"><span class="metric-label">Duration</span>April through June 2025, under 3 months elapsed. 2 senior engineers focused on AI-assisted modernization delivery.</p>
<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 complex database migration 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 migrated Retool workflow.</li></ul></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>
</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>
<p class="case-source"><span>Reference</span><a href="https://www.linkedin.com/in/radlakha/" data-case-reference="raman-adlakha" rel="noopener">Raman Adlakha, India Head and Director of Engineering, OneStudyTeam</a></p>
</div>
</details>
</li>
<li class="migration-case reveal" data-case="healthtech-angular-to-react-checkout" data-evidence="confirmed" data-sort="2024" data-timeline-priority="true">
<li class="migration-case reveal" data-case="healthtech-angular-to-react-checkout" data-evidence="confirmed" data-sort="2024">
<div class="case-year">2024</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure" open>
<details class="case-disclosure">
<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>
⋯ 8 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 migration.</p></section>
<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>
</div>
⋯ 16 unchanged lines
</header>
<div class="case-metrics">
<p class="metric" data-field="impact"><span class="metric-label">Business impact</span>Supported 10x platform growth, improved data accuracy from 90% to 99.99% in one year, and strengthened resiliency, scalability, and adoption.</p>
<p class="metric" data-metric="duration"><span class="metric-label">Duration</span>About 6 months elapsed. The 1-year accuracy period is an outcome window, not migration duration.</p>
<p class="metric" data-metric="duration"><span class="metric-label">Duration</span>About 6 months elapsed. The 1-year accuracy period is an outcome window, not modernization duration.</p>
<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">
⋯ 63 unchanged lines
<li class="migration-case reveal" data-case="helpshift-aws-california-to-virginia" data-evidence="confirmed" data-sort="2021" data-timeline-priority="true">
<div class="case-year">2021</div>
<div class="case-node" aria-hidden="true"></div>
<details class="case-disclosure" open>
<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>
⋯ 13 unchanged lines
<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>
</div>
<p class="case-ai"><span>AI-assisted?</span>No.</p>
<a class="deep-dive" data-case-deep-dive="aws-virginia" href="https://thing.unravel.tech/unravel/aws-virginia-migration">Read the full AWS migration deep dive →</a>
<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>
</li>
⋯ 17 unchanged lines
</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 migration.</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>
</div>
<p class="case-ai"><span>AI-assisted?</span>No. Pre-LLM delivery.</p>
⋯ 5 unchanged lines
<div class="timeline-controls">
<button class="timeline-toggle" type="button" data-timeline-toggle aria-controls="migration-timeline" aria-expanded="false" hidden>
Show 4 more migrations
Show more modernization efforts
</button>
</div>
</section>
<section class="discovery" id="discovery" aria-labelledby="discovery-title">
<div class="section-shell">
<header class="discovery-intro reveal">
<div>
<p class="kicker">Migration phase zero</p>
<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>
⋯ 34 unchanged lines
<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>Sequence:</strong> diagnose correctly, migrate safely, then use AI where verification makes acceleration responsible.</p>
<p><strong>Sequence:</strong> diagnose correctly, modernize safely, then use AI where verification makes acceleration responsible.</p>
</div>
</div>
</div>
</section>
<footer class="final-note">
<p>Scope note: no architecture is prescribed before diagnosis, and no migration-speed comparison stands without production-state context.</p>
<p>Scope note: no architecture is prescribed before diagnosis, and no modernization-speed comparison stands without production-state context.</p>
</footer>
</main>
⋯ 80 unchanged lines
timelineToggle.setAttribute("aria-expanded", String(willExpand)); timelineToggle.textContent = willExpand
? "Show fewer migrations"
: "Show 4 more migrations";
? "Show fewer modernization efforts"
: "Show more modernization efforts";
animatePriorityShift(positions);
if (willExpand) animateDeferredCases();
});
⋯ 21 unchanged lines