Skip to content
Samuel Tambunan's Blog
Go back

Playing with AI

AI assisted development

I’ve been using Claude quite extensively to vibe code an application. I wanted to try and use a language that I’m not familiar with, Rust, and get Claude to create an application for me.

For an experiment, I wanted to completely vibe code the application without looking at the source code to see how far I can go. This is very different than what I’m normally used to where I use AI to help me create functions on features I’m working on at work.

AI with things I care about

When it comes to using AI with things I really care about, I am very cautious with the code I submit and commit. Every PR that I create and is AI assisted is then reviewed by myself first before I mark it as ready. This step is important as I have strong feelings on how the code should look as I need to be able to understand and provide an explanation on how it works to other developers.

Using AI to help me create features and bounce ideas off it does improve my productivity, but at a smaller rate than people think. Every commit and line of code is personally reviewed by myself and I need to understand it before I can even push it up. Using this approach might be slower than vibe coding but I feel it helps me understand the code base better. I’m also thinking about the problem a bit more instead of rushing into solutions easily.

Vibe coding an application

For my personal projects, I’ve always been curious on how I can go with vibe coding. I decided to try and create a REST client and see how far I can go with just vibe coding. Since I wanted the application to be fast, I landed on using Rust. I then asked Claude to suggest a front end framework to use with Rust, and it landed on Tauri.

I’ve set up Claude to use Superpowers skill and also spec-kit github as I wanted to experiment with spec driven development. I haven’t added any other hooks to it but it could be something I experiment in the future. To track issues, I used github issues and gave Claude code enough permissions to read the issues, create PRs, and close issues properly.

Spec kit

I tested out speckit first by doing the standard /speckit-constitution, then specify, plan, task, and implementation.

Initially, it was pretty interesting to read all the specs and tasks. Some of the tasks are quite detailed. I’m still not convinced it’s better than plan mode or asking superpowers to plan an issue properly though.

My issue with the tasks is that after a while, I tend to gloss over everything and let Claude decide on my behalf. It didn’t feel like it was useful because most of the time I would just auto approve things and let claude complete the tasks.

There were a few occassions where I updated a task, but more often than not I just auto approved a lot of things.

After implementing about 20 features, my repo ended up with 20 different spec directories which I thought became a bit much. I’ve left the directories as is but I’m starting to wonder if it’s just additional overhead that agents now have to read. Since each directory contains multiple files, I feel that there could be a lot of context wasted if the agents keep on using spec kits.

Superpowers

Instead of using spec kit for the next 10 features, I decided to ask superpowers to plan things out, add the plan to the github issue, and then implement the feature.

This, just like using spec kit, was almost run on auto approve. When I don’t like how something is implemented, I would ask claude code to change it. Afterwards, implementation was almost always done with subagents as superpowers have a skill to encourage subagent driven development. An annoying thing with SDD is that claude always got confused and tried to use Opus or Fable to do SDD when it should be a differnet model. I had to explicitly add a prompt to always use Sonnet 5 with Max effort for it to use Sonnet 5 properly.

I didn’t bother using a lower effort mostly because I never managed to hit my session cap. I tend to prefer to use the maximum effort as I don’t want to fiddle around with features incorrectly implemented. On the odd occasion I did hit the session cap, I would be happy to wait.

Is it just a game

Even with the two approaches trying to force me to read the tasks, I ended up auto approving most things because it was really easy to do so. The REST client was built and although there were a few bugs, it was still a pretty decent client built from just vibe coding.

It did feel like a game though as I would try to maximise my sessions and try to time it correctly. On the times that I woke up early, I would send a simple request to Claude from my phone just to get a session started. This would give me more time in the morning to try something and a new session can be done a bit later near the afternoon.

For example, if I woke up at 5, I would send a simple request which would start my 5 hour session. Then by 10, i would be ready for a new session.

The last time I did something like this was when I played a video game that had daily activities. I would wake up, time it properly, and then finish the daily task when it got resetted.

I think in some ways, this can be quite addicting. When things become too easy, it essentially becomes a game as the deep understanding required to improve is never there. Using both spec kit and superpowers is really good for development, but I end up not fully understanding things. It feels like playing a mindless video game where very little thinking is required to do stuff. It feels good to have something up with very little effort. But in the long run, I’m not sure it’ll be good for me nor the application I’m building.

Quick learnings

I need to figure out how to use hooks to add resolved summaries to my issues. Whenever I create a PR, it closes the issues but there’s no quick summary on what is done. I think that would be beneficial as it’ll help me understand what was completed in the future.

I’ll also need to figure out a way to get SDD done properly using Sonnet 5. I don’t need to use Opus nor Fable to implement tasks as that kind of coding can be left to Sonnnet 5.


Share this post:

Next Post
AI Learnings