- JavaScript 56%
- CSS 25.1%
- HTML 15.4%
- Python 2.8%
- Dockerfile 0.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| data | ||
| k8s | ||
| .dockerignore | ||
| .gitignore | ||
| app.js | ||
| Dockerfile | ||
| index.html | ||
| nginx.conf | ||
| README.md | ||
| styles.css | ||
moose-and-squirrel 🫎🐿️
Supernatural Across the Eras — an episode explorer for rewatches. Live at https://supernatural.inevitable.fyi
A static, no-build rewatch companion. The interactive era chart (adapted from FTWinchester's "Supernatural Across the Eras") sits on top of all 327 episodes; click any bar / season / vibe / guest character to find episodes to watch.
Run
python3 -m http.server 8765 # then open http://localhost:8765
Deploy anywhere static (Netlify, GitHub Pages, Render static site) — just upload the folder.
Features
- Interactive era chart (showrunners, arcs, villains, locations, home bases). Click to filter; shift-click to combine.
- Filters: seasons, curated "vibes" (comedy/meta, flashbacks, holidays, MOTW, milestones, Wayward Sisters…), guest character (from TVmaze guest-cast credits), min rating, sort, watched/unwatched.
- Full-text search across title, summary, and guest cast.
- Episode detail modal with "what's going on this season" context, guest cast, next-episode nav.
- Watched tracking (localStorage) and 🎲 Surprise me.
- Filter state lives in the URL hash — share links to a filtered view.
Data
data/episodes.json— from TVmaze (data/fetch_cast.pyregenerates guest cast;build_cast.pycompacts it).data/eras.js— the chart, transcribed. Edit to tweak eras.data/tags.js— hand-curated episode vibes. Add/adjust freely.
Deploy
Container: ghcr.io/jhgaylor/moose-and-squirrel (nginx, port 8080), built by .github/workflows/build.yml
on push to main, which then pins the new sha-* tag into k8s/deployment.yaml. home-cloud's Flux
reconciles k8s/ to https://supernatural.inevitable.fyi.
Analytics
PostHog (project "supernatural.inevitable.fyi", US cloud). Autocapture is off; pageviews plus explicit events:
era_selected, season_selected, vibe_selected, character_selected, searched, sort_changed,
filters_reset, surprise_me, episode_opened, watched_toggled, chart_toggled. See track() in app.js.