How BrightInvestor automated their Vue 3 migration and saved 8 engineer-monthsHow BrightInvestor automated their Vue 2 to 3 migration and saved 8 engineer-months

"If we ever have to do another migration, Wings will be my first call."
Donato Callahan — Co-founder and CEO, BrightInvestor
Today we're excited to share a great example of how Wings can make things a bit better for engineering teams and business stakeholders alike. This is the story of our work with BrightInvestor.
About BrightInvestor
BrightInvestor is the leading SaaS platform for real estate investors, property managers, and institutional buyers who are actively searching for new acquisitions. With BrightInvestor real estate professionals can easily sift through, analyze, and visualize large amounts of data to identify the best new opportunities for their business.
When we met Donato Callahan and the BrightInvestor product teams, they were profitable, growing revenue more than 100% per year, and starting to attract interest from enterprise clients. But they faced a critical hurdle.
The Challenge: Accruing tech debt vs. meeting business goals
Like many growing companies, BrightInvestor rapidly designed and built new features for years while gradually evolving their product to serve newly discovered market needs. "Building our codebase has been a bit of a whirlwind, going from the original idea to where we are now. We had to be fluid and flexible, adapting to the needs we've seen in our customer base," said David Lopez, Software Development Team Lead.
BrightInvestor's flagship product was built in Javascript on Vue.js v2, along with Nuxt 2, Vuex, the Vuetify component library, and with the Google Maps API at the core. Over the last few years, deprecations were announced for Vue 2, Nuxt 2, and several of the Google Maps APIs they depend on. On top of that, those frameworks depended on several other libraries that had unpatched vulnerabilities but couldn't be upgraded without a giant migration to Vue 3.
The engineering team's estimate was 9 engineer-months to migrate to Vue 3, Nuxt 4, Typescript, and modern Google Maps APIs.
The Dilemma: More tech debt or several months delay?
With a raft of new requirements needed to serve large clients, the team had a difficult choice to make:
- Bad choice #1: build new features on the legacy tech stack, which would make the future migration even more work.
- Bad choice #2: pause new features, and pause new revenue, while re-building the app on Vue 3.
"There's never a good time for migration. For the last year and a half we've been trying to schedule it, but there is always a delicate balance of building features needed by customers while maintaining the quality of the codebase. It came to a point where we saw the limitations, how we'd be unable to adapt to what the market is demanding; that's when we knew we had to do the migration."
Dissatisfied with two unattractive options, the team started looking for alternatives that would minimize delays. They considered temporarily bringing on more engineers, or outsourcing the migration project to a consulting firm, but these approaches proved too impractical, slow, and expensive.
The team also looked at various ways to split up the migration work into smaller, more digestible pieces. But there was no way to upgrade frameworks and also meet the timelines for new customer requirements.
Choosing Wings: No risk with massive upside
"At first, I was very skeptical that an LLM-based system could complete the migration."
After finding Wings through a web search, engineering team members were initially skeptical that LLM-based technology could migrate their 140,000 line codebase. But meeting the Wings team, discussing the project in depth, and learning about the Wings process made them more curious. Perhaps a new path was available.
Wings kept the BrightInvestor team in control. Beyond the high-level goal of migrating to Vue 3, they could also choose individual dependency replacements, code style guidelines, source tree organization, and more. Replacing all of the deprecated libraries required a number of decisions; Wings made recommendations, which removed the burden of researching and prototyping.
Wings also assumed all the risk. Wings customers only pay after they've reviewed the migrated code and are satisfied with the result.
"100% the right choice. I'm so glad we chose to go with Wings."
Expert support from soup to nuts
An engineer from the Wings team, in the role of Forward Deployed Engineer (FDE), was assigned to BrightInvestor's project. The Wings FDE was responsible for guiding the team through the migration process and driving the Wings pipeline.
The first step was to define the Migration Plan. The Wings FDE collected the BrightInvestor team's requirements, then presented a draft Migration Plan detailing the migration target, dependency changes, target file structure, all customized to the BrightInvestor engineering team's instructions. This process consolidates all of the decisions a team would need to make during a manual migration, compressing it to a single document and a single meeting. This greatly simplifies and speeds up these decisions.
Ultimately the team chose to go from Vue 2 to Vue 3, Nuxt 2 to Nuxt 4 for server-side rendering, Vuex to Pinia for state management, Vuetify to Tailwind CSS with DaisyUI for UI components, Javascript to Typescript, and an old set of Google Maps APIs to fully supported ones.
"Our Forward Deployed Engineer was instrumental in helping us land where we wanted to go with the migration."
Once the plan was set, the Wings FDE launched the migration pipeline and the BrightInvestor team shifted their focus to other projects. The Wings FDE provided regular updates on progress, and solicited additional input as needed.
Results: All migration goals achieved in record time, with high quality
"We were thrilled by the speed."
Fourteen business days later the BrightInvestor team received the migrated code, 800 unit and end-to-end tests, and a detailed onboarding guide for the new codebase. The BrightInvestor team dug in to test the new code. In the process they discovered 6 total bugs, which Wings fixed in 1.5 days. In total, the BrightInvestor team invested one full week evaluating the new 110k line migrated codebase before signing off on it – a testament to the migrated codebase's quality, familiar structure, and adherence to the team's expectations.
All migration goals achieved
- Vue 3 w/Nuxt 4 + Pinia
- Tailwind + DaisyUI
- Typescript
- Supported Google Maps APIs
- Monorepo w/ pnpm Workspace
- 80% test coverage w/ 800 unit + end-to-end tests
Low bug count, rapid fixes
6
Reported bugs
5
Bugs fixed in less than 6 hrs.
1
Bug fixed in less than 2 days
Impact: Months of acceleration
With a growing pipeline of enterprise deals, time was the critical metric for the BrightInvestor team. In the final analysis, Wings accelerated the overall business by several months with a snappy project duration, and also helped the BrightInvestor team avoid about 8 engineer-months worth of effort. Instead of grinding through the migration, the BrightInvestor team was able to focus on other projects while the Wings project was running in parallel.
~ 9 engineer-
months
Without Wings
~ 1 engineer-
month
With Wings
Actual Engineering Effort with Wings
2 engineers x
1 day — Dependency Plan Review + Edits
1 day — Migration Plan Review + Edits
2 days — Ad hoc Wings Team Support
5 days — Acceptance Testing
~ 1 engineer-month
