VECTORHEAVY

VectorHeavy · Air Traffic Control Simulator

What leaves your browser

The game itself runs on your machine. Five things go out over the network, and one of them sends more than you would guess. All five are below, in plain terms, and then what we keep once it arrives. A sixth happens only if you choose to make an account, and it has its own section.

Page counts

Every page here loads a GoatCounter script from vectorheavy.com, self-hosted on our own server. It sends the page path, the referrer, the page title, and your screen size. It sets no cookies, and the site sets none either unless you sign in to an account (below). Your IP address and user agent are salted and hashed so repeat visits can be counted as one visitor, and the raw values are not stored. (That is GoatCounter's own copy. Our server is separate and keeps your raw IP with anything you submit — see below.)

The game adds counters of its own. They are counters in the literal sense: a name is incremented, and nothing about you rides along with it. What is counted: that a session started and which airport you picked, that it ended and roughly how long it ran, whether you were new or returning, how the radio turned out and how long it took to be ready, the sim speed you used, and — added 2026-07-31 — roughly how many commands you issued (a bucket, not a number) and how far into the shift your first one came.

That last pair is there for one reason, and it is worth saying plainly. Most shifts end in under five minutes, and we could not tell whether those players never worked an aircraft or worked several and left anyway. Those call for opposite fixes. No command text, no callsign, no aircraft, and no identity is recorded — only how many and how soon.

High scores, and what a record carries

Beat your own previous best at an airport and the game posts that record to our server by itself. No prompt, no notice. It fires on a personal best, not only on a global one. What goes with it:

  • a stable anonymous player id, generated in your browser
  • your callsign, the score, and the airport
  • a context block: browser user agent, the sim seed, a session code, your theme, and the build commit
  • your IP address, stored in full, exactly as sent (what that means)
  • the full session tape: the seed plus your complete command log, up to about 60 KB

That last line deserves saying straight. The tape is a keystroke-level record of the session you just played: every command you issued, in order, with its timing. It exists because the sim is deterministic. Feed the tape back in and it reproduces that session move for move and lands on the same score, which is how a leaderboard claim gets audited instead of taken on faith. A score with no tape behind it is a number somebody typed.

The radio voices

The voices are a Kokoro model, about 90 MB on most devices and about 325 MB on a desktop whose graphics card can run the larger version, fetched from our own vectorheavy.com/models and cached by your browser after that, so it happens once. Individual voices are about 510 KB each and come down as they are needed. Only if our copy is unreachable do the same files come from huggingface.co instead, and in that case Hugging Face sees your IP address and user agent. Leave the radio off and none of it is fetched. WHEN it comes down is worth being exact about, because it is not always the moment you arm the radio. On a desktop browser the download may start earlier, while you are still on the lobby choosing a field, so the radio is ready by the time you take the position. That only happens once you have been on the page a few seconds or reached for something on it, never the instant you arrive, and never if you have muted the radio or your browser is set to save data. On phones and tablets (iPhone, iPad and Android) no model is fetched at all and nothing goes to Hugging Face: their voices come from the trial below, and when that is unavailable the radio plays as text.

A voice trial. On some shifts the radio is voiced by ElevenLabs instead of the model above, so we can learn whether better voices make the game better. On those shifts the words of each radio call (callsigns, clearances, readbacks) go from your browser to our own server, and our server sends them on to ElevenLabs, which returns the audio. ElevenLabs sees our server, not you: no IP address, player id, callsign you claimed or anything else about you is sent. On a desktop the model above still loads as a backup, so if the trial voice is unavailable the radio carries on in the usual voice. On phones and tablets the trial is the only voice, so there it falls back to text. The trial can end at any time.

The email box

If you type an address into the notify box and press the button, it goes to our server so we can mail you when the next thing ships. Nothing sends it for you. The only other place the site asks anything about you is the optional account below.

Accounts (optional)

You never need an account. Sandbox, Arcade, Ranked and every airport work without one, and a callsign works without one too. An account exists to secure your callsign with an email, so you can get it back on another device or after clearing your browser, and to keep a Career (below). Accounts are for players 13 and over.

Signing up. The account page asks for your birth month and year, then your email. The birth month and year are checked and thrown away: they are never stored, not by your browser and not by our server. If the answer says you are under 13, no account is made and nothing about the answer reaches our records, not the email, not the date and not a log line. Your browser remembers that answer, so the form does not ask again.

What an account stores:

  • your email address
  • the date you confirmed you are 13 or older (not your birth date)
  • the browser ids and callsigns you link to it, and when
  • when you signed in, and for each signed-in device when its session started, when it expires, when it was last used and when its expiry was last extended
  • whether you turned on the score email, how often, and when the last one was sent
  • if you play Career: that you finished the Academy and when, and your careers (see Career below)

What it never stores: your birth date, a password (there are none: you sign in with a one-time link we email you, which expires in 15 minutes), or anything from an under-13 answer.

The one cookie. Signing in sets a single cookie, vh_session, on this site only. It is sent only to our own server's /api/ addresses, scripts on the page cannot read it, and it keeps you signed in on that device for up to 180 days after your last visit, unless you sign out. A visit moves that date forward at most once a day. If you never sign in, there is no cookie.

Your email is used only for sign-in links and account notices, such as a note to your old address when someone asks to change it, and for the score email if you turn it on. No newsletter rides on it. The emails are delivered by Resend, our email provider, which sees the address and the message it delivers.

The score email is off unless you turn it on in your account. It holds only your own news: where you stand on the boards at your fields, who passed you, new field records there, and how many of your ranked shifts set a personal best. It comes weekly, or monthly or daily if you pick that. Every one has an unsubscribe link that works without signing in, and stopping it never affects your account, your callsign or your scores.

Your data. When you are signed in, the account page lets you download everything the account holds as a file, sign out on every device at once, and delete the account. Deleting takes effect immediately: the email, the links and the sessions are removed. We keep a daily backup of the account records for a week, so a deleted account is also gone from every backup within 7 days. Your callsign keeps working on the browser that claimed it, and your scores stay on the boards, the same as for anyone without an account.

Career

Career needs an account, so it is for players 13 and over, and nothing about it is stored for anyone who never starts one. When you play Career, the account also stores:

  • each career: how you were hired (rookie or prior service), the home Center you picked if any, its slot, the facility you are at, the offers open to you, and when it started and, if you retire it, when it was retired
  • for each facility, each position's count of qualifying shifts and when it was certified, and the facilities where you hold a CPC (your patches)
  • your path: every facility the career has worked, with the dates you arrived and left
  • every career shift you finish: the facility and position, when, how long it lasted, landings, departures, timely and late handoffs, losses of separation, how it ended, whether it qualified, the game build, and the shift's seed and replay tape. The tape is the same command record a high score carries. It is kept so any certification can be checked again by replaying it.

Career shifts never appear on the Ranked boards or the field records. A career shift that cannot reach our server is kept in your browser until it does, and then removed from the browser. Retiring a career keeps it, read only, on your account. Deleting the account deletes every career with it, tapes included, and the account download includes your careers (with a count of tapes rather than the tapes themselves).

Bug reports

Sending a bug report is something you start: you open the box, type it, and press send. A checkbox there attaches your session tape, checked by default and yours to uncheck, and it rides along only with bug reports; the report itself carries the same context block a record does, browser user agent, sim seed, session code, theme, and build commit, plus your email if you type one.

Your IP address

Our server keeps it. Every high score, every bug report, and every address typed into the notify box is stored with the IP address it arrived from, in full, exactly as sent. It is not hashed and not shortened, and it stays with the row.

Two things about that are worth being exact on, because the sentence about the page counter further up says the opposite and it would be easy to read it as covering everything. It does not: the salting and hashing described there is what GoatCounter does with its own copy. Our server is a separate thing and it keeps the raw value. And because a personal best is posted by itself, with no prompt, playing the game is enough for your IP address to reach us. You do not have to fill in anything.

What it is for: refusing floods, and telling one person apart from a script when something is being abused. It also appears in the notification mail that reaches us when a record is set. It is not sold, not shared, and not used to build a profile of you. There is no automatic deletion today, which is a thing to fix rather than a policy to defend, and this page will say so when it changes.

What is not here

No web fonts loaded from someone else's server, no ad network, and no third-party tracker beyond the page counter above. Nothing is sold or handed on. The only places anything goes are our own server, Hugging Face if our copy of the voice model is unreachable, during the voice trial above, ElevenLabs, which receives radio text from our server and nothing about you, and, if you make an account, Resend, which delivers its sign-in emails.


Credits and licenses

  • Voices: Kokoro-82M v1.0 ONNX, run in the browser through kokoro-js and Transformers.js. The model weights and both libraries are Apache 2.0.
  • Scope rendering: PixiJS, MIT.
  • Airports, fixes, procedures, and phraseology: published FAA products, the FAA CIFP cycle, FAA Order JO 7110.65, and the AIM. Works of the US government, in the public domain.

VectorHeavy is an independent game, not affiliated with, sponsored by, or endorsed by the FAA. Airport and procedure data are derived from publicly available FAA products, and where the game simplifies a real rule the Fidelity Ledger says so and names the paragraph it departs from.

If anything on this page is wrong, out of date, or unclear, write to hello@vectorheavy.com and it gets fixed.