Yes, despite being an AI doom-speaker, I tried using a app-builder to make a simple, social-media-like, private, journalling web app. You can see it at https://yousky.veryuseful.app/. This post explains what I did and why, and outlines the development process I took, including the point at which I decided the AI wasn’t up to it and started making it manually. Let’s dive in!
So many things came together here. And it was interesting. I promise. Let’s split the title of this post into bits:
- A 1-person social media app
- A web app
- LLMs helped/hindered me
A 1-person social media app?
A while ago I came across Zeitgeist – a short-form, social-media-like app for journalling.
I’ll be the first to admit that I often find myself thinking “I should post this thought to social media”, when, actually, it would be best kept to myself.
But I have had my brain trained to sometimes have social-media-sized thoughts.
And when Zeitgeist came along it really scratched an itch! Short-form posts, quick to write, from my mobile, in a familiar interface, that give the dopamine hit of instant-posting, and the organisation of hashtags, but it’s just for me! Amazing
It’s a very clever idea and I like it a lot. With the one downside: I’m sure that one day I’m gonna type a private thought into the wrong app and publish something to the world accidentally.
A web app?
This kind of application is ripe for building using my FREE WEBSITES technique and using the principles of my Small, Static Web Apps Manifesto.
So I’d had it in mind to build a web-based tool like Zeitgeist for a while. This:
- would work on different operating systems;
- can work as an installable “Progressive Web App” (a website that functions very much like an app on your mobile device);
- wouldn’t cost anything.
This app would be completely private, using your browser’s local storage. There would be no login. Your data would only be on your device. There would be an export/backup and import feature to allow you to keep saves of your data. It has limitations, but it’s low risk for me and for you.
If you read my post yesterday about how you shouldn’t build personal web apps, you might be thinking “But Ross, you said you shouldn’t build something like this”. But this way of building web apps skirts many of the issues with building small personal apps:
- Hosting is free and uncomplicated and very easy to move – it’s just HTML, CSS and JS files.
- There is no back end to host.
- There are minimal dependencies, and those I use are carefully considered as being stable and well-supported.
- I don’t store data – you do! I store data in local storage. This doesn’t sync across devices, but it means I’m not responsible for it. It’s private. There’s no GDPR or data protection involved.
- Because I don’t store data there are no logins.
- The software can be “finished“.
- All the other things mean that support and maintenance is minimal.
I’m happy to build and publish apps like this because the burden is so very small.
LLMs helped/hindered me
As I mentioned in passing yesterday, I tried using Base44 to build this initially. So this was LLM-assisted. Well… was it? I’m not sure.
The LLM built a prototype, and wrote some code. Some of that remains. But a lot of it has changed. I honestly don’t know if this was faster with LLM assistance or not.
Here’s the process I went through:
Step 1: React prototype in Base44
I got all the functionality I wanted built with 4 prompts to Base44.
This created a web app in React and Tailwind.
I had specified “Can you make this so that it stores the posts in a JSON structure in local storage so that a back-end/database is not required.”
The app worked, but oh my goodness the infrastructure in place was so much overkill. React is just so low-level and the code you have to write to achieve something like this is just crazy. The developer is responsible for far too many things with React.
It needs the build process to bundle the code; it added a router; it added PWA meta tags and icon link elements to the head using JavaScript/React; and with all the useState and useEffect hooks flying around it was so hard to see what was going on, and reason about the code.
For me, it was not good. For a fluent, React expert it was probably fine. But this was too much code and not declarative enough for me.
I suspect Base44 just builds like this by default.
I wanted to rebuild in AlpineJS – a more declarative VueJS-like reactive framework. Could Base44 do that?
Step 2: Get Base44 to (kinda) rewrite in AlpineJS
My next prompt to Base44 was:
Can you rewrite this as a single-file app using AlpineJS? I don’t want React and I don’t want a build process. I just want editable HTML and JavaScript with libraries imported from CDNs. Tailwind is fine for styling.
Base44 sort-of did this. I guess it was somewhat impressive. But the app didn’t work. I couldn’t save a post in the app. And when I looked at the code I saw this:
export default function Home() {
return (
<div dangerouslySetInnerHTML={{ __html: `
<!DOCTYPE html>
<html lang="en">
...
This is not a single-file app that doesn’t use React and a build process. This is a React app that injects an entire single-file AlpineJS app onto the page.
Crazy – but I guess this is what Base44’s system prompts are doing behind the scenes – everything is a React app, even if it’s not.
Because the app didn’t work, I tried a few more prompts to try to get it fixed. But no dice. It couldn’t figure it out. I know better than Base44, and Base44 could only get me so far.
So I manually ejected from Base44 and made it my own.
Step 3: Manual rebuild and refactor
I copied the single-page file out of Base44’s editor, spun up a Git repository with my small site template, pasted the code in a split it into the right files, and got it all working locally. Not too hard.
I made some visual improvements, made some tiny functionality tweaks, and fixed the hashtags and mobile export.
Base44 had also done some weird stuff with Alpine. So I refactored and simplified it a bit, and switched from the code manually saving to local storage, to using Alpine’s persist plugin. Perhaps this is something the LLM just didn’t know about? Or perhaps because it manually did it in React, it carried that “context” forward into the Alpine app. Interesting either way.
I added a PWA manifest and cooked up a very simple icon.
And that was it.
The LLM only gets you so far
So… am I impressed? Not really. As I said at the start, I don’t know if this saved me time. Maybe I’d have built it by hand faster. But the LLM worked. It built something that functioned. It deserves credit for that.
I acknowledge that it’s a very simple app. Perhaps more time is saved with employing an LLM on a larger app. But then there is more risk of things going wrong with a larger app.
I also acknowledge that perhaps Base44 isn’t the best AI app builder. Maybe other tools would have done a better job. It certainly seems to have limitations in terms of what it can output.
But… isn’t that the point I was making in yesterday’s post? Someone who doesn’t know better doesn’t know about those limitations. They just see something that works, and they don’t know how, or if it’s any good, or if it’s going to throw them under a bus in one of multiple ways at some point in the future.
I understood the limitations. I ejected from Base44 when I hit them. I employed my own knowledge and expertise to make it what I knew it should be, and how I knew it should be. I had to take over and do the things that the LLM didn’t even know about.
(Aside: How a non-coder would have fixed the posting bug I don’t know… just keep prompting until it works? That doesn’t seem good!)
I’ve ended up with something that’s quite nice, despite it’s limitations. It’s not 100% done just yet. It needs polish. It needs a user guide! But you can go ahead and give it a try if you like.
Finally, this whole experience backs up what I said yesterday:
- You don’t want to make little personal apps…
- I, as a really experienced person in web dev world, have just about reached a place where I might want to
- I continue to see LLM’s as mediocre… It is still the case that whenever I dig in to things that LLMs have created, there are issues.
- And yes, I am ready for what comes next. Because I know the risks and pitfalls, I’ve built and hosted this in such a way that it will just continue to be without any real effort or cost from me. The LLM didn’t do that.
If you’re interested in the code, it’s on GitHub. The commit history shows how I got from the first version straight out of Base44 to what I have now. But it’s not very interesting really.