# Interactive Africa 3D Discovery
**AFROFEST BOMA — Shuri's Lab**
A touchscreen installation that lets visitors travel from a 3D map of Africa into four
destinations: the Great Pyramids of Giza, Victoria Falls, the Serengeti and Kigali.
Built to run unattended at a public exhibition: fully offline, 60 FPS, and understandable
in about three seconds by an eight-year-old with no staff explaining it.
---
## Running it
```bash
npm install
npm run dev # development: normal window, DevTools, FPS overlay
npm run build # typecheck + production bundle
npm start # run the production bundle
npm run exhibition # production bundle in kiosk mode
npm run build:win # installer via electron-builder
```
Checks:
```bash
npm run typecheck # tsc over the node and web projects
npm run lint # eslint, zero warnings tolerated
npm run smoke # end-to-end: drives the real app, screenshots, measures FPS
```
`npm run smoke` needs a production build first. It walks the whole visitor journey in a
real Electron window, captures a screenshot at each step into `.smoke/`, reports frame
timing, and fails on any renderer console error. Run one destination with
`SMOKE_DESTINATION=giza npm run smoke`.
> On some shells `ELECTRON_RUN_AS_NODE=1` is set in the environment, which makes Electron
> boot as plain Node and the app never opens a window. If `npm run smoke` exits
> immediately, run it as `env -u ELECTRON_RUN_AS_NODE npm run smoke`.
## Exhibition mode
Kiosk is opt-in, so nobody gets trapped in it during development:
```bash
EXHIBITION=1 npm start # kiosk + fullscreen + no menu + no display sleep
npx electron . --kiosk # same, via a flag
npx electron . --fullscreen # fullscreen only, window chrome intact
```
`IDLE_RESET_SECONDS` controls attract mode (default 90; `0` disables). After that long
without input the app returns to the welcome screen, ready for the next visitor.
**Staff exit from kiosk mode: `Ctrl` + `Shift` + `Q`.** …