How private AI text rewriting stays protected
The Unicode inspector and selective cleaner execute in the browser. Pasting, scanning, selecting, and removing supported physical controls does not send the text to the NoLLMWM server. The interface makes the boundary visible: content leaves the browser only after an authenticated user explicitly chooses Rewrite and confirms ownership or authorization.
Browser-local processing reduces exposure but does not make the device itself trusted. Browser extensions, managed devices, clipboard tools, and the operating system may have their own access. Do not paste secrets into any web application from a compromised or shared device.
No raw-text persistence
Authorized rewrite text passes through the application server to the configured OpenRouter model. The application does not insert source or output text into Postgres. Usage records contain random request and user IDs, character counts, model, style, status, and timestamps. Application logs use those same safe identifiers and counts, never prompts or returned prose.
The upstream model provider necessarily receives the request to produce the rewrite and applies its own data handling terms. Users should evaluate those terms before processing confidential material. NoLLMWM is not intended for secrets, authentication data, regulated records, or content whose owner has prohibited third-party model processing.
Authentication and abuse controls
Passwords are hashed with Node crypto scrypt, a random salt, and fixed resource parameters. Sessions use a random database-backed token plus an HMAC signature in a Secure, HttpOnly, SameSite=Lax cookie in production. The database stores a SHA-256 token hash rather than the browser token. Logout revokes the server record.
Signup, login, rewrite, event, and checkout endpoints use database-backed rate-limit buckets derived from a secret HMAC of the request address and safe discriminator. Inputs have explicit size and schema limits. Errors returned to clients are bounded, while unexpected failures log only an error class and trigger a content-free notification.
Quota and provider failure safety
Rewrite characters are reserved in a transaction before a provider call, preventing concurrent requests from overspending one balance. Included characters are consumed before one-time credits. A timeout, transient provider failure after bounded retry, malformed response, or failed protected-token check causes a transactional refund. Completed usage records retain only counts and outcome.
The provider call has a strict timeout and at most one retry for timeouts, rate limits, and server-side transient statuses. Permanent failures are not retried. Numbers, names, URLs, emails, code, and quotations are replaced before rewriting and restored only after exact placeholder validation. These measures reduce risk but do not prove semantic equivalence.
Payment verification
Checkout is created server-side through pay.yito.ai with a unique external order ID, an idempotency key, the authenticated external user, and one exact SKU. The private application key never appears in browser code. The payment widget receives only a provider publishable key, client secret, and same-origin status URL. Hosted checkout recovery requires a deliberate user click.
The status proxy first verifies local order ownership and then calls the payment service with the server key. Callback requests require an event ID, key version, timestamp within five minutes, and a lowercase SHA-256 HMAC over the timestamp and exact raw body. App, order, provider order, and external user identifiers must match. Event recording and entitlement changes share one transaction, so a repeated event cannot grant twice.
Analytics and notifications
Conversion analytics use a fixed event-name allowlist and numeric or boolean properties only. Raw text, rewritten text, prompts, email addresses, and document URLs are rejected from event properties. The global pageview counter, Cloudflare performance beacon, and optional validated GA4 ID do not receive tool text. A random browser identifier supports anonymous funnel counting.
Feishu messages contain only bounded user or order IDs, SKU, amount, route, request ID, and error class. The daily ZeptoMail report contains aggregate signup, rewrite, checkout, paid, and error counts with conversion rates. Delivery is disabled by default and requires an explicit server flag. Webhook URLs, tokens, callback secrets, provider keys, and email API keys are never logged.
Responsible disclosure
If you believe you found a security vulnerability, contact [email protected] with a concise reproduction that does not include another person’s private text. Do not access data you do not own, degrade service, or publish secrets. We will acknowledge actionable reports and prioritize fixes according to impact.
No architecture eliminates all risk. This page documents the intended controls for the MVP, not a third-party certification or penetration-test claim. Deployment operators must protect environment files, restrict database credentials, terminate TLS correctly, keep Node and dependencies patched, monitor safe error telemetry, and verify backups and restoration procedures.