The Board is a private visual moodboard built with Next.js. It is designed for collecting reference images fast, organizing them into boards, tagging them, and arranging them either in a masonry gallery or on a freeform canvas.
Live app: the-board-ruby.vercel.app
- Creates local username/password accounts
- Stores users, boards, and image metadata in Postgres
- Stores uploaded image files in Vercel Blob
- Supports paste-to-upload image flow
- Organizes images into custom boards
- Adds and filters labels
- Includes search across boards and labels
- Switches between gallery view and canvas view
- Persists canvas position, size, and layering for each image
- Next.js 16
- React 19
- Auth.js / NextAuth v5
- Vercel Postgres
- Vercel Blob
- Tailwind CSS 4
- TypeScript
app/
page.tsx Main board UI
sign-in/page.tsx Sign-in page
sign-up/page.tsx Sign-up page
api/ Auth, viewer, images, folders
lib/
database.ts User and schema logic
image-db.ts Image and board persistence
scripts/
migrate-local-to-cloud.ts
npm installcp .env.example .env.localRequired values:
AUTH_SECRETorNEXTAUTH_SECRETPOSTGRES_URLBLOB_READ_WRITE_TOKEN
Optional Postgres values can also be provided if your Vercel project generated them:
POSTGRES_PRISMA_URLPOSTGRES_URL_NON_POOLINGPOSTGRES_USERPOSTGRES_HOSTPOSTGRES_PASSWORDPOSTGRES_DATABASE
npm run devOpen http://localhost:3000.
The current app uses local credentials auth, not Google OAuth.
- users sign up with a username and password
- passwords are stored as hashes
- sessions are handled through Auth.js
- user data is isolated per account
When a user uploads or pastes an image:
- The file is sent to the app
- The binary image is stored in Vercel Blob
- Metadata is written to Postgres
- The board can later update labels, board assignment, title, and canvas layout
This project includes a one-time migration for older local image data:
npm run migrate:local-to-cloud -- --email [email protected]It:
- upserts the target user
- migrates folders
- uploads local files to Blob
- inserts metadata into SQL
- skips already-migrated image IDs
npm run dev
npm run build
npm run start
npm run lint
npm run migrate:local-to-cloudThe intended deployment target is Vercel.
Before deploying:
- connect the correct repo to the Vercel project
- make sure the correct root directory is selected for the app
- set production environment variables
- confirm the production domain is attached to the correct project
After that:
npm run buildThen deploy through Vercel.