{"id":29150577,"url":"https://github.com/vixalien/treehire","last_synced_at":"2025-06-30T23:30:46.513Z","repository":{"id":299333127,"uuid":"1002677974","full_name":"vixalien/treehire","owner":"vixalien","description":"AI-Powered Interview Assistant","archived":false,"fork":false,"pushed_at":"2025-06-16T02:13:13.000Z","size":206,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-16T02:30:40.277Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://treehire.vixalien.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vixalien.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-16T00:54:52.000Z","updated_at":"2025-06-16T02:13:17.000Z","dependencies_parsed_at":"2025-06-16T02:30:46.821Z","dependency_job_id":null,"html_url":"https://github.com/vixalien/treehire","commit_stats":null,"previous_names":["vixalien/treehire"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vixalien/treehire","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vixalien%2Ftreehire","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vixalien%2Ftreehire/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vixalien%2Ftreehire/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vixalien%2Ftreehire/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vixalien","download_url":"https://codeload.github.com/vixalien/treehire/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vixalien%2Ftreehire/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262867340,"owners_count":23377042,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-30T23:30:43.772Z","updated_at":"2025-06-30T23:30:46.502Z","avatar_url":"https://github.com/vixalien.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌳 Treehire - AI-Powered Interview Assistant\n\nA comprehensive interview management application that uses AI to generate questions, record live transcripts, and provide detailed candidate analysis with precise timing tracking.\n\n## Features\n\n- **Smart Question Generation**: AI-powered questions based on resume and job requirements\n- **Interview Timing**: Precise start/end time tracking with duration calculation\n- **Live Transcription**: Real-time speech-to-text during interviews\n- **Scoring System**: Rate candidate responses on a 1-10 scale with validation\n- **AI Analysis**: Comprehensive candidate evaluation with strengths, weaknesses, and recommendations\n- **File Management**: Upload and process PDF, DOCX, and TXT files\n- **Interview Dashboard**: Manage multiple interview sessions with timing information\n\n## Prerequisites\n\n- Node.js 18+ and npm/yarn\n- Supabase account and project\n- OpenRouter API key\n\n## Setup Instructions\n\n### 1. Environment Variables\n\nCreate a `.env.local` file with the following variables:\n\n```env\nNEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\nSUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key\nOPENROUTER_API_KEY=your_openrouter_api_key\n```\n\n### 2. Database Setup\n\nRun the following SQL scripts in your Supabase SQL Editor in order:\n\n#### Main Tables Setup (`scripts/001-create-tables.sql`):\n\n```sql\n-- Create interviews table\nCREATE TABLE IF NOT EXISTS interviews (\n  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,\n  title VARCHAR(255) NOT NULL,\n  candidate_name VARCHAR(255) NOT NULL,\n  position VARCHAR(255) NOT NULL,\n  resume_url TEXT,\n  job_requirements_url TEXT,\n  status VARCHAR(50) DEFAULT 'draft',\n  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n  interviewer_notes TEXT,\n  final_score DECIMAL(3,1),\n  gaps_analysis TEXT,\n  training_needs TEXT\n);\n\n-- Create questions table\nCREATE TABLE IF NOT EXISTS questions (\n  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,\n  interview_id UUID REFERENCES interviews(id) ON DELETE CASCADE,\n  question_text TEXT NOT NULL,\n  question_type VARCHAR(50) DEFAULT 'generated',\n  order_index INTEGER NOT NULL,\n  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n\n-- Create responses table\nCREATE TABLE IF NOT EXISTS responses (\n  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,\n  question_id UUID REFERENCES questions(id) ON DELETE CASCADE,\n  answer_text TEXT,\n  score INTEGER CHECK (score \u003e= 0 AND score \u003c= 10),\n  notes TEXT,\n  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n\n-- Create transcripts table\nCREATE TABLE IF NOT EXISTS transcripts (\n  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,\n  interview_id UUID REFERENCES interviews(id) ON DELETE CASCADE,\n  transcript_text TEXT NOT NULL,\n  timestamp_start TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n  speaker VARCHAR(50),\n  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n);\n\n-- Create indexes\nCREATE INDEX IF NOT EXISTS idx_questions_interview_id ON questions(interview_id);\nCREATE INDEX IF NOT EXISTS idx_responses_question_id ON responses(question_id);\nCREATE INDEX IF NOT EXISTS idx_transcripts_interview_id ON transcripts(interview_id);\n```\n\n#### Storage Setup (`scripts/002-setup-storage.sql`):\n\n```sql\n-- Create storage bucket for interview files\nINSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types)\nVALUES (\n  'interview-files',\n  'interview-files',\n  true,\n  10485760, -- 10MB\n  ARRAY['application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain', 'application/msword']\n) ON CONFLICT (id) DO UPDATE SET\n  public = EXCLUDED.public,\n  file_size_limit = EXCLUDED.file_size_limit,\n  allowed_mime_types = EXCLUDED.allowed_mime_types;\n\n-- Enable RLS on storage.objects\nALTER TABLE storage.objects ENABLE ROW LEVEL SECURITY;\n\n-- Create storage policies\nCREATE POLICY \"Allow public uploads\" ON storage.objects\n  FOR INSERT WITH CHECK (bucket_id = 'interview-files');\n\nCREATE POLICY \"Allow public downloads\" ON storage.objects\n  FOR SELECT USING (bucket_id = 'interview-files');\n\nCREATE POLICY \"Allow public updates\" ON storage.objects\n  FOR UPDATE USING (bucket_id = 'interview-files');\n\nCREATE POLICY \"Allow public deletes\" ON storage.objects\n  FOR DELETE USING (bucket_id = 'interview-files');\n```\n\n#### Enhanced Analysis Fields (`scripts/003-update-interviews-table.sql`):\n\n```sql\n-- Add additional fields to store complete analysis\nALTER TABLE interviews \nADD COLUMN IF NOT EXISTS overall_assessment TEXT,\nADD COLUMN IF NOT EXISTS strengths TEXT,\nADD COLUMN IF NOT EXISTS weaknesses TEXT,\nADD COLUMN IF NOT EXISTS recommendation VARCHAR(50),\nADD COLUMN IF NOT EXISTS confidence_score DECIMAL(3,2);\n```\n\n#### Interview Timing (`scripts/004-add-interview-timing.sql`):\n\n```sql\n-- Add timing fields to interviews table\nALTER TABLE interviews \nADD COLUMN IF NOT EXISTS start_time TIMESTAMP WITH TIME ZONE,\nADD COLUMN IF NOT EXISTS end_time TIMESTAMP WITH TIME ZONE,\nADD COLUMN IF NOT EXISTS duration_minutes INTEGER;\n\n-- Update existing interviews to have start_time as created_at for now\nUPDATE interviews \nSET start_time = created_at \nWHERE start_time IS NULL;\n```\n\n### 3. Install Dependencies\n\n```bash\nnpm install\n# or\nyarn install\n```\n\n### 4. Run the Application\n\n```bash\nnpm run dev\n# or\nyarn dev\n```\n\nVisit `http://localhost:3000` to start using Treehire.\n\n## Usage\n\n### Creating an Interview\n\n1. **Setup Interview**: Fill in interview details (title, candidate name, position)\n2. **Upload Files**: Upload candidate resume and job requirements (PDF, DOCX, TXT)\n3. **Add Custom Questions**: Optionally add your own questions\n4. **Generate Questions**: AI will create relevant questions based on the documents\n\n### Conducting an Interview\n\n1. **Start Interview**: Click \"Start Interview\" to begin timing\n2. **Live Transcript**: Enable speech-to-text recording\n3. **Question Navigation**: Move through questions with Previous/Next buttons\n4. **Record Answers**: Type candidate responses or use live transcript\n5. **Score Responses**: Rate each answer on a 0-10 scale (with validation)\n6. **Add Notes**: Include additional observations\n7. **Generate Analysis**: Get AI-powered candidate evaluation with timing data\n\n### Managing Interviews\n\n- **Dashboard**: View all interviews with status, scores, and duration\n- **Review**: Access completed interviews and their analysis\n- **Reports**: View detailed candidate assessments with timing information\n- **Delete**: Remove interviews with confirmation dialogs\n\n## Key Features\n\n### Interview Timing\n- **Start Time**: Precisely recorded when interview begins\n- **End Time**: Automatically set when analysis is completed\n- **Duration**: Calculated and displayed in minutes/hours\n- **Status Tracking**: Draft → In Progress → Completed\n\n### Score Validation\n- **Range Validation**: Ensures scores are between 0-10\n- **Real-time Feedback**: Immediate validation with visual indicators\n- **Decimal Support**: Allows precise scoring (e.g., 7.5)\n- **Navigation Prevention**: Blocks progression with invalid scores\n\n### Enhanced UI\n- **Tree Theme**: Green color scheme with tree emoji (🌳)\n- **Timing Display**: Shows start time, duration, and status\n- **Better Feedback**: Toast notifications for all actions\n- **Improved Navigation**: Clear status indicators and progress tracking\n\n## API Endpoints\n\n- `POST /api/generate-questions` - Generate AI questions from documents\n- `POST /api/analyze-interview` - Generate comprehensive interview analysis\n\n## Technology Stack\n\n- **Frontend**: Next.js 14, React, TypeScript, Tailwind CSS\n- **Backend**: Next.js API Routes, Supabase\n- **Database**: PostgreSQL (via Supabase)\n- **Storage**: Supabase Storage\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvixalien%2Ftreehire","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvixalien%2Ftreehire","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvixalien%2Ftreehire/lists"}