Ansible-powered hosting automation with ZFS snapshots, backups, and one-command deployments.
👉 Get started: AnsiPress.com
- Node.js 18+
- npm or yarn
- A Neon database account (free tier available)
- A Resend account for emails (free tier available)
- Clone the repository:
git clone https://github.com/AnsiPress/AnsiPress.com.git
cd AnsiPress.com- Install dependencies:
npm install- Set up environment variables:
cp .env.example .env.localEdit .env.local and add your configuration:
- DATABASE_URL: Get from Neon dashboard
- RESEND_API_KEY: Get from Resend
- ADMIN_PASSWORD: Use bcrypt generator to hash your password
- ADMIN_API_KEY: Generate with
openssl rand -hex 32 - ADMIN_COOKIE_SECRET: Generate with
openssl rand -hex 32
- Generate database migrations:
npm run db:generate- Push migrations to database:
npm run db:push- (Optional) Seed the database with test data:
npm run db:seed- (Optional) Open Drizzle Studio to view your database:
npm run db:studionpm run devOpen http://localhost:3000 with your browser to see the result.
.
├── drizzle.config.ts # Drizzle configuration
├── next.config.ts # Next.js configuration
├── sentry.edge.config.ts # Sentry Edge config
├── sentry.server.config.ts # Sentry Server config
├── tailwind.config.ts # Tailwind CSS configuration
└── src/
├── app/
│ ├── (auth)/ # Authentication routes
│ ├── (dash)/ # Dashboard routes (Phase 2)
│ ├── (www)/ # Marketing site routes
│ └── api/ # API routes
├── components/ # React components
│ ├── admin/ # Admin dashboard components
│ └── ui/ # UI components (BrandLogo, etc.)
├── lib/
│ ├── db/ # Database schema and client
│ ├── email/ # Email templates and service
│ ├── auth.ts # Authentication utilities
│ └── rate-limit.ts # Rate limiting
├── instrumentation.ts # OpenTelemetry/Sentry instrumentation
└── instrumentation-client.ts
- Email collection with UTM tracking
- Email verification flow
- Unsubscribe functionality
- Rate limiting to prevent spam
- Welcome emails with verification links
- Admin notifications for new signups
- Weekly update emails (automated)
- Password-protected admin access
- API key authentication for admin routes
- Rate limiting (5 signups per IP per hour)
- Input validation with Zod
- CSRF protection
npm run db:generate- Generate migrations from schema changesnpm run db:push- Push migrations to databasenpm run db:studio- Open Drizzle Studionpm run db:seed- Seed database with test data
waitlist- User waitlist entriesemail_logs- Email sending logsenterprise_contacts- Enterprise contact form submissions
After modifying schema run:
npm run db:generate
npm run db:pushPOST /api/waitlist- Join waitlistGET /api/waitlist?email={email}- Check subscription statusPOST /api/verify- Verify email addressPOST /api/unsubscribe- Unsubscribe from waitlistPOST /api/contact- Submit enterprise contact request
GET /api/admin/waitlist- List all waitlist entriesPATCH /api/admin/waitlist/[id]- Update waitlist entryDELETE /api/admin/waitlist/[id]- Delete waitlist entryGET /api/admin/email-logs- View email historyGET /api/admin/stats- Get dashboard statistics
/admin- Dashboard (Coming Soon)/admin/waitlist- Waitlist management (Internal)
See DEPLOYMENT.md for detailed deployment instructions.
To learn more about the technologies used:
MIT