AI History Show
AI History Show
- Built an interactive front-end exhibition app for major milestones in AI history
- Designed for large-screen gallery displays with adaptive single-screen, mobile, and dual-screen layouts
- Uses Three.js for a 3D globe tied to event geography
- Supports Chinese/English runtime switching with bilingual milestone content
- Includes content-generation tooling, a local admin UI, deployment validation, Docker packaging, and CI-oriented quality checks
- GitHub
Table of contents
- Experience Goal
- Display Experience
- Content Model
- Internationalization
- Admin & Generation Workflow
- Layout & Interaction Engineering
- Quality & Deployment
- Technical Stack
Experience Goal
AI History Show is a museum-style timeline app rather than a conventional website. The goal is to present AI milestones as a spatial, visual exhibition:
- historical narrative organized by era
- event details with locations, people, quotes, images, and videos
- a globe-based geographic context for each event
- large-screen readability for live exhibition settings
- bilingual content for Chinese and English audiences
The project currently organizes 21 events across 4 categories:
| Category | Events | Timespan |
|---|---|---|
| Genesis of AI | 3 | 1950s-1970s |
| Neural Networks and Connectionism | 4 | 1980s-2000s |
| Deep Learning and Unified Paradigms | 7 | 2010s-2020s |
| Large Models and Scientific Intelligence | 7 | 2018-2025 |
Display Experience
The presentation layer includes:
- adaptive
index.htmlentry for single-screen, mobile, and ultrawide/dual-screen setups - fixed
dual-screen.htmlentry for exhibition hardware - Three.js globe rendering with event location markers
- keyboard navigation with left/right arrows
- touch swipe navigation for large interactive screens
- image viewer with fullscreen browsing
- embedded YouTube metadata and optional local commentary videos
- auto-play mode for dual-screen exhibition loops
The dual-screen path is designed for on-site display where the browser may be stretched across two physical screens or a GPU-composed ultrawide display.
Content Model
The data model separates curated source content from generated runtime data.
manage/catalog.js
manage/events.js
manage/figure-avatars.js
resources/videos/*.json
|
v
node manage/generate.js
|
v
milestones-data.js
catalog.js controls category order and which events appear. events.js contains the event-level content:
- year
- title
- location name, country, and coordinates
- description
- key figures and roles
- quotes and sources
- local image paths
- video ids
figure-avatars.js acts as a canonical registry for portraits, and scripts/report-figure-avatars.js can audit missing portrait metadata.
Internationalization
The app ships with built-in Chinese/English support:
- supported locales:
zhanden - default locale: Chinese
- active locale stored in
localStorageasai-history-locale - runtime language toggle in both single- and dual-screen layouts
- content fields can be plain strings or bilingual objects like
{ zh, en } - missing locale values fall back gracefully
This is important because the project is not simply translated at the UI-label level; milestone titles, descriptions, figure roles, quotes, and location fields can all carry bilingual content.
Admin & Generation Workflow
The local admin service is a lightweight content management tool:
npm run start:admin
It serves an admin page at http://localhost:3001/admin for editing categories and event content. After saving, the admin workflow regenerates milestones-data.js so the static exhibition page can refresh with updated content.
Security boundary:
- the static exhibition page can be hosted publicly
- the admin service has no authentication and is intended for local/protected use only
- deployment notes recommend SSH tunneling or Nginx Basic Auth if remote access is needed
Layout & Interaction Engineering
Adaptive Layout Routing
shared/layout-router.js decides whether the browser should use single-screen or dual-screen mode. It considers:
- explicit
?layout=singleor?layout=dualoverrides - viewport width
- aspect ratio
- coarse pointer detection for handheld devices
- stable dual-screen entry behavior
The dual-screen threshold is intentionally high so normal desktop windows stay in single-screen mode, while ultrawide exhibition layouts route to the dual-screen entry.
Swipe Navigation
shared/swipe-navigation.js implements pointer/touch navigation with guardrails:
- minimum horizontal swipe distance
- vertical-cancel threshold
- ignore selectors for controls, iframes, timeline elements, photo viewers, and videos
- support for touch, pen, and touch-emulated mouse contexts
- cleanup through a returned
destroy()method
That separation makes the gesture logic testable outside the full page.
Quality & Deployment
The project includes repeatable local and CI checks:
npm run quality
npm run validate:deployment
quality runs ESLint, Prettier format checks, and JavaScript tests. validate:deployment regenerates data, runs layout/swipe tests, starts the presentation and admin servers, and verifies HTTP startup behavior.
Container deployment is also supported:
docker build -t ai-history-show .
docker run --rm -p 8000:8000 ai-history-show
The deployment guide covers:
- static Nginx hosting
- Docker and Docker Compose
- PM2 for the admin service
- Gitee Pages as a quick demo option
- Windows dual-screen/kiosk presentation setup
- limitations of browser UI,
--app,F11, GPU display composition, and true ultrawide fullscreen
Technical Stack
- Frontend runtime: HTML5, CSS3, JavaScript ES6+
- 3D rendering: Three.js from CDN
- Content tooling: Node.js scripts
- Quality tooling: ESLint, Prettier, Node-based validation scripts
- Deployment: static server, Nginx, Docker, Docker Compose, optional PM2 admin process
The architecture keeps the exhibition itself static and portable, while using Node.js only for content generation, admin editing, and validation.