Remote DevTools

Open source · React Native · Expo · Web

Your app's dev menu,
on your computer.

Add a small SDK, pair with a QR code, and inspect logs, network traffic, state, storage and feature flags of a running app — on a simulator, a test phone, or a build in someone else's hands.

$ npm install @himmetkaan/remote-devtools
Remote DevTools — 192.168.1.24:8787
The Network tab showing an app's API requests and the details of one request
Pair
Scan, type six digits, or just ask.

01Pair

Scan, type six digits, or just ask.

Every session shows a single-use QR code and pairing code. Simulators and development builds find the relay on their own.

devtools.connection.pairWithQr(scanned)Scan, type six digits, or just ask.

02Approve

Nothing joins without a yes.

A development build on your network asks to connect. Approve it once, or always for that device and app.

isDevelopment: __DEV__Nothing joins without a yes.

03Logs

Every log, from the moment the app starts.

Levels, tags and structured data, captured console output, and the events from before the device connected.

devtools.log.error('Payment failed', error, {tag: 'checkout'})Every log, from the moment the app starts.

04Network

See the request that broke checkout.

fetch, XMLHttpRequest and axios are captured automatically. Inspect headers and bodies, copy as cURL, export HAR.

networkModule()See the request that broke checkout.

05Functions

Your dev menu, with buttons that run on the phone.

Register functions in the app; the UI turns their arguments into forms and shows the result.

functions.register({id: 'cart.seed', title: 'Add sample items', handler})Your dev menu, with buttons that run on the phone.

06State

Watch the store change, action by action.

Redux and Zustand state as a live tree, with every change as old → new — sent as small JSON patches.

stateModule({stores: [zustandAdapter(useCart)]})Watch the store change, action by action.

07Storage

Open AsyncStorage like a folder.

Browse, edit and delete keys in AsyncStorage, MMKV and localStorage. SecureStore stays read-only and masked.

storageModule({adapters: [asyncStorageAdapter(AsyncStorage)]})Open AsyncStorage like a folder.

08Flags

Flip a feature without a new build.

Typed flags with editors for their type. Overrides persist on the device until you reset them.

flags.define({key: 'checkout.v2', field: {type: 'boolean'}})Flip a feature without a new build.

09Custom panels

Build your own tab in a few lines.

Describe stats, tables, forms and buttons; the UI draws them and your handlers run in the app.

panels.define({id: 'orders', title: 'Orders', blocks})Build your own tab in a few lines.

Runs where you need it

A few lines to your first log

import {RemoteDevTools, networkModule} from '@himmetkaan/remote-devtools';

const devtools = RemoteDevTools.init({
    enabled: __DEV__,
    app: {id: 'com.example.app', name: 'Example', version: '1.0.0'},
    modules: [networkModule()],
});
devtools.log.info('Hello from the app');