Category: tech

I knew what to build. I just didn’t know how, until AI.

Building Photo Declutter with Claude, Cursor, and a lot of iteration.

I had an idea for a photo organising app that would display random photos and allow you to just keep or delete them. I wanted it to be a slick native iOS app. Suddenly AI has allowed me to scratch that itch. Swipe right to keep, swipe left to mark for release, nothing gets deleted until you confirm it.

I’ve worked in UX for over 20 years and I’ve done UX for mobile apps, since right back when BlackBerry was a thing, and iPhone was released. My team designed the first SNCF iPhone app. So I know how important native apps are, and I didn’t think I would have the time to learn and implement a Swift app at 50. I knew what to build, just not how.

2026 will be the year of AI, that’s what I told myself in January. So I decided to stop resisting, and start really testing.

Initially I started talking to ChatGPT, finding out its limits, searching for a good way to prompt. I didn’t like it much at first, the tone bothered me. Asking it to remember not to use certain phrases helped, along with telling it to stop using hyperbole and praise.

I then started to ask what a good development workflow with AI might look like. Cursor came up, and I downloaded it and prompted a skeleton app on the advice of ChatGPT. Just get the main idea working. I wanted to access the photo library and to start counting how many photos there were, before shuffling the photos and displaying them for swiping to keep or release. This was the basis of the Photo Declutter idea.

“Most apps add more to your life. This one helps you let go of a little.”

I got a clean Xcode install set up first – always sanity-check before pointing an LLM at your project! Then I pointed Cursor to the same place and prompted it (with ChatGPT’s help) to make the bare-bones app. Then I quickly ran out of free credit on Cursor and I had to decide what I was going to pay for.

My initial feeling was just to subscribe to ChatGPT and work iteratively from there, so I did. I was quickly caught up in some strange hallucinations as it rewrote code with approximate variable names that forced me to think a bit too hard and challenge the responses too often. Asking around I realised Claude might be a better fit, and I eventually migrated completely to Claude as using projects with the source code worked really well to maintain sensible context. ChatGPT had worked nicely for generating some app images and the app icon though!

During this transition away from ChatGPT I had started to doubt if I could succeed – a lot of work was needed on the code still, and the looming product release and app review had me worried. Writing a product philosophy document, partly to give Claude context, partly to focus myself, helped.

I had considered Swift a bridge too far. Then I met Claude.

Immediately with Claude progress was better. In my history with ChatGPT I had a number of files that accelerated development : a philosophy document, a backlog, and a changelog story. So loading those into a project with some relevant source files meant I could immediately converse about the rest of the features that needed developing.

As I started to work with Claude the code base was becoming clearer to me too. I already had a hobbyist developer background, so gradually Swift was making sense to me, and the notions of views and stacks started to map to my thinking about HTML rendering and CSS constraints. I tested Claude Code on a separate project in parallel, and saw it could help, but I was reluctant to make it manage all my code since I was now into a nice LLM assisted manual iteration to finalise the app.

Developing an app is one thing – I now had swiping, sharing, check before release (deletion) and a fledgling statistics page working. Submission to the app store was necessary, and it costs 99€ to subscribe to Apple Developer program. I felt ready to take the plunge.

Getting onto the developer program wasn’t smooth, probably because the pipeline is full of AI-assisted people like me, hungry to start submitting apps. Probably loads of agent assisted bots also clogging up the pipeline too! So Apple took ages (like 2 weeks) to approve and I didn’t have access to test StoreKit (for a tip jar and an unlock feature that is little more than a bigger tip really, for those who really want custom timed sessions).

In the meantime there was lots to prepare anyway. An App Store description, screenshots from the app, and some marketing material. It’s not simply a case of launching an app and hoping everyone installs it… you have to push here and there. In particular it’s important to pay a lot of attention to the details of all the information you need to provide for an app submission, so that it will pass review. Many things are in fact required before you submit – including justification as to why you need access to the photo library and notifications, a good title and description, screenshots, and the signature of a number of agreements about payments and use (or not) of network access, cryptography and your tax status.

On the marketing side, any app is unlikely to make visibility even with a few seed installs; the virality is only via the “share” feature, but people who make shares might remove the link that’s automatically added anyway. I’ll look at promotion at a later date, but since this is a hobby project the main likely channel for big installation growth would be an article from a journalist, or a lucky review from a known YouTuber.

As I finished up screenshots and marketing planning, the use-case for Claude came to me. I realised it could help with a code review. So I pointed Claude Code to the project directory and asked it to check whether the app was submission-ready. Here the LLM was solid, flagging a couple of key points: describing why notification permission is needed was missing, and seeing that the code had some minor issues that needed attention. I let it auto-fix them while vetting each code change.

I let it auto-fix them while vetting each code change.

The user testing journey was interesting. In parallel to reviewing and finalising features I had the app sideloaded (installed directly from my Mac to iPhones via a USB cable) onto my phone and a couple of friends’ phones. I was pleasantly surprised by some initial reactions. The app really comes into its own when you see it acting on your own photos. Some useful feedback during testing led to adding safeguards. If you miss releasing photos at the end of a session, you can’t start a new one without confirming that your “to be released” pile can be forgotten about. An option to add to a collection “rediscovered” on double-tap was also inspired by user testing.

One thing missing that was brought up in testing – by my son – is a chance to rewind if you swipe a photo right (to keep it) but you wanted to delete it or add it to your collection. This has been backlogged as a feature for an upcoming release. The app philosophy doesn’t want to go too far into features though; simplicity is a key goal.

The app really comes into its own when you see it acting on your own photos.

The other thing in testing was that it’s not easy to get people to give you their phone to plug into your laptop, so close friends who trust you are really the only audience available. TestFlight helped eventually, though getting people to accept an invitation, install an app, and actually use it turns out to be its own small miracle.

The good news finally came, that the developer account was available (I had to call Apple to actually unblock the access, over a week after having paid the 99€). I started to get my build onto App Store Connect, and meticulously filled out all the information necessary to launch. Then I was ready for my first review. I submitted the app without in-app purchases for now, to see if it passed review. It did!

In the meantime I now had access to test StoreKit and set up my in-app purchases. The app isn’t meant to be a premium subscription experience or even paid, I just wanted a couple of mechanisms to make a little back on the time investment, and the Developer Program costs. So I thought a “buy me a coffee” tip on the about screen, and a once-off payment for custom session lengths would suffice. I set those up and added the code to make that all happen in a couple of short sessions.

The app is now live at v1.1 – in-app purchases are in place, but really the app is free for its main purpose: a daily ritual to declutter your photos and rediscover some great pictures from the archive on your phone.

I’m proud of where I’ve got in a short month since I started the project. I never imagined myself finding the time to become an iOS developer.

A friend pointed me toward Byung-Chul Han after seeing the app: his writing on the compulsion to accumulate, and the quiet value of letting things go, maps surprisingly well onto what I’d built by instinct. I’d arrived at the philosophy before I had the vocabulary for it.

Why it’s time to leave Twitter and move to the Fediverse

Elon Musk seems to be a bull in a china shop with his heavy-handed treatment of Twitter. Reflecting on the situation I have had an awakening of sorts – remembering my early Twitter follows like Aral https://mastodon.ar.al/@aral who stands up for data-independence and privacy.

Why should a money-losing massive single entity have a de facto monopoly on short message / microblogging service? Especially now that we may all have serious doubts about governance there.

I realise how much more reliant so many people, institutions and brands are on social media now. They don’t need to all be on a few key platforms (Twitter, Meta, LinkedIn…), but it suits them as they all vie for our attention in a few places. The early web wasn’t built on platforms. It was built on protocols – agreements as to how data could be exchanged via certain ways of formatting messages and exchanges between multiple small sites. I love the openness of the early web that brought us to where we are today. The foundations of everything are those open protocols: email, DNS, websites, etc.

For microblogging services we can exchange in similar ways via a distributed system. That is precisely what the Fediverse is. A collection of protocols to federate messaging, just like the original Internet. It’s been around for a long time. 

Twitter has gone crazy. It’s now overtly super-capitalist. Elon is making massive changes because the company is losing money. Precisely because Twitter has become the de facto platform – not protocol – for exchanging short messages among groups of like-minded people, and it’s free (so everyone goes there).

The cost of moving

I’m a big fan of a corner of Twitter where fans of the cue sport that is snooker hang out. Mutual follows and hashtag discovery have created a close group of fans. It’s cool that you can also connect to the players, referees and TV commentators. 

But I’m currently trying to move over to an open community.  There are a number of advantages. We can ban trolls, community wide. We won’t have an algorithm pushing adverts and “sponsored content”. We can push our own trending hashtags. We can control what we see in our local and federated timelines. We can be more inclusive. Imagine:

You’re not the product anymore. You’re a community member in your host’s ad-free server they pay for. There’s no venture capitalist payday coming for them. Everything you do here costs your host a little bit of money. Find out how you can chip in. https://tabletop.social/@JoeSondow

The downside is that it has to be on a private server (where someone is paying the hosting), or a paid-for service. Some people currently on Twitter aren’t available on Mastodon or other Fediverse sytems – yet. Perhaps that doesn’t matter so much once you start finding a community away from a platform that is pushing you shit you don’t want, because you use their service for free.

Some places are offering free accounts (as noted in the quote), though this may not be the best way to have a lasting presence. Taking control by paying a small subscription is a low price to pay for big freedom. 

Luckily I have a history of Linux server administration so I fired up a server in the cloud. I’ll shortly be writing about how I did this, on a server that costs around 10€ a month.

Handy Links

If you’re a snooker fan, you can request an account here: https://snooker.uk.to/ or if you don’t like snooker there’s a big list on https://joinmastodon.org/

A useful user guide for getting to know the basics: https://docs.framasoft.org/en/mastodon/User-guide.html 

Freebox Batch Video Conversion (mp4 to mkv)

mp4-to-mkv

I often have the problem of needing to convert a folder full of video files to a format compatible with my Freebox, without spending ages in front of my machine doing each video individually. This often happens when I have several takes from my mobile phone or camcorder as mp4 files. Here’s how I worked out how to do it. These instructions apply to Windows 7, and may also work elsewhere on Windows machines.

I have tailored these instructions for a generic encode that will work on Freebox (ADSL triple-play box in France) but since the resulting files stick to standards they should work on most set-top boxes and portable players, including phones and tablets except iPhone/iPad, which read mp4 natively anyway… The typical conversion required is from mp4 to mkv or avi; I prefer mkv for the Freebox as it has worked in more cases for me.

Continue reading

Using wear and tear to guide usability simplification

Worn Remote

The great thing about physical objects is wear and tear. The places you touch most wear down, an ideal indicator for the key functions in your remote interface. This type of observation has even led to abstract art such as the traces left by different iPad apps. You can tell a lot about how something is used by investigating these physical traces. Doing the research to collect that data can be fun, using heat maps, click tracking or even a screen cover and paint. The results of that research can be visually persuasive too. It’s pretty obvious from the photo on the left that play and fast-forward are the main used buttons. ON DEMAND is bigger, screaming at you to spend money on content… why isn’t the really useful button (play) in that simple central place? Did the big “on demand” button increase rentals?

Continue reading

Interactive Design Festival: notes from the WIF

I’ve just got back from the international interactive design festival, or WIF (from the original Webdesign International Festival). It’s a meeting of designers linked to the web and interaction (HCI) from around the world who come to talk about the latest trends and ideas.

I was on the jury for the design competition which gave student and corporate teams 24 hours to design a concept and create an interactive prototype. This year the subject was “the school of the future”. The entries were fascinating and most were impressive, especially given the limited time available.

Unusually for events like this, it takes place in Limoges, a town in the centre of France which is better known for porcelain and quiet country life than for international events. This gives it a different feel from the London and Paris roadshow corporate events, though it limits somewhat the audiences. Overall the WIF was a great experience and I hope to be able to attend next time it’s organised in an active capacity.

While the teams were busy sweating, I had some time to attend the many workshops and conferences (talks, really) and meet some very interesting design professionals. I thought I might share my notes, including my poor sketches which are nothing like the wonderful Sketch Notes by Eva Lotta Lamm.

Download them / view the PDF here => notes from the Wif 2012
Continue reading

WordPress Pharma Hack and Updates

Hacks Honey Lemon Flavour

WordPress is a fantastic platform, with an excellent plugin mechanism and the most usable admin interface I have seen. I know and have used several others including Joomla, Zope, Drupal, and old stuff you may not have heard of. The problem with being popular though is that you are likely to be a victim of more attacks. There’s a strange pharmaceutical spam attack out there, and it got me too. I first found out about it when Google emailed my with a possible hacking notice. Links like /valium-high were appearing in the Google results for this site, yet when I tried the links they were giving me a 404 (page does not exist) result. The sneaky thing is that the hack is cloaked, the link /valium-high did in fact work but only if accessed via a search engine spider (or search bot / Googlebot). So Google sees a strange page selling valium, whereas regular visitors see a boring “page not found”. Spammers use these techniques to help their own strange pages rank in Google.

Using “Fetch as Googlebot” in Google webmaster tools allowed me to confirm the cloaking issue. To clean the hack, and simulate a search crawler without resorting to publishing tests live to my domain, I used my own server and tested using a search engine crawler simulator on a custom subdomain.

After a lot of searching, including various scripts like lookforbadguys and advice on checking the database I still couldn’t find the bad code. I gave up forensics and just reinstalled a clean version of WordPress (often the best recourse if you can’t find the hack quickly). It then took me a while to get a few other files I needed (my theme, images, custom scripts) from the old install and make sure they were working correctly.

Since I was making updates, I finally brought this WordPress site up to date with a few changes to CSS to take full advantage of screen real estate. This humble template was less than 800 pixels wide. I am now using a 960 pixel grid which is a de facto standard on the web given larger screen resolutions. I hope you find it a little easier to read.

The Facebook Walled Garden?

Is anyone else concerned that the Internet is becoming a walled garden on Facebook, encouraging people never to leave the facebook site? People are more likely to read the Guardian now it’s a Facebook app. No doubt this is due to having to install the app to read content “read” by others – frictionless sharing as they call it. It means a lot more traction gained for Facebook, and a less neutral web experience.

Net neutrality is already wishful thinking, now that Google & Facebook dominate so much – do you even have a separate Instant Messaging / email app outside of Outlook at work? Are you aware that most of what you listen to and read will be shared automatically with your friends?

‎”As well as increasing traffic, the app is making our journalism visible to new audiences. Over half of the app’s users are 24 and under – traditionally a very hard-to-reach demographic for news organisations. The Facebook app is one of a number of successful launches by the Guardian in recent months as our ‘digital first’ strategy gains momentum. We’re delighted with the results.”
Andrew Miller, chief executive officer of Guardian Media Group

I must be an old grumpy git, since being on Facebook is frighteningly efficient at appealing to the younger demographic. I do get nostalgic about plain-text email with properly nested quoting wrapping at 74 characters, web pages that are visible anywhere on any device, and music that comes from analogue encoding on physical objects. Will appealing to the younger net users without embedding your content on Facebook be possible soon?

Happy New Year too!

Facebook Redesign and Change Aversion

Every time a major site with a big audience changes, there are always going to be detractors. Especially a site like Facebook. People spend a lot of time there, so interface changes are almost tantamount to moving stuff around in their lounge/den.

I think there are a number of issues with the new Facebook homepage. I’ve seen it before. It’s called feature creep. Lots of stuff all clamouring for your attention. Chat, realtime updates, top stories, the rest of the news, adverts, suggestions for friends, app updates, messages (FB-ized email) and notifications. Continue reading