Skip to content
CAI
Software that uses CAICheck a score

Dahrkael/ExTracker

58.9

Adequate · 18 September 2026

4.3k

lines of production code

Elixir

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

ExTracker is a BitTorrent tracker service that manages peer discovery and swarm data integrity via HTTP and UDP protocols. It synchronizes torrent metadata with an external Arcadia backend, enforces access controls, and optimizes storage through automated swarm maintenance. The system provides comprehensive observability through Prometheus metrics and a real-time dashboard, while supporting flexible configuration and environment-specific deployments.

Features

Add UDP tracker support with IPv6 and BEP 15 compliance

The tracker now supports the UDP protocol (BEP 15), allowing clients to perform connect, announce, and scrape actions over UDP in addition to HTTP. This implementation includes full IPv6 support, parallel router instances for load balancing, and optional telemetry metrics. Users can now interact with the tracker via UDP, which may offer lower latency for peer discovery, and the system handles edge cases such as port zero sources and malformed packets gracefully.

_lib/ex\tracker/udp · high confidence

Added release configuration templates for VM and environment settings

New template files (env.bat.eex, env.sh.eex, remote.vm.args.eex, vm.args.eex) have been added to the rel directory to allow customization of the release environment and VM arguments. These templates provide commented-out examples for configuring distributed node communication, interactive code loading, and VM performance tweaks such as ETS allocation strategies and JIT memory mapping, enabling users to tailor the runtime behavior of the application upon deployment.

rel · high confidence

Initial Arcadia tracker integration

Added support for the Arcadia tracker, enabling ExTracker to synchronize torrent data with an external backend. The integration includes a GenServer that retrieves registered torrents from Arcadia on startup and maintains a local whitelist of hashes. It also exposes an HTTP API (via a Plug router) allowing the Arcadia backend to add or remove torrents via POST and DELETE requests to the /torrent endpoint, with automatic retry and timeout handling for API calls.

_lib/ex\tracker/integrations · high confidence

Initial configuration structure for the tracker

The application now includes a structured configuration system with environment-specific files (dev, test, prod) and a runtime configuration file for production. This setup allows users to customize tracker behavior such as HTTP/UDP ports, peer limits, backup intervals, and telemetry settings. The configuration also introduces support for HTTPS via keyfile, GeoIP lookups, hash/user-agent restrictions, and integration with the Arcadia API.

config · high confidence

New access control, backup, and swarm maintenance capabilities

ExTracker now includes built-in support for managing peer and swarm data integrity and availability. A new Accesslist module allows administrators to enforce whitelist or blacklist rules for hashes and user agents, configurable via files. The system can now automatically or manually create and restore full backups of all tracked swarms and peers, ensuring data persistence across restarts. Additionally, a SwarmCleaner process runs periodically to remove stale peers, clean up inactive swarms, and automatically upgrade or downgrade swarms between 'big' and 'small' storage types based on peer count thresholds, optimizing memory usage and performance.

_lib/ex\tracker · high confidence

New built-in HTTP telemetry dashboard and Prometheus endpoint

The tracker now includes a self-contained HTTP telemetry system that exposes a browser-friendly statistics page at /tracker-stats.html and a Prometheus scrape endpoint at /prometheus. The HTML dashboard displays real-time metrics for swarms, peers (total, seeders, leechers, split by IPv4/IPv6), and HTTP/UDP request rates (announce, scrape, connect, failures) per second, and automatically refreshes every minute. Under the hood, the system uses a configurable reporter (BasicReporter or high-performance EtsReporter) to collect Counter, Sum, and LastValue metrics via :telemetry, with a Plug capturing HTTP bandwidth and processing times. This replaces the previous /scrape stub and /about page with functional, zero-dependency stats reporting.

_lib/ex\tracker/telemetry · high confidence

Behavioural changes

Add version, about, and debug configuration functions

The ExTracker library now exposes explicit functions to retrieve the application version (0.8.0), generate HTML and console-formatted 'about' strings with repository links, and check if debug mode is enabled via application configuration. The previous module documentation and generic hello function have been replaced by these specific utility functions.

lib · high confidence

HTTP scraper now supports multiple info hashes and reverse proxy IP resolution

The HTTP endpoint now allows clients to request scrape data for multiple info hashes in a single request, returning a combined response for all successfully processed hashes. Additionally, the service correctly resolves the original client IP address when operating behind a reverse proxy by parsing the X-Forwarded-For header, ensuring accurate tracking and access control.

_lib/ex\tracker/http · high confidence

Implement BEP-compliant announce and scrape processors

The tracker now supports full BitTorrent announce and scrape protocols. The new \ExTracker.Processors.Announce\ module handles client announcements by validating events, enforcing configurable minimum announcement intervals (with a 10% time-wiggle tolerance), and returning peer lists filtered by IP family (IPv4/IPv6) and peer type (seeders/leechers/partial seeders). It supports both compact and full response formats, respects the \no\_peer\_id\ flag, caps results via \max\_peers\_returned\, and includes external IP injection (BEP 24). The new \ExTracker.Processors.Scrape\ module provides per-torrent statistics including counts for seeders, partial seeders, and leechers. The legacy \announcement.ex\ processor has been removed.

_lib/ex\tracker/processors · high confidence

Refactored tracker type definitions and enhanced announce/scrape response formats

The \lib/ex\_tracker/types\ module has been restructured to improve type safety and protocol compliance. A new \PeerID\ type now explicitly tracks IPv4/IPv6 families and includes an efficient ETS storage encoder/decoder, replacing the previous flat struct. \PeerData\ has been renamed and updated to track country, last event, and timestamps instead of a simple state flag. Request parsing for both Announce and Scrape operations now strictly validates mandatory fields (like \info\_hash\ and \peer\_id\) and handles optional parameters more robustly. Announce responses now correctly report actual seeder/leecher counts, support the BEP 24 external IP field (when configured), and include a \peers6\ field for IPv6 compact responses. Scrape responses now support partial seeders and properly format the \files\ envelope.

_lib/ex\tracker/types · high confidence

Support for overriding Extracker configuration via environment variables

The Extracker application now allows runtime configuration overrides through system environment variables. A new module, Extracker.Config.SystemEnvironment, automatically scans the configuration for the :extracker and :extracker\_arcadia applications and applies any values found in corresponding environment variables (e.g., EXTRACKER\_HTTP\_PORT overrides the http\_port setting). The system intelligently converts string environment values to match the expected configuration types, including booleans, integers, floats, tuples (such as IP addresses), and binaries, falling back to defaults if conversion fails.

_lib/ex\tracker/config · high confidence

Test coverage

Initial test suite for core tracker components

Added comprehensive test coverage for the AccessList, Announce processor, PeerID, PeerID.Storage, and utility modules. The new tests verify AccessList CRUD operations and file loading, Announce request validation and peer response generation, PeerID creation and equality for both IPv4 and IPv6, PeerID.Storage encoding/decoding round-trips, and utility functions for IP hashing and validation.

test · high confidence

Dependencies

Major dependency overhaul and release configuration update

The project's dependency list has been significantly expanded and updated: the \benx\ library was replaced with \bento\ (v1.0), and new dependencies for integrations and telemetry were added, including \locus\ (v2.3), \telemetry\ (v1.3), \telemetry\_metrics\ (v1.1), \telemetry\_poller\ (v1.2), \telemetry\_metrics\_prometheus\_core\ (v1.2), \tesla\ (v1.11), \jason\ (v1.4), and \mint\ (v1.0). Underlying libraries like \cowboy\ (v2.13.0), \plug\ (v1.17.0), and \ranch\ (v2.2.0) were also upgraded. Additionally, the \:tools\ application was added to \extra\_applications\, and specific release configurations for Unix (\extracker\) and Windows (\extrackerw\) were defined in \mix.exs\.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 59.

Lenses

  • Code Health 93
  • Architecture 79
  • Maturity 51
  • Readiness 53
  • Security 76

Changes since last survey

  • 287 commits — 257 feature/other, 30 fixes

By area

  • lib/ex_tracker — 190 commits
  • (root) — 42 commits
  • config/dev.exs — 17 commits
  • .github/workflows — 12 commits
  • config/prod.exs — 6 commits
  • config/test.exs — 3 commits
  • config/config.exs — 2 commits
  • test/accesslist_test.exs — 2 commits
  • test/announce_test.exs — 2 commits
  • test/memory_test.exs — 2 commits
  • (repo) — 1 commit
  • .github/FUNDING.yml — 1 commit
  • .github/extracker-logo.png — 1 commit
  • config/extracker.json — 1 commit
  • config/runtime.exs — 1 commit
  • lib/ex_tracker.ex — 1 commit
  • rel/env.bat.eex — 1 commit
  • test/peerid_test.exs — 1 commit
  • test/utils_test.exs — 1 commit

Notable commits

  • fix: * change the interval wiggle from a fixed 1s to 10% of the time set
  • fix: * fix SwarmCleaner
  • fix: * fix SwarmFinder not finding swarms
  • fix: * fix accesslist insertions
  • fix: * fix accesslist not looking up entries correctly
  • fix: * fix bug where the SwarmFinder would create multiple tables for the same swarm the first time + add compression support for swarm tables
  • fix: * fix case order
  • fix: * fix cmd code
  • fix: * fix code that uses peer counts
  • fix: * fix distribution ranges
  • fix: * fix environment variable not setting correctly because the default is a different type
  • fix: * fix http non-compact responses crashing on bento + add tests to make sure they keep working in the future
  • fix: * fix ip_tp_bytes to support ipv6 addresses
  • fix: * fix missing table crash when backing up
  • fix: * fix outdated config key
  • fix: * fix scrape
  • fix: * fix scrape hash list creation
  • fix: * fix sorting for display
  • fix: * fix stopped announcements crashing
  • fix: * fix swarm creation during race conditions
  • …and 267 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

Dahrkael/ExTracker was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 18 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit ab0a1e19f7d10f4e34e920bd01c51bb53be52e25 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-5d04157a340d.