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
Step 1
Build
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.
Step 2
Check
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.
Step 3
Ship
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.
Step 4
Watch
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.
Step 5
Undo
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