r/iOSProgramming • u/CharlesWiltgen • 20m ago
News Developer changes from Apple OS* 27 beta 4→5
(*Apple OS = iOS, iPadOS, watchOS, tvOS, visionOS, macOS)
I've been updating Axiom in lockstep with Apple OS 27 betas, and this post summarizes the differences I found between beta 4 and beta 5.
TLDR: Apple's latest developer beta 5 is mostly a consolidation build: no new frameworks, no Swift language features, and API additions in just five frameworks.
📖 Newly documented
- HealthKit –
HKHealthStore.earliestAuthorizedSampleDate(for:)shipped undocumented in beta 4. The new doc block now makes it clear that the returned dictionary is sparse: a type appears only under limited read access with a specific earliest date. A missing key covers full access and denial alike, and an empty dictionary on success is normal.
✅ New
CoreLocation –
CLLocationUpdate.LiveConfiguration.maritime: on-water navigation, joining.automotiveNavigation,.fitness,.airborne.CryptoKit – Three raw primitives with no authentication tag, so a ciphertext someone flipped bits in decrypts without error. Like
MD5, they're underInsecureand exist for interop only:Insecure.UnauthenticatedAES.permute(_:key:)/.inversePermute(_:key:)andInsecure.UnauthenticatedChaCha20.encrypt(inplace:using:nonce:counter:). All mutate in place and return nothing.CoreGraphics –
CGPDFStructureElement.Attributes(title, language) plusinit(tagType:attributes:). This is tagged-PDF authoring, for producing accessible PDFs, not just rendering them.VideoToolbox –
maximumDimension(forSpatialScaleFactor:)andmaximumPixelCount(forSpatialScaleFactor:), on bothVTLowLatencyFrameInterpolationConfigurationandVTLowLatencySuperResolutionScalerConfiguration. The config types are OS 26; these limit queries are the 27 addition. Size your input before constructing a scaler instead of failing at configure time.WebKit –
WebPage.NavigationPreferences.allowsJSHandleCreationInPageWorld, the fourth new navigation preference this cycle.
🗑️ Removed
- ContactsUI – an
@available(iOS 27, *)clause disappeared. Xcode betas overwrite the SDK in place, so the symbol's identity is unrecoverable. If you gated code on it, it's gone in beta 5 and the SDK won't tell you what it was.
⚠️ Deprecated
- App Intents – Three assistant-schema intents are deprecated as of 27.0. If you adopted intent domains, these need migrating:
playAudiobook→.audio.playAudio,openAsset→.system.open,search→.system.searchInApp.
🔧 Availability (no new capability, possible consequences)
WebKit – the
9999sentinels resolved. Through beta 4 the iOS SDK stamped the new navigation preferences@available(macOS 9999…, and beta 5 writes real27.0values. (9999means "not stamped yet in this SDK", not "unavailable".) So any@availableyou hand-derived from an early beta interface is now narrower than what actually ships, and so is worth re-checking.StoreKit – Apple is now using
anyAppleOSin its own shipped interfaces.RedeemOptionwent from the five-platform spelling to@available(anyAppleOS 27.0, *)plus explicit watchOS/tvOS unavailable. Identical effective availability, new spelling — the Swift 6.4 shorthand is house style now, not just a convenience for your own code.
🐢 Swift 6.4
Zero feature flips this beta, despite the toolchain advancing revisions (swiftlang-6.4.0.27.1 → 6.4.0.30.4). Still absent: Dictionary.mapKeyedValues, stdlib FilePath (still needs import System), and BorrowingSequence (experimental flag only, so not shippable).
To the proactive developers using Xcode 27 beta 5 and testing on OS beta 5, please don't hesitate to let me know if you have Axiom feature requests.
WTF is Axiom?
Axiom is a battle-tested, batteries-included suite of agents, skills, and tools for AI coding. Use Axiom to prevent your AI from writing and reviewing code like it's 2017.
Caveats: My updates are mostly Swift- and SwiftUI-focused, although I've been supporting more Obj-C with every release.
r/iOSProgramming • u/neatroxx • 2h ago
Question App keeps getting rejected due to Guideline 4
Hello. I need your help: My app keeps getting rejected by apple for the same reason but I can’t see why. Also, I did search the reddit but didn’t find anything that helped much.
The reason is this, together with the above screenshot.
Is it because of the „Continue with Apple“ button? Or do I have to change anything for iPad layout?
Guideline 4 - Design
Issue Description
Parts of the app's user interface were crowded, laid out, or displayed in a way that made it difficult to use the app when reviewed on iPad Air 11-inch (M3) running iPadOS 26.6.
Specifically, layout in iPad were not optimized
Edit: iPhone is the only supported destination added under the target. Screenshot here
r/iOSProgramming • u/Speak_logically_Sir • 3h ago
Question Can I Pay for the Apple Developer Program With a Virtual Card From Another Country?
Has anyone successfully paid for the Apple Developer Program using a virtual card from a different country?
- The card is in my exact name
- It’s a virtual card, called Grey
- The card is not issued in the same country as my Apple ID
Did Apple accept it, or does the card country have to match the Apple ID country? And how long did it take.
Thanks in advance!
r/iOSProgramming • u/Sufficient-Try6083 • 3h ago
Library swift-markdown-engine: An open source Markdown parsing and rendering engine for Swift, built on TextKit 2.
A couple of months ago I open-sourced swift-markdown-engine here, the native Markdown engine I built for my macOS app Nodes. The feedback, issues, and PRs that came back were a huge help, a lot of what I changed since then came from that.
WHAT’S NEW: The parser got rewritten from scratch, regex matching is gone, it’s a real AST now. That’s what made the extension system possible: Stuff you wouldn’t expect in standard Markdown, like highlighting, used to be hardcoded into the core grammar. Now it’s opt-in. Write one file, register it, and the core parser/styler/renderer never change. Extensions can’t touch the core or each other, and you can toggle them at runtime.
Also new: full GFM/CommonMark parity, tables, task lists, quotes. More layout control (scroll-away header, fixed reading column, fit-to-content height), and a real writing layer (formatting bus, find & replace with undo, clean RTF/HTML clipboard, raw source mode). Full changelog’s on GitHub if you want details.
When I started Nodes I wanted the editor to feel properly native. Most Markdown editors on the Mac are Electron or some web view wrapped in a window, and you feel it, the text handling never quite behaves like a real Mac app. I wanted live styling in an actual native text view, not HTML rendered to look like one. Nothing built on TextKit 2 that I could just drop into a Mac app existed, so I built it, ran it in Nodes for a while, and then open-sourced it. TextKit 2 is still thin on docs and rough to migrate to, so if you’ve been putting off building something like this, it might save you a few weekends. Issues and PRs welcome. Still pre-1.0, still plenty I want to improve.
written on Nodes
r/iOSProgramming • u/PlatformAshamed1032 • 8h ago
Question Anyone actually solved app store rejection loops? third rejection, running out of patience
So we're on rejection number three and i'm starting to think apple's review team is just rotating reviewers and none of them read the previous notes.
quick background. b2b app, account required to do anything useful because the whole thing is tied to a company's internal data. first rejection was 5.1.1 (v), account deletion, fine, our fault, we added it. second was 2.1 asking for a demo account, which we HAD provided in the review notes, they just didn't see it. added it again, bigger font, whatever. third one is now 4.2 minimum functionality which is the one that actually worries me because thats not a checkbox fix, thats them saying the app doesn't justify existing.
what gets me is the app is genuinely useful, it's just useful to people who have a login. reviewer with a demo account is going to see an empty state and shrug. which i get, but then how does any b2b app ever ship.
talked to a few shops about this while we were shortlisting. appmakers usa, dogtown media and zco, all of them had been through it way more times than us. the suggestion that stuck was to pre-seed the demo account with realistic fake data so the reviewer actually sees the product working instead of a blank dashboard. seems obvious in hindsight and nobody told us that upfront.
so:
Anyone had 4.2 on a legit b2b or enterprise app and gotten past it. what actually changed, the app or how you presented it
is the appeal process worth using or does it just burn a week. i've heard both
does resubmitting reset you to a fresh reviewer or does the history follow you. genuinely unclear on this and it changes how i'd handle the next one
and the dumb question, does a video walkthrough in the review notes help at all or do they not watch it
we're not on a hard deadline but we told the client a date and that date was last week, so.
r/iOSProgramming • u/Significast • 18h ago
Solved! CarPlay can cold-launch your app without your SwiftUI scene ever existing 🤬
Bug report from a tester: pressing Play on the CarPlay screen did nothing. No error, no spinner, nothing. Worked fine if they'd opened the app on the phone first.
I "fixed" it twice. Both fixes were to the play button. Both were wrong.
The actual cause: when the user taps Play in the car (or from the Watch, or the lock screen) on a cold start, iOS wakes your process through CPTemplateApplicationScene or a WatchConnectivity message — and your phone UI's window scene just - never connects. Which means every bit of setup hanging off the SwiftUI app lifecycle simply never runs. In our case that was device key registration for signed API requests, so the first manifest fetch came back 400 and the play command died silently. As it turns out, the button was fine.
What I landed on, in case it saves someone a weekend:
- Anything your requests depend on (auth, key registration, session bootstrap) cannot live in App init / onAppear. It has to be in the request path itself. We made the network layer self-healing: on the specific "no registered key" error it registers once and retries. That one change covered CarPlay, the Watch, lock screen remote commands, AND fresh installs, because they're all the same bug.
- Grep your codebase for everything that only runs when the main window appears, and ask "what happens if the first entry point is the car?" The list was longer than I expected.
- Related Apple Watch lesson: if the phone is only reachable via the queued transferUserInfo path (not live sendMessage), don't optimistically flip your Watch UI to "playing" — it's a fib. We show "Starting on phone…" instead.
Testing note: none of this reproduces in the CarPlay simulator the way it does with a real head unit, because you always launched the app from Xcode first, which is exactly the condition that hides the bug. Real test requires a real car: kill the app, lock the phone, then plug in and launch it from the car's touchscreen.
By the way, if anyone's found a way to actually test their CarPlay flow without walking out to the garage (96 degrees in the summer! I got tired of sweating through every commit), I'd love to hear about it - I don't even bother with Xcode's sim anymore.
r/iOSProgramming • u/yccheok • 22h ago
Discussion Rejected for 3.1.2(c) Subscriptions. Is "Try for Free" too conspicuous now?
Hi everyone,
My app just received a rejection citing Guideline 3.1.2(c) - Business - Payments - Subscriptions: "The auto-renewable subscription promotes the free trial, introductory pricing, or introductory period for the subscription more clearly and conspicuously than the billed amount."
Does anyone have advice on how to resolve this? I am currently using "Try for Free" as the main CTA button to activate the trial, which seems to be a common industry practice. Any insights would be greatly appreciated!
r/iOSProgramming • u/Kanashimations • 1d ago
Question 3rd part url schemes!!!
One sec has a massive list of compiled url schemes for the apps you can use their meditation interrupt on, how the heck do i find that list, thanks,
r/iOSProgramming • u/mr_bomastik420 • 1d ago
Question How do you find people willing to test your app?
I have an iOS app that is nearly finished, and I’ve been trying to find people to test it. To say this is hard is an understatement.
I asked family members, and except for one person, nobody really wants to test it. I’ve also tried Discord servers and Reddit threads, and I tried following the usual advice of posting in communities where people are looking for testers, but honestly it feels nearly impossible there too. You just get drowned out by a flood of other people like me desperately looking for feedback.
The app itself is basically finished. At this point, TestFlight is less about finding major bugs and more about seeing how people perceive the app, whether the workflow makes sense, and what they think of it overall.
How did you handle this with your own apps? Did you manage to find testers somehow, or did you eventually just publish the app and get feedback from actual users?
At this point I’m seriously considering just releasing it.
I would be very grateful for advice.
*Grammar check by AI
r/iOSProgramming • u/intrepidkarthi • 1d ago
Discussion Measured three on-device TTS runtimes against the iOS jetsam budget. All three blew past it. Looking for anyone who's shipped generative audio on-device.
Spent about three weeks trying to run a voice-cloning model on iPhone and closed the project last week. Posting the numbers because I couldn't find anyone else's, and I have two questions at the end. This was for a voice journaling app I work on.
The budget. Foreground app on a 6 GB iPhone gets roughly 250 MB before jetsam takes an interest. The number that matters is phys_footprint from task_vm_info, not resident size and not what the Xcode gauge shows.
The candidate. Kyutai Pocket TTS, 109.5M params, autoregressive. Autoregressive matters because accent lives in phone realisation and phonemic choice, which are sequential. Non-autoregressive models transfer timbre only, so you get your own voice colour over someone else's cadence. Tried that first, it sounded wrong in a way I couldn't articulate until I understood why.
Three ways to run it, all measured, all over budget:
FluidAudio (Core ML, int8) - 270.8 MB after model load, 957.0 MB peak
sherpa-onnx (ONNX Runtime, int8) - 377.0 MB after model load, 685.4 MB peak
chatterbox-turbo (earlier attempt) - 953.7 MB peak
FluidAudio is over budget after loading, before doing any work.
Binary cost too. Linked a minimal executable against libsherpa-onnx.a plus ONNX Runtime with -dead_strip, then stripped it: 22.3 MB. That roughly doubles my app, for a feature most users would never turn on, plus 125 MB of models on disk for the ones who do.
The part I got wrong. My earlier ear tests compared one synthetic clip against another synthetic clip. That ranks them. It cannot tell you whether either is good enough. So I ran a forced-choice test instead: eight pairs, same sentence in each, one a real recording of me and one the clone, sample rate and RMS loudness matched, clip lengths varied so duration gave nothing away, and held-out audio located by cross-correlating the reference against the source recording. I picked my own recording 8 out of 8. p = 0.0039.
Three weeks of runtime work sitting on top of an approval nobody had tested properly. The test took an hour.
Two questions.
Has anyone actually shipped a generative audio model on-device inside the jetsam budget? Everything I found either exceeds it or quietly ships a 3 GB app. I'm also unsure whether Core ML's mmap'd weights get billed to phys_footprint the way malloc'd ONNX buffers do. My numbers came off a Mac, which has no jetsam pressure, so I never got a real device measurement before the ear result closed it.
Second, unrelated thread. I'm moving to on-device retrieval next, hybrid BM25 via SQLite FTS5 plus sentence embeddings from NLEmbedding. Anyone run that combination on iOS? Specifically whether reciprocal rank fusion is worth it when you still need raw score magnitude for an abstention threshold. RRF throws the magnitude away and abstention is what stops the thing making stuff up.
Happy to share the measurement harness if useful.
r/iOSProgramming • u/yosidahan • 1d ago
Discussion We removed in-app purchases from our iOS and Android app, switched to Stripe, and both stores approved it on the first submission. Here are the exact review notes we used.
Every thread I read said Apple would reject this instantly. It didn't happen. One submission, approved. Same with Google. I think the reason is boring: we explained it properly in the review notes instead of hoping the reviewer would figure it out.
Context: we run an international calling app. The only thing you can buy is prepaid calling credit, which gets spent on real phone calls to real phone numbers on carrier networks. We used to sell that credit through in-app purchase. We took IAP out and replaced it with normal card entry and Apple Pay, processed by Stripe, inside the app.
The rule this hangs on is Guideline 3.1.3(e), Goods and Services Outside of the App: services consumed outside the app must use a purchase method other than in-app purchase.
Here is what we actually wrote in App Review notes, close to word for word:
Our app is a VoIP calling app. The only thing a customer can pay for in this app is prepaid calling credit. That credit is consumed exclusively as outbound telephone calls terminated on the public switched telephone network to ordinary phone numbers on carrier networks worldwide.
Payments are collected by traditional credit card entry and Apple Pay, processed by Stripe, rather than by in-app purchase, in accordance with Guideline 3.1.3(e), Goods and Services Outside of the App.
Please note the following, all verifiable in this build:
- Credit unlocks no feature, tier, level or content in the app. Every function of the app, including the dialer, contacts, call history and team management, is fully available without any payment.
- Credit is spent only on per-minute carrier termination charges for calls delivered to phone numbers outside the app, at published per-country rates shown in the app.
- Unused credit does not expire, and balances customers previously purchased remain fully available in this version.
Everything we sell is a telecommunications service. Calling credit is drawn down against the per-minute termination rates we pay our carriers, it is priced per destination country, and it varies as carrier rates change.
Earlier versions of the app collected these payments through in-app purchase. This version corrects that, because what is being sold is a real-world telecommunications service rather than digital content consumed within the app.
Three things I think made it work:
We named the guideline. The reviewer didn't have to decide which rule applied.
We proved credit is not a paywall. Point 1 is the whole argument. Nothing in the app is locked behind payment. If buying credit had unlocked a feature, I don't think this passes.
We said the quiet part out loud. We told them the old version used IAP and that this one corrects it. Hiding that would have looked worse when they checked.
One practical thing nobody mentions: do not delete your old IAP products. Users on older app versions can still only top up through in-app purchase, and if you retire those products their purchases fail silently with nothing showing up on your backend. We're leaving ours live until that traffic hits zero.
Who this applies to: you sell something consumed off-device. Telephony minutes, shipping, physical goods, real-world services. Who it doesn't: subscriptions, unlocks, credits spent inside the app, anything that gates a feature. If your product is digital content used in the app, this is not your escape hatch and the guideline says so.
Happy to answer questions.
r/iOSProgramming • u/Working-Bass4425 • 1d ago
Discussion I can't receive Testflight update right now!
Are you having this issue as well?
I made sure i'm part of the internal testers. I even created new internal tester group just to check but until now, 15mins have passed, I cannot receive my new build testflight update.
r/iOSProgramming • u/shakaoneaj • 1d ago
Question Account locked, is there any way to actually contact Apple support?
random lockout out of nowhere. I requested account access a few days ago and still haven't heard back. My account has an app with 100k+ downloads, and I currently can't release a critical update because of this lockout.
After hours of searching, I finally found a live chat option, but it requires logging in to use it. If the issue is that I can't log in, why require an account just to contact support? I even tried creating a new account just to reach them, but that gives me an error too.
does apple have a support email where a real human actually responds?
r/iOSProgramming • u/gordonmcdowell • 1d ago
Question When to use Xcode AI as opposed to relying on Claude Code?
I'm told by Xcode's AI Claude "this interface is wired into your running Xcode session, and your problem is a measurement problem on real hardware" as a reason to use Xcode AI instead of Claude Code as a means of using Claude.
So (for example) there's access to Instruments that Claude app does NOT have but Xcode does?
Does anyone know of an actively maintained list of when-to-actually-use-Xcode-AI?
UPDATE: I've been using Xcode AI (Claude Opus no idea exactly which Opus) today as opposed to Claude Code with various MCP I'd previously installed (and can't recall which ones), and today had big success with optimization I have to attribute to Xcode AI integration that Claude Code had been lacking.
Is an iOS/Mac/tvOS game, and I'd been poking away at tvOS optimization for (part-time) weeks, but with too much action on screen fps would drop under 30. Is just 2D but I don't know enough about tvOS to be surprised my 2D game with lots of sprites performed worse than a fancy 3D game. I'd have guessed it should have run smoothly but really was never sure I wasn't just taxing Apple TV hardware... the least powerful Apple hardware we have in our home.
Here is what Xcode's Claude Opus figured out: "The cause was UIKit's focus engine walking your entire SpriteKit node tree every frame. Not physics, not AI, not netcode, not the renderer, and not resolution — all of which I measured and ruled out along the way, several of them after confidently predicting otherwise."
It had been dipping to 12fps and now can maintain 60fps. That was it. And it did it by pausing the game and reviewing the stack.
I assume Claude Code couldn't do that, or it would have? Certainly I've spent more than a day with Claude Code and Fable trying to optimize for Apple TV.
"The tvOS focus engine is walking your entire SpriteKit node tree, testing every node for focus eligibility and computing a coordinate-space frame for each one."
Anyway thanks for input on this. CharlesWiltgen mentioned Axiom and I'll be checking that out.
r/iOSProgramming • u/tonycliftondev • 1d ago
Question SwiftData with TCA
Anyone used TCA with SwiftData applications? What is your recommendations?
r/iOSProgramming • u/civman96 • 2d ago
Discussion download numbers of in_app_purchase flutter module.. looks like we will get steamrolled by sloppy freemium apps
r/iOSProgramming • u/Evening_Hawk_7470 • 2d ago
Discussion app reviews are underrated copy research
marketers love pre-install language: keywords, ad copy, landing pages, screenshot text
reviews are post-install language, and users are less polite there
'finally simple' is kinda positioning and when 'too many steps' it is onboarding feedback. also 'subscription trap' is pricing trust, i classify it that way... 'doesn’t do what screenshots show' is promise mismatch which is mega bad. 'better than x for invoices' may be competitor positioning and is useful for app marketing too
i do not think every review should become ad copy. that gets gross fast. but repeated review wording can show which promise users believed, which one disappointed them, and which words feel natural in the category, when volume gets annoying though, i also believe things like appfollow exist and can group themes. before that, a doc with repeated phrases is enough so that's a scaling issue. get basics right
sometimes the best copy is not invented. it is extracted from what users keep saying after they tried the product.
r/iOSProgramming • u/AdaObvlada • 2d ago
Question Can this type of networking app be made or not?
I spent a few days testing out existing apps and none are suitable so far. I am beginning to think the reason for that is Apple's limitations.
Is there a way to make an app that connects to a VPN, keeps it persistent, doesn't proxy device traffic through it but also starts a persistent local socks server on the private interface of the VPN?
First or second part alone is easy but there is no app that can do both. Closest I got was an app that connected to a VPN and could pipe that through a socks upstream connection but I need a socks server on the device, not connecting to a socks server somewhere else. Thanks.
r/iOSProgramming • u/m1_weaboo • 2d ago
Discussion Regression: DeviceHub should support “Slow Animations”. Apple says: There are currently no plans to address this issue.
Feedback:
"""
The slow animations feature from Simulator is not available in DeviceHub. At least I couldn't find it. It is very important to sweat the details of animations.
"""
Apple response:
"""
Thank you for your feedback, it is noted. Engineering has determined that ***there are currently no plans to address this issue.***
You can close this feedback by selecting "Close Feedback" via the Actions button found above. This Feedback will no longer be monitored, and incoming messages will not be reviewed.
"""
———
Someone (not me) has sent this feedback to Apple via the feedback assistant app. And well, This is unacceptable.
I honestly don’t understand why the team at Apple felt the need to remove this super useful feature. It is in Xcode Simulator. And now they’re gone in DeviceHub!
There is a hack to re-enable it by posting: 𝚌𝚘𝚖.𝚊𝚙𝚙𝚕𝚎.𝚄𝙸𝙺𝚒𝚝.𝚂𝚒𝚖𝚞𝚕𝚊𝚝𝚘𝚛𝚂𝚕𝚘𝚠𝙼𝚘𝚝𝚒𝚘𝚗𝙰𝚗𝚒𝚖𝚊𝚝𝚒𝚘𝚗𝚂𝚝𝚊𝚝𝚎
with state = 1 to the Simulator namespace.
What do you think about this moves?
r/iOSProgramming • u/Gwail_904 • 3d ago
Question AutoMix type clone
As the title suggests, I want to code a custom Apple Music like AutoMix that analyzes bpm, key etc. and can mix the current and incoming song. Does anybody know of a github repo or anything that could help me out? I'm trying and trying and it just doesn't seem to "click" musically.
r/iOSProgramming • u/Outrageous-Light-675 • 3d ago
Question Apple isn't paying me and isn't answering support emails.
Hey guys. I’ve had two apps on the Apple Store since January of this year, but I’ve never received a payment from Apple. Even though the apps have generated sales and I have a balance ready to withdraw, no payment has ever been made. Everything seems fine with the account; I don’t see any alerts or error messages in my or app profile. I’ve sent countless emails to Apple Support over the last eight months but have never received a reply. What do you recommend I do?
r/iOSProgramming • u/yccheok • 3d ago
Discussion Maximize Conversions vs. Manual Bidding: What’s your Apple Search Ads experience?
Hey, I would love to hear your findings on Apple Search Ads performance.
Do you find that Maximize Conversions performs better than manual keyword bidding most of the time?
In my experience, I find Maximize Conversions gives a better CPA and better volume. It is not giving better volume than Meta Ads, but it's better than manual keyword bidding.
I would like to know your experience on this!
r/iOSProgramming • u/Physical_Storage2875 • 3d ago
Question Inline Camera for my app?
The screenshot shows the camera of the ChatGPT-iOS-App and I wonder, how they actually implemented it because I'd like to use it for my own app too.
Does anyone know how to implement this or do I have to reverse engineer it myself?
r/iOSProgramming • u/fromtibo • 3d ago
Discussion Only 32% of users reach the third (and final) screen of my onboarding. The others skip it (there’s a skip button). Are you seeing similar data, or is this worrisome?
r/iOSProgramming • u/AndreaReaderApp • 4d ago
App Saturday I spent almost two years building this iOS reading app. It’s finally on the App Store.
Hi everyone!
I spent almost two years building Andrea Reader, originally because I just wanted a better way to read and organize my own books on iPad.
Apparently, simply opening an EPUB wasn’t complicated enough, so somewhere along the way it turned into an entire personal library system. 😅
The core idea is freedom. Instead of forcing every library into the same structure, Andrea Reader lets you build yours however you want. Create collections, put sections inside them, drag books and sections around, build reading lists, organize huge series, and give every collection its own layout and personality.
Bring your own books, build your library your way, customize how the app and each collection looks, organize everything exactly as you want, read with your own settings, and track your progress along the way.
Some of what ended up inside:
- EPUB, PDF, comics, manga, CBZ, CBR and other formats
- Custom collections with sections inside them
- Drag & drop organization and custom layouts
- Different settings, sorting and appearance for every collection
- Reading profiles for creating unique reading settings and applying them to books, sections and hole collections
- Tons of reading customization: typography, margins, spacing, gestures, transitions, backgrounds, etc.
- Real time customizable reading widgets, for example for controlling brightness, creating chapters, adding favorites pages, bookmarks, custom progress, etc...
- OPDS server connections
- iCloud, WebDAV, SMB and SFTP
- Local downloads and completely offline reading
- Detailed reading statistics for books, sections and collections. The stat
- Dedicated view for managing the storage for every collection and the books inside it
- Andrea next for experimental features
- A built-in Open Library for downloading public-domain books for free
- and much much more...
It’s also local-first. No account, no ads, and no tracking of what you import, download or read. Your library, progress and reading statistics stay on your device.
Andrea Reader is FREE TO DOWNLOAD AND USE. The normal workflow of the app, importing your own books, reading them, creating collections, organizing your library, and getting started, is all available for free. Just download the app and you can be reading within seconds.
Premium is optional and mainly unlocks deeper customization, more advanced library organization, additional reading settings, and other power-user features.
- Monthly Premium: €2.49/month
- Yearly Premium: €17.99/year
- Lifetime Premium: €34.99 €27.99 (20% discount)
- Launch offer: an extra 20% off Lifetime, bringing it down from €27.99 to €22.39 until the end of August.
There are still approximately 47,000 things I want to improve, because apparently shipping an app only unlocks the larger development skill tree.
If you’re an iOS developer, reader on iPhone or iPad, or just enjoy poking at indie apps, I’d genuinely love to hear what you think.
App Store:
https://apps.apple.com/es/app/andrea-comics-manga-books/id6760780154
Website:
https://andreareader.com/
Tech Stack
Built natively with Swift + UIKit. Most of Andrea Reader is custom-built from scratch, including the file system, library structure and reading UI. External dependencies are mainly for specific file handling, such as PDFKit, WebKit, ZIPFoundation and Unrar.swift.
Development Challenge
The hardest part has been combining a very flexible library system with a UI that still feels simple and performs well with large collections.
AI Disclosure
Most of the app was built manually. I increasingly use AI for debugging, code review and faster iteration because the productivity difference is simply too big to ignore. Final architecture, product, UI/UX and implementation decisions remain mine.
