Non-blocking. Share while free.
A serverless, WordPress-inspired CMS built on Next.js 15, optimized for Vercel's free tier.
| Layer | Technology |
|---|---|
| Framework | Next.js 15 (App Router) |
| Database | Neon PostgreSQL (Serverless) |
| ORM | Drizzle ORM |
| Auth | Auth.js v5 (Google OAuth) |
| Storage | Vercel Blob |
| Styling | Tailwind CSS |
| Deployment | Vercel (Free Tier) |
- Click the Deploy with Vercel button above
- Vercel will automatically provision:
- Neon PostgreSQL database
- Vercel Blob storage
- Configure Google OAuth credentials (see below)
- Deploy!
# Clone and install
git clone https://github.com/arinadi/AtechAsyncCMS.git
cd AtechAsyncCMS
npm install
# Link to Vercel project and pull env vars
vercel link
vercel env pull .env.local
# Push database schema
npx drizzle-kit push
# Start development server
npm run dev| Variable | Description | How to Get |
|---|---|---|
DATABASE_URL |
Neon connection string | Auto-provisioned by Vercel |
BLOB_READ_WRITE_TOKEN |
Vercel Blob token | Auto-provisioned by Vercel |
AUTH_SECRET |
Random 32+ char string | openssl rand -base64 32 |
AUTH_GOOGLE_ID |
Google OAuth client ID | Google Cloud Console |
AUTH_GOOGLE_SECRET |
Google OAuth secret | Google Cloud Console |
- Go to Google Cloud Console
- Create a new OAuth 2.0 Client ID
- Add authorized redirect URIs:
http://localhost:3000/api/auth/callback/google(development)https://your-domain.vercel.app/api/auth/callback/google(production)
- ✅ Whitelist-based Auth - Only invited users can login
- ✅ Setup Wizard - First-deploy admin configuration
- ✅ Admin Dashboard - Modern dark UI with stats
- ✅ Role-based Access - Admin & Author roles (with Invite System)
- ✅ Classic Editor - Tiptap-based with Image Resizing & Alignment
- ✅ Media Library - Vercel Blob management
- ✅ Global Settings - Site title & description management
- 🚧 Public Blog - ISR-powered (Phase 3)
We enable allowDangerousEmailAccountLinking: true in Auth.js. This is safe for ATechAsync CMS because:
- Invite-only / Whitelisted: Users cannot self-register freely.
- Admin-Controlled: User records are created by trusted Admins (or Setup Wizard) first.
- Verified Origin: Since the email record exists in the DB before login (created by Admin), we trust that the Google Account with the matching email belongs to the intended user.
src/
├── app/
│ ├── (admin)/ # Protected admin routes
│ ├── (public)/ # Public facing pages
│ └── api/ # API routes
├── components/ # React components
├── db/ # Drizzle schema & connection
└── lib/ # Utilities & auth config
npm run dev # Start dev server
npm run build # Push schema + production build
npm run db:push # Push schema to database
npm run db:studio # Open Drizzle Studio
npm run db:generate # Generate migration filesImportant: Run
npm run db:pushmanually before deploying if you have changed the database schema.npm run buildno longer runs this automatically to prevent deployment hangs.
- Local Machine: Run
npm run db:pushin your local terminal.- This connects to Neon DB (Remote) and updates the schema safely.
- Git Push: Once the DB is updated, commit and push your code.
git add . && git commit -m "update feature" && git push
- Vercel: Vercel deploys the new code, which is now compatible with the updated DB schema.
MIT