Changelog
Every notable change shipped to GuerillaType, newest first. Each entry maps to a tag in the GitHub repo.
Tape mode, games depth, mobile toolbar, Umami live, red gorilla favicon
v0.5May 11, 2026
- Tape (ticker) mode: words scroll horizontally as the caret advances. JS rAF-driven slide (lerp 0.28/frame) — no CSS transition jank, math is char[0]-anchored so getBoundingClientRect mid-animation reads stay correct. 15-second default. Hero now leads with the tape sprint CTA.
- Games: per-mode high scores tracked separately in profile.gameStats.byMode (classic / endless / shooter). Best chip in the in-game HUD reflects current mode and flips on mode-tab switch. /games/ hub paints each card's personal best + best streak.
- Visible combo multiplier in game stage HUD — 1.5x at streak 5, 2x at 10, 3x at 20, 5x at 40. Color escalates accent → orange → red. Multiplier now actually applies to score math (was hardcoded 1.5x before).
- Score-pulse animation: each score increment fires a 360 ms scale + accent-glow on the Score number.
- Game-over overlay: new-best detection adds 'New best!' headline + 'Personal <mode> best' chip. Falling-short rounds show your current best + 'need X more' hint.
- Falling words no longer slide into the input box — miss-check pulled up to stageH - 80 px; shooter band trimmed to stageH - 160 so horizontal drift can't overlap the input either.
- Word Shooter mode added (mode=shooter): words drift across the screen horizontally; type to shoot them down before they leave the frame. Plane-crash explosion animation on catch.
- Endless mode added (mode=endless): no 3-miss cap, faster ramp. Persistent high score.
- Catch on game-input mobile typing now uses the OS soft keyboard (inputmode='text') — old custom virtual keyboard mount was unreliable and covered the stage.
- World-class mobile practice toolbar: stats row + 'current mode' summary chip. Tapping the chip opens a full bottom-sheet mode picker with every mode / variant / source. Old horizontally-scrolling chip strip + scroll-arrow chrome gone.
- Mobile sheet sized to 62 vh max so it lives in the lower portion of the screen — toolbar and typing surface stay visible above it.
- Definitive tap-to-type pause guard: engine.pauseTimer() itself rejects any pause request within 450 ms of the last keystroke. No code path can pause mid-typing regardless of what triggered it.
- Service-worker auto-update: registered with updateViaCache:'none' so new sw.js bypasses the HTTP cache; controllerchange listener auto-reloads the page once the new worker takes over. End of stale-cache 'fix shipped locally but not live' divergence.
- Comprehensive Umami event tracking — sessions, modes, variants, sources, library opens, lessons, challenges, achievements, theme/font/caret changes, exports, perf LCP buckets, external link clicks, PWA installs. ~50 named events.
- Public Umami dashboard embedded at /analytics/ — the same view I look at, no login.
- Red gorilla favicon: brand mark (gorilla + keyboard) re-colored to brand red across 16/32/48/64/180/192/256/512 PNGs. Generated by scripts/gen-red-favicons.mjs.
- Footer: all 9 link sections (7 megamenu + Project + Resources) lay out in a single row at >=1180px. Status badges (License, Source, Hosting, Last update, Privacy, Cost) restored to multi-row; all six are now links.
- Privacy badge says 'no cookies' (truthful — Umami is cookieless but it IS tracking; 'no tracking' overstated).
- Megamenu: dead drill IDs fixed (code-js/py/html → code-js-keywords/py-decorators/html-tags); Word Shooter + Endless now in the Games > Play column; 'Game roadmap' link removed (no such page).
- Achievements panel dedup: catalog had 3 entries sharing id='acc-99' so 'Three-nines — 99%' appeared three times in the celebration card. evaluate() now uses a Set to skip any id already processed.
- Build stability: eleventy.before hook pre-creates every _site/library/<slug>/ directory before pagination writes — fixes Windows/OneDrive ENOENT race when ~290 paginated library pages mkdir in parallel.
- Mobile fixes: ticker strip right-edge cutoff (min-width:0 on flex children), hero 'Or pick a different start' wraps cleanly (flex-wrap + white-space:nowrap on chips), testimonial prompt no longer wraps to 2 lines (shorter copy + non-wrapping link).
Contribute system, blog, completion tracking, fullscreen, modal swap
v0.4May 8, 2026
- /contribute/ hub with eight Web3Forms-backed forms: quote, book, parable, idiom, poem, drill, testimonial, thanks-note
- Smart /thank-you/ confirmation page tailors its message based on ?for=<kind>
- /reviews/ and /thanks-wall/ public pages -- approval-required curation via _data/reviews.js and _data/thanks_notes.js
- Per-corpus 'Suggest a...' CTAs at the bottom of /quotes/, /idioms/, /parables/, /poetry/, /library/, /drills/
- Megamenu and footer gained a Contribute column
- Post-session inline 'Leave a testimonial' prompt after 10+ lifetime sessions, dismissable
- /blog/ launched with Atom RSS at /feed.xml, tag pages, sticky TOC, reading-progress bar, social share, drop cap, prev/next nav
- Three starter posts: contribute system, completion tracking, why no em-dash
- Completion tracking rewritten -- only items typed all-the-way-through (endCursor >= targetLen) at >=80% accuracy mark complete
- Per-item and bulk reset on every corpus page (quotes, idioms, parables, poetry) and book detail page
- corpusProgress slice on every profile mirrors bookProgress: { quote, idiom, parable, poem }
- Native confirm() and prompt() replaced site-wide with styled <dialog> modals -- focus-trapped, theme-aware, cancel auto-focused on destructive actions
- Em-dashes (--) replaced with ASCII double-hyphen across UI, content, lessons, drills, megamenu, and book ingest pipeline
- Paragraph breaks now visible during book typing -- engine renders each paragraph as a block element with one space char joining them
- Engine now exposes endCursor + targetLen + book mode in finish triggers
- Contextual back link above the typing surface -- 'Back to quotes / idioms / parables / poetry / book / lessons / custom'
- Attribution header above quote/parable/poem/idiom typing -- title, author, year, source, meaning
- Tab+Enter restart replaces Alt+R -- two-key combo prevents accidental restart and avoids NVIDIA overlay collision
- Header gained a Fullscreen button (Lucide maximize-2 icon) right of Settings, toggles native Fullscreen API
- Streak chip simplified -- 'X day' instead of 'X day streak'
- Footer fits all 7 columns on one row at >=1180px (container widens to 96vw, max 1480px)
- Home page typing surface restored -- daily quote is now typeable inline, finish jumps to /practice/ for full results
- Weak-keys widget on the results card now session-scoped (filters out chars not in the just-typed target)
- Fixed mode-best card overflow at narrow viewports (220px min, flex-wrap on values, ellipsis on long labels)
- Default preferences flipped -- virtual keyboard ON, finger colors ON (v3 -> v4 migration)
- Quotes page is full-width with 'Type this' + 'Save to collection' actions, Random quote button, no pangrams in quote data
Site named: GuerillaType
v0.3May 7, 2026
- New name: GuerillaType at guerillatype.com
- New brand mark, favicon set, and OG card
- Toolbar groups now have visible legends — Mode, Duration, Word count, Quote length
- Live stats: third metric label changes per mode (seconds left / words typed / complete %)
- Keyboard shortcuts overlay (press ? or Ctrl+/) with g-prefix navigation
- Daily streak chip in the header (when ≥ 1 day)
- Session WPM-over-time mini chart in the results card
- Sticky-TOC click now scrolls to the precise section (header offset accounted for)
- Lesson, drill, and adaptive sessions now save properly (auto-finish at end)
- Heatmap visualizes keys with ≥ 2 samples (was ≥ 5) so first sessions show data
Editorial pivot, megamenus, and informative pages
v0.2May 7, 2026
- New visual identity: warm-paper editorial palette, persimmon accent, Lora serif display
- Megamenu nav with categorized sub-links (Practice, Learn, Compete, Insights)
- Daily quote on the home page — one curated quote per visitor per day
- Lessons now genuinely restrict the typing surface to their declared key set
- Backspace in the engine no longer freezes the keystroke pipeline
- New informative pages: Features, Tech stack, Analytics, Cost — all with sticky TOCs
- About, FAQ, Privacy, Terms rewritten and migrated to article layout
Initial release
v0.1May 7, 2026
- Practice modes: time, words, quote, zen, custom, adaptive
- Adaptive engine with weak-key + bigram targeting
- Custom text upload and saved-text manager
- Stats dashboard: lifetime totals, trend chart, contribution grid, keyboard heatmap, per-key bars
- Eleven challenges shipped, including code mode and mountain climb
- Four keyboard layouts (QWERTY/Dvorak/Colemak/Workman) for heatmap rendering
- Profiles with JSON export/import. localStorage only, no accounts.