
Timeline, playback and checks for VUEROID dashcam recordings
Insert the SD card, then drag the card drive (e.g. F:\) or its folder onto the page, or use Select folder. Every video with a time in its file name (20261103_081823_INF_F_N.mp4) is placed on the timeline; the rest are listed under Files with no readable timestamp.
On the first visit a short tour points out each part of the page (Skip tour or Esc ends it for now — it comes back the next time the viewer is opened unless its own Don't show … again box is ticked — the start guide and the guide after a card is opened are hidden separately); ▶ Tour at the top of this manual shows it any time.
On the timeline, recordings that cut others (EVT, USR, PVT) are drawn in a thin event lane above the bar; the bar shows continuous and parking recording, so nothing is hidden under an event. ▼ marks a trigger. Each event file is drawn whole; events that overlap each other (e.g. two impacts close together, an event then a manual recording) go to a row below, so the lane grows to 2 or 3 rows only on cards that have them; an event that overlaps no other event fills the whole lane height (a thin one overlaps another). Where they overlap, a click on an event row plays that event and a click on the bar plays the continuous file; playing on, when that file ends inside the event the event goes on from that moment.
A card is read in two steps. 1 — a progress window shows the card files (drive DB, boot log, thumbnails) and the clips on the first screen (every channel, in the time range the timeline opens on; Settings → Checks → Open after the clips on the first screen) being read; the page opens when they are done. 2 — the other clips (nearest to what is on screen first; fewer at once while a video plays) and, with that check on, the OSD are read in the background: the bar at the top shows how far it is, the warning count says so far until it is done, and clips not read yet keep their set length (*). The card opens paused on the first frame of the latest recording. Lengths marked * are the set length (the file's own could not be read).
Recovery (boot log) (Settings → Checks): each RECOVERY(…) line in CONFIG/.boot.log means the camera recovered from an error, and is a warning (Summary → Recovery, a red ⚠ mark on the timeline), counted per error: SE START-ERROR, PE STOP-ERROR, GE SIG-ERROR, BR ENC-REPORT-ERROR, ED ENC-DEAD, BA BB-ERROR, BG GUI-ERROR, OE OOM-ERROR, and a 4-digit hex number = ENC-ERROR, counted per number with its meaning (e.g. 0041 Q-FULL(SD-FAIL), FAT-fs damage). The codes are in CONFIG.bootLog.recovery / encErrors.
Card files that are read automatically when present: CONFIG/config.bin (camera model and firmware → picks the model's preset), the drive history DB (sessions ▶ START / ■ STOP), the boot log (⏻ power-on). Opening another folder replaces the current card; Reset clears it.
The bar shows the timeline channel (Front by default). Colour = recording type (legend under the bar). A thin line marks where each file starts; ▼ marks a trigger (the moment an event or button press happened — the file starts its pre-record seconds before it).
Under the bar, the overview strip shows the whole day; drag its window to move. Wheel zooms (outlined in blue while it does; while the page is being scrolled, the wheel goes on scrolling it over the timeline — pause a moment to zoom), dragging the bar scrolls, a click jumps there. Hovering shows a still of the video at that moment with the file name.
Warning boxes:
R CUT).When recording stops and starts again (STOP → START: infinite ↔ parking, into the menu and back …) the camera's pre-trigger buffer starts empty at START. An event (or other clip with a pre-trigger part) triggered less than its pre-trigger seconds after START can only hold the seconds since START — e.g. START 10:02:00, event at 10:02:04 with 10 s pre-trigger → 4 s before the trigger. That is expected and not flagged; the file is drawn from START. START is the drive DB's session start, or where the recording on that channel starts again after a break. A drive DB START counts even when a file of the session before it runs past it — e.g. infinite → parking, a parking motion clip (PRK) triggered 5 s after START holds only those 5 s; it needs at least its pre-trigger seconds (10 s) after START to hold the full part. Not after a power-on: the START after BOOT has the camera's built-in buffer, so the full pre-trigger part is still expected there (the boot log tells a power-on apart). Settings → Checks → Pre-trigger after STOP → START.
File name time (Settings → Recording types → File name time): for most types the time in the file name is the trigger (impact, motion, button) and the file starts Before trigger seconds earlier. Some firmware names a file at its recording start (first frame) instead: set it to recording start only for such firmware (then the infinite file before it may end anywhere up to Before trigger seconds after the name). A file named at its first frame by mistake (an old firmware bug) stays a warning: the infinite file before it overlaps it by exactly its seconds before the trigger, and the warning says next file misnamed? with the name it should have.
Parking motion (and parking events) are only recorded when something happens, so time with no recording before such a clip is normal — e.g. infinite stops, parking starts (START) and the first parking motion clip comes 26 s later: not flagged (Settings → Checks → Recorded only on motion). Parking timelapse records all the time, so a gap there is still flagged.
A clip that stops short inside a drive DB session is only missing time up to that session's STOP; time after a new START belongs to the next session, not to it (within the end tolerance of STOP it is fine).
Files of the same recording on several channels are compared too (file name time and length; files with the same name except the channel, e.g. …_INF_F_N / …_INF_R_N, are compared with the Front file: 1 s or more longer or shorter is a warning — Settings → Checks); differences are listed in the Summary, not drawn.
Click the timeline or a file to play from there. Playback follows the timeline across files and over gaps. Channel picks the camera; All channels (0) shows them side by side — click a tile or press 1–4 to open one (it keeps playing or stays paused, as before). Where a channel has no recording, its picture is black.
In a gap (no recording on this channel) the video says how far the next clip is, e.g. No Front recording · next clip in 54s (00:06:40). Click the video (tap on a phone) to skip straight to that clip — playing or paused stays as it was; playing backwards it goes to the end of the previous clip. With Play through gaps on, playback otherwise runs through the gap in real time.
Scroll down to the timeline or the lists and the video follows in a mini player at the bottom left (⤒ back to the player, ✕ close; Settings → Playback to turn it off).
Frame by frame: D / F (pauses first). Save the picture on screen at full size: S or the 📷 button. The bar on the video works like other players: ⏮ ▶ ⏭ (previous / next clip), volume and time on the left; 📷, ⚙ (speed, keyboard shortcuts), ☰ (file list) and full screen on the right. Press ? for every shortcut. In the ☰ file list a click goes to that file (playing or paused stays as it was); a double click plays it, and the copy icon next to the name copies its path. In the ☰ file list: the chips filter by channel and type, the search box keeps only files whose name (or folder) holds every word typed — e.g. 20261106 for that day, 0834 EVT — and a click on ⚠ shows that file's warnings in a small box (click one to go there).
The ⓘ button at the top right of the video opens the details of the file being played. The file list under the timeline shows the files at the playhead, by default by recording, oldest first (F R O, then the next recording's F R O; Settings → Playback → Files under the playhead: by channel, and time order: oldest / newest first or as the File list panel); click a row to show that file in the player (same moment, playing or paused as it was, the row highlighted) and open its details (codec, bitrate, frames, audio, data track); a double-click on the open details copies them as text (without the bitrate graph and pictures). In the bitrate graph, with config.bin the camera's target is a green dotted line and bars of 1 s or more that are over / under it by more than the Bitrate tolerance (10 %) are red / orange; the wheel zooms in down to single frames (keyframes in orange), dragging moves, a click goes to that moment (or that frame) and pauses, and a double-click shows the whole file. The copy icon copies the file's path.
The details start with the camera's own thumbnail: from CONFIG/.thumbnail-NN.db (one per channel, matched by file name), or — when the card has no such DB, or the video is not in it — from the THMB box inside the file. Every thumbnail is shown at 320 × 180. A video without one is flagged NO THUMB and the details show a 🚫 picture. The thumbnail and the OSD line of the first / last frame (also in the frame-accurate analysis): a click shows the picture at its actual size (1:1) — zoom with the wheel, − / + (keys too), 100% (1:1, key 0) or Fit, drag to move, Esc closes; a double-click copies it to the clipboard (PNG, to paste in a ticket or chat).
Read from the MP4 header only (nothing is decoded), so they are fast. Turn each on or off in Settings → Checks.
| Label | Meaning | Default |
|---|---|---|
EMPTY | 0-byte file. | On |
NO HEADER | No moov box: the recording was never finished (power cut, card removed). Players can't open it. | |
NO PLAY | The browser failed to play it (a decode error while playing or seeking — a damaged part, or a codec the browser lacks). Found when the file is played; kept until the card is opened again. | |
CUT | The header is cut off, or it points at data past the end of the file — the end of the recording is missing. | |
NOT CLOSED, NO DATA | Fragmented MP4 (moof pieces): never closed — no mfra index at the end while other files have one, so the recording was cut (it still plays up to that point); or no fragments at all. | |
DAMAGED | The box structure can't be read. | |
UNREADABLE | The browser couldn't open the file at all. | |
SIZE | Its size differs from most videos of its channel in the same folder (the camera pre-allocates them all the same size). Reserve files (.TFF_REC_RESERVE<F/I/R/O>nnnn_N.NFF, the one in use .SYS) of another size, and channels keeping different numbers of them in a folder, are listed under File size / reserve files. | On (File sizes and reserve files) |
NO THUMB, BAD THUMB | No thumbnail for this video (neither in the camera's thumbnail DB nor in the file), or it is not a JPEG. | On |
OSD START, OSD END, OSD GAP, OSD OVERLAP, NO OSD | The time stamped on the video (OSD), read in the bottom 10 % of the first and last frame that have one, gives the real start and end of the file; more than the tolerance (2 s) away from where the file is on the timeline is flagged. Video recorded while the camera boots or the pre-trigger buffer may have no OSD: the viewer looks further in (0.5, 1, 2, 3, 5 … s) and shows how long that part is. A file whose first frame has no OSD is taken as the first file after a power-on (boot buffer). No OSD at all, while the channel's other files have one, is NO OSD. Between two files that should follow each other, the last frame of the first and the first frame of the next are compared: more than the tolerance missing is OSD GAP, recorded twice OSD OVERLAP. A file with a pre-trigger part (event, manual …) must start exactly that many seconds before its file name time. Click an OSD warning in the file list for a frame-accurate analysis of that file and the ones next to it (Analyse all (frame-accurate) in the Summary's OSD time list does every file with an OSD warning): the video stops, a progress bar runs, and the frame where the OSD's second changes (exactly X.000 s) is found by a binary search, so start, end, pre-trigger part and the gap between files are measured to one frame; the checks are then updated with these values. The OSD speed and its unit (mph / km/h) are shown in the details. | Off (about 1–2 s per file; one file on request in its details) |
CLOCK | The time written in the file (creation time) is more than the tolerance away from its file name time, start or end. A time-zone offset that every file shares is ignored. | On |
DROP / DROPS | No new frame for longer than frame gap × the normal interval (dropped frames). The box sits at that moment in the file. | Off (Frames and audio) |
NO KEY | The first frame is not a keyframe: the start can't be shown. | |
A/V, A/V START | Audio and video differ in length or start by more than the tolerance (lip sync). | |
NO AUDIO | No audio track while most files of that channel have one. | |
NO DATA TRACK | No data track (GPS / G-sensor), or an empty one, while most files of that channel have data. |
AVI cameras (CVD-F410 …, BSD-F606 …: their presets turn on Settings → File name → Read videos as AVI; every .avi file too): one file holds every channel as a video stream, with PCM audio and a data stream. Each stream becomes its own channel — F, R1 … R5 (file name …_INF_6.avi = 6 channels; AVI: channel of each video stream) — so the timeline, channel buttons, the files at the playhead and the channel checks work as with one MP4 per channel. They are read from the AVI header and its index (length, frames, key frames, bitrate per channel); the camera's single .thumbnail.db holds the F picture, shown for every channel of the file. Warnings: NO INDEX (no idx1 after the recording — it was never closed), CUT, NO STREAM (the name says more channels than the file has), Channels: length (a channel more than channel length tolerance away from F) and empty (dropped) frames. The File list shows one row per file (6CH); a click plays the channel you are on (or F), and all channels stay all channels; the files at the playhead list every channel. The file details list every stream (▶ = this channel). Playing: the channel is copied into an MP4 in memory first (a second or two the first time; the last few are kept), then it plays, seeks, steps frames and reads its OSD like an MP4 file. Sensors: the data stream has the same 72-byte samples as the MP4 data track (G-sensor X / Y / Z, speed, GPS, time) and fills the Sensors box. Sound: the camera's PCM sound (one for all channels) is turned into a WAV and plays next to the video, following play, pause, seeking, speed and volume (kept within about 0.1 s).
The bar at the top shows how many warnings were found (⚠ 20 warnings); click it for the list. [ / ] jump to the previous / next warning from the playhead (every kind, every channel). The Summary groups the warnings by check: a chip per check with its count (click to open that list), one list per check, and the checks that ran and found nothing (✓ Passed). Click a chip to open its list (again to close it); All opens or closes every list. Click a row to go there — it stays highlighted.
Export CSV (spreadsheet) or Export Markdown (paste into a bug ticket) saves every warning with the camera model, firmware, preset and time range. Export after reading has finished (the report says so if it hasn't).
The Sensors box (between the player and the timeline) shows the data track of the clip being played: G-sensor X / Y / Z (g), speed (km/h) and the GPS position, with the values at the playhead above the graphs. Hover a graph for the values there; click to go there. ▾ folds the graphs and map away (remembered); the values stay in its title line. Biggest jump points at the sharpest change (a knock or impact).
When this PC is online the position is shown on Google Maps (it follows playback; wheel over the map or − / + to zoom; back to 16 when the page is opened again). Route ↗ opens the clip's path in Google Maps when the car moved; Map ↗ opens the point at the playhead. Offline, only the coordinates are shown. Graphs and map can each be turned off in Settings → Sensors. Sound waveform (there, off by default) adds a row with the clip's sound: the loudest level (dB below full scale), silent when nothing goes above −60 dB, and clipping marks where the sound hits full scale; it also shows for files without sensor data, and an AVI's channels share one sound. The sample layout (byte offsets) is in CONFIG.sensors.layout at the top of the HTML file.
⚙ Settings (top right) holds the recording lengths, pre-record seconds, tolerances, checks and rules. A preset is a named set of settings, e.g. one per camera model. When a card's config.bin names a model that has a preset with the same name, it is used automatically; the header shows which one is in use.
In the header, ✓ preset and config open the Camera window (read only — values are changed in ⚙ Settings). Preset lists every value in use for this card; values the preset changes from the viewer's defaults are blue with a dot. config.bin lists the camera's own menu settings read from the card's config.bin: offset, field, value and the firmware's SETTING_ID, by section, with the file size and checksum checked against the layout. The field offsets differ per model and firmware branch, so each model preset names its layout (Settings → Card files → config.bin layout; auto = the layout made for the model). ⚠ config means the file doesn't match its layout (size or checksum). Passwords stored in the camera are never shown or copied. Find narrows the rows; Copy copies the rows shown as text.
Value is the number written in the file; Meaning is what it stands for, where it is known (guess = inferred, not checked in the firmware source). ✎ Edit (config.bin tab) turns the values into fields: type a number (decimal or 0x…) or pick one from ▾ where meanings are known. Changed rows are highlighted; a value outside the field's range is red and blocks the download. Download config.bin makes a new file with the edited values and the checksum recalculated — the card's own file is never changed. Copying an edited file to a camera is at your own responsibility.
For the camera models in the viewer, the firmware's own facts are shown too (made from the firmware source with tools/fw_values.py): under each meaning the default and the allowed range (a value outside it is marked — the camera then uses its default), and source comment where only the comment on the default in the source names the value. Recording quality and target bitrate lists, per channel, the bitrate the camera records at for this config.bin: quality (Low / Mid / High), front resolution, rear camera type and camera mode, looked up in the model's bitrate table.
Bitrate check (Settings → Checks): the camera records at a constant bitrate (CBR), so each file's video bitrate is compared with its target; more than Bitrate tolerance (10 % by default) off is a warning. In the list of files, the type badge has the quality and target under it (MID(16M), red when the file is off) and the channel its resolution (QHD). Parking types (PRK, PVT) use the parking bitrate; time-lapse files are not checked. Needs the card's config.bin.
Channels vs camera setting (Settings → Checks): config.bin says how many channels the camera records (1CH / 2CH / 3CH; H1 models record the front only), shown in Summary as Channels set and in the Camera window. A card with files on more channels than set (the setting changed, or files from another camera) or on fewer (a camera not connected or not recording) is a warning, and so is a recording with fewer channels than set and than its type usually has. If the missing channel is the interior camera, check the privacy mode (it stops interior recording) and the interior camera in parking: when they were on can't be told from the card, so these stay warnings to check.
Settings and presets are kept in this browser only. Defaults come from CONFIG in js/config.js; every new check starts from those defaults in every preset. On the team site (signed in with Cloudflare Access) the Model defaults and model presets (marked team) are the same for everyone and only admins change them; anyone else can use them, or edit the form and press Save as my copy… to keep their own version. Your own presets follow you to any PC. Admins manage who else is an admin with Admins…, and name model admins for each model preset (several people per preset): a model admin changes only the values of those presets (Save for everyone), not the model defaults, and can't rename or delete them. Opened as a file, presets are kept in this browser only. Version history (bottom of the Settings screen, or the version number at the bottom of the page) lists what changed in each version.
The same page works on Android (Chrome, version 132 or later) and iPhone (Safari, iOS 18.4 or later). Every file is read on the phone; nothing is uploaded.
F:\) — Chrome and Edge read the whole card including hidden folders..TFF_REC_RESERVE… files are ignored.moof piece every second, so a power cut loses only the last second).Owners are set on the server (OWNER_EMAILS) and can't be removed here.