Logo

"THE RENAISSANCE

OF DEVS"

Stephan Janssen
Founder, Devoxx
Back to podcasts

The Man Behind World’s Largest Dev Con

with Stephan Janssen

Transcript

Chapters

Trailer
[00:00:00]
Introduction
[00:01:10]
The Popularity and Challenges of Devoxx Conferences
[00:03:35]
Stefan's Journey with AI Dev Tools
[00:05:30]
The Vibe Coding Experiment
[00:08:01]
From Vibe Coding to Spec-Driven Development
[00:16:04]
The Importance of Specifications and Testing
[00:20:40]
The Future of Development: Vibe Coding vs. Spec-Driven
[00:25:12]
The Importance of Senior Developers in AI Projects
[00:31:51]
Security and Performance Considerations
[00:32:52]
Testing and Debugging Challenges
[00:34:20]
Maintaining Specifications and Documentation
[00:37:16]
Role of Specifications in Development
[00:39:11]
Future of Developer Roles and AI Integration
[00:43:07]
Preparing for Devoxx Belgium
[00:51:55]
Innovative Features for Devoxx Belgium
[00:55:03]
The Future of Developer Conferences
[00:57:16]
Conclusion and Final Thoughts
[01:02:52]

In this episode

In this episode of AI Native Dev, host Simon Maple chats with Devoxx founder Stephan Janssen about building a production-grade conference app using AI, initially through "vibe coding" and later by adopting a spec-driven approach. Stephan shares insights into leveraging AI for rapid prototyping, the challenges of finalizing production-ready applications, and the benefits of blending local and cloud models. Discover how to harness AI for development while maintaining control and ensuring code quality.

Great engineering meets great events in this episode of AI Native Dev. Host Simon Maple sits down with Devoxx founder and hands-on developer Stephan Janssen to unpack how he built a production-grade conference companion app with AI—first via “vibe coding,” then by pivoting to a spec-driven approach. Along the way, Stephan shares practical lessons from running Devoxx (20+ events, 20K developers a year), creating an open-source AI coding assistant, and stress-testing today’s AI dev tooling in the wild.

From Premier Java Conference to AI Toolmaker

Stephan isn’t just the founder of Devoxx; he’s also deeply technical and still ships code. Devoxx Belgium—his flagship event—draws about 3,500 attendees every October and famously sells out in seconds. To handle demand, the team releases tickets in two batches; at one point they saw 4,600 unique IPs refreshing before registration opened. Post-COVID, Stephan sees conferences serving a second purpose: distributed teams use them as a high-energy week for reconnecting over tech and talks.

Between events, Stephan spends four to five months on R&D, experimenting with AI tooling that often debuts on Devoxx stages. After watching JetBrains demo an AI assistant that didn’t allow local models or alternate clouds, he built DevoxxGenie—an open-source Java plugin for code assistance. It supports local LLaMA-family models (including runtimes like llama.cpp) and cloud models, and it lets developers switch between them mid-flow. One powerful pattern he uses: have a cloud model review and critique a local model’s output. The plugin has already surpassed 30,000 downloads.

Beyond IDE integration, Stephan has also been testing CLI-based coding assistants. In this project, he primarily used a “Claude Code”-style CLI alongside tools like Gemini and Codex, burning through token- and session-limited blocks across long, focused days. That gave him a front-row seat to the strengths and rough edges of current-gen AI dev assistants.

The Vibe Coding Experiment: Building a Real App by Prompt

Stephan’s target project was a new Devoxx companion app. An existing open-source app covered the basics, but he wanted features like speaker search, photo display via face recognition, and proper authentication so attendees could sync favorites across devices. The twist: this would be a pure vibe coding build. His rule was simple—no manual edits. He could read the code, run it, and prompt the model, but not type into the source.

He chose React deliberately—even though he doesn’t know it—because it’s well-represented in LLM training corpora. That choice simultaneously prevented him from “cheating” with manual fixes and maximized the odds the model would produce idiomatic front-end code. The workflow mirrored how vibe coding is typically done: describe a change, let the model implement it, hot-reload, click around, and iterate through prompts. For backing services, he leaned on Firebase, exploring Firestore, Storage, and even the Realtime Database as new requirements emerged.

The early days delivered a huge productivity spike. The LLM produced a polished, responsive UI and clean CSS a backend-leaning developer would seldom craft quickly. Within two weeks, he had roughly 90% of the functionality working: navigation, screens, data flows, UI states, theming scaffolds, i18n stubs, and Firebase hooks. For rapid prototyping, vibe coding felt like magic.

Hitting the 90/10 Wall: When Iteration Becomes Frankenstein

The last 10% proved stubborn—and revealing. As Stephan layered in “just one more feature,” the model repeatedly refactored major surfaces: adding dark/light themes pushed a sweeping CSS variables update; internationalization prompted resource bundle wiring; deeper Firebase usage triggered cross-cutting data and caching changes. Each change was narrow in intent but broad in impact.

The result was architectural drift. Over time, the model introduced too many redirects and abstraction layers. Caches broke in non-obvious ways. Performance regressed. Despite the impressive UI, the codebase had turned into a deployment liability—a “Frankenstein” assembled from iterative patches rather than a coherent system. This is a common failure mode for vibe-coded apps at scale: local improvements without a global blueprint eventually collide, and production concerns (latency, caching, error handling, auth boundaries) don’t emerge cleanly from patch-by-patch edits.

For developers, the lesson isn’t that vibe coding fails—it’s that it excels at prototyping and discovery, not at converging on production-grade architecture. Without an explicit spec and integration contract, the model will keep “helpfully” refactoring, compounding complexity until performance and maintainability suffer.

Tooling Deep Dive: Local vs Cloud Models and CLI vs IDE

Stephan’s DevoxxGenie experience highlighted a practical hybrid model strategy. Local models are great for privacy, experimentation, and offline iteration; cloud models tend to offer stronger reasoning and broader context windows. By enabling quick switching—and even cross-model review—he gets the best of both. A useful pattern: prototype with a local model, then have a stronger cloud model review diffs, point out regressions, or propose refactors with explicit trade-offs.

On the ergonomics front, CLI-style assistants offer a focused, “head-down” loop for making changes, running, and inspecting output. But token caps and time-limited sessions shape your workflow; Stephan worked in multiple sessions per day and found a $100 budget sufficient for his sprint. IDE plugins bring tighter context and navigation but can be more opinionated or less flexible about model choice. His takeaway: match the tool to the task. Use CLI flows for rapid refactor-and-run cycles, then drop into the IDE for structured reviews, code navigation, and multi-file planning.

Regardless of tool, two practices helped: (1) keep prompts specific and scoped (“Add dark mode by introducing CSS variables and a theme switcher; do not change routing or state management”) and (2) ask the model to explain the implications of its changes (“What files did you touch? What perf or cache effects might this introduce?”). That meta-layer of reflection often surfaces hidden complexity before it bites.

Pivoting to Spec-Driven Development: Regain Control and Quality

To cross the last mile, Stephan moved from vibe coding to a spec-driven approach—letting the model build from a fixed blueprint rather than accrete changes organically. The shift starts with decisions that remove ambiguity: choose one primary Firebase store (e.g., Firestore vs. Realtime Database), define auth flows and token lifetimes, set the theming approach (CSS variables + a ThemeProvider), and lock an i18n strategy (resource bundles, keys, and fallback behavior).

A good spec bundles multiple layers: user stories with acceptance criteria; data models and schema constraints; API routes and error codes; routing structure; performance budgets (e.g., cold-start targets, cache TTLs, and redirect rules); and non-functional requirements like accessibility and offline behavior. Once those are explicit, you can ask the LLM to scaffold components against the spec and generate tests that enforce it. If you must change direction, regenerate whole components or modules against the updated spec instead of stacking incremental patches.

Finally, wire a review loop around the model. Have one model propose changes and another critique them. Ask for diffs with clear justifications. Run tests and a performance check after each major change. When the model drifts, point it back to the spec and request a reconcile (“Adjust to match the routing contract; do not introduce new abstractions”). In Stephan’s experience, this style produces maintainable code that deploys cleanly—without the routing loops, broken caches, and perf cliffs that plagued the vibe-only build.

Key Takeaways

  • Vibe coding is a prototyping superpower: Use it to explore UX, validate flows, and spike integrations quickly—especially in popular stacks like React that models know well.
  • Expect the 90/10 wall: The last 10% (perf, caching, auth, i18n correctness) exposes architectural drift. Patching via prompts compounds complexity.
  • Pivot to spec-driven when production is the goal: Lock data models, APIs, routing, theming, i18n, and non-functional requirements. Regenerate modules against the spec rather than endlessly refactoring.
  • Mix local and cloud models: Prototype with local LLaMA-family models, then switch to a stronger cloud model for reviews. Cross-model critique catches regressions early.
  • Be explicit in prompts and guardrails: Scope changes tightly, ask for impact analysis, and insist on diffs plus tests. Avoid vague “improve X” prompts that trigger broad refactors.
  • Choose tools by task: CLI assistants are great for fast iteration; IDE plugins shine for context-rich reviews. Budget for token/session limits and plan focused work blocks.
  • Don’t skip test and perf gates: Add acceptance tests for routes, caching, and auth flows. Define performance budgets and measure after each significant change.

Stephan’s bottom line: AI will get you to 90% shockingly fast—but shipping the last 10% reliably demands a spec, discipline, and a workflow that keeps the model aligned with your architecture.

Chapters

Trailer
[00:00:00]
Introduction
[00:01:10]
The Popularity and Challenges of Devoxx Conferences
[00:03:35]
Stefan's Journey with AI Dev Tools
[00:05:30]
The Vibe Coding Experiment
[00:08:01]
From Vibe Coding to Spec-Driven Development
[00:16:04]
The Importance of Specifications and Testing
[00:20:40]
The Future of Development: Vibe Coding vs. Spec-Driven
[00:25:12]
The Importance of Senior Developers in AI Projects
[00:31:51]
Security and Performance Considerations
[00:32:52]
Testing and Debugging Challenges
[00:34:20]
Maintaining Specifications and Documentation
[00:37:16]
Role of Specifications in Development
[00:39:11]
Future of Developer Roles and AI Integration
[00:43:07]
Preparing for Devoxx Belgium
[00:51:55]
Innovative Features for Devoxx Belgium
[00:55:03]
The Future of Developer Conferences
[00:57:16]
Conclusion and Final Thoughts
[01:02:52]