Live project: hackmate.app
Hackmate is a swipe-based matchmaking platform designed for founders and builders to meet potential co-founders, collaborators, and indie hackers.
Instead of social media profiles and endless bios, Hackmate focuses on skills, intent, and mutual interest. Users create lightweight profiles, swipe to express interest, and get matched in real time if there is mutual alignment.
The app was built to make collaboration faster and more intentional for startup ecosystems, hackathons, and builder communities.
- Users create a profile with their skills, experience, and goals.
- The app shows other profiles that can be swiped right (interested) or left (skip).
- When two users swipe right on each other, they instantly appear in a shared match queue.
- Matched users can view details and connect immediately.
This approach removes friction from networking by focusing only on aligned intent and relevant skills.
- Swipe-based discovery: Browse and evaluate potential collaborators quickly.
- Real-time matches: Matches appear instantly through a Redis-backed caching layer.
- Mutual-only visibility: Users only see interest if it is reciprocated, reducing pressure.
- Skill-focused profiles: Profiles highlight what users can do and what they have built.
- Low-latency infrastructure: Redis and WebSockets ensure fast responses for swipes and matches.
Frontend
- Next.js for the web application
- Tailwind CSS for styling
Backend
- PostgreSQL for structured data
- Redis for real-time caching and match detection
Infrastructure
- Vercel for hosting
- Redis running locally via Docker or in the cloud (Upstash, Aiven, etc.)
Purpose | Type | Key Format | Example |
---|---|---|---|
Likes Given | SET | likes:<user_id> |
Used to prevent duplicate swipes |
Match Queue | LIST | matches:<user_id> |
Stores mutual matches |
User Profiles | HASH | user:<user_id> |
Caches basic profile information |
Other matching logic, such as filtering, exclusions, and scoring, is handled through the backend services.
Clone the repository:
git clone https://github.com/dfordp/hackmate-rework.git
cd hackmate
Install dependencies:
npm install
Run Redis locally or connect to a cloud provider:
docker run -p 6379:6379 redis
Start the development server:
npm run dev
Environment configuration:
Create a .env
file based on .env.example
and configure:
REDIS_URL=redis://localhost:6379
DATABASE_URL=your_postgres_connection_string
DIRECT_URL=your_postgres_direct_connection_string
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_key
CLERK_SECRET_KEY=your_clerk_secret
NEXT_PUBLIC_CLOUDINARY_API_KEY=your_cloudinary_key
CLOUDINARY_API_SECRET=your_cloudinary_secret
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=your_cloudinary_cloud_name
docker-compose up --build
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up --build
docker-compose down
docker-compose down -v
The Docker setup includes 3 services:
- app - Next.js application (port 3000)
- postgres - PostgreSQL database (port 5432)
- redis - Redis cache (port 6379)
Update .env
file with your Clerk and Cloudinary credentials. The database and Redis URLs are pre-configured for Docker:
DATABASE_URL=postgresql://hackmate:hackmate_password@postgres:5432/hackmate?schema=public
REDIS_URL=redis://redis:6379
To access PostgreSQL directly:
docker exec -it hackmate-postgres psql -U hackmate -d hackmate
To access Redis CLI:
docker exec -it hackmate-redis redis-cli
# All services
docker-compose logs -f
# Specific service
docker-compose logs -f app
docker-compose logs -f postgres
docker-compose logs -f redis
# Check all containers are healthy
docker-compose ps
# Check PostgreSQL logs
docker-compose logs postgres
# Check app logs for database connection
docker-compose logs app
# Connect to PostgreSQL from your host
docker exec -it hackmate-postgres psql -U hackmate -d hackmate -c "SELECT version();"
# Check if database exists
docker exec -it hackmate-postgres psql -U hackmate -c "\l"
# List all tables (after migrations)
docker exec -it hackmate-postgres psql -U hackmate -d hackmate -c "\dt"
# Test the health endpoint (checks both DB and Redis)
curl http://localhost:3000/api/health
# Or in PowerShell
Invoke-WebRequest -Uri http://localhost:3000/api/health | Select-Object -Expand Content
# From your host machine (not in container)
npx prisma studio
# Access at http://localhost:5555
# Enter the app container
docker exec -it hackmate-app sh
# Inside container, test Prisma connection
npx prisma db execute --stdin <<< "SELECT COUNT(*) FROM \"User\";"
# Check migration status
npx prisma migrate status
# Watch PostgreSQL activity
docker exec -it hackmate-postgres psql -U hackmate -d hackmate -c "SELECT pid, usename, application_name, client_addr, state, query FROM pg_stat_activity WHERE datname = 'hackmate';"
If ports 3000, 5432, or 6379 are already in use, stop the conflicting services or modify the ports in docker-compose.yml
.
# Check if PostgreSQL is accepting connections
docker exec -it hackmate-postgres pg_isready -U hackmate
# View detailed PostgreSQL logs
docker logs hackmate-postgres -f
# Restart PostgreSQL container
docker-compose restart postgres
# Verify DATABASE_URL environment variable
docker exec -it hackmate-app printenv | grep DATABASE_URL
# Test connection from app container
docker exec -it hackmate-app npx prisma db execute --stdin <<< "SELECT 1;"
docker-compose down -v
docker-compose build --no-cache
docker-compose up
Planned features include:
- Role and interest-based filtering (e.g., designer, product, engineering)
- Matching based on timezone and geography
- Project pitch cards and lightweight portfolios
- Improved match feed and conversation prompts
Hackmate began as a side project to test whether swipe-style discovery could improve collaboration in builder communities. Contributions, ideas, and feedback are welcome. Open an issue, create a pull request, or reach out directly.
MIT License. Hackmate is open for experimentation, forking, and extension.