Live data from Hacker News

Show HN: I vibecoded a 35k LoC recipe app

recipeninja.ai

1–10 of 258 posts

Show HN: I vibecoded a 35k LoC recipe app

#1
Over the last 2-3 weeks, I vibecoded the recipe app that I always wished existed - recipeninja.ai . It now includes a fully interactive voice assistant so you don't need to get your dirty hands over your new iPad when you're cooking.

Background: I’m a startup founder turned investor. I taught myself (bad) PHP in 2000, and picked up Ruby on Rails in 2011. I’d guess 2015 was the last time I wrote a line of Ruby professionally. Last month, I decided to use Windsurf to build a Rails 8 API backend and React front-end app, using OpenAI's realtime API for voice-to-voice responses. Over the last few days, I also used Claude Code and Gemini 2.5 Pro for some of the trickier features. 35,000 LoC later, this is what I built!

The site uses function-calling to navigate the site in realtime as you chat with the voice assistant, which I think is pretty neat.

For the long version, see https://tomblomfield.com/post/778601470234918912/vibecoding-...

I'd love any feedback you have!

Demo video of the voice assistant: https://www.youtube.com/watch?v=kRhVc9D5kcg

Generate and edit new recipes: https://www.youtube.com/watch?v=VwwZF6dHcHg

Show HN: I vibecoded a 35k LoC recipe app
recipeninja.ai

Re: Show HN: I vibecoded a 35k LoC recipe app

#2
This is great. Want to come demo it in the weekly EarthPilot.ai AI Playground tomorrow at 11est?

Http://earthpilot.com/play and then join at AnthonyDavidAdams.com/zoom at 11 for show and tell.

I’m making a non-fiction book writing agent and I’d love to better understand how you used function calling to navigate the website!

Re: Show HN: I vibecoded a 35k LoC recipe app

#3
Well this is a good start, I tried searching for “Anti-inflammatory” and the app crashed. Likely that scaling is way out of proportion considering it’s here on HN , but do you have any load balancing or caching setup? Debouncing on the inputs?

Re: Show HN: I vibecoded a 35k LoC recipe app

#6
I still haven't done the AI vibe coding, but I think I get a similar effect with the Conjure plugin for Neovim with Clojure.

Being able to type out and immediately execute it directly in the window, and even have your code replaced by the output, is kind of life-changing. It fundamentally changes the way you write code, like the REPL isn't just a quick way to test your code, but a direct helper to test the stuff that you right.

I did a project in Clojure recently, heavily using Conjure, and then my next project was in Rust. Rust has nice Neovim plugins as well, but it still kind of felt like a step backwards; I found myself reaching for the "automatically evaluate" keystrokes that don't exist on Rust.

Re: Show HN: I vibecoded a 35k LoC recipe app

#7
Is the key feature here just the voice control? I’m wondering what you feel is missing from other popular recipe websites/trackers, and why I would choose to use this over something with more care put into it.

Or, was this mostly just an exercise in engineering/testing AI?

Re: Show HN: I vibecoded a 35k LoC recipe app

#8
post #2

This is great. Want to come demo it in the weekly EarthPilot.ai AI Playground tomorrow at 11est? Http://earthpilot.com/play and then join at AnthonyDavidAdams.com/zoom at 11 for show and tell. I’m making a non-fiction book writing agent and I’d love to better understand how you used function calling to navigate the website!

Basically you declare to the AI which functions (tools) are available for it to call: https://platform.openai.com/docs/guides/function-calling?api...

Then you handle those function calls in your javascript.

``` if (function_name === 'search_recipes') { const searchParams = new URLSearchParams();

      if (args.name) searchParams.set('name', args.name);
      if (args.difficulty) searchParams.set('difficulty', formatDifficulty(args.difficulty));
      if (args.min_duration) searchParams.set('minDuration', args.min_duration.toString());
      if (args.max_duration) searchParams.set('maxDuration', args.max_duration.toString());
      if (args.tag) searchParams.set('tag', args.tag);
      
      // Handle ingredients array correctly - the search page expects ingredients[]
      if (args.ingredients && args.ingredients.length > 0) {
        // Clear any existing ingredients
        searchParams.delete('ingredients[]');
        
        // Add each ingredient individually with the correct array notation
        args.ingredients.forEach((ingredient: string) => {
          searchParams.append('ingredients[]', ingredient);
        });
      }
      
      const queryString = searchParams.toString();
      const url = queryString ? `/search?${queryString}` : '/search';
      
      navigate(url);
      return;
    }
    
    // start_cooking function
    if (function_name === 'start_cooking') {
      // First check if we have an onStartCooking callback registered
      if (callbacksRef.current.onStartCooking) {
        callbacksRef.current.onStartCooking();
        return;
      }
    }
```

Re: Show HN: I vibecoded a 35k LoC recipe app

#9
post #2

This is great. Want to come demo it in the weekly EarthPilot.ai AI Playground tomorrow at 11est? Http://earthpilot.com/play and then join at AnthonyDavidAdams.com/zoom at 11 for show and tell. I’m making a non-fiction book writing agent and I’d love to better understand how you used function calling to navigate the website!

Afraid I have a day job, so I will politely decline your kind invitation

Re: Show HN: I vibecoded a 35k LoC recipe app

#10
post #7

Is the key feature here just the voice control? I’m wondering what you feel is missing from other popular recipe websites/trackers, and why I would choose to use this over something with more care put into it. Or, was this mostly just an exercise in engineering/testing AI?

Hands-free voice control and being able to access recipe ingredients and steps without 5 pages of SEO-optimised prose.
Post reply on HN