Technical problem
Viewers need eligible titles and valid !vote commands fast.
Movie library
Search public-domain titles, copy the exact !vote command, and return to Twitch chat with fewer typos.
Search title, year, runtime, or rating. Press Enter or jump to results, then copy the vote command.
Show matching resultsMovieBot system surface
Title/year/runtime/rating filters, copyable !vote buttons, lazy posters, labels, and a no-JavaScript list.
Viewers need eligible titles and valid !vote commands fast.
GitHub Pages page with external posters/IMDb links and no-JS/poster fallbacks.
Searchable catalog with metadata filters, generated vote commands, clipboard fallback, lazy posters, and noscript.
GitHub Pages is simple, but data and fallback markup must stay in sync.
Next: generate cards/fallback from one source, add poster health checks, and improve QA.
What I built
!vote commands with labels and feedback.noscript movie list.Uses IMDb links, hosted posters, and public-domain metadata; UI/search/copy behavior is custom client-side code.
Production readiness
Testing and QA notes
noscript completeness.Deployment and run notes
movie-library.js and fallback markup.python -m http.server 8000, then open /movie-library.html.Each card copies !vote Movie Title without retyping long titles.
Data includes title, year, runtime, IMDb rating/link, and poster URL.
If JavaScript is disabled, the ordered list remains readable.
Posters use fixed dimensions, async decoding, lazy loading, and fallback styling.
Technical notes
Vanilla JS filters by title/year/runtime/rating and updates an aria-live result count.
Each card stores a generated !vote. Copy uses Clipboard API, textarea fallback, and temporary states.
noscript keeps the full ordered list when filtering, copy, and posters are unavailable.
Poster URLs are normalized, constrained to the expected host, lazy-loaded, dimensioned, and fallback-styled.
Search has a label; copy buttons, IMDb links, and poster alt text are title-specific.
Catalog controls