eph baum dot dev

← Back to blog

Building Horror Movie Season: A Journey in AI-Augmented Development

Published on 10/26/2025 11:20 AM by Eph Baum (feat. Claude)

How I built a production web app primarily through “vibe coding” with Claude, and what it taught me about the future of software development


Introduction

After years of using LLMs to assist with my work—both personally and professionally—I recently released my first project that was primarily “vibe coded” with AI assistance. As a professional engineer, this represents the least amount of direct code I’ve written and edited in any project I’ve shipped. But it’s also one of the most complete applications I’ve built.

The project? Horror Movie Season — a SvelteKit app for tracking you horror movies during horror movie season (generally starting as fall sets in and lasting until October 31st), complete with gamification, streaks, awards, and social features.

Horror Movie Season Homepage

This post explores what it means to build a “production app” with extensive LLM assistance, particularly at a time when newer models seem to be getting demonstrably worse rather than better (since around the GPT-3 and Claude 3/3.5 era, each iteration was an improvement, but that trend appears to have reversed in more recent iterations).

If you’re curious, you can check out my public profile and see what I’ve watched (so far) this Horror Movie Season.

The Concept

The idea was simple: I wanted to try building something with Svelte. Most of my recent projects have been built with Astro, but I was curious about Svelte’s approach—it feels like OG HTML/CSS/JS meets modern components, which appealed to me.

The goal was to create a Firebase-hosted app without a traditional backend, focusing on the “31 Days of Horror” challenge that many horror movie fans participate in during October. The app needed to track daily movie watches, calculate streaks, award badges, and include social features for discovering other horror fans.

I love film and horror is my favorite genre. I believe I’ve written about it before but there’s something about the storytelling goal of scaring someone, something about the way in which someone might dig deep into their own depravity to create a story that shocks, that causes gooseflesh, or disgusts.

Horror Movie Season Profile

The “Vibe Coding” Experience

What Vibe Coding Actually Means

“Vibe coding” is a term popularized by Andrej Karpathy (co-founder of OpenAI and former AI leader at Tesla) in February 2025, and it’s even made it into Merriam-Webster’s dictionary. The term has hit the zeitgeist by storm, permeating LinkedIn, blogs, YouTube, news, and the Internet at-large. It describes the experience of simply telling an LLM what you want to build and letting the AI handle the majority of implementation details from there. It’s not just AI-assisted coding — it’s AI-driven development where you act more as an architect, reviewer, and decision-maker than as the primary implementer.

This is somewhat fascinating to me because it mirrors my professional experience. As experienced senior engineer and technical lead, my role has often been less hands on keyboard. Depending on the team and project I work on I’ve often spent more of my time reviewing code, making architectural decisions, and guiding implementation.

In my personal projects, that’s obviously not the case. When I work on a personal project I’m usually doing everything. Even in cases where I’m collaborating with others, where I might still be guiding and decisioning, I’m still often much closer to direct implementaiton.

With AI-assisted development, that dynamic flipped. In this project I found myself in the same role I often have professionally — reviewing implementations, making architectural decisions, and guiding the overall direction — yet I’m alone, it’s just me.

The Dangers and Balance Required

This approach isn’t without risks. Vibe coding can be dangerous when you’re trying out technologies you don’t have deep experience with. Without the knowledge to effectively review the AI’s output, you might miss subtle bugs, performance issues, or architectural problems.

The balance required is significant. You need enough domain knowledge to:

In this project I felt that I wasn’t wasn’t working without a net. As I mentioned earlier, Svelte, to me, feels rather approachable, and I have extensive Javascript experience. Additionally, I’ve used Firebase for years, since well before it became a Google Property, and it is not dissimilar to other hosting services with which I’ve experience such as heroku, and vercel.

I still missed plenty of issues during the process and have had to circle back on numerous bugs and issues. Many remain.

Technical Journey

Why Svelte?

Svelte appealed to me because it felt like a return to fundamentals—HTML, CSS, and JavaScript—but with modern component architecture. Unlike React’s JSX or Vue’s template syntax, Svelte components feel more like enhanced HTML with reactive statements and component logic.

The compilation approach also intrigued me. Svelte compiles to vanilla JavaScript, which should result in smaller bundles and better performance than frameworks that ship a runtime.

What makes Svelte different:

For this project, Svelte’s approach felt natural. The component syntax is clean and readable, the reactivity system is intuitive, and the compilation output is efficient. It’s particularly well-suited for apps that need to be fast and lightweight—perfect for a movie tracking app that users might access frequently during October.

Firebase Architecture

The entire backend runs on Firebase’s free tier:

The key architectural decision was using SvelteKit’s static adapter, which generates a single-page application that Firebase Hosting can serve with proper routing.

Key Technical Decisions

Static Adapter for Firebase Hosting: This allows the SvelteKit app to be deployed as a static site while maintaining client-side routing. The firebase.json configuration handles all routes by serving index.html, letting SvelteKit’s router handle the rest.

Firestore Schema Design: Optimized for Firebase’s free tier limits, with careful attention to read/write operations and query patterns. The schema includes users, movies, awards, and social features while staying within free tier constraints.

OMDb API Integration: Rather than exposing the API key on the client, I used Firebase Cloud Functions to proxy requests to the OMDb API. This keeps the API key secure while providing movie search functionality.

Real-time Streak Calculation: The streak logic calculates consecutive days of movie watching, with proper timezone handling and edge case management for the horror season (October 1-31).

Development Process

Starting from Scratch with AI

The project began with a simple prompt: “I want to build a horror movie tracking app with SvelteKit and Firebase.” From there, Claude helped me:

  1. Set up the initial SvelteKit project structure
  2. Configure Firebase integration
  3. Design the Firestore schema
  4. Implement authentication flows
  5. Build the core movie tracking features

Iterative Feature Building

The git history tells the story: 266 commits showing the iterative development process. Features emerged organically:

What started as a simple movie tracker evolved into a comprehensive social platform. The AI helped implement complex features like:

What Worked Well

Rapid Prototyping and Iteration

The speed of iteration was remarkable. I could describe a feature and have a working implementation within minutes. This allowed for rapid experimentation and feature exploration.

Comprehensive Documentation Generation

The AI excelled at generating documentation. The project includes 15+ documentation files covering everything from environment setup to security implementation to the awards system logic.

Testing and Quality Tooling Setup

Setting up a complete testing and quality pipeline was straightforward. The AI helped configure Vitest for testing, ESLint for linting, Prettier for formatting, and GitHub Actions for CI/CD.

Complex Business Logic Implementation

Surprisingly, the AI handled complex business logic well. The streak calculation algorithms, award detection logic, and social features were implemented easily enough.

There had to be some tweaking throughout the process and it’s still not all working flawlessly, there are a few bugs I still want to squash, but I’m generally happy with how it turned out and have ideas for improvments going forward.

Challenges and Learnings

When to Intervene vs. Trust the AI

One of the biggest challenges was knowing when to step in. Sometimes the AI would implement something that looked correct but had subtle issues. Other times, it would over-engineer a solution when something simpler would work.

Occassionally the LLM would go rogue and just start doing things.

One of the biggest challenges with using Cursor is that it’s hard to strike a balance between allowing it to use its tools unfettered and having to hold its hand to approve each tool call so that it doesn’t decided to deploy to your production environemnt while working on a feature brannch. (Yes, this actually happened)

Maintaining Architectural Vision

Without writing the code yourself, it’s easy to lose sight of the overall architecture. I had to be more deliberate about reviewing the codebase structure and ensuring consistency.

Code Quality and Consistency

While the AI generally produced good code, maintaining consistency across the codebase required active review. Different prompts could lead to different coding styles or patterns, as could using Cursor’s Auto mode which results in the use of different models.

Cursor’s output has been reasonably consistent overll, it’s impressive to see where we are today with this tool, particularly when I compare Cursor with Github’s Co-pilot, which is probably the topic for a whole other post, I’m sure.

The Importance of Good Prompting

The quality of the output was directly related to the quality of the prompts. Vague requests led to generic implementations, while specific, detailed prompts produced better results.

Largely, however, I find that a relatively coversational tone works pretty well.

Interestingly, calling out LLms for bad behavior tends to be surprisingly effective, although it becomes clear just how sycophantically they’ve been desiged in this case.

Reflections

Would I Do It Again?

I think it requires a lot of balance. The approach works well when you have enough domain knowledge to effectively review the AI’s output. It’s somewhat dangerous when trying out technologies without experience to be an effective reviewer.

The key is knowing your limits and being honest about what you can and cannot effectively review. Interestingly, LLMs can actually help here, using adversarial prompting you can get it to be really critical of itself and that can often uncover possible issues you might not catch otherwise.

What This Means for Software Development

AI is not replacing humans anytime soon. It’s useful augmentation, but it requires human oversight, architectural thinking, and domain expertise to be effective.

The role of the engineer in AI-assisted development is evolving. We’re becoming more like conductors of an orchestra—guiding, reviewing, and making high-level decisions while the AI handles much of the implementation.

I am still predicting that there will soon be plenty of work to undo the AI-slop being yeeted out in companies trying to adopt early without implemnnting appropriate guardrails.

Transparency About AI Usage

I believe in being transparent about AI usage in open source projects. The Horror Movie Season repository includes extensive documentation about the development process, and this blog post is part of that transparency. I’ll be cross posting this to my development blog, but this file will live in the repo as well.

Conclusion

The result is a mostly-functional, well-documented app deployed at horrormovieseason.com. With 266 commits, comprehensive documentation, a full test suite, CI/CD pipeline, and 95% feature completion, it represents what’s possible with AI-augmented development.

The experience has been eye-opening. It’s shown me both the potential and the limitations of AI-assisted development. While the speed and capability are impressive, the need for human oversight, architectural thinking, and domain expertise remains critical.

As we move forward, I think the most successful developers will be those who can effectively collaborate with AI while maintaining the skills to review, guide, and make architectural decisions. The future isn’t about AI replacing developers—it’s about developers who can work effectively with AI.

If you’re curious about the implementation details, the code is available on GitHub in my Bombing Around org, but I have not made the code generally available (for reasons I hope are obvious after reading this post). The documentation in the repository provides a comprehensive look at the development process and technical decisions and my hope is to clean things up and make the repository public in the future and share the source.

For now, you can try the app at horrormovieseason.com.

The future of development is collaborative, as is its past, but the collaboration will be changing now in. It’s going to be interesting to see where this journey takes us. Much has been predicted and discussed about the seachange that LLMs are creating, the future doesn’t seem clear, and it seems that “AI” is already resulting in a lot of changes in the present.


What are your thoughts on AI-augmented development? Have you tried “vibe coding” on any projects? I’d love to hear about your experiences and insights.

Written by Eph Baum (feat. Claude)

  • Making Brutalist Design Accessible: A Journey in WCAG AA Compliance

    Making Brutalist Design Accessible: A Journey in WCAG AA Compliance

    How I transformed my brutalist blog theme to meet WCAG AA accessibility standards while preserving its vibrant, random aesthetic. Talking about contrast ratios, color theory, and inclusive design.

  • Building Horror Movie Season: A Journey in AI-Augmented Development

    Building Horror Movie Season: A Journey in AI-Augmented Development

    How I built a production web app primarily through 'vibe coding' with Claude, and what it taught me about the future of software development. A deep dive into AI-augmented development, the Horror Movie Season app, and reflections on the evolving role of engineers in the age of LLMs.

  • Chaos Engineering: Building Resiliency in Ourselves and Our Systems

    Chaos Engineering: Building Resiliency in Ourselves and Our Systems

    Chaos Engineering isn't just about breaking systems — it's about building resilient teams, processes, and cultures. Learn how deliberate practice strengthens both technical and human architecture, and discover "Eph's Law": If a single engineer can bring down production, the failure isn't theirs — it's the process.

  • Using LLMs to Audit and Clean Up Your Codebase: A Real-World Example

    Using LLMs to Audit and Clean Up Your Codebase: A Real-World Example

    How I used an LLM to systematically audit and remove 228 unused image files from my legacy dev blog repository, saving hours of manual work and demonstrating the practical value of AI-assisted development.

  • Migrating from Ghost CMS to Astro: A Complete Journey

    Migrating from Ghost CMS to Astro: A Complete Journey

    The complete 2-year journey of migrating from Ghost CMS to Astro—from initial script development in October 2023 to final completion in October 2025. Documents the blog's 11-year evolution, custom backup conversion script, image restoration process, and the intensive 4-day development sprint. Includes honest insights about how a few days of actual work got spread across two years due to life priorities.

  • 50 Stars - Puzzle Solver (of Little Renown)

    50 Stars - Puzzle Solver (of Little Renown)

    From coding puzzle dropout to 50-star champion—discover how AI became the ultimate coding partner for completing Advent of Code 2023. A celebration of persistence, imposter syndrome, and the surprising ways generative AI can help you level up your problem-solving game.