#6 CloudSQL is prohibitively expensive (at least for small projects)

When I started setting up the cloud infrastructure for poketto.me, I didn’t give much thought to costs. I thought it was such a small project that it just wouldn’t matter. I launched a #CloudSQL (MySQL) database with pretty much the default settings and was quite happy with it – until I checked the billing dashboard a couple of days later and realised that I was already spending almost €4 per day on the database alone. 120 euros per month just for a few MySQL tables? That couldn’t be right. ...

July 6, 2025

#5 There’s no “npx cap remove” 🤦‍♂️

#Capacitor comes with a user-friendly command line interface. To add a new mobile platform to your project, simply run “npx cap add [android | ios]”. And to remove one? Exactly — you guessed it: 'npx cap remove...' But: That command isn’t implemented – for understandable reasons. The interesting thing is, though, that it's "plausible" that it would be there, right?. So it's not surprising that #Claude insists it exists. This once again highlights a major issue with LLMs that I just can’t shut up about: Just because what the chatbot says sounds 'plausible' doesn't mean it's correct. In the case of AI-assisted coding, that’s not such a big deal – you, the developer, will eventually realise that the AI was wrong. But what about the many other use cases where we blindly trust the AI and put whatever it says into action? 🤔 ...

July 5, 2025

#4 Multi-threaded webservers in Python: A rabbit hole you don’t want to get into.

Put simply, serving web requests properly in Python is not easy. poketto.me uses a fairly basic off-the-shelf stack (#Flask as a web framework and #SocketIO for websocket communication), and you would never guess the issues you could encounter with it. For starters, Flask comes with a built-in web server (“werkzeug”), which is convenient for development, but absolutely not for production (it even warns you in bright red). 🧵It runs on a single thread – I'm not kidding. This means it can only handle one web request at a time. If that request involves any actual work, such as extracting web content, it cannot handle any other requests at the same time. ...

July 4, 2025

#3 Building a Chrome Extension is easier than I thought — but still a bit of a hassle

To my surprise, building a Chrome Extension is technically quite straightforward. You need: A bit of HTML (the popup UI) A bit of JavaScript (your logic) And a $5 one-time fee to publish in the Chrome Web Store The Chrome Extensions API is pretty minimal, but it covers all the basics: ✅ You can persist data (e.g. auth tokens) ✅ You can query open tabs, grab the current URL ✅ You can even inject JavaScript into pages — though this last bit triggers stricter review from Google, especially if you request broad access (like "<all_urls>"). ...

July 3, 2025

#2 Extracting web content is still… messy.

You can talk about autonomous #AIAgents roaming the web and performing all kinds of tasks 'just as a human would' as much as you like, but technically, some of the very basics are still lacking. For example, there is no free, easy-to-use, off-the-shelf solution for extracting web content. Here’s what I mean: Think of poketto.me as a very basic 'agent': you tell it to save a URL, and then it talks to the website 'on your behalf' to access its content. For this use case, the Newspaper3k Python library is pretty good: it teases out structured metadata, but occasionally misses basic things like the content language. To retrieve the actual content, Trafilatura ( https://github.com/adbar/trafilatura) appears to be the best option at the moment. However, even that doesn't work well with all sites. For edge cases, I actually had to fall back on parsing the raw HTML myself using Beautiful Soup ( https://beautiful-soup-4.readthedocs.io/en/latest/). (And yes, I’m sending that through an LLM later to streamline the content so all the tiny formatting issues Trafilatura introduces get smoothed out again.) ...

July 2, 2025

#1 Hybrid apps & social logins: tread carefully.

Remember when I talked about “Sign in with Google?” That works really well on the web, but: Once you’re wrapping your web app into a native mobile app, things turn very ugly very soon. In a hosted WebView, Google won’t let you render the sign in button to begin with – unless you override the WebView’s user agent string. After that, you’re still screwed if you rely on the default sign in workflow as this would open a popup window from which the user then can’t navigate back into your app. ...

July 1, 2025