Mobile Platform · 2026
Pluton
Automated force update system for Mekari mobile apps — from production pipeline to update prompt.
📦 Scope: All Mekari mobile products
🧱 Stack: Jenkins · Supabase · Firebase · Flutter
📱 Platforms: Android · iOS · Flutter
🗂️

Version Catalog

Every production build automatically registered into a centralized database via the CI/CD pipeline.

Automated
🔔

Force Update Mechanism

Age-based thresholds pushed to Firebase Remote Config. Users get the right prompt at the right time.

Engineer-controlled
📱

Mobile SDK

One integration — mekari_flag handles everything. Flutter native, Android, and iOS via BrickWrap.

Integrate once
Why we built this
The Problem
01

Fragmented update enforcement

Each mobile app implements force update independently with inconsistent logic and thresholds. No standardized approach across Android and iOS — varied user experiences and redundant engineering effort per app.

02

Version fragmentation risk

Users on outdated versions (6+ months old) pose security, performance, and API compatibility risks. We can't accurately track version adoption rates or enforce updates without shipping a new release per app.

03

No automated threshold management

No mechanism to trigger update prompts based on version age. Teams manually monitor and update Firebase values — slow, error-prone, and with no standardized remote configuration system across all apps.

04

Slow incident response

Security patches and critical fixes take too long to reach 100% of the user base. No centralized kill switch — resolving a critical bug requires a new build and release cycle for every affected app.

⚠️

The result: Outdated versions generate more crashes, compatibility issues, and security exposure — while inconsistent update experiences damage brand trust and limit feature rollout velocity.

What we built
What is Pluton?
Subsystem 01

Version Catalog

A centralized database that automatically captures every production mobile app release via the CI/CD pipeline.

Auto-registers every prod build after deploy
Tracks version age across all apps and platforms
Exposes threshold calculation API
Supabase
Jenkins Groovy
Ohara
powers
Subsystem 02

Force Update Mechanism

Connects the Version Catalog to mobile clients via Firebase Remote Config. Engineers control when threshold changes reach users.

"Go Live" in Ohara → Firebase updated automatically
Four update tiers based on version age
Emergency critical override — no release needed
Firebase Remote Config
mekari_flag
BrickWrap
End-to-end flow
How It Works
⚙️
CI/CD Pipeline
Jenkins · Automated
1

Production pipeline runs — app deployed to Play Store internal testing (Android) and TestFlight (iOS)

2

Pipeline calls Version Catalog API — registers build number, version name, timestamp

3

Older versions automatically marked deprecated

🖥️
Ohara Dashboard
Engineer or daily scheduler
4

Release engineer manually promotes to "Go Live", or the daily scheduler detects the version is in production and auto-promotes

5

Ohara calculates age-based thresholds and pushes to Firebase Remote Config

🕐 Scheduler: daily check — if deployed version is live in App/Play Store → auto-promote
📱
Mobile App
mekari_flag SDK
7

App launches or resumes — SDK reads Firebase Remote Config

8

SDK compares installed version code against thresholds

9

Appropriate update UI shown — or nothing if version is current

Version statuses
deployed
Registered by pipeline, pending promotion
live
Active in production — thresholds pushed to Firebase
deprecated
Auto-set when a newer version goes live
or
rollback
Manually set when a version needs to be pulled
💡 Per-release effort after integration: one action — click "Go Live" in Ohara after verifying the release in production
What users see
Update Tiers
None
Current
version is up to date
No UI shown
App continues normally. User is not interrupted.
— no prompt
Soft
4+
months old
🤖 Android
Play Store flexible update dialog (background download)
🍎 iOS
MpForceUpdate page with "Later" button
📦 Update available
Later · Update
✓ Dismissible — 30-day cooldown
Strong
5+
months old
🤖 Android
Play Store flexible update dialog (same as Soft)
🍎 iOS
MpForceUpdate page with "Later" button
⚠️ Please update
Later · Update Now
✓ Dismissible — no cooldown, every launch
Force
6+
months old
🤖 Android
Play Store immediate update dialog (full-screen OS UI)
🍎 iOS
MpForceUpdate blocker page, back exits app
🚫 Update Required
Update Now
✗ Not dismissible
Critical
Manual
emergency trigger
🤖 Android
Play Store immediate update dialog
🍎 iOS
MpForceUpdate blocker with custom message
🔴 Critical Update
Update Immediately
✗ Not dismissible — highest priority
🤖 Android — Play Store dialog (soft / strong / force)
Android Play Store update dialog
vs
🍎 iOS — MpForceUpdate page (all tiers)
iOS soft update page
Android behavior applies when inAppUpdateEnabled = true and the app is installed from the Play Store.
If no Play Store update is available yet — no UI is shown, regardless of tier.
Firebase Remote Config
Remote Config Schema
🤖 Android force_update_config_adr
🍎 iOS force_update_config_ios
Value type: JSON String
Example value
{
  "enabled": true,
  "soft_min_version_code": 2010,
  "strong_min_version_code": 2000,
  "force_min_version_code": 1090,
  "soft_update_cooldown_days": 30,
  "critical_min_version_code": 0
}
Field reference
Field Type Required Description
enabled Boolean Yes Kill switch. false disables all prompts without a client release
soft_min_version_code Integer Yes Users below this version see the soft nudge (dismissible)
strong_min_version_code Integer Yes Users below this version see the strong reminder (dismissible, no cooldown)
force_min_version_code Integer Yes Users below this version see the force blocker (not dismissible)
soft_update_cooldown_days Integer No Days between soft update appearances. Default: 30
critical_min_version_code Integer No 0 = disabled. Any positive value activates the critical tier (highest priority, manual only)
The control center
Ohara Dashboard
Ohara Version Catalog
1
2
3
1

Go Live → Firebase updated

Release engineer promotes a version to "Live" — Ohara recalculates thresholds and pushes to Remote Config automatically.

2

Daily auto-promotion scheduler

Pluton runs a daily check: if a deployed version is detected as live in the App Store or Play Store, it is automatically promoted — no engineer action needed.

3

Update tier visibility

Color-coded age badges (Current / Soft / Strong / Force) across all apps and platforms in one view.

4

Audit trail

Every Remote Config change logged — who promoted to Live, when, and for which app.

mekari_flag
What the SDK Handles
mekari_flag v1.8.0
brick_way v1.24.0
☁️

Remote Config fetching

Fetches and caches Firebase Remote Config with a 10-second timeout. Falls back to last cached config on error — no prompts shown if no config available.

🔍

Tier determination

Compares installed version code against threshold values. Evaluates critical → force → strong → soft in priority order.

🎨

Update UI

Single MpForceUpdate component for all tiers — dismissible page (soft/strong) or full-screen blocker (force/critical) with custom localized message.

🏪

Android Play Store integration

Native in-app update API via Google Play for soft/strong (flexible) and force/critical (immediate). iOS uses store URL for all tiers.

📊

Analytics

Firebase Analytics events with force_update_ prefix — tier shown, tapped, dismissed, downloaded.

🤖 Android
Android Play Store update dialog
🍎 iOS
iOS soft update page
Soft tier: Android uses the Play Store flexible update dialog.
iOS uses MpForceUpdate page with "Update now" and "Later".
Android & iOS native apps
Native Bridge: via Bricks
Android

Native Host App

Kotlin · calls ForceUpdateModule

BrickWrap

ForceUpdateModule.kt
Native API layer

BrickWay

Flutter method channel bridge

mekari_flag

ForceUpdateManager (Flutter)

Firebase Remote Config

Threshold values

iOS

Native Host App

Swift · calls ForceUpdateModule

BrickWrap

ForceUpdateModule.swift
Native API layer

BrickWay

Flutter method channel bridge

mekari_flag

ForceUpdateManager (Flutter)

Firebase Remote Config

Threshold values

Flutter

mekari_flag

Direct integration — no bridge needed

Firebase Remote Config

Threshold values

Simplest path
No bridge required
💡 Two API methods on all platforms:   check() — shows update UI  |  getTier() — silent tier query with no UI
Integration
Usage Example
Call check() on app launch & resume — that's the entire integration
🐦 Flutter
directly via mekari_flag version >= 1.8.0
await ForceUpdateManager
  .instance.check(
  context,
  product: MpForceUpdateProduct.talenta,
  inAppUpdateEnabled: true,
  onClose: (response) {
    // handle dismissal
  },
);

🤖 Android Kotlin
via BrickWrap - brick_way v1.24.0
forceUpdateModule.check(
  context = this,
  product =
    ForceUpdateProduct.TALENTA,
  inAppUpdateEnabled = true,
  analyticsEnabled = true,
  // needed for Play Store flow
  launcher = activityResultLauncher
)


// optional: silent tier check
forceUpdateModule.getTier { tier ->
  // "none" | "soft" | "strong"
  // "force" | "critical" | null
}
🍎 iOS Swift
via BrickWrap - brick_way v1.24.0
forceUpdateModule.check(
  presentingViewController:
    self,
  product: .talenta,
  inAppUpdateEnabled: true,
  analyticsEnabled: true
) { tier, shouldDismissApp in
  if shouldDismissApp {
    // handle dismissal
  }
}


// optional: silent tier check
forceUpdateModule.getTier { tier in
  // "none" | "soft" | "strong"
  // "force" | "critical" | nil
}
Summary
Before vs After
Before After Pluton
Version tracking Per-app, manual or none Centralized, fully automatic
Update recommendation behaviour Each app rolls its own Unified process & SDK — Consistent UX & behavior across apps
Config per release Manual calculation & update required Automated calculation & updates
Version visibility None Full history with age and tier in Ohara
Audit trail None Every config change logged automatically
Ongoing dev effort Per-release manual work Zero — after initial integration
What's next
Rollout Plan
Q2 2026

Foundation & Data Collection

● Completed
Version Catalog — release history is captured and registered from prod pipeline
Ohara Dashboard — manage force update settings
Firebase Remote Config integration complete
Mobile SDK (Mekari Flag) — Flutter & Native integration support via Bricks
Flutter & Native project PoC (Mekari Sign & Talenta)
What's next?

Rollout & Improvements

● Upcoming
Integration support
Feedback & Improvements
🔌 Integration is opt-in per app. Existing apps without the SDK see no change. The SDK can be dropped in without touching any business logic. Full developer guide available.
🏴‍☠️

Pluton

One system. All platforms. Zero per-release effort.
Let's ship it.

Questions?