Skip to content

Jump hot reload ignores nativephp.hot_reload.watch_paths #160

Description

@mylesduncanking

What were you trying to do?

Use php artisan native:jump for on-device development with hot reload, and have it respect the same hot_reload.watch_paths config as php artisan native:watch.

I added custom directories (e.g. modules/) to config/nativephp.php → hot_reload.watch_paths so changes there would reload the app on my phone while developing with Jump.

What happened?

Changes under custom watch paths did not trigger a reload when using Jump, even though:

The same paths do reload with native:watch (Android/iOS device builds)
Changes under the default paths (app/, resources/, routes/, config/) still reload via Jump
Jump’s bridge file watcher uses a hardcoded list in resources/jump/websocket-server.php and never reads config('nativephp.hot_reload.watch_paths').

How to reproduce the bug

In a Laravel app with NativePHP Mobile, publish/config and extend watch paths:
// config/nativephp.php
'hot_reload' => [
'watch_paths' => [
'app',
'resources',
'routes',
'config',
'modules', // custom directory
],
// ...
],
Create a test file, e.g. modules/Foo/Example.php or a Blade view under modules/.

Run php artisan native:jump, connect a device, and keep the app open.

Edit and save a .php or .blade.php file under modules/.

Expected: device reloads (same as native:watch).

Actual: no reload.

Control: edit routes/web.php or resources/views/... — reload does happen via Jump.

Debug Output

From storage/logs/jump-bridge.log after starting Jump — the bridge never logs custom paths; only the hardcoded set is used internally:

=== 2026-06-09 12:00:00 bridge server starting (ws=3001 tcp=3002 vite_proxy=3003) ===
[12:00:01] [Jump] TCP bridge listening on 127.0.0.1:3002
After editing modules/SomeModule/Example.php — no lines like:

Changed: modules/SomeModule/Example.php
Sent reload to 1 device(s)
After editing routes/web.php — reload does appear:

[12:05:10] [Jump] Changed: routes/web.php
[12:05:10] [Jump] Sent reload to 1 device(s)
Root cause (for maintainers): resources/jump/websocket-server.php hardcodes:

$watchPaths = ['app', 'resources', 'routes', 'config'];
native:watch reads config via WatchesAndroid / WatchesIos:

$paths = config('nativephp.hot_reload.watch_paths', $this->androidWatchPaths);
Jump’s bridge process is spawned from JumpCommand and does not receive Laravel config unless it is passed in (e.g. env var from JumpCommand).

Which operating systems have you seen this occur on?

Windows

Which platforms were you trying to build for?

Jump app (Android)

Notes

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions