<?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, 29 Oct 2026 00:00:00 +0000</lastBuildDate>
    <generator>cyber-jack journal-poster</generator>
    <item>
      <title>Week 44 - Updates galore</title>
      <link>https://cyber-jack.uk/journal/week-44-updates-galore/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/week-44-updates-galore/</guid>
      <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate>
      <description>Week 44 - Updates galore</description>
      <content:encoded><![CDATA[<p>This week was all about polishing the polish across my apps to make them smoother and easier to use.</p>
<h2>GutLedger (IBS food diary)</h2>
<ul><li>Onboarding is now a full-screen Modal, ensuring users see every detail without any part getting cut off. The Home screen reloads the checklist after onboarding finishes, making sure nothing gets missed.</li><li>Insights badges now use text-safe status colours, improving readability and clarity for users tracking their dietary progress.</li></ul>
<h2>ListLedger (shared shopping lists)</h2>
<ul><li>Keyboard-safe dialogs were implemented to make sure users can input items without any issues. The app also adds starter staples during onboarding, helping new users get started quickly.</li><li>Home-screen shortcuts have been added, making it easy to access the app from anywhere on an Android device.</li></ul>
<h2>Odomo (UK mileage tracker)</h2>
<ul><li>Past trips can now be logged easily, allowing users to track their journeys more accurately. The vehicle choice is also clearer in the Track screen, and tab labels are cleaner for TalkBack users.</li><li>Higher-rate thresholds and recent purposes have been added to improve filtering options when searching for trips.</li></ul>
<h2>Shoji (calm puzzle game)</h2>
<ul><li>Zen mode was introduced, providing a serene environment for users to enjoy the puzzles. The app now uses SDK invite links for CrazyGames builds, making it easier for players to share challenges.</li><li>Seasonal stamp themes were added to keep the game fresh and engaging. First-time visitors are directed to their own board, offering a personalized experience right from the start.</li></ul>
<h2>Numbers this week</h2>
<ul><li>14 commits in ListLedger</li><li>13 commits each in GutLedger and Odomo</li><li>2 commits in Shoji</li></ul>
<h2>Next week</h2>
<ul><li>Continue refining GutLedger's onboarding process for better user engagement.</li><li>Add more keyboard safety features to ListLedger.</li><li>Enhance the Trip Search functionality in Odomo with additional filters.</li><li>Introduce new seasonal themes in Shoji to keep the game fresh.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Week 43 - Smaller steps forward</title>
      <link>https://cyber-jack.uk/journal/week-43-smaller-steps-forward/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/week-43-smaller-steps-forward/</guid>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <description>Week 43 - Smaller steps forward</description>
      <content:encoded><![CDATA[<h2>GutLedger</h2>
<p>I've been working on some important updates for GutLedger, including fixing issues with weekly summary screens and ensuring that alerts are properly tracked. I also added free CSV export options to help users manage their data more easily.</p>
<h2>ListLedger</h2>
<p>This week saw a flurry of activity in ListLedger too. I fixed deep link tracking to make sure the latest URL is always used across the app, and I made some minor small releases for both iOS and Android builds.</p>
<h2>Odomo</h2>
<p>I worked on bumping versions and adding features like HMRC 55p rate by tax year and subscription-ready Pro services in Odomo. It's great to see more users getting access to these useful tools.</p>
<h2>Shoji</h2>
<p>In Shoji, I focused on polishing the polish with some minor bug fixes and improvements. The game now has a clearer end screen and better daily mix for players. I also made sure that the privacy and support pages were restored after they went missing.</p>
<h2>Numbers this week</h2>
<ul><li>7 commits in GutLedger</li><li>7 commits in ListLedger</li><li>2 commits in Odomo</li><li>6 commits in Shoji</li></ul>
<h2>Next week</h2>
<ul><li>Continue refining the polish in GutLedger, focusing on making ingredient recognition smarter.</li><li>Work on improving deep link handling further in ListLedger for a smoother user journey.</li><li>Add more features and polish Odomo to make it even more useful for mileage tracking.</li><li>Keep up with bug fixes and improvements in Shoji.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>A fairer way to pick the daily letter</title>
      <link>https://cyber-jack.uk/journal/a-fairer-letter-draw/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/a-fairer-letter-draw/</guid>
      <pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
      <description>Letterly picks one letter a day. Random turned out to be the wrong answer. Here is the switch to a shuffled bag, so every letter gets its turn.</description>
      <content:encoded><![CDATA[<p>Every day, <a href="https://letterly.cyber-jack.uk">Letterly</a> gives everyone the same letter, and you fill each category with something starting with it. The letter used to be picked at random from the date. That sounded fair. It was not.</p>
<h2>Random feels broken</h2>
<p>A player noticed the same letter twice in one week. Looking back over every round so far, that was not a one-off. There were dozens of repeats within a week of each other. Some letters had come up ten times while others had come up twice, and one letter had not appeared for more than three months.</p>
<p>That is what real randomness looks like. Streaks and gaps are normal. But in a daily game it feels like the game is broken, or lazy, and nobody wants three S days in a fortnight.</p>
<h2>A shuffled bag</h2>
<p>The fix is an old trick from video games. Put every letter in a bag, shuffle it, and draw one a day until the bag is empty. Then shuffle a fresh bag and start again.</p>
<p>Now every playable letter comes up exactly once in each cycle. A letter can never repeat within a few days, and none can vanish for months. There is one extra rule at the join between two bags, so the end of one cycle and the start of the next cannot land the same letter close together.</p>
<p>The order is still worked out from the date, so it is still the same letter for everyone and nobody can see ahead. Before switching over, I checked the new draw against a separate model of it for three years of future dates to be sure they matched exactly.</p>
<p>It is a small change that most players will never notice. That is the point. The best fairness fixes are the ones that stop people having a reason to complain.</p>]]></content:encoded>
    </item>
    <item>
      <title>A year of puzzles without an API bill</title>
      <link>https://cyber-jack.uk/journal/a-year-of-puzzles-no-api-bill/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/a-year-of-puzzles-no-api-bill/</guid>
      <pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
      <description>Rankle and Cluster quietly ran out of fresh puzzles. Rather than keep paying an AI service to write more for games with a small audience, the next eighteen months were written and checked by hand.</description>
      <content:encoded><![CDATA[<p>Daily puzzle games have an appetite. Every day needs a new one, and a pool of puzzles that felt huge at launch runs out faster than expected.</p>
<p>That happened to <a href="https://rankle.cyber-jack.uk">Rankle</a>. Its pool ran dry and it started repeating old puzzles. The worst part is that a warning had been firing every single day for weeks beforehand. An alert that nobody acts on is just noise with a timestamp.</p>
<h2>Paying for puzzles nobody plays</h2>
<p>The quick fix was to get an AI service to write more. That works, and it costs very little per puzzle. But it is not nothing, and a burst of generation recently ran into a spending cap that also broke the answer checker on Letterly for a while. Paying to feed two games with a small audience, and putting the busiest game at risk to do it, is the wrong trade.</p>
<p>So the decision was to stop spending on them entirely.</p>
<h2>Written and checked by hand instead</h2>
<p>Instead of a paid service, the next stretch of puzzles was drafted in themed batches, like space, geography, history, nature, sport and everyday engineering. Every one was then checked by the same automatic gate that guards the live game: values in order, no near ties, no answers hidden in the labels, no puzzle that is basically a repeat of an older one. Anything unsure was looked up. A few dozen were cut in review for being too easy, too close to an existing puzzle, or dependent on how you define something.</p>
<p>Rankle now has fresh puzzles well into 2028. Cluster is covered into early 2028 too. The paid generators are still there, but they refuse to run unless someone deliberately says yes.</p>
<h2>Fixing what was actually stopping people</h2>
<p>While in there, a few less glamorous problems turned up. On a small phone, Rankle's results screen did not scroll, so the share button sat out of reach below the bottom of the screen. That has probably been quietly losing shares since launch. It is fixed now.</p>
<p>All three daily games also now point at each other. Finish one, and you see the other two with a tick if you have already played them today. A few days after that went in, Rankle had its busiest day ever. Still small numbers, but a real jump, and it came from people who were already playing something else.</p>
<p>The lesson for a tiny studio: content you own costs time once. Content you rent costs money forever.</p>]]></content:encoded>
    </item>
    <item>
      <title>When the answer key was wrong - a lesson from Rankle</title>
      <link>https://cyber-jack.uk/journal/when-the-answer-key-was-wrong/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/when-the-answer-key-was-wrong/</guid>
      <pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
      <description>Rankle asks you to put four things in order. For a while, one puzzle in six was marking correct answers as wrong. Here is how that happened, and the small boring check that now stops it for good.</description>
      <content:encoded><![CDATA[<p><a href="https://rankle.cyber-jack.uk">Rankle</a> is a simple idea. Four items, one scale, put them in order from lowest to highest. Planets by size, animals by top speed, drinks by sugar. You tap to swap, you submit, and only then do you see the real numbers.</p>
<p>That last part matters. The numbers are hidden while you play, because ranking things is trivial if you are shown the answer. So the game asks you to trust it. And for a while, it did not deserve that trust.</p>
<h2>One in six</h2>
<p>A proper audit of the puzzle pool turned up something embarrassing. Eleven of the first sixty-seven puzzles had their answers stored in the wrong order. The game checks your answer against the order the items are saved in, not against the numbers shown afterwards. So a player could reason correctly, get marked wrong, and then be shown the very numbers that proved they were right.</p>
<p>The worst one asked for the rocky planets from smallest to largest. The stored answer was Mercury, Venus, Earth, Mars. The real order is Mercury, Mars, Venus, Earth. A couple of others had ties in them, which made them unanswerable as well as wrong. A few had numbers that were simply off, like a comic book character given the wrong debut year.</p>
<p>That is the worst way a puzzle game can fail. A hard puzzle is fine. An unfair one makes people stop coming back, and they never tell you why.</p>
<h2>The fix was boring on purpose</h2>
<p>Every broken puzzle got repaired or replaced. A few were beyond saving, where the premise itself was a coin flip, and those went in the bin.</p>
<p>The real fix was a small checker that runs before every build. It reads every puzzle, looks at the four values, and refuses to build the site if they are not in order, if any two are tied or too close to call, if a label gives the answer away, or if the same item turns up twice. It is a few dozen lines. It has no opinions. It just counts.</p>
<p>Before trusting it, I put one of the old mistakes back in on purpose to make sure it actually caught it. It did.</p>
<h2>Never let a language model do the ordering</h2>
<p>The bigger lesson is about which jobs to hand to AI. Language models are good at suggesting interesting topics and ballpark numbers. They are not reliable at the mechanical part, which is putting four numbers in order or checking that a word really contains a set of letters. The same thing turned up on Cluster, where a model happily claimed that a word contained letters it did not.</p>
<p>So the rule now is simple. Ideas can come from anywhere. Anything that can be checked by counting gets checked by code, every time, before a player ever sees it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Where players actually come from</title>
      <link>https://cyber-jack.uk/journal/where-players-actually-come-from/</link>
      <guid isPermaLink="true">https://cyber-jack.uk/journal/where-players-actually-come-from/</guid>
      <pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
      <description>Letterly has picked up a steady stream of new players. Almost none of them come from search. Most come from friends, or from one daily games directory. Here is what that taught me about promoting small web games.</description>
      <content:encoded><![CDATA[<p><a href="https://letterly.cyber-jack.uk">Letterly</a> gets a steady trickle of new players every day. A natural question is where they all come from, so I went and looked properly.</p>
<h2>Two channels, and that is it</h2>
<p>The answer was simpler than expected. Roughly half come straight in: a shared link, a bookmark, someone telling someone. The other big chunk comes from a single daily games directory that lists word games like Letterly. That one listing brings in around four in ten new players, and the day it went live shows up as a clear step in the chart.</p>
<p>Search engines send almost nobody. All the work on page titles and descriptions has done very little so far for a brand new game.</p>
<p>The directory players are not junk traffic either. Nearly everyone who arrives from it actually starts a round and finishes it, at the same rate as people who came from a friend.</p>
<h2>Half the picture is missing</h2>
<p>There was a catch in the numbers. The analytics only count people who accept cookies, which is how it should be. That turns out to be only about half of the players. So the analytics are fine for the mix of where people come from, but useless for how many people there are. The game's own records are the real count.</p>
<p>The fix is now in. When someone plays, the game notes the site that sent them there, as a short site name, nothing more, and keeps it with their scores. No tracking cookies, no profile. It is explained on the privacy page. That works for Cluster and Rankle too, so for the first time it is possible to see which sources bring players who come back, not just players who turn up once.</p>
<h2>What this means for the next games</h2>
<p>The lesson is that small web games live or die by being listed in the places where puzzle fans already look, and by being easy to share. So the plan is more of what is clearly working. Cluster and Rankle have now gone into the same kind of directories, and every game links to the others. Search can come later, if it comes at all.</p>]]></content:encoded>
    </item>
    <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=hollybank">room booking</a> and a <a href="https://cyber-jack.uk/apps/snug/classes.html?p=puppyandfriends">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, then gives every customer the same two options: a one-tap path to leave a public review while the visit is fresh, and a private line straight to the owner if they would rather say something directly.</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>
