Cómo funciona un buscador de empleo con millones de vacantes sin intermediarios
Buscar empleo en empresas tecnológicas extranjeras o grandes suele convertirse en una rutina con sorpresas desagradables. Encuentras una posición interesante en un agregador, haces clic en el enlace, y la vacante se cerró hace un mes. O te encuentras con copias interminables del mismo anuncio de agencias de reclutamiento que ni siquiera mencionan al empleador final.

El proyecto freehire resuelve este problema con un enfoque técnico directo: analiza datos directamente desde sistemas de seguimiento de candidatos (ATS), evitando intermediarios. La base de datos contiene más de 3.3 millones de vacantes activas de casi 300,000 empresas. Toda la pila es de código abierto bajo la licencia MIT, incluyendo colectores de datos, interfaz web, motor de búsqueda y API.
De dónde provienen los datos
La mayoría de las empresas tecnológicas publican vacantes a través de servicios especializados como Greenhouse, Lever, Workday, Ashby o iCIMS. Los creadores de freehire escribieron adaptadores para 92 de estas plataformas, y también conectaron alrededor de un ciento de tableros de empleo de terceros y feeds directos de grandes corporaciones.
El pipeline funciona de la siguiente manera:
- Un worker rastrea los tableros de empleo y lee las vacantes nuevas. Agregar una empresa generalmente toma una línea en un archivo YAML, especificando el nombre y el ID en el ATS.
- Los datos se normalizan en un formato unificado. Si una vacante se publica en múltiples plataformas, el sistema fusiona los duplicados mediante una clave estable.
- Los filtros para categorías, salarios, ubicaciones y stack tecnológico se construyen a partir de diccionarios estrictos. No hay heurísticas poco confiables aquí—el sistema no intenta adivinar datos al azar.
- Un worker separado descarga el formulario de solicitud real desde el ATS objetivo, preservando la estructura original de los campos.
Qué hay dentro además del catálogo de vacantes
La búsqueda es solo el escaparate. Alrededor de la base de datos de vacantes, los desarrolladores construyeron un espacio de trabajo completo para candidatos.
Generador de currículum y verificación de coincidencia
El repositorio incluye un constructor de currículums que renderiza archivos PDF optimizados para el análisis automatizado de ATS. El sistema compara los requisitos del puesto con tu experiencia y calcula puntuaciones de compatibilidad determinísticas. Cuando se conecta a un modelo de lenguaje, proporciona ajustes de currículum específicos para solicitudes particulares sin fabricar experiencia.
Rastreador de respuestas con correo entrante
Después de enviar una solicitud, el seguimiento continúa en un tablero Kanban con actualizaciones de estado. Un gateway de correo electrónico integrado conecta las respuestas de los reclutadores con tarjetas de solicitud específicas, manteniendo la correspondencia organizada en lugar de perdida en una bandeja de entrada general.
Asistente y extensión para navegador
Se ha desarrollado una extensión de barra lateral para Chrome. Cuando abres una página de empleo en cualquier sitio, el plugin lee el texto de la página, lo cruza con tu perfil y completa el formulario de solicitud por ti. Para quienes prefieren trabajar a través de clientes LLM como Claude Desktop, los autores proporcionan un servidor MCP separado.
Arquitectura y stack tecnológico
El código está escrito en Go usando el framework web Fiber v2. Arquitectónicamente, el backend está claramente separado: el servidor API maneja solicitudes de clientes exclusivamente, mientras que todo el trabajo en segundo plano se mueve a workers separados de un solo uso. Estos son convenientes para ejecutar mediante cron o dentro de colas.
cmd/ Точки входа: HTTP-сервер и консольные воркеры
sources/ Файлы конфигурации источников вакансий (YAML)
migrations/ Схема PostgreSQL для sqlc и initdb
web/ Интерфейс на SvelteKit 2
internal/ Внутренние пакеты предметной области
sources/ Адаптеры под конкретные ATS (Workday, Lever, etc.)
pipeline/ Пайплайн сбора, валидации и дедупликации
cv/ cvedit/ Генерация структурированных резюме в PDF
inbox/ Обработка и связывание почты рекрутеров
Para almacenamiento y búsqueda rápida, se utiliza una combinación de componentes:
- PostgreSQL con la extensión pgvector almacena las entidades principales y embeddings vectoriales para búsqueda semántica.
- sqlc genera código con tipos seguros para trabajar con la base de datos desde consultas SQL simples—no se usa ORM.
- Meilisearch maneja búsqueda de texto completo y filtrado facetado instantáneo.
- SvelteKit 2 (en Svelte 5 runes) y Tailwind 4 forman el frontend SSR rápido.
- Redis y MinIO cubren caché, limitación de tasa de solicitudes y almacenamiento de objetos para archivos.
Inicio rápido y trabajo con la API
Puedes levantar una copia local del servicio junto con todas las dependencias mediante Docker:
make up
El comando iniciará la base de datos, motor de búsqueda, API e interfaz web en el puerto 8080. Puedes verificar la disponibilidad con una simple solicitud curl:
curl localhost:8080/health
curl localhost:8080/api/v1/jobs
Por cierto, la API pública del proyecto está disponible sin claves ni autorización. Si necesitas acceso a vacantes actualizadas para tu bot o proyecto personal, solo llama al endpoint https://freehire.me/api/v1/jobs. Todas las respuestas se devuelven en formato JSON predecible con metadatos estructurados y paginación.
Para ejecutar los colectores de datos, se usan comandos de consola en cmd/:
# Обход конкретного каталога ATS
go run ./cmd/ingest sources/greenhouse.yml
# Сброс очереди индексации в Meilisearch
go run ./cmd/search-drain
# Извлечение вакансий из Telegram-каналов
go run ./cmd/tg-extract
Para quién es este proyecto
El repositorio será útil en tres casos:
- Estás buscando empleo en empresas internacionales y estás cansado de los agregadores de baja calidad. La versión web proporciona enlaces directos a los sistemas ATS de los empleadores sin intermediarios intrusivos.
- Quieres construir tu propio agregador, canal de Telegram con vacantes o bot. Los adaptadores abiertos a 92 sistemas ATS ahorran cientos de horas de escritura de parsers.
- Te interesa un ejemplo de un proyecto Go maduro sin ORMs sobrecargados, con tipado SQL estricto, separación en workers independientes e integración con un motor de búsqueda moderno.
El proyecto se ve maduro, y su apertura da a cualquier desarrollador la oportunidad de enviar un pull request con una nueva empresa en una línea YAML. Puedes probar el servicio en vivo en el sitio web del proyecto o desplegando contenedores en tu propio servidor.
Proyectos relacionados