Skip to content

nithamitabh/dispatch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

5 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

⚑ Dispatch - CI/CD for Newsletters

Write in Markdown. Push to GitHub. We handle the rest.
Automate your newsletter publishing with GitHub integration.

Next.js Supabase TypeScript Tailwind CSS


πŸš€ Quick Start

# Install dependencies
npm install

# Set up environment variables
cp .env.example .env.local

# Run development server
npm run dev

Open http://localhost:3000 to see the app.


πŸ“¦ Tech Stack


πŸ—ΊοΈ Development Roadmap

🧱 Phase 1 β€” Core Dashboard (Next.js + Supabase)

Goal: Basic user dashboard, login, and repo connection.

βœ… Completed Features

  • 🎨 Beautiful SaaS Landing Page

    • Hero section with animated gradients
    • Feature cards with hover effects
    • Responsive design with mobile menu
    • Stats showcase and "How It Works" section
  • πŸ” GitHub OAuth Authentication

    • Login page with glassmorphism design
    • OAuth integration via Supabase
    • Loading page with real-time status updates
    • Secure httpOnly cookie session management
  • πŸŒ“ Light & Dark Theme System

    • React Context with localStorage persistence
    • Amber/cream light theme + Cyan/blue dark theme
    • Theme toggle component with sun/moon icons
    • Smooth transitions across all pages
  • πŸ“Š Dashboard Layout

    • Sidebar navigation (Home, Publications, Settings)
    • User profile display with GitHub username
    • Stats cards with animations
    • Recent publications list
    • Getting started checklist
  • πŸ“° Publications Management

    • Create new publication (repo name + webhook secret)
    • Publications table with GitHub icons
    • Copy webhook URL button
    • Delete publication functionality
    • Empty state with CTA
  • βš™οΈ Settings Page

    • Theme selector with preview cards
    • Account settings section
    • GitHub integration status
    • Danger zone for account deletion
  • 🎯 User Experience

    • Smooth scrolling throughout app
    • Loading states for async operations
    • Clean error handling (no console logs)
    • External features page redirect

🚧 In Progress

  • πŸ”— Webhook URL Generation

    • Generate unique webhook endpoints per publication
    • Display webhook setup instructions
  • πŸ’Ύ Token Storage

    • Store GitHub access_token securely in Supabase
    • Encrypt sensitive tokens

πŸ“‹ Remaining Phase 1 Tasks

  • βœ… Basic Testing
    • Test GitHub OAuth flow end-to-end
    • Verify publication CRUD operations
    • Test theme persistence across sessions

βš™οΈ Phase 2 β€” Webhook Trigger (Fast + Reliable)

Goal: Receive GitHub push events and queue jobs.

🎯 Planned Features

  • πŸͺ Webhook Endpoint

    • /api/github/webhook route in Next.js
    • Validate GitHub signature using shared secret
    • Parse push event payload
  • πŸ“‹ Job Queue System

    • Create jobs table in Supabase
    • Insert job on push: { repo, commit, status }
    • Simple queue without QStash (Supabase as mini queue)
  • πŸ”” Event Processing

    • Detect MDX file changes in push events
    • Filter relevant commits
    • Queue processing jobs

🧠 Phase 3 β€” Processing Worker (MDX to Email HTML)

Goal: Process MDX β†’ HTML for email delivery.

🎯 Planned Features

  • ⏰ CRON Job / Worker

    • Vercel Cron Job or Next.js route
    • Run every few minutes
    • Pull next unprocessed job from jobs table
  • πŸ“ MDX Processing Pipeline

    • Fetch .mdx file from GitHub API
    • Parse using mdx-bundler
    • Sanitize HTML with DOMPurify
    • Inline CSS via juice
    • Save HTML to posts table
  • πŸš€ Job Status Updates

    • Update job status: pending β†’ processing β†’ completed
    • Error handling and retry logic
    • Webhook status notifications

πŸ—οΈ Project Structure

dispatch/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ (auth)/
β”‚   β”‚   β”œβ”€β”€ login/          # Login page with GitHub OAuth
β”‚   β”‚   └── loading/        # OAuth callback loading page
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”œβ”€β”€ auth/           # Authentication endpoints
β”‚   β”‚   β”œβ”€β”€ publications/   # Publications CRUD API
β”‚   β”‚   └── user/           # User profile API
β”‚   β”œβ”€β”€ dashboard/
β”‚   β”‚   β”œβ”€β”€ publications/   # Publications management
β”‚   β”‚   β”œβ”€β”€ settings/       # User settings
β”‚   β”‚   β”œβ”€β”€ layout.tsx      # Dashboard wrapper with sidebar
β”‚   β”‚   └── page.tsx        # Dashboard home
β”‚   β”œβ”€β”€ globals.css         # Global styles & theme
β”‚   β”œβ”€β”€ layout.tsx          # Root layout with theme provider
β”‚   └── page.tsx            # Landing page
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ ui/                 # Reusable UI components
β”‚   β”œβ”€β”€ header.tsx          # App header
β”‚   β”œβ”€β”€ theme-provider.tsx  # Theme context provider
β”‚   └── theme-toggle.tsx    # Theme switcher button
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ auth.ts             # Server-side auth helper
β”‚   └── supabaseClient.ts   # Supabase client config
└── public/                 # Static assets

πŸ—„οΈ Database Schema

publications table

id              uuid PRIMARY KEY
user_id         uuid REFERENCES auth.users
repo_name       text NOT NULL
webhook_secret  text
created_at      timestamptz DEFAULT now()

user_tokens table

user_id         uuid PRIMARY KEY REFERENCES auth.users
access_token    text NOT NULL (encrypted)
created_at      timestamptz DEFAULT now()

jobs table (Phase 2)

id              uuid PRIMARY KEY
publication_id  uuid REFERENCES publications
commit_sha      text NOT NULL
status          text DEFAULT 'pending'
created_at      timestamptz DEFAULT now()
processed_at    timestamptz

posts table (Phase 3)

id              uuid PRIMARY KEY
job_id          uuid REFERENCES jobs
html_content    text
metadata        jsonb
created_at      timestamptz DEFAULT now()

🌐 Environment Variables

# Supabase
NEXT_PUBLIC_SUPABASE_URL=your-project-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key

# GitHub OAuth (configured in Supabase)
# Callback URL: https://your-domain.com/api/auth/callback

🀝 Contributing

We welcome contributions! Here's how you can help:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Development Guidelines

  • Follow the existing code style (TypeScript + ESLint)
  • Add meaningful commit messages
  • Test your changes thoroughly
  • Update documentation as needed

πŸ“„ License

This project is licensed under the MIT License.


πŸ”— Links


Built with ❀️ by the Dispatch team

About

A CI/CD Newsletters for your Blog Apps,Enterprise Updates,Indie Hackers,Teams with Private repos

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published