Skip to content
Bullet

Comparison

Bullet versus Re.Pack and Rollipop

This page compares Bullet's development server against two mature React Native bundler toolkits: Re.Pack, built on webpack and Rspack, and Rollipop, built on Rolldown. All three aim to be drop-in replacements for Metro's dev server, so they preserve the HTTP and WebSocket surface that React Native clients, symbolication, and the debugger expect.

The goal here is to be honest about what Bullet already matches, what remains a genuine gap, and which gaps are deliberate design differences.

Architecture at a glance

The three tools share the Metro-compatible surface but diverge sharply in how the server is packaged and what it exposes.

AspectBulletRe.PackRollipop
Server modelEmbedded in H3 via a bullet() pluginStandalone @callstack/repack-dev-serverIntegrated createDevServer()
HTTP layerH3 and crosswsFastify 5Fastify 5
BundlerRspackwebpack or RspackRolldown
Multi-platformOne in-process MultiCompilerRspack MultiCompiler; webpack worker poolOne engine per (bundle, id) in a static pool
Output storageIn-memoryIn-memory (memfs)On disk plus a native transform cache
Unique strengthStreaming React Native Web SSRBundler-agnostic delegate; Module FederationEvent-bus observability: SSE, MCP, dashboard

Bullet's streaming SSR of React Native Web, evaluated from a Node VM server bundle, is something neither Re.Pack nor Rollipop offer.

What Bullet does well

These capabilities are on par with both reference servers, so they aren't gaps.

  • Metro-compatible bundle URL scheme (/index.bundle?platform=) that returns application/javascript.
  • multipart/mixed bundle progress streaming, so the React Native client shows a live bundling progress bar on cold builds.
  • Metro and security response headers: X-React-Native-Project-Root, X-Content-Type-Options: nosniff, and Access-Control-Allow-Origin: devtools://devtools on source-map responses.
  • POST /symbolicate with a symbolicator that derives the source-map name from the request stack frames instead of assuming a fixed entry name.
  • Source-map serving with the correct DevTools CORS header.
  • Asset serving under /assets/*.
  • Wait-for-compile-then-serve semantics, so requests that arrive mid-build queue instead of returning a 404.
  • Web HMR with React Refresh, plus native HMR status broadcast.
  • A native in-app console log socket at /__client that surfaces console.* output from the device.
  • A WebSocket heartbeat that pings every 30 seconds and terminates dead peers.
  • Reuse of the real @react-native-community/cli-server-api and @react-native/dev-middleware, so /status, /message, /events, the dev menu, and the Fusebox inspector all work.
  • A local terminal dashboard with reload, dev-menu, and debugger shortcuts.
  • An offline bundle command.

Gaps

These features exist in one or both reference servers but not in Bullet. Most are about extended tooling and observability rather than core Metro compatibility.

GapPresent inNotes
HTTPS and TLSRe.PackThe dev server runs over HTTP only.
Build-stats HTTP or WebSocket APIRe.Pack, RollipopNo platforms, assets, or stats endpoints.
Central event busRollipopEvents bridge to the CLI, not a unified bus.
Server-sent event streamsRollipopNo /sse/* streams for external subscribers.
Browser dashboard and REST APIRollipopOnly a local terminal dashboard exists.
MCP serverRollipopNo Model Context Protocol endpoint for agents.
Module Federation CDP resource loadingRe.PackNo Module Federation story.
Re.Pack-specific gaps
  • A bundler-agnostic Server.Delegate interface, so the server never imports a bundler. Bullet is coupled to Rspack by design.
  • CDP interception that loads cross-origin Module Federation remotes into DevTools.
  • A REST and WebSocket tooling API that pushes build events and exposes platform, asset, and compilation stats.
Rollipop-specific gaps
  • A built-in MCP server that exposes build logs, client logs, and symbolication to AI agents.
  • Server-sent event streams that feed an external dashboard.
  • A browser dashboard backed by a rich REST API and a persisted build-state model.
  • A central event bus that routes reporting and HMR through one correlated stream.
  • Push-based HMR, where the server sends prebuilt module code. Bullet uses the conventional signal-based model, where the client computes and applies the update.

Summary

Bullet has solid core parity with both reference servers. It matches the Metro-compatible surface that mattered most: multipart/mixed progress streaming, the Metro and security headers, an explicit source-map response with DevTools CORS, a request-aware symbolicator, the /__client console log socket, and a WebSocket heartbeat. On top of that, it offers streaming React Native Web SSR that neither reference server has.

The remaining gaps are mostly about extended tooling. HTTPS and a build-stats API are the most portable additions. The observability features, that is, a central event bus, server-sent event streams, a browser dashboard, and an MCP server, are higher-effort and optional. Pursue them only if developer-experience tooling or AI-agent integration is a product goal.