Skip to content
megapromotingLet's talk

Expertise · Mobile applications

Applications for phone, built so that the logic can be verified without the phone.

We build native iOS apps in Swift, with sensors and HealthKit, and single-code applications for iOS, Android and web when the project does not require sensors. The logic core is tested separately from the screen.

Already builtSunt trei implementări proprii, nu una. Un depozit cu cinci ținte de aplicație (patru iOS și una macOS) definite în `project.yml`, ale cărui teste de logică le-am rulat azi: 160 din 160 trec. O a doua aplicație iOS, în alt proiect, cu 40 de fișiere Swift și HealthKit. Și o a treia direcție, cu un singur cod pentru iOS, Android și web, a cărei variantă web răspunde astăzi. Rezerva care schimbă răspunsul la întrebarea pe care o pune orice cumpărător înainte de toate: niciuna dintre aplicațiile noastre nu este publicată în App Store sau Google Play. Motivul e unul singur și are nume — `DEVELOPMENT_TEAM` este gol în configurația de proiect, adică lipsește identificatorul de echipă din Apple Developer Program. Mașina are o identitate de semnare validă, suficientă pentru instalare pe dispozitiv propriu, insuficientă pentru distribuție în magazin. E o problemă de cont, nu de cod, dar rămâne o problemă și o scriem aici, nu la subsol.

A mobile application has two parts that break differently. The part that reads sensors and calculates something — an angle, a score, a state — and the part that draws screens. We keep them separate, and not for aesthetic reasons: in our main iOS repository, the core files do not import the interface, so they can be compiled directly with `swiftc` on Mac and run as a regular programme, without a simulator and without a phone. The suite has 160 checks grouped into 16 stages; we ran it today and it passes in full. That is why we can say exactly what an algorithm does, instead of saying that it “works well”.

On iOS we work in Swift 6, with a minimum target of iOS 17. The same repository defines five applications as separate targets: four for iPhone and one for macOS, and the macOS one reuses fifteen files from the iOS core, without copying. Sensors are read at source: Apple’s interface for headphone sensors exposes head orientation, and the app compares the current angle with a position the user calibrates at the start of the session. The thresholds are not “internal adjustments”: below 7° it is straight, between 7° and 13° it is tilt, above 13° held for three seconds it triggers the alert, and smoothing uses an exponential average with coefficient 0.15. All four values are in four consecutive lines of code and can be shown.

When the project does not need sensors, we do not recommend native. The third direction in the portfolio is a single codebase that compiles for iPhone, Android and browser — React Native with Expo — and the web version is published and responds today. The practical difference for the client: a questionnaire, a calculator or a dashboard does not justify two teams and two repositories; an application that listens to a sensor at twenty samples per second does.

What we cannot yet do. None of our applications is in the App Store or Google Play. Not because they do not compile — they do compile, install on the simulator and pass the tests — but because in the project configuration the Apple team identifier is empty, meaning there is no Apple Developer Program enrolment linked to these builds. On Mac there is a valid signing identity, of development type, which is enough for installation on one's own device and not enough for the store. For a client project, the developer account is opened under the client company and remains theirs — that is the discussion that must be had at the beginning, not at the end.

What it covers

The work, by component

We read the sensor at source, not through an intermediate library

On iOS we use Apple interfaces directly: `CMHeadphoneMotionManager` for head orientation from the headphones, with a delegate for connect and disconnect, and explicit verification of the authorisation state before starting the stream. If the sensor is not available, the state moves to `waiting`, not to a silent error.

The logic core does not know that a screen exists

The analysis, calibration, history and policies files are plain Swift. They compile with `swiftc` together with the test file and run as a command-line binary. Today's result: 160 checks, 16 stages of 10, all passed. A test that runs in two seconds on Mac runs on every change; one that requires a simulator does not.

The interface is built over the core, on iOS and macOS at the same time

SwiftUI for both. The macOS target from the same repository includes fifteen files from the iOS core as shared sources, not as copied files, so a fix in the algorithm reaches both applications at the same time.

A single codebase for iOS, Android and web, when that is the right choice

Expo on top of React Native, with `react-native-web` for the browser version, fonts loaded from the package and separate app icons for Android, including the monochrome variant required by the system. The same application runs on the phone and in the page, from a single repository.

Health data: a declared policy for each data type

We do not ‘read HealthKit’, but a table in code: eleven data types (postural angles, raw headset motion, heart rate and variability, sleep, walking, audio exposure, guided sessions and others) and five possible regimes (local only, HealthKit read, workout write, relaxation session write, route write). Each type is explicitly assigned one of the regimes. The second iOS app in the portfolio, from a private project, uses the same approach across 40 Swift files.

The privacy files required by Apple, present from the start

Four targets have `PrivacyInfo.xcprivacy` included as a build resource, not added in haste after the first rejection. The usage descriptions for motion, camera, microphone, HealthKit and notifications are written in Romanian, in the project configuration, not generated automatically.

What leaves the phone: in the reference iOS app, nothing

Searching for `URLSession` in the iOS target sources returns zero results. History is stored on the device, through `FileManager` and `UserDefaults`, with an option to delete the file. The only network code in the repository is in a macOS app function, in a separate file. When an app does not need a server, we do not give it one.

The onboarding journey, tested as state, not as a screen

The onboarding has 24 steps with unique, ordered identifiers, and some steps require explicit confirmation (sensor limits, foreground operation, privacy, readiness) without which the continue button remains blocked. State is encoded and restored. Ten of the 160 tests check exactly that.

Signing and distribution, stated from the start

We check which developer account exists, under which company, who administers it and what is missing for the build to be signed for the store. It is a short and boring list, but it is the difference between an app that works on our phone and one that reaches users.

What it looks like

The path, step by step.

01

We decide native or shared code, based on sensors

The question is not one of taste, but of hardware: does the app need motion, health, Bluetooth, a real-time camera, background? If yes, native. If it is about forms, calculations, lists and a dashboard, a single codebase for iOS, Android and web does the same job with half the maintenance. We deliver the written decision, with the reason.

02

We build the core before the screens and cover it with tests that run without a phone

The algorithm, thresholds, states and persistence. The tests compile directly on the Mac and run in a few seconds. We deliver the suite and its result, not a promise of quality.

03

We place the interface over the core and run on the simulator and on the device

SwiftUI on iOS and macOS, or React Native when we have chosen shared code. We check the onboarding journey, permissions and behaviour when the sensor is missing or disconnects in the middle of the session — the case that often breaks in practice.

04

We prepare distribution, with the client’s account

Bundle identifier, version, icons, privacy file, permission descriptions, team identifier from the Apple Developer Program. This is where projects that have not discussed the account from the start get blocked — including ours, which is exactly why we put this step on paper.

Ce vede utilizatorulAplicațiaRețea și securitateGăzduire și dateFIECARE STRAT, ALES ȘI EXPLICAT
Patru straturi, de jos în sus: senzorii platformei (mișcare din căști, HealthKit, notificări); nucleul de logică în Swift simplu, care nu importă interfața și de aceea poate fi rulat pe Mac fără telefon; interfața SwiftUI, aceeași pentru iPhone și macOS; și stratul de distribuție — fișier de confidențialitate, permisiuni declarate, semnare. Ultimul strat e singurul pe care nu l-am parcurs până la capăt, și de aceea e desenat deschis.

The data

What we touch, where it lives, and how long it stays

The questions anyone with a data protection officer would ask — asked here before they do.

Where the data sits when the application has no server
On the device. The postural history is serialised into a custom file via `FileManager`, and preferences into `UserDefaults`, with app-prefixed keys. There is a command to delete the history file. Nothing goes to a server for the simple reason that the application contains no network code.
Health data is read only with consent, and only the declared data
HealthKit asks for user consent at the data-type level, and the application declares in configuration why it requests them. The policy in code explicitly separates what is read from what is written back to Health. No diagnosis is made and nothing is transmitted to us.
What Apple requires you to declare, regardless of what you do with the data
The application privacy file and the usage descriptions for each permission (motion, camera, microphone, health, notifications). They are a condition for acceptance in the store, not an option, and they are written in the language the user speaks.
How long it is kept
As long as the user decides, when the data is on the phone: uninstalling the application takes it with it, and deleting it from the application is an explicit operation. When a project does have a server, retention is written into the contract before the first line of code, because it determines what can and cannot be built.
The developer account and signing keys
They remain the client’s, on the client’s company. We work with delegated access. The reason is practical, not principled: an application published on the supplier’s account becomes impossible to move on the day the supplier changes.

A case

An iPhone application that measures one thing, and measures it verifiably

The situation

A self-initiated project, not a client’s: a concentration timer that observes how much the head has tilted relative to a position calibrated by the user at the start of the session. I needed a case in which claims about the algorithm could be shown, not described.

What we built

I separated the core from the interface and wrote the thresholds in code, not in documentation: below 7° upright, between 7° and 13° slipping, above 13° held for three seconds triggers the haptic alert, with exponential smoothing at coefficient 0.15. The data come from Apple’s interface for the sensors in the headphones, with explicit handling of disconnection. The onboarding has 24 steps, of which four require confirmation of the limits before allowing the user to continue. From the same core I also built a macOS variant.

What came out

The logic suite compiles with `swiftc` and runs on Mac in a few seconds: 160 checks in 16 stages, all passed on the last run. The application installs and starts on the simulator. Any statement in the paragraph above can be verified by opening four lines of code.

What the case does not say

It is not in the App Store. The project configuration has an empty Apple team identifier, so the build cannot be signed for distribution — a lack of enrolment in the Apple programme, not a lack of functionality. And one more limitation, of the product not of the code: it measures head tilt, not spine health, and works with headphones that expose motion sensors through Apple’s interface.

Questions

What people ask us before they call

Do you have an application published in the App Store, so that I can see it?

No. None of our applications is in the App Store or Google Play, and it is right to ask that first. What we can show: five application targets defined in the same project, of which four for iPhone and one for macOS, which compile and install on the simulator, plus the 160-check logic suite, run on request in front of you. The publishing blocker is empty `DEVELOPMENT_TEAM` in the project configuration, that is, the absence of a team identifier from the Apple Developer Programme. On Mac there is a valid signing identity, of development type — enough for installation on your own device, not for the store.

Then how do I know you can take an application all the way to the store?

If you ask for proof of publication, there is none and we do not invent one. What you can verify is the rest of the chain: code that compiles, tests that pass, privacy files present, declared permissions, icons and versions configured. The missing step is a paid enrolment in an Apple programme, made on the company that owns the app. In a client project, that account belongs to the client and is opened at the start, precisely so it is not the step that catches anyone by surprise at the end.

Native or a single app for iOS and Android?

It depends on the sensors. If the app reads motion, health, Bluetooth or camera in real time, native — those interfaces belong to the platform and any intermediate layer adds delay and new ways to fail. If the app is essentially forms, calculations and result screens, a single codebase covers iOS, Android and browser from one repository. We have both options in our portfolio and we choose with a written argument, not by default.

Do you also make Android apps?

Through shared code, yes: the same Expo project produces a build for Android, with the adaptive icon and the monochrome variant required by the system already configured. Native Android, in Kotlin, is not in our portfolio — if a project requires it, we say so before, not after signing.

How do you check the logic is correct if you do not have my phone?

By the fact that the core does not depend on the screen. The analysis files compile separately, with the Swift compiler, and run as a program on the Mac. The current suite has 160 checks in 16 stages and runs in a few seconds. What cannot be checked that way — how a vibration feels, how a screen looks on a particular phone, how the headphones behave when they come out of one ear — is tested on the device, and we say which is which.

Can the app read my Health data?

Only if you approve it, type by type, in the Apple screen, and only the declared ones. In code, the policy is explicit for each kind of data: some stay only on the phone, others are read from HealthKit, others can be written back as a workout or a relaxation session. No diagnosis is made, and the data does not reach us.

What happens to the data if the app has no server?

It stays on the phone. In the reference iOS app from our portfolio there is no network call — searching for `URLSession` in the sources of that target returns zero results. The history is written to a local file and can be deleted from the app. When a project needs a server, we build it, but we do not add it as a reflex.

Can we take over an existing app, made by someone else?

It starts with a compatibility check, not with an offer: which platform version it targets, which dependencies it has and which of them are still maintained, whether the build reproduces on a clean machine, who owns the developer account and the keys. There are projects where the honest answer is that rewriting the core costs less than maintaining it.

Do you also make desktop apps?

On macOS, yes, and from the same core: in our main repository the macOS target reuses fifteen logic files from the iPhone app, as shared sources. Windows is not in the portfolio.

What the statements above rest on (11 sources)
  1. Varianta web a aplicației cu cod comun răspunde azihttps://longevita-alpha.vercel.app/ · 2026-09-06

10 of them are code and files from our repositories. We don't publish their name or line: together, on a single page, they would describe too precisely how systems that aren't only ours are built. We go through them with you, in the repository, on request — verification stays possible, it just happens in a conversation.

What would you want to work better?

Tell us about your process. Together we decide what is worth building, what we can connect, and how we check the result.

Let's talk