# Timecode Desk > DROP-FRAME DROPS NO FRAMES. Not one frame of picture is ever discarded. It is a RENAMING scheme > that skips two LABELS at the top of every minute except every tenth, so the labels keep up with a > clock the nominal rate does not. Five lanes over one reel, plus a free browser-side engine doing > exact integer arithmetic on frame counts. URL: https://timecode-desk.skillsafe.ai/ API: https://timecode-desk.skillsafe.ai/api.html Derived from alirezarezvani/claude-skills (https://github.com/alirezarezvani/claude-skills), MIT, whose demo-video skill builds product demos, walkthroughs and marketing videos. A demo gets cut, and the moment anybody says "the bug is at 1:23" or hands an edit list to another tool, they are naming a frame by a label. Not affiliated with or endorsed by alirezarezvani. ## Why it exists ```text a label counts at the NOMINAL rate 30 labels to the second a picture arrives at the REAL rate 30000/1001 of a second apart ``` A NON-DROP HOUR OF LABELS TAKES 3603.6 REAL SECONDS. The labels run 3.6 seconds slow every hour and 86.4 seconds slow every day, and on anything with a broadcast junction in it that is the whole problem. AND DROP-FRAME OVERSHOOTS. Ten minutes of drop-frame labels is 599.9994 real seconds, so it ends up about 86 milliseconds FAST per day - a thousandth of the error it corrects, in the opposite direction. The widely-repeated claim that drop-frame is exact is simply wrong, and it is wrong by a computable amount. ## You cannot subtract timecodes ```text 00:00:59;29 to 00:01:00;02 digits say 3 frames really is 1 frame - `;00` and `;01` do not exist ``` THE DIGIT ANSWER IS RIGHT ALMOST EVERYWHERE, which is exactly what makes it dangerous: it fails only at the boundaries, and the boundaries are where people put marks. Convert both labels to frame numbers, subtract those, and convert back - never subtract the fields. AND IT IS RIGHT AGAIN AT EVERY TENTH MINUTE, because that is the minute drop-frame does not touch. The same cut nine minutes later has digits that agree with the count, which is why the fault is so hard to catch by eye. ## The separator is the format declaration ```text 01:00:00:00 non-drop frame 108000 at 29.97 01:00:00;00 drop-frame frame 107892 at 29.97 ``` A semicolon before the frames means drop-frame and a colon means non-drop. They are not punctuation. THE SAME EIGHT DIGITS NAME TWO FRAMES 108 APART, so a sheet whose format line says one thing and whose labels say the other is asserting two incompatible things about one reel, and every tool that reads it will pick one of them without telling you which. DROP-FRAME DOES NOT EXIST AT EVERY RATE. It needs a nominal rate that is a multiple of thirty and a real rate 1000/1001 of it, so it exists at 29.97 and 59.94 and nowhere else. At 25 there is nothing to correct. At 23.976 there IS something to correct and no scheme in the format that does it. ## The labels drop-frame never issues At 29.97 the first two labels of every minute that is not a multiple of ten: ```text minute 0 00:00:00;00 exists nothing dropped minute 1 00:01:00;02 is first ;00 and ;01 never issued minute 9 00:09:00;02 is first ;00 and ;01 never issued minute 10 00:10:00;00 exists nothing dropped ``` A LABEL THAT DOES NOT EXIST IS NOT ROUNDED to the nearest one that does, because the nearest one is a different frame. It is reported. ## What this page cannot do Everything here is integer arithmetic on labels. THIS PAGE HAS NOT SEEN THE MEDIA. It does not know what rate the pictures actually are, only what the sheet says. A sheet that says 29.97 about a 25 fps file will be answered consistently, correctly and uselessly - and the answer will look exactly like a right one. A LABEL IS A NAME, NOT A MEASUREMENT. Whether the frame it names is the frame somebody meant is a question about the edit, and nothing here can reach it. THE REAL RATES ARE EXACT FRACTIONS and are treated as such. 30000/1001 is not 29.97, and writing it as 29.97 is where the error drop-frame exists to correct comes from in the first place. ## The sheet ```text PROGRAMME rate | 29.97 format | df MARKS m1 | 00:00:59;29 | 00:01:00;02 | the cut on the logo m2 | 01:00:00;00 | | the programme start ``` A mark row is `id | in | out | description`. The out point is optional. `rate` is required and has no default; `format` is optional and takes `df` or `ndf`, and if it is absent the separators decide - which is reported as an inference rather than done silently. A LABEL THAT DOES NOT PARSE STAYS UNPARSED. It is not rounded to the nearest thing that does. ## The lanes - `plan` - decides what the reel counts in, before anything is logged - `check` - says what every label actually names - `duration` - says how long the spans really are, in frames - `drift` - says where the labels and the clock part, and what the format fixes - `deliver` - sorts findings into as written, correct a label, re-count the reel ## What it does not do It reads labels, not media. It has not seen the file and only knows what the sheet says.