At the YC Alumni reunion, a few founders were surprised by the seeming randomness of our pivots. Here’s how my cofounder, Aaron Villalpando, and I navigated 12 hard pivots without hating each other.
Our (current) 12th pivot is making BAML, a new programming language for using LLMs. We are still working on finding PMF, but for the first time in 3.5 years, we have a growing user-base that actually loves us.
The general theme of this entire timeframe can be summarized by us using our $$$ jobs as a safety net and attempting to throw spaghetti at the wall hoping it would stick. We were looking for signal BEFORE we committed.
Ideas we pursued:
What went wrong:
What went right:
We spent 11 months building Gloo, a voice-first Slack/Discord competitor. We loved using Gloo so much, we each logged over 1,000 hours of calls (thats 22 hours / week!). In hindsight, (1) we lacked founder-market fit and (2) it wasn’t a problem people cared about.
Our journey with Gloo:
Some reflections on what went right and wrong:
We attempted ideas quickly and looked to invalidate them for any reason that didn’t excite us. The only thing that kept us going was truly enjoying working together. We had so much fun working on Gloo. We’d joke around, solve seemingly impossible problems, talk about world domination. Just need that idea again…
Ideas we pursued:
Despite growing revenue, we felt uneasy. We couldn’t see a scalable technical solution for generating custom embeddings. Customers had poor data and couldn’t define success (e.g., “What makes a search result good or bad?”). That sentiment was drawn to a hard decision when we ended up deciding to turn down a $15k MRR contract for semantic search because it didn’t feel right. It felt more like consulting than product.
However, we found a silver lining in classification and extraction. Narrower LLM use-cases seemed more tractable from a product perspective. A front-page Hacker News post brought in 500+ inbounds, and we signed a few more paying customers. Yet, every SDK we wrote felt clunky. Every existing library (Langchain, LlamaIndex, Marvin, Instructor) had the same problem. They worked for prototypes but lacked essentials like type safety or easy ways to control (or even see) the entire prompt.
I remember the Thursday night (Aug 10, 2023) very clearly. We were starting to burn out again. I dropped by Aaron’s place at like 9 pm, and while sitting on the couch said :
dude… this library we made f—ing blows.
We laughed and joking spent the night sketching a new hypothetical syntax out. Who in their right mind would actually make a new language? By Sunday night, we wrote a compiler in C++ and by Monday we started migrating our existing customers over from our library. (We did all of that work).
This was slightly harder than we imagined. A month in, one customer asked us “Can we just stick to Python?” That evening Aaron and I went on a three-hour walk arguing if we should pivot. We had theories about why a new language for LLMs made sense (after all, JSX, Prisma, Terraform and CUDA must have some justification), but our customers weren’t happy. In fact, I’m pretty sure the only thing they liked about our company was us.
Lets briefly review the minimum set of things you need to make a new language usable:
Our syntax was barely understandable, and we lacked all of these features.
Imagine being our customer back then and writing a new language without any syntax highlighting or autocomplete…).
I’m not sure why we didn’t pivot that evening — signal was nonexistent, but the theory felt so solid. We decided to give ourselves until the end of the year — timeboxed delusion. Three months of building later, we learned from our customers and built more of those essentials. We finally started seeing a shift in how our customers felt.
We added ~10 more customers by March (shout out to @GovEagle, @Coldreach, @MagnaPlay, and many more!). We redesigned the syntax to make it more beginner friendly — migrating existing customers and somehow maintaining all of them.
We were starting to see an interesting pattern: once someone used BAML, they never used anything else; Instead they asked “can BAML do ____?” We added evals, support for every LLM, retries, fallbacks. The biggest breakthrough came when we made BAML work with every existing programming language with less than 1 minute of installation (Python, Typescript, Java, Go, Ruby, C++, Haskel, etc.).
One of the funniest quotes was David from @VetRec, alluding to us having more users: “Thank god, that means you won’t pivot. I don’t want to fork and maintain BAML.”
One of my favorite moments at the YC Reunion this year was running into random folks using BAML that I had never met:
"Are you the BAML guy? I was just coding up BAML on my flight last night." — Alexander Hopper
We still have a long way to go with BAML, but at least we’re done pivoting (for now🤞). Next, onwards to 1000 Weekly Active BAML devs!
If your curious about BAML, here’s a Youtube video sharing what it feels like to code in BAML: https://www.youtube.com/watch?v=XwT7MhT_BEY
Docs: https://docs.boundaryml.com
Repo (if you wanna make your own language): github.com/boundaryml/baml
Vaibhav Gupta is the co-founder of BoundaryML, an expressive language for structured text generation.