The Escaping Things escape room team site, published at escape.thingelstad.com.
This is an Eleventy-powered static site built from a normalized Airtable dataset. The current site includes:
- 100 public rooms
- 94 played rooms and 6 scheduled rooms
- 9 countries
- typed entities for companies, locations, themes, players, awards, trips, lists, and experiences
- standalone featured pages for selected players, awards, and trips
- standalone list pages plus room/list/player/trip cross-linking
- Eleventy (11ty) v3
- Nunjucks templates
- Plain CSS and vanilla JavaScript
- Leaflet for maps
- Chart.js for stats
- Pagefind for site-wide search
- Tinylytics for analytics
- GitHub Pages via GitHub Actions
No framework, no client-side data fetching, no runtime backend.
Raw Airtable snapshots live in src/_data/airtable/ and are synced with:
npm run syncThe sync script pulls these Airtable tables:
CompaniesLocationsThemesPlayersAwardsTripsListsList ItemsRoomsExperiences
Those raw snapshots are normalized in src/_data/catalog.js through lib/catalog.js. The catalog is the canonical site data layer and exposes:
roomscompanieslocationsthemesplayersawardstripslistsexperiencesfeatured.playersfeatured.awardsfeatured.trips- lookup indexes by Airtable ID and slug
Each room carries resolved relations and derived fields such as:
- stable
Room ID - canonical room slug and permalink
officialUrlresolved byRoom URL -> Location URL -> Company URL- typed
players,awards,trips,lists, andthemes - nested
companyandlocation ratingSummaryfromExperiences
/home page/list/filterable room browser/map/filterable map/stats/stats and charts/featured/featured hub/trips/featured trip index/players/team roster and featured player index/room/<room-slug>//player/<slug>/for featured players/award/<slug>/for featured awards/trip/<slug>/for featured trips/lists/all public lists/list/<slug>/for standalone lists
Install dependencies:
npm installRun the local dev server:
npm startBuild the site:
npm run buildRefresh Airtable snapshots:
npm run syncRun tests:
npm testThe test suite covers:
- catalog normalization and data contracts
- fallback
officialUrlbehavior - hidden-room exclusion
- list and list-item relationship handling
- browser-level filter smoke tests using
jsdom
The sync script reads these environment variables:
AIRTABLE_PATAIRTABLE_BASE_IDIt also reads.envin the project root if present.
The site has two search mechanisms:
- Catalog filter on
/list/and/map/— structured dropdowns and text search over an embedded JSON index for instant client-side filtering - Site-wide search via Pagefind — full-text search across all rendered pages, accessible from the search icon in the nav bar. Pagefind indexes the built site as a post-build step and requires a full
npm run buildto generate the index.
Pushes to main trigger the GitHub Pages workflow in .github/workflows/deploy.yml.
Code is licensed under CC-BY-SA-4.0. Site content and underlying data are personal to the Escaping Things team.