An open-source web application that analyzes task-flow screen recordings with AI-powered UX evaluation. Upload a video and get detailed insights on interaction quality, usability issues, and improvement recommendations - 100% local, no cloud API costs.
- ๐น Video Upload: Drag & drop screen recordings (MP4, MOV, MKV up to 500MB)
- ๐ฌ Frame Extraction: Automatic keyframe detection at 2 FPS using ffmpeg
- ๐ค AI Analysis: Llama 3.2 Vision (11B) evaluates each frame against 7 UX rubric categories
- ๐ Real-time Progress: Live progress bar shows processing status
- ๐ Interactive Reports: Timeline view with scores, justifications, and recommendations
- ๐จ Dark Theme: Clean, minimal black UI
- ๐ Privacy-First: Everything runs locally - videos never leave your machine
- ๐ฐ Zero Cost: No API fees, completely open-source
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Frontend (Next.js) โ
โ http://localhost:3000 (Dark Theme) โ
โโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Processor (Node.js + Express) โ
โ http://localhost:3001 โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ ffmpeg โ โ Ollama โ โ Supabase โ โ
โ โ Frame Extractโ โ Llama Vision โ โ Storage โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Supabase (Local via OrbStack) โ
โ http://127.0.0.1:54321 โ
โ PostgreSQL + Storage + Real-time subscriptions โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Key Technologies:
- Frontend: Next.js 14, React, TailwindCSS (dark theme)
- Backend: Node.js, Express, ffmpeg
- AI: Ollama + Llama 3.2 Vision 11B (open-source, runs locally)
- Database: Supabase (PostgreSQL + Storage)
- Container: OrbStack (Docker alternative for Mac)
- Action โ Response Integrity: Do user actions get immediate, clear responses?
- Feedback & System Status Visibility: Is the user always informed about what's happening?
- Interaction Predictability & Affordance: Are interactive elements clear and behave as expected?
- Flow Continuity & Friction: Can users complete tasks smoothly without backtracking?
- Error Handling & Recovery: Are errors clearly communicated with recovery paths?
- Micro-interaction Quality (Polish): Are transitions smooth and focus management clear?
- Efficiency & Interaction Cost: Can users complete tasks with minimal clicks and effort?
- macOS (tested on macOS Sonoma+)
- Homebrew installed
- Node.js 18+ (
node --version) - OrbStack or Docker (for Supabase)
# 1. Clone the repository
cd "/Users/yourusername/Projects"
git clone https://github.com/yourusername/flowsense
cd flowsense
# 2. Install dependencies
npm install
# 3. Install system dependencies
brew install ffmpeg supabase/tap/supabase ollama
# 4. Start Ollama service and pull vision model (7.8 GB download)
brew services start ollama
ollama pull llama3.2-vision:11b
# 5. Start Supabase (via OrbStack/Docker)
supabase start
# 6. Create storage bucket
curl -X POST 'http://127.0.0.1:54321/storage/v1/bucket' \
-H "Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6ImI4MTI2OWYxLTIxZDgtNGYyZS1iNzE5LWMyMjQwYTg0MGQ5MCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MjA4NDQzMzMyMH0.DCUugYwr9IKz9H8M8oYH4QnB_mWgkmsHNZbo7fQe87RAIpm53U3NGlBh9dXhPsdiW79WDobh61mbyHxm0MbyiA" \
-H "Content-Type: application/json" \
-d '{"id":"videos","name":"videos","public":true}'
# 7. Configure environment variables (already set up in .env files)
# backend/.env - Already configured for local Ollama
# frontend/.env.local - Already configured for local Supabase
# 8. Start development servers (in separate terminals)
# Terminal 1 - Web App
cd frontend && npm run dev
# Terminal 2 - Processor
cd backend && npm run dev
# 9. Open your browser
open http://localhost:3000Test each component independently before running the full pipeline:
# Test upload โ frames โ Ollama on a single video
node scripts/test-step-by-step.js /path/to/your/video.mp4What it tests:
- โ Video file upload to Supabase Storage
- โ Frame extraction with ffmpeg (2 FPS)
- โ Ollama Vision model response time
- โ UX rubric analysis with JSON parsing
- โ Summary generation
Example output:
============================================================
[STEP 1] Video File Selection
โ
Video file found: recording.mp4
Size: 12.45 MB
[STEP 2] Upload to Supabase Storage
โ
Video uploaded successfully
Storage path: test-uploads/test-1234567890.mp4
[STEP 3] Extract Frames with ffmpeg
โ
Extracted 24 frames
Sample frames:
1. frame_0001.jpg (42.3 KB)
2. frame_0002.jpg (41.8 KB)
...
[STEP 4] Test Ollama Vision Model
โ
Ollama analysis successful
Duration: 3.2 seconds
Response: "This screenshot shows a web application..."
[STEP 5] Test UX Analysis with Rubric
โ
UX analysis successful
Duration: 12.5 seconds
Parsed scores:
cat1: 2/2
cat2: 1/2
cat3: 2/2
...
============================================================
Check all services are running:
./scripts/verify-uploads.shOutput:
===================================
FlowSense - Status
===================================
1. Services Status:
โ Web app running on http://localhost:3000
โ Processor running on http://localhost:3001
โ Supabase running on http://127.0.0.1:54321
2. Database Status:
Anonymous user: 1 profile(s)
Analysis runs: 3
3. Storage Status:
โ Videos bucket exists
Files in storage: 8
===================================
Open http://localhost:3000 to test
===================================
- Go to http://localhost:3000
- Enter analysis title (e.g., "Login Flow - v1")
- Select video file (MP4, MOV, MKV)
- Click "Start Analysis"
Real-time progress bar shows:
- 10%: Downloading video
- 20%: Extracting frames
- 40%: Uploading frames
- 60-90%: Analyzing keyframes with AI (updates per frame)
- 90%: Generating summary
- 100%: Complete!
- Click on completed analysis card
- See timeline with all keyframes
- Review rubric scores (0-2 for each category)
- Read AI justifications and suggestions
- Export JSON data
flowsense/
โโโ docs/ # Documentation
โ โโโ PROJECT_SUMMARY.md
โ โโโ ARCHITECTURE.md
โ โโโ QUICKSTART.md
โ โโโ DEPLOYMENT.md
โ โโโ VISION_PROMPT.md
โ โโโ FRONTEND.md
โ โโโ BACKEND.md
โโโ frontend/ # Next.js frontend
โ โโโ src/
โ โ โโโ app/
โ โ โ โโโ dashboard/ # Main dashboard
โ โ โ โโโ runs/[id]/ # Analysis detail view
โ โ โ โโโ api/ # API routes
โ โ โโโ components/
โ โ โ โโโ RunsList.tsx # Analysis list with progress
โ โ โ โโโ NewRunForm.tsx # Upload form
โ โ โโโ lib/
โ โโโ .env.local
โโโ backend/ # Node.js processor
โ โโโ src/
โ โ โโโ index.ts # Express server
โ โ โโโ processor.ts # Main pipeline logic
โ โ โโโ ffmpeg.ts # Frame extraction
โ โ โโโ vision.ts # Ollama integration
โ โ โโโ summary.ts # Summary generation
โ โ โโโ supabase.ts # DB client
โ โโโ .env
โโโ packages/
โ โโโ shared/ # Shared types & constants
โ โโโ src/
โ โโโ types.ts # TypeScript interfaces
โ โโโ schemas.ts # Zod validation
โ โโโ constants.ts # Rubric prompts, FPS, etc.
โโโ supabase/
โ โโโ migrations/ # Database migrations
โ โ โโโ 20240101000000_initial_schema.sql
โ โ โโโ 20240101000003_public_access.sql
โ โ โโโ 20240101000004_add_progress_tracking.sql
โ โ โโโ 20240101000005_remove_auth_constraints.sql
โ โโโ config.toml
โโโ scripts/ # Utility scripts
โ โโโ test-step-by-step.js
โ โโโ verify-uploads.sh
โ โโโ smoke-upload.sh
โโโ README.md
Edit packages/shared/src/constants.ts:
export const FRAME_EXTRACTION_FPS = 2; // Frames per second
export const KEYFRAME_DIFF_THRESHOLD = 0.15; // 15% pixel difference
export const MIN_KEYFRAME_DISTANCE_MS = 500; // Min 500ms between keyframesEdit backend/.env:
OLLAMA_URL=http://localhost:11434
VISION_MODEL=llama3.2-vision:11b # Or try llama3.2-vision:90b for better qualityEdit packages/shared/src/constants.ts โ VISION_MODEL_PROMPT to customize evaluation criteria.
# Check if storage bucket exists
curl -s http://127.0.0.1:54321/storage/v1/bucket/videos \
-H "Authorization: Bearer <service-key>"
# Recreate bucket if needed
curl -X POST http://127.0.0.1:54321/storage/v1/bucket \
-H "Authorization: Bearer <service-key>" \
-d '{"id":"videos","name":"videos","public":true}'# Install ffmpeg
brew install ffmpeg
# Verify installation
/opt/homebrew/bin/ffmpeg -version# Check if Ollama is running
curl http://localhost:11434/api/tags
# Start Ollama
brew services start ollama
# Pull vision model
ollama pull llama3.2-vision:11b
# Test Ollama directly
ollama run llama3.2-vision:11b "Describe this image"# Reset database and reapply migrations
cd supabase
supabase db reset# View real-time processor logs
tail -f /private/tmp/claude/-Users-aadith-Claude-Projects-flowsense/tasks/<task-id>.outputTypical Analysis Times (30-second video):
- Frame extraction: 5-10 seconds
- Frame upload: 10-15 seconds
- AI analysis (9 keyframes): 60-90 seconds total (~7-10 seconds per frame)
- Summary generation: 1-2 seconds
Total: ~90-120 seconds per video
Resource Usage:
- Ollama (Llama 3.2 Vision 11B): ~8 GB RAM, ~40% CPU during analysis
- Processor: ~200 MB RAM, ~10% CPU
- Web app: ~150 MB RAM
- Use shorter videos (10-30 seconds) for faster testing
- Record at lower resolution (720p) to reduce processing time
- Focus on key interactions - trim videos to just the task flow
- Restart Ollama if responses become slow:
brew services restart ollama - Monitor progress in real-time via the dashboard progress bar
- Compare multiple videos side-by-side
- Export PDF reports with screenshots
- Custom rubric categories
- A/B testing mode
- Shareable report links
- Video trimming before analysis
- Heatmap visualization of issues
MIT License - see LICENSE file for details
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Test thoroughly using
scripts/test-step-by-step.js - Submit a pull request
- Issues: Open an issue on GitHub
- Questions: Start a discussion
- Documentation: Check the
docs/folder
Built with โค๏ธ using open-source tools
No cloud APIs โข No subscriptions โข No data collection โข 100% local