TL;DR
- Context: CTO at a pre-seed startup pivoting from mobile apps to a web-first product under runway pressure
- Problem: A Flutter Web decision introduced structural performance and SEO limits that could not be optimized away
- Intervention: Killed the existing approach and led a web-native rewrite centered on Next.js
- Impact: Reduced TTI to <3s, restored SEO, stabilized deliveryand absorbed a ~6-month opportunity cost
Intro
This work was done as part of my full-time role as CTO during Plutus’s transition from a mobile-first product to a web-first experience. The initial goal was to minimize rewrite cost by reusing the existing Flutter codebase via Flutter Web. While this optimized for short-term velocity, it ignored web-native constraints and created systemic issues that surfaced only after months of investment.
Problem
- The chosen stack imposed hard performance ceilings that optimization could not overcome
- The rendering model blocked SEO and accessibility, limiting growth channels
- Continued iteration compounded sunk cost without a path to acceptable user experience
- The team faced a decision between accepting structural limitations or paying a full rewrite cost
Intervention
- Made the call to abandon the existing stack despite prior investment
- Reframed the rewrite as a leverage reset, not just a performance fix
- Selected a web-native framework optimized for rendering, SEO, and hiring longevity
- Used the rewrite window to harden delivery, deployment, and operational practices
Impact
- Time-to-interactive dropped from double digits to under 3 seconds
- SEO and accessibility became first-class capabilities rather than constraints
- Deployment reliability and iteration speed improved materially
- The team absorbed a ~6-month time cost but regained long-term technical optionality
Why This Matters
Early stack decisions silently tax every feature that follows. When those decisions are wrong, the cost compounds until recovery requires decisive correction. The ability to recognize and kill a flawed direction early is often more valuable than initial velocity.
Technical Deep Dive (Optional)
This section expands on architectural constraints, quantitative impact, and recovery details for readers who want technical depth.
View technical deep dive
Initial Decision Context
Goal
- Pivot from mobile apps to web quickly
- Reuse existing Flutter codebase to minimize rewrite effort
Chosen Approach
- Flutter Web, leveraging shared UI and logic
- Assumed performance and SEO issues could be optimized later
This assumption proved false.
Structural Constraints (Flutter Web)
Rendering Model
- Canvas-based rendering rather than semantic HTML
- Limited browser-level optimization and accessibility support
Measured Performance
- Initial bootstrap: >5s
- Data fetch + processing: 5–7s
- Total time-to-interactive: 10–12s
Optimization attempts delivered <20% improvement and plateaued.
SEO & Discoverability
- No meaningful server-side rendering
- Search engines unable to index content effectively
- Creator discovery and inbound growth blocked by design
Ecosystem Friction
- Third-party web libraries incompatible with canvas rendering
- Increasing divergence from standard web tooling
Decision to Reset
Key Insight: This was not an implementation problem, it was a structural ceiling.
Tradeoff Accepted
- ~3 months of existing work abandoned
- Additional ~3 months required for rewrite
- Total cost: ~6 months + opportunity cost
Rewrite Strategy (Next.js)
Framework Rationale
- Native HTML rendering with SSR/SSG
- Predictable performance characteristics
- Strong ecosystem and hiring pool
- First-class SEO and accessibility support
Outcome Targets
- Sub-3s TTI
- SEO-ready by default
- Standard web primitives for long-term evolution
Platform Hardening During Rewrite
CI/CD
- GitHub Actions with automated testing
- Staging auto-deployed from
main - Production gated via locked
prodbranch - Blue–green deployments with instant rollback
Infrastructure
- AWS CloudFront CDN with edge caching
- Anti-bot protections and DDoS mitigation
- Zero-downtime deployment capability
Operational Impact
- Deployment time: 30+ min → ~5 min
- Production incidents reduced by >90%
Quantitative Comparison
| Metric | Flutter Web | Next.js | | --- | --- | --- | | Time-to-Interactive | 10–12s | <2s | | SEO | Blocked | Fully functional | | Accessibility | Limited | Native | | Deployment | Manual | Automated | | Iteration Speed | Fragile | Predictable |
Final System Characteristics
- Web-native rendering with predictable performance
- SEO and accessibility built into the platform
- Delivery pipeline designed for safe iteration
- Stack aligned with long-term hiring and ecosystem support
Completed as CTO during the pre-seed → seed transition.
