HotupdaterHot Updater
Self Hosting (Custom)Server Frameworks

Express

Since v0.22.0+

Build a self-hosted Hot Updater server with Express framework.

Installation

Install Express and required dependencies.

npm install express @types/express --save-dev

Setup and Security

Make sure you've set up your database adapter first (see Database Adapters).

The Hot Updater handler does not include built-in authentication. Keep update-check routes public for React Native clients, but always protect bundle management routes before mounting the handler:

  • Public: /hot-updater/app-version/*, /hot-updater/fingerprint/*
  • Optional public diagnostics: /hot-updater/version
  • Protected: /hot-updater/api/*

Import the Hot Updater instance, protect /api/*, and mount it to your Express app:

import express from "express";
import { toNodeHandler } from "@hot-updater/server/node";
import { hotUpdater } from "./hotUpdater"; 

const app = express();
const handler = toNodeHandler(hotUpdater); 

const authMiddleware = (req, res, next) => { 
  const token = req.headers.authorization?.split(" ")[1]; 
  if (token !== process.env.API_KEY) { 
    return res.status(401).json({ error: "Unauthorized" }); 
  } 
  next(); 
}; 

app.use("/hot-updater/api", authMiddleware); 

app.all("/hot-updater/*", handler); 

app.listen(3000);

Set your API key in environment variables:

API_KEY=your-secret-api-key

Configure the CLI to include the API key when deploying bundles:

hot-updater.config.ts
import { standaloneRepository } from "@hot-updater/standalone";

export default defineConfig({
  // ...
  database: standaloneRepository({
    baseUrl: "http://localhost:3000/hot-updater",
    commonHeaders: {
      Authorization: `Bearer ${process.env.API_KEY}`,
    },
  }),
});

API Endpoints

The server automatically creates these endpoints:

MethodEndpointDescription
GET/hot-updater/versionGet server version
GET/hot-updater/fingerprint/:platform/:fingerprintHash/:channel/:minBundleId/:bundleIdCheck for updates by fingerprint
GET/hot-updater/app-version/:platform/:version/:channel/:minBundleId/:bundleIdCheck for updates by app version
GET/hot-updater/api/bundlesList bundles (query: channel, platform, limit, page, after, before)
GET/hot-updater/api/bundles/:idGet bundle by ID
POST/hot-updater/api/bundlesCreate bundles
PATCH/hot-updater/api/bundles/:idUpdate a bundle
DELETE/hot-updater/api/bundles/:idDelete bundle
GET/hot-updater/api/bundles/channelsList all channels

React Native Setup

Configure your React Native app to connect to this server.

App.tsx
import { HotUpdater } from '@hot-updater/react-native';

export default HotUpdater.wrap({
  baseURL: 'http://localhost:3000/hot-updater', 
  updateStrategy: 'appVersion', // or "fingerprint"
  updateMode: "auto",
  fallbackComponent: ({ progress, status }) => (
    // ... Custom loading UI
  ),
  onError: error => {
    // ... Error handling
  },
})(App);