# RingoChecker

RingoChecker es una PWA orientada a Cloudflare Pages que ayuda a revisar señales visibles y objetivas de confianza, transparencia y fiabilidad básica de una web pública.

No usa analytics, no usa trackers y no inventa reputación externa. El proyecto funciona en dos modos:

- modo cliente puro: se puede subir como carpeta estática y funciona con las limitaciones de CORS del navegador
- modo híbrido con `_worker.js`: permite leer HTML de webs externas desde tu propio despliegue y da resultados mucho más reales

## Stack

- HTML, CSS y JavaScript vanilla
- Módulos ES nativos
- PWA con `manifest.webmanifest` y `service-worker.js`
- Sin dependencias npm obligatorias

## Estructura

```text
RingoChecker/
├── index.html
├── offline.html
├── 404.html
├── _worker.js
├── manifest.webmanifest
├── service-worker.js
├── README.md
├── SPEC.md
├── AGENTS.md
├── assets/
│   ├── icons/
│   └── images/
└── src/
    ├── css/
    └── js/
        ├── analysis/
        ├── rules/
        └── utils/
```

## Cómo ejecutar en local

Como la PWA necesita un servidor HTTP para registrar el Service Worker, no abras `index.html` con `file://`.

Opción simple con Python 3:

```bash
python3 -m http.server 8080
```

Después abre:

```text
http://localhost:8080
```

## Cómo desplegar en Cloudflare Pages

Hay dos opciones reales de despliegue.

### Opción A: Direct Upload con `_worker.js` recomendado

1. En Cloudflare ve a `Workers & Pages`.
2. Crea una aplicación nueva.
3. Elige la opción de `Direct Upload` o `Drag and drop your files`.
4. Sube la carpeta completa del proyecto o su contenido estático.
5. Despliega.

Notas:

- Cloudflare documenta Direct Upload para carpetas estáticas y subida manual de assets.
- En Direct Upload no necesitas un proceso de build para este MVP.
- El dashboard no compila una carpeta `functions/`, pero sí soporta `_worker.js`.
- Con `_worker.js` en la raíz, `POST /api/analyze` puede funcionar también en drag and drop.
- Si subes el proyecto sin `_worker.js`, el análisis de terceros dependerá de CORS y muchos sitios saldrán como no disponibles.

Referencias oficiales:

- [Cloudflare Pages Direct Upload](https://developers.cloudflare.com/pages/get-started/direct-upload/)
- [Cloudflare Pages Getting started](https://developers.cloudflare.com/pages/get-started/)
- [Cloudflare Pages Advanced mode](https://developers.cloudflare.com/pages/functions/advanced-mode/)

### Opción B: Wrangler

Si prefieres desplegar por CLI en lugar de drag and drop:

```bash
npx wrangler pages project create
npx wrangler pages deploy .
```

Notas:

- Wrangler también soporta `_worker.js`.
- La app usa primero `/api/analyze` y solo cae a cliente si el endpoint no existe.
- Este sigue siendo el modo recomendado si quieres control más reproducible sobre despliegues.

## Limitaciones reales del MVP

- En modo cliente, muchos sitios no permiten leer su HTML por CORS, anti-bot o políticas propias.
- En modo híbrido con `_worker.js`, se evita el bloqueo CORS del navegador, pero algunos sitios pueden seguir bloqueando por anti-bot, geografía, WAF o políticas del host.
- Si la lectura falla, RingoChecker no inventa resultados: marca esas comprobaciones como no disponibles.
- El endpoint server-side bloquea hosts locales, privados o reservados para reducir riesgos SSRF.
- No se consulta WHOIS, DNS, listas negras, malware feeds ni reputación externa automáticamente.
- No se scrapea Trustpilot, ScamAdviser, Google ni BBB. Solo se generan accesos directos para verificación manual.
- La evaluación es orientativa. No es una auditoría legal, una garantía de seguridad ni una certificación antifraude.

## Decisiones de privacidad y seguridad

- Sin analytics.
- Sin trackers.
- Sin fuentes remotas.
- Sin CDNs de terceros.
- Sin almacenamiento persistente de las URLs analizadas.
- `fetch()` del análisis usa `credentials: "omit"` y `referrerPolicy: "no-referrer"`.
- `_worker.js` responde con `cache-control: no-store` y no persiste las URLs analizadas.
- `_worker.js` bloquea `localhost`, IPs privadas y hosts reservados.
- El HTML remoto nunca se inserta en el DOM de la app. Se parsea de forma aislada y se extraen señales conservadoras.
- La política CSP está definida en `index.html`.
- El Service Worker cachea solo la app shell y recursos locales de la propia aplicación.

## Soporte offline

- Funciona offline para la shell de la app y páginas locales como `offline.html`.
- La demo local sigue disponible porque forma parte del código del cliente.
- El análisis real de un sitio público necesita conexión y depende de las políticas del sitio destino.

## Filosofía del scoring

- Sistema de reglas transparente y explicable.
- Cada regla tiene peso y descripción legibles.
- Las comprobaciones no disponibles no suman ni restan por defecto.
- La puntuación parte de una base neutral y se ajusta por señales objetivas.
- Los estados finales son: `Good signs`, `Caution` y `High risk`.

## Futuras mejoras seguras

- Revisión de DNS, MX, WHOIS y edad del dominio desde backend seguro.
- Captura de redirecciones y cadenas técnicas más completas.
- i18n real con catálogos separados.
- Exportación de informe a PDF.
- Modo comparativo entre varias URLs.

## Mantenimiento

- Mantén la separación entre UI, lógica de análisis, reglas y utilidades.
- Si añades nuevas heurísticas, deben ser conservadoras y explicables.
- No conviertas el scoring en una caja negra.
