PayMe
PayMe is an open source, self-hosted payment profile platform.
A user creates a public profile page and publishes ways to receive money in one place: PayPal, crypto addresses, Revolut, bank transfer details, and optional social/contact links.
What PayMe Is
- Self-hosted first profile/presentation layer
- Minimal dashboard to manage profile data and payment methods
- Public profile pages at
/u/:username(and/@usernamerewrite) - Copy-first UX with QR code support for payment details
What PayMe Is Not
- Not a wallet
- Not a payment processor
- Does not hold funds
- Does not execute transactions
- Not a marketplace
- Not a social network
Tech Stack
- Next.js App Router + TypeScript
- Tailwind CSS
- PostgreSQL
- Prisma ORM
- Auth.js (credentials)
- Docker + docker-compose
Local Development
- Copy env file:
cp .env.example .env
- Install dependencies:
npm install
- Start PostgreSQL (Docker):
docker compose up -d db
- Run migrations and seed:
npm run db:migrate:dev
npm run db:seed
- Start app:
npm run dev
- Open
http://localhost:3000 - Avatar uploads are stored in
public/uploads/avatars.
Environment Variables
DATABASE_URL: PostgreSQL connection URLNEXTAUTH_SECRET: strong random secret for session/auth signingNEXTAUTH_URL: absolute app URL (for examplehttp://localhost:3000)NODE_ENV:developmentorproductionPORT: app port
Database Setup
- Prisma schema:
prisma/schema.prisma - Initial migration:
prisma/migrations/20260327133000_init/migration.sql - Seed inserts built-in themes (
terminal-dark,amber-paper)
Useful commands:
npm run db:generate
npm run db:migrate:dev
npm run db:migrate
npm run db:seed
Docker Deployment
- Copy env:
cp .env.example .env
- Set
NEXTAUTH_SECRETin.env. - Start services:
docker compose up --build -d
- Open
http://localhost:3000.
The app container runs npm run db:migrate before npm run start.
Avatar uploads are persisted in the avatar_uploads Docker volume.
Security Notes
- All important writes are server-side validated (Zod + method-specific checks)
- Input is normalized/sanitized to plain text presentation
- Authenticated routes are protected in middleware and server-side checks
- Public profile visibility can be disabled per profile
- Payment validation is basic format validation only (not account/wallet ownership verification)
- Add rate limiting at reverse-proxy or middleware level for production
Product Notes
- Username is normalized to lowercase and unique
- Payment methods are normalized in a separate table (not user columns)
- Ordering is deterministic via up/down controls and persistent sort order
Future Roadmap
- Richer social links management
- Profile verification model
- Public API
- Import/export
- Additional built-in themes
- Plugin architecture
Description
Open source, self-hosted platform for public payment profiles. Create a personal page with all your payment methods in one place, like PayPal, crypto, Revolut or bank transfer details, plus optional social/contact links. Built with Next.js, TypeScript and PostgreSQL.
https://payme.zvcloud.net
Languages
TypeScript
92.9%
CSS
5.4%
Dockerfile
0.7%
Shell
0.7%
JavaScript
0.3%