Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast. fix(settings): port change now shows explicit restart warning Problem: Changing the panel port in Settings → Panel/NAT only saved to config.yaml and updated in-memory cfg.Server.Port, but the HTTP server kept listening on the old port. The success toast said 'restart service to apply' but was easy to miss — users expected the port change to take effect immediately. Root cause: the HTTP server (gin r.Run) binds once at startup to cfg.Server.Port. Changing the port in-memory doesn't rebind. A panel restart is required. The response included restart_required:true and a message, but the frontend only showed a generic success toast. Fix: when the port actually changes (prevPort != newPort), show a Modal.warning with: - old port → new port - explicit 'systemctl restart 3m-ui' command - new access URL http://IP:newPort When only listen/public_url changes (port unchanged), keep the existing success toast.
React + TypeScript + Vite
This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules.
Currently, two official plugins are available:
- @vitejs/plugin-react uses Oxc
- @vitejs/plugin-react-swc uses SWC
React Compiler
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see this documentation.
Expanding the Oxlint configuration
If you are developing a production application, we recommend enabling type-aware lint rules by installing oxlint-tsgolint and editing .oxlintrc.json:
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["react", "typescript", "oxc"],
"options": {
"typeAware": true
},
"rules": {
"react/rules-of-hooks": "error",
"react/only-export-components": ["warn", { "allowConstantExport": true }]
}
}
See the Oxlint rules documentation for the full list of rules and categories.