A full-stack application for creating, managing and browsing Pebbled Pebbles. Pebbles are promotional campaigns for Nostr notes that reward engagement and conversations.
The rewards are paid out automatically through NWC connections.
- Monorepo Management: npm workspaces
- Backend:
- Framework: Fastify
- Language: TypeScript
- ORM: Prisma
- Database: SQLite (for development)
- Nostr:
nostr-tools, NDK - Job Queues: BullMQ
- Frontend:
- Framework: React
- Build Tool: Vite
- Language: TypeScript
- Styling: Tailwind CSS, shadcn/ui
- State Management: Jotai
The project is structured as a monorepo with two main packages:
backend/: The Node.js server application.frontend/: The React client application.
pebbled/
├── backend/ # Fastify API and workers
├── frontend/ # React web client
└── package.json # Root package configuration
- Bun (v1.1+ recommended for backend)
- Node.js (v18 or later for frontend tooling with npm)
- A running Redis instance (for job queues)
The project requires a running Redis instance for development. A docker-compose.yml file is provided to easily start one. A local Nostr relay is also provided for local development.
-
Start the services in detached mode:
docker-compose up -d
This will start:
- Redis: Accessible on
localhost:6380 - Nostr Relay: Accessible on
ws://localhost:7777
- Redis: Accessible on
-
To stop the services:
docker-compose down
- Install dependencies (Bun workspaces):
bun install
Create a .env file in the backend directory by copying the .env.example and filling in the required values.
You can run both the frontend and backend concurrently.
-
Run the Backend Server:
bun run dev:backend
-
Run the Frontend Development Server:
bun run dev:frontend