{"id":48265545,"url":"https://github.com/dev-gaspar/jobhunter","last_synced_at":"2026-04-10T02:00:58.120Z","repository":{"id":349004706,"uuid":"1200668697","full_name":"dev-gaspar/jobhunter","owner":"dev-gaspar","description":"Herramienta CLI que automatiza la busqueda de empleo en LinkedIn. Escanea publicaciones, identifica ofertas relevantes, genera CVs personalizados con IA, y envia emails de aplicacion a reclutadores.","archived":false,"fork":false,"pushed_at":"2026-04-06T17:18:24.000Z","size":791,"stargazers_count":2,"open_issues_count":17,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-06T23:02:48.270Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://dev-gaspar.github.io/jobhunter/","language":"Python","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/dev-gaspar.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-03T17:29:17.000Z","updated_at":"2026-04-06T17:18:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6fc7f62-ae52-42b3-a7f0-1838908fc1ae","html_url":"https://github.com/dev-gaspar/jobhunter","commit_stats":null,"previous_names":["dev-gaspar/jobhunter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dev-gaspar/jobhunter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-gaspar%2Fjobhunter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-gaspar%2Fjobhunter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-gaspar%2Fjobhunter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-gaspar%2Fjobhunter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dev-gaspar","download_url":"https://codeload.github.com/dev-gaspar/jobhunter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-gaspar%2Fjobhunter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31533824,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":"2026-04-04T21:54:00.375Z","updated_at":"2026-04-10T02:00:58.084Z","avatar_url":"https://github.com/dev-gaspar.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JobHunter AI\n\nHerramienta CLI que automatiza la busqueda de empleo en LinkedIn. Escanea publicaciones, identifica ofertas relevantes, genera CVs personalizados con IA, y envia emails de aplicacion a reclutadores.\n\nFunciona para cualquier sector: tecnologia, marketing, ventas, diseno, administracion, salud, educacion, etc.\n\n## Instalacion rapida\n\n**macOS / Linux:**\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/dev-gaspar/jobhunter/main/install.sh | bash\n```\n\n**Windows (PowerShell):**\n\n```powershell\nirm https://raw.githubusercontent.com/dev-gaspar/jobhunter/main/install.ps1 | iex\n```\n\nEsto instala el comando `jobhunter` globalmente en tu terminal.\n\n## Comandos\n\n```\njobhunter setup                          Configuracion inicial\njobhunter login                          Iniciar sesion en LinkedIn\njobhunter --test email@test.com          Prueba (envia a tu correo)\njobhunter run                            Buscar y enviar a reclutadores\njobhunter optimize                       Optimizar queries de busqueda con IA\njobhunter optimize \"...\"                 Optimizar con feedback especifico\njobhunter status                         Ver configuracion y estadisticas\njobhunter update                         Actualizar a la ultima version\njobhunter help                           Ver ayuda completa\n```\n\n## Opciones\n\n### Filtro de tiempo\n\n```\njobhunter --test email@test.com --time 24h      Ultimas 24 horas (por defecto)\njobhunter --test email@test.com --time week      Esta semana\njobhunter run --time month                       Este mes\n```\n\n### Seleccion de ofertas\n\nPor defecto, despues del analisis se muestra una tabla con las ofertas encontradas y puedes elegir a cuales aplicar:\n\n```\nAplicar a: 1,3,5      Solo esas ofertas\nAplicar a: all         Todas las ofertas\nAplicar a: q           Cancelar\n```\n\nPara saltar la seleccion y enviar a todas automaticamente:\n\n```\njobhunter run --auto\njobhunter --test mi@email.com --auto\n```\n\n### Optimizar queries de busqueda\n\nUn agente de IA analiza tu perfil, queries actuales, e historial de ejecuciones para generar mejores terminos de busqueda:\n\n```\njobhunter optimize\n```\n\nTambien puedes darle feedback especifico sobre problemas que tienes:\n\n```\njobhunter optimize \"no encuentro ofertas remotas en LATAM\"\njobhunter optimize \"mis queries son muy genericas, necesito mas ofertas de AI/ML\"\njobhunter optimize \"solo me salen ofertas en espanol, quiero mas en ingles\"\n```\n\nEl agente muestra un diff de queries actuales vs propuestas y pide confirmacion antes de guardar.\n\n### Modelos de Gemini\n\nDurante `jobhunter setup` puedes elegir el modelo de IA:\n\n| Modelo | Descripcion |\n|--------|-------------|\n| `gemini-2.5-flash` | Rapido y eficiente (por defecto) |\n| `gemini-2.5-flash-lite` | Mas ligero, menor consumo de API |\n| `gemini-2.5-pro` | Mayor calidad, mas lento |\n| `gemini-3-flash-preview` | Ultima generacion, rapido |\n| `gemini-3.1-pro-preview` | Ultima generacion, alta calidad |\n| `gemini-3.1-flash-lite-preview` | Ultima generacion, ligero |\n\n### Filtrado de duplicados\n\nNo envia el mismo cargo a la misma empresa si ya se envio en los ultimos 30 dias. Diferentes cargos a la misma empresa si se permiten.\n\n## Como funciona (alto nivel)\n\n1. **Setup**: Configuras tu API key de Gemini, eliges el modelo de IA, correo Gmail, subes tu CV, y defines que tipo de empleo buscas\n2. **Login**: Inicias sesion en LinkedIn una vez (la sesion se guarda)\n3. **Busqueda**: El sistema busca publicaciones en LinkedIn con tus terminos, expande el texto de cada post, y extrae emails de reclutadores\n4. **Analisis**: Un agente de IA analiza cada publicacion para determinar si es una oferta real y relevante para tu perfil\n5. **Seleccion**: Se muestra una tabla con las ofertas encontradas y puedes elegir a cuales aplicar (o usar `--auto` para todas)\n6. **CV personalizado**: Otro agente de IA genera un CV en PDF adaptado a cada oferta especifica, reescribiendo tu experiencia y habilidades para que encajen con lo que piden\n7. **Email personalizado**: Un tercer agente escribe un email de aplicacion corto, directo, y humano\n8. **Envio**: Se envia el email con el CV adjunto al reclutador via Gmail SMTP\n\n## Como esta hecho (bajo nivel)\n\n### Arquitectura\n\nEl sistema es un script Python (`job.py`) que orquesta 4 componentes:\n\n```\njob.py\n ├── Playwright (scraping de LinkedIn)\n ├── Gemini API (4 agentes de IA, modelo configurable)\n ├── ReportLab (generacion de PDFs)\n └── SMTP (envio de emails)\n```\n\n### Scraping con Playwright\n\n- Usa Playwright con **sesiones persistentes** en `.session/`. Inicias sesion una vez y queda guardada.\n- Ejecuta Chrome real del sistema (no Chromium) para evitar bloqueos de Google Auth.\n- Busca en `/search/results/content/` con parametros `datePosted` y `sortBy` para filtrar por fecha.\n- Hace scroll para cargar posts y ejecuta `button[data-testid=\"expandable-text-button\"].click()` via JavaScript para expandir el texto completo de cada publicacion.\n- Extrae el contenido de cada post individualmente usando `span[data-testid=\"expandable-text-box\"]`.\n- Extrae emails con regex directamente del texto expandido.\n\n### Sistema Multi-Agente (Gemini)\n\nCuatro agentes especializados, cada uno con su propio system prompt:\n\n**Agente 1 - Filtrador**: Recibe el texto de un post y determina si es una oferta real, si es relevante para el perfil del usuario, y extrae toda la informacion estructurada (titulo, empresa, requisitos, email, salario, ubicacion).\n\n**Agente 2 - CV Writer**: Toma el perfil del usuario y la oferta, y genera un CV completamente personalizado. Reescribe el resumen profesional, reordena skills, y reescribe cada bullet de experiencia para que conecte con lo que la oferta pide.\n\n**Agente 3 - Email Writer**: Genera un email de aplicacion corto (max 100 palabras), en espanol neutro, texto plano, sin frases de plantilla, con 1-2 logros concretos con numeros.\n\n**Agente 4 - Optimizer**: Analiza el perfil del usuario, queries actuales, historial de ejecuciones (tasa de conversion), y feedback opcional del usuario para generar queries de busqueda optimizadas. Usa terminos que reclutadores realmente usan en LinkedIn.\n\nLos cuatro agentes usan el modelo de Gemini seleccionado durante el setup via HTTP POST directo (sin SDK). Cada llamada tiene reintentos con backoff exponencial para manejar rate limits (429).\n\n### Generacion de PDFs\n\n`src/cv_builder.py` usa ReportLab para generar PDFs con formato profesional:\n- Layout de una pagina con secciones: resumen, habilidades, experiencia, proyectos, educacion\n- Tipografia Helvetica con jerarquia visual\n- Los textos se escapan para evitar errores XML de ReportLab\n\n### Envio de emails\n\n- Gmail SMTP con TLS en puerto 587\n- App Password de Google (no la contrasena normal)\n- CV adjunto como PDF\n- Reintentos en caso de fallo de conexion\n\n### Almacenamiento\n\n- `config.json`: Configuracion del usuario (API keys, modelo, perfil, queries de busqueda)\n- `knowledge.json`: Historial de ejecuciones y aplicaciones enviadas\n- `.session/`: Datos de sesion persistente de Playwright/Chrome\n- `output/cvs/`: CVs generados en PDF\n- `output/logs/`: Logs JSON de cada ejecucion\n\n### Dependencias\n\n- Python 3.10+\n- playwright (scraping)\n- requests (API de Gemini)\n- reportlab (PDFs)\n- rich (interfaz CLI)\n\nSe instalan automaticamente la primera vez que ejecutas `jobhunter`.\n\n## Landing page\n\nDesplegada automaticamente en GitHub Pages: [https://dev-gaspar.github.io/jobhunter/](https://dev-gaspar.github.io/jobhunter/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev-gaspar%2Fjobhunter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdev-gaspar%2Fjobhunter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev-gaspar%2Fjobhunter/lists"}