# Project export: deep reach

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2025
- Tagline: We automate talent discovery, pre-screening, and outreach with AI agents—instantly finding top candidates and connecting recruiters in one click. The future of hiring is fast, precise, and effortless.
- Devpost: https://devpost.com/software/deep-reach
- GitHub: https://github.com/Francescocrivelli/recruit-ai
- Demo: http://francescocrivelli.com/recruitdemo/index.html
- Video: https://www.youtube.com/embed/06owonlGV-M?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 2 GitHub contributor(s) — evtran0209 (4 commits), Francescocrivelli (3 commits)

## Devpost submission (written by the team)

No Devpost description available.

## README (from the GitHub repository)

No README available.

## Detected evidence (automated analysis)

Indexed codebase: 56 recognized source files, 126 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- Hugging Face (technology) — detected in the code
- JavaScript (language) — detected in the code
- Next.js (technology) — detected in the code
- Python (language) — detected in the code
- PyTorch (technology) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- Node.js (technology) — claimed on Devpost, not found in the code
- OpenAI (technology) — claimed on Devpost, not found in the code
- Vercel (technology) — claimed on Devpost, not found in the code
- AI coding agent: Cursor — evidence: config files committed to the repository

## Codebase structure (from repository index)

### Files (83 of 83)

```
.gitignore
.npmrc
apps/docs/next-env.d.ts
apps/recruiter-dashboard/app/globals.css
apps/recruiter-dashboard/app/layout.tsx
apps/recruiter-dashboard/app/outreach/[id]/page.tsx
apps/recruiter-dashboard/app/page.tsx
apps/recruiter-dashboard/app/shortlist/page.tsx
apps/recruiter-dashboard/app/shortlisted/page.tsx
apps/recruiter-dashboard/components/ApplicantDirectory/ApplicantCard.tsx
apps/recruiter-dashboard/components/ApplicantDirectory/index.tsx
apps/recruiter-dashboard/components/OutreachSection/index.tsx
apps/recruiter-dashboard/components/ProjectsMetrics/index.tsx
apps/recruiter-dashboard/components/SearchBar/index.tsx
apps/recruiter-dashboard/globals.css
apps/recruiter-dashboard/next-env.d.ts
apps/recruiter-dashboard/next.config.js
apps/recruiter-dashboard/package.json
apps/recruiter-dashboard/postcss.config.js
apps/recruiter-dashboard/tailwind.config.js
apps/recruiter-dashboard/tsconfig.json
apps/recruiter-dashboard/utils/api-client.ts
apps/recruiter-dashboard/utils/api.ts
apps/recruiter-dashboard/utils/mockData.ts
apps/recruiter-dashboard/utils/outreachGenerator.ts
apps/recruiter-dashboard/utils/types.ts
apps/web/.gitignore
apps/web/app/globals.css
apps/web/app/layout.tsx
apps/web/app/page.module.css
apps/web/app/page.tsx
apps/web/eslint.config.js
apps/web/next.config.js
apps/web/package.json
apps/web/README.md
apps/web/tsconfig.json
bun.lock
bun.lockb
package.json
packages/eslint-config/base.js
packages/eslint-config/next.js
packages/eslint-config/package.json
packages/eslint-config/react-internal.js
packages/eslint-config/README.md
packages/typescript-config/base.json
packages/typescript-config/nextjs.json
packages/typescript-config/package.json
packages/typescript-config/react-library.json
packages/ui/.eslintrc.js
packages/ui/eslint.config.js
packages/ui/eslint.config.mjs
packages/ui/package.json
packages/ui/src/ApplicantCard/ApplicantCard.tsx
packages/ui/src/ApplicantCard/index.tsx
packages/ui/src/button.tsx
packages/ui/src/Button/Button.tsx
packages/ui/src/card.tsx
packages/ui/src/code.tsx
packages/ui/src/index.ts
packages/ui/src/types/plop.d.ts
packages/ui/tsconfig.json
packages/ui/turbo/generators/config.ts
packages/ui/turbo/generators/templates/component.hbs
README.md
requirements.txt
tools/db/api.py
tools/db/candidates.json
tools/db/chunked_candidates_final.py
tools/db/requirements.txt
tools/db/visualize.py
tools/README.md
tools/web_browsing/.cursor/rules
tools/web_browsing/candidates.json
tools/web_browsing/linkedin_connect.py
tools/web_browsing/linkedin_parallel_connect.py
tools/web_browsing/linkedin_profile_search.py
tools/web_browsing/main.py
tools/web_browsing/render.yaml
tools/web_browsing/requirements.txt
tools/web_browsing/x_analyzer.py
tools/web_browsing/x.py
tsconfig.json
turbo.json
```

### Dependencies

- apps/recruiter-dashboard/package.json: @repo/ui@*, @types/node@^20.10.6, @types/react@^18.2.46, @types/react-dom@^18.2.18, autoprefixer@^10.4.17, next@^14.0.0, postcss@^8.4.35, react@^18.2.0, react-dom@^18.2.0, tailwindcss@^3.4.1, typescript@^5.3.3
- apps/web/package.json: @repo/eslint-config@*, @repo/typescript-config@*, @repo/ui@*, @types/node@^22, @types/react@19.0.8, @types/react-dom@19.0.3, eslint@^9.20.0, next@^15.1.6, react@^18.2.0, react-dom@^18.2.0, typescript@5.7.3
- package.json: @headlessui/react@^1.7.18, @heroicons/react@^2.1.1, @turbo/gen@^2.4.2, autoprefixer@^10.4.20, postcss@^8.5.2, prettier@^3.5.0, react@18.2.0, react-dom@18.2.0, react-icons@^5.4.0, tailwindcss@^4.0.7, turbo@^2.4.2, typescript@5.7.3
- packages/eslint-config/package.json: @eslint/js@^9.20.0, @next/eslint-plugin-next@^15.1.6, eslint@^9.20.0, eslint-config-prettier@^10.0.1, eslint-plugin-only-warn@^1.1.0, eslint-plugin-react@^7.37.4, eslint-plugin-react-hooks@^5.1.0, eslint-plugin-turbo@^2.4.0, globals@^15.14.0, typescript@^5.7.3, typescript-eslint@^8.23.0
- packages/ui/package.json: @repo/eslint-config@*, @repo/typescript-config@*, @types/node@^20.10.6, @types/react@^18.2.46, @types/react-dom@^18.2.18, eslint@^8.56.0, next@^14.0.0, react@^18.2.0, react-dom@^18.2.0, typescript@^5.3.3
- requirements.txt: annotated-types@==0.7.0, anyio@==4.8.0, asgiref@==3.8.1, backoff@==2.2.1, bcrypt@==4.2.1, build@==1.2.2.post1, cachetools@==5.5.1, certifi@==2025.1.31, charset-normalizer@==3.4.1, chroma-hnswlib@==0.7.6, chromadb@==0.6.3, click@==8.1.8, coloredlogs@==15.0.1, Deprecated@==1.2.18, durationpy@==0.9, fastapi@==0.115.8, filelock@==3.17.0, flatbuffers@==25.2.10, fsspec@==2025.2.0, google-auth@==2.38.0, googleapis-common-protos@==1.67.0, grpcio@==1.70.0, h11@==0.14.0, httpcore@==1.0.7, httptools@==0.6.4, httpx@==0.28.1, huggingface-hub@==0.28.1, humanfriendly@==10.0, idna@==3.10, importlib_metadata@==8.5.0, importlib_resources@==6.5.2, Jinja2@==3.1.5, joblib@==1.4.2, kubernetes@==32.0.0, markdown-it-py@==3.0.0, MarkupSafe@==3.0.2, mdurl@==0.1.2, mmh3@==5.1.0, monotonic@==1.6, mpmath@==1.3.0, narwhals@==1.26.0, networkx@==3.4.2, numpy@==2.2.3, oauthlib@==3.2.2, onnxruntime@==1.20.1, opentelemetry-api@==1.30.0, opentelemetry-exporter-otlp-proto-common@==1.30.0, opentelemetry-exporter-otlp-proto-grpc@==1.30.0, opentelemetry-instrumentation@==0.51b0, opentelemetry-instrumentation-asgi@==0.51b0, opentelemetry-instrumentation-fastapi@==0.51b0, opentelemetry-proto@==1.30.0, opentelemetry-sdk@==1.30.0, opentelemetry-semantic-conventions@==0.51b0, opentelemetry-util-http@==0.51b0, orjson@==3.10.15, overrides@==7.7.0, packaging@==24.2, pandas@==2.2.3, pillow@==11.1.0, plotly@==6.0.0, posthog@==3.13.0, protobuf@==5.29.3, pyasn1@==0.6.1, pyasn1_modules@==0.4.1, pydantic@==2.10.6, pydantic_core@==2.27.2, Pygments@==2.19.1, PyPika@==0.48.9, pyproject_hooks@==1.2.0, python-dateutil@==2.9.0.post0, python-dotenv@==1.0.1, pytz@==2025.1, PyYAML@==6.0.2, regex@==2024.11.6, requests@==2.32.3, requests-oauthlib@==2.0.0, rich@==13.9.4, rsa@==4.9, safetensors@==0.5.2, scikit-learn@==1.6.1, scipy@==1.15.1, sentence-transformers@==3.4.1, setuptools@==75.8.0, shellingham@==1.5.4, six@==1.17.0, sniffio@==1.3.1, starlette@==0.45.3, sympy@==1.13.1, tenacity@==9.0.0, threadpoolctl@==3.5.0, tokenizers@==0.21.0, torch@==2.6.0, tqdm@==4.67.1, transformers@==4.48.3, typer@==0.15.1, typing_extensions@==4.12.2, tzdata@==2025.1, urllib3@==2.3.0, uvicorn@==0.34.0, uvloop@==0.21.0, watchfiles@==1.0.4, websocket-client@==1.8.0, websockets@==14.2, wrapt@==1.17.2, zipp@==3.21.0
- tools/db/requirements.txt: chromadb@>=0.4.18, fastapi@>=0.104.1, numpy@>=1.26.2, pandas@>=2.1.3, plotly@>=5.18.0, pydantic@>=2.5.2, python-multipart@>=0.0.6, scikit-learn@>=1.3.2, sentence-transformers, tf-keras, torch, torchaudio, torchvision, tqdm@>=4.67.1, transformers, uvicorn@>=0.24.0
- tools/web_browsing/requirements.txt: anthropic@==0.3.9, fastapi@==0.104.1, pydantic@==2.4.2, python-multipart@==0.0.6, scrapybara@==0.1.0, uvicorn@==0.24.0

### Recent commits (newest first)

- tiny fix
- feat: enhance candidate processing pipeline
- feat: enhance candidate processing pipeline
- we submitted
- deployment
- updated
- Add requirements.txt
- Fresh start: Remove large files and virtual environment

## Key source files (fetched from GitHub, selected and truncated for size)

### package.json

```
{
  "name": "recruit-ai",
  "private": true,
  "scripts": {
    "build": "turbo run build",
    "dev": "turbo run dev",
    "lint": "turbo run lint",
    "format": "prettier --write \"**/*.{ts,tsx,md}\"",
    "check-types": "turbo run check-types"
  },
  "devDependencies": {
    "@turbo/gen": "^2.4.2",
    "prettier": "^3.5.0",
    "turbo": "^2.4.2",
    "typescript": "5.7.3"
  },
  "engines": {
    "node": ">=18"
  },
  "packageManager": "bun@1.2.2",
  "workspaces": [
    "apps/*",
    "packages/*",
    "tools/*",
    "agents/*"
  ],
  "dependencies": {
    "@headlessui/react": "^1.7.18",
    "@heroicons/react": "^2.1.1",
    "autoprefixer": "^10.4.20",
    "postcss": "^8.5.2",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-icons": "^5.4.0",
    "tailwindcss": "^4.0.7"
  }
}

```

### requirements.txt

```
annotated-types==0.7.0
anyio==4.8.0
asgiref==3.8.1
backoff==2.2.1
bcrypt==4.2.1
build==1.2.2.post1
cachetools==5.5.1
certifi==2025.1.31
charset-normalizer==3.4.1
chroma-hnswlib==0.7.6
chromadb==0.6.3
click==8.1.8
coloredlogs==15.0.1
Deprecated==1.2.18
durationpy==0.9
fastapi==0.115.8
filelock==3.17.0
flatbuffers==25.2.10
fsspec==2025.2.0
google-auth==2.38.0
googleapis-common-protos==1.67.0
grpcio==1.70.0
h11==0.14.0
httpcore==1.0.7
httptools==0.6.4
httpx==0.28.1
huggingface-hub==0.28.1
humanfriendly==10.0
idna==3.10
importlib_metadata==8.5.0
importlib_resources==6.5.2
Jinja2==3.1.5
joblib==1.4.2
kubernetes==32.0.0
markdown-it-py==3.0.0
MarkupSafe==3.0.2
mdurl==0.1.2
mmh3==5.1.0
monotonic==1.6
mpmath==1.3.0
narwhals==1.26.0
networkx==3.4.2
numpy==2.2.3
oauthlib==3.2.2
onnxruntime==1.20.1
opentelemetry-api==1.30.0
opentelemetry-exporter-otlp-proto-common==1.30.0
opentelemetry-exporter-otlp-proto-grpc==1.30.0
opentelemetry-instrumentation==0.51b0
opentelemetry-instrumentation-asgi==0.51b0
opentelemetry-instrumentation-fastapi==0.51b0
opentelemetry-proto==1.30.0
opentelemetry-sdk==1.30.0
opentelemetry-semantic-conventions==0.51b0
opentelemetry-util-http==0.51b0
orjson==3.10.15
overrides==7.7.0
packaging==24.2
pandas==2.2.3
pillow==11.1.0
plotly==6.0.0
posthog==3.13.0
protobuf==5.29.3
pyasn1==0.6.1
pyasn1_modules==0.4.1
pydantic==2.10.6
pydantic_core==2.27.2
Pygments==2.19.1
PyPika==0.48.9
pyproject_hooks==1.2.0
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
pytz==2025.1
PyYAML==6.0.2
regex==2024.11.6
requests==2.32.3
requests-oauthlib==2.0.0
rich==13.9.4
rsa==4.9
safetensors==0.5.2
scikit-learn==1.6.1
scipy==1.15.1
sentence-transformers==3.4.1
setuptools==75.8.0
shellingham==1.5.4
six==1.17.0
sniffio==1.3.1
starlette==0.45.3
sympy==1.13.1
tenacity==9.0.0
threadpoolctl==3.5.0
tokenizers==0.21.0
torch==2.6.0
tqdm==4.67.1
transformers==4.48.3
typer==0.15.1
typing_extensions==4.12.2
tzdata==2025.1
urllib3==2.3.0
uvicorn==0.34.0
uvloop==0.21.0
watchfiles==1.0.4
websocket-client==1.8.0
websockets==14.2
wrapt==1.17.2
zipp==3.21.0

```

### tools/web_browsing/requirements.txt

```
fastapi==0.104.1
uvicorn==0.24.0
pydantic==2.4.2
scrapybara==0.1.0
anthropic==0.3.9
python-multipart==0.0.6 
```

### packages/typescript-config/package.json

```
{
  "name": "@repo/typescript-config",
  "version": "0.0.0",
  "private": true,
  "license": "MIT",
  "publishConfig": {
    "access": "public"
  }
}

```

### tools/db/requirements.txt

```
# Core ML dependencies
torch
torchvision
torchaudio
sentence-transformers
transformers
tf-keras

# Database and API
chromadb>=0.4.18
fastapi>=0.104.1
uvicorn>=0.24.0

# Data processing
numpy>=1.26.2
pandas>=2.1.3
scikit-learn>=1.3.2

# Utilities
python-multipart>=0.0.6
pydantic>=2.5.2
tqdm>=4.67.1
plotly>=5.18.0

```

### apps/recruiter-dashboard/package.json

```
{
  "name": "recruiter-dashboard",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "next": "^14.0.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "@repo/ui": "*"
  },
  "devDependencies": {
    "@types/node": "^20.10.6",
    "@types/react": "^18.2.46",
    "@types/react-dom": "^18.2.18",
    "typescript": "^5.3.3",
    "autoprefixer": "^10.4.17",
    "postcss": "^8.4.35",
    "tailwindcss": "^3.4.1"
  }
}

```

### apps/web/package.json

```
{
  "name": "web",
  "version": "0.1.0",
  "type": "module",
  "private": true,
  "scripts": {
    "dev": "next dev --turbopack --port 3000",
    "build": "next build",
    "start": "next start",
    "lint": "next lint --max-warnings 0",
    "check-types": "tsc --noEmit"
  },
  "dependencies": {
    "@repo/ui": "*",
    "next": "^15.1.6",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@repo/eslint-config": "*",
    "@repo/typescript-config": "*",
    "@types/node": "^22",
    "@types/react": "19.0.8",
    "@types/react-dom": "19.0.3",
    "eslint": "^9.20.0",
    "typescript": "5.7.3"
  }
}

```

### packages/eslint-config/package.json

```
{
  "name": "@repo/eslint-config",
  "version": "0.0.0",
  "type": "module",
  "private": true,
  "exports": {
    "./base": "./base.js",
    "./next-js": "./next.js",
    "./react-internal": "./react-internal.js"
  },
  "devDependencies": {
    "@eslint/js": "^9.20.0",
    "@next/eslint-plugin-next": "^15.1.6",
    "eslint": "^9.20.0",
    "eslint-config-prettier": "^10.0.1",
    "eslint-plugin-only-warn": "^1.1.0",
    "eslint-plugin-react": "^7.37.4",
    "eslint-plugin-react-hooks": "^5.1.0",
    "eslint-plugin-turbo": "^2.4.0",
    "globals": "^15.14.0",
    "typescript": "^5.7.3",
    "typescript-eslint": "^8.23.0"
  }
}

```

### packages/ui/package.json

```
{
  "name": "@repo/ui",
  "version": "0.0.0",
  "private": true,
  "exports": {
    ".": {
      "import": "./src/index.ts"
    },
    "./src/ApplicantCard": "./src/ApplicantCard/ApplicantCard.tsx"
  },
  "scripts": {
    "lint": "eslint . --max-warnings 0",
    "generate:component": "turbo gen react-component"
  },
  "dependencies": {
    "next": "^14.0.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@repo/eslint-config": "*",
    "@repo/typescript-config": "*",
    "@types/node": "^20.10.6",
    "@types/react": "^18.2.46",
    "@types/react-dom": "^18.2.18",
    "eslint": "^8.56.0",
    "typescript": "^5.3.3"
  }
}

```

### tools/web_browsing/main.py

```python
from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel
from typing import List, Dict, Optional
import asyncio
import json
from datetime import datetime
import os

# Import our service classes
from linkedin_parallel_connect import LinkedInConnector, ConnectionResult
from x_analyzer import XUserAnalysis, analyze_user
from x import TwitterUserSchema

app = FastAPI(title="Web Browser Automation API")

# LinkedIn Connection Request Model
class LinkedInBatchRequest(BaseModel):
    connections: List[Dict[str, str]]
    batch_size: int = 3

# Twitter Analysis Request Model
class TwitterAnalysisRequest(BaseModel):
    search_query: str = "artificial intelligence"
    num_users: int = 5

# Initialize shared configuration
API_KEY = "scrapy-0a7bbe3d-b23a-4801-b412-d7aa56700f0a"
AUTH_STATE_ID = "246f3e24-f93d-4608-a05d-d188548ec737"

# LinkedIn Routes
@app.post("/linkedin/connect/batch", response_model=List[ConnectionResult])
async def batch_connect_linkedin(request: LinkedInBatchRequest):
    connector = LinkedInConnector(API_KEY, AUTH_STATE_ID, batch_size=request.batch_size)
    results = await connector.process_all_connections(request.connections)
    return results

# X/Twitter Routes
@app.post("/x/analyze-user", response_model=XUserAnalysis)
async def analyze_x_user(username: str):
    result = analyze_user(username)
    return result

@app.post("/x/analyze-ai-posts", response_model=TwitterUserSchema)
async def analyze_ai_posts(request: TwitterAnalysisRequest):
    # Initialize the Twitter analysis service
    from x import client, instance, TWITTER_SYSTEM_PROMPT
    
    try:
        response = client.act(
            model=Anthropic(),
            tools=[
                BashTool(instance),
                ComputerTool(instance),
                EditTool(instance),
                BrowserTool(instance),
            ],
            system=TWITTER_SYSTEM_PROMPT,
            prompt=f"Go to x.com, search for '{request.search_query}' posts from the last 24 hours, and analyze the top {request.num_users} most relevant users posting about AI",
            schema=TwitterUserSchema,
            on_step=lambda step: print(step.text),
        )
        return response.output
    finally:
        instance.browser.stop()
        instance.stop()

# Basic test endpoint to verify deployment
@app.get("/")
async def root():
    return {"message": "API is running"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000) 
```

[50 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]