Volver a proyectosOpen Source

Job-radar · Empleo CRM

CRM web self-hosted que automatiza y centraliza mi búsqueda de empleo: reúne las ofertas, las puntúa con IA (Groq/Gemini/Ollama), genera carta y ajustes de CV, y las sigue en un kanban. Astro SSR + React + PostgreSQL, todo configurable desde la web y replicable con un comando.

Astro SSRReactPostgreSQLIA · LLMsn8nDocker
Rol
Full-stack + IA + infra
Año
2026
Stack
Astro SSR · React · PostgreSQL
Licencia
MIT
Job-radar · Empleo CRM

1 comando

Despliegue con Docker

3 servicios

Postgres · web · worker IA

100%

Self-hosted, sin nube

Job-radar (Empleo CRM) es un CRM web self-hosted que construí para automatizar y centralizar mi propia búsqueda de empleo — y publicado en abierto (MIT) para que cualquiera lo replique. Convierte el caos habitual (mil pestañas, ofertas repetidas, seguimiento a mano) en un sistema donde PostgreSQL es la única fuente de verdad y la pantalla de inicio es una “cola de hoy” con las mejores ofertas abiertas que aún no he postulado. Pensado para ayudarme a actuar, no solo a informarme.

Qué hace

  • Hoy — cola diaria accionable: las ofertas más frescas y con mejor encaje que aún no he postulado, más KPIs (score ≥80 sin postular, seguimientos pendientes, tasa de respuesta, nuevas en 24 h).
  • Ofertas — tabla filtrable (encaje, estado, modalidad, texto) con ubicación normalizada y marca para las ofertas locales.
  • Pipeline — kanban con arrastrar y soltar (Abiertas → CV → Postuladas → Entrevista → Resuelta) y recordatorios de entrevistas y próximas acciones.
  • Config — defino zona, modalidades aceptadas, score mínimo, fuentes de scraping, palabras clave y mi perfil/CV para la IA. Todo desde la web, sin tocar código.
  • Analíticas — embudo de conversión, actividad por semana, tecnologías más pedidas, tasa y velocidad de respuesta, mi tiempo de reacción, conversión por encaje/fuente/modalidad y salud del sistema.
  • Ficha de oferta — por qué encaja (veredicto + razones + keywords), carta editable y copiable, ajustes de CV y documentos IA (preparación de entrevista, análisis de carencias).

Arquitectura

El CRM no tiene BD propia: lee y escribe sobre el schema empleo de PostgreSQL, la única fuente de verdad. La ingesta y la IA son piezas opcionales y externas: un scraper (JobSpy + RSS) trae las ofertas y un motor de IA las puntúa (0-100) y genera la carta y los ajustes de CV. Ese motor puede ser un worker autónomo en Node (reduce el sistema a 3 piezas: Postgres + web + worker) o n8n (7 flujos, con Telegram y Obsidian). Cualquier proceso que inserte en empleo.job_offers alimenta el CRM — así que también funciona como gestor puramente manual.

Stack

Astro 5 en modo servidor (SSR, adaptador Node standalone), islas React 19 para el kanban, Tailwind CSS 4 y postgres.js con SQL parametrizado. Fuentes autohospedadas (Bunny Fonts), sin dependencias de nube.

IA configurable

Puntuación y generación con el LLM que elijas — Groq, Gemini u Ollama (local) — con una clave basta y el resto es fallback. Las claves se ponen en Config → IA (o en el .env del worker); el repo solo lleva placeholders, ningún dato ni clave real.

Seguridad y despliegue

Rol de BD empleo_web con privilegios mínimos (SELECT global; INSERT/UPDATE solo en las tablas del CRM), login opcional (APP_PASSWORD + AUTH_SECRET) y despliegue con un comando (docker compose up -d --build levanta Postgres + web + worker) tras un reverse proxy con TLS. Yo lo uso en local a diario; el repo está pensado para que otros lo levanten en su propio NAS.

Origen

Reescritura propia inspirada en ai-job-search de Mads Lorentzen (MIT), adaptada al mercado español y a mi flujo de trabajo. Publicado bajo licencia MIT.

Job-radar (Empleo CRM) is a self-hosted web CRM I built to automate and centralize my own job search — and released as open source (MIT) so anyone can reproduce it. It turns the usual chaos (a dozen browser tabs, duplicate listings, manual tracking) into a system where PostgreSQL is the single source of truth and the home screen is a "today queue" with the best open listings I haven't applied to yet. Built to help me act, not just read.

What it does

  • Today — an actionable daily queue: freshest high-fit listings I haven't applied to, plus KPIs (score ≥80 not applied, pending follow-ups, response rate, new in 24 h).
  • Listings — a filterable table (fit, status, work mode, free text) with normalized location and a marker for local roles.
  • Pipeline — a drag-and-drop kanban (Open → CV → Applied → Interview → Closed) with interview and next-action reminders.
  • Config — set your zone, accepted work modes, minimum score, scraping sources, keywords and your profile/CV for the AI — all from the web, no code and no vault edits.
  • Analytics — conversion funnel, weekly activity, most-requested technologies, response rate and speed, your reaction time, conversion by fit/source/mode and system health.
  • Listing detail — why it fits (verdict + reasons + keywords), an editable/copiable cover letter, CV tweaks and AI documents (interview prep, gap analysis).

Architecture

The CRM has no database of its own: it reads and writes the PostgreSQL empleo schema, the single source of truth. Ingestion and AI are optional, external pieces: a scraper (JobSpy + RSS) brings in listings and an AI engine scores them (0-100) and drafts the letter/CV. That engine can be a lightweight autonomous Node worker (reducing everything to 3 pieces: Postgres + web + worker) or n8n (7 flows, with Telegram and Obsidian). Any process that inserts into empleo.job_offers feeds the CRM — so it also works as a purely manual tracker.

Stack

Astro 5 in server mode (SSR, standalone Node adapter), React 19 islands for the kanban, Tailwind CSS 4 and postgres.js with parameterized SQL. Self-hosted fonts (Bunny Fonts), no cloud dependencies.

Configurable AI

Scoring and generation with your choice of LLM — Groq, Gemini or Ollama (local) — one key is enough and the rest are fallback. Keys go in Config → AI (or the worker's .env); the repo ships only placeholders, never real data or keys.

Security & deploy

A least-privilege DB role (empleo_web: global SELECT, INSERT/UPDATE only on the CRM tables), optional login (APP_PASSWORD + AUTH_SECRET), and a one-command deploy (docker compose up -d --build brings up Postgres + web + worker) behind a TLS reverse proxy. I run it locally every day; the repo is designed for others to spin up on their own NAS.

Origin

An original rewrite inspired by ai-job-search by Mads Lorentzen (MIT), adapted to the Spanish market and my own workflow. Released under the MIT license.