Founder at OnlyApps. Lessons from 40+ commercial projects. Swift/KMP, AI-assisted development, and the systems behind a small software company.

Novi Sad, Republic of Serbia
Joined March 2019
Signed AAB, locked submit button. ID Caller's Play release needed foreground-service and Data safety forms that the Developer API can't fill. Our order now: manifest → demo video → data inventory → console forms. onlyapps.org/blog/google-pla…
24
We forked webrtc-kmp, not our call stack. An iPhone video freeze came from a camera-size view escaping `useContents` into freed memory. Return width/height inside the scope. After fix: 705+ encoded frames; before: 110–170. onlyapps.org/blog/webrtc-kmp…
48
Agent edits deploy CI? Actions `queue: single` replaces a pending run, even with `cancel-in-progress: false`. Before merge, start 3 runs; check which execute. docs.github.com/en/actions/h…
26
Cached result, flashing spinner? A completed Future newly given to `FutureBuilder` still yields one `waiting` frame. Create the Future outside `build`. Gate: rebuild its parent and assert no second loading frame. api.flutter.dev/flutter/widg…
42
KMP doesn't need an `expect` class per target. Keep a common interface; pass Android/iOS implementations at app entry points. Gate: test common logic with a fake and check each platform's wiring. kotlinlang.org/docs/multipla…
46
We've updated the ONLYAPPS website. Explore our products, tech stack and engineering notes—from mobile and desktop apps to bots and automation. Built and run in Novi Sad, Serbia. onlyapps.org
60
Flutter `Hero` needs the destination hero on the first animation frame. A detail screen that adds it after loading data misses the flight. Render a tagged placeholder immediately; test navigation with a cold cache. api.flutter.dev/flutter/widg…
56
Agent PR edits `.github/workflows`? Green CI is not a security review. `pull_request_target` + untrusted checkout can expose secrets and write access. Before merge: inspect trigger, checkout ref, token permissions. docs.github.com/en/actions/r…
45
KMP → Swift: `suspend` without `@Throws` propagates only `CancellationException` as NSError. Other uncaught exceptions can terminate the app. Declare expected errors at the boundary; test one from Swift. kotlinlang.org/docs/native-o…
59
AnimatedSwitcher won’t fade between two Text values with the same key. Same type + key updates in place. Key by value; assert both children exist mid-transition in a test. github.com/flutter/flutter/b…
41
Our 2025 VPN trial explainer lays out the trade: 15 minutes connected, then wait 45 or subscribe. Let people test a real connection; don’t call unlimited server time a free trial. Which task must your trial let someone finish? onlyapps.org/why-15-min-sess…
24
A two-day-old queue replay can double-count usage. Stripe meter-event IDs are unique for at least 24h, not forever. Dedupe by event ID in your own durable ledger; replay an old job in staging and reconcile the meter total. docs.stripe.com/api/billing/…
37
`PopScope(canPop: false)`: Android reports a blocked swipe (`didPop=false`); Cupertino iOS detects none. An unsaved-edits dialog in the callback won’t show on an iOS swipe. Test both. github.com/flutter/flutter/b…
39
KMP iOS: `transitiveExport = true` exports dependencies of exported modules. Kotlin warns of bigger binaries and longer builds. Export only modules Swift calls; compare release XCFramework sizes. kotlinlang.org/docs/multipla…
53
StoreKit has two paths: `Product.purchase()` returns same-device success; `Transaction.updates` receives Ask to Buy approvals and other-device buys. Verify entitlements in one handler. Test both flows. developer.apple.com/document…
42