Nota de privacidad
Esta nota describe lo que hace con los datos el código de Marginlog de este repositorio. No es una política de privacidad emitida por una organización con nombre.
Esos puntos se dejan en blanco a propósito. Esta página no los inventa.
Los casos y las fotos se quedan en este navegador
No hay cuenta. Guardar un caso no sube el caso. El navegador conserva:
- localStorage marginlog:v1 — nombre del caso, otra parte, objetivo, texto, la hora en que lo escribiste, la hora que dices que ocurrió, gravedad, duración, etiquetas, nota del testigo, notas, motivos de anulación, pasos, si está archivado, el idioma elegido y el caso abierto.
- localStorage marginlog:v1:cp — cuántos registros sellados tenía el caso y la última huella, para notar más tarde si el final del registro se acortó.
- localStorage marginlog:v1:lastbackup — cuándo se descargó por última vez un archivo de copia.
- localStorage marginlog:v1:corrupt y marginlog:v1:corrupt-b — una copia de datos que la app no pudo leer, si logró conservarla.
- Base IndexedDB marginlog, almacén photos — fotos reducidas.
- localStorage marginlog:license — la clave de licencia y cuándo se comprobó por última vez, después de una comprobación que la aceptó.
- localStorage marginlog:gate — si la última respuesta dijo que el acceso de pago estaba activo (1 o 0).
- localStorage marginlog-ai-key — una clave de API de Anthropic, solo si la guardas.
Borrar los datos de este sitio en el navegador quita esas copias de ese navegador. La app puede borrar un caso (con un deshacer breve) y puede quitar la clave de IA. Este código no guarda una copia de los casos en un servidor, así que no tiene nada que borrar allí y no indica un plazo de borrado.
Las exportaciones pueden contener datos personales
Una descarga se queda en tu dispositivo salvo que tú la envíes. Contiene lo que escribiste, que puede incluir nombres y datos de otras personas.
- JSON de copia, con fotos. Si pones una frase, el archivo se cifra con AES-GCM. La clave se deriva con PBKDF2-SHA256 y 310000 iteraciones. La frase no se guarda. Esta app no puede recuperar una frase olvidada.
- Informe (copiar, imprimir o PDF, Markdown), cronología (.txt), CSV, resumen (.md), calendario (.ics) y el borrador de aviso escrito.
- La impresión y el PDF pueden incluir las fotos. Los informes y el CSV incluyen huellas cortas. El calendario incluye los nombres de caso y de paso que escribiste.
Comprobación de licencia
Al abrir la app, envía GET /api/license a este mismo sitio. No hay cuerpo. La respuesta JSON tiene configured en true o false. configured es true solo cuando el entorno del servidor tiene LEMONSQUEEZY_PRODUCT_ID. La función de este repositorio no escribe esa petición en una base de datos.
Al pulsar Desbloquear, y de nuevo cada unos 7 días mientras haya una clave guardada, la app envía POST /api/license con JSON {"key":"<la clave de licencia>"}.
Si el acceso de pago no está configurado, la función responde {configured:false} y no contacta con Lemon Squeezy.
Si lo está, la función envía la clave como campo de formulario license_key a https://api.lemonsqueezy.com/v1/licenses/validate. La acepta solo si Lemon Squeezy indica valid, el estado es active o inactive y el id de producto coincide con LEMONSQUEEZY_PRODUCT_ID. Al navegador solo se le dice {configured, valid}. Esta función no guarda el resto de la respuesta de Lemon Squeezy. El navegador guarda entonces la clave en localStorage.
El service worker no guarda en caché /api. La petición de estado también pide al navegador que no use su caché HTTP (cache: no-store). El texto del caso, las fotos, los nombres y la clave de IA no forman parte de la petición de licencia.
Pago
Este sitio web no ofrece un pago. La dirección de pago en la configuración de la app sigue siendo un marcador que contiene example.com, y por eso los botones de compra permanecen ocultos. El precio, los reembolsos, la facturación y un límite de activaciones aún no están disponibles. Un pago de prueba no es una venta, y este sitio no enlaza a uno.
El código de licencia puede llamar a la API de licencias de Lemon Squeezy, como se describe arriba. Eso no afirma que una tienda esté abierta ni que se haya fijado un precio.
IA opcional
No se envía nada a Anthropic salvo que guardes tu propia clave de API y pulses Analizar con IA. La petición es POST https://api.anthropic.com/v1/messages, modelo claude-haiku-5-5. Tu clave va en la cabecera x-api-key. Se queda en este navegador y no se envía a /api/license.
El mensaje son recuentos y fechas de un caso: tipo, totales, intervalo de fechas, duraciones, gravedad, qué detalles faltan (longitud del texto, duración, testigo, foto, momento del registro, etiqueta), comprobaciones de preparación y fechas de los pasos. No incluye el nombre del caso, el texto de las entradas, las notas, nombres, direcciones, teléfonos ni etiquetas. Si se rellenó otra parte, la etiqueta enviada es 당사자 A. La respuesta se muestra en pantalla y este código no la escribe en disco. Es una estimación, no una valoración legal.
Alojamiento y otros
El sitio se publica en https://marginlog.pages.dev con Cloudflare Pages. Abrirlo envía una petición normal del navegador a ese anfitrión, que puede incluir la dirección de la página, la dirección IP y el agente de usuario. Este repositorio no añade un script de analítica ni pone una cookie propia. No dice cuánto tiempo guarda el anfitrión los registros de conexión.
Partes a las que este código puede dirigirse:
- Cloudflare, como anfitrión de las páginas y de /api/license.
- Lemon Squeezy en api.lemonsqueezy.com, solo para la validación de licencia de arriba, y solo cuando el acceso de pago está configurado.
- Anthropic en api.anthropic.com, solo para la petición opcional de IA.
Este sitio no carga un archivo de fuente, un script de analítica ni un marco de pago. Los tipos de letra son los que ya tiene tu dispositivo. El service worker guarda las respuestas GET correctas del mismo origen, excepto todo lo que esté bajo /api, para que la app pueda abrirse sin conexión. No guarda respuestas de otros sitios.