No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-11 11:10:13 +02:00
doc Add ended-auctions CSV import with status and round fields 2026-09-10 15:11:20 +02:00
src/domhunter Add domain signal framework with update_domains command and name_quality updater 2026-09-11 11:10:13 +02:00
.gitignore fetch_bids: grace window past end, rules-aligned endgame, value dedupe fix 2026-09-10 15:35:20 +02:00
.python-version Initial Django project setup for DomHunter 2026-09-09 22:08:46 +02:00
DomHunter.md Initial Django project setup for DomHunter 2026-09-09 22:08:46 +02:00
manage.py Initial Django project setup for DomHunter 2026-09-09 22:08:46 +02:00
pyproject.toml Initial Django project setup for DomHunter 2026-09-09 22:08:46 +02:00
README.md Add README with project overview and command docs 2026-09-11 10:07:03 +02:00
uv.lock Initial Django project setup for DomHunter 2026-09-09 22:08:46 +02:00

DomHunter

Tool for tracking CZ.NIC domain auctions (.cz expired-domain auctions at domenovyprohlizec.cz). It fetches upcoming and running auctions daily, samples price action while auctions are live, imports ended-auction history, and stores everything as append-only snapshots — building a local dataset for scoring domains (0–110 pts, see DomHunter.md) and backtesting price predictions.

Django + SQLite, internal tool. Python 3.11, managed with uv.

Setup

uv sync
uv run manage.py migrate
uv run manage.py runserver

Admin at /admin/ (create a user with uv run manage.py createsuperuser).

Management commands

fetch_auctions — daily catalog update

uv run manage.py fetch_auctions [--ended-file PATH] [--timeout N]
  • Fetches the new (upcoming auctions) export and upserts DomainAuction rows.
  • Sweeps the in_auction export so auctions that already started (no longer listed in new) are stored too.
  • --ended-file imports a downloaded auction-list-ended CSV. Idempotent: overlapping files from different days are safe; duplicates are skipped, status transitions (e.g. pending_payment → finished_success) are applied. Rows are keyed by (domain, round); one final price snapshot per ended auction, anchored at auction_to.

Run once a day.

fetch_bids — live price sampler

uv run manage.py fetch_bids [--interval N] [--timeout N]

Loops forever, fetching the in_auction export and storing PriceSnapshot rows (price + bid count per auction). Only fetches while auctions may be live (12:00–21:00 CEST, extensions until 9:00 next day per the auction rules).

  • --interval N — base loop interval in minutes (default 10).
  • Within 5 minutes of an auction's end (bids in the last 5 minutes extend it by 5 minutes each), and for 15 minutes past the last known end, it samples every 1 minute instead — capturing endgame action and discovering extensions.
  • Snapshots are stored only when (price, bids) changes for an auction, so repeated unchanged fetches cost nothing.

Intended to run under systemd/supervisor/nohup during the auction window.

Data model

  • DomainAuction — one auction instance per (domain, auction_from); status (scheduled/running/finished_*/pending_*), round (repeated auctions when the winner doesn't pay — a scoring signal).
  • PriceSnapshot — append-only (price, bids) observations per auction; unique per (auction, price, bids).