A comprehensive productivity and collaboration application built with React, TypeScript, and modern web technologies. Features real-time collaboration, video calling, task management, focus tools, and more.
- Dynamic backgrounds from Unsplash
- Live weather with location detection
- Daily inspirational quotes
- Customizable settings with dark/light themes
- Smart caching for performance
- Event creation and management
- Calendar integration with React Day Picker
- Filter by timeframes (today, this week, month, etc.)
- Recurring event support
- Priority levels and categories
- Pomodoro technique implementation
- Customizable work/break intervals
- Session tracking and statistics
- Background sound effects
- Goal setting and achievements
- Real-time collaborative drawing
- Multiple tools (brush, eraser, shapes)
- Live cursor tracking between users
- Stroke synchronization via Supabase
- Mobile touch optimized drawing
- Canvas export functionality
- Rich note-taking with Markdown support
- Drag & drop organization via DnD Kit
- Search and filter capabilities
- Statistics and quick actions
- Local storage persistence
- Export functionality
- HD video conferencing via Whereby
- Device selection (camera, microphone, speaker)
- Real-time device switching
- Screen sharing capabilities
- Mobile optimized interface
- Frontend: React 19, TypeScript, Vite
- Styling: Tailwind CSS, Framer Motion
- State Management: Zustand
- Routing: React Router DOM
- Database: Supabase (PostgreSQL)
- Real-time: Supabase Realtime + PartyKit
- Video: Whereby Browser SDK
- Deployment: Netlify
- Node.js 18.20.8+ (LTS recommended)
- npm 10.8.2+
- Supabase account and project
- Whereby account and API key
- Unsplash API access (optional, has fallbacks)
git clone <repository-url>
cd playgroundnpm installCopy the example environment file:
cp env.example .envEdit .env with your API keys:
# Whereby API Configuration
VITE_WHEREBY_API_KEY=your_whereby_api_key_here
# Unsplash API Configuration (optional)
VITE_UNSPLASH_KEY=your_unsplash_access_key_here
# Default Whereby Room URL
VITE_DEFAULT_ROOM_URL=https://yourdomain.whereby.com/your-room-name
# Supabase Configuration
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_KEY=your_anon_public_key_here- Create a new Supabase project
- Go to SQL Editor in your Supabase dashboard
- Run the SQL script from
supabase-schema.sql - Ensure Real-time is enabled for the tables
npm run devVisit http://localhost:5173
- Create account at supabase.com
- Create new project
- Get your project URL and anon key from Settings > API
- Run the SQL schema from
supabase-schema.sql - Enable Real-time for
canvas_strokesandcanvas_cursorstables
- Sign up at whereby.com
- Get API key from Developer Console
- Create rooms via their API or dashboard
- Add your room URL to environment variables
- Create developer account at unsplash.com/developers
- Create new application
- Get your Access Key
- Note: App has fallback images if API is unavailable
playground/
βββ src/
β βββ components/ # Reusable UI components
β β βββ video/ # Video calling components
β βββ hooks/ # Custom React hooks
β βββ lib/ # External service integrations
β β βββ supabase.ts # Supabase client setup
β β βββ wherebyService.ts # Whereby integration
β β βββ canvasService.ts # Canvas collaboration
β βββ routes/ # Main application routes
β β βββ Now.tsx # Dashboard
β β βββ Next.tsx # Event planning
β β βββ Focus.tsx # Pomodoro timer
β β βββ Canvas.tsx # Collaborative drawing
β β βββ Notes.tsx # Note-taking
β β βββ Video.tsx # Video calling
β βββ state/ # Zustand stores
β β βββ canvas.ts # Canvas state
β β βββ events.ts # Events state
β β βββ focus.ts # Focus timer state
β β βββ notes.ts # Notes state
β βββ App.tsx # Main application component
βββ party/ # PartyKit real-time server
β βββ server.ts # WebSocket collaboration server
βββ public/ # Static assets
βββ supabase-schema.sql # Database schema
βββ netlify.toml # Deployment configuration
βββ package.json # Dependencies and scripts
- Canvas drawing syncs across all users in real-time
- Cursor tracking shows other users' positions
- Efficient updates with throttling for performance
- Conflict resolution for simultaneous edits
- Touch-friendly canvas drawing
- Responsive design for all screen sizes
- Optimized performance for mobile devices
- PWA capabilities with proper meta tags
- Smart caching for API responses
- Throttled updates for real-time features
- Optimized state management with Zustand
- Efficient re-renders with React 19 features
# Development
npm run dev # Start development server
# Building
npm run build # Production build with TypeScript check
npm run build:fallback # Alternative build method
npm run preview # Preview production build
# Code Quality
npm run lint # Run ESLint- Connect your GitHub repository to Netlify
- Set environment variables in Netlify dashboard
- Deploy automatically on push to main branch
Build settings:
- Build command:
./netlify-build.sh - Publish directory:
dist - Node version:
18.20.8
Set these in your deployment platform:
VITE_WHEREBY_API_KEY=your_production_key
VITE_UNSPLASH_KEY=your_production_key
VITE_DEFAULT_ROOM_URL=your_production_room_url
VITE_SUPABASE_URL=your_production_supabase_url
VITE_SUPABASE_KEY=your_production_supabase_key
The app includes comprehensive security headers via netlify.toml:
- Content Security Policy for external API access
- Permissions Policy for camera/microphone access
- XSS Protection and other security headers
- CORS configuration for all required domains
Build failures on Netlify:
- Use the custom
netlify-build.shscript - Check that all environment variables are set
- Try the fallback build command if needed
Supabase connection issues:
- Verify your project URL and anon key
- Check that RLS policies are properly set
- Ensure real-time is enabled for required tables
Video calling not working:
- Verify Whereby API key and room URL
- Check browser permissions for camera/microphone
- Ensure HTTPS connection (required for media access)
Canvas collaboration issues:
- Check Supabase real-time connection
- Verify database schema is properly applied
- Check browser console for WebSocket errors
- TypeScript for type safety
- ESLint for code quality
- Prettier for formatting
- Component-based architecture
- Zustand for global state
- Local state for component-specific data
- Persistent storage for user preferences
- Throttled updates for real-time features
- Memoized components where appropriate
- Lazy loading for route components
- Optimized images and assets
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This project is private and proprietary.
For issues and questions:
- Check the troubleshooting section above
- Review the project documentation
- Check browser developer console for errors
- Verify all environment variables are correctly set
Built with β€οΈ using modern web technologies