▄▄
██
▄█▀▀▀ ▄█▀█▄ ▀▀█▄ ████▄ ▄████ ████▄ ████▄ ▄█▀█▄ ██ ██
▀███▄ ██▄█▀ ▄█▀██ ██ ▀▀ ██ ██ ██ ██ ██ ██▄█▀ ██ ██
▄▄▄█▀ ▀█▄▄▄ ▀█▄██ ██ ▀████ ██ ██ ██ ██ ▀█▄▄▄ ▀██▀█SearchNEU is the premier course information platform for Northeastern University.
The SearchNEU codebase is organized in a monorepo structure
searchneu/
├─ apps/
│ ├─ searchneu/ the main application
│ └─ docs/ documentation site
├─ packages/
│ ├─ db/ database schema
│ ├─ scraper/ scraper scripts and logic
│ └─ tsconfig/ combined typescript configuration
├─ compose.yaml docker compose spec
├─ package.json
├─ turbo.json
├─ pnpm-lock.yaml
├─ pnpm-workspace.yaml
├─ LICENSE
└─ README.mdThe Turborepo build system is used in order to manage packages and applications across the monorepo with the pnpm package management system.
SearchNEU is a TypeScript monorepo built on Turborepo
and pnpm workspaces, running on Node (see engines in
package.json).
- Next.js (App Router) with React 19
- Tailwind CSS v4 for styling, with Base UI for accessible component primitives
- Minisearch for client-side course search
- SWR for data fetching and better-auth for authentication
- Twilio for SMS course notifications
- Drizzle ORM against PostgreSQL
- Neon serverless Postgres in production; a Docker Postgres instance behind a Neon proxy for local development
- Zod for validating external and untrusted data
- TypeScript everywhere, with shared configs
in
packages/tsconfig - ESLint (flat config from
packages/eslint-config) and Prettier withprettier-plugin-tailwindcss - Docs built with Fumadocs
Make sure Docker is installed and running, then:
pnpm install # install dependencies (pnpm is the package manager)
turbo setup # creates .env files, starts the database, runs migrations
turbo dev # start the dev servers (app on http://localhost:3000)Apart from pnpm install, every workflow runs through turbo. turbo setup is
idempotent - re-run it any time (e.g. after restarting Docker).
Course catalog data is not seeded automatically (it requires a live Banner scrape). The app runs fine against an empty database; to populate courses:
turbo cli -- generate --terms=all # scrape Banner -> cache
turbo cli -- tools seed-config --seed # write static config
turbo cli -- upload --terms=all # load into the databaseFor app-specific details, see the README in each application under apps/.