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.
| Aspect | Bullet | Re.Pack | Rollipop |
|---|---|---|---|
| Server model | Embedded in H3 via a bullet() plugin | Standalone @callstack/repack-dev-server | Integrated createDevServer() |
| HTTP layer | H3 and crossws | Fastify 5 | Fastify 5 |
| Bundler | Rspack | webpack or Rspack | Rolldown |
| Multi-platform | One in-process MultiCompiler | Rspack MultiCompiler; webpack worker pool | One engine per (bundle, id) in a static pool |
| Output storage | In-memory | In-memory (memfs) | On disk plus a native transform cache |
| Unique strength | Streaming React Native Web SSR | Bundler-agnostic delegate; Module Federation | Event-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 returnsapplication/javascript. multipart/mixedbundle 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, andAccess-Control-Allow-Origin: devtools://devtoolson source-map responses. POST /symbolicatewith 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
/__clientthat surfacesconsole.*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-apiand@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
bundlecommand.
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.
| Gap | Present in | Notes |
|---|---|---|
| HTTPS and TLS | Re.Pack | The dev server runs over HTTP only. |
| Build-stats HTTP or WebSocket API | Re.Pack, Rollipop | No platforms, assets, or stats endpoints. |
| Central event bus | Rollipop | Events bridge to the CLI, not a unified bus. |
| Server-sent event streams | Rollipop | No /sse/* streams for external subscribers. |
| Browser dashboard and REST API | Rollipop | Only a local terminal dashboard exists. |
| MCP server | Rollipop | No Model Context Protocol endpoint for agents. |
| Module Federation CDP resource loading | Re.Pack | No Module Federation story. |
Re.Pack-specific gaps
- A bundler-agnostic
Server.Delegateinterface, 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.