DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Personal Data Engineering job radar built with Python, PostgreSQL, Docker and Next.js, with automated pipelines, explainable matching and a live dashboard.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Job Radar agrega ofertas de Data Engineering directamente desde career sites, las normaliza, aplica reglas de matching explícitas y mantiene su ciclo de vida en PostgreSQL. El resultado se consulta en una aplicación web y puede enviarse por correo al terminar cada ingesta.
Arquitectura · Conectores · Operación · Contribuir · Seguridad
Buscar oportunidades junior o intermedias exige revisar portales con formatos distintos, detectar duplicados y volver a comprobar si una oferta continúa abierta. Job Radar automatiza ese trabajo sin ocultar la decisión:
Job común;Buena coincidencia, Stretch o fuera de
objetivo mediante reglas auditables;flowchart LR
A[ATS y career sites] --> B[Conectores Python]
B --> C[Job normalizado]
C --> D[Matching y países]
D --> E[(PostgreSQL)]
E --> F[Next.js]
E --> G[Correo Resend]
H[GitHub Actions] --> B
main.py solo delega en el orquestador. En cada ejecución:
job_radar/connectors/registry.py entrega los conectores en orden.Job.Job una sola vez.save_jobs() hace el upsert sin ejecutar matching; las ofertas ausentes se
cierran solo si el snapshot lo permite y un upsert posterior las reactiva.ingestion_runs y source_runs conservan estado, duración, recuentos y
errores.La explicación completa está en docs/ARCHITECTURE.md.
Job Radar consulta 105 fuentes empresa/ATS configuradas en código.
job_radar/connectors/registry.py es la fuente de verdad. El catálogo detallado
de empresas, tipos y flags se genera en
docs/CONNECTORS.md.
Las reglas viven en job_radar/matching/rules.py y están orientadas a un
perfil de Data Engineering con aproximadamente un año de experiencia:
Stretch roles técnicos adyacentes si la descripción contiene
suficientes señales de datos;countries con
geonamescache; los estados de EE. UU. ("Atlanta, GA", "New Jersey") y los
códigos regionales junto a un país explícito no se leen como países.El extractor de salario exige una moneda (€, $, £, EUR, USD o GBP),
acepta moneda antes o después, sufijos k/K, rangos y periodos publicados. El
extractor de experiencia reconoce expresiones inglesas y españolas y filtra
menciones que describen la antigüedad de la empresa. Ambos devuelven texto de
la fuente: no calculan ni normalizan una cifra inexistente.
La clave primaria de jobs es (source, source_job_id). Cada oferta mantiene
first_seen_at, last_seen_at, active y closed_at; reaparecer en un
snapshot actualiza los datos, marca active = TRUE y limpia closed_at.
Antes de cerrar ausentes, job_radar/orchestration/snapshots.py compara el recuento con
el historial reciente. Los snapshots vacíos siempre suprimen cierres. Una
caída grande respecto a una línea base suficiente se marca suspicious y
también suprime cierres hasta que el nuevo nivel se estabiliza. Las ofertas sí
recibidas se actualizan aun cuando los cierres estén suprimidos.
Cada pipeline crea una fila en ingestion_runs y una por fuente en
source_runs. Se guardan estados, tiempos, ofertas vistas/nuevas/cerradas,
matches, salud del snapshot y errores. Los logs replican esas métricas con
run_id y source_run_id.
La aplicación web/ es un Server Component dinámico de Next.js. Consulta
PostgreSQL desde el servidor, muestra solo ofertas activas y ofrece búsqueda
por título, empresa, país, coincidencias y paginación de 20 resultados. España
es el filtro inicial.
La web exige WEB_DATABASE_URL en Vercel; fuera de Vercel admite
DATABASE_URL como alternativa. El código no puede garantizar los privilegios
del rol: usar una credencial con solo SELECT para la web es una obligación
operativa, no una propiedad impuesta por la aplicación.
Si RESEND_API_KEY está configurada, la ingesta envía un correo HTML y texto
plano a NOTIFICATION_EMAIL. Incluye todas las coincidencias activas. Los
fallos de fuentes requeridas marcan el resumen como parcial y
NOTIFICATION_RUN_ID se usa como clave de idempotencia cuando existe.
.github/workflows/job-radar.yml permite ejecución manual y programa el cron
0 6 */2 * * con timezone Europe/Madrid: se ejecuta a las 06:00 en los días
del mes seleccionados por */2. El workflow construye la imagen Docker,
comprueba los secretos obligatorios y ejecuta el contenedor sin privilegios,
con filesystem de solo lectura y /tmp temporal.
Consulta estados, diagnóstico y configuración operativa en docs/OPERATIONS.md.
| Capa | Tecnología fijada o usada por el repo |
|---|---|
| Pipeline | Python 3.12, Psycopg 3.3.6, geonamescache 3.0.2 |
| Datos | PostgreSQL 17 en Compose y CI; SQL versionado en sql/ |
| Web | Next.js 16.4.2, React 19.3.0, TypeScript 5.9.3, Tailwind CSS 4.3.3, node-postgres 8.23.0 |
| Automatización | Docker, GitHub Actions, Dependabot, CodeQL y Dependency Review |
| Despliegue web | Vercel-compatible; la demo enlazada usa un dominio vercel.app |
CI y compose.web.yaml usan Node.js 24. El repositorio no contiene la
configuración de los recursos externos de Neon, Resend o Vercel; únicamente su
integración mediante variables de entorno.
web/.python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install --require-hashes -r requirements.lock
cp .env.example .env
Crea una base, exporta su URL y aplica las migraciones pendientes:
export DATABASE_URL=postgresql://job_radar:password@localhost:5432/job_radar
python3 scripts/migrate.py
python3 scripts/migrate.py --check
python3 main.py
Una base que ya tenga las migraciones históricas necesita el baseline manual descrito en docs/OPERATIONS.md.
Con Docker Compose:
docker compose up -d db
docker compose run --rm -e DATABASE_URL="host=db" \
pipeline python scripts/migrate.py
docker compose run --rm pipeline
cp web/.env.example web/.env.local
cd web
npm ci
npm run dev
Abre http://localhost:3000. La guía específica está en web/README.md.
Validación Python local:
python3 -m pip install --require-hashes -r requirements-dev.lock
python3 -m pip check
python3 -m pip_audit -r requirements.lock --strict
python3 scripts/update_source_catalog.py --check
python3 -m compileall -q main.py job_radar tests scripts
python3 -m unittest discover -s tests -v
Las pruebas PostgreSQL usan TEST_DATABASE_URL; si no está configurada se
omiten localmente. CI levanta PostgreSQL 17 y las ejecuta.
Validación web equivalente a los checks obligatorios:
cd web
npm ci
npm audit --omit=dev --audit-level=high
npm audit --audit-level=high || true
npm run lint
npm test
npm run build
El audit npm completo es informativo en CI; el audit de dependencias de producción es el que bloquea. CI también ejecuta CodeQL para Python y JavaScript/TypeScript y Dependency Review en pull requests.
El código usa consultas parametrizadas, restringe enlaces externos a HTTPS,
acota filtros y paginación, aplica timeouts de PostgreSQL y envía una CSP con
nonce desde web/src/proxy.ts. web/next.config.ts añade cabeceras HSTS,
anti-framing, MIME sniffing, referrer y permissions policy. Los workflows
tienen permisos explícitos mínimos y acciones fijadas por SHA.
Algunos controles dependen de la operación: privilegios del rol de base de datos, protección de ramas, configuración de Vercel/Neon, rotación de secretos y opciones de seguridad de GitHub no pueden demostrarse solo desde este repo. La separación se explica en SECURITY.md.
Distribuido bajo la Apache License 2.0. Consulta NOTICE para la atribución del proyecto.