{"id":51744459,"url":"https://github.com/shivamrun/headless-waitlist","last_synced_at":"2026-07-18T17:12:17.422Z","repository":{"id":303181964,"uuid":"1014454361","full_name":"shivamrun/headless-waitlist","owner":"shivamrun","description":"Headless waitlist system with email validation and rate limiting.","archived":false,"fork":false,"pushed_at":"2026-04-10T14:48:43.000Z","size":61,"stargazers_count":69,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-12T19:18:58.774Z","etag":null,"topics":["arcjet","frontend","headless-waitlist","indiedev","nextjs","postgresql","resend","waitlist"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shivamrun.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-05T18:57:52.000Z","updated_at":"2026-04-10T19:49:54.000Z","dependencies_parsed_at":"2025-07-06T07:38:23.275Z","dependency_job_id":"dac3fd0d-c215-41a1-9933-ad9dcb09a01d","html_url":"https://github.com/shivamrun/headless-waitlist","commit_stats":null,"previous_names":["ashokasec/headless-waitlist","shivamness/headless-waitlist","osmocn/headless-waitlist","shivamrun/headless-waitlist"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/shivamrun/headless-waitlist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shivamrun%2Fheadless-waitlist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shivamrun%2Fheadless-waitlist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shivamrun%2Fheadless-waitlist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shivamrun%2Fheadless-waitlist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shivamrun","download_url":"https://codeload.github.com/shivamrun/headless-waitlist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shivamrun%2Fheadless-waitlist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35624649,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-18T02:00:07.223Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arcjet","frontend","headless-waitlist","indiedev","nextjs","postgresql","resend","waitlist"],"created_at":"2026-07-18T17:12:15.746Z","updated_at":"2026-07-18T17:12:17.417Z","avatar_url":"https://github.com/shivamrun.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Headless Waitlist\n\nA modern, production-ready waitlist system built with Next.js 15, TypeScript, and PostgreSQL. Perfect for indie hackers and startups looking to collect early user interest.\n\n## Features\n\n- **Built-in Security**: Arcjet integration for bot protection, rate limiting, and email validation\n- **Automated Emails**: Resend integration for instant confirmation emails\n- **Email Verification (Optional)**: Enable email verification links for double opt-in\n- **Persistent Storage**: PostgreSQL database with Drizzle ORM for reliable data storage\n\n## Tech Stack\n\n### Frontend\n- **Next.js 15** - React framework with App Router\n- **TypeScript** - Type-safe development\n- **shadcn/ui** - Beautiful, accessible UI components\n\n### Backend \u0026 Database\n- **PostgreSQL** - Robust relational database\n- **Drizzle ORM** - Type-safe database queries\n- **Arcjet** - Security \u0026 rate limiting\n- **Resend** - Transactional email service\n\n### Development Tools\n- **Biome** - Fast formatter and linter\n- **pnpm** - Fast, disk space efficient package manager\n\n## Architecture \u0026 Flow\n\nThis is a **headless waitlist system** that collects email addresses from potential users. Here's how it works:\n\n1. **User Submission**: Visitors enter their email on the landing page\n2. **Security Check**: Arcjet validates the email, blocks bots, and enforces rate limits\n3. **Database Storage**: Valid emails are stored in PostgreSQL with timestamps\n4. **Email Confirmation**: Resend sends an immediate welcome email\n5. **Local Storage**: Browser remembers submission to prevent duplicates\n\nThe system is designed to be **production-ready** with proper error handling, security measures, and scalable architecture. The waitlist component can be easily integrated into any Next.js project or used as a standalone service.\n\n## Setup Instructions\n\n### Prerequisites\n- Node.js 18+ \n- pnpm (recommended) or npm\n- Docker (for local database)\n\n### 1. Clone \u0026 Install\n```bash\ngit clone \u003cyour-repo-url\u003e\ncd waitlist-headless\npnpm install\n```\n\n### 2. Environment Setup\nCreate a `.env.local` file in the root directory:\n```env\n# Database\nDATABASE_URL=\"postgresql://ashokasec:ashokasec@localhost:5432/waitlist-db\"\n\n# Security (Get from https://console.arcjet.com)\nARCJET_KEY=\"your_arcjet_key\"\n\n# Email (Get from https://resend.com)\nRESEND_API_KEY=\"your_resend_api_key\"\n\n# App\nNEXT_PUBLIC_APP_URL=\"http://localhost:3000\"\nNODE_ENV=\"development\"\n\n# Email Verification (Optional)\n# Set to true to require users to verify their email address via a link\nEMAIL_VERIFICATION=true\n\n# JWT secret for signing email verification tokens (required if EMAIL_VERIFICATION=true)\n# Must be at least 8 characters\nJWT_SECRET=\"your_jwt_secret\"\n```\n\n### 3. Start Database\n```bash\n# Using Docker (recommended)\npnpm docker:up\n\n# Or use your own PostgreSQL instance\n```\n\n### 4. Setup Database Schema\n```bash\npnpm db:push\n```\n\n### 5. Run Development Server\n```bash\npnpm dev\n```\n\nVisit `http://localhost:3000` to see your waitlist in action!\n\n## Key Files Explained\n\n- **`components/waitlist-ui.tsx`** - The main waitlist component with form handling\n- **`app/api/submit-email/route.ts`** - API endpoint for email processing and (optionally) sending verification emails\n- **`app/_db/email-schema.ts`** - Database schema for email storage\n- **`lib/emails.ts`** - Email templates for confirmations and verification\n- **`lib/seo.ts`** - SEO and branding configuration\n\n### Quick Customization (Search TODO: in code)\nSearch TODO: in your editor to walk through all setup steps.\n\n![image](https://github.com/user-attachments/assets/3445200f-ecaf-4560-94c6-c3926ccd5e3c)\n\n### Customization Points\n1. **Styling**: Modify `components/waitlist-ui.tsx` for custom design\n2. **Email Templates**: Edit `lib/emails.ts` for branded emails and verification links\n3. **SEO**: Update `lib/seo.ts` with your product details\n4. **Database**: Extend `app/_db/email-schema.ts` for additional fields\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n**Made with ❤️ for the indie hacker community** \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshivamrun%2Fheadless-waitlist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshivamrun%2Fheadless-waitlist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshivamrun%2Fheadless-waitlist/lists"}