Official website for Open Data Ensemble (ODE). Built with React, TypeScript, Next.js, and pnpm as a static site, independent of the mobile, desktop, and portal components.
Use Node.js 22.13+ and pnpm 11.1.2 (the package declares its pnpm version).
pnpm install
pnpm devOpen http://127.0.0.1:3000. The development server supports hot reload; stop it with Ctrl+C.
pnpm build
pnpm start:previewOpen http://127.0.0.1:4173. This serves the exported files in out/ on loopback only and automatically stops after one hour. The command prints its PID and a command to stop it sooner. Logs and the PID are in the ignored .preview/ directory. Run pnpm start:preview again after the preview expires. Rebuild after editing source files, or use pnpm dev for live development. pnpm start serves the same export on port 3000.
pnpm build writes a static site to out/. GitHub Pages can serve that folder.
- In the GitHub repository, open Settings → Pages.
- Set Source to GitHub Actions.
- Push to
main(or run the Deploy GitHub Pages workflow).
The workflow in .github/workflows/pages.yml builds the export and publishes it.
- Project site (
https://<user>.github.io/<repo>/): the workflow setsBASE_PATHto/<repo>so assets and routes resolve. - User site (
https://<user>.github.io/) or a custom domain: add the domain topublic/CNAME, or use a*.github.iorepo name. The workflow then builds with an empty base path.
To build the project-site layout locally:
BASE_PATH=/opendataensemble.org pnpm build
pnpm start:previewpublic/.nojekyll stops GitHub Pages from ignoring the _next folder.
pnpm lint
pnpm format:check
pnpm typecheck
pnpm build
pnpm exec playwright install chromium
pnpm testIf Google Chrome is already installed, skip the browser download:
PLAYWRIGHT_CHROMIUM_CHANNEL=chrome pnpm testTests automatically start and stop a local preview of out/ if one isn't already running. Browser tests cover desktop and mobile rendering, runtime errors, tabs and keyboard navigation, the offline/sync demo, dialog dismissal and focus restoration, FAQs, internal link targets, and horizontal overflow at seven viewport widths. Screenshots are written to .preview/; failure traces are under test-results/.
- Product copy follows this repository's offline-first, clearinghouse architecture. Documentation and community links use the public ODE website and GitHub.
- The interactive demo is a simulation, not a Formulus session. Sample observations live in React state only. Closing the dialog discards them; no observations are persisted or transmitted.
- Brand treatment and globe artwork are custom SVGs. Inter is stored in
app/fontsand served by this site; there are no runtime font services, trackers, API keys, or analytics. - Native dialogs and disclosure elements, accessible tabs, visible focus states, mobile navigation, a skip link, and reduced-motion styles are included.
pnpm buildwrites static HTML, CSS, and JS toout/. Serve that folder withpnpm start, or deploy it to GitHub Pages.
app/layout.tsx: document metadata, fonts, and global stylesapp/page.tsx: home routesrc/Home.tsx: home page content, product tabs, and calls to actionsrc/styles.css: design system, layouts, responsive styles, and demo stylingsrc/FieldGlobe.tsx/src/FieldGlobe.css: hero artwork and motionsrc/Demo.tsx: sample collection and simulated synchronizationsrc/Icons.tsx: local SVG iconography and the website's ODE wordmark symbolscripts/preview.mjs: static file server and time-limited local previewtests/website.spec.ts: browser smoke and interaction tests