This is lovely, claude code is a great tool for creating software for a user of 1. Personal software that runs locally (or on your own website in your case) and works exactly you want without it doing anything you don't want.
One-off scripts and single page html/css/js apps that run locally are fantastically accessible now too.
As someone who doesn't code for a living, but can write code, I would often go on hours/day long side quests writing these kind of apps for work and for my personal life. I know the structure and architecture but lack the fluency for speedy execution since I'm not writing code everyday. Claude code fills that speed gap and turned my days/hours long side quests into minutes for trivial stuff, and hours for genuinely powerful stuff at home and at work.
These are the perfect size projects vibe coding is currently good for.
At some point you hit a project size that is too large or has too many interdependencies, and you have to be very careful about how you manage the context and should expect the llm to start generating too much code or subtle bugs.
Once you hit that size, in my opinion, it's usually best to drop back to brainstorming mode, only use the llm to help you with the design, and either write the code yourself, or write the skeleton of the code yourself and have the llm fill it in.
With too much code, llms just don't seem able yet to only add a few more lines of code, make use of existing code, or be clever and replace a few lines of code with a few more lines of code. They nearly always will add a bunch of new abstractions.
I agree with you as far as project size for vibe-coding goes - as-in often not even looking at the generated code.
But I have no issues with using Claude Code to write code in larger projects, including adapting to existing patterns, it’s just not vibe coding - I architect the modules, and I know more or less exactly what I want the end result to be. I review all code in detail to make sure it’s precisely what I want. You just have to write good instructions and manage the context well (give it sample code to reference, have agent.md files for guidance, etc.)
There actually is a term for this LLM-assisted coding/engineering. Unfortunately it has been pushed away by the fake influencer & PR term "vibe coding" which conflates coding with unknowledgeable people just jerking the slot machine.
Engineering code now is not just binary, it's a spectrum from vibe-coding through copilot-style (design and coding assistance) to your help-with-design-only to no-AI.
The capabilities now are strong enough to mix and match almost fully in the co-pilot range on substantial projects and repos.
Or you can apply software architecture methods that are designed to help humans with exactly the same type of problems.
Once your codebase exceeds a certain size, it becomes counter-productive to have code that is dependent on the implementation of other modules (tight coupling). In Claude Code terms this means your current architecture is forcing the model to read too many lines of code into its context which is degrading performance.
The solution is the same as it is for humans:
"Program to an interface, not an implementation." --Design Patterns: Elements of Reusable Object-Oriented Software (1994)
You have to carefully draw boundaries around the distinct parts of your application and create simple interfaces for them that only expose the parts that other modules in your application need to use. Separate each interface definition into its own file and instruct Claude (or your human coworker) to only use the interface unless they're actually working on the internals of that module.
Suddenly, you've freed up large chunks of context and Claude is now able to continue making progress.
Of course, the project could continue to grow and the relatively small interface declarations could become too many to fit in context. At that point it would be worthwhile taking a look at the application to see if larger chunks of it could be separated from the rest. Managing the number and breadth of changes that Claude is tasked with making would also help since it's unlikely that every job requires touching dozens of different parts of the application so project management skills can get you even further.
I think this limitation goes away as long as your code is modular.
If the Ai has to read the entire code base each time, sure but if everything is designed well then it only needs to deal with a limited set of code each time and it excels at that.
One thing I’ve noticed building a small “use it and leave” tool is that the models tend to self-select into roles.
For me, Codex ended up being the reliable executor for actual logic and glue code, while Claude Code (especially the frontend design skill) was much better at overall UI structure, spacing, and interaction flow. I stopped trying to make one model do everything and just let them do what they seemed naturally good at.
This only worked because the project was tiny and mostly stateless — once scope or dependencies grow, the coordination cost goes up fast. Curious if others have seen a similar split in practice, or if this is just project-type dependent.
Neat. I also used to make a simple "bookshelf" web page each year for the books I read, but mine were fully static HTML and nowhere near as fancy as this.
Vibe coding has really helped me explore skills outside of my comfort zone which can then be applied in combination with other existing skills or interests in new ways.
In the case of your project, I imagine that now that you can gather data such as books from an image of a bookshelf, you can do something similar in infinite other ways.
Sometimes when I’m vibe coding I feel like Ender from Ender’s Game and even though I’m making a stupid web app, I’m actually somehow actually winning a battle across the universe.
Something you don’t really mention in the post is why do this? Do you have an end goal or utility in mind for the book shelf? Is it literally just to track ownership? What do you do with that information?
Very very cool. It's surprisingly difficult to find applications for organizing reading material, and also to actually read them. My current "good enough" solution is just Apple Books, but I've been meaning to make a similar application for this :)
That’s really cool, and a great use-case for vibe coding!
I’ve been vibe-coding a personalized outliner app in Rust based on gpui and CRDTs (loro.dev) over the last couple days - something just for me, and in a big part just to explore the problem space - and so far it’s been very nice and fun.
Especially exploring multiple approaches, because exploring an approach just means leaving the laptop working for an hour without my attendance and then seeing the result.
Often I would have it write up a design doc with todos for a feature I wanted based on its exploration, and then just launch a bash for loop that launches Claude with “work on phase $i” (with some extra boilerplate instructions), which would have it occupied for a while.
So many systems are fault-tolerant, and it’s great to remember that in a world where LLMs introduce new faults. Kudos to OP for this mindset; more anti-AI posters would benefit from sitting with the idea from time to time.
So many people's lives would be better if 90% of their daily tasks could be automated by LLMs, letting them spend more time doing the hard 10% properly.
This is such a coincidence. I had the same idea a few days ago and also vibe coded a library using Claude. https://nindalf.com/books. The original version of this was meant to encourage me to read more, and I'm pleased to say it succeeded. I hit my goal for the year after a couple of lean years. I also like looking at my highlights and notes and this UI makes it easier to read them.
My experience with Claude was mostly very good. Certainly the UI is far better than what I'd come up with myself. The backend is close to what I'd write myself. When I'm unhappy I'm able to explain the shortcomings and it's able to mostly fix itself. This sort of small-scale, self-contained project was made possible thanks to Claude.
Other times it just couldn't. The validation for the start and end dates it decided was z.string().or(z.date()).optional().transform((val) => (val ? new Date(val) : undefined)). It looked way too complex. I asked if it could be simplified, Claude said no. I suggested z.date().optional(). Claude patiently explained this was impossible. I tried it anyway, it worked. Claude said "you're absolutely right!". But this behaviour was the exception rather than the rule.
This is neat. How do you fill this in? I assume the highlights and notes come from a Kindle or similar reader.
I also have a bookshelf (fully manual, in another comment), and I’m looking for better ways for retention. I do highlights but I rarely do notes. Also with audiobooks I have yet to find a good way to do this outside of my text note for each book I’m reading/listening-to.
I really love how the bookshelf display looks. Most sites just use a standard grid for books, which can feel a bit cookie-cutter. The way you’ve mixed in stacked and bookend-style arrangements is a breath of fresh air, it really stands out.
Wonderful project, Marius! :) I shared it with my brother who has a lot of books and tracks them in his own little app. Keep up the great work! So happy to see you around!
The size boundary point is real. Once projects get past a few thousand lines, you stop vibe coding and start managing intent and context again. At that stage the LLM becomes more of a fast junior than a magic wand.
For a community that prides itself on depth of conversation, ideas, etc. I'm surprised to so much praise for a post like this. I'll be the skeptic. What does it bring to you to vibe code your vibe shelf?
To me, this project perfectly encapsulates the uselessness of AI, small projects like this are good learning or relearning experience and by outsourcing your thinking to AI you deprive yourself of any learning, ownership, or the self fulfillment that comes with it. Unless, of course, you think engaging in "tedious" activities with things you enjoy have zero value, and if getting lost in the weeds isn't the whole point. Perhaps in one of those books you didn't read, you missed a lesson about the journey being more important than the destination, but idk I'm more of a film person.
The only piece of wisdom here is the final sentence:
66 comments
[ 2.2 ms ] story [ 70.5 ms ] threadOne-off scripts and single page html/css/js apps that run locally are fantastically accessible now too.
As someone who doesn't code for a living, but can write code, I would often go on hours/day long side quests writing these kind of apps for work and for my personal life. I know the structure and architecture but lack the fluency for speedy execution since I'm not writing code everyday. Claude code fills that speed gap and turned my days/hours long side quests into minutes for trivial stuff, and hours for genuinely powerful stuff at home and at work.
At some point you hit a project size that is too large or has too many interdependencies, and you have to be very careful about how you manage the context and should expect the llm to start generating too much code or subtle bugs.
Once you hit that size, in my opinion, it's usually best to drop back to brainstorming mode, only use the llm to help you with the design, and either write the code yourself, or write the skeleton of the code yourself and have the llm fill it in.
With too much code, llms just don't seem able yet to only add a few more lines of code, make use of existing code, or be clever and replace a few lines of code with a few more lines of code. They nearly always will add a bunch of new abstractions.
You can be explicit about these things.
But I have no issues with using Claude Code to write code in larger projects, including adapting to existing patterns, it’s just not vibe coding - I architect the modules, and I know more or less exactly what I want the end result to be. I review all code in detail to make sure it’s precisely what I want. You just have to write good instructions and manage the context well (give it sample code to reference, have agent.md files for guidance, etc.)
The capabilities now are strong enough to mix and match almost fully in the co-pilot range on substantial projects and repos.
Once your codebase exceeds a certain size, it becomes counter-productive to have code that is dependent on the implementation of other modules (tight coupling). In Claude Code terms this means your current architecture is forcing the model to read too many lines of code into its context which is degrading performance.
The solution is the same as it is for humans:
You have to carefully draw boundaries around the distinct parts of your application and create simple interfaces for them that only expose the parts that other modules in your application need to use. Separate each interface definition into its own file and instruct Claude (or your human coworker) to only use the interface unless they're actually working on the internals of that module.Suddenly, you've freed up large chunks of context and Claude is now able to continue making progress.
Of course, the project could continue to grow and the relatively small interface declarations could become too many to fit in context. At that point it would be worthwhile taking a look at the application to see if larger chunks of it could be separated from the rest. Managing the number and breadth of changes that Claude is tasked with making would also help since it's unlikely that every job requires touching dozens of different parts of the application so project management skills can get you even further.
For me, Codex ended up being the reliable executor for actual logic and glue code, while Claude Code (especially the frontend design skill) was much better at overall UI structure, spacing, and interaction flow. I stopped trying to make one model do everything and just let them do what they seemed naturally good at.
This only worked because the project was tiny and mostly stateless — once scope or dependencies grow, the coordination cost goes up fast. Curious if others have seen a similar split in practice, or if this is just project-type dependent.
Side note: I once wrote about recreating Delicious Library: https://dingyu.me/blog/recreating-delicious-library-in-2025
Vibe coding has really helped me explore skills outside of my comfort zone which can then be applied in combination with other existing skills or interests in new ways.
In the case of your project, I imagine that now that you can gather data such as books from an image of a bookshelf, you can do something similar in infinite other ways.
I wonder if you could develop this as an add on to Hardcover.app - you could fetch people's books, images, and display the bookshelf.
All the data seems to be there:
https://hardcover.app/@BenHouston3D/books/read?order=owner_l...
SerpAPI provides a very valuable programmatic access to search that Google are hell bent on never properly providing
Something you don’t really mention in the post is why do this? Do you have an end goal or utility in mind for the book shelf? Is it literally just to track ownership? What do you do with that information?
I’ve been vibe-coding a personalized outliner app in Rust based on gpui and CRDTs (loro.dev) over the last couple days - something just for me, and in a big part just to explore the problem space - and so far it’s been very nice and fun.
Especially exploring multiple approaches, because exploring an approach just means leaving the laptop working for an hour without my attendance and then seeing the result.
Often I would have it write up a design doc with todos for a feature I wanted based on its exploration, and then just launch a bash for loop that launches Claude with “work on phase $i” (with some extra boilerplate instructions), which would have it occupied for a while.
So many systems are fault-tolerant, and it’s great to remember that in a world where LLMs introduce new faults. Kudos to OP for this mindset; more anti-AI posters would benefit from sitting with the idea from time to time.
So many people's lives would be better if 90% of their daily tasks could be automated by LLMs, letting them spend more time doing the hard 10% properly.
This is the right mindset.
My experience with Claude was mostly very good. Certainly the UI is far better than what I'd come up with myself. The backend is close to what I'd write myself. When I'm unhappy I'm able to explain the shortcomings and it's able to mostly fix itself. This sort of small-scale, self-contained project was made possible thanks to Claude.
Other times it just couldn't. The validation for the start and end dates it decided was z.string().or(z.date()).optional().transform((val) => (val ? new Date(val) : undefined)). It looked way too complex. I asked if it could be simplified, Claude said no. I suggested z.date().optional(). Claude patiently explained this was impossible. I tried it anyway, it worked. Claude said "you're absolutely right!". But this behaviour was the exception rather than the rule.
I also have a bookshelf (fully manual, in another comment), and I’m looking for better ways for retention. I do highlights but I rarely do notes. Also with audiobooks I have yet to find a good way to do this outside of my text note for each book I’m reading/listening-to.
> Claude did not invent that idea. It executed it.
> Claude handled implementation. I handled taste.
This style of writing always gets me now :)
> I started asking for things I did not need.
For a community that prides itself on depth of conversation, ideas, etc. I'm surprised to so much praise for a post like this. I'll be the skeptic. What does it bring to you to vibe code your vibe shelf?
To me, this project perfectly encapsulates the uselessness of AI, small projects like this are good learning or relearning experience and by outsourcing your thinking to AI you deprive yourself of any learning, ownership, or the self fulfillment that comes with it. Unless, of course, you think engaging in "tedious" activities with things you enjoy have zero value, and if getting lost in the weeds isn't the whole point. Perhaps in one of those books you didn't read, you missed a lesson about the journey being more important than the destination, but idk I'm more of a film person.
The only piece of wisdom here is the final sentence:
> Taste still does not [get cheaper].
Though, only in irony.