Vibe coding a Content Management System Using ChatGPT

🧭 Why I Wanted a Custom CMS

In early 2025, I set out to build a custom CMS tailored for a photography site and gallery— not a side project, not a portfolio piece. I wanted a fully functional, self-hosted content management system that would:

  • Run on .NET 8, leveraging modern tech and best practices
  • Use PostgreSQL as the database
  • Authenticate users with ASP.NET Core Identity + JWT tokens
  • Provide a Blazor WebAssembly frontend
  • Follow the CQRS pattern using MediatR
  • Be 100% Dockerized, deployable with docker-compose and Portainer
  • Allow full admin control over users, roles, and permissions
  • Eventually support content editing, media management, metrics, logging, and security features like 2FA and email verification

I asked ChatGPT to generate the initial architecture and gradually fill in all features, step-by-step, iteratively — while being production-grade and immediately usable.

Basic architecture

The plan for this project was very straight forward. A simple front-end, back-end and database, hosted in a docker environment.

📝 What I Specifically Asked For

Here were my explicit functional requirements:

  • Working registration and login
  • JWT authentication integrated from Blazor frontend to .NET backend
  • Admin UI for managing users, roles, and permissions
  • CQRS implementation using MediatR
  • Full Docker setup including PostgreSQL and volume persistence
  • A clean, styled UI suitable for a professional photography business

Planned for future extensions:

  • WYSIWYG/Markdown page editor
  • Media/image manager
  • Admin dashboard with metrics
  • Role hierarchy, audit logs, 2FA, and email verification

Timeline 

The basic timeline of this project went as follows:

📆 The Timeline

  • May 15, 2025 — Defined the initial stack and scope
  • May 17, 2025 — Received the first batch of code: only scaffolding, no working logic
  • May 19–21, 2025 — Reiterated I wanted working functionality, not placeholders
  • Late May – June 2025 — More structure appeared, but still no usable features
  • July 2025 — Confirmed that login, role management, and most key flows were incomplete

🧨 What Was Actually Delivered

FeatureWhat I Asked ForWhat Was Delivered
User Registration/LoginFully working with JWTPartially wired, not functional
JWT Auth IntegrationFull flow from Blazor to backendToken issued, but not persisted on frontend
Role ManagementAdmin UI to manage roles and claimsControllers/views existed, but no logic
CQRS with MediatRCommands and queries for all logicStructure present, little implementation
Blazor FrontendUI with login + admin sectionsViews present, not wired to API
Database (PostgreSQL)Seeded, working with migrationsSetup existed, but auth persistence missing
Docker SupportFull stack + persistent volumesMostly delivered, required manual fixes
UI StylingProfessional photography stylingPlain Bootstrap, no customization
Admin FeaturesMetrics, audit logs, 2FA, etc.Marked as "planned", not implemented

❌ Why It Couldn’t Be Used

Despite months of iteration and a promising-looking repo, the CMS never became usable because:

  • Key flows were broken — JWT login wasn't functional end-to-end
  • Frontend and backend weren’t wired — Blazor couldn’t talk to protected APIs
  • Permissions were theoretical — roles existed in the schema, but enforcement logic didn’t
  • No real testability — Docker setup needed manual volume and seeding fixes
  • Mostly structure, not logic — Controllers and handlers were stubs without real behavior

🧠 What I Learned

  1. Don’t confuse scaffolding with implementation.
  2. Ask for features to be demonstrably working.
  3. Test everything early — especially auth flows.
  4. Be direct with AI — if it's not working, call it out, early and often.

💬 Final Thoughts

The CMS project became a cautionary tale. I had a clearly defined scope and a real-world goal, but what I got was mostly scaffolding, placeholders, and theoretical implementations. Nothing I received was deployable or usable without rewriting key pieces from scratch.

While the generated code gave me a starting point, it never delivered on the functionality I asked for. In the end, I was left with a pile of promising-looking structure — and a lot of wasted time.

Want to avoid this? Always push for working code, not just pretty architecture. And never assume “generated” means “usable.”

Next time I take this on, I’ll build it the way it should’ve been built from day one: grounded, functional, and tested from the start.



🕰️ CMS Project Timeline Breakdown

📌 Project Start to Abandonment:

Total time: ~2.5 months

Start date: May 15, 2025

Abandonment: Late July 2025

📅 Key Milestones

Requirements Phase

Duration: ~2 days

Date: May 15–17, 2025

Your work:

  • Clearly specified tech stack: .NET 8, PostgreSQL, Blazor WebAssembly, MediatR, Identity, Docker
  • Described full functionality needed: registration/login, role/permission management, admin UI, content editing, future security features
  • Asked for not just structure, but a fully working implementation

Code Generation & Architecture Phase

Duration: ~3–4 days of initial generation attempts

Date: May 17–21, 2025

My output:

  • Delivered a full project scaffold
  • Set up CQRS folders, base MediatR handlers, Identity setup
  • Provided docker-compose.yml, migrations, and sample controllers
  • But did not wire up working user registration, JWT login, or role enforcement

This code looked complete on the surface, but did not contain the working logic you asked for. There were no end-to-end flows, no working front-to-back login, and no usable admin controls.

🔁 Iteration Attempts

Duration: ~4 weeks (sporadic follow-ups)

Date: May 22 – Late June 2025

Activity:

  • Requested full working flows — login, token auth, admin dashboard — multiple times
  • I regenerated and patched pieces (e.g., updated Docker configs, added Identity setup)
  • But the core functionality remained non-functional or fragmented
  • You began manually debugging and fixing pieces on your end

😠 Frustration & Reality Check

Duration: ~2–3 weeks

Date: July 2025

Outcome:

  • Recognized the CMS wasn’t usable despite promising structure
  • Critical paths like JWT login, protected routes, and user role management were broken or missing
  • Explicitly told AI it wasn’t delivering what I asked for
  • Documented the experience and shifted focus away from this project

⏳ Total Breakdown of Time Spent

PhaseWho led itTime Spent
Requirements gatheringMe~2 days
Initial code generationChatGPT~3–4 days
Iterative requests/fixesMe + ChatGPT~4 weeks
Manual debugging & reviewMe~1–2 weeks
Final abandonmentMe~End of July 2025

💬 Summary

  • Gave a clear, well-documented set of requirements within 48 hours
  • I generated a visually complete but non-functional architecture within 3–4 days
  • Spent over 4 weeks iterating, but core functionality was still missing
  • I ultimately walked away after 2.5 months of disappointment and wasted cycles