Skip to content
Ubriot never serves an over-the-air update to a binary built after it.Read the note

How Specvista technology works.

We build and operate our own software and infrastructure, and deploy it with partners.

Areas

Engineering principles

  • Operate what we build

    We run our own products and infrastructure in production. A system is not finished until it can be deployed, watched and rolled back safely, so delivery is first-class engineering for us.

  • Whole systems

    We own every layer we ship, from native code on the device to the servers and pipelines behind it, so nothing important sits in a gap between teams.

  • Build what should exist

    Ubriot began as the tooling we needed to ship our own apps. We build the thing we wished existed, then make it good enough for everyone else.

  • Every release has a way back

    Updates go out on channels, the last artifact we still trust is kept, and an over-the-air update is never served to a binary that was built after it. Rolling back is one click, not a weekend.

  • Checked before and after every deploy

    Each of our sites has a smoke test that runs against the real address before a change ships and again once it is live. If either run fails, the change stops there.

  • Tools that do not depend on one person

    Credentials, alerts and runbooks belong to the team account, not to someone's laptop. In Ubriot, Apple signing credentials are stored once for a team and cover every app on it.

One release, five stages

  1. 1Build

    Signed iOS builds run on macOS workers and Android builds on Linux workers, with the log, artifact and source reference kept together. Teams can run the worker on their own Mac or Linux server.

  2. 2Check

    Before submission, a scan flags common App Store rejection causes. Before an over-the-air update, Ubriot warns when it targets a runtime few devices are on, or when it would be older than the binary it lands on.

  3. 3Ship

    Builds go to TestFlight and Google Play from the dashboard or the command line. JavaScript updates are published to named channels such as production and staging, without waiting for app review.

  4. 4Watch

    For 15 minutes after a release, Ubriot checks the app's backend health and the crash rate that devices report on launch, and alerts the team if either degrades.

  5. 5Undo

    If a new bundle fails to start, the phone falls back to the last version that worked on its own. A bad release is one click to roll back: the channel is pointed at the previous update group.

Core systems

  • Updates that verify themselves

    Every file in an update is checked against its SHA-256 hash before the update is staged. A missing or mismatched file discards the update and the app keeps running what it has. The on-device update runtime tracks pending, active, verified and last known good bundles on iOS and Android.

  • Release health tied to the release

    Ubriot records which build or update went out and when. A spike in backend errors or crashed launches inside the watch window is attributed to the release that caused it, with the rollback ready.

  • Build infrastructure

    macOS and Linux workers claim jobs from a shared queue. Signing credentials are encrypted with AES-256-GCM and never logged, and sensitive actions such as credential changes and build triggers are written to an audit trail.

  • Release intelligence

    A failed build gets a first diagnosis from its log and the app's own release history, with the raw log still one click away. The same history powers the pre-release warnings.

What it is made of

TypeScript end to end, with native iOS and Android code where devices need it.

Delivery
An update server that speaks the Expo Updates manifest format, and an update runtime for bare React Native with native modules in Objective-C for iOS and Kotlin for Android.
Builds
Job queue plus macOS and Linux build workers, Xcode and Gradle toolchains, and App Store Connect and Google Play integrations.
Release health
A post-release watch over backend health and on-device launch reports, attributed to the release timeline, with channel rollback.
Interfaces
A TypeScript API, a Next.js dashboard, a command line tool, an MCP server for AI coding agents, and React Native SDKs.
Security
AES-256-GCM credential storage, team-scoped access, audit events for sensitive actions, redacted logs, and health checks that refuse private network addresses.

Open source

expo-video-encoder turns JPEG frames into an H.264 MP4 inside Expo and React Native apps, using AVFoundation on iOS and MediaCodec on Android. No external dependencies, MIT licensed.

expo-video-encoder on npm