The instructor password signs every command, and each kiosk refuses anything it
can't verify. The password never leaves this page. The GitHub side is handled by the club's API
(brophy-fpv-club-api.netlify.app), which holds the repo token so this page doesn't have to.
One address per pilot, by roster name. The Request-to-fly form prefills the pilot's email from here, and a
mentor spotter's address too (they approve every flight they spot). The list also fills itself in from each request filed.
Saved to settings/fly-recipients.json in the private control repo. Anyone who types a roster name on the public
form sees that pilot's address prefilled - the price of prefilling.
Every request on file, on the day of the flight. Green = approved, amber = waiting, red = denied; events are outlined. Click a day to see it below.
Newest flight first. Approvers decide from the buttons in their email; if one answers another way (a reply, in person), record it here - that settles it for every approver and the pilot is emailed the same as if they had clicked.
The Request to fly form emails people in two roles. Approvers each get their own
Approve / Deny links; every approver must say yes (one no denies). Told people get a separate heads-up with the
details and who to email if there is an issue, then the decision. The pilot's own email is required on the form and gets the
decision too; the pilot can add more "told" addresses. Addresses live in the private control repo
(settings/fly-recipients.json), never in the website's code. Comma or newline separated.
Pilot and mentor addresses live on the Emails tab. A pilot who is not a mentor must name a mentor as the spotter; a mentor spotter always approves too. Fields above and below all take several addresses, comma or newline separated.
A preset is a starting point on the form: its name, who is told and who else has to approve. The mentor filing can still rename the event and add people.
Photos pilots took of their work on the Pilot Path page. Pass files the same signed approval as the Approvals tab (both kiosks pull it) and tells the pilot; Fail tells the pilot why, and they can send a new photo. The badge rules still apply: Sim Flight needs 5 sim hours, a checkpoint needs the rest of its tier.
For bench and witnessed badges. The pilot has DM'd their photo (or you watched them do it); you approve here and a decision signed with your password is filed for that pilot. Both kiosks pull it on their next sync, whichever is on. Quiz badges are earned by passing the quiz — only use this to override. Nothing here can be undone by a student; Revoke is yours alone.
Sources: kiosk = the kiosk’s last snapshot (data.json), approved = a
decision on file from this console, quiz / lessons / steps = what the pilot did on the website.
Approve and Revoke file the same signed decision as the form above (with its note); both kiosks apply it on their next
sync, and a revoke clears the badge there even if the kiosk awarded it.
Pilots the kiosk shows with 5 or more sim hours who do not hold Sim Flight yet. One click files a signed approval for each (note: "5+ sim hours"); both kiosks apply them on their next sync. Revoke any one from their progress list.
Kiosk snapshot plus instructor decisions on file.
Commands reach the kiosk within about 15 s. They expire after 10 minutes and each one runs once. Firewall / Steam blocking needs admin rights and stays in the admin dashboard on the kiosk itself (use Chrome Remote Desktop).