The website for Cornell GeoData, a student project team building low-cost instruments that measure a changing planet: soil and water sensors around Cayuga Lake, atmospheric profiling, and satellite ground-truthing for NASA's NISAR mission.
The site covers our projects and team, a posts and blog section, sponsorship information, and a live feed from the team's Air Quality Eggs.
Built with React 19, TypeScript and Vite.
npm install
npm run devThat serves the site at localhost:5173 with hot reload. Every page works except
the live sensor feed, which needs the API proxy below.
Other commands:
npm run build # production build into dist/
npm start # serve the production build
npm run lint # oxlint
npx tsc --noEmit # type-check (the build does not do this for you)index.html page shell: meta tags, Open Graph, JSON-LD
server.mjs production server, plus the sensor API proxy
compress.mjs build step, writes .br/.gz alongside the bundle
src/
main.tsx entry point
App.tsx hash router, header and footer
pages/ one file per route
components/ shared widgets (the 3D globe, the alumni ball pit)
data/ all site content, edit here to change copy
lib/ framework-agnostic code (the three.js globe engine)
styles/ global CSS and shared type styles
public/ images, fonts, and the 3D model, served at the site root
To change what the site says rather than how it works, everything is in src/data/:
posts, privacy and terms text, the member roster, and projects.
dist/ is generated by the build and is not in the repo.
server.mjs proxies the Air Quality Egg API so the key stays server side. It needs
two environment variables:
EGG_SERIAL=<comma-separated egg serial numbers>
EGG_API_KEY=<key>Without them the endpoint returns a 503 and the sensors page shows an offline
message. In development, Vite proxies /api to port 4173, so run node server.mjs
alongside npm run dev to see live data.