Context
Plutus pivoted from mobile app to web based on user research showing customers preferred web over installing another app. To minimize rewrite cost, the team reused the Flutter codebase via Flutter Web—optimizing for short-term velocity while ignoring web-specific constraints.
My Role: I joined after the initial decision and led the strategic reset and Next.js migration.
What Went Wrong
Performance
- Initial bootstrap: >5 seconds
- Data fetch + processing: 5-7 seconds
- Total time-to-interactive: 10-12 seconds
- Result: High bounce rates and poor engagement
Architecture
- Flutter Web rendered via canvas, not HTML
- SEO effectively unusable for creator-driven discovery
- Accessibility constraints (non-semantic rendering)
- Third-party dependencies incompatible with Flutter's renderer
Engineering Cost
- ~3 months invested in Flutter Web
- Optimization attempts delivered <20% improvement
- No path to sub-3s TTI without fundamental rewrite
Strategic Reset
I pushed for a complete rewrite guided by one principle:
If we're paying the rewrite cost anyway, the outcome must buy long-term leverage—not just fix the current problem.
Framework Decision: Next.js
Rationale:
- Native HTML rendering with SSR/SSG
- Predictable performance characteristics
- Strong ecosystem and hiring pool
- Clear SEO and accessibility path
Platform Hardening
Used the rewrite window to upgrade delivery maturity:
CI/CD Implementation
- GitHub Actions with automated testing
- Staging auto-deployed from
main - Production gated via locked
prodbranch - Blue-green deployments with instant rollback
Infrastructure Improvements
- AWS CloudFront CDN with edge caching
- Anti-bot protections and DDoS mitigation
- Zero-downtime deployment capability
Results
| Metric | Flutter Web | Next.js | Improvement | | --- | --- | --- | --- | | Time-to-Interactive | 10-12s | <3s | ~75% reduction | | SEO Capability | Blocked | Fully functional | ∞ | | Deployment Time | Manual, 30+ min | Automated, 5 min | 83% reduction | | Production Incidents | Common | Near zero | >90% reduction | | Total Time Cost | 3 months (abandoned) | 3 months (delivered) | ~6 months lost |
Key Lessons
- Code reuse is not a strategy — Reusing code increases total cost if the abstraction is wrong
- Stack mistakes compound non-linearly — Every feature inherits the performance and delivery debt
- Web products require web-native primitives — Canvas-based rendering introduces structural ceilings
- Rewrites are leverage moments — Also fix delivery, security, and operability
- Platform decisions directly impact runway — This cost ~6 months + opportunity cost
Consulting Takeaway
Seed-stage teams rarely fail from bad features—they fail from early architectural decisions that silently tax every release. My role as consultant is to challenge stack decisions before they ossify and ensure pivots improve speed, reliability, and optionality.
Completed as CTO during pre-seed → seed transition
