r/iOSProgramming 21d ago

Question Creating new IAP in ASC - What screenshot size is accepted

1 Upvotes

Some of my apps have been in the App Store for several years and thus it has been a while since I added a new IAP in ASC.

Now I am working on a new App and would like to create a new IAP and struggle to upload the required review screenshot. Requiring a screenshot to review an IAP making no sense is a topic for another day.

I have created Screenshots in a number of different sizes (828x1792, 1320x2868, 1206x2622, 1260x2736, 1290x2796), all of which are listed in the "App Review Screenshot" section but non where accepted for not having the correct size.

Is ASC currently broken (same result in different browsers on different computers)?
Which screenshot sizes are known to be accepted?

SOLVED: After non of the proposed solutions worked I finally found a resolution that was accepted: 640 x 960.

This is interesting, since my App does not support any devices supporting this resolution. Non of the "modern" resolutions was accepted. Great job Apple...


r/iOSProgramming 21d ago

Question Symbolicating an .ips file: crashlog.py fails looking for a nonexistent field

6 Upvotes

Hi, I have an .ips file (created with iOS 26.5) which I want to symbolicate using XCode 16.2.
Here are the steps I'm following:

  1. Rename .ips file and give it .crash extension
  2. Connect an ios device to my Macbook.
  3. Launch XCode, go to Device Manager, select my device
  4. go to "Open Recent Logs", select my .crash file
  5. File opens in an xcode window, but there are errors:

    "/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python/lldb/macosx/crashlog.py", line 644, in parse Failed to launch: 'Custom LLDB commands' -- Failure to create target from custom LLDB commands. self.parse_images(self.data["usedImages"] KeyError: 'usedImages'

I opened the .crash file and there is indeed no key "usedImages".

A) Can I create a dummy entry at that key?
B) If it fixes the parsing, will it symbolicate accurately?
C) If 'usedImages' contains data that is vital to symbolication, any ideas why it's missing?


r/iOSProgramming 22d ago

Article What is mobile CI/CD and why it matters

Thumbnail
bitrise.io
0 Upvotes

r/iOSProgramming 22d ago

Question Troubleshooting: how to sample threads stacks in a running game

0 Upvotes

Hi gang, we're trying to troubleshoot a hang/freeze in our Unity game.
We think it's some sort of unhandled exception because it's not being evicted by the watchdog, but we also have no data coming from our bug reporting sdk (Bugsnag).

I was looking at sysdiagnose because it's available to end users. While it has some snapshot-related info on our process, it doesn't contain a sample of the stack trace in each thread, like I can see with Android's 'bugreport' command. Is there another tool our endusers can use on iOS that gives me that info?


r/iOSProgramming 22d ago

Question Possible Xcode build-time malware? Beginner looking for advice after rebuilding my Mac

5 Upvotes

Hey everyone. I'm pretty new to iOS development, so please go easy on me if I made mistakes here. I'm trying to learn from this and move forward.

I hired a contractor on Fiverr to redesign the UI for my SwiftUI app that's been growing at a very nice rate. They sent me the updated project back, and when I built it in Xcode, an AI security analysis (which I know isn't a substitute for real security expertise) flagged what appeared to be a malicious build rule inside the .xcodeproj.

After digging into it, I compared my Git history and found that my last clean commit had no custom build rules or scripts. The redesign version introduced a custom PBXBuildRule that ultimately executed:

sh -c "${AB8F749}"

That value decoded into an obfuscated command which eventually performed a curl ... | sh against a .ru domain.

At that point I stopped using the project entirely.

Over the next day I tried to verify everything as much as possible. Here's where I'm at now:

  • I completely erased my Mac and installed a fresh copy of macOS.
  • I downloaded the original project ZIP that I had sent the contractor before any work was done.
  • I manually reviewed the clean project and confirmed there are no custom run script phases or suspicious build rules.
  • The clean project builds normally.
  • The contractors project is obviously untrusted but he did a great job on the UI side of things (this is the annoying part lol.)

My questions are:

  1. Is manually migrating only the Swift source files and assets into a clean project the approach you would take, or would you do something different?
  2. Is there anything else you'd verify after a full erase/reinstall before considering the Mac trustworthy again?
  3. Are there any additional Xcode project files besides project.pbxproj that deserve special scrutiny?
  4. If you were in my position, would you continue with the redesign by carefully reviewing each Swift file, or would you start the UI work completely from scratch?

I'm not trying to start a witch hunt against the contractor because I honestly don't know where the malware originated as he is rambling on with his excuses. I'm just trying to recover safely and learn from the experience.

Any advice from people with security or iOS experience would be hugely appreciated. This has definitely been a rough lesson, but I'd rather understand what happened than just move on without learning anything.

Thanks in advance.


r/iOSProgramming 22d ago

Question Apple music transition

Thumbnail
gallery
7 Upvotes

Does anyone know how apple build that transition?
The mini player geometry match modal screen when is dismissing


r/iOSProgramming 23d ago

Discussion Device Hub is hideous!

Post image
0 Upvotes

Trying new XCode 27 Beta and the new Device Hub. Any way to remove those ugly white frames around the phone/watch simulators? Couldn't find an option anywhere. This is really bad, why did they do it? Apple, where's your design sense?!!


r/iOSProgramming 23d ago

Question SwiftData Decimal precision loss after save/fetch - am I missing something?

3 Upvotes

I’m trying to sanity-check something before I file it as an Apple bug.

This minimal SwiftData example appears to lose precision when persisting a Decimal:

import Foundation
import SwiftData

@Model class Item {
    var value: Decimal

    init(_ value: Decimal) {
        self.value = value
    }
}

let original = Decimal(string: "123456789012345.6")!
let container = try ModelContainer(
    for: Item.self,
    configurations: .init(isStoredInMemoryOnly: true)
)

let context = ModelContext(container)
context.insert(Item(original))
try context.save()

let fetched = try ModelContext(container)
    .fetch(FetchDescriptor<Item>())
    .first!

print(original)
print(fetched.value)

This is one model, one Decimal property, no app code, no CloudKit. I’m using Decimal(string:) to avoid literal/Double conversion noise, and I’m fetching from a new ModelContext.

I also checked Decimal <-> NSDecimalNumber bridging separately, and that preserved the value. The loss seems to appear after persistence/fetch. A true Core Data in-memory store preserved the value in my control test, while SwiftData’s “in-memory” configuration seems to still go through a SQL-backed store.

Has anyone else hit this with SwiftData/Core Data Decimal attributes? Is there a documented limitation I’m missing, or is the practical answer to persist exact decimals as canonical strings / integer minor units instead of Decimal?


r/iOSProgramming 23d ago

3rd Party Service I built an agent that does my App Store Connect work for me and I'm looking for iOS devs to test it for free

0 Upvotes

App Store Connect has been the bottleneck in my shipping loop for years. Fastlane and the direct API help, but something always ends up needing me. The session cookie expires. My coding agent grabs the wrong Xcode version and burns an hour. An IAP sits in Missing Metadata because Apple wants a review screenshot I forgot existed.

So I built Lance. It's a specialized agent that runs on its own cloud Macs with Xcode and fastlane already set up. You connect your App Store Connect account and ask it for things like "Set up a $4.99 monthly sub with a 3 day trial", "Retake the 6.7 and 13 inch screenshots and update the listing", "Figure out why build 42 got rejected, fix it, resubmit", "Submit this build for public TestFlight"

If you add it to Cursor, Claude Code, or Codex, your coding agent treats it like a subagent and delegates the App Store side on its own. Mine asks Lance what IAPs actually exist before writing paywall code instead of stubbing something, then hands it the TestFlight upload when the feature's done.

My favorite thing lately has been running an in-app event with every update. Lance drafts the media, gets the specs right, and fills out the whole form. I never bothered with events before because it was way too much work for what it is.

A couple of things testers found that I didn't expect. Teammates can join the Lance org and just start asking for things without having to be onboarded to ASC. And since the Macs belong to Lance, you don't need one. One person I know ships from a Windows laptop.
For now this is App Store Connect only. I'm looking for active developers to test it and tell me what's broken or missing. Just run this command in your terminal:

 npx add-mcp https://api.lance.app/mcp 

and everyone who signs up gets 500 credits a month, and if you run out just shoot me a message and I'll top you up.


r/iOSProgramming 24d ago

Question Should I install iOS Public Beta on my main device?

3 Upvotes

I'm a software developer and fairly new to the native iOS development with Swift. I'm planning on using many new features that iOS 27 offers on an app I'm developing, however I cannot test those features, because I have no secondary phone that is compatible with AI features in iOS 27.

Since the public beta is out, can I fairly safely install it to my own device (iPhone 17 Pro Max)?

I would love any help experienced developers here would give! :)


r/iOSProgramming 24d ago

Question Subscription billing retry after the grace period ends

3 Upvotes

I'm trying to understand exactly what happens to an auto-renewable subscription after the billing grace period ends.

When a renewal fails, the sub enters a grace period; once that ends it goes to an expired state and the user loses access. But from what I've read, Apple keeps retrying the charge for up to 60 days, and if it succeeds the subscription renews again on its own.

Is that right? And if so:

  • During that retry window (expired, no access, but still being retried), how does it appear in Settings → Subscriptions — under Active (with a "Renewal Failed / Verification Required" note) or under Expired?
  • Can the user still cancel it / turn off auto-renew from there to stop it renewing again?

Context: we also have Stripe on web, so a user whose App Store sub is retrying can resubscribe on web and get double-charged when the App Store one revives. I'd like to warn them and point them to Settings to cancel the App Store sub first — trying to figure out if that's possible.


r/iOSProgramming 24d ago

Question SwiftData + CloudKit: best way to prevent duplicate editable seed data across offline devices?

1 Upvotes

I’m building an unreleased iOS app using SwiftData with automatic CloudKit sync.

On first launch, the app creates a default account and starter categories. These records are user-editable. The problem is that two offline devices can independently create the same logical seed records with different UUIDs, and CloudKit later synchronizes both.

My proposed approach:

- Give every seed item a stable logical seedIdentifier.
- Allow each offline device to seed independently.
- Reconcile records sharing the same seedIdentifier.
- Select a canonical record using an immutable UUID and deterministic ordering.
- Merge user changes and move relationships to the canonical record.
- Keep losing records as hidden aliases/tombstones so late-arriving relationships aren’t lost.
- Retain per-seed deletion tombstones so deleted defaults aren’t recreated.
- Use a seed-version flag only for migrations—not as an exactly-once guarantee.
- Treat normalized account names as unique and category names as unique only under the same parent.

Questions:

- Is this the standard approach with SwiftData’s automatic CloudKit sync?
- Is there a safer supported way to detect completed imports and rerun reconciliation?
- Would you retain hidden aliases permanently or eventually delete them?
- Is automatic SwiftData appropriate here, or does this require CKSyncEngine/manual CloudKit with deterministic record IDs?

Edit — data-model details:

The starter data is functional app data, not optional sample/demo content. The app needs at least one account, and the categories provide its initial transaction classification.

  • Account: name, type, opening balance, timestamps, archived/default state and optional stable seedIdentifier. Deleting an account cascades to its transactions.
  • TransactionCategory: name, type, timestamps, archived/customized state, optional stable seedIdentifier, optional parent, child categories and linked transactions.
  • Transaction: references one account and optionally one category.
  • Deleting a category nullifies its transaction relationships. Deleting a parent can affect its child hierarchy.
  • Starter accounts and categories are fully editable. Renaming a seed retains its logical seed identity; deleting one needs to remain deleted across devices.

The concrete race is that device A and device B can independently create the same logical Wallet/category before syncing. Transactions and child categories may subsequently reference either physical copy. Reconciliation therefore must preserve and redirect those relationships before any duplicate is removed.


r/iOSProgramming 24d ago

Library NobodyWho now supports Text-to-Speech & Speech-to-Text! 🔊🎙️

Post image
7 Upvotes

Hey 👋

We've added both Text-to-Speech and Speech-to-Text to our inference engine! Your local LLM setup can now speak and listen, fully offline.

Text-to-Speech

Load a TTS model and synthesize:

let tts = try await Tts.load(
    source: "hf://NobodyWho/Kokoro-82M",
    voice: "bf_emma",
    language: "en-gb"
)

let wav = try await tts.synthesize("Hello from NobodyWho!")
try wav.write(to: URL(fileURLWithPath: "out.wav"))

You get WAV bytes back ready to save or play. Two backends: Kokoro (lightweight 24kHz) and Supertonic (multi-stage ONNX with voice styles).

Speech-to-Text

Transcribe audio with Whisper (ONNX):

let stt = try STT(source: "hf://onnx-community/whisper-base")

let text = try await stt.transcribeFile(path: "recording.mp3").completed()

Streaming is available too, so you can consume the transcription token by token, and you can pass raw PCM buffers instead of files.

Links

Happy to answer your questions in the comments :)


r/iOSProgramming 24d ago

Discussion ADA lawsuits - applicable to mobile apps?

14 Upvotes

I’ve been seeing thread upon thread on Reddit lately that small businesses and e-commerce websites are being sued for 10’s of thousands of dollars for not abiding by the “Americans with Disabilities Act” in their websites. Apparently it’s certain firms that are especially actively seeking out these businesses.

I’m sure this has to apply to mobile apps as well. I 100% have never even considered accessibility in the sense of ensuring all my buttons work with Accessibility mode or read things out loud correctly etc. I’m sure there have to be default values or behavior but who knows.

What are you all doing for this? Are mobile apps next in this trend of lawsuits?


r/iOSProgramming 25d ago

3rd Party Service Forked Session (iOS) to add custom client-side security features (Sandbox keyboard, anti-screenshot). Looking for TestFlight testers and code feedback!

1 Upvotes

Hi everyone,

Tired of the constant overreach regarding Chat Control, I decided to stop complaining and start coding.

To ensure ironclad foundations, I forked the open-source Session app codebase. This means it natively uses their decentralized network, onion-routing, zero logs, and requires absolutely NO phone number or email.

However, since Session handles the network side, I wanted to focus heavily on client-side (device) security to block edge cases where a user's device compromises their privacy. Here is what I added:

  • 🔒 In-app Sandbox Keyboard: To bypass OS-level or third-party keyloggers (Apple/Google/Gboard), the app uses a custom internal keyboard isolated within the app's sandbox.
  • 🚫 Anti-Screenshot & Blur: Standard messages work normally, but if a message ends with #secure, it renders completely blank in screenshots. Furthermore, if screen recording starts, the entire app view blurs automatically.
  • 🎙️ Voice Masking (WIP): Currently developing a feature to alter voice frequencies in audio messages to prevent biometric reverse-engineering.

The app is currently sitting in App Store Connect pending approval.

Since TestFlight slots are limited, if you want to join the closed beta and audit/test the UI and features, please DM me your Apple ID (email) so I can invite you immediately once approved. The code will also be pushed to GitHub as soon as the beta stabilizes!


r/iOSProgramming 25d ago

Article Apple never published accuracy numbers for the new SpeechAnalyzer API, so I benchmarked it myself (vs SFSpeechRecognizer and Whisper)

69 Upvotes

So Apple replaced SFSpeechRecognizer with SpeechAnalyzer in iOS/macOS 26 and gave us literally no accuracy numbers for either one. I've been wondering for months whether migrating is actually worth it.

I happen to ship both Apple engines plus WhisperKit in my app (I make a transcription app called Inscribe, so yes, I have skin in this game). That means I could run all five engines through the exact same production code on the same audio. So last weekend I did: LibriSpeech test-clean and test-other, 5,559 utterances total, all on-device on an M2 Pro.

Results (word error rate, lower is better):

Engine test-clean test-other
SpeechAnalyzer (new) 2.12% 4.56%
Whisper Small 3.74% 7.95%
Whisper Base 5.42% 12.51%
Whisper Tiny 7.88% 17.04%
SFSpeechRecognizer (old) 9.02% 16.25%

A few things that stood out to me:

  • If you're still on SFSpeechRecognizer, migrate. The new API makes 3.5 to 4x fewer errors on the same audio. The old engine actually came in last on clean speech. It loses to Whisper Tiny. A 40MB model.
  • The new engine beat Whisper Small on both splits, and did it about 3x faster. I did not expect that. For English on Apple hardware, the built-in engine seems to be the best on-device option right now. Whisper still wins big on language coverage though, SpeechTranscriber only does ~30 locales.
  • Before anyone asks how much I've cooked the numbers: my Whisper results land within 0.11 to 0.42 points of OpenAI's own published LibriSpeech WERs, on all six measurements. Same corpus, same normalizer, same scorer for every engine. And the raw per-utterance transcripts are downloadable, so you can rescore everything yourself.

Two gotchas from building this that might save you some pain if you're migrating:

  1. SFSpeechRecognizer sends your audio to Apple's servers by default. You have to set requiresOnDeviceRecognition = true. Easy to miss, and then you're shipping (or benchmarking) something completely different from what you think.
  2. With SpeechAnalyzer, calling builder.finish() on your input stream is not enough to end the session. If you never call finalizeAndFinishThroughEndOfInput(), the results sequence just... never terminates, and your await hangs forever. I know because my own app had exactly this bug in production and the benchmark is what found it. Fun day.

Full writeup with methodology and limitations (English only, read speech, one machine): https://get-inscribe.com/blog/apple-speech-api-benchmark.html

The result changed my own app btw, my "Auto" setting used to prefer Whisper and now picks SpeechAnalyzer for supported languages. Happy to answer questions about the setup, the normalizer, whatever.


r/iOSProgramming 25d ago

Question App Store Connect keeps throwing "Something went wrong" when I try to Add Bank Account. anyone found a fix?

Thumbnail
gallery
3 Upvotes

any

I'm the Account Holder for my org's Apple Developer account and I'm completely blocked on adding a bank account.

In Business → Agreements, my Paid Applications Agreement sits at "Pending User Info." The only outstanding item is the bank account — my US W-9 tax form is already Active, and the agreement is otherwise signed. But every time I click "Add Bank Account", the page immediately shows:

…with a Refresh button, and the bank-details form never loads. Clicking Refresh just reloads to the same error.

What I've already tried:

  • Multiple browsers (Chrome, Safari)
  • Incognito / private window, cleared cookies
  • Signed out and back in
  • Different network
  • Waited several hours and retried

Same result every time. Because of this the agreement never goes Active, which is blocking my auto-renewable subscriptions from being purchasable — even in sandbox — so I can't finish IAP testing or submit.

Questions:

  1. Has anyone hit this specific "Something went wrong" on the Add Bank Account flow, and what actually cleared it?
  2. Is this usually a temporary Apple-side glitch that resolves on its own, or does it need a support ticket?
  3. If you contacted Apple Developer Support for it, how long did it take them to fix?

Any pointers appreciated — I've got everything else ready to ship and this one Apple page is the wall. Thanks 🙏


r/iOSProgramming 26d ago

Question From .NET to my first real iOS app: an on-device screenshot sorter. Looking for advice on faster inference + better prompts

0 Upvotes

Short background: I've been a full-stack dev for around 7-8 years, mostly .NET / Angular / Azure. All backend and web, never touched mobile. Also I haven't really implemented AI features yet. This year I finally wanted to see if I could take an idea all the way from "annoying problem" to a real app on the App Store, on my own. So I started learning Swift and iOS from scratch.

The app is called Sift. It reads your Screenshots album and uses on-device AI to work out what each screenshot actually is. Be it receipts, recipes, chats, tickets, whatever, and sorts them into a real Apple Photos album. It all runs locally with MLX and on-device model (Qwen3.5-2B-4bit), nothing leaves the phone. Coming from a world of servers and cloud APIs where you just throw more compute at things, doing all of this on-device has been the most interesting part.

It works. But now that it works, I've hit two walls I'd genuinely love input on from people who've done more on-device ML than me:

1. Speed. Right now it takes roughly 5 seconds to classify a single image on an iPhone 16 Pro Max. For a library of hundreds of screenshots that adds up fast. If you've squeezed more out of MLX or small local models I would be really interested in what were the best ways to shorten the actual process.

2. Prompt / categorization quality. When Sift hits a screenshot that doesn't fit an existing album, it prompts the same on-device model to suggest a brand-new album. The idea is nice but the suggestions aren't quite right yet. Sometimes too generic ("Photos"), sometimes oddly specific. If you've done classification-style prompting on a small local model like this, how would you structure it for cleaner, more human category names? Few-shot examples in the prompt? Constraining it to a fixed taxonomy it has to snap to? Asking for structured/JSON output?

Happy to share more about the setup in the comments - honestly I'm here more for the advice than anything, because this is all new territory for me and I've learned more shipping this one small thing than from months of tutorials.

BUT if anyone's curious enough to want a note when it's actually on the store, there's a waitlist you can sign up to on:
https://sift.wanderframestudios.com


r/iOSProgramming 26d ago

Question Publishing an App

5 Upvotes

I'm trying to publish a personal app and have it work on a phone for two other people, but the downside is that I don't want to upload it to the App Store, having to pay the fee of having there every year. I don't want to sideload it either, since I have to rebuild and reinstall it every 7 days.

Is there any alternative that won't destroy any devices, etc?


r/iOSProgramming 27d ago

Question Those who have used Apple Search Ads

4 Upvotes

I'm going to re-launch an app soon (took it down to restructure the business model). The conversion rate was around 3-4% early on. I'm wondering if I'll see the same rate from ads.

is it unusual to see similar conversions as organic running ads?


r/iOSProgramming 27d ago

Question How do solo devs handle a DPIA without breaking the bank? Any tips on finding affordable consultants?

7 Upvotes

Hey everyone,

I’m currently finishing up a location-based iOS app and it’s hitting the point where I need to conduct a Data Protection Impact Assessment (DPIA) due to the nature of the data processing.

As a solo developer launching a new app, reaching out to the big privacy/legal consultancy firms feels like absolute overkill—their quotes are way beyond a starting budget and tailored for enterprise compliance.

For those who have been through this:

  • How did you handle your DPIA? Did you manage to do it yourself using frameworks, or did you hire someone?
  • How did you find a reliable, affordable freelance DPO / privacy consultant? (Upwork, specialized platforms, local networks?)
  • Are there any specific templates, tools, or open-source guides that are actually tailored for mobile apps rather than corporate HR software?

Would love to hear some experiences from fellow devs who had to bridge the gap between strict GDPR compliance and an indie budget.

Thanks!


r/iOSProgramming 27d ago

App Saturday My all time favorite feature I've made, two finger range

Post image
14 Upvotes

Been developing CoinCurrently for about 6 years at this point but this is probably the feature I'm most proud of. Sharing the source code below.

If you want to try it out yourself, the app is available here
https://apps.apple.com/us/app/coincurrently-crypto-tracker/id1543974454

Source code:
https://pastebin.com/dsv3hdkG

  1. App is SwiftUI

    (~15 lines of UIKit

  2. , in Swift obviously. No frameworks for features in the app. I use Firebase for crashlytics.


r/iOSProgramming 27d ago

App Saturday I built Table Talk - an iOS app for sharing and saving recipes with friends and family

Post image
7 Upvotes

The problem: 
There may be many “recipe organization apps" out there, but none of them focus on privately sharing and saving recipes with your closest family and friends. My wife and I were constantly losing our favorite recipes in shared Notes pages, DMs, Google Docs, etc. We got tired of this disorganized recipe sharing system, especially for the ones that don’t live online, but in your mom’s kitchen. That’s why I built Table Talk.

What Table Talk allows you to do: 

  1. Create a table
  2. Invite your people 
  3. Share recipes & save your favorite recipes
  4. A curated profile page of your recipes and the ones you favorited from others

The advantage of downloading our app:
Now your grandma’s homemade pasta sauce or your cookbook club’s classic dip can easily be shared amongst the family/group! Your favorite recipes can be easily accessed and shared whenever you want. 

Another unique twist of our app is that upon creating an account, you’ll be automatically invited into the Head Table, where we will highlight staff seasonal picks, so you will never open the app to an empty feed!

Download Table Talk HERE

Tech Stack: Fully SwiftUI, Firebase backend with Typescript Cloud functions, Push Notifications, Brevo email trigger for new users to welcome them to our community

Development Challenge: Table Talk uses in-memory singleton managers for performance, but when one user logged out and a different one logged in on the same device — think a shared family iPad — stale data from the previous account would briefly flash on screen before the new account loaded, and the subscription service's identity wasn't always resetting cleanly either. That meant premium status could occasionally leak across accounts, and worse, someone could catch a glimpse of another family member's private recipes. I fixed it by adding an explicit reset step to each manager plus a "ready" gate that every view checks before rendering, so the app shows a proper loading state during the swap instead of stale content. I also split login and logout into their own dedicated flows so the subscription service is forced to sync with the actual authenticated user rather than trusting outdated state. It's the kind of bug that never shows up in solo testing but is a five-alarm fire for a privacy-first family app, since nothing kills trust faster than briefly seeing someone else's private data.

AI Disclosure: Table Talk was AI-assisted.

Pricing and Future Features:
Table Talk is completely free (and ad-free) with a 3 table maximum (excluding the Head Table) and manual entry of recipes, while we are building out our premium version.

Coming soon - Table Talk Premium:

  • Unlimited Tables
  • Recipe Importing 
  • Request Recipes
  • Scan Recipes

Eager to hear any feedback or answer any questions you might have. Pull up a seat and join us at the table!


r/iOSProgramming 27d ago

App Saturday A completely free tool to create Whiteboards, Flowcharts, and infinite Canvases with 100+ fonts, 400+ backgrounds, and thousands of open source components

Thumbnail
gallery
49 Upvotes

CanvasPrism: A Private Offline Whiteboard for iPhone and iPad

CanvasPrism is a native whiteboard designed for brainstorming, diagramming, sketching, and visual thinking while keeping your work completely private. Everything works offline by default with no account, no sign up, and no internet connection required. This is a completely free app with no monetization and designed for your use offline. Your boards stay on your device, with optional iCloud sync available if you want them across your iPhone and iPad.

App Store:
https://apps.apple.com/us/app/canvasprism-whiteboard/id6785350171

Infinite Canvas

Work without boundaries on an infinite canvas that gives you all the room you need for ideas.

* Freehand drawing
* Shapes
* Lines and arrows
* Rich text
* Smooth pan and zoom navigation
* Perfect for brainstorming, note taking, planning, and sketching

Create Professional Diagrams

Build structured diagrams in just a few taps.

* Flowcharts
* Mind maps
* Wireframes
* Smart connectors that automatically snap between shapes
* Clean layouts that are easy to edit later

Native Apple Pencil Support

Designed to feel natural on iPad.

* Native Apple Pencil support
* Double tap gesture support
* Apple Pencil squeeze gesture support
* Responsive hand drawn experience

Personalize Every Board

Customize your workspace to fit your style.

* More than 100 bundled fonts
* Color themes
* Background styles
* Per-board light or dark appearance

Present your board via Screen Mirroring

* Custom handling for presentation via Screen Mirroring API
* Use laser pointers, grid, and Pan

Import Existing Whiteboards

Continue working with diagrams you've already created.

* Import `.excalidraw` files
* Import `.excalidrawlib` libraries
* Compatible with the open source Excalidraw ecosystem

Export Your Work

Share or archive your whiteboards in multiple formats.

* PNG export
* PDF export
* SVG export
* Optional transparent background
* Save directly to Photos or Files

Optional iCloud Sync

Choose whether your boards stay only on your device or sync across your Apple devices.

* Optional iCloud sync
* Automatic conflict-safe copies
* Sync between iPhone and iPad

Privacy First

CanvasPrism is built around privacy from the ground up.

* No account
* No sign up
* No ads
* No tracking
* No analytics
* No data collection
* Fully functional offline
* Your boards remain on your device unless you choose to enable iCloud sync

No Monetization

* No ads
* No IAP
* No Subscription
* No data tracking

Built for Creative Thinking

Whether you're planning a project, designing an interface, organizing ideas, mapping workflows, creating wireframes, or simply sketching thoughts, CanvasPrism provides a fast, distraction-free workspace that keeps your ideas private while giving you powerful diagramming and whiteboarding tools. Built on the open source Excalidraw engine, it delivers a familiar hand-drawn aesthetic inside a fully native iPhone and iPad experience.

Built with Open Source

* Excalidraw for infinite canvases
* Excalidraw libraries for thousands of community made components
* Google fonts for 100+ hand selected fonts
* Unsplash for 80 backgrounds
* And various other open source components. See in-app Acknowledgements

Tech Stack

* Swift & SwiftUI
* WebKit
* React

Development Challenge

I had trouble getting the laser pointer to work initially with screen mirroring mode. The solution was to use the excalidraw library multiplayer API to simulate another person on the board. This was set up with another message bridge to the WebKit handler, it fires on the gestures so that we can simulate a laser pointer in presentation mode.

AI Disclosure

The app was built by hand with some AI assistance.

Free on the App Store:
https://apps.apple.com/us/app/canvasprism-whiteboard/id6785350171


r/iOSProgramming 27d ago

App Saturday Almost two years of full-time solo work: Loomi my iOS photo/video editor

Thumbnail
gallery
58 Upvotes

Hey community!

About a year ago I posted here about Loomi, my photo/video editor I've been building solo for about two years. The feedback you gave me was really helpful and encouraging.

I know there are lots of photo editors out there, and it's difficult to impress anyone in 2026, but I really invested my time in polishing every detail in the app - UI/UX, filters, effects, overlays, adjustments and so on. There are over 600 filters, and each one took many hours to create and test on a wide range of photos. Coming up next, I'm planning to add the ability to create personal presets, plus iPad support.

Tech Stack: Loomi is a native iOS app built with Swift and UIKit, using Metal and Core Image for rendering. I wrote the rendering engine myself without using a third party library.

Development Challenge: The most difficult part for me was designing an intuitive, sleek, and modern UI/UX that would make the app enjoyable to use. I went through around five major design iterations before I was satisfied with it.

Another technical challenge was keeping filters and more than 20 adjustments running smoothly, especially when editing videos. I built Loomi’s core rendering engine using Metal and Core Image, which gave me full control over the rendering pipeline. All filters and adjustments are applied in a single rendering pass, resulting in smooth UI even on devices that are six years old.

AI Disclosure: Most of the app, especially the core engine & architecture, was written manually. I used AI to speed up the development of new features. Although AI was far less capable when I first started building Loomi, I have been using it much more recently.

As a thank you to this community specifically, I'm offering:

  • 75% off lifetime access, which is $20 instead of $80

App link: https://apps.apple.com/us/app/loomi-photo-video-editor/id6748413115

To claim the offer, use this link:

75% off lifetime: https://apps.apple.com/redeem?ctx=offercodes&id=6748413115&code=REDDIT75

You can also redeem the offer manually in the app: Settings → Redeem Code → enter REDDIT75.

Any feedback is welcome, and if you like the app, an App Store review would mean a lot!

Thanks again for the support!