<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Cyber-Jack journal</title>
    <link>https://cyber-jack.uk/journal/</link>
    <atom:link href="https://cyber-jack.uk/journal/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Building a small UK indie app studio in public. Weekly honest posts on what's shipping, what's broken, and what the numbers actually look like.</description>
    <language>en-GB</language>
    <lastBuildDate>Thu, 11 Jun 2026 00:00:00 +0000</lastBuildDate>
    <generator>cyber-jack journal-poster</generator>
    <item>
      <title>Building for the high street, not just the app store</title>
      <link>https://cyber-jack.uk/journal/apps-for-the-high-street/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/apps-for-the-high-street/</guid>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      <description>Most of what I make is a consumer app you download. This week I pointed the same machinery at local businesses instead, and shipped two web apps that live on a shop&#x27;s own site - no app store in sight.</description>
      <content:encoded><![CDATA[<p>Almost everything I have built so far is a consumer app: something a person downloads from a store and uses for themselves. This week went the other way. I built two apps for small businesses instead, and neither of them touches an app store. They run in a browser, on the business's own website, and that turns out to change everything about how they get made and sold.</p>
<h2>A booking app that does not take a cut</h2>
<p>The first is called <a href="https://cyber-jack.uk/apps/snug/">Snug</a>. It lets a small place take bookings directly on its own site. The problem it goes after is a quiet tax that independent guest houses and B&amp;Bs pay every single month: the big booking sites skim fifteen to eighteen percent off the top of every reservation. For a four-room place that is real money, gone, on bookings the owner often sourced themselves.</p>
<p>Snug takes a small flat fee instead of a cut, so the owner keeps the booking. Along the way it grew a second personality. The same engine that books a room for two nights also books a place on a six-week course, so it now works for a dog-training academy just as well as a guest house. You can see both: a <a href="https://cyber-jack.uk/apps/snug/book.html?p=llechwen">room booking</a> and a <a href="https://cyber-jack.uk/demos/puppyandfriends/book.html">class booking</a> running live, each themed to a different business.</p>
<h2>A menu the kitchen actually controls</h2>
<p>The second is <a href="https://cyber-jack.uk/apps/carte/">Carte</a>, a digital menu for cafes and restaurants. A printed menu goes stale the moment a price changes or a dish sells out, and reprinting costs money every time. Worse, UK food law requires every dish to declare its allergens, and a flat PDF behind a QR code does nothing to help a nervous diner actually find what they can safely eat.</p>
<p>Carte carries the fourteen named allergens on every dish, so a diner can tap once to hide anything they react to. When something sells out, the kitchen marks it gone and it vanishes from the menu instantly. The <a href="https://cyber-jack.uk/apps/carte/menu.html?v=terracecafe">live demo</a> is a seaside cafe, photos and all.</p>
<h2>The demo is half the product</h2>
<p>The honest lesson of the week is that building the app was the easy half. The hard half was making a business able to picture itself using one. A list of features convinces nobody. So instead of describing Snug and Carte, I wired them into mocked-up sites for real local trades and let them run for real: book a room, reserve a class, filter a menu by allergy. A working thing beats a brochure every time.</p>
<p>What I deliberately did not do is invent a price and pretend it is final. The pages say a small setup fee and a modest monthly, and leave the exact number to a conversation. I would rather under-promise on a page than over-promise on a call.</p>
<p>There is now a <a href="https://cyber-jack.uk/apps/">proper home</a> for these so they are products in their own right, not a footnote on a web-design page. Two are live. The list is meant to get longer.</p>]]></content:encoded>
    </item>
    <item>
      <title>The high-street toolkit is five apps now</title>
      <link>https://cyber-jack.uk/journal/high-street-toolkit/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/high-street-toolkit/</guid>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      <description>A few days ago I had two web apps for small businesses and a promise that the list would get longer. It got longer. There are five now, and together they cover most of what a shop, salon or cafe actually needs software to do.</description>
      <content:encoded><![CDATA[<p>A few days ago I wrote that I had built two web apps for local businesses and that the list was meant to get longer. It got longer. There are five now, and I want to write down what they are while the run of building them is still fresh, because they were made to work as a set.</p>
<p>The idea behind all of them is the same. A small business pays a quiet tax somewhere, or loses something it never sees, and a simple web app can stop the bleeding without an app store, a big monthly bill, or a server the owner has to think about. Each one lives on the business's own site, themed to look like theirs, and I host and run the lot.</p>
<h2>The three new ones</h2>
<p><strong>Slate</strong> is online appointment booking. The booking phone never stops, and every call missed mid-haircut is a booking that might not come back. Slate lets people pick a slot themselves, day or night, around the opening hours, service lengths and staff of the business. The clever part is the bit you do not see: it works out which times are genuinely free and never offers one that would clash, so two people can never grab the same chair. Booked while you work, no double-bookings, no marketplace skimming a cut.</p>
<p><strong>Tally</strong> is the coffee-shop stamp card, reborn on the phone. The little cardboard one works right up until it goes through the wash, and even when it survives it tells the owner nothing. Tally lives in the customer's phone, fills with a tap, and gives the owner the one thing a paper card never could: a list of who their regulars actually are.</p>
<p><strong>Nudge</strong> is about reviews, and it fixes a genuinely unfair bit of maths. The customer who had a perfect visit walks out happy and never posts about it. The one who had a bad day goes straight home and writes a one-star, because annoyance is a stronger motivator than contentment. Nudge asks one question after a visit and routes the answer: a happy customer gets a one-tap path to leave a public review while the good feeling is fresh, and an unhappy one gets a private line straight to the owner, who can put it right before it ever goes public.</p>
<h2>Why a set</h2>
<p>On their own each of these is a small thing. Together they start to look like the software a high-street business actually runs on: take the booking, show the menu, fill the diary, reward the regular, earn the review. Bookings, menus, appointments, loyalty and reputation, all from one studio, all embeddable with a single line of code, none of it needing an app anyone has to download.</p>
<p>I did not invent prices for any of them on the page. A small setup fee, a modest monthly, and the real number left to a conversation. What I would rather do is show a business the working thing and let it picture itself using it, which is the whole reason every one of these has a live demo you can poke at right now.</p>
<p>Five tools. The list can still get longer.</p>]]></content:encoded>
    </item>
    <item>
      <title>I turned Inkframe around to face the other way</title>
      <link>https://cyber-jack.uk/journal/pointing-inkframe-at-the-artist/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/pointing-inkframe-at-the-artist/</guid>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      <description>Inkframe started life as an aftercare app for people getting tattooed. It never felt right. So I kept the name and pointed it at the other end of the chair, at the artist, and the whole thing finally made sense.</description>
      <content:encoded><![CDATA[<p>Inkframe started as an app for the person getting the tattoo. A checklist for the run-up, somewhere to keep the design and the appointment, and reminders to look after it while it healed. It was a tidy idea and it never quite felt right. A healing-reminder app is a few days of use and then a delete, and the badge on my own site said "coming soon" for long enough that I had to be honest about why I kept not finishing it.</p>
<p>The pain I had aimed at was real, but it was small, and it belonged to the wrong person. The bigger, repeating ache is on the other side of the chair. It is the artist running an entire business out of a notes app and a camera roll, chasing who paid a deposit and who still owes a balance, and above all posting the same story every couple of weeks: dates available, message to book. I have watched good artists do that over and over. It is a job nobody should have to do by hand, and it is the same job every time.</p>
<p>So I kept the name and turned it around to face the artist.</p>
<h2>What it is now</h2>
<p>Inkframe is a quiet back office for a tattoo artist. Their book, in a clean diary instead of a phone screen full of texts. Deposits and balances tracked so they can see at a glance who has paid what and what their real take is once the studio or the chair rent comes out. Reference, stencil and healing photos kept with the client they belong to, instead of lost in a roll of three thousand pictures. It never touches the money. The artist takes deposits and balances exactly how they do now, and this just keeps the score straight.</p>
<p>The part I care most about is one link. An artist puts a single permanent address in their bio, and it always shows the days they have opened up, with a note on each if they want one. When a day fills it drops off. A client picks a date and sends an enquiry that lands straight in the artist's book. That is the end of the fortnightly "spaces left this month" post, replaced by a page that is simply always current.</p>
<h2>Where it stands</h2>
<p>It is live as a working demo, and you can click through a made-up artist's page to see the public side of it. I built it on my own hardware to keep it cheap while I find out whether artists actually want it, which is the only question that matters before I spend any more on it. It holds nothing real yet, and there is a list of things I would want in place before a single real client's details go anywhere near it.</p>
<p>But it finally makes sense, which the aftercare version never did. Same name, opposite end of the chair, and a much better idea.</p>]]></content:encoded>
    </item>
    <item>
      <title>What free actually costs - keeping a word game honest</title>
      <link>https://cyber-jack.uk/journal/the-cost-of-free/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/the-cost-of-free/</guid>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      <description>A free daily word game is only fun if the scoring is fair. This week that meant chasing down why the answer checker was waving through nonsense, and working out what it really costs to keep a free app honest.</description>
      <content:encoded><![CDATA[<p>A free daily word game has one job above all others: the scores have to feel fair. The whole point of <a href="https://letterly.cyber-jack.uk">Letterly</a> is that obvious answers score low and clever ones score high, with a leaderboard that actually means something. So when a player flagged that some genuinely daft answers were scoring full marks, it went straight to the top of the list.</p>
<p>The examples were not subtle. An apple counted as a vegetable. A type of gas counted as a gemstone. A handful of made-up words sailed through for a hundred points each, purely because nobody else had typed the same nonsense. On a game built around originality, a junk answer that nobody else picks looks like a stroke of genius to the scoreboard. That is the worst possible way for this to fail.</p>
<h2>The checker was the problem</h2>
<p>Every answer that starts with the day's letter gets checked by an AI model that decides whether it really belongs to its category. After digging through a full day of real answers, the honest finding was that the model itself was wrong. It was the cheap, fast option, and on the close calls it kept saying yes to real words that simply are not members of the category. This was not a glitch or an outage. The checker was confidently grading bad answers as good.</p>
<p>The fix was to move to a stronger model. Before touching anything live, I replayed the exact bad answers from that day against both the old and the new one. The old model caught seven of the ten worst offenders. The new model caught all ten, and just as importantly did not start rejecting the genuine answers either. That is the test that matters: stop the nonsense without punishing real players.</p>
<h2>Free does not mean free to run</h2>
<p>Here is the part nobody mentions about free apps. Every one of those answer checks costs a fraction of a penny. On something with no revenue, you genuinely sit there and weigh up whether to pay for the better model. The numbers turned out kind: a few pence a month at the current size, with plenty of room to grow before that changes. The real sting of the free tier was never the money, it was the rate limit. When a lot of people played at once, the free allowance ran out and the checker quietly gave up and waved everything through. Paying lifts that cap and closes the gap.</p>
<p>The unglamorous bit was the cleanup. Months of past answers had already been graded by the weaker model and remembered, so the same mistakes would keep repeating forever. Every one had to be re-checked. The first sweep over-corrected and tried to bin real answers too, including a few famous names and some perfectly good spellings, so it took a slower, more careful second pass to rescue those and only remove the genuinely wrong ones. Fiddly, repetitive, and completely invisible to anyone playing. Which is rather the point.</p>
<p>Free to play does not mean free to keep honest. But a few pence a month to make sure the boards can be trusted is the easiest call I have made all week.</p>]]></content:encoded>
    </item>
    <item>
      <title>Tenth app launched - Spot On, score predictions</title>
      <link>https://cyber-jack.uk/journal/spot-on-and-bonus-words/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/spot-on-and-bonus-words/</guid>
      <pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate>
      <description>Launched Spot On, a score-prediction pools app for the World Cup and other events, where friends call the exact scoreline and climb a shared table. Also added a hidden daily bonus word to Letterly.</description>
      <content:encoded><![CDATA[<p>The studio's tenth app is live. It is called Spot On, and it is built for the kind of friendly rivalry a big tournament creates: everyone in a pool calls the exact scoreline for each match, points land for getting the result right and more for nailing the score, and a shared table tracks who is actually any good at it.</p>
<p>Play it at <a href="https://predict.cyber-jack.uk">predict.cyber-jack.uk</a>. Create a pool, share the code, and the rest of the group joins and starts predicting. Picks lock at kick-off, so nobody can sneak a change once a match has started.</p>
<p>With a World Cup running for the best part of a month, scrolling through a long list of fixtures to find today's games gets old fast. So the fixtures view now lands you straight on the current round, with a tap to snap back to the live games whenever you wander off. Small thing, but it is the difference between opening the app to play and opening the app to scroll.</p>
<h2>A hidden bonus word for Letterly</h2>
<p>The daily word game picked up a new twist this week too. Every round now hides a bonus word in one of its ten categories, and it is always the most obvious answer for that letter. Guess it and you bag a hundred extra points. The catch is that you never find out which category is hiding it until the round ends, so the safe, boring pick might quietly be the jackpot. It is a nice bit of tension against the rest of the game, which rewards the answers nobody else thought of.</p>
<p>Play today's round at <a href="https://letterly.cyber-jack.uk">letterly.cyber-jack.uk</a>.</p>
<p>Three daily games and a predictions app now sit together at <a href="https://games.cyber-jack.uk">games.cyber-jack.uk</a>. The plan from here leans less on new apps and more on giving the ones that have landed a reason to bring people back each day.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ninth app launched - Rankle, plus a games hub</title>
      <link>https://cyber-jack.uk/journal/rankle-and-games-hub/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/rankle-and-games-hub/</guid>
      <pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate>
      <description>Launched Rankle, a daily ranking puzzle game where you order four items from lowest to highest. Also shipped games.cyber-jack.uk, a hub page for all three daily games. Five weeks to ship three puzzle games.</description>
      <content:encoded><![CDATA[<p>Two things shipped today. The first is Rankle, the ninth Cyber-Jack app. The second is a games hub that sits above all three daily games now online. This is the studio's first time shipping two products in the same day, and the first time the portfolio feels like an actual product line rather than a collection.</p>
<p>Play Rankle at <a href="https://rankle.cyber-jack.uk">rankle.cyber-jack.uk</a>, and browse all three games at <a href="https://games.cyber-jack.uk">games.cyber-jack.uk</a>.</p>
<h2>What Rankle is</h2>
<p>You get four items: facts, objects, concepts, whatever. Your job is to order them from lowest to highest on some scale. A geography round might ask you to sort four countries by population. A science round might ask you to sort four chemicals by atomic weight. Sports, history, pop culture, all the same idea. You tap to swap items around. There is no time limit. You get one puzzle per day, same puzzle for everyone.</p>
<p>The share card shows your result as a block of coloured emoji. Three rounds correct is 3 blocks. One wrong is a red block. The visual is quick to scan and just vague enough that it is not spoiling the actual answer.</p>
<p>There are 55 puzzles in the pool now, covering geography, science, history, sports, pop culture, nature. The intent is a puzzle a day from the pool for the first two months, then cycle back if the game stays live. This is the opposite of Letterly and Cluster, which generate fresh content every day from rules. Rankle is a hand-curated daily pull, the way The New York Times crossword works.</p>
<h2>Why ranking games, and why now</h2>
<p>Letterly and Cluster came out five weeks ago. Both are word games, both are about working through letters or rules to find answers. Rankle is a different kind of thinking: spatial, comparative, logical. Three games, three different brain problems, all daily, all free, all shareable.</p>
<p>The real reason is the pattern. I got Letterly out in two weeks, Cluster out two weeks after that. By week five, the pipeline was smooth enough that a third game was obvious. Take the lessons from the first two - daily refresh, simple rules, share cards - and try a new game type. That is what Rankle is.</p>
<h2>The games hub page</h2>
<p>With three games live, the scatter of landing pages was starting to look messy. games.cyber-jack.uk pulls them under one roof. Pick a game, see what it is, try it, share it. There is also a leaderboard showing total score across all three games if you are logged into one of them and want a global score. Most people will just play one or all three and not think about logging in at all. That is fine.</p>
<p>The hub is also the front door for the next game, whatever that is. It is now easy to add game four without rebuilding the entire architecture.</p>
<h2>The honest state</h2>
<p>Three daily games, three different mechanics, all live, all free, all under a hundred plays a day combined. The low number is not surprising. Web games hit discovery problems that app store games do not have. You can build a beautiful game and it stays invisible unless people actively share it or you spend on marketing. The plan so far has been let the share card do the work. It is early.</p>
<p>If one of them becomes a habit for a meaningful number of people, that is the signal to think about monetisation, native apps, or other growth. For now the studio has three games in the wild and a pipeline for adding more. That is the milestone.</p>
<h2>Numbers</h2>
<ul><li>Rankle puzzles: 55</li><li>Rankle build time: 3 days</li><li>Games live: 3 (Letterly, Cluster, Rankle)</li><li>Apps live: 4 (GutLedger, ListLedger, Rankle, Shoji)</li><li>Web games built: 3</li><li>Expo mobile apps: 4</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Seventh app, first one for the web - Letterly is live</title>
      <link>https://cyber-jack.uk/journal/letterly-launched/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/letterly-launched/</guid>
      <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
      <description>Letterly is a daily word categories game. Same letter, same ten categories, ninety seconds, for everyone in the world each day. Why I built a pure-web game, how the originality scoring works, and the honest state of it.</description>
      <content:encoded><![CDATA[<p>The seventh Cyber-Jack app is live, and it breaks the pattern. Every app before it was a mobile app built in Expo. Letterly is a game, it runs in the browser, and the first playable version went out the same day I started it.</p>
<p>Play it at <a href="https://letterly.cyber-jack.uk">letterly.cyber-jack.uk</a>. No download, no account.</p>
<h2>What it is</h2>
<p>One letter. Ten categories. Ninety seconds. Name something in each category that starts with the day's letter, and the whole world gets the same letter and the same ten categories that day. Then your answers are scored on how original they are. Pick something nobody else thought of and you score high. Pick the obvious answer and you score low, even if it is correct.</p>
<p>There is a daily streak, a share card, and private friend leagues with a six-character join code. The honest pitch is: it is the kind of thing you play once a day with the family group chat, not the kind of thing you grind for hours.</p>
<h2>Why a web game, and why now</h2>
<p>Two reasons. The first is that the format is oddly empty on mobile. Plenty of newspapers run a daily categories game on their websites, but nobody has shipped the simple async version: one shared daily round, originality scored, leagues with friends. The gap was real.</p>
<p>The second reason is honest curiosity. I have shipped the same Expo and in-app-purchase stack four times now. I wanted to know how fast I could ship something good on a completely different stack with no app store in the loop. The answer turned out to be: a teaser the first day, and a real multiplayer game inside two weeks.</p>
<h2>The scoring problem nobody warns you about</h2>
<p>Originality scoring sounds simple. Count how many players gave each answer, award more points to the rare ones. The trouble is the first player every day answers into an empty room, so everything they type is unique and everything scores full marks. That is not a game, that is a participation trophy.</p>
<p>The fix was a seed pool: a baseline of common answers per letter and category, hand-built, that dilutes the obvious picks from the very first play of the day. Type "Apple" for a fruit starting with A and the seed pool already knows half the world would too, so it scores low. Type something genuinely odd and you still get rewarded. The seeds fade in influence naturally as real players pile in.</p>
<p>There is also a quiet language check behind the scenes that decides whether an answer is a real example of its category, so "Dog" does not pass as a country. It defaults to accepting your answer if the check ever fails, because punishing a player for an outage is the wrong way round.</p>
<h2>What is free</h2>
<p>All of it. Letterly is free to play, no account, nothing behind a wall. It is a web game whose whole job is to be shared, and you do not put a turnstile in front of the thing you want people to pass along. If a native wrap and any paid extra ever happen, that is a later decision earned by people actually playing.</p>
<h2>The honest state of it</h2>
<p>It works, it is live, and a few dozen people have played. That is a start, not a hockey stick. Web games are hard to get discovered, harder than apps in some ways, because there is no store browsing for you. The plan is to let the share card do the work and see whether the daily habit sticks before spending real effort on reach.</p>
<p>A couple of things have already been fixed in public since launch: the daily letter was landing in a near-alphabetical pattern because of a weak random step, and the scoring copy needed rewriting so people understood that obvious answers score low by design. Both done, both shipped without disturbing past rounds so league standings stayed fair.</p>
<p>If you have ninety seconds, go play today's round. If you beat me, tell me.</p>
<h2>Numbers</h2>
<ul><li>Commits: 51</li><li>First commit to first playable: one day</li><li>Apps live: 3 (GutLedger, ListLedger, Letterly)</li><li>Apps in testing: 1 (Odomo)</li><li>Apps in dev: 2 (Inkframe, Settle)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Dabbling in web design for small businesses</title>
      <link>https://cyber-jack.uk/journal/web-design-for-small-businesses/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/web-design-for-small-businesses/</guid>
      <pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
      <description>A new side of the studio. Building modern, responsive websites for small UK businesses still stuck on dated, mobile-broken sites. Free concept redesign first, then a simple monthly plan.</description>
      <content:encoded><![CDATA[<p>Alongside the apps, the studio has started doing something a bit different: building websites for small businesses. Nothing grand, just modern, responsive sites for the kind of local business whose current site looks like it was last touched fifteen years ago.</p>
<p>There is a <a href="/web/">web design page</a> now with examples and pricing, but here is the honest version of why and how.</p>
<h2>Why bother</h2>
<p>Once you have built and shipped a handful of apps, a good website is the easy part of the day. And there is a lot of low-hanging fruit out there. A surprising number of genuinely good local businesses, the kind with five-star reviews and a decade of trade, are running a site that does not work on a phone, has no secure connection, and was built in an era of table layouts and tiny grey text. Their customers are all on phones. The site is actively losing them work.</p>
<p>That is a problem worth fixing, and it is a nice change of pace from staring at scoring algorithms.</p>
<h2>How it works</h2>
<p>The approach is deliberately low pressure. Instead of cold-pitching a quote, I rebuild a real page of their site first, for free, using their actual details and branding, and send it over. No obligation. If they like it, great. If not, no harm done and they keep a free mock-up.</p>
<p>The sites themselves are the simple, fast kind: a single well-built responsive page, real photos, click-to-call, a proper contact section, the lot. Built to load quickly and work on the phone in someone's hand, because that is where nearly all of the traffic actually is.</p>
<p>If a business comes on board, the site is hosted and maintained on a simple monthly plan. No big upfront bill, no lock-in, edits handled for them rather than left to fight a clunky builder.</p>
<h2>The honest framing</h2>
<p>This is dabbling, not a pivot. The apps are still the main thing. But it is a sensible second string: it uses skills I already have, it helps real local businesses that are being let down by their current site, and the monthly-plan model fits the same patient, low-overhead way the rest of the studio runs.</p>
<p>If you run a small business, or know one whose website could do with a quiet rescue, the <a href="/web/">web design page</a> has the details.</p>
<h2>Numbers</h2>
<ul><li>Apps live: 3 (GutLedger, ListLedger, Letterly)</li><li>Apps in testing: 1 (Odomo)</li><li>Apps in dev: 2 (Inkframe, Settle)</li><li>Concept site redesigns built so far: a couple of dozen</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Adding to the shopping list by voice</title>
      <link>https://cyber-jack.uk/journal/listledger-by-voice/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/listledger-by-voice/</guid>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <description>A weekend experiment wiring ListLedger up to a voice assistant, so you can add items hands-free. Why it needed a custom skill, how it works, and the honest state of it.</description>
      <content:encoded><![CDATA[<p>Quick one this week. I got ListLedger accepting items by voice. Say the word, the item lands on the list a second later, no phone needed. This started as a hands-full-in-the-kitchen itch and turned into a neat little weekend build.</p>
<h2>Why it was harder than it should be</h2>
<p>The obvious version is "add bread to my shopping list" with no app name in the middle. That used to be possible through the assistant's own lists feature, but that whole interface for third-party lists was retired a couple of years ago. So the only working path today is a custom skill with its own invocation name.</p>
<p>The trade-off is two extra words. You say "tell list ledger to add bread" instead of just "add bread". Slightly clumsier, but it works reliably, and reliable beats elegant for something you use with your hands full.</p>
<h2>How it works</h2>
<p>The phrase gets turned into a small request that hits a single function in the ListLedger backend, which writes the item straight onto the list. It handles the natural ways people actually talk:</p>
<ul><li>"add bread" puts one item on</li><li>"add 2 bananas" keeps the quantity</li><li>"add milk, eggs and bread" splits into three separate items, Oxford comma and all</li></ul>
<p>ListLedger stores its data as a stream of events rather than a fixed table, so the voice add is just another event in the same flow as a tap in the app. The phone app rebuilds the list from those events, so an item added by voice shows up everywhere the household already syncs to.</p>
<h2>The honest state of it</h2>
<p>This is a personal experiment, not a shipped feature yet. It runs against my own list, locked down so only my own skill can talk to it. Before it could go out to everyone it needs a proper setup flow so each person links it to their own household, which is real work I have not done.</p>
<p>But the core thing works, and it is genuinely useful. It is exactly the kind of small, sharp feature that makes an app feel like it belongs in your life rather than just on your phone. If enough ListLedger users would want it, turning the experiment into a real feature moves up the list.</p>
<h2>Numbers this week</h2>
<ul><li>Apps live: 2 (GutLedger, ListLedger)</li><li>Apps in testing: 1 (Odomo)</li><li>Apps in dev: 2 (Inkframe, Settle)</li><li>New this week: ListLedger voice input, working end to end</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Sixth app on the bench - meet Settle</title>
      <link>https://cyber-jack.uk/journal/settle-announced/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/settle-announced/</guid>
      <pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate>
      <description>Announcing Settle, a FODMAP-aware meal planner that imports any recipe by URL and hands the shopping list straight to ListLedger. Why this app, why now, and what the next three weeks look like.</description>
      <content:encoded><![CDATA[<p>There's a sixth app coming. It's called <strong>Settle</strong>, and it's a FODMAP-aware meal planner for people with sensitive guts. This post is the why, the how, and what I'm building over the next three weeks.</p>
<h2>The gap I keep hitting</h2>
<p>GutLedger tells you what your gut doesn't like. ListLedger keeps the household shop organised. But there's a step missing in the middle: actually planning meals around what you can eat.</p>
<p>The FODMAP world is full of "here's a list of safe foods" PDFs and £8 monolith apps with 80 built-in recipes you can't add to. What it doesn't have is the simple, universal thing: I see a recipe on Pinterest or TikTok or BBC Good Food - can I have it cleanly imported, the dodgy ingredients flagged in colour, and the shopping list pushed to my list app? That's Settle.</p>
<h2>Why this app and not the other five</h2>
<p>I had six ideas on the shortlist. A few were better businesses on paper - a generic meal planner has 10x the addressable market. The reason Settle won is <strong>strategic fit</strong>:</p>
<ul><li>It uses GutLedger's 470+ FODMAP food database as its core feature (instant credibility, no cold start)</li><li>It makes ListLedger useful from day one for FODMAP users (ListLedger has the typical "empty list" problem)</li><li>The whole audience already trusts the brand from GutLedger</li><li>The Expo + IAP stack is the same one I've shipped four times</li></ul>
<p>A generic meal planner would be Settle competing against Paprika, AnyList, Plan to Eat - all 5-10 years ahead. FODMAP-aware meal planner is a niche with one credible competitor (Real Plans + FODMAP Everyday, which is subscription-only at ~£100/yr).</p>
<p>Building in a deep niche where the rest of my stack already wins is more sensible than chasing the bigger market and losing.</p>
<h2>The name</h2>
<p>I spent a couple of hours on naming because everything good was taken. MealLedger felt obvious but didn't say anything. Larder, Hob, Mise, Pantree - all gone. Most names that hint at "calm" or "soothe" felt clinical.</p>
<p>Settled on <strong>Settle</strong> because it does double duty: settle your stomach (the gut-health signal) and settle in for dinner (the meal-planning context). Short, common English word, no app on the App Store currently using it for this category. Strapline: "Meals that don't fight back."</p>
<h2>What's free, what's paid</h2>
<p>The FODMAP filter is <strong>free</strong>. That part isn't a debate. Hiding the differentiating feature behind a paywall is how niche apps fail - the App Store screenshots need to show Low/Medium/High badges so people understand what they're looking at.</p>
<p>The paid tier (£4.99 one-off, same as the other Cyber-Jack apps) unlocks the things people hit a wall on:</p>
<ul><li>Unlimited recipe imports (free is 3 per week)</li><li>Unlimited saved meal plans (free is 1)</li><li>ListLedger auto-fill</li><li>iCloud/Google Drive sync</li><li>FODMAP-substitution suggestions ("swap garlic for garlic-infused oil")</li></ul>
<p>People pay for more of what they already love, not for unlocking what they've never seen.</p>
<h2>The risky bit: recipe import has to work</h2>
<p>The whole app falls over if importing recipes from real URLs doesn't actually work. So week 1 isn't building the app - it's proving the parser.</p>
<p>The plan is three stages, in order of reliability:</p>
<ol><li><strong>JSON-LD schema.org/Recipe</strong> - most cooking sites embed this for Google. Free, instant, surprisingly common (BBC Good Food, NYT Cooking, Bon Appetit all parsed cleanly in under a second on my test rig)</li><li><strong>recipe-scrapers</strong> Python library - 583 supported sites with handcrafted parsers, fallback for ones missing JSON-LD</li><li><strong>Gemini 2.5 Flash Lite</strong> - strips the page HTML and asks an LLM to extract the recipe. Works on anything readable, costs nothing on the free tier for individual use</li></ol>
<p>If hit rate isn't at least 90% on 30 random recipe URLs from my own Pinterest feed by end of week 1, I pause and rethink. No point shipping the prettier version of an app that fails the basic job.</p>
<h2>The three-week MVP</h2>
<p><strong>Week 1 - validate the parser</strong></p>
<ul><li>Stand up the parser as a standalone service</li><li>Test on 30 real URLs from my Pinterest</li><li>Register settle.cyber-jack.uk</li><li>Create the settle-app repo</li></ul>
<p><strong>Week 2 - app scaffolding</strong></p>
<ul><li>Expo project + recipe list UI</li><li>Paste URL input + share sheet (iOS extension)</li><li>Weekly plan view (drag recipes onto Mon-Sun)</li><li>Bundle the GutLedger FODMAP DB</li></ul>
<p><strong>Week 3 - cross-app + IAP</strong></p>
<ul><li>ListLedger deeplink handler (and matching scheme on the ListLedger side)</li><li>IAP wiring at £4.99 Pro</li><li>Submit to App Store + Google Play</li></ul>
<h2>Realistic outcome</h2>
<p>I'm not expecting Settle to be the breakout. The honest ceiling is 1k-10k installs over a year, leveraging the existing GutLedger user trust and the content pipeline already pushing FODMAP material on Pinterest and TikTok. That's a successful niche app, not a hockey stick.</p>
<p>But if it works it does three things at once: useful product, credibility boost for GutLedger, and makes ListLedger pay off for the FODMAP slice of its audience. That's worth three weeks.</p>
<p>I'll write about week 1 next week - particularly whether the parser hit rate is good enough to keep going.</p>
<h2>Numbers this week</h2>
<ul><li>Commits: 14</li><li>Apps live: 2 (GutLedger, ListLedger)</li><li>Apps in testing: 1 (Odomo)</li><li>Apps in dev: 2 (Inkframe, Settle)</li><li>Hours spent: 22</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Why I&#x27;m writing this journal</title>
      <link>https://cyber-jack.uk/journal/why-this-journal/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/why-this-journal/</guid>
      <pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
      <description>I&#x27;m writing in public so the people downloading my apps know there&#x27;s a real person behind them, and so I have to be honest with myself about what&#x27;s actually working.</description>
      <content:encoded><![CDATA[<p>I've been building apps under Cyber-Jack for a while now and never said much about it in public. That's about to change.</p>
<p>Two reasons.</p>
<p>The first is selfish. When I write things down weekly, I have to admit what I actually did. "Yeah I had a productive week" goes from vibe to a list of commits, builds and shipped features. If the list is short, the list is short. I'd rather face that than keep telling myself stories.</p>
<p>The second is for whoever is reading. If you've downloaded GutLedger or ListLedger, or you signed up to be a tester for Odomo, Inkframe or Shoji, I'd rather you knew there's one person behind it. Not a "team". Not a "we". Just me, working on this around a day job.</p>
<h2>What this journal is</h2>
<p>A weekly post, every Thursday. Honest write-up of:</p>
<ul><li>What I shipped</li><li>What I broke</li><li>What the numbers actually look like</li><li>What I'm working on next</li></ul>
<p>Numbers card at the top of the journal stays current - downloads, active users, revenue, hours spent. No vanity metrics. If revenue is zero, the card says zero.</p>
<h2>What it isn't</h2>
<p>Marketing. I'm not going to pretend GutLedger is bigger than it is, or that Odomo is a sure thing. Most of what I ship will probably make zero money. That's fine. The point is to keep shipping, learn fast, and keep the bar high on the things people do download.</p>
<h2>Where I am right now</h2>
<ul><li><strong>GutLedger</strong>: live on Android and iOS, slow and steady downloads, free with a Pro IAP nobody has bought yet</li><li><strong>ListLedger</strong>: live on iOS, beta on Android, a handful of households using it</li><li><strong>Odomo</strong> (UK mileage tracker): finishing internal testing, aiming for store submission this month</li><li><strong>Inkframe</strong> (tattoo lifecycle app): early development, taking tester signups</li><li><strong>Shoji</strong> (calm puzzle game): early development, taking tester signups</li></ul>
<p>Plus a content pipeline pumping out short videos, and this journal section being born right now.</p>
<p>If any of this is interesting, the <a href="/journal/feed.xml">RSS feed</a> is the best way to follow along. No newsletter for the journal yet - I want to keep the studio launches list and the journal separate.</p>
<p>See you Thursday.</p>]]></content:encoded>
    </item>
    <item>
      <title>Week 19 - Smarter ingredient recognition</title>
      <link>https://cyber-jack.uk/journal/week-19-smarter-ingredient-recognition/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/week-19-smarter-ingredient-recognition/</guid>
      <pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
      <description>Week 19 - Smarter ingredient recognition</description>
      <content:encoded><![CDATA[<p>This week, I focused on enhancing how users interact with ingredients in GutLedger and ListLedger to make their food tracking and shopping experiences better.</p>
<h2>Smarter ingredient recognition</h2>
<p>I improved how GutLedger recognises FODMAPs and other ingredients. This means the app can now identify more types of ingredients accurately, making it easier for people managing IBS to track what they eat. In ListLedger, I worked on smarter item categorisation, which includes longer match capabilities and typo tolerance. This helps users find items faster when adding them to their shopping lists.</p>
<h2>Notification improvements</h2>
<p>To prevent confusion and ensure a smooth experience, I fixed duplicate trigger notifications in GutLedger so that users don't receive unnecessary reminders. In ListLedger, I made sure the clear-checked banner no longer hides the last row, ensuring all items are visible after clearing selections.</p>
<h2>Cross-promotion features</h2>
<p>I added cross-promo banners for both GutLedger and ListLedger to help users discover other Cyber-Jack apps more easily. These banners subtly encourage users to try out my other tools for managing their health and daily tasks.</p>
<h2>Odomo enhancements</h2>
<p>In Odomo, I fixed a tracking issue that was causing delays in the foreground service (FGS) by implementing a faster gate mechanism. Additionally, I added tracker diagnostics to help identify and resolve issues more efficiently.</p>
<h2>Inkframe progress</h2>
<p>For Inkframe, I made significant strides in adding features like notifications for tattoo lifecycle events, photo capture functionality, and a detailed guide section. The app now has a 4-tab UI with comprehensive content to assist users throughout their tattoo journey.</p>
<h2>Numbers this week</h2>
<ul><li>Commits: 26</li><li>Apps updated: 4</li></ul>
<h2>Next week</h2>
<ul><li>Continue refining ingredient recognition in GutLedger.</li><li>Address remaining issues in Odomo's tracking module.</li><li>Finalise Inkframe's user guide and add more interactive elements.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Week 19 - Studio relaunch, Brevo migration, Inkframe lands</title>
      <link>https://cyber-jack.uk/journal/week-19-studio-relaunch/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/week-19-studio-relaunch/</guid>
      <pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
      <description>This week I rebuilt the cyber-jack.uk studio page from scratch, migrated the GutLedger newsletter to Brevo, and added Inkframe as a fifth product.</description>
      <content:encoded><![CDATA[<p>Two big jobs this week, plus a side-project added to the studio.</p>
<h2>Studio site, full rebuild</h2>
<p>The old cyber-jack.uk page was embarrassing. One column, no real product list, the Stoic side-project still front and centre even though I'd quietly abandoned it. So I dropped Stoic and rebuilt the page properly:</p>
<ul><li>5 product cards (GutLedger, ListLedger, Odomo, Inkframe, Shoji), each with the right status badge - "Live", "In testing" or "Coming soon"</li><li>Inline tester signup forms on every "Coming soon" card so people can flag interest there and then</li><li>Cookie consent banner, deferred GA4, structured data for the studio + each app + the FAQ</li><li>Changelog timeline with eight dated entries so it doesn't look static</li><li>A single "What's next" email capture for the broader studio updates list</li></ul>
<p>It looks like an actual studio now instead of a placeholder. The full diff is on GitHub if anyone is morbid enough to look.</p>
<h2>Brevo migration</h2>
<p>I'd been pinging Discord on every newsletter signup, which was fine for the dozen people on the GutLedger list but doesn't really scale and doesn't give me any way to send them anything. So this week I moved both lists onto Brevo:</p>
<ol><li>Studio updates list (cyber-jack.uk)</li><li>GutLedger product list (gutledger.cyber-jack.uk)</li><li>Three per-app tester lists for Inkframe, Odomo and Shoji</li></ol>
<p>The fun part: my hosting is shared cPanel with no curl extension, allow_url_fopen disabled, no PHPSelector. Both standard ways of making an outbound HTTPS request from PHP are gone. The fix was to drop down to fsockopen with the ssl:// transport and write the HTTP request by hand. Ugly but it works, and the same helper now handles Brevo, Discord webhooks and the unsubscribe endpoint.</p>
<p>I also built a proper RFC 8058 one-click unsubscribe handler so Gmail's bulk-sender rules don't complain. Tested end to end - signup adds, click unsubscribe link, removes. The welcome email is the dullest version of itself but it goes out and the link works.</p>
<h2>Inkframe lands as the 5th product</h2>
<p>Pulled Inkframe in from a side repo (bartholomuej/tattoo) and added it as a "Coming soon" card. It's a tattoo lifecycle app - aftercare reminders, healing photo timeline, artist contacts, appointment tracking. Nothing there to install yet, but the tester signup is live so I can start collecting interest while I build it.</p>
<h2>Numbers this week</h2>
<ul><li>Downloads: +12 across all apps</li><li>Active users (28d): 30 (mostly GutLedger)</li><li>Revenue: still £0, no Pro IAP purchases yet</li><li>Hours spent: ~18 across studio site, Brevo work and Inkframe scaffolding</li></ul>
<h2>Next week</h2>
<ul><li>Get the journal section live (you're reading the dry run)</li><li>Submit Odomo to App Store and Play Console for review</li><li>Start Inkframe screens properly - aftercare timeline first</li><li>Wire the journal pipeline to pull weekly commit activity automatically</li></ul>]]></content:encoded>
    </item>
  </channel>
</rss>
