No description
- TypeScript 98.8%
- Dockerfile 0.9%
- CSS 0.2%
| .claude | ||
| app | ||
| components | ||
| data | ||
| lib | ||
| prisma | ||
| .env.example | ||
| .eslintrc.json | ||
| .gitignore | ||
| docker-compose.yml | ||
| docker-entrypoint.sh | ||
| Dockerfile | ||
| global.d.ts | ||
| log.txt | ||
| middleware.ts | ||
| next-env.d.ts | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
Personal IT Freelancer MVP
Custom MVP website for a single IT freelancer. Built with Next.js App Router, TypeScript, Tailwind CSS, PostgreSQL, Prisma, Zod, and simple custom admin authentication.
Features
- Public service website with home, services, pricing, about, contacts, request, and policy pages
- Request form with Zod validation, honeypot spam protection, and basic in-memory rate limiting
- PostgreSQL persistence via Prisma
- Protected admin area with login, dashboard, order list, filters, search, and order updates
- Static service catalog aligned with a future database-backed
Servicemodel - Basic SEO metadata,
robots.txt, and sitemap support
Project Structure
app/Next.js App Router pages, layouts, metadata routes, and API routescomponents/Shared UI, public sections, forms, and admin componentsdata/services.tsStatic service source for MVPlib/Database, auth, session, validation, rate limiting, and utilitiesprisma/Prisma schema and seed script
Setup
- Install dependencies:
npm install
- Copy the environment template:
cp .env.example .env
- Start PostgreSQL:
docker compose up -d
- Generate Prisma client and run migrations:
npm run prisma:generate
npm run prisma:migrate -- --name init
- Seed services and the initial admin user:
npm run seed
- Start the app:
npm run dev
Main Commands
npm run dev
npm run build
npm run lint
npm run prisma:generate
npm run prisma:migrate
npm run prisma:deploy
npm run seed
Default Admin Credentials
Controlled through .env:
ADMIN_EMAILADMIN_PASSWORDADMIN_NAME
MVP Limitations
- Services are rendered from a static file on the public site, even though the Prisma
Servicemodel and seed data are already present. - Rate limiting is in-memory, so it resets on server restart and is not shared across instances.
- No client registration, online payments, marketplace features, or notification pipelines are included.
- Middleware checks for cookie presence; full session verification happens in server-side admin code and auth routes.
Recommended Next Steps
- Move public service reads from static data to Prisma once service management is needed in admin.
- Replace in-memory rate limiting with Redis or database-backed throttling.
- Add email or Telegram notifications for new requests.
- Add audit logging and password reset flow for admin authentication.