https://github.com/nithamitabh/dispatch
A CI/CD Newsletters for your Blog Apps,Enterprise Updates,Indie Hackers,Teams with Private repos
https://github.com/nithamitabh/dispatch
cicd mailservice mdx newsletters
Last synced: 29 days ago
JSON representation
A CI/CD Newsletters for your Blog Apps,Enterprise Updates,Indie Hackers,Teams with Private repos
- Host: GitHub
- URL: https://github.com/nithamitabh/dispatch
- Owner: nithamitabh
- Created: 2025-11-01T19:52:49.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-11-01T20:42:23.000Z (8 months ago)
- Last Synced: 2025-11-01T21:18:46.138Z (8 months ago)
- Topics: cicd, mailservice, mdx, newsletters
- Language: TypeScript
- Homepage: https://dispatch-silk.vercel.app
- Size: 114 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# β‘ Dispatch - CI/CD for Newsletters
> **Write in Markdown. Push to GitHub. We handle the rest.**
> Automate your newsletter publishing with GitHub integration.
[](https://nextjs.org)
[](https://supabase.com)
[](https://www.typescriptlang.org/)
[](https://tailwindcss.com)
---
## π Quick Start
```bash
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env.local
# Run development server
npm run dev
```
Open [http://localhost:3000](http://localhost:3000) to see the app.
---
## π¦ Tech Stack
- **Framework:** [Next.js 16](https://nextjs.org) (App Router)
- **Database & Auth:** [Supabase](https://supabase.com)
- **Styling:** [Tailwind CSS 4](https://tailwindcss.com)
- **Language:** TypeScript
- **Deployment:** [Vercel](https://vercel.com)
---
## πΊοΈ Development Roadmap
### π§± Phase 1 β Core Dashboard (Next.js + Supabase)
**Goal:** Basic user dashboard, login, and repo connection.
#### β
Completed Features
- [x] π¨ **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
- [x] π **GitHub OAuth Authentication**
- Login page with glassmorphism design
- OAuth integration via Supabase
- Loading page with real-time status updates
- Secure httpOnly cookie session management
- [x] π **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
- [x] π **Dashboard Layout**
- Sidebar navigation (Home, Publications, Settings)
- User profile display with GitHub username
- Stats cards with animations
- Recent publications list
- Getting started checklist
- [x] π° **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
- [x] βοΈ **Settings Page**
- Theme selector with preview cards
- Account settings section
- GitHub integration status
- Danger zone for account deletion
- [x] π― **User Experience**
- Smooth scrolling throughout app
- Loading states for async operations
- Clean error handling (no console logs)
- External features page redirect
#### π§ In Progress
- [X] π **Webhook URL Generation**
- Generate unique webhook endpoints per publication
- Display webhook setup instructions
- [X] πΎ **Token Storage**
- Store GitHub access_token securely in Supabase
- Encrypt sensitive tokens
#### π Remaining Phase 1 Tasks
- [X] β
**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
```sql
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
```sql
user_id uuid PRIMARY KEY REFERENCES auth.users
access_token text NOT NULL (encrypted)
created_at timestamptz DEFAULT now()
```
### `jobs` table (Phase 2)
```sql
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)
```sql
id uuid PRIMARY KEY
job_id uuid REFERENCES jobs
html_content text
metadata jsonb
created_at timestamptz DEFAULT now()
```
---
## π Environment Variables
```env
# 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
- **Live Demo:** [Coming Soon]
- **Features Documentation:** [https://dispatch-mdx.vercel.app/](https://dispatch-mdx.vercel.app/)
- **GitHub:** [Repository Link]
---
**Built with β€οΈ by the Dispatch team**