LaunchDayOne uses Nuxt 4, Better Auth, Drizzle ORM, Nuxt UI, Zod, AWS S3, Pinia, and more.
Nuxt 4
Modern Vue.js framework with SSR, SSG, and ISR support. Configured with typed pages, cookie store, and dev logs.
Better Auth
Authentication system with email/password + social providers (Google, GitHub). Includes email verification flows.
LaunchDayOne follows Nuxt conventions with organized separation of concerns:
LaunchDayOne/
├── app/ # Application code
│ ├── assets/ # CSS, icons, images
│ ├── components/ # Vue components
│ ├── composables/ # Reusable composition functions
│ ├── layouts/ # Page layouts
│ ├── middleware/ # Route middleware
│ ├── pages/ # File-based routing
│ └── utils/ # App utilities
├── server/ # Server-side code
│ ├── api/ # API routes
│ ├── db/ # Database schema & client
│ ├── libs/ # Server libraries (auth, etc.)
│ ├── middleware/ # Server middleware
│ ├── tasks/ # Scheduled tasks
│ └── utils/ # Server utilities
├── shared/ # Shared between app & server
│ ├── schemas/ # Zod schemas
│ └── utils/ # Shared utilities
├── emails/ # Email templates
├── content/ # Nuxt Content docs
├── public/ # Static files
└── nuxt.config.ts # Nuxt configuration
postgres (PostgreSQL)server/db/schema/createSelectSchema for type-safe validationNitro storage abstraction handles file uploads:
s3 driverpublic/.tmp/Located in server/libs/auth/index.ts, Better Auth provides:
All environment variables are validated using Zod at startup in shared/libs/env.ts. This ensures type-safety and catches missing/invalid config before runtime.
const EnvSchema = z.object({
NODE_ENV: z.enum(['development', 'production', 'test']),
NUXT_PUBLIC_APP_NAME: z.string(),
DATABASE_URL: z.string(),
BETTER_AUTH_SECRET: z.string(),
// ...
})
const parseResult = EnvSchema.safeParse(process.env)
if (!parseResult.success) {
console.error(z.prettifyError(parseResult.error))
process.exit(1)
}
export default parseResult.data
Import and use validated env:
import env from '~~/shared/libs/env'
env.DATABASE_URL // Type-safe, guaranteed to exist
emails/ using Vue componentsConfigured in nuxt.config.ts under runtimeConfig.mail:
export default defineNuxtConfig({
runtimeConfig: {
mail: {
adminEmails: env.ADMIN_EMAILS,
from: {
email: process.env.NODE_ENV === 'development'
? 'no-reply@example.com'
: `no-reply@${env.NUXT_PUBLIC_APP_DOMAIN}`,
name: env.NUXT_PUBLIC_APP_NAME,
},
},
// ...
},
})
Nitro tasks run server-side on schedule:
export default defineNuxtConfig({
nitro: {
experimental: {
tasks: true,
},
scheduledTasks: {
[CRON_SCHEDULES_PRESET.EVERY_DAY]: ['liftBan'],
},
},
})
Task handlers in server/tasks/:
export default defineTask({
meta: {
name: 'liftBan',
description: 'Lift user bans',
},
async run() {
const result = await db.query.user.findMany({
where: and(
eq(tableUser.banned, true),
isNotNull(tableUser.banExpires),
lt(tableUser.banExpires, new Date().toISOString()),
),
})
// Lift expired bans...
return { result: userIds }
},
})
See Nuxt deployment docs for all hosting options.
@nuxt/ui - UI component library@nuxt/content - Markdown-based CMS@nuxt/image - Image optimization@nuxt/scripts - Third-party script loading@pinia/nuxt - State managementnuxt-email-renderer - Email templatingMost features can be removed by:
nuxt.config.tsapp/, server/package.json