Architecture & Status
This page is a summary. The full, detailed trail — every bug found, every fix, every verification step — lives in ARCHITECTURE.md in the repository. This project's own discipline is to verify claims against real source and real devices rather than assume from documentation, and to record the trail rather than just the conclusion.
Confirmed on real hardware
Android — build, install, launch, and render all completed successfully, repeatedly, across multiple real apps (a counter starter, a small shop app with a product list, cart, and Pinia store). Auto-imports reach the real on-device bundle. useWebSocket() is fully verified: a real Node.js server bridged over USB, live message round-trips confirmed on-device.
iOS — verification started on a real physical device (no simulator). Install, launch, full-screen rendering, safe-area layout, and tap/gesture responsiveness are all confirmed working, after finding and fixing four real bugs in a single session:
- A broken
Info.plistscaffold (ns platform add iositself, not this framework) missingCFBundleExecutable— caused a hard install failure. - A missing launch-screen reference in the same broken scaffold — caused the app to render in a legacy scaled compatibility mode instead of filling the screen.
- An async navigation-timing race in
useSafeArea()— took five iterative rounds to find the real root cause (a lookup racing NativeScript's own asynchronous page-navigation queue), including one fix that crashed the app on launch and was caught and reverted. - A device-pixel-vs-DIP unit mismatch in the same composable, found while confirming fix #3.
Confirmed fixed, found on a real client app
Two real Android bugs, found not by internal testing but by a peer session actively building a client app on this framework, root-caused and fixed the same day:
- A non-zero
gap/row-gapon a<FlexboxLayout>(<NFlex>) silently drops its last child from the native view tree entirely — a real bug in NativeScript's own compiledorg.nativescript.widgets.FlexboxLayoutAndroid widget, isolated with a live device test (swapping which element was last moved the failure with it; an isolated rawrow-gapwith no Tailwind involved reproduced it identically). Not fixable from this framework's side, sogap/gap-*is disabled outright rather than left as a trap — see Styling & Tailwind. nativescript-vue's renderer never camelizes kebab-case template attributes on native elements —:action-bar-hidden="true"silently sets a nonsensenativeView['action-bar-hidden']property instead ofnativeView.actionBarHidden, confirmed by reading the renderer's own patch pipeline directly and by an on-deviceuiautomatorview-hierarchy dump. A sweep of every component this framework ships found the same pattern inNText/NBadge/NButton's text-wrap,NButton/NSwitch'sisEnabled(disabled/loadingwere never actually disabling the native control, only its visual styling),NSwitch's off-color,NInput's max length,NBottomSheet's alignment, andNetworkImage/CachedImage's decode-size/cache properties (their documented performance optimization had never actually been applying). Fixed everywhere, and the project's own ESLint config now enforces camelCase project-wide so this can't quietly come back — see Styling & Tailwind for the attribute-casing rule this left behind.
Also fixed the same session: Android's safe-area insets (useSafeArea()) always read as zero, because getSafeAreaInsets() has no Android override anywhere in @nativescript/core — only iOS overrides it — while NativeScript's own Android runtime draws every page edge-to-edge regardless, unconditionally. And a Label text-clipping bug: @nativescript/core unconditionally disables Android's font padding on every Label/Button (its own comment calls this a fix for a different issue), which can clip tall glyphs and descenders — patched back to Android's normal font padding app-wide.
Not yet verified on-device
- The Android safe-area fix and the Label clipping fix above — both fixed via direct source/API confirmation, but on-device confirmation was interrupted by a device disconnect mid-session and hasn't been re-run since.
useWebSocket()'s iOS half (NSURLSessionWebSocketTask) — implemented against Apple's documented API, reviewed the same way the Android side was, but not yet compiled or run on a device.- Tailwind/
<NFlex>rendering on iOS, and whether iOS's own<FlexboxLayout>implementation shares the same last-child-drop bug found on Android — verified at the pipeline level (real PostCSS/Tailwind output through the same parser NativeScript's webpack uses), not yet confirmed on an iOS screen. - Most of the UI kit beyond what the reference app's counter and product pages, and the peer session's real client app, exercise.
Every open item above is tracked as its own issue in the GitHub repo.
A known, open bug
Editing a page's own <script>/<template> and letting LiveSync hot-reload it while sitting on that page (no prior navigation) can push a duplicate page onto the navigation stack with a spurious back button. Root-caused to nativescript-vue's own <Frame> element: inserting a page navigates, but removing one is a documented no-op — a gap in nativescript-vue itself, not something this framework's code fully controls. Workaround: fully restart the app after a page-level edit instead of trusting LiveSync's in-place reload.
Verification discipline
Every claim of "verified"/"confirmed" in this project's own docs means a specific, real check was actually run — a webpack compile, a Gradle build, an adb install onto physical hardware, a real device console log — not just "should work" reasoning from documentation. Where something hasn't been run that way yet, the docs say so explicitly rather than implying otherwise.