Account and settings

The nerdy deets

Where your saves are stored, which file formats Savepad takes, what it makes from an upload, how search weighs a page, how file links are signed, and how the blocklist is stored.

You want to know what happens under the hood. Respect. Here’s all of it, and when the app changes, so does this page.

Where your stuff lives

WhatWhere
Saves, notes, tags, and searchPostgres on Supabase, Frankfurt
Uploaded files and imagesBunny Storage, Frankfurt, with a copy in Stockholm
Uploaded videosBunny Stream, Frankfurt and Stockholm
The appVercel, Frankfurt

So it’s all in the EU. Uploaded files sit on Bunny, never in the database, and they count towards your plan’s room for files.

What you can drop in

TypeFormats
ImagesPNG JPEG WebP AVIF GIF HEIC SVG BMP TIFF
PDFsPDF (scanned ones too)
DocumentsDOC DOCX PPT PPTX XLS XLSX KEY PAGES NUMBERS ODT ODS ODP RTF CSV MD TXT
EmailsEML
VideosMP4 MOV WebM
AudioMP3 M4A WAV AAC OGG FLAC OPUS
FontsTTF OTF WOFF WOFF2
RoutesGPX KML KMZ

No ZIP, RAR, or 7z though. You can’t see what’s inside an archive till you open it, and I’m not opening yours. How big can a file be? Depends on your plan, see plans and billing.

What Savepad does with an upload

Images keep the original, minus the GPS data your phone snuck into it. Savepad also makes WebP copies 320, 640, 1280, and 1920 pixels wide (only the ones smaller than your original), and the grid grabs whichever is closest to your screen. So a folder of 200 screenshots doesn’t make your laptop download 200 full-size PNGs.

Videos get encoded to H.264 at 360p, 720p, and 1080p and stream in small chunks (HLS), so pressing play never pulls the whole file. No 4K, sorry. The original is kept, so if there’s ever a better way to encode, your videos get it without you uploading them again.

PDFs get their text pulled out page by page. A page with no text on it is a scanned page, so it gets read with OCR instead, up to 30 pages a PDF.

How search works

It’s plain old Postgres full-text search. No search service, no embeddings, no vector database. A word in the title counts for more than the same word somewhere in the page text:

CountsWhat goes in
MostThe title
A lotThe site, the file name, an email’s sender and subject, the author, the brand, hex codes, the font family, the address, tags, and custom properties
SomeThe description, and the text of notes and code snippets, the first 20,000 characters of each
LeastThe page text, the words read from images, and transcripts

Every word you type counts as the start of a word, so pric already finds “pricing” while you’re typing. Titles get a fuzzy match on top, which is why a typo still finds the thing. Accents don’t matter (cafe finds “café”). “Quoted phrases” match the words in that order, and -word leaves out saves with that word in them.

Page text stops at 15,000 characters, about 2,300 words. After that, a web page is mostly comments, footers, and “you might also like”, and nobody’s searching for those. PDFs and documents go up to 100,000, because finding that one line on page 30 of a whitepaper is literally why you saved it.

All the filters (type:pdf, from:stripe.com and friends) are on the search page.

Reading the words in images

OCR is Tesseract, running in Savepad’s own functions. Your screenshot doesn’t get sent off to some OCR API. It reads Latin script, so English, Spanish, French, German, the Nordic languages, Polish, Czech, and plenty more. Anything it’s less than 55% sure about gets thrown away, otherwise a photo of a brick wall would fill your search with “lllIl1”. It reads PNG, JPEG, WebP, BMP, and GIF, up to 15 MB.

Every link to one of your files is signed and dies after an hour or two. It’s rounded to the hour, so your browser can still cache the file in between. Files come from savepadusercontent.com, a different domain from the app, so even a nasty file can’t get at your Savepad session. And every file is sent with a header telling Google and friends to keep it out of search.

The blocklist

Savepad won’t save links from about 175,000 phishing, malware, scam, and porn domains. Just keep it legal. They come from public blocklists that get refreshed every night, with the most popular sites left out so one dodgy page doesn’t block a whole site.

Stats

Stats don’t use cookies. Views are kept for 25 months. Once a day is more than 90 days old, it gets added into one row for its month, so an older month shows all its views on the 1st in the chart. The totals don’t change at all.

Housekeeping

Postgres doesn’t give space back by itself when rows get deleted. I found that out the fun way, when one table’s index was 16 MB for 91 rows 🙃 So now the tables that change a lot get their indexes rebuilt on the 1st of every month, without locking anyone out. The bin empties after 30 days.

Want it all out? Export your library as ZIP, JSON, CSV, HTML, or Markdown.