2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00
2026-03-27 19:35:14 +01:00

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 /@username rewrite)
  • 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

  1. Copy env file:
cp .env.example .env
  1. Install dependencies:
npm install
  1. Start PostgreSQL (Docker):
docker compose up -d db
  1. Run migrations and seed:
npm run db:migrate:dev
npm run db:seed
  1. Start app:
npm run dev
  1. Open http://localhost:3000
  2. Avatar uploads are stored in public/uploads/avatars.

Environment Variables

  • DATABASE_URL: PostgreSQL connection URL
  • NEXTAUTH_SECRET: strong random secret for session/auth signing
  • NEXTAUTH_URL: absolute app URL (for example http://localhost:3000)
  • NODE_ENV: development or production
  • PORT: 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

  1. Copy env:
cp .env.example .env
  1. Set NEXTAUTH_SECRET in .env.
  2. Start services:
docker compose up --build -d
  1. 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
Readme 156 KiB
Languages
TypeScript 92.9%
CSS 5.4%
Dockerfile 0.7%
Shell 0.7%
JavaScript 0.3%