AI-powered job search and resume optimization application. Automatically finds matching jobs, generates tailored resumes and cover letters, and tracks your applications.
- Daily Job Discovery: Automatically finds 20 matching jobs per day
- Smart Matching: Keyword-based job matching with skill analysis (embedding support in schema)
- Tailored Documents: AI-generated resume and cover letter for each job
- Application Tracking: Mark jobs as applied, saved, or not relevant
- Learning System: Improves recommendations based on your feedback
- Multi-provider LLM: Switch between Claude, GPT, and Gemini as needed
- Node.js 20+
- Supabase account (free tier works)
- LLM API keys (at least one of: Anthropic, OpenAI, Google)
- Inngest account (free tier: 50k executions/month)
git clone <repo-url>
cd howlerhire
npm install- Create a new Supabase project at https://supabase.com
- Go to SQL Editor and run the migration:
cat supabase/migrations/0001_initial_schema.sql
- Enable the
vectorextension in Extensions settings - Copy your project URL and keys
cp .env.example .envEdit .env with your credentials:
# Supabase
PUBLIC_SUPABASE_URL=https://your-project.supabase.co
PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
SUPABASE_DB_URL=postgresql://postgres.[project-ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres
# LLM API Keys (at least one required)
ANTHROPIC_API_KEY=sk-ant-xxx
OPENAI_API_KEY=sk-xxx
GOOGLE_API_KEY=xxx
# Job APIs (optional, for broader search)
ADZUNA_APP_ID=xxx
ADZUNA_APP_KEY=xxx
# Inngest
INNGEST_EVENT_KEY=xxx
INNGEST_SIGNING_KEY=xxx# Start the dev server
npm run dev
# In another terminal, start Inngest dev server
npm run inngest:devFor multi-provider LLM access with cost tracking:
# Start all services
docker-compose up -d
# Or just LiteLLM
docker run -p 4000:4000 \
-e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
-e OPENAI_API_KEY=$OPENAI_API_KEY \
ghcr.io/berriai/litellm:main-latestThen set LITELLM_PROXY_URL=http://localhost:4000 in your .env.
howlerhire/
├── src/
│ ├── lib/
│ │ ├── components/ui/ # shadcn-svelte components
│ │ ├── server/
│ │ │ ├── database/ # Drizzle schema & types
│ │ │ ├── inngest/ # Durable workflows
│ │ │ ├── jobs/ # Job API integrations
│ │ │ └── llm/ # LLM client & generators
│ │ └── utils.ts
│ ├── routes/
│ │ ├── auth/ # Login, signup, OAuth
│ │ ├── dashboard/ # Main app UI
│ │ │ ├── jobs/ # Job listing & details
│ │ │ ├── profile/ # User profile
│ │ │ └── resumes/ # Resume management
│ │ └── api/ # API endpoints
│ └── app.css # Tailwind styles
├── supabase/migrations/ # Database migrations
├── docker-compose.yml # Local services
└── wrangler.toml # Cloudflare config
- Fetch user profile and preferences
- Search all job sources (Adzuna, Muse, Greenhouse)
- Filter duplicates and rank by relevance
- Save top 20 matches to database
- Queue resume generation for each job
- Load job details and user profile
- Generate tailored resume via LLM
- Generate cover letter via LLM
- Save to database and notify user
# Install Wrangler CLI
npm install -g wrangler
# Login to Cloudflare
wrangler login
# Deploy
npm run build
wrangler pages deploy .svelte-kit/cloudflare
# Set secrets
wrangler pages secret put SUPABASE_SERVICE_ROLE_KEY
wrangler pages secret put ANTHROPIC_API_KEY
# ... etcSet these in Cloudflare dashboard > Pages > Settings > Environment variables:
PUBLIC_SUPABASE_URLPUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYANTHROPIC_API_KEY(or other LLM keys)INNGEST_EVENT_KEYINNGEST_SIGNING_KEY
- Supabase: Free (500MB DB, 50K MAU)
- Inngest: Free (50K-100K executions/month)
- Cloudflare: Free (100K requests/day)
- Job APIs: Free (Adzuna, Muse, Greenhouse)
- 20 jobs/day × 30 days = 600 jobs
- Resume + Cover letter per job ≈ $0.05-0.15
- Total: ~$30-90/month in LLM costs
To add a new job API, create a new file in src/lib/server/jobs/:
// src/lib/server/jobs/newapi.ts
import type { JobResult, JobSearchParams } from './types';
export async function searchNewApiJobs(params: JobSearchParams): Promise<JobResult[]> {
// Implement search logic
return [];
}Then add it to the job discovery workflow in src/lib/server/inngest/functions/job-discovery.ts.
- Add Lever API integration (implemented in
src/lib/server/jobs/lever.ts) - Add Apify/Scrapingdog for broader coverage
- Implement embedding-based job matching (schema ready with pgvector)
- Add resume upload and parsing (implemented via LLM extraction)
- Add email notifications
- Add analytics dashboard
MIT
