A single-page application to manage software releases with a step-by-step checklist.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Backend | Node.js, Express, TypeScript |
| ORM | Prisma |
| Database | PostgreSQL |
| Infra | Docker, docker-compose, Nginx |
docker-compose up --build- Frontend: http://localhost
- Backend API: http://localhost:3001
Prerequisites: Node 20+, a running PostgreSQL instance.
Backend
cd backend
cp .env.example .env # fill in DATABASE_URL
npm install
npx prisma db push # create tables
npm run dev # starts on :3001Frontend
cd frontend
npm install
npm run dev # starts on :5173, proxies /api → :3001cd backend
npm testTests require a live PostgreSQL database configured via
DATABASE_URL.
-- releases
CREATE TABLE "Release" (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
date TIMESTAMPTZ NOT NULL,
"additionalInfo" TEXT,
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
"updatedAt" TIMESTAMPTZ NOT NULL
);
-- release_steps
CREATE TABLE "ReleaseStep" (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"releaseId" UUID NOT NULL REFERENCES "Release"(id) ON DELETE CASCADE,
"stepIndex" INTEGER NOT NULL,
completed BOOLEAN NOT NULL DEFAULT false,
UNIQUE ("releaseId", "stepIndex")
);| Condition | Status |
|---|---|
| 0 steps completed | planned |
| 1–9 steps completed | ongoing |
| All 10 steps completed | done |
| # | Label |
|---|---|
| 0 | Code review completed |
| 1 | Unit & integration tests passing |
| 2 | Staging environment deployed |
| 3 | QA sign-off received |
| 4 | Documentation updated |
| 5 | Database migrations ready |
| 6 | Rollback plan prepared |
| 7 | Security review done |
| 8 | Stakeholder approval obtained |
| 9 | Production deployment scheduled |
Base URL: /api
| Method | Path | Description |
|---|---|---|
| GET | /releases |
List all releases |
| POST | /releases |
Create a new release |
| GET | /releases/:id |
Get a single release |
| PATCH | /releases/:id |
Update additional info |
| DELETE | /releases/:id |
Delete a release |
| PATCH | /releases/:id/steps/:stepIndex |
Toggle a step completed state |
{
"name": "v2.5.0",
"date": "2024-07-15T10:00:00.000Z",
"additionalInfo": "Optional notes"
}{ "additionalInfo": "Updated notes" }{ "completed": true }{
"id": "uuid",
"name": "v2.5.0",
"date": "2024-07-15T10:00:00.000Z",
"additionalInfo": null,
"status": "planned",
"createdAt": "...",
"updatedAt": "...",
"steps": [
{ "index": 0, "label": "Code review completed", "completed": false },
...
]
}-
Go to vercel.com and import this repository.
-
In the project settings, set Root Directory to
frontend. -
Vercel will auto-detect Vite. The
frontend/vercel.jsonconfigures:- Build command:
npm run build - Output directory:
dist - SPA rewrites (all routes →
index.html) - Long-term cache headers for hashed assets
- Build command:
-
Add the following Environment Variable in the Vercel dashboard:
Name Value VITE_BACKEND_URLhttps://your-backend-domain.com -
Deploy. Every push to
mainwill trigger an automatic redeploy.
Note: The
VITE_BACKEND_URLvariable is baked in at build time by Vite. Leave it empty (or unset) if the frontend and backend are served from the same origin.
-
Runtime: Node.js 20+
-
Start command:
npm start(runs compileddist/index.js) -
Required env vars:
Name Description DATABASE_URLPostgreSQL connection string (e.g. Neon, Supabase, Railway Postgres) PORTPort to listen on (defaults to 3001)