Something is listening.
A teaser landing page featuring an animated WebGL particle background, dark/light theme support with Catppuccin colors, and email subscription capture.
- Nuxt 4 – Vue 3 meta-framework with SSR/SSG
- Tailwind CSS v4 – Utility-first CSS
- DaisyUI v5 – Component library for Tailwind
- Three.js – WebGL particle effects
- Cloudflare D1 – SQLite database with Drizzle ORM
- Bun – JavaScript runtime & package manager
# Install dependencies
bun install
# Start development server
bun run devOpen http://localhost:3000 to view the site.
| Command | Description |
|---|---|
bun run dev |
Start dev server with HMR |
bun run build |
Build for production |
bun run preview |
Preview production build |
bun run generate |
Generate static site |
bun run db:generate |
Generate DB migrations |
bun run db:migrate:local |
Apply migrations to local D1 |
bun run db:migrate:remote |
Apply migrations to remote D1 |
bun run db:studio |
Open Drizzle Studio |
The site supports dark and light themes using the Catppuccin color palette:
- Dark – Catppuccin Macchiato
- Light – Catppuccin Latte
Theme preference is persisted to localStorage and respects system preferences on first visit. The WebGL background particles also update their colors when the theme changes.
This project uses Trunk for linting and formatting:
trunk check # Run all linters
trunk fmt # Auto-format codeapp/
├── app.vue # Root layout with WebGL background
├── components/ # Vue components (EmailForm, ThemeToggle, etc.)
├── composables/ # Shared state (useTheme)
├── plugins/ # Client-side plugins
└── assets/css/ # Tailwind + DaisyUI theme configuration
server/
├── api/ # Nitro server routes (subscribe, unsubscribe, admin)
├── database/ # Drizzle schema definitions
└── utils/ # Server utilities (auth, rate limiting, db)
public/
└── images/ # Static assets
drizzle/ # Database migrations
MIT © 2025 Dave Williams