Privacy

Privacy Policy

Effective: 2026-04-30

This site is a personal side project operated by Lyubomir Atanasov (the "Operator"). It is not affiliated with any employer, past or present. The site collects the minimum data needed to run and rate-limit the service. This page explains what is collected and why.

What we store and for how long

Concrete per-key list. Everything below auto-expires through Redis TTL; there is no manual deletion path.

Cookies
  • jk_fp: random per-browser identifier, HTTP-only, sameSite=lax. Lifetime 400 days. Hashed with HMAC-SHA256 before persistence; the raw cookie value never reaches Redis or logs.
  • jk_tos_v1 (localStorage, not a cookie): records whether you ticked the "I agree to Terms" checkbox. Two values: 1 (agreed) or 0 (disagreed).
IP addresses

Hashed with a daily salt that rotates at UTC midnight. Only the salted hash is stored, scoped to the UTC day, so yesterday's hash is not comparable to today's. The raw IP is never written to long-term storage.

Saved prompts

Redis key jk:prompt:<slug>. TTL: 30 days, refreshed every time you edit. Contains your wizard config (mode, failure mode, scale, bias defenses), the rendered evaluator prompt, the score-range prompt, citation keys, slug, and your fp HMAC as an ownership token (server-only, never returned to clients). Includes any few-shot examples you saved.

Extract cache

Redis key jk:extract:cache:<sha256-of-input>. TTL: 6 hours. The raw text you pasted is NOT stored as a value, only as the hash that forms the key. The cached value is the inferred wizard config, a one-sentence summary, and up to 2 few-shot examples drawn from a pasted span. Those derived examples may quote your input; if you pasted PII it persists in the cache for 6 hours.

Synthesize cache

Redis key jk:synth:cache:<slug>:<templateVersion>. TTL: 24 hours. Stores 4 LLM-generated test examples for a saved judge (synthetic content reflecting the prompt's domain).

Benchmark cache

Redis key jk:bench:cache:<sha256-of-prompt-and-examples-and-models>. TTL: 6 hours. Stores per-model verdicts, pairwise Cohen kappa, disagreements, total cost, and the examples passed in.

Rate limit counters

Redis keys jk:rl:<surface>:ip:<ipHash>:<day> and jk:rl:<surface>:fp:<fpHmac>:<day>. TTL: 26 hours. A single integer per surface, per IP-hash, per fp HMAC, per UTC day. Cleared automatically.

Daily salt

Redis key jk:salt:current. TTL: 72 hours. The random hex used to salt IP hashes. Rotated daily by a cron job at UTC midnight.

Server logs

Standard request logs at our hosting provider (Vercel). Retained for operational purposes only. We do not write custom logs of pasted content or generated prompts.

What we do not collect

  • No accounts, email addresses, or login credentials.
  • No analytics, tracking pixels, or third-party advertising.
  • No raw IP addresses persisted to long-term storage; only the daily-salted hash.

Third-party processors

The following processors handle data on our behalf:

  • Vercel: hosting and edge runtime.
  • Cloudflare: TLS termination, optional bot challenge.
  • Upstash: Redis storage for prompts and rate limit counters.
  • OpenRouter: LLM gateway used by the benchmark, extract, and synthesize features. Routes are configured with data_collection: deny so upstream providers do not use prompts for training.

Your choices

You can clear the jk_fp cookie in your browser at any time; this resets your rate limit and severs continuity between future sessions. You can avoid IP collection entirely by accessing the service through a VPN or anonymizing network.

Generated prompt slugs auto-expire after 30 days. There is no account, so there is nothing further to delete.

Contact

For privacy questions, contact the Operator via lyuata.com.

Changes

This policy may be updated. The effective date at the top will change when it does. There is no mailing list to notify; check this page if you depend on its contents.