The Deep scan link on a device now opens a small dialog instead of firing straight away. It is prefilled with the full 1-65535 range — that is still the point of the feature — but a user who knows where a service lives can narrow it and get an answer in seconds instead of minutes. The dialog takes an nmap-style spec: a port, a range, or a comma list (80,443,8000-9000). It shows the port count live, refuses to start on something nmap could not use, and carries three presets (all / 1-1024 / 1-10000). Backend: - _parse_port_spec / _port_chunks generalize the slicing that used to be full-range only. Ranges are merged before slicing, so an overlapping spec is never scanned twice, and small ranges are packed into one nmap call instead of one call each. _deep_port_chunks still yields the same eight slices as before. - run_device_scan takes ports=; it wins over full_ports. - The retry-free flags (--max-retries 0 --min-rate 2000) now key on the total port count rather than on full_ports. They pay for themselves over thousands of ports on a lossy host; over a handful they only cost accuracy. - RescanDeviceRequest.ports validates the spec — 422 rather than handing nmap a bad -p. Blank means the full sweep. Frontend utils/portSpec.ts mirrors the backend parser so a typo is caught before the request; the backend validates again because it is the one calling nmap. The existing rescan tests now go through the dialog: the click path changed, so the start is two steps. ha-relevant: yes
React + TypeScript + Vite
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
Currently, two official plugins are available:
- @vitejs/plugin-react uses Babel (or oxc when used in rolldown-vite) for Fast Refresh
- @vitejs/plugin-react-swc uses SWC for Fast Refresh
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 ESLint configuration
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Remove tseslint.configs.recommended and replace with this
tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
tseslint.configs.stylisticTypeChecked,
// Other configs...
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])
You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Enable lint rules for React
reactX.configs['recommended-typescript'],
// Enable lint rules for React DOM
reactDom.configs.recommended,
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])