A personal content recommendation app that uses AI to suggest videos, articles, and podcasts based on your mood, interests, and preferences.
✨ AI-Powered Recommendations - Get personalized content suggestions using Google Gemini AI
🎭 Mood-Based Filtering - Choose your mood (tired, curious, motivated, relaxed, bored, chill) for better matches
💾 Save & Organize - Save content to categorized lists (listen, learn, knowledge, tomorrow, other)
📜 History Tracking - View your past recommendations and revisit them anytime
🔥 Trending Content - See what's popular right now (optional YouTube integration)
🔍 Search & Filter - Find saved content easily with search and tag filters
🎨 Modern UI - Clean, responsive design with dark mode support
🎉 Toast Notifications - Get instant feedback on your actions
⚡ Error Boundaries - Graceful error handling for a stable experience
- Next.js 15 with App Router
- React 19 for UI
- TypeScript for type safety
- Tailwind CSS 4 for styling
- Sonner for toast notifications
- Google Gemini API for AI recommendations
- YouTube API (optional) for trending content
- Node.js 20+ or Bun
- pnpm (recommended), npm, or yarn
- Google Gemini API key (required)
- YouTube API key (optional, for trending content)
- Clone the repository:
git clone <your-repo-url>
cd maintain-app- Install dependencies:
pnpm install- Create a
.env.localfile in the root directory:
GOOGLE_GEMINI_API_KEY=your_gemini_api_key_here
YOUTUBE_API_KEY=your_youtube_api_key_here # Optional- Run the development server:
pnpm dev- Open http://localhost:3000 in your browser
Go to Settings and add:
- Your name
- Hobbies and interests
- Programming languages you know
- Work context
- Favorite YouTubers
- Select your current mood
- Type what you're looking for (e.g., "40-minute coding tutorial")
- Get AI-powered suggestions tailored to you
- Click the "🔖 Save" button on any suggestion
- Choose a category (listen, learn, knowledge, tomorrow, other)
- Access saved content in the Saves page
- Go to History to see all your past recommendations
- Click to expand and view suggestions again
- Delete individual sessions or clear all history
- On the main page, view trending content
- Based on YouTube's trending videos (if API key is set)
- Falls back to curated suggestions if unavailable
src/
├── app/
│ ├── (components)/ # React components
│ │ ├── Chat-client.tsx
│ │ ├── LoadingSkeleton.tsx
│ │ ├── SuggestionCard.tsx
│ │ └── SidebarLink.tsx
│ ├── api/ # API routes
│ │ ├── history/ # History management
│ │ ├── likes/ # Like functionality
│ │ ├── profile/ # Profile management
│ │ ├── recommend/ # AI recommendations
│ │ ├── saves/ # Save functionality
│ │ └── trending/ # Trending content
│ ├── history/ # History page
│ ├── saves/ # Saves page
│ ├── settings/ # Settings page
│ ├── error.tsx # Error boundary
│ ├── global-error.tsx # Global error handler
│ ├── layout.tsx # Root layout
│ └── page.tsx # Home page
├── lib/
│ ├── profile.ts # Profile utilities
│ └── store.ts # File-based storage
└── types.ts # TypeScript types
- Go to Google AI Studio
- Create a new API key
- Add to
.env.localasGOOGLE_GEMINI_API_KEY
- Go to Google Cloud Console
- Create a project and enable YouTube Data API v3
- Create credentials (API key)
- Add to
.env.localasYOUTUBE_API_KEY
# Run development server
pnpm dev
# Build for production
pnpm build
# Start production server
pnpm start
# Run linting
pnpm lint- Uses Google Gemini 2.0 Flash model
- Considers your mood, profile, and message
- Fallback to saved content if AI is unavailable
- Parses JSON responses with tolerance for truncation
- Automatically saves all recommendation sessions
- Stores up to 50 recent sessions
- Shows relative time (e.g., "2h ago")
- Expandable to view full suggestions
- Search by title, creator, or description
- Filter by multiple tags
- Sort by newest, oldest, or relevance
- Shows result count
- Fetches from YouTube API when available
- Falls back to curated suggestions
- Categorized by gaming, music, news, etc.
- Refreshes on page load
This is a personal project, but suggestions and feedback are welcome!
MIT