# Vivid tracks Moblin parity per feature instead of promising a finished port

> An Android Kotlin port of the Moblin IRL streaming app, shipped as signed APKs on GitHub Releases rather than Google Play, with a stable permalink, daily nightlies and a per feature parity table that marks what has not landed yet.

**thoser666/Vivid** — Android version of the open-source Moblin IRL streaming app. Vivid lets you broadcast high-quality live video to platforms like Twitch, YouTube, Facebook, Kick or your own SRT server, with advanced features like multi-network bonding, OBS WebSocket control, configurable overlays, and full I18n support.

- Repository: https://github.com/thoser666/Vivid
- Stars: 28 · Forks: 3
- Language: Kotlin
- License: MIT
- Published: 2026-08-26 · Updated: 2026-08-26 · Language: en
- Canonical page: https://hysenlabs.com/projects/thoser666-vivid

## PARITY.md is where the honest feature list lives

Vivid states its goal as being at least functionally equivalent to Moblin, the open-source IRL streaming app, with every Moblin feature adapted to Android. Rather than assert that it is there, the project keeps a running ledger. The Features section marks each item as already implemented, in progress, or still planned, and a Parity Status table gives the per feature state at a glance. The detailed work list sits in PARITY.md at the repository root, and there is a warning attached to the table: anything marked planned has not shipped, so it should not be relied on for production streaming. That framing matters more than the feature count, because a port that reports its own gaps is a different thing from a port whose README is a marketing page. The Moblin upstream it tracks is the repository at `eerimoq/moblin`.

## Three release channels and a permalink that only ever resolves to stable

Distribution is split into three named channels. Latest and Stable use `v*` tags and give tested releases with auto-generated release notes, aimed at daily use. Nightly is a prerelease carrying a fresh build of every new feature, updated daily, for testers and early adopters. Alpha uses `v*-alpha` tags and is the first stage of versioned releases, for previewing what is coming. The versioning strategy behind those tags, covering versionName and versionCode and the criteria for each stage, is written out in RELEASE.md, and CHANGELOG.md mirrors the full history of stable, alpha and nightly automatically from GitHub Releases. The three most recent releases on the repository are all nightlies: `0.5.19-nightly.495` on 30 September, `0.5.19-nightly.474` on 29 September and `0.5.19-nightly.468` on 28 September, which is the daily cadence in practice.

## Two APK filenames, and two you are told to ignore

The permanent link `releases/latest/download/app-standard-release.apk` always resolves to the newest stable release, because GitHub resolves the permalink rather than the project pinning a version. The releases page is the alternative route, where Latest gives stable and the prerelease list holds nightly and alpha builds. On a stable release there are four artifacts to tell apart:

```text
app-standard-release.apk
app-foss-release.apk
SHA256SUMS.txt
SHA256SUMS.txt.bundle
mapping.txt
output-metadata.json
```

`app-standard-release.apk` is the one to take. `app-foss-release.apk` is the Sentry-free F-Droid variant, and `mapping.txt` and `output-metadata.json` are for developers only. The repository also carries an `fdroid/` directory at the root, and the installation notes mention an F-Droid repository that can be added for automatic updates on API 24 and above. Vivid is not on Google Play yet, which is the reason for the whole sideload path.

## SHA256SUMS.txt is signed, so the checksum file needs checking too

Verifying a download is a two step job rather than one. First, compare the file against the published checksum list:

```bash
sha256sum -c
```

Second, on stable releases there is now a sigstore and cosign keyless signature alongside it, in `SHA256SUMS.txt.bundle`, carrying the signature, the certificate and a transparency log entry. That bundle authenticates the checksum file itself, which closes the gap where a checksum list downloaded from the same place as the APK proves nothing. This level of care is not incidental to the project. A Security-Loop guard at `scripts/check_security_loop.sh` runs in the pre-push gate, in CI and in the release pipeline, and it exists to keep release grade rules structurally present: keystore hardening, signature checks, reproducibility, and proof that Sentry can be opted out of. The CII Best Practices checklist maps each badge criterion to its evidence, and SECURITY.md is where vulnerabilities are meant to be reported privately.

## Unknown sources is a four tap gate before the first launch

Android blocks APKs from outside the Play Store by default, so the first launch is a permissions detour. Open the downloaded file from your file manager or the notification bar, tap through the dialog Android shows, allow that browser or file manager to install unknown apps, then go back and tap install. The literal strings involved are short enough to be worth quoting, because the warning dialog is the point where most people give up:

```text
Install unknown apps
App not installed
Download anyway
```

The last one appears when the browser questions the file type; confirming it is the expected path rather than a red flag. The second one is the failure message discussed separately below. Because every install goes through this gate, anyone distributing Vivid to other people inherits the same conversation about unknown sources.

## App not installed means a corrupt download, not a signing mismatch

All official APKs are signed with the same release key, and that fact is what makes the error message interpretable. If Android ever reports App not installed, the documented reading is a corrupted download rather than a signature conflict: delete the file and download it again. That is a narrow diagnostic, and it holds because there is only one signing key in play, so the signature cannot be the variable that changed. It also means the checksum step above is not ceremony. A truncated or partially written APK and a substituted one both fail verification, and only the first is repaired by re-downloading.

## Camera and microphone are only requested when you tap Go Live

Permission prompts are deferred to the moment they are needed. Vivid asks for camera and microphone access when you tap Go Live, and on Android 13 and above it also asks for notifications, because that permission is what carries the streaming status notification. The platform setup guides then cover connecting Twitch, YouTube, Kick, or your own server, and the repository description also names Facebook and an SRT server among the broadcast targets. Streaming survives leaving the app: a persistent notification reading Vivid is streaming offers a Stop action, and the encoder runs independently of the camera preview surface through a GL-free pipeline, so the stream keeps going when you swipe the app away or turn the screen off. The app itself is described as a multi-camera client for Twitch over RTMP and RTMPS with chat overlay, widgets, scenes, replays and manual camera controls, built with Kotlin, Compose and RootEncoder.

## One Gradle module per feature area, and a foss flavor that is fully open

The root is laid out as a multi-module Gradle project with a module per feature area: `app/`, `core/`, `data/`, `domain/`, `feature-chat/`, `feature-obs-control/`, `feature-settings/`, `feature-streaming/` and `feature-widgets/`. Release plumbing sits alongside them in `fastlane/` and `fdroid/`, documentation in `docs/`, and repository policy in `SECURITY.md`, `PRIVACY.md`, `CODE_OF_CONDUCT.md`, `CONTRIBUTING.md`, `RELEASE.md`, `PARITY.md` and `CHANGELOG.md`. Building locally is one Gradle task, on the Gradle 9.4 wrapper with JDK 25:

```bash
./gradlew assembleFossDebug
```

The `foss` flavor is fully open-source while `standard` adds optional Sentry, which is the same split that produces the two downloadable APKs. Code goes to the `develop` branch, which is also the default branch, and `renovate.json`, `.snyk` and `.deepsource.toml` sit at the root for dependency updates and scanning. User documentation is kept in English, French and German, with tutorials, a common issues FAQ and a troubleshooting directory alongside it.

## Conclusion

Vivid suits anyone who streams IRL footage from a phone and already lives in GitHub Releases, and it is a poor fit for someone who needs a store listing, a Play Protect signal or a finished feature set today. Before committing, open the parity table and the planned feature list, because the project itself flags planned entries as unshipped, and pick the channel deliberately: a nightly build is a daily rebuild of every new feature, not a tested release.

## FAQ

### Is the Vivid Android app available on Google Play?

Not yet. APKs are published as GitHub Releases, and the latest stable build sits at a permanent link that GitHub resolves to the newest stable release automatically.

### How do I verify a Vivid APK download?

Check the file against SHA256SUMS.txt with sha256sum -c. Stable releases also ship SHA256SUMS.txt.bundle, a sigstore and cosign keyless signature that authenticates the checksum file itself.

### Which Vivid APK should I download from a stable release?

Take app-standard-release.apk. The app-foss-release.apk is the Sentry-free F-Droid variant, and mapping.txt and output-metadata.json are for developers only.

### What does App not installed mean when installing Vivid?

All official APKs are signed with the same release key, so that message points to a corrupted download rather than a signing problem. Delete the file and download it again.

### How do I build Vivid from source?

Run ./gradlew assembleFossDebug using the Gradle 9.4 wrapper and JDK 25. The foss flavor is fully open-source, while the standard flavor adds optional Sentry.

### Does Vivid already have every feature Moblin has?

Not yet. The stated goal is at least functional equivalence with Moblin, and the project marks features as implemented, in progress or planned, with the detailed work list in PARITY.md and a warning that planned features have not shipped.

## Sources

- [Official README](https://github.com/thoser666/Vivid#readme)
- [Project repository](https://github.com/thoser666/Vivid)
- [Release notes](https://github.com/thoser666/Vivid/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/thoser666-vivid
