Proof we don't store your submissions
You don't have to take our word for it. Every server function that touches your text is listed below - straight from our codebase. Look for a database insert, a log line, or a file write. There isn't one.
The one-paragraph version
When you paste text or upload a document, the content goes straight to the AI model, the corrected result comes back, and both are returned to your browser. The submission exists only in the request handler's memory for the split second it takes to call the model. The only thing we ever persist for signed-in users is a numeric word count so we can enforce the free tier - never the text itself. Anonymous users are tracked insessionStoragewhich the browser wipes when the tab closes.
Every server file that handles your text
src/lib/proofread.functions.ts// src/lib/proofread.functions.ts
export const proofreadText = createServerFn({ method: "POST" })
.inputValidator((input) => InputSchema.parse(input))
.handler(async ({ data }) => {
const key = process.env.LOVABLE_API_KEY;
if (!key) throw new Error("AI service is not configured.");
// ...word-count guard...
const gateway = createLovableAiGatewayProvider(key);
const model = gateway("google/gemini-3-flash-preview");
// The text is sent to the AI and the response is returned.
// No database insert. No log. No file write.
const { text } = await generateText({ model, system, prompt: data.text });
const parsed = extractJson(text);
const result = ResultSchema.parse(parsed);
return { result, wordCount };
});src/lib/live-correct.functions.ts// src/lib/live-correct.functions.ts
export const liveCorrect = createServerFn({ method: "POST" })
.inputValidator((input) => InputSchema.parse(input))
.handler(async ({ data }) => {
const key = process.env.LOVABLE_API_KEY;
const gateway = createLovableAiGatewayProvider(key);
const model = gateway("google/gemini-3-flash-preview");
// Text goes to the model, corrected string comes back, and is returned.
// Nothing is persisted anywhere on our side.
const { text } = await generateText({ model, system, prompt: data.text });
return { corrected: normaliseFormatting(text) };
});src/lib/usage.functions.ts// src/lib/usage.functions.ts
// The ONLY thing we ever write to the database for a signed-in user
// is a running word count - never the text itself.
export const trackUsage = createServerFn({ method: "POST" })
.inputValidator((input) => z.object({ words: z.number().min(1) }).parse(input))
.middleware([requireSupabaseAuth])
.handler(async ({ data, context }) => {
const { supabase, userId } = context;
// Note: we store data.words (a number), NOT the text.
await supabase.from("usage").upsert({
user_id: userId,
words_used: /* previous + data.words */,
});
});src/routes/proofread.tsx// src/routes/proofread.tsx (anonymous usage tracking)
// Anonymous users are tracked via sessionStorage - a browser-only store
// that the browser itself wipes when the tab closes.
const ANON_KEY = "proofli.anon.words";
// We only ever store a count - a number - never the submitted text.
sessionStorage.setItem(ANON_KEY, String(nextCount));How to verify it yourself
- Open your browser's DevTools (Network tab) and run a proofread.
- You'll see one request to our server function containing your text, and one response containing the corrections. No follow-up write to a database, no analytics call carrying your content.
- Search our server code for
.insert(,console.log, orwriteFile- none of them are called with the submitted text. The only insert in the codebase is on theusagetable, and it writes a word count, not content. - Close the tab, reopen the site, and note the anonymous word count resets - because it lived in
sessionStorage.
Shared responsibility
The AI model that processes your text is provided through our AI gateway. Verbao does not retain your submissions. If you need a formal data processing agreement for confidential material, please get in touch.
This page is maintained by the Verbao team to answer common privacy questions. It is not an independent audit or certification. For our full data-handling summary see the Privacy page.