ランキングに戻る

gronxb/hot-updater

TypeScripthot-updater.dev

A self-hostable OTA update solution for React Native (Alternative to CodePush)

react-nativereact-native-otaself-hostedsupabasereact-native-codepushplugin-systemexpo
スター成長
スター
1.6k
フォーク
163
週間成長
Issue
12
5001k1.5k
2023年10月2024年9月2025年8月2026年7月
成果物npmnpm install hot-updater
README

Hot Updater

Vercel OSS Program

NPM pkg.pr.new

image

hot-updater

Documentation

Full documentation is available at: https://hot-updater.dev

AI Skills

Attach the Hot Updater agent skill so AI coding agents can use concise CLI context for deploys, bundle management, rollbacks, and verification: skills/hot-updater/SKILL.md

npx skills add hot-updater/skills

Then ask your agent with prompts like $hot-updater deploy using the current app version or $hot-updater roll back the most recently deployed bundle.

See the AI Agent Guide for the full workflow.

Key Features

  • Self-Hosted: Complete control over your update infrastructure
  • Multi-Platform: Support for both iOS and Android
  • Web Console: Intuitive update management interface
  • Bundle Diffing: Reuse unchanged files and ship compact Hermes patches for smaller OTA downloads
  • Plugin System: Support for various storage providers (AWS S3, Cloudflare R2 + D1, etc.)
  • Version Control: Robust app version management through semantic versioning
  • New Architecture: Support for new architecture like React Native

Bundle Diffing

Hot Updater can deliver incremental OTA updates instead of making every device download the full archive again. A diff-enabled runtime reuses bundle files that already exist on the device, while deploys prepare .bsdiff patches for changed Hermes bundles by default.

In practice, a release that would normally ship a 10 MB archive can be delivered as a ~600 KB patch when the Hermes bytecode change is small. If a patch is missing, incompatible, or not worth using, Hot Updater falls back to the normal archive update path.

See the Bundle Diffing guide for the full runtime behavior and fallback rules.

Plugin System

Hot Updater provides high extensibility through its plugin system. Each functionality like build, storage, and database is separated into plugins, allowing users to configure them according to their needs.

Plugin Types

  • Build Plugin: Support for bundlers like Metro, Re.Pack, Expo
  • Storage Plugin: Support for bundle storage like AWS S3, Supabase Storage, Cloudflare R2 Storage
  • Database Plugin: Support for metadata storage like Supabase Database, PostgreSQL, Cloudflare D1

Configuration Example

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!,
  }),
});
import { bare } from "@hot-updater/bare";
import { d1Database, r2Storage } from "@hot-updater/cloudflare";
import { config } from "dotenv";
import { defineConfig } from "hot-updater";

config({ path: ".env.hotupdater" });

export default defineConfig({
  build: bare({ enableHermes: true }),
  storage: r2Storage({
    bucketName: process.env.HOT_UPDATER_CLOUDFLARE_R2_BUCKET_NAME!,
    accountId: process.env.HOT_UPDATER_CLOUDFLARE_ACCOUNT_ID!,
    cloudflareApiToken: process.env.HOT_UPDATER_CLOUDFLARE_API_TOKEN!,
  }),
  database: d1Database({
    databaseId: process.env.HOT_UPDATER_CLOUDFLARE_D1_DATABASE_ID!,
    accountId: process.env.HOT_UPDATER_CLOUDFLARE_ACCOUNT_ID!,
    cloudflareApiToken: process.env.HOT_UPDATER_CLOUDFLARE_API_TOKEN!,
  }),
});
import { bare } from "@hot-updater/bare";
import { s3Storage, s3Database } from "@hot-updater/aws";
import { config } from "dotenv";
import { defineConfig } from "hot-updater";

config({ path: ".env.hotupdater" });

const options = {
  bucketName: process.env.HOT_UPDATER_S3_BUCKET_NAME!,
  region: process.env.HOT_UPDATER_S3_REGION!,
  credentials: {
    accessKeyId: process.env.HOT_UPDATER_S3_ACCESS_KEY_ID!,
    secretAccessKey: process.env.HOT_UPDATER_S3_SECRET_ACCESS_KEY!,
  },
};

export default defineConfig({
  build: bare({ enableHermes: true }),
  storage: s3Storage(options),
  database: s3Database(options),
});
import { bare } from '@hot-updater/bare';
import {firebaseStorage, firebaseDatabase} from '@hot-updater/firebase';
import * as admin from 'firebase-admin';
import { config } from "dotenv";
import { defineConfig } from "hot-updater";

config({ path: ".env.hotupdater" });

// https://firebase.google.com/docs/admin/setup?hl=en#initialize_the_sdk_in_non-google_environments
// Check your .env file and add the credentials
// Set the GOOGLE_APPLICATION_CREDENTIALS environment variable to your credentials file path
// Example: GOOGLE_APPLICATION_CREDENTIALS=./firebase-adminsdk-credentials.json
const credential = admin.credential.applicationDefault();

export default defineConfig({
  build: bare({
    enableHermes: true,
  }),
  storage: firebaseStorage({
    projectId: process.env.HOT_UPDATER_FIREBASE_PROJECT_ID!,
    storageBucket: process.env.HOT_UPDATER_FIREBASE_STORAGE_BUCKET!,
    credential,
  }),
  database: firebaseDatabase({
    projectId: process.env.HOT_UPDATER_FIREBASE_PROJECT_ID!,
    credential,
  }),
});
関連リポジトリ
react/react-native

A framework for building native applications using React

C++MIT Licenseandroidapp-framework
reactnative.dev
126.2k25.2k
facebook/react-native

A framework for building native applications using React

C++MIT Licenseandroidapp-framework
reactnative.dev
120.9k24.5k
justjavac/free-programming-books-zh_CN

:books: 免费的计算机编程类中文书籍,欢迎投稿

GNU General Public License v3.0pythonjavascript
weibo.com/justjavac
117.7k28.2k
storybookjs/storybook

Storybook is the industry standard workshop for building, documenting, and testing UI components in isolation

TypeScriptnpmMIT Licensestorybookstyleguide
storybook.js.org
90.6k10.2k
enaqx/awesome-react

A collection of awesome things regarding React ecosystem

reactreact-native
74k7.6k
appwrite/appwrite

Appwrite® - complete cloud infrastructure for your web, mobile and AI apps. Including Auth, Databases, Storage, Functions, Messaging, Hosting, Realtime and more

TypeScriptnpmBSD 3-Clause "New" or "Revised" Licenseappwritedocker
appwrite.io
56.6k5.6k
laurent22/joplin

Joplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.

TypeScriptnpmOtherreact-nativenodejs
joplinapp.org
55.7k6.2k
dkhamsing/open-source-ios-apps

:iphone: Collaborative List of Open-Source iOS Apps

Creative Commons Zero v1.0 Universaliosswift
51.3k6k
expo/expo

An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.

TypeScriptnpmMIT Licensemobileexpo
docs.expo.dev
50.9k13.1k
react-hook-form/react-hook-form

📋 React Hooks for form state management and validation (Web + React Native)

TypeScriptnpmMIT Licensetypescriptreact-hooks
react-hook-form.com
44.8k2.5k
sudheerj/reactjs-interview-questions

List of top 500 ReactJS Interview Questions & Answers....Coding exercise questions are coming soon!!

JavaScriptnpmMIT Licensereactjsreact-router
44.7k10.4k
mattermost/mattermost

Mattermost is an open source platform for secure collaboration across the entire software development lifecycle..

TypeScriptnpmOthercollaborationmattermost
mattermost.com
38.5k8.9k