Ontonathon: Our Unfiltered Failure Log
product
Nov 18, 2025
Velocity is one of our core values at Onton. This week, we're stress-testing it.
4 days. As many features as we can ship. Because of the time constraint, corners will be cut and mistakes will happen. So we're documenting all of it.
Why? Because the sanitized version of building software is boring and unhelpful. The real learning is in the chaos.
Follow along. Updates daily.

Day 1
Goal: ship two major features in two days. 1) Saved searches with async multi-search support and 2) a chat interface for product Q&A and comparisons.
The Wins
Reranking worked on first try. Julia service and Clojure code developed separately just... worked together. Magic.
Aditri set up her first Julia service (future sprints will be faster)
UI framework made some components surprisingly easy e.g. search bar reuse
Saved search results feature only took 15 minutes
Team division of labor was solid
The Fails
What seemed "doable at first glance" turned into a paradigm shift (supporting multiple concurrent searches vs. one at a time)
Planning ate the day. Design decisions and architecture took way longer than actually writing code
GitHub broke (because of course it did)
Sophia's dev container died, lost an hour to restart
Chat API setup was a mess - so confusing we didn't think we'd ship in time. Gemma figured it out by evening.
Simple SQL query turned into 30 lines of code
Frontend AND backend both needed changes for something we thought was frontend-only (search history)
Biggest Lesson
We're better at dividing work than at deciding what work to do. Should've shipped a rougher v0 faster instead of trying to design the perfect solution upfront. Plan less, ship more.

Day 2
We launched! Got both features live. And then everything broke.
The Wins
Chat interface launched and actually worked in production
Fixed the search disaster in 1.5 hours
Both features are live. Imperfect, but live.
The Fails
New service deployed but didn't start up properly in prod. Worked perfectly locally.
Search broke completely when we pushed to prod. Frontend and backend were tested individually and both worked fine. Integration? Not so much.
Dev environment for search was a pain to set up - needed test data and indexing processes running before we could even test locally. Hit unexpected issues along the way.
Chat session management needs work - figuring out how to handle context between conversations
Data format conversion issues caused bugs we didn't anticipate
Biggest Lesson
We would have caught it if we had a working dev environment. The search bug that killed 1.5 hours would've been obvious if we'd prioritized dev setup earlier. Testing components individually doesn't mean you've tested integration.

Day 3
With launch behind us, we're improving performance, fixing bugs, and making things actually feel good to use.
The Wins
Improved search reranking performance by sending requests in parallel
Fixed broken product pages - you can click on them again!
Text search is working locally now
Made progress on loading screen animation with product colors
Identified and started fixing the similar products bug
The Fails
Tried to build Docker image for a new, more powerful GPU. Python version was incompatible with the hardware. Now rebuilding everything with updated requirements.
Moving to a more powerful GPU somehow made things worse. The irony...
Similar products completely broke. Image search uses websockets differently than text search, and frontend rehydration loses the backend ordering.
Search result ranking quality is off after implementing saved searches
Loading screen animation is finicky - trying to make product images animate in a "random but intentional" way that feels whimsical. Lots of timing issues. Cursor keeps breaking its own code.
Biggest Lesson
More powerful hardware does not mean better results. When you change one thing (GPU, Python version, search implementation), expect everything downstream to break in unexpected ways. Latency optimization is extremely gnarly. So many variables to control for, and it's incredibly sensitive to small changes.

Day 4
The final push.
The Wins
Search reranking went from 4-7 seconds down to 0.3 seconds. That's 13-23x faster. Expected maybe 2x improvement, got 5-8x better than that.
Finally got new Python versions working on our GPUs after days of fighting with it
Animation launched at 11:58pm (technically made the deadline)
Made progress on lazy loading - hydrating images as you scroll instead of all at once.
Fixed the similar items bug on product pages that broke earlier
The Fails
The 0.3 second reranking approach only came together at midnight. So many complications and dead ends before getting there.
Benchmarking test for latency didn't reflect prod - test image was way smaller than real images.
Animation has jankiness - full screen pop-up happening afterward. Either async search is retriggering it, or the animation itself is buggy.
Images look flickery on mobile
Animation doesn't fully cover bigger screens yet
Potentially broke mobile search
Dev environments kept crashing. Sophia couldn't perform searches in her own branch. Had to push code up for Gemma to test. Flying blind is not an effective developer experience.
Image search doesn't work in dev environments right now
Biggest Lesson
If you feel like there's a better way, fight for it. Alex and Aditri had a working 1.5-2.5 second solution but pushed for better and got to 0.3 seconds. Also, you can't ship effectively without stable dev environments. When you can't test your own changes locally, you're flying blind. Context switching to test for each other kills momentum, especially during crunch time.
Stay Tuned
That's a wrap on the Ontonathon. But this is just a small taste of it all. We're shipping a lot more in the coming weeks and months - new features, improvements, and probably a few more things that will break spectacularly before they work beautifully. To stay up to date, follow us on Instagram, LinkedIn, X, or join our Discord community.
Velocity is one of our core values at Onton. This week, we're stress-testing it.
4 days. As many features as we can ship. Because of the time constraint, corners will be cut and mistakes will happen. So we're documenting all of it.
Why? Because the sanitized version of building software is boring and unhelpful. The real learning is in the chaos.
Follow along. Updates daily.

Day 1
Goal: ship two major features in two days. 1) Saved searches with async multi-search support and 2) a chat interface for product Q&A and comparisons.
The Wins
Reranking worked on first try. Julia service and Clojure code developed separately just... worked together. Magic.
Aditri set up her first Julia service (future sprints will be faster)
UI framework made some components surprisingly easy e.g. search bar reuse
Saved search results feature only took 15 minutes
Team division of labor was solid
The Fails
What seemed "doable at first glance" turned into a paradigm shift (supporting multiple concurrent searches vs. one at a time)
Planning ate the day. Design decisions and architecture took way longer than actually writing code
GitHub broke (because of course it did)
Sophia's dev container died, lost an hour to restart
Chat API setup was a mess - so confusing we didn't think we'd ship in time. Gemma figured it out by evening.
Simple SQL query turned into 30 lines of code
Frontend AND backend both needed changes for something we thought was frontend-only (search history)
Biggest Lesson
We're better at dividing work than at deciding what work to do. Should've shipped a rougher v0 faster instead of trying to design the perfect solution upfront. Plan less, ship more.

Day 2
We launched! Got both features live. And then everything broke.
The Wins
Chat interface launched and actually worked in production
Fixed the search disaster in 1.5 hours
Both features are live. Imperfect, but live.
The Fails
New service deployed but didn't start up properly in prod. Worked perfectly locally.
Search broke completely when we pushed to prod. Frontend and backend were tested individually and both worked fine. Integration? Not so much.
Dev environment for search was a pain to set up - needed test data and indexing processes running before we could even test locally. Hit unexpected issues along the way.
Chat session management needs work - figuring out how to handle context between conversations
Data format conversion issues caused bugs we didn't anticipate
Biggest Lesson
We would have caught it if we had a working dev environment. The search bug that killed 1.5 hours would've been obvious if we'd prioritized dev setup earlier. Testing components individually doesn't mean you've tested integration.

Day 3
With launch behind us, we're improving performance, fixing bugs, and making things actually feel good to use.
The Wins
Improved search reranking performance by sending requests in parallel
Fixed broken product pages - you can click on them again!
Text search is working locally now
Made progress on loading screen animation with product colors
Identified and started fixing the similar products bug
The Fails
Tried to build Docker image for a new, more powerful GPU. Python version was incompatible with the hardware. Now rebuilding everything with updated requirements.
Moving to a more powerful GPU somehow made things worse. The irony...
Similar products completely broke. Image search uses websockets differently than text search, and frontend rehydration loses the backend ordering.
Search result ranking quality is off after implementing saved searches
Loading screen animation is finicky - trying to make product images animate in a "random but intentional" way that feels whimsical. Lots of timing issues. Cursor keeps breaking its own code.
Biggest Lesson
More powerful hardware does not mean better results. When you change one thing (GPU, Python version, search implementation), expect everything downstream to break in unexpected ways. Latency optimization is extremely gnarly. So many variables to control for, and it's incredibly sensitive to small changes.

Day 4
The final push.
The Wins
Search reranking went from 4-7 seconds down to 0.3 seconds. That's 13-23x faster. Expected maybe 2x improvement, got 5-8x better than that.
Finally got new Python versions working on our GPUs after days of fighting with it
Animation launched at 11:58pm (technically made the deadline)
Made progress on lazy loading - hydrating images as you scroll instead of all at once.
Fixed the similar items bug on product pages that broke earlier
The Fails
The 0.3 second reranking approach only came together at midnight. So many complications and dead ends before getting there.
Benchmarking test for latency didn't reflect prod - test image was way smaller than real images.
Animation has jankiness - full screen pop-up happening afterward. Either async search is retriggering it, or the animation itself is buggy.
Images look flickery on mobile
Animation doesn't fully cover bigger screens yet
Potentially broke mobile search
Dev environments kept crashing. Sophia couldn't perform searches in her own branch. Had to push code up for Gemma to test. Flying blind is not an effective developer experience.
Image search doesn't work in dev environments right now
Biggest Lesson
If you feel like there's a better way, fight for it. Alex and Aditri had a working 1.5-2.5 second solution but pushed for better and got to 0.3 seconds. Also, you can't ship effectively without stable dev environments. When you can't test your own changes locally, you're flying blind. Context switching to test for each other kills momentum, especially during crunch time.
Stay Tuned
That's a wrap on the Ontonathon. But this is just a small taste of it all. We're shipping a lot more in the coming weeks and months - new features, improvements, and probably a few more things that will break spectacularly before they work beautifully. To stay up to date, follow us on Instagram, LinkedIn, X, or join our Discord community.
Velocity is one of our core values at Onton. This week, we're stress-testing it.
4 days. As many features as we can ship. Because of the time constraint, corners will be cut and mistakes will happen. So we're documenting all of it.
Why? Because the sanitized version of building software is boring and unhelpful. The real learning is in the chaos.
Follow along. Updates daily.

Day 1
Goal: ship two major features in two days. 1) Saved searches with async multi-search support and 2) a chat interface for product Q&A and comparisons.
The Wins
Reranking worked on first try. Julia service and Clojure code developed separately just... worked together. Magic.
Aditri set up her first Julia service (future sprints will be faster)
UI framework made some components surprisingly easy e.g. search bar reuse
Saved search results feature only took 15 minutes
Team division of labor was solid
The Fails
What seemed "doable at first glance" turned into a paradigm shift (supporting multiple concurrent searches vs. one at a time)
Planning ate the day. Design decisions and architecture took way longer than actually writing code
GitHub broke (because of course it did)
Sophia's dev container died, lost an hour to restart
Chat API setup was a mess - so confusing we didn't think we'd ship in time. Gemma figured it out by evening.
Simple SQL query turned into 30 lines of code
Frontend AND backend both needed changes for something we thought was frontend-only (search history)
Biggest Lesson
We're better at dividing work than at deciding what work to do. Should've shipped a rougher v0 faster instead of trying to design the perfect solution upfront. Plan less, ship more.

Day 2
We launched! Got both features live. And then everything broke.
The Wins
Chat interface launched and actually worked in production
Fixed the search disaster in 1.5 hours
Both features are live. Imperfect, but live.
The Fails
New service deployed but didn't start up properly in prod. Worked perfectly locally.
Search broke completely when we pushed to prod. Frontend and backend were tested individually and both worked fine. Integration? Not so much.
Dev environment for search was a pain to set up - needed test data and indexing processes running before we could even test locally. Hit unexpected issues along the way.
Chat session management needs work - figuring out how to handle context between conversations
Data format conversion issues caused bugs we didn't anticipate
Biggest Lesson
We would have caught it if we had a working dev environment. The search bug that killed 1.5 hours would've been obvious if we'd prioritized dev setup earlier. Testing components individually doesn't mean you've tested integration.

Day 3
With launch behind us, we're improving performance, fixing bugs, and making things actually feel good to use.
The Wins
Improved search reranking performance by sending requests in parallel
Fixed broken product pages - you can click on them again!
Text search is working locally now
Made progress on loading screen animation with product colors
Identified and started fixing the similar products bug
The Fails
Tried to build Docker image for a new, more powerful GPU. Python version was incompatible with the hardware. Now rebuilding everything with updated requirements.
Moving to a more powerful GPU somehow made things worse. The irony...
Similar products completely broke. Image search uses websockets differently than text search, and frontend rehydration loses the backend ordering.
Search result ranking quality is off after implementing saved searches
Loading screen animation is finicky - trying to make product images animate in a "random but intentional" way that feels whimsical. Lots of timing issues. Cursor keeps breaking its own code.
Biggest Lesson
More powerful hardware does not mean better results. When you change one thing (GPU, Python version, search implementation), expect everything downstream to break in unexpected ways. Latency optimization is extremely gnarly. So many variables to control for, and it's incredibly sensitive to small changes.

Day 4
The final push.
The Wins
Search reranking went from 4-7 seconds down to 0.3 seconds. That's 13-23x faster. Expected maybe 2x improvement, got 5-8x better than that.
Finally got new Python versions working on our GPUs after days of fighting with it
Animation launched at 11:58pm (technically made the deadline)
Made progress on lazy loading - hydrating images as you scroll instead of all at once.
Fixed the similar items bug on product pages that broke earlier
The Fails
The 0.3 second reranking approach only came together at midnight. So many complications and dead ends before getting there.
Benchmarking test for latency didn't reflect prod - test image was way smaller than real images.
Animation has jankiness - full screen pop-up happening afterward. Either async search is retriggering it, or the animation itself is buggy.
Images look flickery on mobile
Animation doesn't fully cover bigger screens yet
Potentially broke mobile search
Dev environments kept crashing. Sophia couldn't perform searches in her own branch. Had to push code up for Gemma to test. Flying blind is not an effective developer experience.
Image search doesn't work in dev environments right now
Biggest Lesson
If you feel like there's a better way, fight for it. Alex and Aditri had a working 1.5-2.5 second solution but pushed for better and got to 0.3 seconds. Also, you can't ship effectively without stable dev environments. When you can't test your own changes locally, you're flying blind. Context switching to test for each other kills momentum, especially during crunch time.
Stay Tuned
That's a wrap on the Ontonathon. But this is just a small taste of it all. We're shipping a lot more in the coming weeks and months - new features, improvements, and probably a few more things that will break spectacularly before they work beautifully. To stay up to date, follow us on Instagram, LinkedIn, X, or join our Discord community.