AI is taking over the world. Ideas that once were nothing but imagination floating in the air can now be turned into actual products that anyone around the world can use with a simple thought. If you had the chance—the opportunity—wouldn't you want to create the next billion-dollar product without having to spend thousands of dollars hiring engineers? Well, if that's your dream, let me take you down a little rabbit hole I stumbled into while trying to automate markdown to PDF.
FYI, this hook was written with speech-to-text using Wispr Flow.
Where it all began - The problem🤔
Earlier tonight, I was chaining a couple of prompts using NotebookLM and Claude. To make a long story short, the output I wanted was in markdown that I would parse into a Doc for a final PDF file. The flow was going well until I noticed that Claude wasn't delivering the result I needed. At that exact moment, I decided to test ChatGPT and Gemini—both failed.
Alternatively, I found a web app that did exactly what I needed, until I had to modify my text, which triggered a paywall. Not good! I didn't like that one bit, and I was too tired after a long week of work to dive into a research rabbit hole. Furthermore, I was bored. Thus, an idea popped into my head—Eureka! Let's just build the solution.
Time constraint
It's 7 PM Friday night, the kids have too much energy, and the holiday vacation has begun. Should I do this from scratch? Yes, maybe—but wait! That's when I remembered: vibe coding was a "thing," and although I see that feature literally every day, I'd never attempted it even once. The opportunity presented itself, and I had to seize it! And I did!
The Plan
I know how this goes—I've seen it before. First, you must start with a plan. So I toggled the agent panel and gave it some basic instructions, starting with a short markdown file:
# Project objective
user types in markdown compatible text field and it shows formatted preview on the right half of the screen.
The formatted preview can be converted to pdf and downloaded.
# infrastructure
- Monorepo
# frontend
- Nextjs 16
- Tailwindcss
- Shadcn
# backend
- trpcs
- supabaseFrom there, I started guiding it to build a plan for the solution: adding packages, system design, UI components, state management, auth, ORM, tRPC! That resulted in:
# Project objective
user types in markdown compatible text field and it shows formatted preview on the right half of the screen.
The formatted preview can be converted to pdf and downloaded.
---
# infrastructure
- Turbo repo
- monorepo
- Bun (package manager and runtime)
## Frontend
- NextJs 16
- TailwindCSS
- Google Fonts (Google Sans, Google Sans Flex)
- Zustand - State management ([docs](https://zustand.docs.pmnd.rs/getting-started/introduction))
- ShadCN
- Craft Design System - Layout components and prose handling ([docs](https://craft-ds.com/), [GitHub](https://github.com/brijr/craft))
- @react-pdf/renderer
## Backend
- tRPC
- Drizzle
- Supabase
- Supabase Auth - User authentication
## Environment Management
- @t3-oss/env-nextjs - Type-safe environment variables with Zod validation
---
# Architecture Principles
1. **Organize by Features** - Each entity has its own feature folder with components, hooks, server, client, types, constants, utils
2. **Single Responsibility** - Components render 1 thing, hooks do 1 thing, utilities do 1 thing
3. **Component Hierarchy** - Page components → Feature components → UI components
4. **Fetch at Navigation Layer** - Fetch in server components/loaders, pass data down (or through React Query)
5. **Shared Feature Folder** - `features/shared` for shared UI components, hooks, types, server functions
6. **Lib Folder** - Low-level utilities (database, env, 3rd party clients) outside features
Let's give it a try

It didn't go as well as I thought it would—disappointed, but what did I expect? AI, let me scratch that, Large Language Models (LLMs) are bad with complexity, and to be honest, this isn't even that complex. On the bright side, it did build the foundation on which I will expand. But first, let me fix the errors:
- Import paths
- Monorepo workspace paths
- Packages and Features in the wrong directory
Conclusion of part 1
LLMs are good at simple tasks and not good with what constitutes complexity for their capabilities. Don't get me wrong—they can build monsters—however, they can only successfully build what they've been trained on. Anything else is guessing where each piece of the puzzle fits. In short, they best serve their purpose as a tool that accelerates steps taken by a developer, writer, or noob to achieve a specific goal.
And I sure as hell will make it assist me!
I'll be back with more on this little adventure later. Time for Claude to correct this post draft. 😂
