LibreQoS is a Quality-of-Experience traffic management and analysis system. It's open source (GPL2). It is supported by a paid Insight package (aka LTS2) and a paid API (lqos_api).
src/ Main source tree: Python entrypoints, packaging/build scripts, templates, test data, generated/runtime files src/rust/ Rust source tree and workspace root docs/ English documentation docs-es/ Spanish documentation docker/ Container-related files and configs sim/ Simulation/support assets
Most Python entrypoints live in src/, not the repo root.
src/LibreQoS.py Main shaper/orchestrator. Validates inputs, builds the shaping tree, programs TC/XDP state, and writes runtime stats/artifacts.
src/scheduler.py Background scheduler. Runs integrations, applies overrides, updates Web UI scheduler status, and triggers refreshes.
src/integrationCommon.py Shared integration graph/model layer. Builds network.json and ShapedDevices.csv from importer data.
src/integration*.py CRM/NMS importers and related helpers. UISP may run via Rust binary; several others still run in Python.
src/virtual_tree_nodes.py Logical-to-physical network helpers for virtual nodes in network.json.
src/shaping_skip_report.py Helper for reporting devices/circuits that were not attached during shaping.
src/lqTools.py Operator/debug helper CLI for inspecting active shaping state.
src/configMigrator.py Compatibility helper for migrating old ispConfig.py settings into newer config flows.
src/csvToNetworkJSON.py Helper script for generating network.json from CSV input.
src/cidrToHosts.py Helper script for expanding CIDRs in ShapedDevices.csv.
src/mikrotikFindIPv6.py Optional Mikrotik helper used by some integrations for IPv6 enrichment.
src/pythonCheck.py Shared Python version gate used by executable Python entrypoints.
src/test_*.py Lightweight unit tests. These generally assume the working directory is src/.
src/bakery_integration_test.py Larger integration-oriented test harness for shaping/tree behavior.
src/LibreQoS-old.py Historical copy; not the primary source of truth for current work.
src/LibreQoS-ancient.py Historical copy; not the primary source of truth for current work.
src/LibreQoS.py.new Staging/alternate copy; not the primary source of truth unless the task explicitly targets it.
src/VERSION_STRING Current release string, also used by packaging/build scripts.
src/rust/Cargo.toml is the source of truth for current workspace members.
lqosd Main daemon. Also contains the node manager / web UI server.
xdp_iphash_to_cpu_cmdline Compatibility CLI for managing IP mappings in the XDP cpumap system.
xdp_pping Legacy compatibility CLI for the earlier xdp_pping workflow.
uisp_integration Rust UISP integration binary.
uisp Shared UISP API/types used by the integration.
lqusers CLI for managing LibreQoS web logins.
lqtop CLI/TUI for displaying live network status.
lqos_utils Shared helpers and utility types.
lqos_sys XDP/TC/eBPF bridge and kernel-program management.
lqos_stormguard Experimental dynamic rate-adjustment system driven by live link-quality/capacity data.
lqos_setup First-run/setup CLI.
lqos_python PyO3 bindings exposing Rust config/bus/helpers to Python.
lqos_overrides Override library/CLI for persistent devices, circuit adjustments, network adjustments, and UISP overrides.
lqos_map_perf eBPF/XDP map performance CLI.
lqos_heimdall Heimdall packet/flow watchlist and capture support.
lqos_config Configuration management, including config, shaped devices, and network.json handling.
lqos_bus Local bus types and Unix-domain-socket support used to communicate with lqosd.
lqos_bakery Queue creation/update/delete and diff-driven queue management.
lqos_queue_tracker Reads and tracks Linux tc queue state for the rest of the system.
lqos_support_tool Support/sanity-check CLI for gathering and submitting support dumps.
third_party/libbpf-sys Vendored libbpf-sys tree used by the Rust side.
src/build_rust.sh Builds the Rust side in release mode, installs binaries/artifacts into src/bin, updates liblqos_python.so, and may restart services
src/build_dpkg.sh Builds LibreQoS and assembles a .deb package
src/rust/lqosd/dev_build.sh Builds node_manager JS bundles and copies static assets into src/bin/static2 for local UI iteration
src/lqosd/src/node_manager/js_build/esbuild.sh Builds all JavaScript and puts the web system in the right place (must run from that directory)
src/rust/lqosd/src/node_manager/js_build/test-build-contract.sh Verifies the node_manager page/build/vendor contract before bundling
.codex-repo/link-skills.sh Symlinks repo-owned shared Codex skills into ~/.codex/skills
Canonical shared Codex skills for this repo live in .codex-repo/skills/.
- These skills are intended to be committed to the repo and shared across developers.
- Developers should link them into
~/.codex/skillswith.codex-repo/link-skills.sh. - After linking new skills, or pulling updates that change them, restart Codex so the skill list refreshes.
- When a LibreQoS repo skill is installed and the task matches it, use it.
- If your changes touch
.codex-repo/skills/or.codex-repo/link-skills.sh, remind the user to run./.codex-repo/link-skills.shand restart Codex so updated shared skills are picked up.
- Treat built outputs, generated files, and runtime artifacts as derived state unless the task explicitly targets the generator or a test fixture.
- Do not hand-edit generated/built outputs such as
src/bin/**,dist/**,target/**,src/rust/lqosd/src/node_manager/js_build/out/**, generatedOUT_DIRartifacts, packaged.debtrees, runtime graphs/images/logs, or shaping snapshots likequeuingStructure.json,statsByCircuit.json,statsByParentNode.json,lastRun.txt, andlinux_tc*.txt. - Edit the source inputs, rebuild/regenerate, and then review the result.
- Any command that can affect live shaping, TC/XDP state, network interfaces, system services, package install/uninstall state, or installed runtime files under
/opt/libreqosor/etcrequires explicit user approval. - Prefer non-destructive validation first: targeted tests,
cargo check, shell syntax checks, build-contract checks, and static review before any live-host or service-affecting action.
- For Rust changes, prefer validating touched workspace members with
cargo check -p package,cargo test, andcargo clippy. - Some crates present under
src/rust/are not current workspace members. For those, usecargo --manifest-path path/to/Cargo.toml. - Use
cargo machetewhen changing Rust dependencies in the workspace. - Use
cargo audit. Failures with no mitigation, unmaintained crates are acceptable. - Use
cargo treewhen adding dependencies and try to minimize the number of dependencies with different versions in the tree. - Prefer
parking_lotfor new Mutex/RwLock usage. Existing code still contains somestd::synclocks and atomics. - Prefer
crossbeam_channelfor new MPSC/MPMC channels. Existing code still contains somestd::sync::mpsc. - Public Rust functions and types should have RustDoc. Update RustDoc when changing behavior.
- Avoid nested
if letwherelet elsewith early return is clearer. - Prefer
thiserrordefined errors. Log the error duringmap_errwhile converting to the error type.- Avoid error messages that lack specificity. "File not found" is not ok; "File (filename) not found" is great.
- In most cases, prefer an actor (thread or async) over a fine-grained lock.
- Avoid introducing new
pub staticvalues with locks when helper functions or actors would work better. Existing code still has some shared globals. - Prefer pure functions. If a pure function can be constified, do it.
- If a function is NOT pure, the RustDoc should document any side effects.
- Avoid introducing new
#[inline(always)]; prefer#[inline]. Existing hot-path code may still contain#[inline(always)]. - Consider inline markers for functions in the hot path, such as XDP ring-buffer/perf-buffer processing.
- Avoid allocation in the hot path.
- If a task touches
src/LibreQoS.py,src/scheduler.py,src/integration*.py,src/integrationCommon.py, or Python helpers/tests around shaping and integrations, use thelibreqos-python-workflowrepo skill if installed. - Do not add a mandatory venv/poetry/pipenv workflow. This repo intentionally supports system-Python installs for operational compatibility.
- Treat
ShapedDevices.csvandnetwork.jsonas functional contracts shared between integrations, overrides, the scheduler, andLibreQoS.py. Do not casually rename them, relocate them, or change their schema/semantics. - Preserve stable circuit/device identity values emitted by integrations unless the task explicitly calls for a coordinated migration. Overrides, partial reload logic, and downstream tooling depend on those identifiers staying stable.
- Preserve tolerant file handling for operator-managed inputs. Existing code intentionally accepts BOMs, UTF-16/non-UTF8 CSVs, comment lines, and uneven row shapes in places like
ShapedDevices.csv. - Preserve scheduler fault tolerance. Integration failures should surface to scheduler output/error reporting and continue scheduling, not terminate the scheduler process.
- Preserve current path behavior carefully. Some Python code uses
get_libreqos_directory()for installed runtime paths, while other helpers/tests intentionally read and write files relative to the current working directory. - Prefer
get_libreqos_directory()when adding new installed-runtime path lookups, but do not "normalize" existing cwd-based scripts without reviewing all callers, packaging, and operator workflows. - Keep
pythonCheck.checkPythonVersion()at the top of executable Python entrypoints unless the script is being intentionally retired. - Prefer focused
python3 -m unittest ...runs fromsrc/for touched Python tests. Existing tests are not laid out as a package and often assume that working directory. - Prefer incremental hardening over large Python rewrites. This code is operational glue with many install-time and user-data assumptions; avoid broad refactors unless the task explicitly calls for them.
- Do not run
src/LibreQoS.pyor other live-shaping Python entrypoints against the host without explicit user approval; they can modify active TC/XDP state and scheduler-visible files.
- If a task touches
src/rust/lqos_sys/build.rs,src/rust/lqos_sys/src/bpf/**,src/rust/lqos_sys/src/bpf/wrapper.c,src/rust/lqos_sys/src/bpf/wrapper.h, or Rust structs mirroring eBPF map layouts, use thelibreqos-lqos-sys-ebpfrepo skill if installed. - Never edit generated
OUT_DIRartifacts. Edit only source files undersrc/rust/lqos_sys/. - Treat BPF-side structs, Rust mirror structs, bindgen output expectations, and pinned-map ABI handling as one linked surface.
- When changing BPF map key/value structs or shared constants, update the Rust mirror types and size assertions in the same change.
- When changing pinned-map ABI, review the map compatibility cleanup in
src/rust/lqos_sys/src/lqos_kernel.rs. - Do not run live XDP/TC attach-detach or pinned-map cleanup without explicit user approval. These actions can disrupt host networking.
- If a task touches
src/rust/lqosd/src/node_manager/js_build/**,src/rust/lqosd/src/node_manager/static2/**,src/rust/lqosd/copy_files.sh,src/rust/lqosd/dev_build.sh, orsrc/rust/lqosd/src/node_manager/static_pages.rs, use thelibreqos-node-manager-frontendrepo skill if installed. - Treat
template.html,node_manager.css,static2/vendor/,js_build/entrypoints.txt,js_build/esbuild.sh,js_build/test-build-contract.sh,copy_files.sh,dev_build.sh, andstatic_pages.rsas one linked surface. - Node manager frontend dependencies are Bootstrap 5, FontAwesome, vendored assets, and page-specific bundled JS. Do not infer frontend dependencies from
src/package.json. - Preserve the existing node_manager look and feel. Use
src/rust/lqosd/src/node_manager/static2/template.html,src/rust/lqosd/src/node_manager/static2/node_manager.css, and the existing pages as the baseline rather than introducing a new design system or framework. - Prefer vendored frontend assets under
src/rust/lqosd/src/node_manager/static2/vendor/. Avoid new CDN or npm dependencies unless explicitly required. - When adding or renaming a node_manager page, update
js_build/src/<page>.js,js_build/entrypoints.txt,static2/<page>.html, andstatic_pages.rstogether. - Run
src/rust/lqosd/src/node_manager/js_build/test-build-contract.shafter changes to the node_manager frontend build path.
- Any communication with Insight/LTS2 must preserve the existing external protocol, message shapes, field names, identity values, and compatibility expectations by default.
- Do not change Insight-facing protocol details or identity semantics unless the task explicitly includes coordinated work on both LibreQoS and the Insight side.
- If a task appears to require an Insight protocol or identity change but the paired Insight-side update is not in scope, stop and surface that as a blocker instead of making a unilateral compatibility break.
- Treat Insight protocol drift as a breaking change, even if the local LibreQoS side compiles or tests cleanly.
- If a task touches
src/build_rust.sh,src/build_dpkg.sh,src/rust/lqosd/copy_files.sh, shipped service files, packaged templates/assets, or anything that must exist on installed LibreQoS systems, use thelibreqos-packaging-releaserepo skill if installed. - Any change to
src/build_rust.shorsrc/build_dpkg.shMUST be reflected in the other where applicable. They should stay in sync on shared build/package assumptions. src/build_dpkg.shis part of the functional source of truth for shipped LibreQoS installs. If a change adds, renames, moves, or newly requires files at runtime, packaging time, or install time, updatesrc/build_dpkg.shin the same change.- Never assume a new file is "obvious enough" to be picked up automatically by packaging. Verify that
src/build_dpkg.shexplicitly includes every new file or directory required for the feature to work in an installed.deb. - When a change affects packaged assets, treat "is
src/build_dpkg.shstill accurate?" as a mandatory review check before finishing.
- Always keep the documentation updated to match code changes.