A modern, production-ready asynchronous video interview platform built with React, TypeScript, and Supabase. Create video interview questions, share unique links with candidates, and collect video responses seamlessly.
- Secure Authentication: Email/password authentication with rate limiting
- Video Question Creation: Record or upload video questions (max 2 minutes)
- Multi-Question Interviews: Create comprehensive interview flows
- Unique Shareable Links: Generate secure URLs for candidates
- Response Management: View and organize candidate responses
- Real-time Dashboard: Track interview performance and metrics
- Simple Access: No account required, just use the shared link
- Video Responses: Record answers directly in the browser (max 1 minute)
- Progress Tracking: Clear indication of interview progress
- Mobile Friendly: Works on desktop, tablet, and mobile devices
- Enterprise Security: XSS protection, input validation, rate limiting
- Accessibility: WCAG 2.1 AA compliant with screen reader support
- Performance Optimized: Lazy loading, memoization, efficient rendering
- Error Resilience: Comprehensive error handling and recovery
- Type Safe: Full TypeScript implementation with strict mode
- Recruiter Dashboard: Secure authentication and question management
- Video Recording: Browser-based video recording with MediaRecorder API
- File Upload: Support for video file uploads (MP4, max 100MB)
- Unique Links: Generate shareable links for candidates
- Response Collection: Candidates record responses without authentication
- Modern UI: Clean, responsive design with Tailwind CSS
- React 18 - Modern React with hooks and concurrent features
- TypeScript - Full type safety and developer experience
- Tailwind CSS - Utility-first styling with custom design system
- Vite - Fast build tool and development server
- React Router - Client-side routing
- Supabase - PostgreSQL database with real-time features
- Supabase Auth - User authentication and authorization
- Supabase Storage - Secure video file storage
- Row Level Security - Database-level security policies
- Vitest - Fast unit and integration testing
- React Testing Library - Component testing utilities
- ESLint - Code linting with accessibility rules
- Prettier - Code formatting
- Husky - Git hooks for code quality
- MediaRecorder API - Native video recording
- getUserMedia - Camera and microphone access
- Web Storage - Local data persistence
- Node.js 18+ and npm
- Supabase account (free tier available)
- Modern browser with camera/microphone support
git clone <repository-url>
cd fk-videoask
npm install# Copy environment template
cp .env.example .env
# Edit .env with your Supabase credentials
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_keyRun the SQL migrations in your Supabase SQL editor:
-- Run files in supabase/migrations/ in order
-- Or use the Supabase CLI (if available)npm run devVisit http://localhost:5173 to see the application!
- Node.js 18+ and npm
- Supabase account
-
Clone the repository
git clone <repository-url> cd openvideo-ask
-
Install dependencies
npm install
-
Configure Supabase
- Create a new Supabase project
- Copy
.env.exampleto.envand fill in your Supabase credentials:VITE_SUPABASE_URL=your_supabase_project_url VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
-
Run database migrations
- In your Supabase SQL editor, run the migration file:
supabase/migrations/create_video_interview_schema.sql
- In your Supabase SQL editor, run the migration file:
-
Start development server
npm run dev
- Sign Up/Login: Create an account or sign in
- Create Questions: Record or upload video questions (max 2 minutes)
- Share Links: Copy the generated unique URL to share with candidates
- Review Responses: View candidate responses in your dashboard
- Access Question: Open the unique URL shared by the recruiter
- Watch Question: View the recruiter's video question
- Record Response: Record your video response (max 1 minute)
- Submit: Provide your email and submit the response
- questions: Stores video questions with metadata
- responses: Stores candidate responses linked to questions
- storage: Supabase storage bucket for video files
- Row Level Security (RLS) enabled on all tables
- Recruiters can only access their own questions and responses
- Public access for candidates to view questions and submit responses
- Secure video file storage with appropriate access policies
src/
βββ components/ # Reusable UI components
βββ hooks/ # Custom React hooks
βββ lib/ # Utility libraries (Supabase client)
βββ pages/ # Page components
βββ types/ # TypeScript type definitions
src/
βββ components/ # Reusable UI components
β βββ __tests__/ # Component tests
β βββ AuthForm.tsx # Authentication form
β βββ Dashboard.tsx # Recruiter dashboard
β βββ VideoRecorder.tsx # Video recording component
β βββ ...
βββ hooks/ # Custom React hooks
β βββ __tests__/ # Hook tests
β βββ useAuth.ts # Authentication hook
β βββ useToast.ts # Toast notifications
β βββ useVideoRecorder.ts # Video recording logic
βββ lib/ # External service clients
β βββ supabase.ts # Supabase client configuration
βββ pages/ # Page-level components
β βββ AuthPage.tsx # Login/signup page
β βββ ...
βββ types/ # TypeScript type definitions
β βββ index.ts # Shared types
βββ utils/ # Utility functions
β βββ __tests__/ # Utility tests
β βββ constants.ts # App constants
β βββ errorHandler.ts # Error handling utilities
β βββ security.ts # Security utilities
β βββ validation.ts # Input validation
βββ test/ # Test utilities and setup
βββ setup.ts # Test environment setup
βββ utils/ # Test helper functions
Records video using the MediaRecorder API with comprehensive error handling.
<VideoRecorder
maxDuration={120}
onVideoReady={(blob) => handleVideo(blob)}
onRecordingStateChange={(recording) => setRecording(recording)}
/>Main recruiter interface for managing interviews and viewing responses.
Public interface for candidates to view questions and record responses.
Manages authentication state and operations.
const { user, loading, signIn, signUp, signOut } = useAuth()Handles video recording logic with error handling.
const {
isRecording,
videoBlob,
startRecording,
stopRecording,
resetRecording
} = useVideoRecorder(maxDuration)# Run tests in watch mode
npm run test
# Run tests once
npm run test:run
# Run with coverage
npm run test:coverage
# Run with UI
npm run test:ui- Unit Tests: Individual functions and hooks
- Component Tests: React component behavior
- Integration Tests: Component interactions
- Accessibility Tests: A11y compliance
import { render, screen } from '../test/utils/testUtils'
import { MyComponent } from '../MyComponent'
describe('MyComponent', () => {
it('should render correctly', () => {
render(<MyComponent />)
expect(screen.getByRole('button')).toBeInTheDocument()
})
})# Lint and fix code
npm run lint:fix
# Format code
npm run format
# Type check
npm run type-checkAutomatically runs on every commit:
- ESLint with auto-fix
- Prettier formatting
- TypeScript type checking
# Required
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
# Optional
VITE_APP_NAME=fk videoask
VITE_MAX_VIDEO_SIZE_MB=100
VITE_MAX_QUESTION_DURATION=120
VITE_MAX_RESPONSE_DURATION=60- Build the project:
npm run build - Deploy to Netlify: Use Netlify's drag-and-drop or connect your Git repository
- Environment Variables: Add your Supabase credentials in Netlify's environment settings
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key-
Build the project:
npm run build
-
Deploy to Netlify:
- Connect your Git repository
- Set build command:
npm run build - Set publish directory:
dist - Add environment variables in Netlify dashboard
-
Configure redirects: The
public/_redirectsfile handles client-side routing.
- Vercel: Works out of the box with Git integration
- AWS S3 + CloudFront: Static hosting with CDN
- Docker: Use the provided Dockerfile for containerization
Ensure these environment variables are set in your deployment:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Input Sanitization: XSS prevention on all user inputs
- Rate Limiting: Prevents brute force attacks
- File Validation: Secure video upload validation
- CSRF Protection: Built-in with Supabase
- SQL Injection Prevention: Parameterized queries
- Content Security Policy: Configurable CSP headers
- Use HTTPS in production
- Regularly update dependencies
- Monitor for security vulnerabilities
- Implement proper backup strategies
- Use environment variables for secrets
Please report security vulnerabilities to: [security@yourcompany.com]
See public/security.txt for detailed security policy.
- WCAG 2.1 AA compliant
- Screen reader compatible
- Keyboard navigation support
- High contrast mode support
- Reduced motion support
- Semantic HTML structure
- ARIA labels and roles
- Focus management
- Color contrast compliance
- Alternative text for media
- Chrome 88+ (recommended)
- Firefox 85+
- Safari 14+
- Edge 88+
- MediaRecorder API
- getUserMedia API
- ES2020 support
- WebRTC support
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
We welcome contributions! Please see our contributing guidelines:
- Fork the repository
- Clone your fork
- Install dependencies:
npm install - Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests:
npm run test - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow TypeScript best practices
- Write tests for new features
- Maintain accessibility standards
- Follow the existing code style
- Add JSDoc comments for public APIs
- Ensure all tests pass
- Update documentation if needed
- Add changeset entry if applicable
- Request review from maintainers
- Code Splitting: Lazy loading of components
- Memoization: React.memo for expensive components
- Bundle Analysis: Webpack bundle analyzer
- Image Optimization: Responsive images and lazy loading
- Caching: Service worker ready
- Core Web Vitals tracking ready
- Error boundary implementation
- Performance API integration points
- Memory leak prevention
- interviews: Interview metadata
- interview_questions: Questions within interviews
- interview_responses: Candidate responses
- users: Recruiter accounts (managed by Supabase Auth)
- videos: Secure video file storage with RLS
- Row Level Security (RLS) enabled on all tables
- Policies for recruiter data isolation
- Public read access for interview questions
- Interview Templates: Reusable question sets
- Advanced Analytics: Response metrics and insights
- Team Collaboration: Multi-recruiter support
- Integration APIs: Connect with ATS systems
- Mobile App: Native iOS/Android applications
- AI Features: Automated response analysis
- Offline Support: PWA with offline capabilities
- Real-time Updates: Live interview status
- Advanced Search: Full-text search capabilities
- Export Features: PDF reports and data export
- Internationalization: Multi-language support
MIT License - see LICENSE file for details
This project is licensed under the MIT License - see the LICENSE file for details.
- Supabase - Backend infrastructure
- React Team - Frontend framework
- Tailwind CSS - Styling system
- Lucide - Icon library
- Vite - Build tooling
- Testing Library - Testing utilities
For issues and questions, please create an issue in the repository.
- Documentation: Check this README and inline code comments
- Issues: Create a GitHub issue for bugs or feature requests
- Discussions: Use GitHub Discussions for questions
- Email: Contact [ameens.in19@gmail.com] for urgent issues
- GitHub: [Repository Link]
- Discord: [Community Server] (if applicable)
- Twitter: [@yourhandle] (if applicable)
**Made with β€οΈ *
Building the future of asynchronous video interviews, one conversation at a time.