Sign in

stavrop.bsky.social

@stavrop.bsky.social
4 followers 5 following 25 posts
PostsRepliesMedia
stavrop.bsky.social @stavrop.bsky.social · 19h
Selling an iOS or Mac app in the EU? Since 11 Sep, the Cyber Resilience Act requires reporting actively exploited vulnerabilities within 72h. cra-scan (free, open source) builds your SBOM from Package.resolved and flags exactly those. github.com/stavrop/cra-scan #iOSDev #Swift #CRA
github.com
GitHub - stavrop/cra-scan: SBOM + exploited-vulnerability check for Swift / Apple-platform projects (EU Cyber Resilience Act)
SBOM + exploited-vulnerability check for Swift / Apple-platform projects (EU Cyber Resilience Act) - stavrop/cra-scan
021
stavrop.bsky.social @stavrop.bsky.social · 30/09/2026
Krasis, first week on the App Store: 12 downloads, 0 trials, 0 purchases. Also found this morning that the pricing experiment I built in August was still a draft at launch. It's running now. Last day of Shipaton. Small numbers, posted anyway. #Shipaton #BuildInPublic
111
stavrop.bsky.social @stavrop.bsky.social · 24/09/2026
Deltion is live 📄 Every lab result, scan and report in one private library — iPhone, iPad and Mac. Unlimited documents, trends and reminders, free and staying free. No account, no analytics, no server of mine. apps.apple.com/app/id676753...
apps.apple.com
Deltion App - App Store
Download Deltion by Georgios Stavropoulos on the App Store. See screenshots, ratings and reviews, user tips, and more apps like Deltion.
000
stavrop.bsky.social @stavrop.bsky.social · 24/09/2026
Krasis is live on the App Store. Approved yesterday, out today, six days before the Shipaton deadline. A lot of the build has been posted here, wrong turns included. apps.apple.com/app/krasis/id6802311489 #Shipaton #BuildInPublic
000
stavrop.bsky.social @stavrop.bsky.social · 21/09/2026
Deltion is out 25 September 📄 Every lab result, scan and report in one private library — iPhone, iPad and Mac. Encrypted on device, no account, no server of mine, and it reads your reports on-device by default. #privacy #healthtech #iOS #macos
000
stavrop.bsky.social @stavrop.bsky.social · 07/09/2026
My paywall never fires at launch. It fires on the third "Still full?" answer. That is the first moment the app can tell you something about yourself it could not have known on day one. Before that, the only thing I have to sell is a promise. It is the expensive choice. #Shipaton #BuildInPublic
A diagram on warm paper headed 'The paywall never fires on day one. It fires on the third Still full? answer.' Two panels compare the same paywall placed two ways. The left, dashed in terracotta and labelled 'Rejected, end of onboarding', tagged 'Converts better' and headed 'Pay for the claim.', shows a Day 1 mock screen listing three greyed features above a hollow 'Start 7 days free' button; its notes read: for, best conversion moment there is; against, a feature list is the only thing it can show and nothing on it is about you; against, it asks you to pay for a claim about yourself. The right, solid black and labelled 'Chosen, third check-back answer', tagged 'Shipping this' and headed 'Pay for the pattern.', shows a Day 4 mock screen reading 'Toast and jam: an hour.' and 'With cottage cheese: till lunch.' above a solid 'Keep your history' button; its notes read: for, two sentences it could not have written on day one; for, the ask arrives after the app has already been useful, unpaid; against, most people never reach three answers, so at the moment I ask the pool is a fraction of the installs. Below them a four-step timeline puts the ask at the end: Install, no account and no permissions; First read, still no ask; Check-backs one to two, not a pattern yet; and finally, the only terracotta dot, Third answer, the first thing it knows that you did not tell it. A terracotta band at the foot reads 'Do not ask for money while the only thing you have to sell is a promise. Wait for the first moment you can show someone something they did not already know.' A status rule reads '12 days to internal stop, 24 to the hard deadline'. Corner stamp: Diagram, not a screenshot.
000
stavrop.bsky.social @stavrop.bsky.social · 03/09/2026
A form asked what building in public changed about the app. Not whether I posted. What it changed. Forty-seven posts in twelve days. My honest answer had three items, and two of them are just me working with the door open. Only one involved anybody else. #Shipaton #BuildInPublic
A diagram on warm paper headed 'The form does not ask whether I posted. It asks what the posting changed.' A four-cell tally reads 12 days logged, 4 channels each, 47 posts all URLs kept, and 1 decision anyone else changed. Below, a form field labelled 'Build in Public - how did it improve your app?' holds three answers: two marked JUST ME with empty outlined squares (publishing a bug forces the diagnosis to be finished; a stop date announced to strangers behaves differently from a date in a file) and one marked SOMEONE ELSE with a filled square (a feature turned down twice in public, then shipped in a third form). A terracotta band headed 'The answer I nearly wrote' reads 'Here are forty-seven links across four platforms', noted as true, verifiable, and an answer to a question the form does not ask. Footer: 'Publishing is not a feedback loop until something you published comes back and changes what you do. Until then it is a diary with a bigger door.'
000
stavrop.bsky.social @stavrop.bsky.social · 02/09/2026
My app suggests one thing to add to what you are about to eat. It is the biggest button on the screen, and ignoring it costs you nothing. It has to. The only way to show you that cottage cheese on the toast holds you longer is to have recorded the toast on its own. #Shipaton #BuildInPublic
A diagram on warm paper headed 'The suggestion is the biggest button on the screen. Ignoring it costs you nothing.' Two columns show the same six-meal history recorded two ways. The left, CHOSEN, keeps all six meals whether or not the app's suggestion was taken: toast and jam an hour, toast with cottage cheese till lunch, a banana barely an hour, a banana with Greek yoghurt a good while, lentil soup till dinner, coffee and a rusk not long. The right, REJECTED, records a meal only if the suggestion was taken, so four of the six rows are greyed with dashed outlines reading 'not recorded' and only the two successes survive. A terracotta band reads: the four missing rows are the ones that carry the comparison, because the sentence the paid tier sells, 'toast and jam, an hour; with cottage cheese, till lunch', cannot be said unless the first half was recorded on its own. Footer: gate the record on compliance and you do not get better users, you get a smaller, flattering dataset.
000
stavrop.bsky.social @stavrop.bsky.social · 01/09/2026
My app reads a meal as three things: protein, fibre, fat. The screen where you pick your staples is sorted by fridge, cupboard, fruit bowl. Sorting by nutrient would have matched the app. Nobody checks a kitchen by nutrient. Then the sort order moved my free limit. #Shipaton #BuildInPublic
A diagram on warm paper headed 'The app reads food as three things. The screen where you pick food is not sorted by any of them.' Two columns show the same ten staples sorted two ways. The left, solid-bordered, labelled CHOSEN, 'Sorted by where it lives': FRIDGE - eggs, Greek yoghurt, feta, cottage cheese; CUPBOARD - oats, lentils, tahini, olive oil; FRUIT BOWL - bananas, lemons. Underneath: 'You walk to the fridge and you look. You do not walk to the protein.' The right, dashed terracotta, labelled REJECTED, 'Sorted by what is in it': PROTEIN - eggs, Greek yoghurt, feta, cottage cheese; FIBRE - oats, lentils, bananas; FAT - tahini, olive oil; NOWHERE - lemons. Underneath: 'Tidier, and consistent. It also asks you to remember which shelf the protein is on, and it has no home for a staple that carries none of the three.' A terracotta band below reads 'Then the sort order moved a limit I thought was settled. Setup stops at fifteen staples. Grouped by location, fifteen falls mid-fridge, while you are still sweeping down the door.' Footer: 'Sort a list the way people scan the real thing, then find out what else that decision owns.'
000
stavrop.bsky.social @stavrop.bsky.social · 31/08/2026
Week one I finished the food dataset and every screen. I had not checked the name was available. The App Store Connect record is the only authoritative check on that, and the wordmark was already drawn. Ten minutes with a queue behind it beats two weeks without one. #Shipaton #BuildInPublic
A diagram headed 'I finished everything nobody was waiting for.' Two columns: on the left, solid-bordered, the work finished ahead of plan with nothing waiting on it - foods.json with 201 foods, the visual direction, eight screens and the token sheet, the seven edge states, the data model with 27 tests green - marked 'Two weeks of work. Zero days of lead time.' On the right, dashed in terracotta, the work not started because it runs on somebody else's clock - the App Store Connect record, the only authoritative check that the name is free; an explicit bundle ID with IAP, since a wildcard App ID makes sandbox purchases untestable; Paid Apps, banking and tax all Active, since bank verification is not instant; and the first BuildInPublic post - marked 'Minutes of work. Weeks of lead time.' A band below reads 'If any one of Paid Apps, banking or tax is not Active, the products call returns an empty array - and it looks like a code bug for an afternoon.' Footer: 'A ten-minute job with a queue behind it outranks a two-week job without one.'
011
stavrop.bsky.social @stavrop.bsky.social · 28/08/2026
I kept saying "five more minutes." Three hours later, still scrolling. So I built FocusFence — turn on an Apple Focus and the apps you picked lock themselves. Time limits, Shortcuts automation, and a shield that doesn't negotiate. apps.apple.com/app/id6762261090
010
stavrop.bsky.social @stavrop.bsky.social · 28/08/2026
Shipaton's deadline is 30 September. Mine is 18 September. The rules say the app has to be live, not submitted. Review is a queue I don't control, and one rejection costs a whole cycle. Twelve days of buffer, to buy one retry. #Shipaton #BuildInPublic
A schedule diagram on warm paper headed 'The deadline isn't the deadline.' Two stacked timelines to the same scale. The upper is dashed, labelled 'Rejected — build to the deadline': a long Build bar, a hatched terracotta App Review block, then a grey hatched block reading 'misses 30 Sep'. The lower is labelled 'Chosen — internal stop, 18 Sep': a shorter Build bar, the same App Review block, then 'fix, resubmit', then 'live', all finishing inside the timeline. Axis: 27 Aug today, 22 days; 18 Sep internal stop; 30 Sep Shipaton deadline. Footer: when the last step is someone else's queue, the date you plan against is never the date on the rules.
000
stavrop.bsky.social @stavrop.bsky.social · 27/08/2026
Apple's Focus modes hide your notifications. They don't stop you opening the app anyway. FocusFence links a Focus to a set of blocked apps: turn on Work, and the distractions turn off with it. On-device, no account. stavrop.github.io/focusfence/ #iOS #indieapp #productivity
020
stavrop.bsky.social @stavrop.bsky.social · 27/08/2026
My paywall sells Widgets and a Watch app. Neither exists. I wrote that bullet in a design doc back when both were planned. The roadmap moved. The bullet didn't. Building them: a week. Cutting the line: 30 minutes. I'm cutting it. #Shipaton #BuildInPublic
A two-panel diagram on warm paper headed 'The paywall was selling two features that don't exist.', subtitled 'Fourth of four benefits. One line of Swift, and one line in the screenshots Apple's reviewer sees.' Left panel, dashed and labelled 'Shipped — PaywallView.swift:56': four benefit bullets — your history, what actually held you; unlimited staples, and more than one kitchen; check-backs timed to you; and, struck through in terracotta, 'Widgets, Watch, and saved combos', annotated 'No widget. No Watch app. Neither is built.'; caption 'Written in a design doc in week one, when both were on the roadmap. The roadmap moved; the bullet did not. Guideline 2.3.1 — accurate metadata.' Right panel, labelled 'Cut — 30 minutes': the same first three bullets, with a fourth in terracotta reading 'Your go-to combos, one tap', annotated 'The rejected option: build them. A week+.'; caption '23 days to the internal stop. The cut makes the list weaker — Widgets, Watch was the most concrete thing on it. Widget ships as 1.1. Being live is worth more than a widget.' Footer: 'The paywall is the only screen that describes the future. Every other screen describes what's there.'
010
stavrop.bsky.social @stavrop.bsky.social · 26/08/2026
Krasis ships 201 foods. Three booleans each: protein, fibre, fat, present or not. No grams anywhere, so there is nothing to add up. The flags came from four national food databases. Keeping almost none of a dataset doesn't shrink what you owe it. #Shipaton #BuildInPublic
A two-panel diagram on warm paper headed 201 foods. Three booleans each. Left panel, dashed and labelled Cut, what the sources carry: a food-composition row for plain cottage cheese with nine greyed numeric rows ending: and dozens more columns. Right panel, Shipped, three yes/no flags: the same food as a JSON record with protein true in terracotta, fibre false, fat false, attribution BLS 4.0, beneath it 603 booleans, offline. No calorie count exists to be shown, because none was kept. Footer: credited on the About screen, a licence condition, not a courtesy. BLS 4.0, Ciqual 2025, CoFID 2021, USDA SR Legacy. Keeping almost none of the data does not shrink what you owe it.
000
stavrop.bsky.social @stavrop.bsky.social · 25/08/2026
iCard Store 1.5 is live 🔒 If 1.3 made your saved cards vanish — they were never deleted, just orphaned by a rename. 1.5 finds them and restores them on first launch: numbers, CVVs, PINs, groups, reminders. And iCloud sync finally works. apps.apple.com/app/id675925... #iOS #security #icardstore
apps.apple.com
000
stavrop.bsky.social @stavrop.bsky.social · 25/08/2026
Three vessels, not rings. They fill from the bottom. I cut the direction with a green in it. A good meal isn't green. Add a success colour and you've built a test, and the person eating breakfast is sitting it. One accent. No count, no score. #Shipaton #BuildInPublic
Two-panel design spec on warm paper, headed Three vessels, not rings. Left, dashed, Cut - rings with a pass mark: three rings labelled GOT IT in muted green, LOW in terracotta, MISSING empty; caption says it read as a fitness app and GOT IT / MISSING is one notch from judgy. Right, Shipped - one accent, no second colour: three tall vessels filled from the bottom in terracotta to different heights, empty parts hatched not grey, labelled protein, fibre and fat in Greek; caption says more of a compound present means more terracotta, empty is hatched never grey, no count, no percentage, no score. Footer: A good meal is not green. Add a success colour and you have built a test, and the person eating breakfast is sitting it.
000
stavrop.bsky.social @stavrop.bsky.social · 24/08/2026
Your streak isn't your progress. Hex!s scores how strong each habit really is — miss a day and it dips a few points instead of resetting to zero. Auto-tracks from Apple Health, coaches you on-device, syncs to your Watch. Free 👉 apps.apple.com/app/id679354... #iOS #habitstracking
Promo card for the Hex!s habit tracker on a dark violet background. Left side: the app icon, a violet hexagon half-filled like a gauge, next to the name "Hex!s" and "Habit tracker". Below it the headline "Miss a day. Keep your progress." and the lines "Every other tracker resets your streak to zero. Hex!s scores how strong each habit really is, so one off day costs a few points — not months." Three bullet points read: auto-tracked from Apple Health; a private AI coach, on-device; iPhone, iPad and Apple Watch. A button says "Free on the App Store". Right side: two iPhone screenshots. The first is the Today screen — a honeycomb of six coloured hexagons labelled Meditate, Steps, Drink water, Read, Journal and No sugar, above "4/6 complete" and "You're 67% through today". The second is the detail screen for the habit "Drink water", showing a strength score of 92 labelled "Strong", an 18-day streak, 87% over 30 days, and a four-week grid of blue hexagons.
000
stavrop.bsky.social @stavrop.bsky.social · 24/08/2026
RevenueCat never shows the Apple free trial. Not on the product, not on the package. I lost an afternoon hunting the row. Re-imported products, re-checked credentials. A trial isn't a property of the product. It's a property of the customer. StoreKit decides at runtime. #Shipaton #BuildInPublic
A two-panel diagram on warm paper, headed 'The Apple free trial is never in the dashboard. That is correct.' Left panel, 'RevenueCat, product page — what the dashboard can know': rows reading Identifier, Store, Subscription, then a hatched empty bar labelled 'no trial row, no price row'. Right panel, 'StoreKit, on device, at runtime — what only the customer can answer': the code annual.storeProduct.introductoryDiscount, resolving to '7 days free', or to nil if they have used it. Footer: 'I read a missing row as a missing thing. It cost an afternoon.'
000
stavrop.bsky.social @stavrop.bsky.social · 21/08/2026
Sthenos 2.6 is live 🫀 Your body is a vessel — the waterline is the reading. A live 0–100 energy score from your Apple Watch, rebuilt around that idea. Plus Vitals, Training Load, fitness age. All on-device, €3.99 once (€1.99 until Aug 23rd) apps.apple.com/app/id6760965966 #AppleWatch #HRV
Two Sthenos screens side by side on a dark ground.
Left: the Today screen, a heart filled about three-quarters with green, the number 78 inside it, HIGH beneath, a pill reading "Recharging +2.4 / hr", and Sleep 82, Recovery 74, Heart 71, Freshness 80 along the bottom. 
Right: the Trends screen, a 30-day energy history drawn as a green tide averaging 71 and reading 78 now, above a training-load card with fitness, fatigue and form lines over daily load bars and an acute:chronic ratio of 1.06 marked in the sweet spot.
000
stavrop.bsky.social @stavrop.bsky.social · 21/08/2026
"This'll hold you about an hour." Alone, that's a mark out of ten — the subject of the sentence is you. "All three. That'll see you to dinner." puts the food back as the subject. I never specified the pairing. The second half arrives 350ms late, or never. #Shipaton #BuildInPublic
Two panels on warm paper. Left: the verdict 'This'll hold you about an hour.' with a caption that the subject is you, so it reads as a mark out of ten. Right: the paired verdict 'All three. That'll see you to dinner.' with a caption that the subject is the food, so it reads as mechanism. A footer notes the pairing was never specified and the second half enters 350 ms late.
000
stavrop.bsky.social @stavrop.bsky.social · 20/08/2026
Shipped AI Usage Monitor 0.3.0 — a tiny macOS menu bar app showing your Claude and ChatGPT usage limits at a glance. Reuses the logins already on your Mac. No API keys, no servers, no telemetry. Apache-2.0. github.com/stavrop/ai-usage-monitor #macOS #OpenSource #Claude #ChatGPT
020
stavrop.bsky.social @stavrop.bsky.social · 20/08/2026
RevenueCat's wizard made me an offering called "default": monthly, yearly, lifetime. Not mine. Test Store demos. They render prices. Read it before you replace it and you ship a paywall selling nothing. A placeholder that looks like real data is worse than an empty state. #Shipaton #BuildInPublic
000
stavrop.bsky.social @stavrop.bsky.social · 19/08/2026
Two paywalls for Krasis today. One variable: which plan is listed first. I built B by duplicating A rather than rebuilding it. A rebuild would have changed a word somewhere above the plan list, and then I'd be measuring two things at once. #Shipaton #BuildInPublic
A warm paper-coloured card headed 'One variable: which plan is listed first.' A band across the top, labelled 'byte-identical in both arms', holds the shared recap line and four benefits. Below it, two panels side by side. A, trial forward: Yearly EUR 24.99 highlighted with a '7 days free' badge, then Monthly EUR 3.99, then Lifetime EUR 49.99, button 'Start 7 days free'. B, lifetime forward: Lifetime EUR 49.99 highlighted with a 'no subscription' badge, then Yearly, then Monthly, button 'Buy once, keep it'. Footer: 'Both arms show all three prices. Neither hides a plan.'
000
stavrop.bsky.social @stavrop.bsky.social · 18/08/2026
Day 2 on Krasis, my Shipaton build. Drew the main screen three ways and picked the one that looks least like a nutrition app. Paper, ink, one terracotta. Vessels that fill, instead of rings that close. No calorie count anywhere in it. #Shipaton #BuildInPublic
short description
010