<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Johan Eklund</title>
    <description>The latest articles on DEV Community by Johan Eklund (@jagduvi1).</description>
    <link>https://dev.to/jagduvi1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3862377%2F9d657778-74f3-441f-8ab0-47d7b18822cf.png</url>
      <title>DEV Community: Johan Eklund</title>
      <link>https://dev.to/jagduvi1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jagduvi1"/>
    <language>en</language>
    <item>
      <title>How I Built an 80,000-Line Open Source Wine Cellar App in 6 Weeks with Claude</title>
      <dc:creator>Johan Eklund</dc:creator>
      <pubDate>Sun, 05 Apr 2026 14:51:05 +0000</pubDate>
      <link>https://dev.to/jagduvi1/how-i-built-an-80000-line-open-source-wine-cellar-app-in-6-weeks-with-claude-3fd</link>
      <guid>https://dev.to/jagduvi1/how-i-built-an-80000-line-open-source-wine-cellar-app-in-6-weeks-with-claude-3fd</guid>
      <description>&lt;p&gt;I'm a wine collector. I'm also a developer. And like most developers, when I couldn't find an app that did what I wanted, I built my own.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;Cellarion&lt;/strong&gt; — a full-featured, self-hosted wine cellar management app. Free, open source, and built almost entirely with Claude as my coding partner.&lt;/p&gt;

&lt;p&gt;In about 6 weeks, we went from zero to a production app with 80,000+ lines of code, 40 database models, 47 API routes, 290+ commits, and real users. Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I tried a few wine cellar apps. They all had the same issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your data was locked in. Exporting was either impossible or deliberately painful.&lt;/li&gt;
&lt;li&gt;Features were paywalled — sometimes basic ones.&lt;/li&gt;
&lt;li&gt;They didn't let me visualize my actual cellar layout.&lt;/li&gt;
&lt;li&gt;No community-driven wine database. Every user entering the same wines manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I opened a terminal and started building.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;I went with a classic MERN stack, containerized with Docker Compose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB&lt;/strong&gt; + Mongoose for data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express.js&lt;/strong&gt; for the API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React 19&lt;/strong&gt; for the frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meilisearch&lt;/strong&gt; for fuzzy wine search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; to tie it all together&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rembg&lt;/strong&gt; (Python/Flask) for automatic wine label background removal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing exotic. Proven tools that work well together and are easy to self-host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Claude
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. I didn't build this alone. Claude was my development partner from day one — not as a code generator I copy-paste from, but as a genuine collaborator.&lt;/p&gt;

&lt;h3&gt;
  
  
  What that actually looks like
&lt;/h3&gt;

&lt;p&gt;A typical session: I describe what I want at a high level. Claude reads the existing codebase, understands the patterns, and implements it — backend route, frontend page, database model, tests. Then I review, test, and we iterate.&lt;/p&gt;

&lt;p&gt;Some examples from the last few weeks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I want users to be able to share their cellar with friends and family"&lt;/strong&gt;&lt;br&gt;
Claude implemented the full sharing system — invite by email, role-based permissions (viewer/editor/admin), pending share resolution when someone registers, notifications, and the UI for managing it. Across maybe 15 files. In one session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"The wine detail pages need structured data for Google"&lt;/strong&gt;&lt;br&gt;
Claude added JSON-LD schema markup, Open Graph meta tags, a server-side pre-rendering route for crawlers, and a sitemap generator. When Google Search Console flagged an issue with Product schema on wines without reviews, Claude diagnosed it and fixed it the same day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I want a 3D view of the cellar"&lt;/strong&gt;&lt;br&gt;
This one was fun. Claude built an interactive 3D cellar visualization where you can explore your racks, see bottles placed in their slots, and navigate around. Using Three.js and React Three Fiber, integrated with the existing rack and bottle data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Claude is actually good at
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Understanding context.&lt;/strong&gt; It reads your codebase and follows your patterns. My API routes all follow the same structure, and Claude picks that up immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack thinking.&lt;/strong&gt; It doesn't just write a backend endpoint — it writes the model, the route, the API client function, the React page, and the tests. All consistent with the existing code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The boring stuff.&lt;/strong&gt; GDPR compliance, data export endpoints, audit logging, rate limiting, input validation. The stuff you know you need but really don't want to write. Claude does it thoroughly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iteration speed.&lt;/strong&gt; I can describe a feature, get a working implementation, test it, and ship it in a single session. That feedback loop is incredible for a solo/small team.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it's not
&lt;/h3&gt;

&lt;p&gt;Claude isn't magic. I still need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Know what I want.&lt;/strong&gt; Claude is a great builder, but you need to be the architect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review everything.&lt;/strong&gt; It makes mistakes. It sometimes over-engineers. It occasionally misses edge cases that only a domain expert would catch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make product decisions.&lt;/strong&gt; Which features matter? What's the right UX? What should be free vs. paid? That's all human judgment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test in production.&lt;/strong&gt; Docker, real data, real users — no AI replaces that.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Going Open Source
&lt;/h2&gt;

&lt;p&gt;This was a deliberate choice. If your biggest complaint about existing apps is data lock-in, you'd better put your money where your mouth is.&lt;/p&gt;

&lt;p&gt;Cellarion is AGPL-3.0. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-host it on your own server&lt;/li&gt;
&lt;li&gt;Fork it and modify it&lt;/li&gt;
&lt;li&gt;Contribute features back&lt;/li&gt;
&lt;li&gt;Export all your data whenever you want&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hosted version at &lt;a href="https://cellarion.app" rel="noopener noreferrer"&gt;cellarion.app&lt;/a&gt; is there for people who don't want to run Docker on a VPS, but the code is the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the App
&lt;/h2&gt;

&lt;p&gt;After 6 weeks of building, here's what Cellarion can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cellars &amp;amp; Racks&lt;/strong&gt; — Create cellars with customizable rack layouts that match your real setup. Place bottles in specific slots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Cellar View&lt;/strong&gt; — Explore your cellar in an interactive 3D environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Wine Database&lt;/strong&gt; — Search a community-maintained database instead of entering wine details manually every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drink Windows&lt;/strong&gt; — Maturity tracking so you know when a wine is ready to drink, at its peak, or past it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statistics&lt;/strong&gt; — See your collection broken down by region, grape, country, value, and more. Including a world map.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cellar Sharing&lt;/strong&gt; — Invite family or friends to view or manage your cellar together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label Scanning&lt;/strong&gt; — Take a photo of a wine label and let AI identify the wine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Data Export&lt;/strong&gt; — One click and you have all your data. No lock-in, ever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GDPR Compliant&lt;/strong&gt; — Proper consent management, data portability, and right to deletion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to build&lt;/td&gt;
&lt;td&gt;~6 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;td&gt;80,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commits&lt;/td&gt;
&lt;td&gt;290+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database models&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API routes&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend tests&lt;/td&gt;
&lt;td&gt;266&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend tests&lt;/td&gt;
&lt;td&gt;335&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosted version:&lt;/strong&gt; &lt;a href="https://cellarion.app" rel="noopener noreferrer"&gt;cellarion.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/jagduvi1/Cellarion" rel="noopener noreferrer"&gt;github.com/jagduvi1/Cellarion&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-host:&lt;/strong&gt; &lt;code&gt;docker-compose up --build&lt;/code&gt; and you're running&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're into wine, give it a try. If you're a developer, check out the code. And if you find something missing, open an issue — or better yet, a PR.&lt;/p&gt;

&lt;p&gt;I'd love to hear what you think.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
