# Welcome to uranashel > Who we are, why five apps exist, and how this blog explains the physics behind them — in plain language. 2026-07-04 · 20 min read · studio · by ntan (ntan) for uranashel Canonical HTML: https://uranashel.com/blog/welcome-uranashel.html --- I am ntan in the commit logs. I write the mobile clients at uranashel, plus most of the sensor and digital signal processing math that sits underneath them. We are a three-person studio based in Vietnam. I handle SwiftUI, Jetpack Compose, and the physics; **atuan** runs backend services, CI pipelines, and release trains; **ktuyen** owns QA, the garage test matrix, and the Vietnamese copy that keeps our App Store screenshots from reading like machine translation. No venture capital. No ad SDKs in the sensor apps. No pitch deck pretending we are building "the future of mobility." We ship tools we already use on real hardware before they reach the store. Under the `com.uranashel` bundle family we publish five apps on the App Store; **Stashio** also ships on Google Play and as a Chrome extension. **Wheria** finds your parked car after GPS dies in a basement garage, fusing IMU step counting, barometer floor hints, and magnetometer heading into a walked path you can retrace instead of a lying blue dot. **Estua** synthesizes non-repeating ambient sleep audio at 48 kHz, entirely on the phone. **Sonarish** is a noise meter and spectrum analyzer with machine baseline comparison, built for anyone who hears their AC unit change pitch after three years. **Phyzix** exposes more than 100 live physics instruments and simulations, in English and Vietnamese. **Stashio** captures links, PDFs, and voice notes from the share sheet, then finds them again by keyword or by meaning. Each product grew from a specific annoyance, not a market trend slide. ## The Tuesday that started everything The origin story people ask about is not glamorous. On an ordinary Tuesday I parked on level B3 under Landmark 81 in Ho Chi Minh City, the tallest building in Vietnam, with a basement parking structure deep enough to swallow radio signals whole. I photographed the pillar number and took the elevator up. When I came back 40 minutes later, the map showed my car floating in the Saigon River, roughly 400 m east of reality, holding a steady 0 km/h midstream. I walked two full laps through identical concrete rows before I found it. The failure mechanism is boring and well documented. L-band GPS signals attenuate hard in reinforced concrete, and the little energy that leaks underground arrives via multipath reflections that bias range estimates by tens of meters. Every mapping app knows this. Every mapping app drew the confident pin anyway, as if satellite geometry were a matter of opinion; I wrote up the full mechanism in [why GPS lies](https://uranashel.com/blog/why-gps-lies.html). That evening I opened Xcode and a blank Kotlin project side by side. "Indoor navigation" would have looked impressive on a conference badge, but the badge had nothing to do with it. The phone in my pocket already carried a 3-axis accelerometer, a gyroscope, a barometer, and a magnetometer, which together form a complete inertial measurement unit. The sensors were there. Nobody was reading them honestly. The whole build is documented in [building Wheria for indoors](https://uranashel.com/blog/building-wheria-indoor.html). ## Four more annoyances, four more apps Estua exists because my wife could hear the seam in an 8-minute rain loop at 2 in the morning. That is normal hearing, unfortunately. The human auditory system is absurdly good at detecting repetition, and a recorded loop fails the sleep test no matter how long you stretch it. So Estua synthesizes its audio at 48 kHz on the phone rather than playing recordings, and every night comes out statistically fresh. How the generators avoid repeating themselves has [its own post](https://uranashel.com/blog/estua-non-repeating-audio.html). Sonarish came from a residential AC unit that developed a 127 Hz hum, a harmonic of mains frequency and motor pole count, and from the discovery that no consumer sound meter could track that hum over weeks. We built the tracking ourselves: A-weighted levels checked against the NIOSH 8-hour exposure limit, a live spectrum, and a machine baseline you record while the machine is healthy so that later drift shows up as a number you can argue with. The same acoustic core turned out to measure breathing without contact; from an inaudible tone it resolves chest displacement down to 118 µm. Phyzix came from watching students treat phones as TikTok machines while every one of those phones held a sensor laboratory nobody had opened. It exposes more than 100 of those instruments directly, bilingual, raw numbers visible. Stashio came from my own Notes app, which had accumulated 2,400 unsorted links across four years of garage testing and paper reading. The fix was a capture path through the share sheet plus retrieval by meaning. After three months of daily use, roughly 94% of my retrieval attempts succeed in under 10 s. ## Where the physics sets the limits The barometer is the cleanest example of physics deciding what a feature may claim. Hydrostatic equilibrium says `ΔP = ρ·g·Δh`. Put in air density of about 1.2 kg/m³ and g of 9.81 m/s², and 1 m of height change moves pressure by roughly 12 Pa. A typical parking floor is 3.2 m tall, so one floor is worth about 38 Pa. Meanwhile a phone barometer sitting still shows 0.3–1 Pa RMS of noise; our own bench note, 3 phones logged overnight on a shelf, landed at 0.4, 0.6, and 0.9 Pa RMS. Divide signal by noise and the honest claim writes itself: Wheria can tell B2 from B3 with a stated uncertainty band, and it must never pretend to centimeters. The full derivation, including what weather fronts do to it, is in [the barometer math post](https://uranashel.com/blog/barometer-parking-math.html). Audio has an equally hard wall. At 48 kHz the render callback owes the hardware a buffer every few milliseconds, and that deadline turns into an absolute rule: no malloc, no locks on the audio thread, because a single allocation stall becomes an audible click at 3 am. Position math has a third wall. Double-integrating consumer accelerometer data sends your estimated position into another building within 30 s, which is why Wheria counts discrete steps and never integrates acceleration twice. Each wall killed at least one feature idea we were fond of. The details live in [the audio thread post](https://uranashel.com/blog/dsp-audio-thread.html) and [the step detection post](https://uranashel.com/blog/step-detection-imu.html). The magnetometer is the diva of the set. Rebar, EV chargers, and a car's own body add local fields on the order of the Earth field itself, so heading is only usable after hard-iron and soft-iron calibration, and the calibration goes stale when you walk past a transformer room. ktuyen's EV-bay test cases exist because of one specific charger in one specific mall basement. The saga is told in [the compass calibration story](https://uranashel.com/blog/compass-calibration-story.html), and how the Kalman filter weighs all these unreliable witnesses is in [the Kalman post](https://uranashel.com/blog/kalman-filter-parking.html). ## How the three of us divide the work I write shared logic modules wherever the math must match exactly between platforms: Kalman filter updates, FFT window functions, step detector thresholds. Then I mirror the UI twice, once in SwiftUI and once in Compose. Two codebases with one math core sounds wasteful until you have debugged a filter that behaves differently on the two platforms because someone ported it twice; the reasoning is laid out in [the two codebases post](https://uranashel.com/blog/cross-platform-two-codebases.html). atuan keeps Stashio sync honest, manages the signing certificates, and tags iOS and Android releases with aligned version numbers so ktuyen never tests a mismatched pair. ktuyen maintains test plans segmented by garage architecture: open slab structures like Landmark, narrow spiral ramps in mall basements, flat outdoor lots, and the magnetometer nightmares around EV charging bays. She catches regressions of the shape "compass drift on iPhone 15 inside a steel garage but fine on Pixel 6" before users ever see them. We ship both platforms together by policy. Every feature lands twice, every bug lands twice, and parity is a release gate. ## A deliberately quiet interface Every uranashel product has a physics or signal-processing spine beneath the UI, and we keep the surface deliberately quiet about it: monochrome palettes, Nunito type, 12 px corner radius, nothing animated competing with a measurement. The test we design against is a parking garage at 11 pm, tired user, one glance. The [Wheria](https://uranashel.com/apps/wheria.html) home screen is a single card: the car, 124 m away, floor B2, pillar E9, a note that says near the elevator. The palette decision and the type decision each got a post, [monochrome UI](https://uranashel.com/blog/monochrome-ui.html) and [Nunito on every pixel](https://uranashel.com/blog/nunito-on-every-pixel.html), because we argued about both for weeks. ## What this blog covers An App Store description cannot explain hydrostatic floor math. It cannot explain why malloc on the audio thread produces clicks at 3 am, or why double-integrated accelerometer data leaves the building within 30 s. This blog is the long-form companion to the store pages: how the apps actually work, what we tried and discarded, which ideas survived contact with real garages. Most posts come from the mobile and sensor side of the studio, because that is where I sit. When atuan has a release infrastructure story or ktuyen has a QA story worth telling, they will appear here too. If you want to reproduce some of the measurements, the [lab page](https://uranashel.com/lab.html) lists our setups. If you have compass rants, garage logs, or questions about anything we build, write to [uralab95@gmail.com](mailto:uralab95@gmail.com). For the engineering philosophy everything above hangs on, keeping computation local to the device, start with [why everything runs on your phone](https://uranashel.com/blog/on-device-first.html). --- uranashel · [Home](https://uranashel.com/) · [Apps](https://uranashel.com/apps.html) · [Lab](https://uranashel.com/lab.html) · [About](https://uranashel.com/about.html) · [Blog](https://uranashel.com/blog/) · [Developers](https://uranashel.com/developers/) · [API docs](https://uranashel.com/docs/) · [Privacy](https://uranashel.com/privacy.html) Machine-readable: [llms.txt](https://uranashel.com/llms.txt) · [sitemap.xml](https://uranashel.com/sitemap.xml) · [openapi.json](https://uranashel.com/openapi.json) · [API](https://uranashel.com/api/v1/)