{"id":24571680,"url":"https://github.com/gronxb/hot-updater","last_synced_at":"2026-03-09T03:03:45.226Z","repository":{"id":202934659,"uuid":"708452754","full_name":"gronxb/hot-updater","owner":"gronxb","description":"A self-hostable OTA update solution for React Native (Alternative to CodePush)","archived":false,"fork":false,"pushed_at":"2026-03-06T03:38:37.000Z","size":118687,"stargazers_count":1303,"open_issues_count":56,"forks_count":130,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-03-06T04:44:26.323Z","etag":null,"topics":["expo","plugin-system","react-native","react-native-codepush","react-native-ota","self-hosted","supabase"],"latest_commit_sha":null,"homepage":"https://hot-updater.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gronxb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"gronxb","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2023-10-22T15:56:45.000Z","updated_at":"2026-03-06T03:36:27.000Z","dependencies_parsed_at":"2024-07-21T14:07:11.784Z","dependency_job_id":"cd1c6e31-c24c-468d-b1d5-e0c99af21f68","html_url":"https://github.com/gronxb/hot-updater","commit_stats":{"total_commits":135,"total_committers":1,"mean_commits":135.0,"dds":0.0,"last_synced_commit":"92a562777994da520e8aaa52491fafa8625fb9af"},"previous_names":["gronxb/codepush","gronxb/liveupdater","gronxb/hot-updater"],"tags_count":95,"template":false,"template_full_name":null,"purl":"pkg:github/gronxb/hot-updater","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gronxb%2Fhot-updater","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gronxb%2Fhot-updater/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gronxb%2Fhot-updater/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gronxb%2Fhot-updater/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gronxb","download_url":"https://codeload.github.com/gronxb/hot-updater/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gronxb%2Fhot-updater/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30255920,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T08:59:44.879Z","status":"ssl_error","status_checked_at":"2026-03-08T08:58:02.867Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["expo","plugin-system","react-native","react-native-codepush","react-native-ota","self-hosted","supabase"],"created_at":"2025-01-23T18:21:35.983Z","updated_at":"2026-03-09T03:03:45.215Z","avatar_url":"https://github.com/gronxb.png","language":"TypeScript","funding_links":["https://github.com/sponsors/gronxb"],"categories":["TypeScript"],"sub_categories":[],"readme":"  # Hot Updater\n\n\u003ca href=\"https://vercel.com/oss\"\u003e\n  \u003cimg alt=\"Vercel OSS Program\" src=\"https://vercel.com/oss/program-badge-2026.svg\" /\u003e\n\u003c/a\u003e\n  \n\u003cbr /\u003e\n\u003cbr /\u003e\n\n  \n[![NPM](https://img.shields.io/npm/v/hot-updater)](https://www.npmjs.com/package/hot-updater)\n[![pkg.pr.new](https://pkg.pr.new/badge/gronxb/hot-updater)](https://pkg.pr.new/~/gronxb/hot-updater)\n\n  \n  \u003cimg width=\"2594\" height=\"1264\" alt=\"image\" src=\"https://github.com/user-attachments/assets/82c52334-a0c2-48d4-a9f1-8d9c45e79bb2\" /\u003e\n\n\n  ![hot-updater](https://raw.githubusercontent.com/gronxb/hot-updater/main/demo.gif)\n\n\n  ## Documentation\n\n  Full documentation is available at:\n  https://hot-updater.dev\n  \n  ## Key Features\n\n  - **Self-Hosted**: Complete control over your update infrastructure\n  - **Multi-Platform**: Support for both iOS and Android\n  - **Web Console**: Intuitive update management interface\n  - **Plugin System**: Support for various storage providers (AWS S3, Cloudflare R2 + D1, etc.)\n  - **Version Control**: Robust app version management through semantic versioning\n  - **New Architecture**: Support for new architecture like React Native\n\n\n  ## Plugin System\n\n  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.\n\n  ### Plugin Types\n\n  - **Build Plugin**: Support for bundlers like Metro, Re.Pack, Expo\n  - **Storage Plugin**: Support for bundle storage like AWS S3, Supabase Storage, Cloudflare R2 Storage\n  - **Database Plugin**: Support for metadata storage like Supabase Database, PostgreSQL, Cloudflare D1\n\n  ### Configuration Example\n\n  * [Supabase](https://hot-updater.dev/docs/managed/supabase)\n  ```tsx\n  import { bare } from \"@hot-updater/bare\";\n  import { supabaseDatabase, supabaseStorage } from \"@hot-updater/supabase\";\n  import { config } from \"dotenv\";\n  import { defineConfig } from \"hot-updater\";\n\n  config({ path: \".env.hotupdater\" });\n\n  export default defineConfig({\n    build: bare({ enableHermes: true }),\n    storage: supabaseStorage({\n      supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,\n      supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,\n      bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,\n    }),\n    database: supabaseDatabase({\n      supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,\n      supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,\n    }),\n  });\n  ```\n\n* [Cloudflare](https://hot-updater.dev/docs/managed/cloudflare)\n```tsx\nimport { bare } from \"@hot-updater/bare\";\nimport { d1Database, r2Storage } from \"@hot-updater/cloudflare\";\nimport { config } from \"dotenv\";\nimport { defineConfig } from \"hot-updater\";\n\nconfig({ path: \".env.hotupdater\" });\n\nexport default defineConfig({\n  build: bare({ enableHermes: true }),\n  storage: r2Storage({\n    bucketName: process.env.HOT_UPDATER_CLOUDFLARE_R2_BUCKET_NAME!,\n    accountId: process.env.HOT_UPDATER_CLOUDFLARE_ACCOUNT_ID!,\n    cloudflareApiToken: process.env.HOT_UPDATER_CLOUDFLARE_API_TOKEN!,\n  }),\n  database: d1Database({\n    databaseId: process.env.HOT_UPDATER_CLOUDFLARE_D1_DATABASE_ID!,\n    accountId: process.env.HOT_UPDATER_CLOUDFLARE_ACCOUNT_ID!,\n    cloudflareApiToken: process.env.HOT_UPDATER_CLOUDFLARE_API_TOKEN!,\n  }),\n});\n```\n\n* [AWS S3 + Lambda@Edge](https://hot-updater.dev/docs/managed/aws)\n```tsx\nimport { bare } from \"@hot-updater/bare\";\nimport { s3Storage, s3Database } from \"@hot-updater/aws\";\nimport { config } from \"dotenv\";\nimport { defineConfig } from \"hot-updater\";\n\nconfig({ path: \".env.hotupdater\" });\n\nconst options = {\n  bucketName: process.env.HOT_UPDATER_S3_BUCKET_NAME!,\n  region: process.env.HOT_UPDATER_S3_REGION!,\n  credentials: {\n    accessKeyId: process.env.HOT_UPDATER_S3_ACCESS_KEY_ID!,\n    secretAccessKey: process.env.HOT_UPDATER_S3_SECRET_ACCESS_KEY!,\n  },\n};\n\nexport default defineConfig({\n  build: bare({ enableHermes: true }),\n  storage: s3Storage(options),\n  database: s3Database(options),\n});\n```\n\n* [Firebase](https://hot-updater.dev/docs/managed/firebase)\n```tsx\nimport { bare } from '@hot-updater/bare';\nimport {firebaseStorage, firebaseDatabase} from '@hot-updater/firebase';\nimport * as admin from 'firebase-admin';\nimport { config } from \"dotenv\";\nimport { defineConfig } from \"hot-updater\";\n\nconfig({ path: \".env.hotupdater\" });\n\n// https://firebase.google.com/docs/admin/setup?hl=en#initialize_the_sdk_in_non-google_environments\n// Check your .env file and add the credentials\n// Set the GOOGLE_APPLICATION_CREDENTIALS environment variable to your credentials file path\n// Example: GOOGLE_APPLICATION_CREDENTIALS=./firebase-adminsdk-credentials.json\nconst credential = admin.credential.applicationDefault();\n\nexport default defineConfig({\n  build: bare({\n    enableHermes: true,\n  }),\n  storage: firebaseStorage({\n    projectId: process.env.HOT_UPDATER_FIREBASE_PROJECT_ID!,\n    storageBucket: process.env.HOT_UPDATER_FIREBASE_STORAGE_BUCKET!,\n    credential,\n  }),\n  database: firebaseDatabase({\n    projectId: process.env.HOT_UPDATER_FIREBASE_PROJECT_ID!,\n    credential,\n  }),\n});\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgronxb%2Fhot-updater","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgronxb%2Fhot-updater","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgronxb%2Fhot-updater/lists"}