Privacy note
This note describes what the Marginlog code in this repository does with data. It is not a privacy policy issued by a named organisation.
Those items are left blank on purpose. This page does not invent them.
Cases and photos stay in this browser
There is no account. Saving a case does not upload the case. The browser keeps:
- localStorage marginlog:v1 — case name, other party, goal, entry text, the time you entered, the time you say it happened, severity, duration, tags, witness text, notes, void reasons, steps, archived flag, the chosen language and the open case.
- localStorage marginlog:v1:cp — how many sealed records the case had, and the last fingerprint, so a shortened log can be noticed later.
- localStorage marginlog:v1:lastbackup — when a backup file was last downloaded.
- localStorage marginlog:v1:corrupt and marginlog:v1:corrupt-b — a copy of data the app could not read, if it managed to keep one.
- IndexedDB database marginlog, store photos — resized photos.
- localStorage marginlog:license — the license key and when it was last checked, after a check that accepted it.
- localStorage marginlog:gate — whether the last status said paid access was on (1 or 0).
- localStorage marginlog-ai-key — an Anthropic API key, only if you save one.
Clearing this site’s data in the browser removes those copies from that browser. The app can delete a case (with a short undo) and can remove the AI key. This code does not keep a server copy of cases, so it has nothing on a server to delete and it states no deletion deadline.
Exports can hold personal data
A download stays on your device unless you send it on yourself. It contains what you typed, which can include other people’s names and details.
- Backup JSON, including photos. A passphrase, if you set one, encrypts the file with AES-GCM. The key is derived with PBKDF2-SHA256 and 310000 iterations. The passphrase is not stored. This app cannot recover a forgotten passphrase.
- Report (copy, print or PDF, Markdown), chronology (.txt), CSV, digest (.md), calendar (.ics) and the written-notice draft.
- Print and PDF can include the photos. Reports and CSV include short fingerprints. The calendar file includes case and step names you entered.
License check
When the app opens, it sends GET /api/license to this same website. There is no body. The reply is JSON with configured set to true or false. configured is true only when the server environment has LEMONSQUEEZY_PRODUCT_ID set. The function in this repository does not write that request to a database.
When you press Unlock, and again about every 7 days while a key is saved, the app sends POST /api/license with JSON {"key":"<the license key>"}.
If paid access is not configured, the function replies {configured:false} and does not contact Lemon Squeezy.
If it is configured, the function sends the key as the form field license_key to https://api.lemonsqueezy.com/v1/licenses/validate. It accepts the key only when Lemon Squeezy reports valid, the status is active or inactive, and the product id matches LEMONSQUEEZY_PRODUCT_ID. The browser is told only {configured, valid}. This function does not store the rest of Lemon Squeezy’s reply. The browser then stores the key in localStorage.
The service worker does not cache /api. The status request also asks the browser not to use its HTTP cache (cache: no-store). Case text, photos, names and the AI key are not part of the license request.
Payment
This website does not offer a checkout. The checkout address in the app configuration is still a placeholder that contains example.com, and buy buttons stay hidden for that reason. Price, refunds, billing and an activation limit are not yet available. A test checkout is not a sale, and this site does not link to one.
The license code can call Lemon Squeezy’s license API, as described above. That is not a statement that a store is open or that any price has been set.
Optional AI
Nothing is sent to Anthropic unless you save your own API key and press Analyse with AI. The request is POST https://api.anthropic.com/v1/messages, model claude-haiku-5-5. Your key is the x-api-key header. It stays in this browser and is not sent to /api/license.
The message is counts and dates for one case: type, totals, date span, durations, severity, which detail items are missing (text length, duration, witness, photo, timing, tag), readiness checks and step timing. It does not include the case name, entry text, notes, names, addresses, phone numbers or tags. If an other party was filled in, the label sent is 당사자 A. The reply is shown on screen and is not written to disk by this code. It is an estimate, not a legal assessment.
Hosting and other parties
The site is published for https://marginlog.pages.dev with Cloudflare Pages. Opening it sends an ordinary browser request to that host, which can include the page address, IP address and user agent. This repository adds no analytics script and sets no cookie of its own. It does not say how long the host keeps connection logs.
Parties this code can contact:
- Cloudflare, as the host of the pages and of /api/license.
- Lemon Squeezy at api.lemonsqueezy.com, only for the license validation above, and only when paid access is configured.
- Anthropic at api.anthropic.com, only for the optional AI request.
This site does not load a font file, an analytics script or a payment frame. The typefaces are ones already on your device. The service worker stores successful same-origin GET responses, except anything under /api, so the app can open offline. It does not store other websites’ responses.