What’s New

    Every release, newest first. Download the current build.

    5.1.18

    2026-09-20

    Coursing Ability clubs now get the handler warning too

    When you pick a hound to score and its handler ran another hound in the last ten minutes, GateKeeper says so — "Same handler as Bella, which ran 3 minutes ago. Give them time to get back." It is a note, never a block: a handler with help is your call.

    That warning only ever appeared at Fast CAT events. A Coursing Ability test has exactly the same shape — one hound at a time, one handler walking back from the other end — and saw nothing. It does now. At a Fast CAT event the warning also used to be printed twice, once under each run; it appears once.

    Lure coursing deliberately does not get it, and this is not an oversight. The warning is arithmetic on when a run was last saved, which at a Fast CAT is the moment the hound ran and at a lure coursing trial is the moment you typed in a judge's card — often a whole stake at a time, long afterwards. It would warn about a course that ran an hour ago. The lure coursing version of this question is answered where the running order is recorded, which checks that no one is handling two hounds in the same course.

    The weekend's combined score, for a club's own trophy

    Clubs often hang a trophy on the weekend as a whole — the hound with the highest combined score across both days. GateKeeper ranks one day at a time, because a placement is a rank within one stake on one day, so that total was arrived at with a calculator and two printed score sheets at the end of a long afternoon.

    At a multi-day AKC lure coursing event the leaderboard now carries a Combined score table: each hound's score on every day, the total, and how many days it scored on. Pick a breed to answer a premium written for one, as SANE's is.

    Open, Specials and Veteran only. A Junior or Qualified Courser test is pass/fail and Singles is not a championship stake, so neither is added in. A hound entered Open one day and Veteran the next has both days counted.

    GateKeeper awards nothing here and records nothing. The heading says so: this is not an AKC award. Two hounds on the same total are both shown on the same rank with the tie called out, because a tied perpetual trophy is a run-off or a committee's decision. A hound that ran one day of two is still listed, with "1 of 2" beside it, because whether it is eligible is in your premium and not in this app.

    The table does not appear at a one-day event, where the combined score and the leaderboard score are the same number, nor at an ASFA trial, whose stakes are not these three.

    AKC clubs can record their running order

    Draw Entry, the screen for typing in the order your club drew, only ever appeared at ASFA trials. An AKC secretary had nowhere to put a running order at all, so Field Sheets said "No courses drawn yet" over the paper sitting on the table, and no steward sheet could be printed from it.

    There is now a Running Order tab at AKC events. Type the course number beside each hound, and the blanket colour if your club drew those too. The steward sheet in Field Sheets is built from it, exactly as it is for an ASFA club.

    GateKeeper still does not draw for you. The order comes off your paper. What it does is check it, and say what is wrong before the hounds are at the line:

    • Two hounds under one handler in the same course. AKC Ch. VIII §9.1 says a person may not handle more than one hound in a course, so this is an error rather than a note — one person cannot hold two slip leads. Unless the stake has only one course, where §7.3 says those hounds run together unless the owner brings someone to handle the second or scratches one, with no refund. That one is a note with a decision in it, and the decision is the owner's. It comes up at a small specialty stake: three hounds, two of them one person's, and there is nowhere else to put them.
    • A course of four, or a Singles course with two hounds in it, which Ch. VIII §5(e) runs alone.
    • Two hounds drawn to wear the same blanket.
    • Blankets that do not follow the draw. Ch. VIII §6.10 puts the first hound drawn in yellow, the second in pink and the third in blue, so a brace in pink and blue has no first-drawn hound in it.
    • A stake divided into more courses than it needs — §6.10 asks for trios where possible. That one is a note, not an error, because "if possible" is your call and there are good reasons to hold a hound out of a trio.
    • A hound in the wrong stake, drawn twice, or left out of the order altogether.

    If your roster spells a breed in lower case — which is what happens when you import entries rather than type them — the Running Order used to mark every hound in the stake as being in the wrong draw: "Ash is a whippet in the Whippet draw." Breeds are now matched the way the rest of GateKeeper matches them, so capitals and spacing make no difference.

    Errors and notes now look different on the screen, and the line at the top counts the notes, because an order can check out and still have something worth reading.

    Checks wait until a stake is completely drawn, so a half-typed order is not reported as a broken one. Nothing here asks you to split a stake into flights at twenty: that is ASFA's rule and AKC does not have it. AKC has a split rule of its own — Ch. VIII §6.11 splits a stake "each time the entry is sufficient to hold two (2) or more five (5) point majors" — which depends on your breed and region, and GateKeeper does not check it yet.

    Singles is one group across every breed, matching how it is placed.

    AKC clubs can record roll call

    Field Sheets has always printed a roll call sheet for any club. Only an ASFA club could ever fill it in — the screen that records roll call lives on the Trial Day tab, and that tab only appears at ASFA trials. So an AKC secretary printed a sheet on which every hound read "pending" for ever, and the "scratched at roll call" note on the steward sheet could never appear.

    There is now a Roll Call tab at AKC events. Call a hound, mark it here, or scratch it, and the sheets and the steward sheet follow. If your event has more than one test, each keeps its own roll call, and the picker at the top switches between them.

    Five minutes' grace from the moment a hound is called, which is what both rulebooks say (AKC Ch. V §6.4). When the grace runs out the row says so and leaves the decision to you — nothing is scratched automatically. A hound that runs up at 5:01 is a word with the huntmaster, not a lost entry fee.

    ASFA clubs are unaffected: roll call stays on Trial Day, beside the draw and the entry desk it belongs with.

    Ticking one hound as qualified no longer drops the rest

    At an AKC lure coursing trial, the first hound you ticked as qualified used to change every other hound's result. GateKeeper reads "somebody has started recording qualifying" from that first tick, and from then on treated every hound you had not yet reached as not qualified, which took its placement away. Work down a roster of thirty and the leaderboard was wrong for everyone below wherever you had got to.

    Now, once a trial is recording qualifying, a hound you have not ticked is judged on its scores instead — the same Ch. IV §7 arithmetic described above. Your tick still wins wherever you have made one, because the two things §7 leaves to the judges are yours to record and not GateKeeper's to guess.

    A trial where nobody has ticked anything is unchanged. Every hound is placed as before, and nothing already saved in your vault moves.

    AKC Singles is one stake, not one per breed

    AKC's rules are explicit that a Singles stake is judged as a single field: "Single Stake entries from all breeds shall be combined to determine placements" (Ch. V §5(g)). GateKeeper was placing it per breed, so a Singles stake of four Salukis and three Whippets came out as two stakes, each handing out its own blue ribbon, its own red and its own yellow.

    It is now placed as one field, and the group is called All breeds rather than being labelled with whichever breed happened to be in it — a run-off card reading "Saluki Singles" sends you looking for a stake that does not exist.

    Nothing changes for Open, Specials or Veteran, which stay per breed. The Singles winner is still kept out of Best of Breed and Best in Field, as §5(h) requires.

    The window has a minimum size

    The app window could be dragged down to a sliver with no usable layout left in it, because no minimum was ever set. There is one now. It is deliberately generous — small enough that a tablet held in portrait can still show the whole window, which matters more than keeping the two-column layout at every size.

    The results file names the judge who actually saw the hound

    The Judges column of the AKC lure coursing file carried every judge at the event on every row. If you had named a judge on the test and a Judge A and a Judge B, all three went beside every hound, whoever actually stood at that course. And because nothing checked for repeats, a club whose test judge is also Judge A got that name twice on every line.

    Where two judges divide an all-breed trial between them, this was worse than untidy: the file told AKC that both judges saw both halves, which is the one thing the Judges column is there to answer.

    New on the Trials tab: Judges by breed. Only if your judges split the breeds between them. Type the judge beside each breed and the results file, the Qualified Courser certificate and the title records all name that judge for those hounds. Leave a breed blank and it names the whole panel, which is what every event has always done.

    It appears at AKC events with two or more breeds entered and somebody on the panel to assign, and nowhere else. If your panel judged everything together, do nothing — the only change you will see is that a judge is no longer named twice on the same row.

    This also matters for Junior Courser. JC needs two qualifying runs under two different judges, and a hound whose two runs were credited to the same person was short a leg it had actually earned.

    GateKeeper works out whether an AKC course qualified

    The two "Qualified" tickboxes at an AKC lure coursing trial were the only thing deciding whether a course counted. Nothing in GateKeeper ever worked the answer out, even though it had the scores — and those two ticks decide Senior and Master Courser legs, the Qualified column of the file you send AKC, and what the result card shows.

    Each course now says what the scores make it, beside the tick: every judge's total, what the regulation needs, and — when it is not a qualifying score — which judge fell short and by how much. Where that differs from the tick, there is a button to put it right.

    The rule is AKC Lure Coursing Regulations Ch. IV §7: 50% or more of the total points from each judge, so 25 of 50 on every card rather than 50 across the pair. A hound given 40 by one judge and 20 by the other has 60 points of a possible 100 and has not qualified — worth knowing, because that is the arithmetic most people do in their head.

    It offers, it does not decide. Section 7 lets the judges give a qualifying score to a hound that did not complete the course where there were extenuating circumstances, and withhold one from a hound whose run would not have passed a Junior Courser test. Neither of those is a number, so the tick stays yours — GateKeeper says what the scores say and leaves the box alone until you press the button. Both clauses are quoted on screen where they apply.

    One genuine ambiguity is flagged rather than buried: §7 puts the qualifying sentence before the pre-slip and course-delay deductions and does not say which the 50% is measured against. GateKeeper measures it against the adjusted total, because that is the score of record — but where a deduction is the whole difference between qualifying and not, it tells you so, so you can take it to the judge on the day instead of hearing about it from AKC.

    Nothing changes at an ASFA trial. ASFA's qualifying rule is a different one and ASFA clubs do not type qualifying in at all.

    The AKC lure coursing results file carries the results

    Export AKC at a lure coursing trial produced a file with Fast CAT columns on it: Run 1 Time, Run 1 MPH, Run 1 Points, Total Points. A judged course produces none of those, so every result column on it was blank, under headers promising miles an hour. It also wrote the call name into the Registered Name column, and carried six columns nothing in GateKeeper records and no screen can fill: Sex, Date of Birth, Address, City, State and Zip.

    The file now carries what a lure coursing result is: stake, preliminary, final, combined, placement, Best of Breed, Best in Field, qualifying where the trial recorded it, disposition, and the judges. The placements are the same ones on your leaderboard, so the file cannot disagree with the screen you checked it against.

    This is still GateKeeper's own column set rather than a format checked against an upload AKC has accepted, and the screen still says so. What changed is that there is now something on it worth checking.

    AKC clubs can record that a hound was absent or excused

    "What happened to this hound" only appeared at ASFA trials, because the rules written into it come from the ASFA rulebook. The cost was that an AKC club had no way to record an absence at all. An entered hound that never appeared went onto AKC's results file as a blank row that looks exactly like a hound whose time was lost, showed up on the pre-flight check as "nothing recorded" with nothing you could do about it, and could not be shown as absent on a published results page.

    The panel now appears at every event and asks in your own registry's words. An AKC club gets Ran, Absent and Excused, with a reason box for your own records. Dismissed and disqualified stay out of it: which one a pair of judges' calls produces is ASFA Chapter VIII arithmetic, and GateKeeper is not going to guess what AKC wants in its place.

    A hound with no measured height can now be marked absent. Before, the check that stops you scoring a hound without a height also stopped you recording that it never ran.

    Fast CAT and Coursing Ability clubs can publish results

    The Publish Results button on the leaderboard read "Nothing to publish yet" at a Fast CAT or Coursing Ability event no matter how much had been run. It only ever knew how to build a page from lure coursing placements.

    It now publishes a timed event too. A Fast CAT hound gets its speed and its points ("22.35 mph · 44.70 pts"), a Coursing Ability hound gets how many of its runs qualified, and a hound that was absent or excused says so. No placements are shown, because AKC awards none at a Fast CAT and a page that implied one would be inventing a result. Hounds that have not run yet are left off rather than listed blank.

    Nothing else about publishing changed: still a snapshot you press for, still no owners or registration numbers on the page, still labelled unofficial.

    The chute warns when a handler is being asked to run two hounds at once

    Run Entry was meant to warn when the hound you have just selected belongs to a handler who ran another hound in the last ten minutes. It never did, for any hound at any event: it looked for an owner field GateKeeper does not record.

    It works now, it matches handlers the same way the run order screen does, and it names the other hound and how long ago it ran, so you can see at a glance whether it is the same person or two people who happen to share a surname. It only looks at the trial you are scoring. It is a warning and never stops you recording a time.

    The pre-flight check asks for what the files actually need

    The pre-flight check used to demand an owner address, city, state and zip from every hound. Nothing GateKeeper exports uses those four fields, and no screen lets you enter one, so a normal event opened this screen to a wall of red and there was nothing to do about it. They are gone.

    What it asks for instead is what the upload needs. At a Fast CAT it now checks every hound has a height, because without one the hound cannot be scored at all and the Handicap column on AKC's file ships blank. Under AKC it says when a hound has no registered name, since that is what AKC files the result under.

    It reads every trial in the event, not just the one you are scoring. Saturday's missing times used to be invisible on Sunday, which is when a secretary runs this check.

    And it separates what will be wrong from what is worth a glance: a hound that has not run yet is no longer listed as an error in red beside a hound with no registration number. Withdrawn entries are left out and counted, because nothing is uploaded for them.

    Only your own registry's export is offered

    The pre-flight screen offered every club both an AKC export and an ASFA score summary. An AKC Fast CAT event now shows the AKC files, and an ASFA trial shows the ASFA summary.

    Trial and test details can be corrected after the event is created

    The Operations Console has a new tab, Trials under ASFA and Tests under AKC, listing the trials in the event. The name, the date, the judge and the AKC event number can be corrected at any point, and a trial can be added to an event that was set up with one. Before this, everything about a trial was fixed in the new-event wizard, so an AKC event number typed from the wrong line of the premium could only be corrected by starting the event again and re-entering every hound.

    Under AKC the screen also says up front what the results upload will trip on: a test with no event number, or two tests sharing one.

    Removing a trial is deliberately limited. A trial that has a hound with anything recorded in it, or a roll call, inspection or draw, or a recorded award, cannot be removed, and the screen says which of those is in the way. Those all hang off the trial, so removing it would take a day's work with it. An empty trial removes after a confirmation, and if it was the one being scored, scoring moves to the first trial that is left.

    The lobby says whether the event on this computer is AKC or ASFA

    The "Current Session" card on the lobby now shows the association and the kind of event under the club name, for example "ASFA · Lure Coursing · 2 trials". If you keep an AKC copy and an ASFA copy of GateKeeper open side by side, you can tell them apart before you press Resume.

    The access-code box and the Club Licence box no longer look alike

    Both sat in Settings addressing "beta testers", and they take different things: a short code like ASFA-BETA in one, the long signed licence in the other. A licence typed into the code box came back as "not a valid code", which reads as though the licence is broken. Each box now says which one it is, and the code box points a club licence at the right place.

    The Windows app can connect to a timer

    Connect Timer could not work in the Windows desktop app at all: the app never answered Windows' question about which serial port to use, so the request was cancelled every time. It now picks the port itself, preferring a USB serial adapter and leaving a Bluetooth port until last, and the button says which port it connected to. If it picks the wrong one, disconnect and press Connect again and it tries the next port. The browser version is unchanged: there you pick the port yourself.

    A redeemed licence now says so

    When you paste a club licence and the device has a connection, GateKeeper reports that the licence was activated, so we can tell a licence that never arrived from one that arrived and worked. A device that already holds a licence does the same about once a month, and only when it is online. It is the licence and the build version, nothing about your event or your hounds, and the redemption screen says so. A licence redeemed at a field with no signal reports nothing and works exactly the same, now and forever: nothing about a licence is ever checked against a server.

    Fast CAT: walk-ins and online entries can be scored

    A hound added at the walk-in desk, or brought in from online entries, had its height recorded but no handicap, so Run Entry refused its time with "no measured height" and the Handicap box showed 1.00. Only hounds imported from a spreadsheet could be scored. The handicap now always comes from the hound's height (2.0 under 12 inches, 1.5 from 12 to under 18, 1.0 at 18 and over), everywhere it is used: Run Entry, the saved run, the results table and the race sheet. Correcting a hound's height now changes its handicap for the runs you record after that; runs already saved keep the points they were given. A hound with no height shows "No height" instead of 1.00.

    Fast CAT: a time typed without its decimal point is no longer read as minutes

    Typing "875" in a Fast CAT time box used to turn it into "8:75", which the app read as minutes and seconds (555 seconds). A Fast CAT run is always seconds, so the box now leaves "875" as typed and the speed read-out shows at once that something is wrong. Type the decimal point: 8.75. Coursing Ability times still accept minutes and seconds.

    Registered names reach the AKC and ASFA files

    Hounds imported from a spreadsheet or from online entries lost their registered name on the way in, even when the file or the entry form had one, so the AKC results file and the ASFA records packet listed them by call name. Both imports now keep it. A hound's record (open it from the results screen) also has a Registered Name box, so a walk-in's can be typed in and a wrong one corrected.

    AKC files say how many hounds have results

    Every entered hound gets a row in an AKC results file, with blanks where it has no result in that test, so a file for a test where nothing had been recorded still said "40 rows". Each file in the export list now also says how many rows have results, and a file with none gets a red warning to check you are on the right test before uploading it.

    Printed results and race sheets say which test they are for

    In an event with more than one test or trial, the printed results and the race sheet showed only the club and the event's first date, so the pages for two tests looked the same and a Sunday sheet carried Saturday's date. They now show the test or trial name, its date, and at an AKC event its event number.

    The progress bar counts the test you are on

    In an event with more than one test, a hound counted as done once it had run in any of them, so the progress bar read 100% as soon as the first test was finished. It now counts the test in view, and switching tests switches the bar.

    AKC: Junior and Qualified Courser passes no longer knock trial hounds out of the placings

    At an AKC event where the JC or QC test is scored under the same test as the trial, ticking a test hound's "Qualified" box used to switch on qualifying for the whole trial, so every trial hound you had not ticked was listed as not qualified and left out of the placings. Only the trial stakes' own ticks count for that now. JC and QC hounds are pass or fail, so they are no longer given a placement or a ribbon either.

    AKC: the Qualified Courser certificate names the judge and the day

    The printed QC certificate had a blank judge line and always showed the event's first date. It now shows the judge of the test the hound passed in and that test's date. The judge number is still left for the judge to write in.

    5.1.15

    2026-09-17

    Opening a cloud event no longer empties the event on this device

    Opening an event from the Cloud Dashboard replaces the event on this device, and it used to do that without asking. With no internet connection it was worse: the list of hounds came back empty, so the event on the laptop was replaced with an empty one.

    Now GateKeeper refuses to open a cloud event while you are offline, asks first when there is an event on this device (and says how many hounds it would replace), and leaves your event alone if the hounds can't be loaded.

    Saved event files say AKC or ASFA

    A club running AKC and ASFA on the same day saved two event files with the same name, so saving the second could replace the first. File names now include the association and the kind of event, for example gatekeeper_sane_asfa_lure_coursing_2026-09-26.json.

    Roll call sheets say which trial they are for

    The check-in sheet is now called the Roll Call / Check-in Sheet and prints the association (AKC or ASFA), the trial, and that trial's date. In an event with more than one trial, a Trial picker at the top of the sheet lets you print one sheet per trial.

    5.1.14

    2026-09-17

    Saturday's Best of Breed no longer carries into Sunday

    In an event with two trials (or two days), a Best of Breed, Best in Field or tie result you recorded in one trial was also applied to the other, and overrode that trial's own scores. Recorded results now belong to the trial they were recorded in. Results recorded before this update stay with the first trial.

    Text boxes could stop typing in the Windows app after a pop-up

    In the Windows desktop app, a pop-up question from the system (the plain grey "OK / Cancel" box) could leave text boxes refusing to type until you clicked away from the window and back. That is a known problem in the framework the desktop app is built on. Start New Event asked that way and then opened the new-event form, whose first box is the event name.

    Every one of those pop-ups is now part of GateKeeper's own screen instead: starting a new event over the one on this device (it says how many hounds it will clear), archiving an event, and removing a judge. The safe answer is selected first, and Escape cancels. Messages that used a pop-up now show as a notice instead: a failed copy of the run order, copying a run card, and problems starting a checkout. A run card that could not be copied used to say nothing at all; it now says so.

    Draw Entry follows ASFA's rules on an owner's hounds

    The entry desk has a new box, Split courses. Tick it for an owner who checked the box on the entry form asking for their hounds to run in different courses.

    Draw Entry now checks an owner's hounds the way the rulebook does (Ch. V §9):

    • Two of one owner's hounds in the same course are flagged only when that owner asked for different courses. Before, Draw Entry flagged them every time and said to separate them, which would have meant changing the club's random draw.
    • In a split stake, every owner's hounds should be spread across the flights, whether or not they asked. That note used to appear only for owners who had asked, and only when every hound was in one flight. It now also catches three in one flight and one in the other.
    • When a stake has only one course, Draw Entry reminds you that the owner's hounds run together unless the owner scratches one, with no refund.

    These are notes, not errors, and they name the hounds by call name. The trial day screen now says how many notes are waiting, so "the order checks out" no longer hides one you have not read.

    A spreadsheet import reads the same box from a column called Separate Courses, Split Courses, Divide Courses or Separate Hounds (Y, Yes, X or 1 means ticked). A hound whose imported entry has it ticked shows the box ticked at the entry desk. A file without that column leaves the box as it was. At an ASFA trial the hound's own record (tap the hound on the results screen) has the box too, so an imported tick can be corrected there.

    Trial 1 and Trial 2 in one event each get their own morning

    An event can hold more than one trial (ASFA's Trial 1 and Trial 2 on the same day, or a Saturday and a Sunday). Until now the trial day screen kept one roll call, one set of inspections, one draw, one entry desk and one delay log for the whole event, so both trials shared them.

    Each trial now has its own. The trial day screen shows which trial you are on, with buttons to switch, and switching trials switches the whole morning. The steward sheet, the flights on the results screen and the records packet all follow the trial you are on. A morning recorded before this update stays with Trial 1.

    In the new-event wizard an ASFA event now says Trials and Add Trial, and no longer asks for an AKC event number. The switch at the top of the trial day, scoring and results screens says Active Trial in an ASFA event.

    Records packet, ribbons and printed results were empty in an event with trials

    When an event has trials, GateKeeper keeps each hound's scores per trial. The records packet, ribbon labels, printed results, running order, inspection sheet, pre-flight check, ASFA results file, the emergency export and the AKC lure coursing file all looked for scores the old way, found none, and came out with every hound listed and no scores or placings. The results screen was never affected.

    All of them now use the scores of the trial you are on. The emergency export includes every trial, one row per hound per trial, with the trial named. The AKC lure coursing export writes one file per trial, like the Fast CAT and Coursing Ability exports already did.

    A records packet that lists hounds but has no score or absence recorded for any of them is now blocked ("No scores have been recorded for this trial") instead of being offered as ready to send.

    Flights you type into Draw Entry now split the placings

    When a regular stake has 20 or more entries, ASFA splits it into flights and each flight gets its own 1st through 4th. Draw Entry has a Flight column for exactly this, but the results screen never read it. A club that split a big stake and typed every hound's flight in still saw one set of placings, and a red "needs a flight split" warning that nothing would clear.

    The results screen, the records packet, the ribbon labels and the ASFA results file now all use the flights recorded in Draw Entry. If only some of a stake's hounds have a flight, the stake is still placed as one and the warning says how many are missing, because splitting a half-recorded stake would hand out a placing nobody won.

    The warning now also says where to fix it ("record flights in Draw Entry"), and a stake that was split but breaks the ten-per-flight rule no longer tells you it "needs a flight split". It says the recorded split cannot stand.

    5.1.11

    2026-09-16

    The steward sheet now prints the draw your club typed into Draw Entry

    At an ASFA trial the club draws on the grounds and the secretary types the order into Draw Entry. The steward sheet only ever read the computer draw, which ASFA clubs are not offered, so a secretary who had drawn and typed every hound in opened the steward sheet and was told "No courses drawn yet."

    It now prints your club's courses, with the course numbers exactly as drawn (gaps included), split by breed and stake the same way Draw Entry shows them, with the flight shown on a split stake.

    Blanket colours are optional. Draw Entry has a new Blanket column. If your club decides who wears yellow, pink and blue at the draw table, type them in and they print on the sheet. If colours are settled at the chute, leave it blank and the sheet prints an empty box to write the colour in. GateKeeper never fills a colour in for you: a colour on the sheet that disagrees with the club's paper is worse than a blank.

    Two hounds in the same course given the same colour is now flagged as a problem on the Draw Entry screen, and the printed running order shows each recorded colour beside the hound's name.

    The "Email us" line on the pricing screen is now an actual email link

    It read "Questions before you buy? Email us — a real person answers." and nothing happened when you clicked it. That sentence sits above a $199 club licence, aimed at exactly the treasurer who wants to ask something first, and it was a dead end.

    It now opens your mail program with the address and a subject already filled in. It opens in the same window on purpose: in the desktop and portable builds a link that tries to open a new window is blocked and would do nothing, which is how the line came to be text in the first place.

    GateKeeper now says plainly that it is beta, and that no association stands behind it

    Two facts used to live only in the Terms of Service on the website, which is to say they lived where nobody reads them. They are now on the price screen before you spend anything, in Settings under "What GateKeeper is, and is not", and in small print at the bottom of every page the program prints — including the records packet, which leaves the field and travels somewhere GateKeeper cannot follow it to explain what it is. The printed line carries the build number too, so a question about a sheet three weeks later starts with a fact.

    The wording: GateKeeper is independent software. It is not affiliated with, endorsed by, certified or approved by ASFA, AKC, or any sanctioning body. Your association's rules govern your event, and where GateKeeper and the rulebook ever disagree, the rulebook is right.

    Support address is defined once

    The support email was written out in two files that agreed only by luck. One was built from the site domain and one was a literal, so changing the domain would have left every problem report addressed to somewhere nobody reads, with nothing failing to say so. There is one definition now.

    5.1.9

    2026-09-15

    You can tell us something is wrong without leaving the app

    Field Office → Data Tools → Report a Problem. Write what happened, and it fills in the rest: which build you are on, what kind of event it is, how many hounds and how many runs are recorded. It shows you the whole message before it sends anything, and it sends counts only — no dog names, no owner names, no addresses.

    If your email is not set up on that machine, it copies the message instead so you can paste it anywhere.

    Before this you had to remember the version, and nobody does.

    A licence you were sent no longer needs an account

    Paste it on the first screen and you are in. There is no sign-up, no sign-in and no internet involved — the licence is checked on your own machine.

    It used to be behind a sign-in that a reviewer with no account could not get past, which is the exact opposite of what a signed licence is for. The screen that reports a problem with a saved licence reads as one sentence now, too; it used to run two sentences together into something nobody could parse.

    The app now says so when your computer will not let it save

    If storage is blocked — a locked-down browser, private browsing, a policy on a club laptop — you get a message naming the problem instead of a stack trace on a white screen.

    Worse, some things reported success when nothing had been written. Export Portable Backup said "Backup created." when no file existed. That and two other exports now tell you plainly when a file did not save, and offer the share sheet on a device that has one.

    A portable copy tells you where to get the new one

    A portable build cannot update itself — the file is the app, on your stick — so it checks whether a newer version exists and hands you a link.

    The link used to be missing unless the build had been configured with one, so a secretary at a field was told "replace this file" and given no way to find the file. It now points at the same place the update check just read from, which is the one address the app knows is reachable.

    The logo in the app is the logo in your browser tab

    They were two different drawings. Everything else had been redrawn — the installer icon, the tab icon, the phone and tablet icons, the website — and the one inside the app had been missed.

    You can now see which build you are running

    Settings shows the version in its header, and About this build gives one line — GateKeeper 5.1.1 (desktop, built 2026-09-10) — with a Copy button, to paste into an email when you write in about a problem.

    It was not there before. The version was inside the build the whole time and appeared on no screen, so a club reporting a bug could not say which build they were on and neither could anyone else. Crash reports now carry the same line, so what you read out and what we receive cannot describe different builds.

    High Scoring Singles is awarded now, not worked out at the table

    Ch. VII §2 lists High Scoring Singles — Navy and Gold among the ribbons every host club shall use. GateKeeper knew the colour and never knew whose it was, so you printed a rosette with nobody's name on it and settled it by hand.

    It could not be worked out before. While Singles was scored per breed, six breeds in Singles meant six firsts and six candidates for one ribbon. Now that Singles is one stake across every breed, the high scorer is one hound.

    It is not simply the blue-ribbon winner, and two ordinary cases separate them: a stake split into flights has two firsts and one high score, and an unbroken tie for first can leave a flight with no first at all.

    Two hounds level at the top are shown as tied, not picked between. And a hound under the placement floor cannot take it — a rosette reading "high scoring" on a hound the same sheet of labels says did not qualify is the app arguing with itself.

    The Registered Name column on the packet is no longer always empty

    ASFA matches your records on the registered name. Ch. VII §3 awards every title "as a suffix to the registered name", and the packet has a column for it — which was blank for every hound at every trial. The column existed, the CSV printed it, and nothing in the app ever put anything in it.

    It is filled now, from the registered name on the hound's record, falling back to the name field where that is where your import put it.

    One deliberate blank. If all the app has for a hound is a call name — which is what a quick walk-in leaves behind — the column stays empty rather than repeating the call name. A blank tells the Records Coordinator the name is missing, which is true and fixable. A call name in that column tells them "Ash" is a registered name, which is a wrong answer that looks like a right one.

    Best of Breed and Best in Field points are now on the records packet

    This one under-reported points at every trial. Check anything you have already filed.

    Winning a Best of Breed is worth championship points — Ch. V §7 awards the winner "points equal to the points awarded the highest-placing hound in that breed which it defeated". Winning Best in Field is worth more on top (Ch. V §11(e)). GateKeeper computed neither. It recorded who won, printed the rosette, and then sent ASFA the stake placement alone.

    A hound that took a first in a stake of three and then won its breed off a Field Champion first was worth 20 points and was reported as 12.

    Both are computed now and both are on the packet. Three things worth knowing:

    • Only a Best of Breed run earns points. §7 says so in those words. A breed with one stake winner is settled on combined scores with no run, and earns none — there is no defeated hound to take the points from.
    • The Best in Field winner is capped at 40 for the trial, which is where §11(e) puts the ceiling.
    • A Best of Breed winner is not capped, because the rulebook does not say it is. If your BOB winner's total comes out above 40, the trial day says so and asks you to check with the Records Coordinator rather than quietly trimming it.

    One figure still needs a ruling. §11(e) says Best in Field points are "determined by the number of hounds actually defeated in the BIF run" — it names the quantity and not the multiplier. GateKeeper reads it as four times the hounds defeated, which is the smaller of the two readings, and says on screen which reading produced the number. If ASFA means four times the hounds competing, it is four points a trial higher. Ask before you file a close one.

    Your trial's date was a day early on every screen and every printed sheet

    If you print the race sheet or the roll call sheet, this one was on paper.

    A trial dated 9 May showed as 8 May — in the header, in the sidebar, on the race sheet, on the roll call sheet and on the printable report. Every club west of Greenwich saw it, which is every American club.

    The date is stored as a day. The app was reading it as midnight in London, which is the evening of the day before in Colorado. It is the same mistake that was making clubs a day late for their records deadline, one screen further out.

    The entry desk refused every entry unless you had uploaded a premium

    Check this if the trial day ever told you nothing could be accepted.

    Certification is measured against your closing date, and the trial day looked for that date in one place only: a premium list you had uploaded and built. If you had not — and the closing date is asked for in the new-event wizard, in Settings, and in the developer config — the screen read "25 of 25 entries cannot be accepted as they stand" over a field whose paperwork was complete. The reason it gave was that the trial had no closing date, about a date you had typed in.

    It now falls back to the closing date in your settings. A published premium still wins where there is one: that is the date your exhibitors actually saw.

    Operations is on the phone menu now

    Roll call, the entry desk and the ASFA records packet all live behind Operations, and it was not in the menu bar at the bottom of a phone — only a card on the Dashboard you had to know was there. It is in the bar now, between Judges and Tools.

    Making room meant shortening two labels in that bar: Dashboard reads Home, and the hammer that used to read "Ops" now reads Tools, because Operations needed that word. The sidebar on a laptop is unchanged, and a long-press still says the full name.

    Smaller things

    • The name of the screen you are on no longer collapses to Li... at laptop width. It was losing its space to the event name beside it.
    • On a phone, the stake selector on the Leaderboard no longer prints its last letter through the dropdown arrow.
    • Race Control used to be an empty page with one dropdown on it until you picked a hound. It now says what the screen is for, and tells you where hounds come from if none are entered yet.

    The ASFA CSV on the pre-flight screen had no placements in it

    If you have ever sent this file to anyone, send the records packet instead.

    The pre-flight screen offers a download described as a result summary for ASFA. Its Placement column read one thing only: the box you type in to correct a placement. So on an ordinary trial, where nobody corrected anything, the column was blank for every hound — no first, no NBQ, no points, nothing to say which hound had won. The only rows carrying a placement were the hand-corrected ones.

    It was never built from the results engine, so none of the rulebook work in this release reached it either: not the placement floor, not the mixed Singles stake, not NBQ, not a run-off you recorded.

    It now comes from the same engine as the Leaderboard, the ribbons and the records packet, in the packet's own columns — Placement, Points and Disposition, so a hound with no placement says why rather than sitting blank. A hound with no stake recorded is left blank rather than reported as having run Open.

    The card is now called ASFA Score Summary, because the packet on the Trial Day screen is the document ASFA actually receives — it carries the registered names, the hounds that did not run and the per-capita, and this file has no room for any of it.

    A placement you type now moves the hounds behind it

    Check any trial where you corrected a placement by hand.

    Typing a placement into the Leaderboard rewrote that one row and renumbered nobody. Four hounds with the third-best typed as 1 came out 1st, 2nd, 1st, 4th — two blue ribbons in one stake and no third place at all. The hound you demoted kept its number and its points; the position you emptied was never filled.

    An override now claims its position. The hounds it out-ranks move down one, in score order, and the points follow them. If the position you claim sits in the middle of a tie, the tied hounds contest the positions either side of it, and the tie rule works on those.

    And a placement can no longer be typed against a hound that did not course.

    It used to apply to any row. Typing 1 against a hound a judge had dismissed gave it first place, a full first's points, and a place in its breed's Best of Breed — while the board beside it still read DIS and the packet said 1st. A placement is a fact about coursing: Ch. V §6(e) places "the top five placing hounds", and a hound excused, absent, disqualified or dismissed did not course the stake. If the ruling itself is the mistake, change the ruling.

    The awards bar now says when a placement was not applied, and names the hound, so nothing is refused in silence.

    A hound the recorded score put under the placement floor can still be placed by hand, as before. That is a disagreement about a score, and a secretary holding the judges' sheets is who settles it.

    A run-off now settles one placement, and you are asked about the rest

    Check any trial where three or more hounds tied.

    Ch. V §6(g) puts ties for the top five inside the run-off rule. GateKeeper recorded a run-off as naming a winner — which it does — and then treated the whole tie as finished. The winner took the placement and everybody else was numbered off in the order they happened to sit in the entry list.

    Three hounds tied on 300 in a stake of four, run-off won by c, came out c 1st / a 2nd / b 3rd. Four points between two hounds still level on score, and no second run-off asked for. Swap a and b in the roster and the placements swap with them.

    Winning a run-off does not un-tie the hounds who lost it. They are still level, one position lower, and they need their own run-off. GateKeeper now asks for it. If you run it, the placements come out the way the ground decided. If nobody runs it, Ch. V §6(h) applies as it always has — both hounds take the lowest position the tie could have won, the points for the positions involved are pooled and split evenly, and the fraction is dropped.

    The same now holds for a forfeit. If one hound of three forfeits, the two still standing are awarded ahead of it under Ch. V §6(i) — and they are still tied with each other, so they are reported, not silently ordered.

    Hounds that were entered and did not run are on the packet, and in the per-capita

    Check this one against your own books — it changes what you owe ASFA.

    Ch. VI §1(b) requires the records to include "notations of reasons why hounds who were entered did not run". A hound absent at its stake was already covered. A hound scratched at roll call, or turned away by the Inspection Committee, was not — it left the roster before the packet was built, so it had no line at all. Both now appear, on the results sheet and on the cover sheet, with the reason and no invented scores.

    The per-capita followed the same gap. Ch. VI §1(c) excuses the fee only for an entry "fully refunded to the exhibitor" — and a forfeited fee is not a refund. A no-show forfeits (Ch. I §3); so does a hound that cannot be made to stand for measurement (Ch. II §7.5(d)). GateKeeper counted only the hounds that ran, so a trial with 24 entries and four forfeits declared 20 and paid on 20.

    That is not a rounding error: §1(c) says points are not recorded until the per capita fee is received, so paying short holds up your whole trial's results.

    Genuinely refunded entries — a bitch in season, a hound found lame, a breed disqualification at roll call — still owe nothing, and the cover sheet now says which is which beside each name.

    The placement floor now reads your scores, not just your judge cards

    This changes who places at any trial whose per-judge cards did not survive an import or a sync — which is most of them.

    Ch. VII §1 refuses a placement to a hound scoring under half the total possible. GateKeeper worked out the total possible from whether judge-B cards were present — but the score you see is the panel total, and per-judge cards are exactly what gets lost opening a .kpr or syncing from another machine.

    So a real two-judge trial read as one judge, and the floor came out 100 of 200 instead of 200 of 400. A hound that scored 30% took a placement and points it was not entitled to, while the same screen showed it a combined score of 380 beside a stated maximum of 200.

    One judge scores a course out of 100, so any course total above 100 can only be a panel sum. That is arithmetic rather than a guess, and it settles the normal case. Where it genuinely cannot be settled — no judge cards, and nobody over 100 on a course — one judge is assumed, because assuming two would put every hound at a real one-judge meet under the floor. The awards bar now says when the panel size was assumed, because that assumption decides who gets a ribbon.

    Found alongside it: a club that ran one course and recorded it in the second slot was counted as having run two. It never showed, because the two errors cancelled exactly — and correcting the judge count on its own would have voided those trials outright.

    The Singles stake is one stake across every breed

    This changes placements and points at any trial that ran a Singles stake. Ch. V §5(d): "Singles Stake entries from all breeds shall be combined into one mixed stake, with proficiency points and placements awarded across the breeds."

    GateKeeper was placing it per breed. Four hounds in Singles — two Whippets and two Salukis — came out as two stakes of two: two firsts, two seconds, and two High Scoring Singles, where there is one navy-and-gold rosette to give.

    The points were the worse half. Proficiency points come from the number of hounds competing in the stake, so the real winner of that four-hound Singles earns 16 and was being given 8 — and those are the points a Title of Coursing Proficiency is made of. A hound that actually placed third was recorded as a first.

    The 20-entry flighting threshold now counts the combined Singles entry too, so ten Whippets and ten Salukis is a stake of twenty and splits, as it always should have.

    Every other stake is still one per breed — Ch. V §5(a) is equally explicit that an Open stake is one breed.

    NBQ is one hound again

    Next Best Qualified is the fifth placement and one green rosette (Ch. VII §2; Ch. IV §8.3(d) — ribbons "for all placements - 1st through NBQ"). GateKeeper was labelling every hound from fifth down as NBQ: four of them in a stake of eight, sixteen in a flight of twenty. That went onto the ribbon labels and onto the records submitted to ASFA.

    Three things follow:

    • Only the fifth placing hound is NBQ. Sixth and below take no placement, and the Placement column is blank for them, because the rulebook has no word for it.
    • A tie for NBQ is now reported to you as needing a run-off. Ch. V §6(g) puts ties for "the top five placements" inside the run-off rule, and NBQ is the fifth — so two hounds level on fifth were quietly sharing the one green ribbon with nothing telling you. Left unbroken, both count as sixth and neither takes it.
    • A hound below the 50% qualifying score is no longer labelled "Next Best Qualified". Ch. VII §1 gives it no placement at all; your packet was reading NBQ in the Placement column and "Under the placement floor" in the Disposition column of the same row.

    Ribbon labels follow: asking for NBQ labels prints one, not one per hound that placed nowhere.

    Results, ribbons and the records packet now agree with each other

    If you have run a tie off, this changes what your packet says — and it is a correction. The Leaderboard screen applied your recorded run-offs and Best of Breed decisions. The records packet and the ribbon labels did not. So a club that ran a tie off, recorded it and handed out the blue rosette could export a packet to ASFA showing two second placements, no first, and no Best of Breed — and print ribbon labels from the same unresolved result.

    All three now read the same thing. Nothing about your recorded decisions changed; what changed is that the packet and the labels finally use them.

    Best in Field is no longer awarded to a single hound

    Ch. V §11(d): "Best in Field shall only be run if two or more hounds are in competition."

    GateKeeper was awarding it uncontested whenever one hound reached that stage — a single-breed specialty, or an all-breed trial where the other breeds declined their Best of Breed run-off. That is the Best of Breed rule (Ch. V §7 does allow the last hound standing to take BOB) applied to a section that says the opposite, and Ch. V §11(e) credits the winner with a first placement and championship points, so it was awarding both for defeating nobody.

    Best of Breed is unchanged.

    Your records are no longer "overdue" the day before they are due

    If you are anywhere in North America, the deadline was being worked out in UTC while your clock was not. A trial ending 5 September, records due the 19th, told a secretary in Colorado "1 day overdue — fines accrue daily" at seven o'clock on the evening of the 18th, and "2 days overdue" at eleven at night on the 19th, which is the due date.

    The countdown now uses your own calendar date, which is what a deadline means.

    A breed typed in capitals keeps its Best of Breed

    A roster imported as WHIPPET produced a packet reading "WHIPPET: 2 entered, Best of Breed (not awarded)" for a breed that had one, and two spellings of the same breed split the entry count ASFA reconciles your per-capita fee against.

    The installer says its version to Windows

    Right-click the .exe → Properties → Details. The File version now reads the real version.

    It used to read a build counter: 1 for 5.1.1, 0 for 5.1.0, 20 for 5.0.20. Three consecutive releases whose File version went 20 → 0 → 1, on a field whose whole job is to always increase. The installer filename is deliberately unversioned so the download link never goes stale, which left nowhere at all to read a version off the file.

    5.1.0

    2026-09-10

    Cloud sync and published results now follow the plan

    This takes something away, and it is the reason this is 5.1 rather than 5.0.21.

    GateKeeper has always had a table saying which plan includes what (src/lib/entitlements.ts): cloud sync and published results belong to the Club Licence, and a day or weekend pass buys the right to score the event. Nothing enforced it. Both features checked only whether the device held a current entitlement stamp, and every paid state writes one — so a $9.99 Day Pass opened the cloud exactly as a $199 perpetual licence did.

    From 5.1.0 the table is what runs:

    • Club Licence, Pro Secretary and the perpetual tiers — cloud sync and publishing, unchanged.
    • Day Pass, Event Weekend, All-Breed Day Pass, All-Breed Event Weekend — score the event, print everything, export everything, keep every record forever. No live cloud sync of runs, and no published results page.

    Cloud backup is untouched and stays available on every plan. Backing up your own event is not a premium feature and will not become one — it is the same promise as "you never pay to read back an event you already recorded".

    Nobody loses access to their own data. Past events stay viewable, printable and exportable on the machine that recorded them, with or without a current plan. That has not changed and will not.

    A club that has already published results can always take them down, plan or no plan. Being unable to remove your own results from the internet is the one failure this could not be allowed to have.

    If you hold a Club Licence and bought it through Stripe

    Redeem the licence key that came with your purchase (Settings → Licence) if you have not already. It is what proves the licence on a laptop in a field with no signal, and from 5.1.0 it is also what keeps your cloud access from lapsing after a month away from the network — a verified perpetual licence now renews its own grace period every time the app opens.

    If you have not got a key, write in and one will be reissued.

    App Check is now registered by the app itself

    It was initialised only in the exhibitor entry form's bundle, never in the file the application uses — which is why the Firebase console reported 0% verified / 100% unverified for Cloud Firestore. Every request the app has ever made counted as unverified.

    Fixed here. After a rebuild and deploy, the verified share of browser traffic should climb.

    Do not switch Cloud Firestore to Enforced yet. The desktop build serves its renderer with loadFile, so its origin is file://, and reCAPTCHA Enterprise attests a registered domain. There is no domain, so there is no token, and no configuration changes that. docs/APPCHECK.md sets out the three ways forward.

    A debug token can be supplied for local testing through the environment variable GK_APPCHECK_DEBUG_TOKEN, read at runtime by the Electron preload — never through a VITE_ variable, which would inline the token into the bundle and ship a permanent project-wide App Check bypass inside every installer. tests/appCheckSecrets.test.ts fails if a token is committed, read from a build variable, or written to a log.

    Corrections made before this shipped

    An independent review of the entitlement change found three defects in the first version of it. They are recorded because each one is a lesson about this kind of change rather than about this code:

    • The gate erased itself after 72 hours. The tier was resolved from passPlan, which only exists for 72 hours after a payment — so a club that bought a Day Pass on Tuesday for a Saturday trial had no tier by Saturday and got the cloud for free, while a club that bought at the gate on Friday night was refused. Same SKU, opposite answers. The resolver now also reads the source of the licence the device already granted itself, which is frozen at grant time and still true on the day of the trial.
    • A perpetual holder could be refused. Freshness was required of every tier. A Club Licence holder whose account read failed — a rules hiccup, a captive portal — was told to re-authenticate in a field, having paid for a licence that says it never expires. A perpetual grant no longer depends on the stamp at all; the stamp still governs everything that recurs.
    • The refusal was invisible. publishResults throws so a person who is watching gets told, and nothing caught it — so the rejection went to the global handler, filed a crash report, and the club saw the spinner stop and nothing else. It is caught and shown now.

    Under the hood

    • New: src/lib/effectiveTier.ts — resolves which tier an install actually holds, from the signed offline licence, the account record, or a recent payment, in that order. Durability, not recency: a club that owns a perpetual licence does not lose the cloud because somebody bought a day pass at the gate.
    • New: entitlements.planHasCapability() — the same question asked away from React, so CloudSync reaches the same answer offline. An install whose tier cannot be determined keeps the previous behaviour rather than being refused; the header explains why that direction is the safe one.
    • useEntitlements now reads the effective tier instead of customers/{uid}.tier, which was null for every Club Licence bought through Stripe.
    • TenantSettings.subscriptionTier caches the resolution beside the existing expiry stamp. Older save files without it load unchanged.
    • Signing out clears the cached tier along with the stamp.
    • ExportForKennelKeeper is recorded as deliberately unmounted, with a test that fails if it is mounted without also updating the marketing copy that currently describes the KeeperSuite handoff as a plan.

    Running an older build? The newest one is always on the downloads page.

    Downloads