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
| What | Where |
|---|---|
| Saves, notes, tags, and search | Postgres on Supabase, Frankfurt |
| Uploaded files and images | Bunny Storage, Frankfurt, with a copy in Stockholm |
| Uploaded videos | Bunny Stream, Frankfurt and Stockholm |
| The app | Vercel, 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
| Type | Formats |
|---|---|
| Images | PNG JPEG WebP AVIF GIF HEIC SVG BMP TIFF |
| PDFs | PDF (scanned ones too) |
| Documents | DOC DOCX PPT PPTX XLS XLSX KEY PAGES NUMBERS ODT ODS ODP RTF CSV MD TXT |
| Emails | EML |
| Videos | MP4 MOV WebM |
| Audio | MP3 M4A WAV AAC OGG FLAC OPUS |
| Fonts | TTF OTF WOFF WOFF2 |
| Routes | GPX 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:
| Counts | What goes in |
|---|---|
| Most | The title |
| A lot | The 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 |
| Some | The description, and the text of notes and code snippets, the first 20,000 characters of each |
| Least | The 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.
File links
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.