A full-stack platform for discovering and sharing authentic reviews of brands, products, and services.
- Write & browse reviews — Submit detailed reviews with star ratings (1–5), photos, and optional anonymity
- Brand profiles — Each brand has an aggregated rating, review count, and full review history
- Helpful votes — Upvote or downvote reviews as helpful/unhelpful
- Search — Find brands and reviews across the platform
- Authentication — Email/password signup or Google OAuth; JWT stored in HttpOnly cookies
- Image uploads — Attach multiple photos to any review, served via Cloudflare CDN
flowchart TD
User([User]) --> Auth{Signed in?}
Auth -- No --> Login[Sign up · Google OAuth]
Login --> Auth
Auth -- Yes --> Browse[Browse & Search Brands]
Browse --> Profile[Brand Profile\nAggregated rating · Review history]
Profile --> Review[Write a Review\nRating · Photos · Anonymous option]
Profile --> Vote[Vote a Review Helpful / Unhelpful]
Review --> CDN[Photos stored on Cloudflare CDN]
CDN --> Profile
| Layer | Technology |
|---|---|
| Frontend | Next.js 15 (App Router), React 18, Tailwind CSS, TypeScript |
| Backend | Express.js, TypeScript, Sequelize ORM |
| Database | PostgreSQL 13 |
| Storage | Cloudflare R2 (S3-compatible) |
| Auth | JWT, Google OAuth 2.0 (HttpOnly cookies) |
| Deployment | Docker, Docker Compose |
- Node.js 22+ (manual setup only)
- Docker & Docker Compose (recommended) or PostgreSQL 13+
1. Clone the repository
git clone https://github.com/your-username/veriview.git
cd veriview2. Configure environment variables
Create a .env file in the project root:
DATABASE_URL=postgresql://user:password@db:5432/veriview
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_DB=veriview
API_URL=http://backend:4000
NEXT_PUBLIC_API_URL=http://localhost:4000
PORT=4000
CLIENT_PORT=3000Create backend/.env for backend-specific vars:
JWT_SECRET=your_jwt_secret
BASE_URL=http://localhost:3000
# Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_AUTH_URI=https://accounts.google.com/o/oauth2/auth
GOOGLE_TOKEN_URI=https://oauth2.googleapis.com/token
GOOGLE_REDIRECT_URI=http://localhost:4000/api/auth/google/callback
GOOGLE_USERINFO_URL=https://www.googleapis.com/oauth2/v3/userinfo
# Cloudflare R2
CLOUDFLARE_ACCOUNT_ID=
CLOUDFLARE_ACCOUNT_HASH=
CLOUDFLARE_API_TOKEN=
CLOUDFLARE_URL=
CLOUDFLARE_IMAGE_DELIVERY_URL=
CLOUDFLARE_R2_PUBLIC_DOMAIN=
CLOUDFLARE_ACCESS_KEY_ID=
CLOUDFLARE_SECRET_ACCESS_KEY=
CLOUDFLARE_R2_BUCKET=
CLOUDFLARE_R2_ENDPOINT=3. Start all services
docker-compose up --build2. Configure environment variables
Backend — create backend/.env:
PORT=4000
DATABASE_URL=postgresql://user:password@localhost:5432/veriview
DB_HOST=localhost
JWT_SECRET=your_jwt_secret
BASE_URL=http://localhost:3000
# Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_AUTH_URI=https://accounts.google.com/o/oauth2/auth
GOOGLE_TOKEN_URI=https://oauth2.googleapis.com/token
GOOGLE_REDIRECT_URI=http://localhost:4000/api/auth/google/callback
GOOGLE_USERINFO_URL=https://www.googleapis.com/oauth2/v3/userinfo
# Cloudflare R2
CLOUDFLARE_ACCOUNT_ID=
CLOUDFLARE_ACCOUNT_HASH=
CLOUDFLARE_API_TOKEN=
CLOUDFLARE_URL=
CLOUDFLARE_IMAGE_DELIVERY_URL=
CLOUDFLARE_R2_PUBLIC_DOMAIN=
CLOUDFLARE_ACCESS_KEY_ID=
CLOUDFLARE_SECRET_ACCESS_KEY=
CLOUDFLARE_R2_BUCKET=
CLOUDFLARE_R2_ENDPOINT=Frontend — create frontend/.env.local:
NEXT_PUBLIC_API_URL=http://localhost:40003. Install dependencies and start
# Backend
cd backend
npm install
npm run dev
# Frontend
cd frontend
npm install
npm run dev- Frontend:
http://localhost:3000 - Backend:
http://localhost:4000
Note: Ensure the
rewritesdestination infrontend/next.config.tspoints tohttp://localhost:4000/api/:path*for local development.
MIT