はじめに
リリース直後のアプリに致命的なバグを見つけてしまい、青ざめた経験はありませんか?修正コードは5分で書けたのに、App Storeの審査を待つ数時間〜数日間、ユーザーはクラッシュするアプリを使い続ける——モバイル開発者なら誰もが一度は味わう悪夢です。
この問題を解決してきたのがOTA(Over-The-Air)アップデート、つまりストアを経由せずJavaScriptバンドルを直接配信する仕組みでした。しかし、その定番だったMicrosoftのCodePushは、App Centerの終了とともに2025年3月でサービスを終えています。「次はどのOTAサービスに乗り換えるべきか」と悩んでいる方に紹介したいのが、今回取り上げるHot Updaterです。
Hot Updaterは「CodePushの代替」を明確に掲げたReact Native向けのOTA更新ソリューションで、最大の特徴はセルフホスト型であること。SupabaseやCloudflare、AWSといった自分のインフラ上で完結するため、サービス終了に振り回される心配がありません。
Hot Updaterとは
Hot Updaterは、React Nativeアプリの更新をアプリストアの審査なしで配信できるオープンソースのOTAアップデートツールです。TypeScriptで書かれており、2026年7月時点で最新版はv0.35.4。活発にリリースが続いている、勢いのあるプロジェクトです。
主な特徴
- セルフホスト型 - 更新サーバーもストレージも自分のインフラで運用します。外部サービスの料金改定や終了リスクから解放され、データの主権も手元に残ります
- プラグインシステム - ビルド(Metro / Re.Pack / Expo)、ストレージ(Supabase Storage / Cloudflare R2 / AWS S3 / Firebase)、データベース(PostgreSQL / Cloudflare D1 / Firebase)を組み合わせ自由に選べます
- バンドル差分配信 - Hermesパッチによるインクリメンタル更新に対応し、通常なら10MB規模のバンドルを約600KBのパッチで配信できます。ユーザーの通信量とダウンロード時間を大幅に削減します
- Web管理コンソール - デプロイ履歴の確認、強制アップデートの切り替え、ロールバックをGUIで操作できます
- iOS / Android両対応 - New Architectureを含む幅広いReact Nativeバージョンをサポートします
インストール
開発依存としてCLIを追加し、初期化コマンドを実行します。
npm install hot-updater --save-dev
npx hot-updater init
initコマンドは対話形式で進み、使用するプロバイダー(Supabase / Cloudflare / AWS / Firebase)を選ぶと、必要な設定ファイルやインフラのセットアップまで案内してくれます。
たとえばSupabaseを選んだ場合、生成されるhot-updater.config.tsは次のようになります。
import { bare } from "@hot-updater/bare";
import { supabaseDatabase, supabaseStorage } from "@hot-updater/supabase";
import { config } from "dotenv";
import { defineConfig } from "hot-updater";
config({ path: ".env.hotupdater" });
export default defineConfig({
build: bare({ enableHermes: true }),
storage: supabaseStorage({
supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,
}),
database: supabaseDatabase({
supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
}),
});
build / storage / databaseの3要素をプラグインとして差し替えるだけなので、たとえば「ストレージはCloudflare R2、データベースはD1」といった構成にも数行の変更で切り替えられます。
基本的な使い方
アプリ側の実装
ルートコンポーネントをHotUpdater.wrap()でラップするだけで、起動時に更新チェックが走るようになります。
import { HotUpdater } from "@hot-updater/react-native";
import { Text, View } from "react-native";
import App from "./App";
export default HotUpdater.wrap({
baseURL: "https://your-update-server-url/api/check-update",
updateStrategy: "appVersion",
fallbackComponent: ({ progress, status }) => (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Text>
{status === "UPDATING" ? "アップデート中..." : "更新を確認しています..."}
</Text>
{progress > 0 && <Text>{Math.round(progress * 100)}%</Text>}
</View>
),
})(App);
updateStrategyには2つの戦略があります。
- appVersion - アプリのバージョン番号を基準に、適用可能な更新を判定します
- fingerprint - ネイティブコードのハッシュ値を基準にする方式で、ネイティブ層に変更があったビルドには誤って古いJSバンドルを配信しない、より安全な判定ができます
fallbackComponentは更新の確認・ダウンロード中に表示されるUIで、progress(0〜1)を受け取れるため、プログレスバー付きのスプラッシュ画面も簡単に作れます。
更新のデプロイ
修正をリリースするときは、CLIから1コマンドです。
npx hot-updater deploy
プラットフォームや配信率を指定した段階的ロールアウトにも対応しています。
# iOSのみ、まず25%のユーザーに配信
npx hot-updater deploy -p ios -r 25
# ダウンロード後に即時リロードさせる強制アップデート
npx hot-updater deploy -i -f
デプロイ後はWeb管理コンソールから配信状況を確認でき、問題があればその場でロールバックや無効化が可能です。
実践的なユースケース
緊急バグ修正のホットフィックス配信
冒頭のシナリオそのものです。JavaScript側の修正であれば、deployコマンド1つで数分以内に全ユーザーへ配信できます。まず-r 25で25%のユーザーに配信してクラッシュレポートを監視し、問題なければ100%に広げる、という安全な運用がCLIだけで完結します。
チャンネルを使った環境分離
productionとstagingのようにチャンネルを分けることで、社内テスターにだけ先行配信する運用ができます。Expoプロジェクトであればapp.jsonで指定します。
{
"expo": {
"plugins": [
["@hot-updater/react-native", { "channel": "production" }]
]
}
}
TestFlight配布のビルドはstagingチャンネル、ストア公開ビルドはproductionチャンネルに向けておけば、同じコードベースのまま配信対象を切り替えられます。
CodePushからの移行
CodePush終了後の移行先としては、Expoのexpo-updates(EAS Update)も有力候補です。ただしEAS Updateは基本的にExpoのマネージドサービスを前提とするのに対し、Hot Updaterはbare React Nativeプロジェクトでも使え、インフラを完全に自前で持てる点が異なります。月間アクティブユーザー数に応じた従量課金を避けたいケースや、金融・医療など配信インフラの所在が問われるプロジェクトでは、Supabaseの無料枠やCloudflare R2の低コストなストレージで運用できるHot Updaterが有力な選択肢になります。
まとめ
Hot Updaterは、CodePush亡き後のReact Native OTA更新において「自分のインフラで、自分の裁量で」を実現するソリューションです。
HotUpdater.wrap()でラップするだけのシンプルなアプリ側実装- Supabase / Cloudflare / AWS / Firebaseから選べるプラグイン構成
- 差分配信による軽量なアップデートと、段階的ロールアウト・ロールバック対応
なお、OTA更新はJavaScriptバンドルの変更に限られる点と、各ストアの規約(アプリの主要機能を審査なしに大きく変えない等)の範囲内で使う点には注意してください。まずはSupabaseの無料枠でnpx hot-updater initから試して、ストア審査を待たない開発サイクルを体験してみてはいかがでしょうか。
