nomadexapp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +224 -0
  3. package/bin/nomadex.mjs +1026 -0
  4. package/dist/assets/apl-Dgw9L7wA.js +1 -0
  5. package/dist/assets/asciiarmor-B3T-Ib7X.js +1 -0
  6. package/dist/assets/asn1-C0KgO0Wt.js +1 -0
  7. package/dist/assets/asterisk-D7tOY-Ef.js +1 -0
  8. package/dist/assets/brainfuck-Dr6WXxS2.js +1 -0
  9. package/dist/assets/clike-DQfG49Bz.js +1 -0
  10. package/dist/assets/clojure-DsDsbt3V.js +1 -0
  11. package/dist/assets/cmake-CaoY67QC.js +1 -0
  12. package/dist/assets/cobol-ng5WMKOY.js +1 -0
  13. package/dist/assets/coffeescript-L66efR1O.js +1 -0
  14. package/dist/assets/commonlisp-rk__8_Ow.js +1 -0
  15. package/dist/assets/crystal-C1BeQSjD.js +1 -0
  16. package/dist/assets/css-zrdFFahf.js +1 -0
  17. package/dist/assets/cypher-DTKBhe_T.js +1 -0
  18. package/dist/assets/d-CDf89RKe.js +1 -0
  19. package/dist/assets/diff-BY4_GICG.js +1 -0
  20. package/dist/assets/dist--QplBylv.js +6 -0
  21. package/dist/assets/dist-BOz4jprC.js +1 -0
  22. package/dist/assets/dist-BSpuB3dZ.js +1 -0
  23. package/dist/assets/dist-BVTS1puf.js +1 -0
  24. package/dist/assets/dist-BvjF9csH.js +1 -0
  25. package/dist/assets/dist-ByyB_57-.js +11 -0
  26. package/dist/assets/dist-C5sjJwrm.js +1 -0
  27. package/dist/assets/dist-C6S96i9v.js +1 -0
  28. package/dist/assets/dist-CUQQ4au1.js +1 -0
  29. package/dist/assets/dist-C_ZftsU-.js +1 -0
  30. package/dist/assets/dist-Cc03jTPl.js +1 -0
  31. package/dist/assets/dist-CftiQ_Tf.js +1 -0
  32. package/dist/assets/dist-ChuUwcd4.js +2 -0
  33. package/dist/assets/dist-Cuva2wRW.js +1 -0
  34. package/dist/assets/dist-CyFWfPpu.js +9 -0
  35. package/dist/assets/dist-D6kXrcQY.js +1 -0
  36. package/dist/assets/dist-DH3Q_V27.js +23 -0
  37. package/dist/assets/dist-DIQDx3Dq.js +1 -0
  38. package/dist/assets/dist-DO7LTg3a.js +1 -0
  39. package/dist/assets/dist-DYBvJnrG.js +1 -0
  40. package/dist/assets/dist-DhhFPaYP.js +13 -0
  41. package/dist/assets/dist-elfU6IUT.js +1 -0
  42. package/dist/assets/dist-mCTXNkQ9.js +1 -0
  43. package/dist/assets/dockerfile-BBRxgo6-.js +1 -0
  44. package/dist/assets/dtd-BOpcurKR.js +1 -0
  45. package/dist/assets/dylan-DrmRAfMX.js +1 -0
  46. package/dist/assets/ebnf-DgECi_W8.js +1 -0
  47. package/dist/assets/ecl-CWDhUBvl.js +1 -0
  48. package/dist/assets/eiffel-DBpGy7gs.js +1 -0
  49. package/dist/assets/elm-Dj_ZNWRH.js +1 -0
  50. package/dist/assets/erlang-Br4TQPB7.js +1 -0
  51. package/dist/assets/factor-bi5FmZTz.js +1 -0
  52. package/dist/assets/fcl-Dh6ibuJG.js +1 -0
  53. package/dist/assets/forth-fmpuPpMA.js +1 -0
  54. package/dist/assets/fortran-CZwiXuJZ.js +1 -0
  55. package/dist/assets/gas-DotCoURX.js +1 -0
  56. package/dist/assets/gherkin-Bw4mmeRF.js +1 -0
  57. package/dist/assets/groovy-D7xek06K.js +1 -0
  58. package/dist/assets/haskell-D5bv2Ijt.js +1 -0
  59. package/dist/assets/haxe-UA0z6FgT.js +1 -0
  60. package/dist/assets/http-DAkDDIPY.js +1 -0
  61. package/dist/assets/idl-DYj57TA2.js +1 -0
  62. package/dist/assets/index-BpFNmvYv.js +214 -0
  63. package/dist/assets/index-De1iEP2f.css +1 -0
  64. package/dist/assets/javascript-B9Zm1tmO.js +1 -0
  65. package/dist/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  66. package/dist/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  67. package/dist/assets/jetbrains-mono-cyrillic-600-normal-8K4wrrwR.woff +0 -0
  68. package/dist/assets/jetbrains-mono-cyrillic-600-normal-EVf6-Yzo.woff2 +0 -0
  69. package/dist/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  70. package/dist/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  71. package/dist/assets/jetbrains-mono-greek-600-normal-H7WoG9Et.woff2 +0 -0
  72. package/dist/assets/jetbrains-mono-greek-600-normal-mc2nkWzM.woff +0 -0
  73. package/dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  74. package/dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  75. package/dist/assets/jetbrains-mono-latin-600-normal-BfsvjouI.woff +0 -0
  76. package/dist/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2 +0 -0
  77. package/dist/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  78. package/dist/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  79. package/dist/assets/jetbrains-mono-latin-ext-600-normal-BfB_LPfz.woff2 +0 -0
  80. package/dist/assets/jetbrains-mono-latin-ext-600-normal-DObL3zCW.woff +0 -0
  81. package/dist/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  82. package/dist/assets/jetbrains-mono-vietnamese-600-normal-OWROknRo.woff +0 -0
  83. package/dist/assets/julia-CpHdnx_N.js +1 -0
  84. package/dist/assets/livescript-DcEJKRZ4.js +1 -0
  85. package/dist/assets/lua-s-LPZohT.js +1 -0
  86. package/dist/assets/mathematica-c8TKcpav.js +1 -0
  87. package/dist/assets/mbox-CUr7-CiI.js +1 -0
  88. package/dist/assets/mirc-pTdL1Ym3.js +1 -0
  89. package/dist/assets/mllike-DsgO-njf.js +1 -0
  90. package/dist/assets/modelica-PhVkZonB.js +1 -0
  91. package/dist/assets/mscgen-ByD0zE8S.js +1 -0
  92. package/dist/assets/mumps-DhD4kjw9.js +1 -0
  93. package/dist/assets/nginx-CJc6p_yt.js +1 -0
  94. package/dist/assets/nsis-BHchP6IS.js +1 -0
  95. package/dist/assets/ntriples-D1v3iWDa.js +1 -0
  96. package/dist/assets/octave-D_WvWxqk.js +1 -0
  97. package/dist/assets/oz-CmdX4m3g.js +1 -0
  98. package/dist/assets/pascal-hNOkBp6J.js +1 -0
  99. package/dist/assets/perl-NQdG1b_r.js +1 -0
  100. package/dist/assets/pig-CXzedlZV.js +1 -0
  101. package/dist/assets/powershell-RXDVpFWf.js +1 -0
  102. package/dist/assets/properties-BTvtucqR.js +1 -0
  103. package/dist/assets/protobuf-zHRYyuba.js +1 -0
  104. package/dist/assets/pug-C39WZDG2.js +1 -0
  105. package/dist/assets/puppet-CMNLsBcD.js +1 -0
  106. package/dist/assets/python-_LoDBjEZ.js +1 -0
  107. package/dist/assets/q-SLmsw_60.js +1 -0
  108. package/dist/assets/r-CocOMjw8.js +1 -0
  109. package/dist/assets/rpm-WgkTpiCm.js +1 -0
  110. package/dist/assets/ruby-DquNeiGE.js +1 -0
  111. package/dist/assets/sas-sJxciv6G.js +1 -0
  112. package/dist/assets/scheme-DEjJDX5Z.js +1 -0
  113. package/dist/assets/shell-DhAwSAum.js +1 -0
  114. package/dist/assets/sieve-CcW8-k2R.js +1 -0
  115. package/dist/assets/simple-mode-BwNcRC8_.js +1 -0
  116. package/dist/assets/smalltalk-nXkQ5zwM.js +1 -0
  117. package/dist/assets/solr-DO54nYOg.js +1 -0
  118. package/dist/assets/sora-latin-400-normal-CRt88UEn.woff2 +0 -0
  119. package/dist/assets/sora-latin-400-normal-OW7qkl5a.woff +0 -0
  120. package/dist/assets/sora-latin-600-normal-1_7fyUAY.woff +0 -0
  121. package/dist/assets/sora-latin-600-normal-Cdg4DaK0.woff2 +0 -0
  122. package/dist/assets/sora-latin-700-normal-9waGdLWo.woff2 +0 -0
  123. package/dist/assets/sora-latin-700-normal-BKPfQAnC.woff +0 -0
  124. package/dist/assets/sora-latin-ext-400-normal-BmhJC382.woff +0 -0
  125. package/dist/assets/sora-latin-ext-400-normal-Twk1CgKs.woff2 +0 -0
  126. package/dist/assets/sora-latin-ext-600-normal-Cue1zdhl.woff2 +0 -0
  127. package/dist/assets/sora-latin-ext-600-normal-DLOJK0Ta.woff +0 -0
  128. package/dist/assets/sora-latin-ext-700-normal-DM0oy5s8.woff2 +0 -0
  129. package/dist/assets/sora-latin-ext-700-normal-Oc7uZIYt.woff +0 -0
  130. package/dist/assets/sparql-CxAS_pwk.js +1 -0
  131. package/dist/assets/spreadsheet-DWzAMKF2.js +1 -0
  132. package/dist/assets/sql-C_mHN2XB.js +1 -0
  133. package/dist/assets/stex-BmuQ0Xsx.js +1 -0
  134. package/dist/assets/stylus-CQ8h_EBd.js +1 -0
  135. package/dist/assets/swift-D0Eq5raO.js +1 -0
  136. package/dist/assets/tcl-D7utka2n.js +1 -0
  137. package/dist/assets/textile-XEeoev-k.js +1 -0
  138. package/dist/assets/tiddlywiki-CecErCuV.js +1 -0
  139. package/dist/assets/tiki-BlL-kki4.js +1 -0
  140. package/dist/assets/toml-mmtg9INI.js +1 -0
  141. package/dist/assets/troff-Crc1ZuaH.js +1 -0
  142. package/dist/assets/ttcn-Cri02b1f.js +1 -0
  143. package/dist/assets/ttcn-cfg--4YiJN4x.js +1 -0
  144. package/dist/assets/turtle-CUuoUr2N.js +1 -0
  145. package/dist/assets/vb-BrHulZxe.js +1 -0
  146. package/dist/assets/vbscript-vyHcteNE.js +1 -0
  147. package/dist/assets/velocity-DN4o8rq-.js +1 -0
  148. package/dist/assets/verilog-B0DGHLZN.js +1 -0
  149. package/dist/assets/vhdl-WeAF-qEm.js +1 -0
  150. package/dist/assets/webidl-C_bKeJT2.js +1 -0
  151. package/dist/assets/xquery-CLyH3kVm.js +1 -0
  152. package/dist/assets/yacas-Dq3LuV9B.js +1 -0
  153. package/dist/assets/z80-Br7weo_y.js +1 -0
  154. package/dist/favicon.svg +54 -0
  155. package/dist/icons.svg +24 -0
  156. package/dist/index.html +59 -0
  157. package/docs/ARCHITECTURE.md +194 -0
  158. package/docs/SETUP.md +242 -0
  159. package/docs/ui-desktop.png +0 -0
  160. package/docs/ui-desktop.svg +190 -0
  161. package/docs/ui-mobile.png +0 -0
  162. package/docs/ui-mobile.svg +113 -0
  163. package/package.json +79 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 xaenic
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,224 @@
1
+ # Nomadex
2
+
3
+ <p align="center">
4
+ <img src="public/favicon.svg" alt="Nomadex logo" width="72" />
5
+ </p>
6
+
7
+ <p align="center">
8
+ Remote web UI for local coding agents.
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://nodejs.org/">
13
+ <img src="https://img.shields.io/badge/Node-20%2B-339933?style=flat-square&logo=node.js&logoColor=white" alt="Node 20+" />
14
+ </a>
15
+ <a href="./LICENSE">
16
+ <img src="https://img.shields.io/badge/License-MIT-f2c94c?style=flat-square" alt="MIT License" />
17
+ </a>
18
+ <img src="https://img.shields.io/badge/UI-Web%20%2B%20Mobile-1f7aec?style=flat-square" alt="Web and mobile UI" />
19
+ <img src="https://img.shields.io/badge/Providers-Codex%20%7C%20OpenCode%20%7C%20Qwen%20Code-7b61ff?style=flat-square" alt="Providers" />
20
+ </p>
21
+
22
+ Nomadex is a browser workspace for running and supervising coding agents on your own machine.
23
+
24
+ The repo is built for the workflow where the real agent, repository, CLI tools, and credentials stay on your workstation, server, or home box, while the UI stays reachable from your laptop, tablet, or phone. You can open the session remotely, watch live output, inspect files and diffs, answer approvals, steer the current turn, and keep moving without living in one terminal window.
25
+
26
+ If you are looking for a Codex web UI, OpenCode web UI, or Qwen Code web UI that works well on mobile, that is the direction Nomadex is built for. The app layer is also being shaped to support future providers such as Claude Code and Antigravity without rebuilding the whole shell.
27
+
28
+ ## 🖼️ Screenshots
29
+
30
+ ### 🖥️ Desktop
31
+
32
+ ![Nomadex desktop UI](docs/ui-desktop.png)
33
+
34
+ ### 📱 Mobile
35
+
36
+ ![Nomadex mobile UI](docs/ui-mobile.png)
37
+
38
+ ## ✨ Why Nomadex
39
+
40
+ - Keep the actual execution environment local and under your control.
41
+ - Supervise long-running agent work from your phone or another machine.
42
+ - Stay in one threaded workspace for chat, plans, files, diffs, approvals, and terminal output.
43
+ - Avoid exposing a raw local CLI session directly just to monitor progress remotely.
44
+ - Use a UI that is shaped for remote, mobile, and browser-first workflows instead of a desktop-only shell.
45
+
46
+ ## 🚀 Feature Highlights
47
+
48
+ | Area | What you get |
49
+ | --- | --- |
50
+ | Live sessions | Real-time threaded chat over the local app-server bridge |
51
+ | Mobile UX | Responsive workspace shell, tail-first transcript loading, and remote-friendly controls |
52
+ | Files and diffs | Explorer, editor, diff review, changed-file summaries, and local file browse routes |
53
+ | Composer | File attachments, image attachments, image paste, queueing, steer, and prompt tools |
54
+ | Runtime controls | Approvals, question prompts, rollback support, and in-progress visibility |
55
+ | Provider layer | Codex as the reference live path, plus OpenCode and Qwen Code integration work |
56
+ | Launch flow | Packaged `npx nomadexapp` launcher with app-server startup, password gate, and update check |
57
+
58
+ ## 🤖 Providers
59
+
60
+ | Provider | Status | Notes |
61
+ | --- | --- | --- |
62
+ | Codex | Live | Main reference path through the local app-server bridge |
63
+ | OpenCode | Integrated | CLI-backed path with provider-aware model handling |
64
+ | Qwen Code | Integrated | CLI-backed path with local setup/auth flow support |
65
+ | Claude Code | Planned | Target provider for the shared shell architecture |
66
+ | Antigravity | Planned | Scaffolded direction, not yet a complete live runtime |
67
+
68
+ ## ⚡ Quick Start
69
+
70
+ ### 📦 Packaged launcher
71
+
72
+ ```bash
73
+ npx nomadexapp
74
+ ```
75
+
76
+ The packaged launcher:
77
+
78
+ 1. serves the built Nomadex UI
79
+ 2. checks whether a Codex app-server is already healthy on `ws://127.0.0.1:3901`
80
+ 3. starts one if needed
81
+ 4. binds the UI on `0.0.0.0:3784`
82
+ 5. proxies the browser websocket through `/codex-ws`
83
+ 6. prints a UI password and requires it before the browser can open the workspace
84
+ 7. checks whether a newer npm release is available and prompts before startup when appropriate
85
+
86
+ Open:
87
+
88
+ - 🏠 Local machine: `http://127.0.0.1:3784`
89
+ - 🌐 Another device on the same network: `http://<your-lan-ip>:3784`
90
+
91
+ ### 🛠️ Repo development
92
+
93
+ ```bash
94
+ npm install
95
+ npm run dev:live
96
+ ```
97
+
98
+ Use `dev:live` when you are developing Nomadex itself and want the Vite development workflow.
99
+
100
+ ## 🌍 Remote Access
101
+
102
+ Preferred setup: ZeroTier.
103
+
104
+ Why:
105
+
106
+ - it keeps Nomadex on a private overlay network
107
+ - it is safer than exposing the local UI directly to the internet
108
+ - it works well for phone access from anywhere
109
+ - it matches the core model of keeping the real agent local to your machine
110
+
111
+ Recommended flow:
112
+
113
+ 1. Install ZeroTier on the host machine and on your phone.
114
+ 2. Join both devices to the same ZeroTier network.
115
+ 3. Run `npx nomadexapp` on the host machine.
116
+ 4. Open `http://<host-zerotier-ip>:3784` on the remote device.
117
+
118
+ Tailscale or SSH tunneling also work well. Avoid exposing the raw Nomadex port directly to the public internet without real network and auth controls in front of it.
119
+
120
+ ## 🧰 Common Commands
121
+
122
+ ```bash
123
+ npx nomadexapp
124
+ npm run dev:live
125
+ npm run app-server
126
+ npm run build
127
+ npm run preview
128
+ ```
129
+
130
+ ## 🏗️ Architecture
131
+
132
+ ```text
133
+ Browser or phone
134
+ -> Nomadex UI host
135
+ -> same-origin websocket proxy
136
+ -> local coding agent bridge
137
+ ```
138
+
139
+ Main layers:
140
+
141
+ - `src/app/WorkspaceShell.tsx`: routing, shell state, active thread, overlays, and composer orchestration
142
+ - `src/app/WorkspaceView.tsx`: reusable workspace UI sections
143
+ - `src/app/components/*`: transcript, settings, terminal, summaries, approvals, and supporting cards
144
+ - `src/app/services/runtime/*`: websocket lifecycle, uploads, turn mutations, auth/setup flows, and local runtime actions
145
+ - `src/app/services/presentation/*`: render shaping for transcript items, attachments, file links, and summaries
146
+ - `src/app/services/providers/*`: provider-specific transport and path conventions
147
+
148
+ More detail: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
149
+
150
+ ## 🎯 Use Cases
151
+
152
+ - Remote coding companion for a workstation you access over SSH
153
+ - Phone-friendly control panel for long-running local agent sessions
154
+ - Reviewing changed files and diffs before asking the agent to continue
155
+ - Sending steer prompts while away from your desk
156
+ - Handling approvals and question prompts from mobile
157
+ - Watching shell output and file edits on a private remote box or home lab machine
158
+
159
+ ## 📌 Status
160
+
161
+ ### ✅ Done
162
+
163
+ - [x] Live threaded workspace over the local websocket bridge
164
+ - [x] Mobile-friendly shell and long-thread transcript handling
165
+ - [x] File explorer, editor, diff review, and terminal surfaces
166
+ - [x] File and image attachments, including pasted images
167
+ - [x] Queueing, steer, approvals, and in-progress turn visibility
168
+ - [x] Theme picker, settings, skills library, and account/provider surfaces
169
+ - [x] Local workspace browsing and uploaded asset handling
170
+ - [x] Provider-aware launcher and app layer
171
+
172
+ ### 🧭 Next
173
+
174
+ - [ ] Publish the first public npm release
175
+ - [ ] Harden the packaged launcher for more providers and remote auth flows
176
+ - [ ] Extend provider parity beyond the current Codex-first runtime path
177
+ - [ ] Improve durable cross-provider thread memory and reload persistence
178
+ - [ ] Tighten remote access hardening for internet-facing setups
179
+ - [ ] Keep improving performance on very long mobile sessions
180
+
181
+ ## 📚 Documentation
182
+
183
+ - Setup and launch: [docs/SETUP.md](docs/SETUP.md)
184
+ - Architecture and extension points: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
185
+
186
+ ## 🚢 Publishing
187
+
188
+ - `main` now has GitHub Actions for lint, build, and npm publish.
189
+ - The publish workflow only releases when the version in `package.json` is not already on npm.
190
+ - Add a repo secret named `NPM_TOKEN` before relying on automatic publish.
191
+ - To ship an update, bump the package version, push to `main`, and GitHub Actions will publish `nomadexapp` automatically.
192
+
193
+ ## 🤝 Contributing
194
+
195
+ Contributions are welcome.
196
+
197
+ Useful areas:
198
+
199
+ - provider integrations
200
+ - launcher and packaging improvements
201
+ - remote access hardening
202
+ - mobile performance and long-thread rendering
203
+ - auth and session UX
204
+ - editor, diff, and terminal polish
205
+
206
+ Open an issue or PR with a focused change. Small, well-scoped improvements are much easier to review and land than broad refactors.
207
+
208
+ ## 📝 Notes
209
+
210
+ - Uploaded assets currently land under `.codex-web/uploads` and `.codex-web/uploads/files`.
211
+ - Codex is still the strongest live provider path today.
212
+ - Set `NOMADEX_PASSWORD` if you want a stable password instead of the generated per-launch password.
213
+ - `npm run preview` is useful for checking the built shell in the repo, while `npx nomadexapp` is the packaged launcher flow.
214
+
215
+ ## 🐛 Troubleshooting
216
+
217
+ - `UI port 3784 is already in use`
218
+ Stop the old Nomadex process or choose a different port.
219
+ - `Port 3901 ... is already in use, but it is not responding like a Codex app-server`
220
+ Another process is already on the websocket port. Stop it or point Nomadex to a different bridge.
221
+ - Browser still shows an old favicon or theme color
222
+ Hard refresh, then fully close and reopen the tab once. Mobile browsers cache this aggressively.
223
+
224
+ For the full setup guide, see [docs/SETUP.md](docs/SETUP.md).