Repository navigation
Releases
Releases · StepaniaH/port-light
v0.8.5
0.8.5 — 2026-10-03
Added
- A local troubleshooting workspace with port checks, scan history, saved reports, JSON export, and comparisons against earlier reports.
- Optional AI explanations linked to captured evidence, with a payload preview before each request and support for all seven interface languages.
- Saved AI connections for OpenAI, DeepSeek, OpenCode Go, and custom OpenAI-compatible services. Each connection can be edited, tested, selected, or deleted independently.
- TCP/UDP observation snapshots and change events for troubleshooting and report comparisons.
- A UI navigation hook for applications that add pages to the dashboard.
Changed
- Organize settings by topic, group machine controls, and adapt the custom palette editor to the available width.
- Show port-management lists before editors and keep navigation visible. Prioritize failed and warning diagnostics above routine checks.
- Group consecutive ports, separate affected ports from related project ports, and show scan details as labeled fields.
- Shorten troubleshooting copy, localize sample values, and use green for successful connection and save results.
- Improve Automation setup, report actions, and layouts on smaller screens.
Fixed
- Keep browser session credentials out of provider requests and reject keys mistakenly entered as model IDs.
- Preserve pending check conditions and expanded records during navigation and AI analysis; offer a retry when startup requests fail.
- Honor explicit proxy settings for provider connections and reserve OpenCode Go DeepSeek Flash output capacity for complete answers.
- Report incomplete model responses separately, remove internal source pointers from model input, and combine duplicate AI check suggestions.
- Preserve numeric capture order when limiting events recorded within the same second.
v0.8.4
0.8.4 — 2026-09-13
Added
- AI integration setup instructions and skill documents, available from Settings → Automation and included in the Docker image.
- A
port-light-mcpentry point in the CLI package, plusdoctorandreserve_portstools. Reservations default to one hour and save release tokens locally. mcp-configto generate Codex and Claude Code configuration, andverifyto check the adapter and instance without reserving ports.
Changed
- The Automation panel starts with setup and usage examples. Manual configuration is expandable, with a copy fallback when the clipboard is unavailable.
- MCP can release reservations using saved credentials and recover pending requests after a connection failure.
Fixed
- Refresh AI setup prompts immediately when switching the interface language.
- Recover after malformed or oversized MCP input, validate the initialization lifecycle, and negotiate only supported protocol versions.
- Forward connection and authentication variables into Docker MCP processes instead of setting only their parent process environment.
- Identify Docker Hub authentication and repository-update failures separately and document the token permissions needed to synchronize the description.
v0.8.3
0.8.3 — 2026-09-09
Added
- Compose project/service grouping with expandable contiguous port ranges.
- A local management page for Compose conflicts, replacement mapping snippets, reservations, and named port rules.
- Browser reservation recovery after a lost response, with release credentials retained in the current tab.
- Project range checks and rule selection in the allocation API, CLI (
--rule), and MCP. - Disposable single-machine and four-machine development previews and a shared local test command.
- Docker Hub README synchronization after release and repository metadata for Unraid Community Applications submission.
Fixed
- Preserve rule identity when renaming and reject collisions with another rule.
- Disable local-only port actions when a remote machine is selected.
- Keep the search field usable on narrow screens with translated header labels.
- Escape quotes in dynamic HTML attributes so names and group identifiers cannot break their markup.
- Keep waterfall boards across the available width when their heights differ.
- Preserve card columns and mobile density inside expanded Compose ranges.
- Apply name and status sorting within grouped views and refresh the active management page from the toolbar.
Changed
- Split API routes by domain, Compose decoding and port parsing into separate modules, and the peer editor out of the settings controller.
- Organize Python tests by domain.
- Align management page navigation, forms, and lists with the settings UI.
- Group port operations in the Manage ports dropdown and move setup diagnostics to Settings → Advanced.
- Shorten README feature lists, move installation instructions forward, and retain the dashboard screenshot.
- Update the Unraid template to v0.8.3 and document current submission requirements.
v0.8.2
0.8.2 — 2026-09-08
Upgrade notes
Upgrade the server and CLI/MCP together. Reservation creation now requires
POST /api/reservations with an Idempotency-Key; legacy GET mutations return
405. Stateless CLI reservations also require PORT_LIGHT_REQUEST_KEY.
Both Basic Auth variables must be nonempty, or both must be unset.
Fixed
- Compose ranges support up to 4096 ports per declaration, with a 65536-mapping
scan budget shared across files/includes. Exceeding either limit marks the scan
incomplete instead of silently advertising dropped ports as free. Paired
short-syntax ranges preserve corresponding container ports. - Health responses omit diagnostic file paths while Basic Auth or hidden-port
access is locked, including invalid authentication configurations. - Partial or explicitly empty Basic Auth configuration fails closed with 503;
Unicode credentials and hidden-unlock passwords compare safely as UTF-8. - Reservations now atomically persist an idempotent receipt with the claim.
CLI/MCP save a private recovery key before sending and recover the same claim
and release credentials after a lost response by retrying identical arguments.
Added
port-light requestslists non-secret pending-request metadata;
port-light recover <ID>retrieves still-active claims using GET only, even
beyond the automatic retry window. Failed recovery/token saves retain the journal.- Scan warnings identify the Compose file, range and resource limit with repair
guidance in all seven languages. Diagnostics respect the hidden-data gate. - Client error codes distinguish authentication misconfiguration, unavailable
occupancy, and obsolete mutation interfaces.
Changed
- Partially released requests can recover their remaining claims through GET;
replaying POST still refuses reallocation. Malformed receipts fail closed. - Creating reservations requires
POST /api/reservationswith a secret
Idempotency-Key. Legacy mutating GET suggestions return 405. Upgrade CLI/MCP
alongside the server; read-only GET suggestions continue working. - Stateless CLI reservations (
--no-save --json) require a caller-retained
PORT_LIGHT_REQUEST_KEY. See the CLI guide for recovery and retention limits.
v0.8.1
0.8.1 — 2026-09-07
Added
- A dependency-free
port-lightcommand-line client withdoctor,check,
atomicreserve, and token-authenticatedreleasecommands. It supports
human or versioned JSON output, stable exit categories, Basic Auth, agent
tokens, custom CA bundles, one-hour leases by default, explicit persistent
reservations, andselfor all-peer checks. - Private local reservation-token storage partitioned by server and port, with
stateless JSON/stdin/environment alternatives for automation. The published
container includes theport-lightcommand, and the Python package installs
withpipxoruv tool; releases attach a matching wheel to the same tag.
Container-side tokens default to persistent/data/cli-statestorage. /api/metanow advertises named client capabilities. Port suggestions accept
require_count=truefor an all-or-none requested count.
Changed
- The MCP stdio server and CLI now share one tested HTTP client, response
validator, and error model. Directpython /path/to/mcp/server.pystartup
remains supported from outside the repository. - The backend, MCP server, CLI, Python package, and release gate now read one
product version. JSON mode also covers argument-parser failures, and long
options no longer accept unstable abbreviations. - CI lints and tests the command-line package alongside the server, including a
live server round trip for doctor, check, reserve, and release. It installs
the built wheel in an isolated environment and builds the image to smoke-test
both the CLI and MCP entry points.
Fixed
- CLI and MCP responses now reject mismatched ports, invalid diagnostic data,
malformed occupancy data, and unverified reservation scopes. Exact CLI
reservations require the server capability that guarantees all-or-none
allocation, preventing an older server from silently creating a partial
reservation. - CLI and MCP environment configuration now uses one shared client factory.
Local token-directory creation failures use the documented error category,
and unexpected MCP failures no longer expose internal exception details.
v0.8.0
0.8.0 — 2026-09-04
Added
- Setup / Doctor checks settings storage, snapshot freshness, host-listener trust, Docker access, Compose discovery completeness, and recent degraded events.
- Doctor reports can be copied or downloaded as JSON. Reports use an aggregate allowlist and omit machine identity, peer details, ports, paths, credentials, environment values, and degradation scopes.
Changed
- Settings writes now contain only changed fields. Saved overrides can be removed to restore their environment or default value.
- Settings and peer edits use independent save queues and status messages. The settings page keeps drafts, confirmed values, and in-flight revisions separate.
- Settings page event handling and save coordination now live behind a mounted page controller.
Fixed
- Older settings or peer responses no longer replace edits made while a request is in flight.
- Reverting a setting to its confirmed value clears its pending state, and switching Settings categories returns the page to the top.
- Custom palette save, import, and delete failures are reported in the palette editor instead of the general autosave status.
- Doctor prioritizes current Docker and Compose access failures over older scan results, and report copying falls back when the Clipboard API is unavailable.
v0.7.9
0.7.9 — 2026-09-04
Changed
- Settings changes now save automatically. Writes are debounced and serialized, and newer edits remain pending until their own save completes.
- The default waterfall layout caps its column count at the number of displayed machines, allowing one- and two-machine dashboards to use available desktop width.
- The English and Simplified Chinese READMEs now include a dashboard screenshot made with fictional host and service data.
Fixed
- Pending settings edits survive navigation and custom-theme changes. Responses from earlier saves no longer replace newer machine credentials or theme choices.
- Incomplete machine entries remain editable instead of being silently removed during automatic saves.
- Saved-setting source hints and scanner status badges update without resetting the form.
Development
- Consolidated GitHub Actions into CI and Release. CI runs on
mainpushes and pull requests targetingmain, cancels superseded runs, and runs Ruff once while retaining all Python and frontend checks. - Release requires successful CI for the exact tagged commit on
main, publishes the multi-architecture images, then creates the GitHub Release. Version tags no longer trigger a duplicate test run, and manualdevimage publishing has been removed.
v0.7.8
0.7.8 — 2026-09-03
Added
- Light variants for Nord, Dracula, Tokyo Night, One Dark, Everforest, Rosé Pine, and Kanagawa. All ten built-in palette families now support both light and dark modes, including system-mode changes and cached startup appearance.
- A refresh-interval slider in Settings shows the recommended peer capacity for each cadence while preserving custom values loaded from configuration.
- Optional machine descriptions appear below host titles. Both the local machine and saved peers support notes of up to 120 characters.
Changed
- Multi-host dashboards now accept up to 32 peers. Settings offers a responsive waterfall (default) and an optional tabbed view, on desktop and mobile alike.
- Refresh intervals at or beyond the recommended 32-peer capacity explicitly explain that slower polling reduces traffic without increasing the product limit.
- Peer refreshes use bounded concurrency and overlapping refresh triggers coalesce into one pending round.
scope=allpeer checks are also capped at six concurrent requests. - Saved peer rows are collapsed by default in Settings so larger fleets remain manageable.
- Multi-machine layout lives under Appearance → Cards, with miniature layout previews and an explicit checkmark and selected label.
Fixed
- The refresh slider no longer inherits the rectangular text-field focus shadow; keyboard focus is shown around its circular thumb.
- Choice controls no longer show a clipped vertical focus line on pointer clicks. Layout cards and segmented choices retain a separate keyboard-only focus outline.
- Local event notifications refresh only the hub; remote polling follows the selected interval. Full-fleet refresh requests retain priority when events overlap.
- Superseded refresh queues cannot cancel a newer hidden-port unlock request.
- The Catppuccin light preview now uses its palette colors instead of the default dark swatch.
- System appearance changes no longer re-enable palette controls when settings are read-only.
- Occupancy warning guidance now opens on pointer hover only from the info icon, rather than from the entire warning row. Focus and click controls are unchanged.
v0.7.7
0.7.7 — 2026-09-03
Added
- Local machine name, scanner selection, Compose scan depth, excluded folder names, and file limit can be managed from Settings. Deployment paths, mounts, and permissions remain deployment configuration.
- Occupancy warnings open troubleshooting guidance on hover, focus, or click, including checks for scanner failures and instructions for upgrading from v0.7.6.
Changed
- Card summaries omit wildcard addresses (
0.0.0.0and::) while preserving specific addresses. Full bindings remain in port details, with clearer descriptions of wildcard listeners. - Updated scanner settings, diagnostics, and bind-address copy in all seven interface languages. Technical troubleshooting documentation is maintained in English.
Fixed
- Compose discovery no longer enters directories beyond the selected scan depth. Excluded folder names prevent discovery in unrelated data directories.
- Repeated scanner failures are rate-limited independently of recent health-event history, including when more than 20 distinct failures occur.
- Invalid scanner selections no longer silently enable every scanner. Occupancy checks and allocation fail closed while the settings page remains available for repair.
Upgrade notes
- No mandatory configuration migration is required. Keep
latestif already in use, or update a pinned image tag tov0.7.7, then pull and recreate the container. - Image updates do not grant Docker socket or directory permissions. Apply deployment changes with
docker compose up -d port-light;docker compose restartdoes not apply changed environment variables, groups, or mounts. See Troubleshooting.
v0.7.6
0.7.6 — 2026-09-03
Added
- Cards can optionally show compact bind-address summaries, with independent IPv4 and IPv6 controls. Wildcard listeners are labeled as all interfaces, multiple addresses collapse to
+N, and full values remain in the port details and card tooltip.
Changed
- A background occupancy monitor now owns scanning, snapshot/ETag caching, history, webhooks, and SSE notifications. HTTP routes read completed snapshots; manual and hidden-port writes update stored state without rescanning host sources.
scope=allfetches peers concurrently. Peer requests validate every DNS answer, disable environment proxies, and still reject redirects. DNS rebinding limits are documented in the security policy.- The frontend API module returns data without importing views. The app coordinates polling, SSE, grid/detail rendering, and detail refresh callbacks.
Fixed
- Bind-address switches no longer repeat the environment or saved-setting source below each control.
- Card bind summaries exclude manual reservations without bind information, include implicit Compose wildcard bindings, and normalize IPv4-mapped IPv6 consistently. IPv6 elision preserves leading and trailing
::. - Enabled scanner failures retain previous observations, suppress history/webhook transitions, and block allocation. Unknown occupancy is shown explicitly; health exposes readiness and scanner state.
- Unreadable or invalid port data is preserved and returns
503, preventing later writes from replacing existing entries. - The free-port planner reserves a whole range atomically and reports conflicts and storage failures without closing the dialog.
- Slow background scans no longer hold the publication lock or ASGI event loop. Refresh deadlines bound startup and shutdown; timed-out workers cannot accumulate or publish late results.
- History database failures appear in health degradations; failed history reads return
503. - Truncated Compose scans cannot produce reservations or advance the history baseline.
- Detail lookups outside a previously cached grid range use the requested port's snapshot data.
Development
- Added a Chromium smoke flow with two temporary instances covering startup, details, a saved label, bind-address settings, batch reservation conflicts and retries, and host switching; frontend CI runs it after module tests.
- The background-observation test waits for history completion independently of SSE publication, avoiding a race on slower systems.