A beautiful, full-stack web application built with Next.js 14 (App Router) and Appwrite for authentication, database, and file storage.
- Canvas-based freeform layout with dotted background
- Text Blocks: Editable inline, draggable, position saved to database
- Image Blocks: Upload images displayed in polaroid-style frames with tape decoration
- Dark/Light mode toggle
- Each user sees only their own moodboard
- Kanban board with 3 columns: Yet to Watch, In Progress, Watched
- Search movies via OMDb API (IMDb data)
- Display movie poster and IMDb rating
- Drag and drop between columns
- Personal rating (1-10 stars) for watched movies
- Username/Email + Password signup and login
- Protected routes with automatic redirect
- Session management via Appwrite
- Frontend: Next.js 14 (App Router), React 18, TypeScript
- Styling: Tailwind CSS + Custom CSS Variables
- Backend: Appwrite (Auth, Database, Storage)
- Drag & Drop: @hello-pangea/dnd
- Movie Data: OMDb API
npm install- Create an Appwrite project at cloud.appwrite.io
- Create a database
- Create two collections:
Moodboard Collection:
| Attribute | Type | Size |
|---|---|---|
| userId | String | 36 |
| type | Enum | text, image |
| content | String | 5000 |
| positionX | Integer | - |
| positionY | Integer | - |
| createdAt | DateTime | - |
Movies Collection:
| Attribute | Type | Size |
|---|---|---|
| userId | String | 36 |
| imdbId | String | 20 |
| title | String | 200 |
| poster | String | 500 |
| imdbRating | String | 10 |
| userRating | Integer | - |
| status | Enum | to_watch, watching, watched |
| createdAt | DateTime | - |
- Create a storage bucket named "images"
- Set permissions for collections and bucket:
- Users: Create, Read, Update, Delete (their own documents)
- Go to omdbapi.com
- Sign up for a free API key (1000 requests/day)
Create .env.local in the project root:
NEXT_PUBLIC_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
NEXT_PUBLIC_APPWRITE_PROJECT_ID=your_project_id
NEXT_PUBLIC_APPWRITE_DATABASE_ID=your_database_id
NEXT_PUBLIC_APPWRITE_MOODBOARD_COLLECTION_ID=your_moodboard_collection_id
NEXT_PUBLIC_APPWRITE_MOVIES_COLLECTION_ID=your_movies_collection_id
NEXT_PUBLIC_APPWRITE_STORAGE_BUCKET_ID=your_storage_bucket_id
NEXT_PUBLIC_OMDB_API_KEY=your_omdb_api_keynpm run dev- Push to GitHub
- Import to Vercel
- Add environment variables in Vercel dashboard
- Set custom domain to
notes.remiel.work
npm run buildsrc/
├── app/
│ ├── (auth)/ # Public auth pages
│ │ ├── login/
│ │ └── signup/
│ ├── (protected)/ # Protected app pages
│ │ ├── layout.tsx # Auth check + navigation
│ │ ├── moodboard/
│ │ └── movies/
│ ├── globals.css
│ ├── layout.tsx
│ └── page.tsx
├── components/
│ ├── auth/
│ ├── moodboard/
│ ├── movies/
│ └── ui/
├── context/
│ ├── AuthContext.tsx
│ └── ThemeContext.tsx
├── hooks/
│ ├── useMoodboard.ts
│ └── useMovies.ts
├── lib/
│ ├── appwrite.ts
│ ├── auth.ts
│ ├── database.ts
│ ├── omdb.ts
│ └── storage.ts
└── types/
└── index.ts
MIT