In 2019, I had the opportunity to join Nacelle as one of its first four employees. Before then I had been working with Nacelle’s CEO, Brian Anderson, at his Shopify agency, ShopElf, where we had been pioneering headless storefront development using modern tools like Vue.js and Nuxt. Building e-commerce stores in this away allowed us to integrate Shopify product data with Contentful CMS data, making content editing easier for merchants while also improving page load speed and, in turn, conversion rates.
Joining ShopElf had been a breath of fresh air in contrast to previous agencies focused on traditional Shopify theme development and the frustrating continued reliance on jQuery and the cumbersome Shopify theme editor.
When Brian had the idea of turning this bespoke client work into a scalable platform that would allow any merchant to easily and reliably go headless I was fully on board.
The first couple months was a whirlwind of development. First I built the product dashboard, which allowed merchants to manage settings like users, roles, and API connections to Shopify, Contentful, and Sanity. This was a Nuxt.js application deployed to Netlify and integrated with those third-party APIs in addition to Nacelle’s services. I also built the dashboard’s backend, an Apollo GraphQL server deployed with the Serverless framework to AWS Lambda.
Additionally I also helped on the development of our PWA Starter Kit. This was another Nuxt.js application with components prebuilt for product pages, collection pages, landing and home pages, so that agency developers or merchant developers could jump start their development on the Nacelle platform. The PWA starter kit interfaced with a client-side, javascript SDK that I built for easily interfacing with Nacelle’s public facing GraphQL API for retrieving a store’s product and content data.
Within a few months we had written a lot of code, gained a few initial customers, made some mistakes and late night fixes, and demonstrated that there was real value in the Nacelle platform.
Over the next several years the company grew tremendously. We went from 2 engineers at the start to over 40 at our peak, with the company as a whole growing to over 100. As the team grew my role evolved from individual contributor, to Engineering Manager for the backend squad, to Team Lead for the Nexus squad responsible for Nacelle’s Storefront GraphQL. In these leadership roles I had to wear many hats, being a resource of institutional knowledge, product and project management, handling sprint ceremonies, architecting new features and services, and helping to define and solidify a collaborative, supportive, and respectful engineering culture where everyone felt welcome and their contributions appreciated and acknowledged.
The codebase underwent several major changes as well from our scrappy origins. Our manual, locally run deployments were replaced with a real CI/CD pipeline with increased emphasis on testing and observability, automated deployments. After an initial experimentation with the infrastructure-as-code platform, Pulumi, we rebuilt our entire backend to use Terraform for provisioning and deploying resources, and moving our services from Lambda to containerized images managed by Kubernetes.
The first platform rebuild also involved re-architecting the system around Kafka. We built a robust pipeline where webhook updates from Shopify and Contentful were placed on Kafka topics, and services consumed these messages to save the incoming data to a database used by the GraphQL service. This architecture allowed for greater scalability and reliability as the platform matured.
For V2 of the platform, my team on the Nexus squad also built the new version of the Storefront GraphQL service to use Cassandra as its database. The reasoning for this was so that we could take advantage of Cassandra’s write speed, reducing the time from data ingestion to availability on the GraphQL. While this initially seemed suitable, we soon faced mounting challenges with data denormalization and increasingly complex logic in our Kafka consumer services. Our team was spending more time fixing issues than adding features, and our velocity had significantly slowed. Recognizing that our data was fundamentally relational, I partnered with our DevOps lead to present a compelling case to management devoting resources to migrating to PostgreSQL. The subsequent migration and rebuild was highly successful, allowing us to dramatically simplify our consumer services and GraphQL server. As a result, we eliminated countless edge cases, reduced code complexity, and were able to refocus on delivering new features from our product roadmap.
One of the last major projects I worked on was leading the development of an AI-powered tool to allow marketers to more easily create personalized landing pages for their audience segments. At Nacelle our engineering team embraced AI tooling using copilot and ChatGPT plans given to every engineer. We also started looking into how we might integrate it into our products. After a brainstorming session, I put together a prototype of what would become Genesis. I was given a small team to turn this prototype into a demo-able MVP that we could show off at the 2024 NRF conference. Due to the success of the demo, the company pivotted to make Genesis the primary focus of the company. I was then in charge of leading the engineering team in turning the Genesis MVP into a standalone app on the Shopify App Marketplace. Over the course of that summer my team and I built and released the app. Besides coordinating scope and timelines with the product manager, engineering manager, designer, backend engineers, and frontend engineers, I contributed code to our Python backend service and Vue components for the app interface that ran within the Shopify dashboard.
The five years I spent at Nacelle was an incredible experience, often pushing me out of my comfort zone to learn new technologies and grow as an engineer and a leader. I feel very lucky that I was able to work with an incredible team of brilliant and kind coworkers. In the intense pressure that a startup environment can create, I’m thankful that we treated each other with respect, professionalism, and friendliness. I look forward to applying these experiences to new opportunities where I can continue to innovate, lead, and make a meaningful impact.