Skip to main content

Repository layout

Monorepo: one top-level directory per deployable.

eacmlab/
├── client/ # Next.js 16 App Router (participant + admin UI)
├── server/ # Express 4 + Socket.IO + Prisma
├── docs-site/ # Docusaurus → docs.eacmlab.org
├── docs/ # Ops notes, nginx conf, deploy scripts (not the public site)
├── docker-compose.dev.yml
├── docker-compose.test.yml
├── docker-compose.prod.yml
└── .github/workflows/

Root package.json only orchestrates dev / build / start for client+server. It is not an npm workspaces root.

Client (client/src/)​

App Router (app/)​

RouteFileRole
/app/page.jsHome: join experiment / friends / solo
/surveyapp/survey/page.jsSurvey entry
/survey/[university]app/survey/[university]/page.jsUniversity experiment flow
/play/[roomCode]app/play/[roomCode]/page.jsFriends / solo play
/admin/loginapp/admin/login/page.jsAdmin login
/admin/dashboardapp/admin/dashboard/page.jsAdmin dashboard
/admin/simulations/[runId]app/admin/simulations/[runId]/page.jsSimulation run detail

Components (components/)​

Folder / filePurpose
home/Join flows, waiting room, solo practice
survey/Consent, SQ/EQ/StPSQ, exit survey, instructions
foraging/Foraging UI pieces
arithmetic/Arithmetic stress task UI
dashboard/Admin tabs (experiments, monitor, export, simulations, …)
ExperimentRouter.jsLoads current experiment for /survey/[university]
SinglePlayerForaging.js / MultiplayerForaging.jsGame shells

Context (context/)​

Root layout wraps: UserProvider → SocketProvider → ClientConstantsLoader.

  • UserContext.js — participant/admin user state
  • SocketContext.js — Socket.IO client
  • ClientConstantsLoader.js + client_constants.js — server-driven constants
  • ExperimentContext.js — exists; not mounted in root layout today

Server (server/src/)​

DirectoryPurpose
routes/authRoutes, adminRoutes, participantRoutes
controllers/HTTP handlers (auth, admin, experiment, survey, export, …)
services/RoomService, foraging save, export jobs, Empatica, simulations
socket/Socket.IO handlers + roomManager
game/ForagingGame, ArithmeticTest, BotManager, GameRegistry
data/Persistence helpers for foraging / practice / arithmetic
middleware/Auth, helmet/rate-limit/CORS, error handler, HTTP logger
config/Prisma client, room settings, server constants
utils/logger, env (Zod), errors, safeArithmeticEval, timers
simulation/Simulation queue / CSV helpers

Entry: server/index.js. Container start: server/entrypoint.sh (prisma migrate deploy then node index.js).

Docs vs docs-site​

PathRole
docs/Host Nginx config (docs/nginx/eacmlab.conf), deploy scripts, internal guides
docs-site/Public documentation site (this project)

Do not scaffold Docusaurus into docs/ — ops paths depend on that folder name.