Skip to content

Next release - #1734

Merged
jokob-sk merged 7 commits into
mainfrom
next_release
Aug 10, 2026
Merged

Next release#1734
jokob-sk merged 7 commits into
mainfrom
next_release

Conversation

@jokob-sk

@jokob-sk jokob-sk commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • Bug Fixes

    • Corrected plugin discovery and execution paths so plugins load from the server-side location.
    • Added migration support for existing configurations using legacy plugin paths.
    • Updated Docker examples with required network capabilities for reliable scanning and monitoring.
  • Documentation

    • Updated plugin links, setup instructions, templates, and multilingual references.
    • Added user guides for numerous plugins and notification features.
  • Chores

    • Updated tests and development tooling to reflect the new plugin location.

jokob-sk and others added 4 commits August 5, 2026 10:29
- Introduced a new plugin for monitoring website health, including functionality to check URLs and log results.
- Created README and configuration files for the workflows plugin, detailing its purpose and settings.
- Updated import paths in various test files to reflect the new directory structure.
- Ensured compatibility of test cases with the updated plugin architecture.
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4f460dbc-b4cf-4a37-8e8c-b217988e3e7b

📥 Commits

Reviewing files that changed from the base of the PR and between a06dc25 and edae729.

📒 Files selected for processing (1)
  • context7.json

📝 Walkthrough

Walkthrough

The plugin directory is relocated from front/plugins to server/plugins. Runtime paths, command settings, Python imports, documentation links, localization strings, Docker examples, developer guidance, and tests are updated. Additional plugin documentation and configuration files are included.

Changes

Plugin relocation

Layer / File(s) Summary
Runtime paths and plugin assets
.devcontainer/Dockerfile, Dockerfile, docker-compose.yml, server/..., server/plugins/..., scripts/...
Plugin environment variables, command paths, Python imports, configuration schemas, plugin documentation, container mounts, and legacy configuration migration now use server/plugins.
Documentation references, guidance, and localization
docs/..., .gemini/..., .github/..., front/php/templates/language/*, front/*.php
Plugin links, image paths, setup instructions, developer guidance, frontend links, and localized documentation URLs now target server/plugins.
Validation and development settings
test/..., .gitignore, .vscode/settings.json
Test import paths use server/plugins. The ignore rule and terminal approval settings are also updated.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title is too generic and does not identify the main change, which primarily relocates plugins from front/plugins to server/plugins. Use a concise title that names the primary change, such as "Move plugins from front to server directory".
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch next_release

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

🟡 Minor comments (32)
server/plugins/_publisher_mqtt/README.md-3-3 (1)

3-3: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the broker name.

Use “Mosquitto” instead of “Mosquito.” (mosquitto.org)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/_publisher_mqtt/README.md` at line 3, Correct the broker name
in the README description by replacing “Mosquito” with “Mosquitto,” leaving the
surrounding Home Assistant and MQTT wording unchanged.
server/plugins/csv_backup/README.md-3-3 (1)

3-3: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the documentation proofreading defects.

  • server/plugins/csv_backup/README.md#L3-L3: Replace “Can be used for importing” with a complete sentence, such as “Use it to import”.
  • server/plugins/db_cleanup/README.md#L11-L11: Replace tehy with they.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/csv_backup/README.md` at line 3, Correct the documentation
proofreading issues: in server/plugins/csv_backup/README.md lines 3-3, replace
“Can be used for importing” with a complete sentence such as “Use it to import”;
in server/plugins/db_cleanup/README.md lines 11-11, replace the typo “tehy” with
“they”.

Source: Linters/SAST tools

.gemini/skills/plugin-development/plugin-skill.md-22-22 (1)

22-22: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the manual-run guidance environment-specific.

The command at Line 19 runs from the Gemini CLI repository root. The /app/server/plugins and /app/server paths in Line 22 are container paths. Use paths derived from __file__, or state that these paths apply only in the container. Otherwise the documented command cannot import shared modules such as plugin_helper.

Based on learnings: Gemini runs from the repository root and skill examples must avoid absolute path prefixes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gemini/skills/plugin-development/plugin-skill.md at line 22, Update the
manual-run guidance in the plugin skill documentation to avoid hardcoded
container-only paths: derive plugin and server paths from __file__ in the
example, or explicitly restrict the /app/server paths to container execution.
Ensure the documented repository-root command can import shared modules such as
plugin_helper.

Source: Learnings

server/plugins/_publisher_mqtt/README.md-166-186 (1)

166-186: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Use the Home Assistant discovery config topic.

Home Assistant discovery payloads must be published to <discovery_prefix>/<component>/[<node_id>/]<object_id>/config. Change the README topic to homeassistant/binary_sensor/mac_44_ef_44_ef_44_ef/is_present/config. The MQTT code already publishes discovery configs on the config topic.

Proposed documentation fix
-Topic: `homeassistant/binary_sensor/mac_44_ef_44_ef_44_ef/is_present/`
+Topic: `homeassistant/binary_sensor/mac_44_ef_44_ef_44_ef/is_present/config`
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/_publisher_mqtt/README.md` around lines 166 - 186, The README
discovery topic must use the Home Assistant config endpoint. Update the
documented topic for the binary sensor example to append /config, matching the
discovery topic format and the MQTT publisher’s existing behavior.
server/plugins/icmp_scan/README.md-3-3 (1)

3-3: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the spelling error.

Change suplementing plugins to supplementing plugins.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/icmp_scan/README.md` at line 3, Correct the spelling of
“suplementing plugins” to “supplementing plugins” in the README description.

Source: Linters/SAST tools

server/plugins/freebox/README.md-11-11 (1)

11-11: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the setup wording.

Change se [remote setup] to see [remote setup]. Change Freeboxe's to Freebox's. Use clear UI formatting such as Settings > Access Management.

Also applies to: 35-35

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/freebox/README.md` at line 11, Update the setup documentation
wording: replace “se [remote setup]” with “see [remote setup]”, correct
“Freeboxe's” to “Freebox's”, and format the UI navigation path as “Settings >
Access Management” wherever applicable.

Source: Linters/SAST tools

server/plugins/dhcp_leases/README.md-46-48 (1)

46-48: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add language identifiers to the fenced examples.

markdownlint reports MD040 for the fences on Lines 46, 56, and 68. Use an appropriate identifier such as text for these lease-file examples.

Also applies to: 56-58, 68-81

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/dhcp_leases/README.md` around lines 46 - 48, Update the fenced
examples in the README, including the sections around the lease-file examples
and the standalone TBC block, to specify an appropriate language identifier such
as text after each opening fence. Ensure all referenced fences satisfy
markdownlint MD040 without changing their contents.

Source: Linters/SAST tools

server/plugins/dhcp_leases/README.md-52-58 (1)

52-58: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the sample MAC address.

Line 57 contains seven octets. A MAC address must contain six octets. Use a valid six-octet value in both the MAC address and client ID fields.

Proposed correction
-1715932537 01:5c:5c:5c:5c:5c:5c 192.168.1.115 ryans-laptop 01:5c:5c:5c:5c:5c:5c
+1715932537 01:5c:5c:5c:5c:5c 192.168.1.115 ryans-laptop 01:5c:5c:5c:5c:5c
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/dhcp_leases/README.md` around lines 52 - 58, Correct the
example lease line in the “Example File Format” section so both the MAC address
and client ID use valid six-octet values, preserving the documented field order
and remaining sample data.
server/plugins/dhcp_leases/README.md-42-48 (1)

42-48: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

** Replace the TBC placeholder with a real Pi-hole example. **

Pi-hole paths are handled by splitting each line into 5 fields and using field 1 as the primary ID, field 2 as the secondary IP, field 3 as the hostname, and field 4 as the MAC. Provide a concrete 5-field sample that matches that import order so users can map Pi-hole dhcp.leases files correctly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/dhcp_leases/README.md` around lines 42 - 48, Replace the TBC
placeholder in the pihole format section with a concrete five-field Pi-hole
dhcp.leases example, ordered as primary ID, secondary IP, hostname, MAC, and the
remaining field, so users can map the import fields correctly.

Source: Learnings

server/plugins/ipneigh/README.md-28-28 (1)

28-28: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the invalid release date.

November has 30 days. 31-Nov-2024 is not a valid date. Replace it with the confirmed release date.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/ipneigh/README.md` at line 28, Update the Release Date entry
in the ipneigh README to replace the invalid 31-Nov-2024 value with the
confirmed valid release date, preserving the existing date format.
server/plugins/kea_api/README.md-99-99 (1)

99-99: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use an unambiguous release date.

11/05/2026 can mean May 11 or November 5. Use ISO 8601 format and confirm the intended date before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/kea_api/README.md` at line 99, Update the README release date
to an unambiguous ISO 8601 date in the Release Date field, confirming whether
the intended date is May 11 or November 5, 2026 before applying the change.
server/plugins/mikrotik_scan/README.md-25-25 (1)

25-25: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the spelling error in the device-name documentation.

Change devies to devices.

Proposed fix
-- **Comment**: The `comment` field in the MikroTik router's DHCP lease configuration. This is useful for naming static leases of known devies.
+- **Comment**: The `comment` field in the MikroTik router's DHCP lease configuration. This is useful for naming static leases of known devices.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/mikrotik_scan/README.md` at line 25, Correct the spelling in
the DHCP lease documentation comment near the `comment` field, changing “devies”
to “devices” without altering the surrounding text.

Source: Linters/SAST tools

server/plugins/ipneigh/README.md-12-17 (1)

12-17: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove the misleading plugin-settings interface guidance.

ipneigh.py reads SCAN_SUBNETS, not a plugin-specific interface field, and config.json has no IP Neigh interface setting. Update the line that tells users to add interfaces in plugin settings so users configure only SCAN_SUBNETS, e.g. 192.168.1.0/24 --interface=eth1.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/ipneigh/README.md` around lines 12 - 17, Update the setup
guidance in the README to remove the instruction to add interfaces in plugin
settings, and direct users to configure interfaces only through the existing
SCAN_SUBNETS setting using the documented format. Keep the Usage navigation and
example consistent with the ipneigh.py configuration behavior.
docs/COMMON_ISSUES.md-120-120 (1)

120-120: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use a repository-relative or full repository URL.

Line 120 starts with /server/.... This is a site-root URL, not a NetAlertX repository path. It can fail on GitHub or the hosted documentation site. Use a verified relative link or the full GitHub URL.

Proposed fix
-See how to prevent IP flipping in the [ARPSCAN plugin guide](/server/plugins/arp_scan/README.md).
+See how to prevent IP flipping in the [ARPSCAN plugin guide](https://github.com/netalertx/NetAlertX/tree/main/server/plugins/arp_scan/README.md).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/COMMON_ISSUES.md` at line 120, Update the ARPSCAN plugin guide link in
COMMON_ISSUES.md to use a verified repository-relative path or the full
NetAlertX GitHub URL instead of the site-root `/server/...` path, while
preserving the existing link text.
server/plugins/pihole_scan/README.md-18-20 (1)

18-20: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a language identifier to the fenced error block.

Use text or console after the opening fence. This fixes markdownlint MD040.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/pihole_scan/README.md` around lines 18 - 20, Update the fenced
error block in the README to include a text or console language identifier after
the opening fence, preserving the existing error message content.

Source: Linters/SAST tools

docs/NOTIFICATIONS.md-49-49 (1)

49-49: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the missing space in dependenton.

Change dependenton to dependent on. LanguageTool reports this typo in the notification settings guidance.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/NOTIFICATIONS.md` at line 49, Correct the typo in the notification
settings guidance by changing “dependenton” to “dependent on” in the
NTFPRCS_INCLUDED_SECTIONS description.

Source: Linters/SAST tools

server/plugins/notification_processing/README.md-11-13 (1)

11-13: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Document prerequisites per notification type.

“Devices must have alerts enabled” is too broad. new_devices is not controlled by Alert Events, while down_devices and down_reconnected use Alert Down. Replace this statement with the per-type rules documented in docs/NOTIFICATIONS.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/notification_processing/README.md` around lines 11 - 13,
Update the prerequisites section in the notification processor README to replace
the broad alerts-enabled statement with per-notification-type rules, matching
the definitions in docs/NOTIFICATIONS.md: identify that new_devices is not
controlled by Alert Events, while down_devices and down_reconnected use Alert
Down.
server/plugins/snmp_discovery/README.md-20-22 (1)

20-22: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use valid MAC addresses in the supported-output examples.

6C:6C:6C:6C:6C:b6C1 has a four-hex-digit final component. Replace it with a valid six-octet MAC address in both examples.

Also applies to: 57-58

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/snmp_discovery/README.md` around lines 20 - 22, Update the
SNMP output examples containing 6C:6C:6C:6C:6C:b6C1 to use a valid six-octet MAC
address, applying the correction consistently to both referenced examples while
leaving the other output formats unchanged.
server/plugins/snmp_discovery/README.md-54-54 (1)

54-54: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep SNMP OID examples synchronized with the working command.

  • server/plugins/snmp_discovery/README.md#L54-L54: remove the extra .1.1 from the OID.
  • server/plugins/snmp_discovery/config.json#L490-L490: remove the space in .1.3.6.1. 2.1....

Both examples must match the working default command in server/plugins/snmp_discovery/config.json Line [469].

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/snmp_discovery/README.md` at line 54, The SNMP OID examples
must match the working default command: in
server/plugins/snmp_discovery/README.md lines 54-54, remove the extra “.1.1”; in
server/plugins/snmp_discovery/config.json lines 490-490, remove the space after
“.1.3.6.1.”. Ensure both examples exactly match the default command at
config.json lines 469.
docs/PLUGINS_DEV.md-103-103 (1)

103-103: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add language identifiers to all changed fenced blocks.

  • docs/PLUGINS_DEV.md#L103-L103: label the directory-tree fence with text.
  • server/plugins/snmp_discovery/README.md#L19-L19: label the output fence.
  • server/plugins/snmp_discovery/README.md#L29-L29: label the Cisco configuration fence.
  • server/plugins/snmp_discovery/README.md#L41-L41: label the show snmp fence.
  • server/plugins/snmp_discovery/README.md#L47-L47: label the snmpwalk fence.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/PLUGINS_DEV.md` at line 103, Label every changed fenced code block with
the appropriate language identifier: use text for the directory-tree fence in
docs/PLUGINS_DEV.md (103-103), and label the output fence (19-19), Cisco
configuration fence (29-29), show snmp fence (41-41), and snmpwalk fence (47-47)
in server/plugins/snmp_discovery/README.md.

Source: Linters/SAST tools

server/plugins/omada_sdn_imp/README.md-6-6 (1)

6-6: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the new README text.

Fix the user-facing errors, including SND to SDN, controler to controller, tplink to TP-Link, OAMDA to OMADA, NetAlerX to NetAlertX, populat to populate, realted to related, embded to embedded, and opnsesne to OPNsense. Also use self-registration and add the missing space in (4) and.

Also applies to: 11-11, 18-21, 40-41, 46-46, 56-62

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/omada_sdn_imp/README.md` at line 6, Correct the user-facing
README text throughout the documented sections: replace the listed spelling and
capitalization errors with SDN, controller, TP-Link, OMADA, NetAlertX, populate,
related, embedded, and OPNsense; use “self-registration” and insert the missing
space in “(4) and”.

Source: Linters/SAST tools

server/plugins/workflows/README.md-1-7 (1)

1-7: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Replace the placeholder documentation.

TBC leaves the README incomplete. Add a concise overview of the workflows plugin, explain the AppEvents_hist setting, and document the user flow before merge.

Based on learnings: do not use placeholders; provide complete, functional implementation blocks.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/workflows/README.md` around lines 1 - 7, Replace the TBC
placeholder in the workflows plugin README overview with concise, complete
documentation describing the plugin, explaining the AppEvents_hist setting, and
outlining the user flow before merge; retain the existing Settings-page usage
reference.

Source: Learnings

server/plugins/omada_sdn_imp/README.md-8-8 (1)

8-8: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the Markdown heading hierarchy.

#### Features skips the ### level after ## Overview. Change it to ### Features.

Proposed fix
-#### Features
+### Features
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/omada_sdn_imp/README.md` at line 8, Update the Features
heading in the README from level four to level three so it follows the ##
Overview hierarchy, changing #### Features to ### Features.

Source: Linters/SAST tools

server/plugins/workflows/config.json-32-44 (1)

32-44: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reject invalid AppEvents_hist values.

This setting has input type number with no schema bounds, so negative history count input is accepted. Add a non-negative schema bound, or reject/clamp invalid values before the value reaches workflow retention or query logic. Define the maximum retention limit if one is required.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/workflows/config.json` around lines 32 - 44, The
AppEvents_hist configuration accepts negative values because its number schema
has no bounds. Update the AppEvents_hist type definition to enforce a
non-negative minimum, and define an appropriate maximum retention bound if
required by workflow retention or query logic; otherwise validate or clamp the
value before downstream use.
server/plugins/__test/test.py-11-11 (1)

11-11: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Ensure __test is explicitly excluded from plugin discovery.

server/plugins/__test has no ignore_plugin marker and no config.json, while discovery reads directories unless they contain ignore_plugin or lack config.json. Add server/plugins/__test/ignore_plugin if this directory is test-only and should not be treated as a plugin.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/__test/test.py` at line 11, Add an empty ignore_plugin marker
under server/plugins/__test so plugin discovery explicitly skips this test-only
directory; do not alter the sys.path setup.

Source: Coding guidelines

server/plugins/adguard_import/README.md-3-27 (1)

3-27: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Replace the template content before merge.

The README contains unreplaced placeholders and does not document the actual AdGuard import workflow. Replace PREF_RUN with the real manifest setting key, document the required settings, and fill in the author and release metadata.

Based on learnings: do not use placeholders; provide complete, functional implementation blocks.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/adguard_import/README.md` around lines 3 - 27, Replace the
template content in the plugin README with complete AdGuard import
documentation: describe the actual workflow and use cases, replace PREF_RUN with
the manifest’s real setting key, list the required settings and setup steps, and
provide the actual author and release metadata. Remove all placeholder text,
including generic tips, empty bullets, placeholder author handles, and release
dates.

Source: Learnings

server/plugins/pihole_api_scan/README.md-68-68 (1)

68-68: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add language identifiers to the fenced examples.

markdownlint-cli2 reports MD040 on Lines 68, 82, 94, 109, and 120. Add a language identifier such as text to each opening fence.

Suggested Markdown fix
-```
+```text

Also applies to: 82-82, 94-94, 109-109, 120-120

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/pihole_api_scan/README.md` at line 68, Update the fenced code
examples in the README at the affected sections to include a language identifier
such as text on every opening fence, including the examples around lines 68, 82,
94, 109, and 120.

Source: Linters/SAST tools

server/plugins/pihole_api_scan/README.md-115-115 (1)

115-115: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the spelling in the missing-device guidance.

Change skipps to skips on Line 115. LanguageTool flags the current spelling.

Suggested text fix
- * The app skipps devices with invalid MACs
+ * The app skips devices with invalid MACs
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/pihole_api_scan/README.md` at line 115, In the missing-device
guidance, update the misspelled word “skipps” to “skips” while leaving the
surrounding text unchanged.

Source: Linters/SAST tools

server/plugins/notification_processing/config.json-21-26 (1)

21-26: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the grammar in the user-facing description.

Line 24 reads "A plugin to for advanced notification processing." Remove the extra word.

✏️ Proposed fix
-      "string": "A plugin to for advanced notification processing."
+      "string": "A plugin for advanced notification processing."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/notification_processing/config.json` around lines 21 - 26,
Update the English user-facing description in the description configuration to
remove the extra “to,” so it reads “A plugin for advanced notification
processing.”
server/plugins/pihole_scan/config.json-316-325 (1)

316-325: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the Spanish WATCH description.

The en_us text maps watchedValue1 to IP, watchedValue2 to Last Query, watchedValue3 to Name. The es_es text maps watchedValue2 to "Proveedor" and watchedValue3 to "Interfaz", and contains the duplicated words "is es". Spanish users get wrong field meanings.

✏️ Proposed fix
-          "string": "Envíe una notificación si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>watchedValue1</code> es IP</li><li><code>watchedValue2</code> es Proveedor</li><li><code>watchedValue3</code> is es Interfaz</li><li><code>watchedValue4</code> es N/A</li></ul>"
+          "string": "Envíe una notificación si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>watchedValue1</code> es IP</li><li><code>watchedValue2</code> es Última consulta</li><li><code>watchedValue3</code> es Nombre</li><li><code>watchedValue4</code> es N/A</li></ul>"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/pihole_scan/config.json` around lines 316 - 325, Correct the
Spanish WATCH description string so watchedValue2 maps to Last Query and
watchedValue3 maps to Name, matching the en_us description, and remove the
duplicated “is es” wording while preserving the existing IP and N/A mappings.
server/plugins/wake_on_lan/README.md-34-36 (1)

34-36: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Replace the navigation placeholder.

Line 36 tells users to open Settings > Plugin name. This is not a usable navigation target. Replace it with the Wake-on-LAN plugin label used in Settings.

Based on learnings: Do not use placeholders; provide complete, functional implementation blocks.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/wake_on_lan/README.md` around lines 34 - 36, Update the Usage
navigation instruction in the README to replace the “Plugin name” placeholder
with the actual Wake-on-LAN plugin label shown in Settings, while preserving the
existing Settings navigation path and formatting.

Source: Learnings

server/plugins/ui_settings/config.json-250-276 (1)

250-276: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the UI text.

Line 274 contains teh. Line 461 contains selectivelly. Correct both strings before release.

Proposed fix
-            "string": "Default number of items shown in tables per page, for example in teh Devices lists."
+            "string": "Default number of items shown in tables per page, for example in the Devices list."
...
-            "string": "Columns and their order that are shown on the Devices page. Drag and drop to order the columns, click <code>x</code> to remove columns. You can also click into the field to selectivelly add fields. The <code>Name</code> and <code>Status</code> fields are required."
+            "string": "Columns and their order that are shown on the Devices page. Drag and drop to order the columns, click <code>x</code> to remove columns. You can also click into the field to selectively add fields. The <code>Name</code> and <code>Status</code> fields are required."

Also applies to: 451-463

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/ui_settings/config.json` around lines 250 - 276, Correct the
typos in the UI text entries: update the DEFAULT_PAGE_SIZE description from
“teh” to “the” and fix “selectivelly” in the UI setting around the localized
strings near the referenced second entry. Preserve the existing wording and
configuration structure.
🧹 Nitpick comments (3)
server/plugins/snmp_discovery/README.md (1)

11-12: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Do not use public as a copy-paste community string.

The examples use the well-known SNMPv2c community public. Replace it with a placeholder and state that SNMPv2c does not encrypt the community string. Keep the read-only ACL requirement explicit.

Also applies to: 71-71

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/snmp_discovery/README.md` around lines 11 - 12, Update the
SNMP walk examples in the README to use a clearly marked placeholder instead of
the public community string, add that SNMPv2c does not encrypt community
strings, and retain the explicit requirement that the configured community have
read-only ACL permissions.
server/plugins/_publisher_apprise/README.md (1)

26-28: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add language identifiers to the fenced blocks.

markdownlint-cli2 reports MD040 for Lines [26], [31], and [36]. Mark the URL example as text. Mark the curl and apprise examples as bash.

Proposed fence labels
-```
+```text
https://api.telegram.org/bot<bottoken>/sendMessage?chat_id=<chatid>&text=%40%40TEXT%40%40
-```
+```
...
-```
+```bash
curl -X POST -d '{"urls":"tgram://<bottoken>/<chatid>","body":"test body from curl","title":"test title from curl"}' -H "Content-Type: application/json" "http://192.168.1.2:9999/notify/"
-```
+```
...
-```
+```bash
apprise -vv -t "Test Message from apprise console" -b "Test Message from apprise console" \
   tgram://<bottoken>/<chatid>/
-```
+```

Also applies to: 31-33, 36-39

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/_publisher_apprise/README.md` around lines 26 - 28, Update the
fenced code blocks in the README: label the Telegram URL example as text, and
label the curl and apprise command examples as bash. Preserve the example
contents unchanged.

Source: Linters/SAST tools

server/README.md (1)

10-10: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the spaces inside the code span.

markdownlint-cli2 reports MD038 for Line [10]. Write the path as ../server/plugins without leading or trailing spaces inside the code span.

Proposed Markdown fix
-|```../server/plugins ```| a folder containing all [plugins](/server/plugins/) that publish notifications or scan for devices|
+|```../server/plugins```| a folder containing all [plugins](/server/plugins/) that publish notifications or scan for devices|
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/README.md` at line 10, Remove the trailing space inside the code span
in the Markdown table entry, changing the displayed path to ../server/plugins
while preserving the surrounding table content.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.gemini/skills/testing-workflow/SKILL.md:
- Line 94: Update the path documentation in the testing workflow skill to remove
the container-specific `/app/server/plugins` reference and use
repository-relative commands instead. Also review nearby references to
`/workspaces/NetAlertX` and `devcontainer-management`, replacing them with
Gemini CLI-compatible alternatives or clearly marking them as devcontainer-only.

In @.github/skills/plugin-run-development/SKILL.md:
- Around line 11-13: Update the plugin run-development instructions to derive
the executable entry point and command from each plugin’s config.json manifest
rather than assuming script.py; retain script.py only as a template-specific
example. Ensure the referenced plugin examples, including apprise.py,
freebox.py, and sync.py, are handled through their manifest-defined entry points
and preserve the requirement that server/plugins/**/*.py plugins use config.json
manifests.

In @.vscode/settings.json:
- Around line 35-39: Update the chat.tools.terminal.autoApprove configuration in
.vscode/settings.json to remove the cp entry or set it to false, so file-copy
operations require manual approval while preserving the other approved commands.

In `@docs/DOCKER_INSTALLATION.md`:
- Line 32: Remove the --cap-add=NET_BIND_SERVICE option from the Docker
installation example, since the documented PORT and GRAPHQL_PORT values exceed
1024. Only retain or explain this capability if the example explicitly supports
privileged ports.

In `@docs/PLUGINS_DEV_QUICK_START.md`:
- Line 17: Update the sample import paths in the quick-start instructions to
match the plugin’s relocated location under server/plugins, avoiding
server/server and server/plugins/plugins resolution. Adjust the import examples
near the affected setup commands so the direct test command can run
successfully.

In `@server/plugins/kea_api/script.py`:
- Around line 6-7: Correct the sys.path entries in the script startup so they
resolve to the actual server and plugins directories rather than appending
duplicate directory names. Update the path construction around the existing
sys.path.insert calls, preserving direct-script execution and enabling imports
of plugin_helper, helper, and const.
- Around line 59-66: Update the result-file handling around
plugin_objects.write_result_file() so successful Kea responses with result 3
also write an empty result, replacing any stale previous output. Ensure the file
is written once after processing either successful result, while preserving the
existing error handling for result 1.

In `@server/plugins/set_password/README.md`:
- Around line 11-12: Update the set_password README guidance around
SETPWD_enable_password to warn that 123456 is a public default credential and
instruct users to replace it with a unique password before enabling login;
retain the existing disable-login configuration guidance.
- Line 13: Replace the raw SHA-256 password-storage behavior documented for
SETPWD_password with a salted password KDF such as Argon2, bcrypt, or scrypt,
and update the README description to accurately reflect the implemented
stored-password scheme.

In `@server/plugins/unifi_api_import/README.md`:
- Around line 12-15: Update the UNIFIAPI_verify_ssl documentation in the README
to stop advising users to disable certificate verification. Instruct users to
keep verification enabled and install a certificate trusted by the NetAlertX
host or configure the required private CA.

---

Minor comments:
In @.gemini/skills/plugin-development/plugin-skill.md:
- Line 22: Update the manual-run guidance in the plugin skill documentation to
avoid hardcoded container-only paths: derive plugin and server paths from
__file__ in the example, or explicitly restrict the /app/server paths to
container execution. Ensure the documented repository-root command can import
shared modules such as plugin_helper.

In `@docs/COMMON_ISSUES.md`:
- Line 120: Update the ARPSCAN plugin guide link in COMMON_ISSUES.md to use a
verified repository-relative path or the full NetAlertX GitHub URL instead of
the site-root `/server/...` path, while preserving the existing link text.

In `@docs/NOTIFICATIONS.md`:
- Line 49: Correct the typo in the notification settings guidance by changing
“dependenton” to “dependent on” in the NTFPRCS_INCLUDED_SECTIONS description.

In `@docs/PLUGINS_DEV.md`:
- Line 103: Label every changed fenced code block with the appropriate language
identifier: use text for the directory-tree fence in docs/PLUGINS_DEV.md
(103-103), and label the output fence (19-19), Cisco configuration fence
(29-29), show snmp fence (41-41), and snmpwalk fence (47-47) in
server/plugins/snmp_discovery/README.md.

In `@server/plugins/__test/test.py`:
- Line 11: Add an empty ignore_plugin marker under server/plugins/__test so
plugin discovery explicitly skips this test-only directory; do not alter the
sys.path setup.

In `@server/plugins/_publisher_mqtt/README.md`:
- Line 3: Correct the broker name in the README description by replacing
“Mosquito” with “Mosquitto,” leaving the surrounding Home Assistant and MQTT
wording unchanged.
- Around line 166-186: The README discovery topic must use the Home Assistant
config endpoint. Update the documented topic for the binary sensor example to
append /config, matching the discovery topic format and the MQTT publisher’s
existing behavior.

In `@server/plugins/adguard_import/README.md`:
- Around line 3-27: Replace the template content in the plugin README with
complete AdGuard import documentation: describe the actual workflow and use
cases, replace PREF_RUN with the manifest’s real setting key, list the required
settings and setup steps, and provide the actual author and release metadata.
Remove all placeholder text, including generic tips, empty bullets, placeholder
author handles, and release dates.

In `@server/plugins/csv_backup/README.md`:
- Line 3: Correct the documentation proofreading issues: in
server/plugins/csv_backup/README.md lines 3-3, replace “Can be used for
importing” with a complete sentence such as “Use it to import”; in
server/plugins/db_cleanup/README.md lines 11-11, replace the typo “tehy” with
“they”.

In `@server/plugins/dhcp_leases/README.md`:
- Around line 46-48: Update the fenced examples in the README, including the
sections around the lease-file examples and the standalone TBC block, to specify
an appropriate language identifier such as text after each opening fence. Ensure
all referenced fences satisfy markdownlint MD040 without changing their
contents.
- Around line 52-58: Correct the example lease line in the “Example File Format”
section so both the MAC address and client ID use valid six-octet values,
preserving the documented field order and remaining sample data.
- Around line 42-48: Replace the TBC placeholder in the pihole format section
with a concrete five-field Pi-hole dhcp.leases example, ordered as primary ID,
secondary IP, hostname, MAC, and the remaining field, so users can map the
import fields correctly.

In `@server/plugins/freebox/README.md`:
- Line 11: Update the setup documentation wording: replace “se [remote setup]”
with “see [remote setup]”, correct “Freeboxe's” to “Freebox's”, and format the
UI navigation path as “Settings > Access Management” wherever applicable.

In `@server/plugins/icmp_scan/README.md`:
- Line 3: Correct the spelling of “suplementing plugins” to “supplementing
plugins” in the README description.

In `@server/plugins/ipneigh/README.md`:
- Line 28: Update the Release Date entry in the ipneigh README to replace the
invalid 31-Nov-2024 value with the confirmed valid release date, preserving the
existing date format.
- Around line 12-17: Update the setup guidance in the README to remove the
instruction to add interfaces in plugin settings, and direct users to configure
interfaces only through the existing SCAN_SUBNETS setting using the documented
format. Keep the Usage navigation and example consistent with the ipneigh.py
configuration behavior.

In `@server/plugins/kea_api/README.md`:
- Line 99: Update the README release date to an unambiguous ISO 8601 date in the
Release Date field, confirming whether the intended date is May 11 or November
5, 2026 before applying the change.

In `@server/plugins/mikrotik_scan/README.md`:
- Line 25: Correct the spelling in the DHCP lease documentation comment near the
`comment` field, changing “devies” to “devices” without altering the surrounding
text.

In `@server/plugins/notification_processing/config.json`:
- Around line 21-26: Update the English user-facing description in the
description configuration to remove the extra “to,” so it reads “A plugin for
advanced notification processing.”

In `@server/plugins/notification_processing/README.md`:
- Around line 11-13: Update the prerequisites section in the notification
processor README to replace the broad alerts-enabled statement with
per-notification-type rules, matching the definitions in docs/NOTIFICATIONS.md:
identify that new_devices is not controlled by Alert Events, while down_devices
and down_reconnected use Alert Down.

In `@server/plugins/omada_sdn_imp/README.md`:
- Line 6: Correct the user-facing README text throughout the documented
sections: replace the listed spelling and capitalization errors with SDN,
controller, TP-Link, OMADA, NetAlertX, populate, related, embedded, and
OPNsense; use “self-registration” and insert the missing space in “(4) and”.
- Line 8: Update the Features heading in the README from level four to level
three so it follows the ## Overview hierarchy, changing #### Features to ###
Features.

In `@server/plugins/pihole_api_scan/README.md`:
- Line 68: Update the fenced code examples in the README at the affected
sections to include a language identifier such as text on every opening fence,
including the examples around lines 68, 82, 94, 109, and 120.
- Line 115: In the missing-device guidance, update the misspelled word “skipps”
to “skips” while leaving the surrounding text unchanged.

In `@server/plugins/pihole_scan/config.json`:
- Around line 316-325: Correct the Spanish WATCH description string so
watchedValue2 maps to Last Query and watchedValue3 maps to Name, matching the
en_us description, and remove the duplicated “is es” wording while preserving
the existing IP and N/A mappings.

In `@server/plugins/pihole_scan/README.md`:
- Around line 18-20: Update the fenced error block in the README to include a
text or console language identifier after the opening fence, preserving the
existing error message content.

In `@server/plugins/snmp_discovery/README.md`:
- Around line 20-22: Update the SNMP output examples containing
6C:6C:6C:6C:6C:b6C1 to use a valid six-octet MAC address, applying the
correction consistently to both referenced examples while leaving the other
output formats unchanged.
- Line 54: The SNMP OID examples must match the working default command: in
server/plugins/snmp_discovery/README.md lines 54-54, remove the extra “.1.1”; in
server/plugins/snmp_discovery/config.json lines 490-490, remove the space after
“.1.3.6.1.”. Ensure both examples exactly match the default command at
config.json lines 469.

In `@server/plugins/ui_settings/config.json`:
- Around line 250-276: Correct the typos in the UI text entries: update the
DEFAULT_PAGE_SIZE description from “teh” to “the” and fix “selectivelly” in the
UI setting around the localized strings near the referenced second entry.
Preserve the existing wording and configuration structure.

In `@server/plugins/wake_on_lan/README.md`:
- Around line 34-36: Update the Usage navigation instruction in the README to
replace the “Plugin name” placeholder with the actual Wake-on-LAN plugin label
shown in Settings, while preserving the existing Settings navigation path and
formatting.

In `@server/plugins/workflows/config.json`:
- Around line 32-44: The AppEvents_hist configuration accepts negative values
because its number schema has no bounds. Update the AppEvents_hist type
definition to enforce a non-negative minimum, and define an appropriate maximum
retention bound if required by workflow retention or query logic; otherwise
validate or clamp the value before downstream use.

In `@server/plugins/workflows/README.md`:
- Around line 1-7: Replace the TBC placeholder in the workflows plugin README
overview with concise, complete documentation describing the plugin, explaining
the AppEvents_hist setting, and outlining the user flow before merge; retain the
existing Settings-page usage reference.

---

Nitpick comments:
In `@server/plugins/_publisher_apprise/README.md`:
- Around line 26-28: Update the fenced code blocks in the README: label the
Telegram URL example as text, and label the curl and apprise command examples as
bash. Preserve the example contents unchanged.

In `@server/plugins/snmp_discovery/README.md`:
- Around line 11-12: Update the SNMP walk examples in the README to use a
clearly marked placeholder instead of the public community string, add that
SNMPv2c does not encrypt community strings, and retain the explicit requirement
that the configured community have read-only ACL permissions.

In `@server/README.md`:
- Line 10: Remove the trailing space inside the code span in the Markdown table
entry, changing the displayed path to ../server/plugins while preserving the
surrounding table content.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: f8cd8da1-dae6-425c-a3aa-9b0c08404fd9

📥 Commits

Reviewing files that changed from the base of the PR and between 9b47fb8 and 9e38cfd.

⛔ Files ignored due to path filters (9)
  • server/plugins/_publisher_apprise/apprise_telegram.png is excluded by !**/*.png
  • server/plugins/_publisher_mqtt/Deleting_MQTT_Plugin_Objects.png is excluded by !**/*.png
  • server/plugins/_publisher_webhook/Discord_Config.png is excluded by !**/*.png
  • server/plugins/arp_scan/arp-scan-settings.png is excluded by !**/*.png
  • server/plugins/nmap_scan/nmap_ports_services.png is excluded by !**/*.png
  • server/plugins/omada_sdn_imp/omada_account_sample.png is excluded by !**/*.png
  • server/plugins/omada_sdn_openapi/omada_sdn_openapi_settings.png is excluded by !**/*.png
  • server/plugins/sync/sync_hub.png is excluded by !**/*.png
  • server/plugins/unifi_import/full_run.lock is excluded by !**/*.lock
📒 Files selected for processing (245)
  • .devcontainer/Dockerfile
  • .gemini/internal-docs/PRDs/.gitkeep
  • .gemini/skills/plugin-development/plugin-skill.md
  • .gemini/skills/project-navigation/SKILL.md
  • .gemini/skills/testing-workflow/SKILL.md
  • .github/copilot-instructions.md
  • .github/skills/database-patterns/SKILL.md
  • .github/skills/plugin-run-development/SKILL.md
  • .github/skills/project-navigation/SKILL.md
  • .github/skills/testing-workflow/SKILL.md
  • .gitignore
  • .vscode/settings.json
  • Dockerfile
  • README.md
  • docker-compose.yml
  • docs/ADVISORY_MULTI_NETWORK.md
  • docs/ADVISORY_MULTI_SITE_MONITORING.md
  • docs/API_SYNC.md
  • docs/BACKUPS.md
  • docs/COMMON_ISSUES.md
  • docs/DOCKER_INSTALLATION.md
  • docs/FILE_PERMISSIONS.md
  • docs/HOME_ASSISTANT.md
  • docs/INITIAL_SETUP.md
  • docs/MIGRATION.md
  • docs/NOTIFICATIONS.md
  • docs/PERFORMANCE.md
  • docs/PIHOLE_GUIDE.md
  • docs/PLUGINS.md
  • docs/PLUGINS_DEV.md
  • docs/PLUGINS_DEV_DATASOURCES.md
  • docs/PLUGINS_DEV_DATA_CONTRACT.md
  • docs/PLUGINS_DEV_QUICK_START.md
  • docs/PLUGINS_DEV_SETTINGS.md
  • docs/REMOTE_NETWORKS.md
  • docs/REST_IMPORT.md
  • front/js/device-columns.js
  • front/php/templates/language/ca_ca.json
  • front/php/templates/language/cs_cz.json
  • front/php/templates/language/de_de.json
  • front/php/templates/language/en_us.json
  • front/php/templates/language/es_es.json
  • front/php/templates/language/fr_fr.json
  • front/php/templates/language/it_it.json
  • front/php/templates/language/ja_jp.json
  • front/php/templates/language/pl_pl.json
  • front/php/templates/language/pt_br.json
  • front/php/templates/language/pt_pt.json
  • front/php/templates/language/ru_ru.json
  • front/php/templates/language/tr_tr.json
  • front/php/templates/language/uk_ua.json
  • front/php/templates/language/zh_cn.json
  • front/pluginsCore.php
  • front/settings.php
  • scripts/db_empty/db_empty.py
  • server/README.md
  • server/api_server/api_server_start.py
  • server/api_server/dbquery_endpoint.py
  • server/api_server/history_endpoint.py
  • server/api_server/logs_endpoint.py
  • server/api_server/sessions_endpoint.py
  • server/config_paths.py
  • server/initialise.py
  • server/models/device_instance.py
  • server/plugin.py
  • server/plugins/README.md
  • server/plugins/__template/README.md
  • server/plugins/__template/config.json
  • server/plugins/__template/ignore_plugin
  • server/plugins/__template/rename_me.py
  • server/plugins/__test/test.py
  • server/plugins/_publisher_apprise/README.md
  • server/plugins/_publisher_apprise/apprise.py
  • server/plugins/_publisher_apprise/config.json
  • server/plugins/_publisher_email/README.md
  • server/plugins/_publisher_email/config.json
  • server/plugins/_publisher_email/email_smtp.py
  • server/plugins/_publisher_mqtt/README.md
  • server/plugins/_publisher_mqtt/config.json
  • server/plugins/_publisher_mqtt/mqtt.py
  • server/plugins/_publisher_ntfy/README.md
  • server/plugins/_publisher_ntfy/config.json
  • server/plugins/_publisher_ntfy/ntfy.py
  • server/plugins/_publisher_pushover/README.md
  • server/plugins/_publisher_pushover/config.json
  • server/plugins/_publisher_pushover/pushover.py
  • server/plugins/_publisher_pushsafer/README.md
  • server/plugins/_publisher_pushsafer/config.json
  • server/plugins/_publisher_pushsafer/pushsafer.py
  • server/plugins/_publisher_telegram/README.md
  • server/plugins/_publisher_telegram/config.json
  • server/plugins/_publisher_telegram/tg.py
  • server/plugins/_publisher_webhook/README.md
  • server/plugins/_publisher_webhook/config.json
  • server/plugins/_publisher_webhook/webhook.py
  • server/plugins/adguard_export/README.md
  • server/plugins/adguard_export/config.json
  • server/plugins/adguard_export/script.py
  • server/plugins/adguard_import/README.md
  • server/plugins/adguard_import/adguard_import.py
  • server/plugins/adguard_import/config.json
  • server/plugins/arp_scan/README.md
  • server/plugins/arp_scan/config.json
  • server/plugins/arp_scan/script.py
  • server/plugins/asuswrt_import/README.md
  • server/plugins/asuswrt_import/config.json
  • server/plugins/asuswrt_import/script.py
  • server/plugins/avahi_scan/README.md
  • server/plugins/avahi_scan/avahi_scan.py
  • server/plugins/avahi_scan/config.json
  • server/plugins/csv_backup/README.md
  • server/plugins/csv_backup/config.json
  • server/plugins/csv_backup/script.py
  • server/plugins/custom_props/README.md
  • server/plugins/custom_props/config.json
  • server/plugins/db_cleanup/README.md
  • server/plugins/db_cleanup/config.json
  • server/plugins/db_cleanup/script.py
  • server/plugins/ddns_update/README.md
  • server/plugins/ddns_update/README_DE.md
  • server/plugins/ddns_update/config.json
  • server/plugins/ddns_update/script.py
  • server/plugins/dhcp_leases/ASUS_ROUTERS.md
  • server/plugins/dhcp_leases/README.md
  • server/plugins/dhcp_leases/config.json
  • server/plugins/dhcp_leases/script.py
  • server/plugins/dhcp_servers/README.md
  • server/plugins/dhcp_servers/config.json
  • server/plugins/dhcp_servers/script.py
  • server/plugins/dig_scan/README.md
  • server/plugins/dig_scan/config.json
  • server/plugins/dig_scan/digscan.py
  • server/plugins/freebox/README.md
  • server/plugins/freebox/config.json
  • server/plugins/freebox/freebox.py
  • server/plugins/fritzbox/README.md
  • server/plugins/fritzbox/config.json
  • server/plugins/fritzbox/fritzbox.py
  • server/plugins/icmp_scan/README.md
  • server/plugins/icmp_scan/config.json
  • server/plugins/icmp_scan/icmp.py
  • server/plugins/internet_ip/README.md
  • server/plugins/internet_ip/config.json
  • server/plugins/internet_ip/script.py
  • server/plugins/internet_speedtest/README.md
  • server/plugins/internet_speedtest/config.json
  • server/plugins/internet_speedtest/script.py
  • server/plugins/ipneigh/README.md
  • server/plugins/ipneigh/config.json
  • server/plugins/ipneigh/ipneigh.py
  • server/plugins/kea_api/README.md
  • server/plugins/kea_api/config.json
  • server/plugins/kea_api/script.py
  • server/plugins/luci_import/README.md
  • server/plugins/luci_import/config.json
  • server/plugins/luci_import/script.py
  • server/plugins/maintenance/README.md
  • server/plugins/maintenance/config.json
  • server/plugins/maintenance/maintenance.py
  • server/plugins/mikrotik_scan/README.md
  • server/plugins/mikrotik_scan/config.json
  • server/plugins/mikrotik_scan/mikrotik.py
  • server/plugins/nbtscan_scan/README.md
  • server/plugins/nbtscan_scan/config.json
  • server/plugins/nbtscan_scan/nbtscan.py
  • server/plugins/newdev_template/README.md
  • server/plugins/newdev_template/config.json
  • server/plugins/nmap_dev_scan/README.md
  • server/plugins/nmap_dev_scan/config.json
  • server/plugins/nmap_dev_scan/nmap_dev.py
  • server/plugins/nmap_scan/README.md
  • server/plugins/nmap_scan/config.json
  • server/plugins/nmap_scan/script.py
  • server/plugins/notification_processing/README.md
  • server/plugins/notification_processing/config.json
  • server/plugins/nslookup_scan/README.md
  • server/plugins/nslookup_scan/config.json
  • server/plugins/nslookup_scan/nslookup.py
  • server/plugins/omada_sdn_imp/README.md
  • server/plugins/omada_sdn_imp/config.json
  • server/plugins/omada_sdn_imp/omada_sdn.py
  • server/plugins/omada_sdn_openapi/README.md
  • server/plugins/omada_sdn_openapi/config.json
  • server/plugins/omada_sdn_openapi/script.py
  • server/plugins/pihole_api_scan/README.md
  • server/plugins/pihole_api_scan/config.json
  • server/plugins/pihole_api_scan/pihole_api_scan.py
  • server/plugins/pihole_scan/README.md
  • server/plugins/pihole_scan/config.json
  • server/plugins/plugin_helper.py
  • server/plugins/rest_import/README.md
  • server/plugins/rest_import/config.json
  • server/plugins/rest_import/rest_import.py
  • server/plugins/set_password/README.md
  • server/plugins/set_password/config.json
  • server/plugins/snmp_discovery/README.md
  • server/plugins/snmp_discovery/config.json
  • server/plugins/snmp_discovery/script.py
  • server/plugins/sync/README.md
  • server/plugins/sync/config.json
  • server/plugins/sync/sync.py
  • server/plugins/ui_settings/README.md
  • server/plugins/ui_settings/config.json
  • server/plugins/unifi_api_import/README.md
  • server/plugins/unifi_api_import/config.json
  • server/plugins/unifi_api_import/unifi_api_import.py
  • server/plugins/unifi_import/README.md
  • server/plugins/unifi_import/config.json
  • server/plugins/unifi_import/script.py
  • server/plugins/vendor_update/README.md
  • server/plugins/vendor_update/config.json
  • server/plugins/vendor_update/script.py
  • server/plugins/wake_on_lan/README.md
  • server/plugins/wake_on_lan/config.json
  • server/plugins/wake_on_lan/wake_on_lan.py
  • server/plugins/website_monitor/README.md
  • server/plugins/website_monitor/config.json
  • server/plugins/website_monitor/script.py
  • server/plugins/workflows/README.md
  • server/plugins/workflows/config.json
  • server/workflows/actions.py
  • test/api_endpoints/test_auth_endpoints.py
  • test/api_endpoints/test_dbquery_endpoints.py
  • test/api_endpoints/test_device_endpoints.py
  • test/api_endpoints/test_events_endpoints.py
  • test/api_endpoints/test_graphq_endpoints.py
  • test/api_endpoints/test_health_endpoints.py
  • test/api_endpoints/test_history_endpoints.py
  • test/api_endpoints/test_languages_endpoint.py
  • test/api_endpoints/test_logs_endpoints.py
  • test/api_endpoints/test_mcp_disabled_tools.py
  • test/api_endpoints/test_mcp_openapi_spec.py
  • test/api_endpoints/test_plugin_stats_endpoints.py
  • test/api_endpoints/test_sessions_endpoints.py
  • test/api_endpoints/test_settings_endpoints.py
  • test/api_endpoints/test_sync_endpoint.py
  • test/db/test_camelcase_migration.py
  • test/db/test_db_cleanup.py
  • test/db/test_timestamp_migration.py
  • test/plugins/test_adguard_export.py
  • test/scan/test_device_field_lock.py
  • test/server/test_datetime_utils.py
  • test/server/test_graphql_endpoints.py
  • test/server/test_plugin_history_filtering.py
  • test/test_plugin_helper.py

- `/app` — primary location where Python runs in production
- `/app/server` — symlink to `/workspaces/NetAlertX/server`
- `/app/front/plugins` — symlink to `/workspaces/NetAlertX/front/plugins`
- `/app/server/plugins` — symlink to `/workspaces/NetAlertX/server/plugins`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Keep the Gemini skill independent of container-only paths.

Line 94 documents /app/server/plugins, while this skill also uses /workspaces/NetAlertX and devcontainer-management. These paths and tools are not guaranteed in the Gemini CLI environment. Use repository-relative commands, or clearly mark this section as devcontainer-only.

Based on learnings, skill files under .gemini/skills must use tools available to Gemini CLI and avoid devcontainer-only path and tool references.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gemini/skills/testing-workflow/SKILL.md at line 94, Update the path
documentation in the testing workflow skill to remove the container-specific
`/app/server/plugins` reference and use repository-relative commands instead.
Also review nearby references to `/workspaces/NetAlertX` and
`devcontainer-management`, replacing them with Gemini CLI-compatible
alternatives or clearly marking them as devcontainer-only.

Source: Learnings

Comment on lines +11 to +13
2. Find the plugin in `server/plugins/<code_name>/`.
3. Read the plugin's `config.json` and `script.py` to understand its functionality and settings.
4. Formulate and run the command: `python3 front/plugins/<code_name>/script.py`.
4. Formulate and run the command: `python3 server/plugins/<code_name>/script.py`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Derive the entry point from config.json.

script.py is not the entry point for every plugin. The supplied plugin set includes server/plugins/_publisher_apprise/apprise.py, server/plugins/freebox/freebox.py, and server/plugins/sync/sync.py. Following these instructions for those plugins causes a file-not-found error.

Document execution through the command defined by the plugin manifest. Keep script.py only as a template-specific example.

As per coding guidelines, plugins under server/plugins/**/*.py must use config.json manifests.

Also applies to: 18-20, 27-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/skills/plugin-run-development/SKILL.md around lines 11 - 13, Update
the plugin run-development instructions to derive the executable entry point and
command from each plugin’s config.json manifest rather than assuming script.py;
retain script.py only as a template-specific example. Ensure the referenced
plugin examples, including apprise.py, freebox.py, and sync.py, are handled
through their manifest-defined entry points and preserve the requirement that
server/plugins/**/*.py plugins use config.json manifests.

Source: Coding guidelines

Comment thread .vscode/settings.json Outdated
--network=host \
--cap-add=NET_RAW \
--cap-add=NET_ADMIN \
--cap-add=NET_BIND_SERVICE \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not grant NET_BIND_SERVICE for the documented ports.

Line 32 permits binding ports below 1024. The documented PORT and GRAPHQL_PORT values are above 1024, so this capability is unnecessary for the example. Remove it, or document the condition that requires a privileged port.

Proposed fix
-  --cap-add=NET_BIND_SERVICE \
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
--cap-add=NET_BIND_SERVICE \
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/DOCKER_INSTALLATION.md` at line 32, Remove the
--cap-add=NET_BIND_SERVICE option from the Docker installation example, since
the documented PORT and GRAPHQL_PORT values exceed 1024. Only retain or explain
this capability if the example explicitly supports privileged ports.

Comment thread docs/PLUGINS_DEV_QUICK_START.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

🛑 Comments failed to post (5)
server/plugins/kea_api/script.py (2)

6-7: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Fix the module search paths.

Lines 6-7 resolve to /app/server/server and /app/server/plugins/plugins. The configured command runs this script directly, so plugin_helper, helper, and const cannot be imported.

Proposed fix
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../server'))
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../plugins'))
+PLUGIN_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+SERVER_DIR = os.path.dirname(PLUGIN_DIR)
+sys.path.extend([PLUGIN_DIR, SERVER_DIR])
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

PLUGIN_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
SERVER_DIR = os.path.dirname(PLUGIN_DIR)
sys.path.extend([PLUGIN_DIR, SERVER_DIR])
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/kea_api/script.py` around lines 6 - 7, Correct the sys.path
entries in the script startup so they resolve to the actual server and plugins
directories rather than appending duplicate directory names. Update the path
construction around the existing sys.path.insert calls, preserving direct-script
execution and enabling imports of plugin_helper, helper, and const.

59-66: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Write an empty result for a successful empty Kea response.

If Kea returns result 3, this run has no leases. The previous non-empty result file remains unchanged. The next plugin import can then process stale leases. Write the result file once after processing any successful result, including result 3.

Proposed fix
         count = 0
+        received_successful_result = False
         for entry in data:
             text = entry.get('text', '[API provided no text]')
             # Result: 0 (success), 1 (error), or 3 (empty).
             if entry['result'] == 0:
+                received_successful_result = True
                 leases = entry['arguments']['leases']
                 for lease in leases:
                     ...
-                plugin_objects.write_result_file()
-
                 mylog('verbose', [f'[{pluginName}] Kea API response: {text}'])
                 mylog('verbose', [f'[{pluginName}] Successfully imported {count} devices reported by Kea API'])
             elif entry['result'] == 1:
                 mylog('none', [f'[{pluginName}] ⚠ ERROR: Kea API indicated error: {text}'])
             elif entry['result'] == 3:
+                received_successful_result = True
                 mylog('verbose', [f'[{pluginName}] Kea API indicates no entries found: {text}'])
+
+        if received_successful_result:
+            plugin_objects.write_result_file()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

        count = 0
        received_successful_result = False
        for entry in data:
            text = entry.get('text', '[API provided no text]')
            # Result: 0 (success), 1 (error), or 3 (empty).
            if entry['result'] == 0:
                received_successful_result = True
                leases = entry['arguments']['leases']
                for lease in leases:
                    ...
                mylog('verbose', [f'[{pluginName}] Kea API response: {text}'])
                mylog('verbose', [f'[{pluginName}] Successfully imported {count} devices reported by Kea API'])
            elif entry['result'] == 1:
                mylog('none', [f'[{pluginName}] ⚠ ERROR: Kea API indicated error: {text}'])
            elif entry['result'] == 3:
                received_successful_result = True
                mylog('verbose', [f'[{pluginName}] Kea API indicates no entries found: {text}'])

        if received_successful_result:
            plugin_objects.write_result_file()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/kea_api/script.py` around lines 59 - 66, Update the
result-file handling around plugin_objects.write_result_file() so successful Kea
responses with result 3 also write an empty result, replacing any stale previous
output. Ensure the file is written once after processing either successful
result, while preserving the existing error handling for result 1.
server/plugins/set_password/README.md (2)

11-12: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Warn users before enabling the default credential.

The documented password 123456 is a known credential. If users enable SETPWD_enable_password without changing it, the login uses a public default. Require a unique password before enabling login.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/set_password/README.md` around lines 11 - 12, Update the
set_password README guidance around SETPWD_enable_password to warn that 123456
is a public default credential and instruct users to replace it with a unique
password before enabling login; retain the existing disable-login configuration
guidance.

13-13: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -C 6 'SETPWD_enable_password|sha256|SHA256|hashlib' \
  server/plugins front test \
  --glob '*.py' --glob '*.php' --glob '*.js' --glob 'config.json' || true

Repository: netalertx/NetAlertX

Length of output: 50375


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'README around line 13:\n'
sed -n '1,35p' server/plugins/set_password/README.md

printf '\nLogin implementation around comparison:\n'
sed -n '100,135p' front/index.php

printf '\nTransform usage around sha256:\n'
sed -n '1,50p' front/js/settings_utils.js
sed -n '680,715p' front/js/settings_utils.js
sed -n '860,882p' front/js/settings_utils.js

printf '\nRelevant config declarations:\n'
sed -n '60,92p' server/plugins/set_password/config.json
sed -n '29,115p' test/ui/test_ui_login.py

printf '\nRead-only deterministic SHA256 equality probe for default password:\n'
python3 - <<'PY'
import hashlib
plaintext = "123456"
direct = hashlib.sha256(plaintext.encode("utf-8")).hexdigest()
hmac_based = hashlib.sha256((direct + plaintext).encode("utf-8")).hexdigest()
frontend_like = direct  # CryptoJS.SHA256(val).toString(CryptoJS.enc.Hex)
print({"plaintext": plaintext, "sha256(direct)": direct, "sha256(direct+plaintext)": hmac_based, "frontend_like": frontend_like, "store_equals_direct": direct == h2sha256:=direct, "input_direct_matches_store": direct == direct})
PY

Repository: netalertx/NetAlertX

Length of output: 9319


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Read-only deterministic SHA256 equality probe for default password:\n'
python3 - <<'PY'
import hashlib
plaintext = "123456"
direct = hashlib.sha256(plaintext.encode("utf-8")).hexdigest()
hmac_based = hashlib.sha256((direct + plaintext).encode("utf-8")).hexdigest()
frontend_like = direct
comparison = direct == frontend_like
print({
    "plaintext": plaintext,
    "sha256(direct)": direct,
    "sha256(direct+plaintext)": hmac_based,
    "frontend_like": frontend_like,
    "store_equals_direct": comparison,
    "input_direct_matches_store": direct == direct
})
PY

Repository: netalertx/NetAlertX

Length of output: 581


Use a password KDF for login password storage.

SETPWD_password is hashed with the same raw SHA-256 used by the login form (sha256 transformer -> hash('sha256', $password)), so the default 123456 is stored as an unsalted digest. Store passwords with a salted KDF such as Argon2, bcrypt, or scrypt, and update the README to match the stored scheme.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/set_password/README.md` at line 13, Replace the raw SHA-256
password-storage behavior documented for SETPWD_password with a salted password
KDF such as Argon2, bcrypt, or scrypt, and update the README description to
accurately reflect the implemented stored-password scheme.
server/plugins/unifi_api_import/README.md (1)

12-15: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not advise users to disable certificate verification.

Line 15 directs users to disable verification when the controller has no certificate. This can let an on-path attacker impersonate the controller and intercept UNIFIAPI_api_key traffic. Keep verification enabled. Instruct users to install a certificate trusted by the NetAlertX host or configure the required private CA.

Proposed fix
- `UNIFIAPI_verify_ssl` : To skip SSL with you don't have an SSL certificate
+ `UNIFIAPI_verify_ssl`: Keep certificate verification enabled. Install a certificate trusted by the NetAlertX host, or configure the required private CA.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

- `UNIFIAPI_api_key` : You can generate your API key under the _Your API Keys_ section.
- `UNIFIAPI_base_url` : You can find your base url in the _API Request Format_ section, e.g. `https://192.168.100.1/proxy/network/integration/`
- `UNIFIAPI_api_version` : You can find your version as part of the url in the _API Request Format_ section, e.g. `v1`
- `UNIFIAPI_verify_ssl`: Keep certificate verification enabled. Install a certificate trusted by the NetAlertX host, or configure the required private CA.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/plugins/unifi_api_import/README.md` around lines 12 - 15, Update the
UNIFIAPI_verify_ssl documentation in the README to stop advising users to
disable certificate verification. Instruct users to keep verification enabled
and install a certificate trusted by the NetAlertX host or configure the
required private CA.

@jokob-sk

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@jokob-sk
jokob-sk merged commit ae25adf into main Aug 10, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant