Pebbled

January 25, 2026 · View on GitHub

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.

Tech Stack

  • 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

Project Structure

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

Getting Started

Prerequisites

  • Bun (v1.1+ recommended for backend)
  • Node.js (v18 or later for frontend tooling with npm)
  • A running Redis instance (for job queues)

Running Local Dependencies

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.

  1. 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
  2. To stop the services:

    docker-compose down
    

Installation

  1. Install dependencies (Bun workspaces):
    bun install
    

Configuration

Create a .env file in the backend directory by copying the .env.example and filling in the required values.

Running the Application

You can run both the frontend and backend concurrently.

  1. Run the Backend Server:

    bun run dev:backend
    
  2. Run the Frontend Development Server:

    bun run dev:frontend