A searchable, browsable view of American Sighthound Field Association lure coursing data (the Top 20 standings and the trial results behind them), and of the LGRA and AOK9 sprint-racing grading guides.
ASFA publishes the standings as one long page of stacked breed tables, and trial results as a page per month. You cannot search either, look up a single hound, or see where a hound sits against the rest of its breed without counting by hand. This site reads those pages and rearranges them.
- Search by call name or registered name
- Events — find an upcoming ASFA trial by state, region or month, premium lists linked
- Hound profiles — Bowen points, Best of Breed, Best in Field, standing within the breed, and the ASFA titles held and awarded this season
- Leaderboards — most BIF, most BOB, most points, highest breed standing
- Kennels — standings by kennel
- Regions — Top 20 standings per region, plus which regions and clubs are drawing the most trial entries
- LCI — Lure Chasing Instinct standings by division, with the program's scoring and titles
- Bowen — how the point system works, with a calculator
- Titles — every hound with a new ASFA title this season
- Rulebooks — ASFA's documents linked at source, plus the Running Rules as a searchable page
- Stat cards — a shareable PNG per hound, rendered in the browser
- LGRA racing — standings by breed and all-breed on this season's National points, career points, WAVE and grade, per-hound pages with the last three meets and progress toward GRC and SGRC, from LGRA's grading guide
- AOK9 racing — the same for R.A.C.E.'s all-breed sprint program: breed and mixed divisions, BRC, MRC and TRC and the Supreme titles, Turtle points, from the AOK9 sprint grading guide
- One search across all three programs on the hub at
/
This is an independent, unofficial project. It is not authorized, approved, or endorsed by ASFA, LGRA or R.A.C.E., and it is not a publication of any of them. Wherever this site and ASFA's published standings, the LGRA grading guide or the AOK9 sprint grading guide disagree, the body's own publication governs.
index.html The hub: one search across every program, three program cards
asfa.html events.html browse.html dog.html leaders.html kennels.html titles.html
regions.html lci.html bowen.html rulebooks.html rulebook.html about.html 404.html
lgra.html aok9.html racing-dog.html The racing sections (tabbed pages, one hound page)
software-list.html A standalone survey of dog-sport software, deliberately unlinked
css/input.css Design tokens (light + dark), fonts, components — the source
css/app.css Compiled stylesheet, checked in — what pages load
tailwind.config.js Maps the asfa-* color names onto the tokens
assets/fonts/ Fraunces + IBM Plex Mono, self-hosted woff2
js/app.js Data loading, chrome, icons, search, formatting
js/card.js Canvas stat-card renderer
js/racing.js The racing pages: program table, WAVE helpers, overview and hound renderers
tools/ Python ETL — fetch, parse, clubs, trials, events, build, titles, lgra, aok9, check
tools/build_css.ps1 Rebuilds css/app.css (see tools/build_css.md)
data/snapshots/ Every published standings page, archived verbatim
data/trials/raw/ Every monthly trial results page, archived verbatim
data/events/raw/ The trial schedule page, archived verbatim
data/clubs/raw/ The ASFA club listing PDF — fetched locally, never committed
data/season.json Standings — loaded by every page
data/trials.json Trial entries by club and region — loaded by regions.html
data/events.json The trial schedule — loaded by events.html
data/clubs.json Club directory: name, region, initials, affiliation only
data/lgra/snapshots/ Each LGRA grading guide, parsed, one file per guide date
data/aok9/snapshots/ Each AOK9 sprint grading guide, parsed, one file per guide date
data/lgra/raw/ The workbooks as downloaded — fetched locally, never committed
data/aok9/raw/
data/lgra.json Active LGRA hounds with standings, owners, movement — loaded by lgra.html
data/aok9.json The same for AOK9 — loaded by aok9.html
data/*-registry.json Every hound ever registered, compact — loaded on demand
The site is static files with no framework and no runtime dependencies — no CDNs, no font service, no analytics; every page loads with zero third-party requests. The stylesheet is compiled once with the standalone Tailwind CLI and committed, so deploys stay build-free. If you change any class in HTML/JS or anything in css/input.css, rebuild with tools/build_css.ps1 — the how and why live in tools/build_css.md. It follows the device's light or dark preference automatically. Python runs offline to produce the JSON under data/.
pip install -r requirements.txt
python tools/fetch.py && python tools/clubs.py && python tools/parse.py && python tools/trials.py && python tools/events.py && python tools/build.py && python tools/titles.py && python tools/lgra.py && python tools/aok9.py && python tools/check.pyfetch.py archives the live page under data/snapshots/{date}.html, named for the coverage date the page states about itself rather than the wall clock. It skips the write when the page is unchanged. Raw snapshots are committed so every figure on the site traces back to the bytes ASFA served on a given date — and so movement between publications can be computed.
trials.py does the same for each monthly trial results page, and clubs.py for the club listing PDF that supplies club regions. lgra.py scrapes lgra.club for the current grading-guide workbook and aok9.py exports the AOK9 sprint guide sheet; each archives a parsed snapshot per guide date (the raw workbooks stay out of git: they are large, and their header rows carry the registrars' mailing details) and rebuilds its feed and registry from every snapshot. A weekly workflow runs the whole chain and commits when anything changes.
python tools/serve.pyThen open http://localhost:8765. The pages fetch data/season.json, so opening the files directly with file:// will not work.
serve.py is http.server with caching switched off. Plain python -m http.server sends no Cache-Control header, so browsers apply their own freshness guess and keep serving an edited page or script from cache — which looks exactly like the edit never happened.
about.html is the full account of the ASFA side, and each racing page has its own account on its "About the numbers" tab. The short version:
- Breed standing is the only derived figure — rank divided by the number of hounds ASFA reports competing in that breed. Ranked 4th of 25 is top 16%.
- A Top 20 list holds about twenty hounds per breed. A hound placing 22nd is absent. Totals here cover placings on that list, not a complete competition record.
- Points do not compare across breeds. A breed with 200 hounds competing offers far more of them than one with five. Breed standing and Best in Field are the figures that compare fairly.
- The Singles stake overlaps the breed lists. Hounds that run Singles are also listed under their breed, sometimes with the same BIF and BOB on both rows. Where sections are combined, the site takes the maximum of each figure rather than the sum, so a record can never be inflated by double counting.
- BOB and BIF are breed-stake awards only. Hounds run alone in Singles, whose winner is not eligible for Best of Breed or Best in Field (Running Rules Ch. V §5(d), §11), and Best of Breed is contested between breed stakes, which the LCI divisions are not. ASFA still prints those figures on Singles rows — the hound's breed-stake record carried across — so they are reproduced as published but never credited to Singles or LCI in any total or leaderboard.
- Identity and owner matching are approximate. There is no registration number in the published data, and a registered name gains titles mid-season. Titles are stripped to match a hound to itself between updates; owner spellings are merged where the match is mechanical, and a bare surname or a single initial folds into the one household that fits (E.Kominek and S.Kominek into E.& S.Kominek), each merge listed in
data/review/owner-merges.csv. - Two people can share a name. An owner's home region is taken from rows where they are listed first — that is whose region the row carries. A name leading in two regions is two people (K.Sanders has six Basenjis in Region 8 and a Silken Windhound in Region 1) unless a co-owner appears in both, which makes it one person whose hounds live in different places. Thin cases are split and listed in
data/review/owner-splits.csv. - Region means two different things. In the standings it is the owner's region; on trial entries it is the club's, from ASFA's club listing. Clubs travel — Borzoi Club of America is a Region 4 club that ran in Nebraska this year — so the two are never combined.
- No personal contact data. ASFA's club listing carries liaison names, home addresses, phone numbers and emails. Only club name, region, initials and affiliation are extracted, and
check.pyfails the build if anything else appears indata/.
tools/check.py re-derives the totals by a different route than tools/build.py and fails if the two disagree. It also counts rows straight out of the raw HTML, so a silently dropped row is caught rather than quietly corrupting a leaderboard.
- Standings rank this season's points. The grading guides' YTD column is National points earned this calendar year, the figure LGRA's own year-end Top 10 lists rank by; the site ranks it within each breed and across breeds (ties share a rank). Career standings rank career National points.
- WAVE is recomputed and compared, never replaced. Rule 4.2.2 in both rule books:
(meet 1 + 0.7 × meet 2 + 0.5 × meet 3) / 2.2over the last three complete meets. The registrar's published figure is shown; a hound's page says where the arithmetic differs.check.pyrequires the two to agree for 98% of LGRA hounds and 85% of AOK9 dogs, which is what the guides actually show. - Titles are read from the points columns (12 championship points; every 30 National points a Superior/Supreme level). The registrar's certificate is the record.
- Meet codes decode to years, and to dates where the scheme gives one. LGRA: year letters (A = 1995) plus day of the year from 2012 on, a running count before. AOK9: year plus sequence, undated. A handful of typed codes in each guide cannot be decoded; they are kept as written and
check.pycaps how many. - Breed is the registration prefix for LGRA (B is Borzoi, BA is Basenji; three young breeds' headers sit in the NAME column) and the section header for AOK9. Both guides re-use a registration number now and then; every row is kept and the second occurrence gets a
-2suffix. - Active means a meet in the current or previous calendar year, or points this year; the feeds carry active hounds, the registries everyone. "Raced this year" counts a listed meet in the season, points or not, and is a floor: the guide keeps only a hound's last three meets.
- Kennels are a surname within a breed. The guides print a bare surname and nothing else, so "Jones" cannot be told apart across five breeds; one owner racing two breeds shows as two lines, and two Joneses in one breed share one.
- No personal contact data, extended: the workbooks' header rows are never copied, and
check.pygreps the feeds, registries and snapshots for emails, phone numbers and street addresses.
Please check against the source first: ASFA's published standings, the LGRA grading guide or the AOK9 sprint grading guide. If the two disagree, the published page is right and this site has a bug — please open an issue or email info@gazehound.io. If the body's own listing looks wrong, that goes to the ASFA Records Secretary, the LGRA Registrar/Recorder or the AOK9 National Racing Director, not here.
The code is MIT. The standings data under data/ is ASFA's, and the grading-guide data is LGRA's and R.A.C.E.'s, all reproduced with attribution; the Jackrabbit Project icon files are not MIT-licensed. See LICENSE for the carve-outs.