Monitor Alta Dirección Pública
¿En qué etapa va cada concurso de alta dirección del Estado — y cuándo debería reabrirse cada cargo?
FastAPI · APScheduler · SQLite · 7.092 concursos · :8009
- Estado
- En vivo · ingesta diaria
- Fuente de datos
- 3 APIs Servicio Civil (ADP)
- Stack
- FastAPI · APScheduler · SQLite
- Cadencia
- Snapshot diario 06:30 CLT
- Cobertura
- 7.092 concursos · 429 instituciones
- Infraestructura
- Raspberry Pi · $0 cloud
El problema
El Sistema de Alta Dirección Pública del Servicio Civil concursa los cargos directivos del Estado, pero su portal muestra los concursos como listas sueltas por etapa. Es difícil ver, de un vistazo, en qué punto del proceso va cada cargo de una institución — y casi imposible anticipar cuándo un cargo volverá a concursarse. Quise convertir esas listas en una línea de tiempo legible, tipo carta Gantt agrupada por servicio público.
Qué construí
Prototipé un dashboard que ingiere las tres APIs oficiales del Servicio Civil, las unifica en una base local y dibuja una carta Gantt de los concursos activos, agrupados por institución (estilo Jira), más una estimación de cuándo debería reabrirse cada cargo.
- check_circle Integra las tres APIs JSON oficiales (postulación, evaluación e histórico de ~6.900 concursos finalizados) con autenticación Basic que el propio portal público expone.
- check_circle Una carta Gantt agrupa los concursos activos por institución y muestra cada cargo en su etapa actual, con su ventana de postulación real.
- check_circle Un buscador global cubre las 429 instituciones (activas e históricas): al elegir una se abre su historia completa por cargo, con carga diferida.
- check_circle Para cada cargo con suficiente historia, estima la próxima apertura según la cadencia mediana entre sus concursos pasados.
- check_circle Un snapshot diario (06:30, hora de Santiago) reconstruye las transiciones de etapa, que la fuente no fecha. Corre 24/7 sobre una Raspberry Pi, $0 cloud.
Qué es real y qué es estimado
Esta es la parte donde la honestidad importa más: el dashboard separa con cuidado el dato oficial de la inferencia.
- verified Real: la ventana de postulación (inicio y cierre, con ampliaciones) y la etapa actual de cada concurso vienen directo de la API.
- schedule Reconstruido: las fechas de transición entre etapas — la API no las publica, las arma el snapshot diario. Lo observado en vivo es preciso; lo anterior a la primera ingesta es aproximado.
- trending_up Estimado: la fecha de renovación es una proyección por cadencia histórica, no el vencimiento oficial del nombramiento (la fuente no lo publica). No se inventa la etapa de "nómina", que la API no expone.
Cómo funciona
El backend es FastAPI + SQLite. Un job de APScheduler ingiere las tres APIs cada día y guarda tres tablas: el snapshot de concursos, la línea de tiempo de transiciones detectadas y una bitácora de cada corrida. La API propia expone el resumen, el Gantt filtrable por ministerio y región, el índice de instituciones y las estimaciones de renovación.
Decisiones técnicas
Snapshot diario en vez de confiar en la fuente
La API entrega la etapa actual pero no fecha los cambios de etapa. Un job a las 06:30 los detecta comparando snapshots día a día: preferí reconstruir la línea de tiempo a mostrar solo la foto del momento.
Unificar tres APIs en una sola base local
Postulación, evaluación e histórico llegan separadas; las consolido en SQLite con una corrida idempotente. Es lo que permite el Gantt por institución y el buscador sobre 429 instituciones sin pegarle a tres endpoints en cada carga.
Estimar la reapertura, declarándola como estimación
La fecha de renovación se proyecta por la cadencia mediana de cada cargo y se marca como estimada, no como vencimiento oficial (la fuente no lo publica). Preferí una señal útil y honesta a un campo vacío.
¿Quieres explorar la carta Gantt?
El dashboard corre ahora mismo sobre la Pi.