No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗The Maine Playweek is a showtimes website for movie theatres in Maine. Visitors can see what's playing near them, browse by theatre or by film, and find festival screenings. Each film also has its own static page for search engines and sharing.
It's a plain static site (HTML, CSS and JavaScript, with no build step) that reads its data from Supabase. Showtimes go in through an admin panel built into the site, usually by importing a CSV produced by the scrapers in scripts/.
theatre websites ──(npm run scrape)──> scraped-all-showtimes.csv
│
Admin panel: Import CSV, Save All Changes
▼
TMDb ──(daily GitHub Action)──────────> Supabase <── admin edits (films, theatres, promos, festivals)
│
┌──────────────────────────┴───────────────────────────┐
▼ ▼
index.html reads it live in the browser daily GitHub Action regenerates films/
(static film pages), commits to main
main deploys the site. Vercel serves it at https://showtimes.themaineplayweek.com, and GitHub Pages also publishes the root of main (https://iammisplaced.github.io/themaineplayweek/).films/ and commits them to main. Because of that bot commit, pull before you push.| Path | What it is |
|---|---|
index.html, css/styles.css, js/app.js | The site: the public views plus the admin panel |
js/shared.js | Helpers shared by the site and the scripts: Supabase URL and public key, dates and times, film slugs and ranking, showtime notes |
js/map-view.js | The theatre map in the Near You view |
js/admin-csv.js, js/admin-changes.js, test/ | The admin's showtimes CSV import, what a save sends and how the Save bar describes it, and their tests (npm test) |
admin-films.html, css/admin-films.css, js/admin-films.js | Admin film catalog page (staff favourites, featured films, ranking overrides) |
films/ | Static film pages, generated; don't edit by hand |
sitemap.xml | Generated with the film pages; robots.txt points to it |
data/film-pages-source.live.json | Snapshot of the Supabase data used for the last film-page build (generated); also the site's offline fallback |
data/film-pages-source.json | Sample input for building film pages without Supabase |
supabase/schema.sql | Database tables, security policies and save functions |
scripts/scrape-*.mjs, scripts/lib/scraper-utils.mjs | Showtime scrapers (see SCRAPER_GUIDE.md) |
scripts/generate-film-pages.mjs | Builds films/ |
scripts/enrich-tmdb-supabase.mjs | Fills film metadata in Supabase from TMDb (run by the daily Action) |
.github/workflows/ | The two daily Actions |
assets/, site.webmanifest | Icons, logos and images |
Any static file server works:
python3 -m http.server 8080
Then open http://localhost:8080. The local site reads and writes the live Supabase database, so changes you save locally are real.
The scripts need Node (version 24, see .nvmrc). Run npm install once.
Visitors get four views, and the site remembers the one they used last:
Showtimes that have already passed are hidden automatically. Premium showings show as a "Premium 7:00 PM" pill, and any showtime with a note shows it on hover or tap.
Click Admin at the bottom of the site and sign in with a magic link. Enter your email, click the link in the email, and you're back on the site, signed in. Admin accounts are Supabase Auth users.
Nothing is written to Supabase until you click Save. Until then, edits only live in your browser. The bar at the bottom of the panel says what a save would send ("Unsaved: 2 showtime days changed, 1 new film"), and an edit undone by hand doesn't count. Discard changes (click it twice) downloads the saved data again and drops everything unsaved.
What you can do in the panel:
This is the beginning of the README. Read the rest at the original. Read the full README ↗