About this project

ParkCore is a full-stack parking operations application aimed at owners of independent parking facilities. Its scope is deliberately narrow: running the day-to-day state of a lot rather than brokering bookings or handling money. The README states plainly that it is not a reservation marketplace or a payment platform. What it does - Public discovery: anyone can search and filter active parking facilities by address and hourly rate through a read-only catalog. - Parking lifecycle: owners manage their facilities and control whether each one is active, publicly visible, and open to new check-ins. - Session operations: check a vehicle in, watch active sessions, complete or cancel a stay, and review session history. - Vehicle recognition: license plates are normalized so a vehicle identity can be reused for repeat visits within a given parking. - Pricing snapshots: the hourly rate and currency are stored at check-in, so a completed total stays correct even if the facility's current configuration later changes. Engineering approach Domain rules live at the API boundary: a parking must be active to accept a check-in, and only its owner may operate the parking or its sessions. Capacity is protected against concurrent check-ins through serializable persistence work plus a database constraint, which also guards against duplicate active vehicles in the same parking. The web client is contract-driven: the TypeScript package @parkcore/api-client is generated from the API's OpenAPI artifact, and pnpm contract:check detects drift between API and client. The browser app does not import API internals or Prisma types; it talks to the API only through that generated client. Verification is split across system boundaries mentioned in the README: PostgreSQL-backed API tests for domain and persistence behavior, web tests for components and routes, Playwright for the owner workflow, and separate real-stack checks that can exercise the deployed system. Architecture and stack The flow is Browser to a Vercel-hosted web app (React/Vite plus the generated API client) to a Render API to Neon PostgreSQL. The API app owns authentication, domain rules, authorization and Prisma persistence. The web app owns public discovery and owner operations, using React Router for navigation and TanStack Query for server state. Tooling includes pnpm workspaces, Vitest, Playwright, ESLint, Prettier and Docker Compose; the API side uses Node.js, Express 5, Prisma, PostgreSQL, Zod and OpenAPI. Getting started Prerequisites are Node.js 24, pnpm 10 and Docker Desktop. After copying the provided .env.example files for the API and web apps, the documented sequence is pnpm install, pnpm docker:up, pnpm db:setup and pnpm dev. The API comes up on port 3000 and the web app normally on port 5173. Quality scripts cover formatting, linting, type checking, tests with coverage, a Playwright end-to-end run, contract checking and a build (which requires VITE_API_URL). Documentation in the repository covers project scope, architecture, development workflow, testing and deployment. Live demos of the web app and an API health endpoint are linked from the README.