typecheq
get serious about your typing test; it compiles now.
Ready
Click the test area, then start typing
Key
aPending
aCorrect
aIncorrect
aRetyped
aCursor
WPM0.0WPM
Accuracy0.0%
Mismatches0
Time Left30s
Finished session
Locally verified audit
SHA-256 + Merkle + Replay
Locally self-attested by the Typecheq Local Typing Authority. This certificate proves that Typecheq agrees with itself, which is the highest standard available to a browser tab. Replay, hash chaining, the Merkle root, and the TC-CERT binary envelope demonstrate internal consistency only; the browser clock and code remain client-controlled.
Live WASM State (JSON)
What am I looking at?
- meta
- Identifies the schema and codec versions this payload conforms to. Consumers should validate
meta.schema_versionbefore parsing. - session
- The complete state of the current attempt as of this render:
mode,passage,input,diff,analytics, andtimer. - session.mode / session.passage.category
modeis"passage"(a fixed corpus entry, chosen by length) or"time"(randomly generated words, extended to keep ahead of the cursor for as long as the deadline allows).passage.categoryis"short"/"medium"/"long"for passage mode,nullfor time mode — dictionary text has no fixed length bucket.- session.diff.data
- The per-position diff payload, encoded per the codec named in
meta.codecand detailed insession.diff.encoding/session.diff.symbol_layout: each ofsession.diff.lengthpositions is one 7-bit symbol — a 2-bit status code in bits 0-1, a saturated 4-bit attempt count in bits 2-5 (session.diff.attempts.max_value), and a 1-bit reflow flag in bit 6 — packed as a cross-byte bitstream persession.diff.packed_bytes, then base64-encoded per RFC 4648. Decode order matches passage order. Each position's status is a direct comparison of the typed character against the target character at that position — not an alignment, since the typed buffer can only ever grow by appending a keystroke or shrink by truncating on backspace, so there's never a real insertion or deletion to align. - session.diff.data — reflow flag (bit 6)
- Historical: an earlier scoring algorithm could reinterpret which target position a keystroke belonged to well after you typed it, and this bit flagged the render where that happened. Positional scoring can no longer reinterpret anything: a position's status is fixed the moment it's typed and never changes without a corresponding keystroke at that exact position — so this bit is permanently 0. Kept in the wire format for backward compatibility.
- session.diff.attempts
- Historical aggregates over every passage position ever attempted:
total, the single most-retried position (max/max_position), and how many positions were ever revised (revised). These raw counters survive backspacing and are distinct from the saturated, cursor-local attempt counts embedded insession.diff.data. They are mirrored intoresult.summaryasattempts_*once finalized. - session.analytics.pace_distribution
- Distributional statistics over raw pace, not overall WPM:
session.analytics.pace_distribution.samplingis"non-overlapping"— the accepted-printable-keystroke stream (basis: "accepted-printable-keys") is grouped into disjoint, back-to-back segments ofsegment_keys(5) keystrokes each, and each completed segment yields one rate sample of60000 / segment_elapsed_ms. Correct, incorrect, and retyped printable keys all count toward a segment; Backspace never does, but time spent correcting or pausing before the next accepted key still counts toward that key's segment. A segment whose canonical elapsed time is zero cannot produce a finite rate and is discarded intodiscardedrather than clamped to a floor duration — so no sample is ever manufactured, and one short interval can only ever affect the one segment it falls in, not the whole distribution.availablerequires at least three valid segments. These statistics are maintained online permeta.engine's accumulator and mirrored intoresult.summaryas thepace_*fields onceresult.finalizedis set — distinct fromresult.summary.wpm, which remains the authoritative correct-character overall WPM for the complete session. - session.timer
untimedis true for passage mode: there is no deadline,session_time_msonly counts up, andallowed_time_ms/time_left_ms/duration_msare allnull. For time mode (untimed: false),session_time_msis the single capped session clock used for scoring,allowed_time_msis its inclusive upper bound (one of 15000/30000/60000/120000), and the legacyelapsed_ms/duration_msfields mirror those values so consumers can validate the timing contract. Finalized values are also mirrored intoresult.summaryand covered by the result checksum.- result
result.verificationisPENDINGduring the test, then reports the independent replay, hash-chain, Merkle, VM, and certificate-round-trip checks. The unreleased2.0.0-dev.4schema issues a binaryTC-CERTinresult.certificationwhen verification passes; its Reed-Solomon error-correcting envelope (result.certification.ecc) remainsnulluntil Phase 6, and stable2.0.0is reserved for Phase 7. The old CRC32 survives only as explicitly labeledresult.legacy_checksumdiagnostic metadata.- result.summary.distance / result.summary.journey_distance
distanceis the finalized mirror ofsession.diff.distance: the positional mismatch count over the final typed text.journey_distance, added in2.0.0-dev.3, is a different and independently-computed statistic: the true edit distance (insertions and deletions included) between the complete raw keystroke log recorded insession.audit— every accepted key this session, including ones later erased by backspace — and the attempted span of the passage. It's computed once at finalization, not per keystroke, and can be nonzero even whendistanceis 0 (a corrected typo costs nothing against the final text, but it's still part of the journey it took to get there).