A Helldivers 2 stratagem input prop for cosplay, served as a static PWA via GitHub Pages. Designed to be strapped to a forearm in landscape orientation; the user enters directional codes with one hand while the display shows the matched stratagem.
Live URL: https://tjscooper.github.io/hellpad/
- Boot home screen — "PERSONAL HELLPAD SYSTEM" boot sequence with animated segmented progress bar (0→100%), skull-and-wings emblem, corner decorations matching the in-game wrist computer aesthetic
- Stratagem d-pad — four large white SVG arrow buttons on a blue radial-gradient panel, laid out in the inverted-T keyboard arrow key style (UP alone on top, LEFT/DOWN/RIGHT below)
- Live code matching — as directions are entered, the input strip filters to matching stratagems in real time; an invalid sequence auto-clears immediately
- Match flash overlay — full-screen overlay on exact match showing the stratagem icon (240px), name, directional code, and a 4-second countdown progress bar
- Stratagem icons — loaded from jsDelivr CDN (
cdn.jsdelivr.net/gh/nvigneux/Helldivers-2-Stratagems-icons-svg@master/), falls back to emoji if unavailable - Stratagem list panel — slides in from the right, shows all 69 stratagems with icons, codes, and category badges; filters live as codes are entered; tap any stratagem to preview it
- Audio feedback — Web Audio API beeps: ascending pitch per input, 3-tone chord on match, sawtooth error on invalid
- Haptic feedback —
navigator.vibratepatterns on input, match, and error - Landscape orientation — manifest sets
"orientation": "landscape"; d-pad scales to fill the available landscape height - Fullscreen PWA — manifest
"display": "fullscreen"; works as an Add to Home Screen app on iOS and Android - Keyboard support — arrow keys or WASD + Backspace/Escape/Delete
69 stratagems across 9 categories:
| Category | Count |
|---|---|
| Mission | 10 |
| Orbital | 12 |
| Eagle | 7 |
| Support (weapons) | 17 |
| Backpack | 7 |
| Emplacement | 4 |
| Mines | 3 |
| Sentry | 7 |
| Exosuit | 2 |
Data is hardcoded in index.html as the S array. Each entry: {n: name, c: category, k: code_array}.
Icon paths are in the ICONS object, mapped by stratagem name to a path within the nvigneux icon repo.
Single-file app — everything lives in index.html. No build step, no dependencies, no framework.
hellpad/
├── index.html # entire app (HTML + CSS + JS, ~700 lines)
├── manifest.json # PWA manifest (landscape, fullscreen)
├── README.md
├── CLAUDE.md # instructions for future AI sessions
└── .github/
└── workflows/
└── deploy.yml # GitHub Actions → GitHub Pages on push to main
- Home screen (
#home-screen) — shown on load, fixed overlay z-index 1000; boot animation runs via IIFEbootAnim(); tap anywhere or ▶ FAB to launch keypad - Keypad (
#app) — startsdisplay:none, shown byshowKeypad()
| ID | Purpose |
|---|---|
#home-screen |
Boot/home screen overlay |
#app |
Keypad shell (flex column) |
#strip |
Top input strip (46px) |
#strip-arrows |
Mini SVG arrows for current input |
#strip-status |
Match count / stratagem name |
#dpad-bg |
Blue radial-gradient d-pad container |
#dpad-grid |
3×2 CSS grid (inverted-T layout) |
#flash |
Full-screen match overlay (z-index 10000) |
#flash-bar |
Countdown progress bar inside flash |
#list-panel |
Slide-in stratagem list (z-index 500) |
#fab |
List toggle FAB (bottom-right) |
#home-fab |
Screen nav FAB (bottom-left) |
| Name | Purpose |
|---|---|
inp |
string[] — current directional input ("U","D","L","R") |
resetTimer |
auto-clear timeout handle after a match |
onHome |
bool — which screen is active |
addDir(d) |
append direction, check for match/invalid, render |
clr() |
clear input and flash |
bksp() |
remove last direction |
getFiltered() |
stratagems whose code starts with current input |
getExact() |
stratagem whose code exactly equals current input |
showFlash(s) |
trigger the full-screen match overlay |
render() |
re-render strip, list, and match state |
showKeypad() / showHome() |
screen navigation |
toggleList() / closeList() |
list panel open/close |
bootAnim() |
IIFE on load — animates home screen progress bar |
| Event | Duration |
|---|---|
| Flash overlay visible | 4000ms |
| Flash countdown bar | 4000ms (CSS animation) |
| Auto-clear input after match | 4800ms |
| Boot progress bar | ~2500ms (random increments, 28ms interval) |
The d-pad scales to fill landscape height without overflowing width:
width: calc(min(100vw - 40px, (100dvh - 46px - 28px) * 3/2 + 20px));
height: calc(min(100dvh - 46px - 28px, (100vw - 40px) * 2/3 + 20px));https://cdn.jsdelivr.net/gh/nvigneux/Helldivers-2-Stratagems-icons-svg@master/{folder}/{name}.svg
Folders: General Stratagems/, Orbital Cannons/, Bridge/, Hangar/, Patriotic Administration Center/, Engineering Bay/, Robotics Workshop/, Urban Legends/. Spaces are encodeURIComponent-encoded in the URL.
GitHub Actions (deploy.yml) deploys to GitHub Pages automatically on every push to main. Uses the official actions/upload-pages-artifact + actions/deploy-pages workflow. No build step — the root directory is uploaded as-is.
To trigger a redeploy: push any commit to main, or re-run the workflow from the Actions tab.
Edit the S array in index.html:
{n:"Stratagem Name", c:"Category", k:["U","D","L","R", ...]},Add an icon mapping to the ICONS object:
"Stratagem Name": "Folder Name/File Name.svg",Valid categories: Mission, Orbital, Eagle, Support, Backpack, Emplacement, Mines, Sentry, Exosuit.