Project Structure
Understanding the generated project structure helps you navigate and customize your application.
Standard Structure
All generated projects follow a consistent structure:
my-project/
├── .config/ # Plugin configuration
│ ├── admin-menus.json # Sidebar menu items
│ ├── settings.json # Plugin settings schemas
│ ├── providers.json # React context providers
│ └── css-variables.json # Theme variables
├── prisma/
│ ├── schema.prisma # Database schema
│ ├── migrations/ # Database migrations
│ └── seed.ts # Seed data
├── src/
│ ├── app/ # Framework app directory
│ ├── components/ # UI components
│ ├── lib/ # Utilities and helpers
│ └── plugins/ # Plugin code (isolated)
├── public/ # Static assets
├── .env.example # Environment template
├── autodeploy.config.json # Project configuration
├── package.json
└── tsconfig.json
Configuration Directory
The .config/ directory contains JSON files that plugins use to integrate with the system:
admin-menus.json
Defines admin sidebar navigation:
.config/admin-menus.json
{
"menus": [
{
"id": "dashboard",
"label": "Dashboard",
"icon": "LayoutDashboard",
"href": "/admin"
},
{
"id": "users",
"label": "Users",
"icon": "Users",
"href": "/admin/users"
},
{
"id": "settings",
"label": "Settings",
"icon": "Settings",
"children": [
{
"id": "general",
"label": "General",
"href": "/admin/settings"
},
{
"id": "plugins",
"label": "Plugins",
"href": "/admin/settings/plugins"
}
]
}
]
}
settings.json
Plugin settings schemas for the admin UI:
.config/settings.json
{
"auth-jwt": {
"schema": {
"tokenExpiry": {
"type": "string",
"label": "Token Expiry",
"default": "7d"
},
"refreshExpiry": {
"type": "string",
"label": "Refresh Token Expiry",
"default": "30d"
}
}
}
}
providers.json
React context providers to wrap the app:
.config/providers.json
{
"providers": [
{
"name": "AuthProvider",
"import": "@/plugins/auth-jwt/provider"
},
{
"name": "ThemeProvider",
"import": "@/plugins/theme/provider"
}
]
}
Database Layer
Prisma Schema
The unified database schema:
prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// Core models
model User {
id String @id @default(cuid())
email String @unique
password String
role Role @default(USER)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Plugin relations
sessions Session[]
orders Order[] // From ecommerce plugin
}
// Plugin models are merged in
model Session {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
token String @unique
expiresAt DateTime
}
Migrations
Prisma migrations track schema changes:
prisma/migrations/
├── 20240101000000_init/
│ └── migration.sql
├── 20240115000000_add_sessions/
│ └── migration.sql
└── migration_lock.toml
Application Code
Next.js Structure
src/app/
├── (auth)/ # Auth route group
│ ├── login/
│ │ └── page.tsx
│ └── register/
│ └── page.tsx
├── (dashboard)/ # Protected routes
│ ├── layout.tsx # Shared layout
│ └── dashboard/
│ └── page.tsx
├── admin/ # Admin routes
│ ├── layout.tsx
│ ├── page.tsx
│ └── users/
│ └── page.tsx
├── api/ # API routes
│ ├── auth/
│ │ ├── login/route.ts
│ │ └── register/route.ts
│ └── admin/
│ └── users/route.ts
├── layout.tsx # Root layout
└── page.tsx # Home page
Components
src/components/
├── admin/ # Admin-specific
│ ├── Sidebar.tsx
│ ├── Header.tsx
│ └── DataTable.tsx
├── ui/ # Base UI components
│ ├── Button.tsx
│ ├── Input.tsx
│ └── Card.tsx
└── forms/ # Form components
├── LoginForm.tsx
└── RegisterForm.tsx
Library Code
src/lib/
├── auth.ts # Auth utilities
├── db.ts # Database client
├── utils.ts # General utilities
├── validation.ts # Zod schemas
└── api/ # API helpers
├── client.ts
└── server.ts
Plugin Directory
Plugins are isolated in their own directories:
src/plugins/
├── auth-jwt/
│ ├── index.ts # Plugin entry
│ ├── provider.tsx # React provider
│ ├── hooks/
│ │ └── useAuth.ts
│ └── components/
│ └── AuthGuard.tsx
├── payments-stripe/
│ ├── index.ts
│ ├── webhook.ts
│ └── components/
│ └── CheckoutButton.tsx
└── analytics/
├── index.ts
└── components/
└── Dashboard.tsx
Static Assets
public/
├── favicon.ico
├── robots.txt
├── sitemap.xml
└── images/
└── logo.svg
Configuration Files
autodeploy.config.json
Project configuration:
autodeploy.config.json
{
"$schema": "https://autodeploybase.dev/schema.json",
"name": "my-project",
"version": "1.0.0",
"framework": "next",
"database": "postgresql",
"plugins": {
"auth-jwt": { "enabled": true },
"admin-dashboard": { "enabled": true }
}
}
TypeScript
tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"lib": ["dom", "ES2022"],
"moduleResolution": "bundler",
"strict": true,
"paths": {
"@/*": ["./src/*"]
}
}
}
Environment
.env.example
# Database
DATABASE_URL="postgresql://..."
# Authentication
JWT_SECRET="..."
# Plugin-specific
STRIPE_SECRET_KEY="..."
Customization Points
Safe to Edit
These files are yours to modify:
src/components/**- UI componentssrc/lib/**- Utility functionssrc/app/**- Pages and routespublic/**- Static assetsprisma/schema.prisma- Database models (extend, don't replace).env- Environment variables
Regenerated Files
These files may be overwritten on regeneration:
.config/**- Plugin configurationsrc/plugins/**- Plugin code
To preserve changes, use the --no-overwrite flag:
npx autodeploybase generate --no-overwrite
Or mark files with a comment:
// @autodeploy-preserve
// This file will not be overwritten