Suite forense web para auditoria de integridad documental (.pdf y .docx) e imagen, con enfoque en evidencia tecnica reproducible y politica conservadora.
ScanIt responde una pregunta concreta: "¿hay señales tecnicas de manipulacion o generacion sintetica?"
No adivina. Aplica Zero Guessing Policy para priorizar trazabilidad y reducir falsos positivos agresivos.
Principios del proyecto:
- Evidencia primero (timeline, metadatos, hashes, señales tecnicas).
- Decisiones auditables (anomalias explicitas + cobertura de evidencia).
- Salida conservadora (
no_concluyente) cuando falta soporte suficiente.
npm install
npm run devAbre http://127.0.0.1:5173, sube un .pdf o .docx y ejecuta la auditoria.
Si quieres evaluar el dataset completo:
npm run eval:datasetSe generaran reportes en dataset/reports/.
- Arrancar app en local (
npm run dev). - Probar 1 documento real y 1 IA desde
dataset/. - Revisar en UI:
verdictanomaliesevidenceCoverageconfidence
- Ejecutar
npm run eval:datasetpara validar comportamiento global.
- Extraccion de texto, timeline y metadatos de
docxypdf. - Metricas forenses: entropia, uniformidad sintactica, diversidad lexical, ratio palabras/minuto.
- Comprobaciones DOCX: autor/ultimo editor, coherencia temporal interna.
- Comprobaciones PDF: firma estructural (ByteRange) y posible tampering post-firma.
- Capa linguistica con Groq (si hay clave y muestra textual suficiente).
- Veredicto final con politica conservadora y cobertura de evidencia.
- ELA (Error Level Analysis), PRNU aproximado y ruido por zonas.
- Clasificacion visual IA para validar que la evidencia es documental.
- Flujo con logs operativos (
[AUDIT],[CHECK],[FAIL],[ALERTA]). - Informe tecnico PDF.
- Reporte JSON de evaluaciones masivas del dataset.
- Frontend:
SvelteKit+Svelte 5 - Backend API: endpoints
+server.ts - Procesado docs:
mammoth,jszip,pdfjs-dist,pdf-parse - OCR base:
tesseract.js - IA:
groq-sdk - Reportes PDF:
jspdf
Este proyecto se distribuye bajo licencia PolyForm Noncommercial 1.0.0 (ver LICENSE).
Para uso comercial, licencia comercial separada y acuerdo directo con el autor.
src/routes/+page.svelte: UI principal y flujo de auditoria.src/routes/api/audit-document/+server.ts: pipeline forense documental.src/routes/api/audit-image-ai/+server.ts: capa visual IA.scripts/eval-dataset.mjs: evaluacion masiva del dataset.scripts/eval-until-noon.ps1: bucle de reintentos hasta ventana horaria.dataset/realydataset/ia: corpus etiquetado para calibracion.dataset/reports: resultados (eval-details-*,eval-metrics-*, parciales).
Pasada completa mas reciente documentada:
- Dataset: 153 documentos (63 real / 90 IA)
- Failed HTTP: 0
- Undecided: 50 (32.68%)
- Decididos: 103
- TP: 50 / TN: 53 / FP: 0 / FN: 0
Archivo de referencia:
dataset/reports/eval-metrics-2026-03-28T17-42-27.106Z.json
Nota: los valores cambian al recalibrar reglas o variar el estado de servicios IA.
GROQ_API_KEY=tu_api_key
PUBLIC_SITE_URL=http://localhost:5173# Opcional: pausa capa linguistica en PDF
SCANIT_SAFE_MODE=false
# Umbral para permitir "anomalias_detectadas" en PDF
# cuando solo existe LINGUISTIC_AI_VERY_HIGH
SCANIT_PDF_LINGUISTIC_DECISIVE_MIN=90
# Si Groq falla en PDF breve, no permitir "integro"
SCANIT_PDF_INTEGRO_MAX_WORDS_IF_LINGUISTIC_ERROR=600SCANIT_EVAL_URL=http://127.0.0.1:5173/api/audit-document
SCANIT_EVAL_FETCH_ATTEMPTS=6
SCANIT_EVAL_MAX_PER_CLASS=0
SCANIT_EVAL_PARTIAL_EVERY=10
SCANIT_EVAL_RUN_MS=0npm install
npm run devServidor local fijado en:
http://127.0.0.1:5173(strictPort: trueen Vite)
Chequeos recomendados:
npm run check
npm run buildnpm run eval:datasetset NODE_OPTIONS=--dns-result-order=ipv4first
set SCANIT_EVAL_URL=http://127.0.0.1:5173/api/audit-document
node scripts/eval-dataset.mjspowershell -ExecutionPolicy Bypass -File .\scripts\eval-until-noon.ps1integro: señales consistentes y cobertura suficiente.anomalias_detectadas: presencia de señales tecnicas relevantes.no_concluyente: evidencia insuficiente, conflictiva o no robusta.
Reglas destacadas:
- En PDF, señal linguistica aislada no fuerza anomalia salvo umbral alto configurable.
- En PDF breve con error linguistico, no se declara
integro. - Se prioriza minimizar falsos positivos sin perder trazabilidad de decisiones.
- Firma PDF en modo estructural (no PKI completa end-to-end).
- OCR es basico en PDFs sin capa textual.
- Servicios IA externos pueden saturarse y afectar cobertura linguistica.
- Ningun detector es infalible: siempre requiere criterio humano.
- Subir repo a GitHub.
- Importar en Vercel como SvelteKit.
- Configurar variables (
GROQ_API_KEY,PUBLIC_SITE_URL, opcionalesSCANIT_*). - Desplegar.
Antes de publicar el repositorio:
- No subas documentos con datos personales (
dataset/realprivado). - No subas reportes generados localmente (
dataset/reports). - No subas
.envni secretos (GROQ_API_KEY). - Si necesitas ejemplos, usa un corpus anonimo/sintetico.
ScanIt es una herramienta de apoyo tecnico. No sustituye evaluacion humana ni asesoramiento legal/pericial formal.