The AI Mini Hackathon Berlin, organized by Luis Rieke, ran today at Needle's office near Jannowitzbrücke. The format: three hours, build something real, pitch it. About 40 teams, around 140 people on campus. Three sponsors provided API credits: Needle for document ingestion, Featherless for open-weight LLM inference, ElevenLabs for voice synthesis. I arrived without a team and found one in the first fifteen minutes.
What we built is called Drop. The pitch: paste any URL or topic and get a shareable two-voice podcast episode in about 60 seconds.
Drop Title PageDrop Demo
The Team
John Moorman (me) — frontend, full API pipeline, ElevenLabs integration, pitch
Bernhard Eisvogel (Math PhD) — ElevenLabs SDK integration and audio stitching
Rahul Bedjavalge (AI Masters student) — Needle ingestion and Featherless script generation (check out his website at rahulai.com)
The Idea
ElevenLabs makes ElevenReader, which reads any webpage aloud. AI summaries are everywhere. The twist here is format: instead of flat text-to-speech, you get two podcast hosts having an actual conversation about the content. Alex is curious, asks sharp questions. Sam is the expert with direct takes. Seven to nine exchanges, one memorable last line.
The three sponsors mapped cleanly onto a three-stage pipeline. Needle extracts content from a URL. Featherless generates the dialogue script. ElevenLabs voices it. That alignment made the idea easy to commit to quickly.
The Build
Comments
Loading comments...
Leave a comment
We divided clearly: Bernhard owned ElevenLabs and audio stitching, Rahul owned Needle and Featherless, I built the frontend and the /api/generate route that wired all three stages together.
What went smoothly:
Prompt engineering for the script format locked in early. The ALEX: / SAM: constraint with a fixed exchange count produced usable output from the first test and barely needed iteration. The merge was also fairly smooth. Both teammates had left page.tsx untouched and worked entirely in lib/ files, so my UI was preserved and their modules came in without conflict. Just a little rearranging and rewiring and all was well.
What was hard:
ElevenLabs on Vercel. Bernhard's original integration used writeFileSync to track character usage to a CSV. Vercel's serverless runtime has a read-only filesystem, so this crashed every request in production. Fix: remove the tracking, make the ElevenLabs client lazy-initialize inside the function rather than at module load time. That also resolved a separate issue where dotenv hadn't populated process.env before the SDK constructor ran.
Needle reliability. Failing on every call, three separate root causes: the SDK constructor requires an explicit { apiKey } argument (doesn't auto-read from the environment), collections.create requires a model field that was overlooked, and the polling loop was running for 120 seconds — longer than Vercel's function timeout. Fixed all three, added a direct HTML fetch fallback, capped polling at 24 seconds.
Reliable Results Trying to orchestrate so many moving parts in such a short amount of time comes with a lot of bugs that can be difficult to debug quickly. From the chosen model giving the correct response format only most of the time, to the flow suddenly breaking with only a generic 500 error to go off of (sometimes the free api usage ran out, sometimes the env passing was misconfigured, etc.).
The Pitch
Over 40 teams in a roughly 45-minute block. I was patching the application down to the wire, with the final fix going in immediately before pitches started.
With the pace of the presentations, even taking 2 minutes for the presentation was too long, so I opted type a URL into the input live in front of the room so the audience could see the real interface and beginning of the generation, then switch to a tab with a completed generation of the same URL to show the transcript and play the audio.
pitch in progress
There were 4 prizes for the roughly 40 teams to compete for, and the winners brought some fantastic ideas and implementations.
Drop didn't place. But one of Needle's founders approached me afterwards and said "strong pitch." We connected and had a pleasant and enjoyable conversation. That, combined with all the other creative and passionate people I met, made the day especially worthwhile.
The Portfolio Demo
The live app requires active API keys and costs real credits on every generation, which makes it impractical to leave publicly accessible. After the hackathon I built a self-contained demo version: a /demo route that animates through the same three-stage pipeline UI with realistic delays (around 17 seconds), then reveals a pre-baked episode and transcript identical in appearance to a real generation.
The demo episode topic: Attention as Infrastructure, on the argument that the attention economy might be the defining public health crisis of the century. Sam's closing line: "The most valuable thing you own isn't your house or your savings. It's the hours of genuine focus you have left in your life. The question is who you're going to let spend them."
The audio was generated once locally using a one-shot script and committed as a static file. The root URL redirects to /demo. But anyone who wants to run the live generator can clone the repo and bring their own keys.
What I Took From It
This being my first hackathon, I didn't know what to expect. I quickly learned that a competition like this demands a tight scope. Three hours is long enough to ship something real if the idea maps tightly onto the available tools, the team divides well, and the "nice-to-have" features are sent to the graveyard. All were true here, which is why it worked.
The debugging was messier than I would have liked. In a perfect world, I could start with a simple testing suite next time, but I will definitely at least have much more detailed error logging at every API endpoint. Far too much time was wasted debugging things that worked once then broke as development continued. Time that could have been used to flesh out the features, our pitch, or just relax and reduce stress.
However, having a clear concept of the architecture and data pipeline from the start meant that every person had something they could take ownership of and verify its functionality. That made the difference between a functional demo and a mocked up app like the one I made after the fact.
Being under pressure to plan quickly, realistically, and for the best results you can make in a short time frame stimulates growth in a way that was surprising to me. It was vital to success in the event, but truly this ability is vital to success in life as well. Being able to realistically plan what one can complete in a day, and the ability to discard appealing goals that ultimately don't serve one's greater purpose both massively impact the trajectory of one's life.
This is a lesson that I and many of us are already incorporating in some perhaps unconscious capacity, but my brain made the connection when I sat down to plan my day the morning after the hackathon. Now that I've become aware of it, I hope to internalize and apply it in a more intentional way in my day-to-day.
Links and Goodbyes
The repo is on my GitHub, and the demo is deployed via Vercel.
If you have read this far, thank you! I hope that some of my experience here has been useful to you, and I hope you will enjoy my next post. Auf wiedersehen!