When RemoteTerm is run behind a reverse proxy that serves it under a sub-path rather than at the root, the frontend fails to load and the browser shows a blank screen. The backend connects and operates correctly — this is purely a frontend asset path issue.
Context
I've packaged RemoteTerm as a Home Assistant app. Home Assistant's ingress system proxies app UIs through a path like /api/hassio_ingress/{token}/, stripping the prefix before forwarding requests to the app. The backend receives them at / as expected, and in testing I can confirm the radio connection and data flow work correctly via the logs.
However, the browser receives the HTML response and then tries to load the bundled JS/CSS using the absolute paths Vite outputs by default — e.g. <script src="/assets/index-abc123.js">. The browser resolves these against the domain root rather than the ingress sub-path, the requests never reach the app, and the page is blank.
This affects any sub-path reverse proxy setup, not just Home Assistant.
Root cause
frontend/vite.config.ts has no base set, so Vite defaults to "/" and emits absolute asset paths in the built HTML.
Proposed fix
Add base: "./" to vite.config.ts:
exportdefaultdefineConfig({base:"./",// ← add this
plugins:[react()],// ...
})
This causes Vite to emit relative asset paths (./assets/index-abc123.js) instead of absolute ones. Relative paths resolve correctly regardless of what sub-path the app is served under, so this fixes sub-path proxies with no impact on the default root-served deployment.
Happy to open a PR for this if it's something you'd accept.
I'm primarily running this for personal use, but I've made the repository public in case others find it useful. If there's interest in officially supporting a Home Assistant app and you'd like to take over or absorb the repository, I'm happy to hand it off.
When RemoteTerm is run behind a reverse proxy that serves it under a sub-path rather than at the root, the frontend fails to load and the browser shows a blank screen. The backend connects and operates correctly — this is purely a frontend asset path issue.
## Context
I've packaged RemoteTerm as a [Home Assistant app](https://github.com/bhaggs/ha-remoteterm-app). Home Assistant's ingress system proxies app UIs through a path like `/api/hassio_ingress/{token}/`, stripping the prefix before forwarding requests to the app. The backend receives them at `/` as expected, and in testing I can confirm the radio connection and data flow work correctly via the logs.
However, the browser receives the HTML response and then tries to load the bundled JS/CSS using the absolute paths Vite outputs by default — e.g. `<script src="/assets/index-abc123.js">`. The browser resolves these against the domain root rather than the ingress sub-path, the requests never reach the app, and the page is blank.
This affects any sub-path reverse proxy setup, not just Home Assistant.
## Root cause
`frontend/vite.config.ts` has no `base` set, so Vite defaults to `"/"` and emits absolute asset paths in the built HTML.
## Proposed fix
Add `base: "./"` to `vite.config.ts`:
```ts
export default defineConfig({
base: "./", // ← add this
plugins: [react()],
// ...
})
```
This causes Vite to emit relative asset paths (`./assets/index-abc123.js`) instead of absolute ones. Relative paths resolve correctly regardless of what sub-path the app is served under, so this fixes sub-path proxies with no impact on the default root-served deployment.
Happy to open a PR for this if it's something you'd accept.
I'm primarily running this for personal use, but I've made the repository public in case others find it useful. If there's interest in officially supporting a Home Assistant app and you'd like to take over or absorb the repository, I'm happy to hand it off.
<!-- github-sync-id:4209339498 -->
Eyy good spotting. I'm fixing that now and have made an issue to implement a full HA integration that exposes web socket events, sensors for stuff, etc.
Eyy good spotting. I'm fixing that now and have made an issue to implement a full HA integration that exposes web socket events, sensors for stuff, etc.
<!-- github-comment-id:4190427925 -->
This autoclosed with the commit, but feel free to reopen if you run into any issues. Sometime this week I'll make a repo with sensor integration, messaging, etc. As someone who doesn't use HA, I'll obviously test it but if you're willing to beta test that'd be awesome please! 🙂
This autoclosed with the commit, but feel free to reopen if you run into any issues. Sometime this week I'll make a repo with sensor integration, messaging, etc. As someone who doesn't use HA, I'll obviously test it but if you're willing to beta test that'd be awesome please! 🙂
<!-- github-comment-id:4190474805 -->
I started on, then opted to stay with the simpler route rather than, a full installable integration -- more weight than I wanted to take on for something I don't personally use. The doc link in the setup will be wrong until it's merged but https://github.com/jkingsman/Remote-Terminal-for-MeshCore/blob/ha/README_HA.md is some LLM generated examples that I've done a bit of testing with. I'm still gonna go through and polish that up and probably make some tweaks, but that's the general shape.
Would love to hear your thoughts and, if willing, your feedback on functionality if you try it -- thanks!!
I've pushed up the `ha` branch, which enables an MQTT fanout module that publishes to HA.
https://github.com/jkingsman/Remote-Terminal-for-MeshCore/tree/ha
I started on, then opted to stay with the simpler route rather than, a full installable integration -- more weight than I wanted to take on for something I don't personally use. The doc link in the setup will be wrong until it's merged but https://github.com/jkingsman/Remote-Terminal-for-MeshCore/blob/ha/README_HA.md is some LLM generated examples that I've done a bit of testing with. I'm still gonna go through and polish that up and probably make some tweaks, but that's the general shape.
Would love to hear your thoughts and, if willing, your feedback on functionality if you try it -- thanks!!
<!-- github-comment-id:4226052450 -->
Cool. I’ve been playing around with it today and so far it’s working well. Only thing I noticed is that for example, repeaters, aren’t exposing the full breadth of potential telemetry sensors (e.g., temperature, packet duplicate count, error count). I can open a new issue to account for that. Just wasn’t sure if there was a specific or technical reason they weren’t included.
Cool. I’ve been playing around with it today and so far it’s working well. Only thing I noticed is that for example, repeaters, aren’t exposing the full breadth of potential telemetry sensors (e.g., temperature, packet duplicate count, error count). I can open a new issue to account for that. Just wasn’t sure if there was a specific or technical reason they weren’t included.
<!-- github-comment-id:4232928411 -->
Awesome! Thanks for making this happen.
I dropped a comment on the commit about setting default display precision which would be great to include. https://github.com/jkingsman/Remote-Terminal-for-MeshCore/commit/b9414e84ee56aff3c7923b7d1cddd892262c8996#commitcomment-182220632
<!-- github-comment-id:4233311665 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
When RemoteTerm is run behind a reverse proxy that serves it under a sub-path rather than at the root, the frontend fails to load and the browser shows a blank screen. The backend connects and operates correctly — this is purely a frontend asset path issue.
Context
I've packaged RemoteTerm as a Home Assistant app. Home Assistant's ingress system proxies app UIs through a path like
/api/hassio_ingress/{token}/, stripping the prefix before forwarding requests to the app. The backend receives them at/as expected, and in testing I can confirm the radio connection and data flow work correctly via the logs.However, the browser receives the HTML response and then tries to load the bundled JS/CSS using the absolute paths Vite outputs by default — e.g.
<script src="/assets/index-abc123.js">. The browser resolves these against the domain root rather than the ingress sub-path, the requests never reach the app, and the page is blank.This affects any sub-path reverse proxy setup, not just Home Assistant.
Root cause
frontend/vite.config.tshas nobaseset, so Vite defaults to"/"and emits absolute asset paths in the built HTML.Proposed fix
Add
base: "./"tovite.config.ts:This causes Vite to emit relative asset paths (
./assets/index-abc123.js) instead of absolute ones. Relative paths resolve correctly regardless of what sub-path the app is served under, so this fixes sub-path proxies with no impact on the default root-served deployment.Happy to open a PR for this if it's something you'd accept.
I'm primarily running this for personal use, but I've made the repository public in case others find it useful. If there's interest in officially supporting a Home Assistant app and you'd like to take over or absorb the repository, I'm happy to hand it off.
Eyy good spotting. I'm fixing that now and have made an issue to implement a full HA integration that exposes web socket events, sensors for stuff, etc.
This autoclosed with the commit, but feel free to reopen if you run into any issues. Sometime this week I'll make a repo with sensor integration, messaging, etc. As someone who doesn't use HA, I'll obviously test it but if you're willing to beta test that'd be awesome please! 🙂
Definitely down to beta test and feel free to leverage anything from my repo in building out an official HA app.
I've pushed up the
habranch, which enables an MQTT fanout module that publishes to HA.https://github.com/jkingsman/Remote-Terminal-for-MeshCore/tree/ha
I started on, then opted to stay with the simpler route rather than, a full installable integration -- more weight than I wanted to take on for something I don't personally use. The doc link in the setup will be wrong until it's merged but https://github.com/jkingsman/Remote-Terminal-for-MeshCore/blob/ha/README_HA.md is some LLM generated examples that I've done a bit of testing with. I'm still gonna go through and polish that up and probably make some tweaks, but that's the general shape.
Would love to hear your thoughts and, if willing, your feedback on functionality if you try it -- thanks!!
Nice. I’ll give this a try this weekend to test and provide any feedback.
Awesome. I've just merged to main; feel free to open a new issue if you have any problems.
Cool. I’ve been playing around with it today and so far it’s working well. Only thing I noticed is that for example, repeaters, aren’t exposing the full breadth of potential telemetry sensors (e.g., temperature, packet duplicate count, error count). I can open a new issue to account for that. Just wasn’t sure if there was a specific or technical reason they weren’t included.
Oooh good thought! I hadn't done telemetry/LPP fetch but I can add that
Added LPP sensors.
Awesome! Thanks for making this happen.
I dropped a comment on the commit about setting default display precision which would be great to include. https://github.com/jkingsman/Remote-Terminal-for-MeshCore/commit/b9414e84ee56aff3c7923b7d1cddd892262c8996#commitcomment-182220632
Thanks! Fixed in
e1ee7fcd24Thanks! Fixed in Awesome; I'm gonna close this again but lemme know if you have any other issues.
Sounds good. I’ll keep testing
Thank you 🥰🥰🥰