A full-stack investment-platform UI — built as an educational / portfolio demo.
Bilingual (ქართული · English) · React + TypeScript frontend · Express + Prisma backend
Meti is an educational / portfolio project that reproduces the look and flow of a daily-income investment platform. It exists to demonstrate full-stack engineering, not to take anyone's money.
- ❌ Not a real investment, financial product, brokerage, or service.
- ❌ No real money. Deposit addresses are fake placeholders — never send funds.
- 🔢 All packages, returns, and stats are fictional sample data.
Guaranteed daily returns like the ones shown here do not exist in real investing — they are the hallmark of Ponzi/HYIP scams. This repo is a UI/engineering exercise only.
A realistic, production-shaped app built end-to-end:
- 🌐 Bilingual UI (
ka/en) withreact-i18nextand a language switcher - 🔐 Auth — register / login / forgot-password with JWT + bcrypt password hashing
- 📦 Packages — a catalogue of sample plans with daily-income figures and ROI
- 📊 User dashboard — active packages, accrued income, history, referrals
- 💳 Deposit / withdraw flows — mocked end-to-end (fake wallet addresses, admin review)
- 👥 Referrals — invite codes and a referral-reward flow
- 🛠️ Admin panel — users, deposits, withdrawals, proofs, revenue, notifications
- ⏱️ Scheduled job — a daily-income cron that accrues package income
- 🔒 Hardening — Helmet security headers, rate limiting, Zod validation
| Layer | Tech |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, React Router v6 |
| i18n | react-i18next (ka / en) |
| Backend | Node.js, Express, deployed as Vercel serverless functions |
| Database | PostgreSQL via Prisma ORM |
| Auth | JWT (Authorization: Bearer), bcrypt |
| Jobs | Vercel Cron → api/cron/daily-income.ts |
| Security | Helmet, express-rate-limit, Zod |
meti/
├─ index.html
├─ vite.config.ts · tailwind.config.js · tsconfig*.json
├─ vercel.json # serverless routing + cron schedule
├─ .env.example # DATABASE_URL, JWT_SECRET, CRON_SECRET
├─ prisma/
│ ├─ schema.prisma # users, packages, deposits, withdrawals, referrals…
│ └─ seed.ts # seeds the sample packages
├─ api/ # Vercel serverless entry + cron
├─ server/ # Express app
│ ├─ routes/ # auth, user, packages, deposits, withdrawals, proofs, admin
│ ├─ services/ # income, deposits, scheduler
│ └─ lib/ # auth, prisma, security, referral, email…
└─ src/ # React app
├─ i18n/ # ka.json · en.json
├─ data/plans.ts # ⭐ sample package figures (edit here)
├─ lib/ # api client, constants, formatting
├─ store/ # AppContext
├─ components/ # Navbar, Footer, PlanCard, admin/…
└─ pages/ # Landing, Login, Register, Packages, Dashboard, admin/…
npm install
npm run dev # → http://localhost:5173# 1. Configure environment
cp .env.example .env # fill DATABASE_URL, JWT_SECRET, CRON_SECRET
# 2. Set up the database (PostgreSQL — Supabase / Neon / local)
npm run db:migrate # create tables
npm run db:seed # seed the sample packages
# 3. Run the API and the app
npm run server # Express API → http://localhost:4000
npm run dev # Vite app → http://localhost:5173Make a user an admin by setting role = 'admin' in the users table.
See BACKEND.md for the full API reference and money-flow notes.
Fictional demo figures from src/data/plans.ts — term grows by 10 days per tier;
total = daily × days, kept to a modest ~20–33% for the whole term.
| Package | Price (₾) | Daily (₾) | Days | Total (₾) | ROI |
|---|---|---|---|---|---|
| Start | 20 | 0.4 | 60 | 24 | 20% |
| Basic | 50 | 0.9 | 70 | 63 | 26% |
| Standard | 100 | 1.6 | 80 | 128 | 28% |
| Plus ★ | 300 | 4 | 90 | 360 | 20% |
| Bronze | 500 | 6.5 | 100 | 650 | 30% |
| Silver | 1,000 | 12 | 110 | 1,320 | 32% |
| Gold | 2,000 | 22 | 120 | 2,640 | 32% |
| Platinum | 5,000 | 50 | 130 | 6,500 | 30% |
| Diamond | 10,000 | 95 | 140 | 13,300 | 33% |
Edit the numbers freely in src/data/plans.ts.
npm run build # tsc + vite build → dist/
npm run preview # preview the production buildMeti is a demonstration project for learning and portfolio purposes only. It is not a real investment platform and must not be operated as one. Do not deploy it to solicit or accept real deposits — promising fixed daily returns on deposits is, in the real world, a form of investment fraud and is illegal in most countries, Georgia included.