Show HN: Mail Memories – A desktop app to rescue photos from Gmail (mailmemories.com)

103 points by ltiger ↗ HN
Hey HN, I’m the creator of Mail Memories. Like many of you, I've had my Gmail address for more than 20 years. A few years ago, I got curious and wanted to see what photos were buried deep in my account. I ended up finding lots of "lost" pictures of old friends, family members, and a ridiculous number of vintage memes.

I originally built and launched this as a SaaS, but even with code and policies in place that kept users' photos private, I figured everyone would feel more comfortable with a desktop app.

So, I threw out the server architecture and completely rewrote it as a 100% local desktop app for Mac and Windows.

How it works now: The app connects directly to Google's server from your computer, processes everything entirely on your system, and saves photos straight to your hard drive.

You can download your 50 oldest photos for free (no credit card required) just to see what's in there. If you want to download all the pictures in your account, it's a one-time payment of $29. No subscriptions.

If you have an old, pre-2010 Gmail account, definitely give it a spin. You'll be surprised at what you find deep in your archive.

I'd love to hear your feedback on the layout, scanning performance, or anything else.

TL;DR: I turned my SaaS into a local desktop app (Mac/Windows) that recovers decades of forgotten photos from your Gmail. 100% local, no cloud, no subscriptions, no AI.

21 comments

[ 5.3 ms ] story [ 76.2 ms ] thread
(comment deleted)
idk if other tools do it for free, but cool idea, hope that it gains the deserved visibility
First, I really love this idea, and I thank you for getting it into my head.

That said, if no AI is really important, I guess it's worth $29, though I can't tell if you used AI to build it or not from here.

Like, I just one-shot a script that does the same with Claude, after it listed 5 free projects that do the same, including one GUI. The whole thing took less time than writing this comment.

Now, if it were $2.99, I probably would have just paid you.

Or you can just use Google Takeout: https://takeout.google.com

Deselect everything, select "Mail", create export, wait until it's done, and then download the zip.

For $30 you should sign your binary so you don't have a UAC popup.

Also is it not doable with Google takeout ( with Gmail )?

I like the idea. Google Takeout works, but a focused app that helps you actually find and recover old photos could still be useful.
I like your idea. While installing the app, I suddenly had an idea for the logo: what do you think about using a tilted old photo of a child as the app icon?
> 100% local, no cloud, no subscriptions, no AI.

The world needs more of this

If I have to look at yet another website with this same fucking AI-generated theme I'm gonna have to kill somebody.
“I found photos of my niece I thought were lost forever. Thank you so much!” Emily D.

Be honest, is "Emily D" a real person you got organic feedback from? Small thing that makes the vibed site off-putting.

It says "Storage: 1.3 GB saved", but then says it is Read-only.

Interesting! I already have a Python script that can download anything from Gmail. Making it a product?! Really have not thought about it! Which is why I am probably broke Ha Ha
I'd love to somehow do the opposite of this but I don't think it's possible? It would be deleting attachments from emails without deleting the email thread.

For example I'm always 1-2 GB away from my Google account being full. I've pruned Google Drive to the absolute bare minimum.

I've had my Google account for a really long time. There's tens of thousands of emails since day 1. However, there's many emails that have attachments.

For example my friends or someone might have sent me a bunch of images and there's a very long email thread going on with them. I want to delete the 300 MB of photos without deleting the email thread. I don't think Google has a way to do this. I'd easily be able to free up multiple gigs of space if this were possible.

I've already bit the bullet and deleted the biggest offenders but I have a ton of emails with 1-2 attachments (pdfs, zip files, some images, etc.) that might "only" be 15 MB but I definitely don't want to delete the email since it has a record of something. Not just the attachment but the corresponding email chain.

Here's a gmail extractor google apps script that does the same thing, but for not $30!

function autoExtractGmailMedia() { const START_TIME = Date.now(); const TIME_LIMIT = 1000 * 60 * 5; // 5 minutes (leaves a 1-minute safety buffer) const BATCH_SIZE = 50; const FOLDER_NAME = "Gmail_Media_Export";

  // 1. Retrieve our current position from the script's property store
  const scriptProperties = PropertiesService.getScriptProperties();
  let startIndex = parseInt(scriptProperties.getProperty('START_INDEX')) || 0;

  // Locate or create the destination folder
  let folder;
  const folders = DriveApp.getFoldersByName(FOLDER_NAME);
  if (folders.hasNext()) {
    folder = folders.next();
  } else {
    folder = DriveApp.createFolder(FOLDER_NAME);
  }

  // 2. Process batches in a loop
  // Updated search query to ignore USPS and non-primary tabs
  const searchQuery = 'has:attachment -from:usps.gov -category:promotions -category:updates -category:social (filename:jpg OR filename:jpeg OR filename:png OR filename:zip)';
  
  while (true) {
    const threads = GmailApp.search(searchQuery, startIndex, BATCH_SIZE);
    
    // If the search returns empty, we've hit the end of the inbox
    if (threads.length === 0) {
      console.log("Extraction completely finished.");
      scriptProperties.deleteProperty('START_INDEX');
      deleteTriggers(); // Clean up so it doesn't keep running
      return;
    }

    for (let i = 0; i < threads.length; i++) {
      const messages = threads[i].getMessages();
      for (let j = 0; j < messages.length; j++) {
        const attachments = messages[j].getAttachments();
        for (let k = 0; k < attachments.length; k++) {
          const attachment = attachments[k];
          const name = attachment.getName().toLowerCase();
          const type = attachment.getContentType();
          const size = attachment.getSize();
          
          // Apply size threshold (102,400 bytes = 100KB) and file type filter
          if (size > 102400) {
            if (type.includes('image/') || name.endsWith('.zip')) {
              folder.createFile(attachment);
            }
          }
        }
      }
    }

    // Increment our starting index for the next batch
    startIndex += BATCH_SIZE;

    // 3. The Stopwatch Check
    if (Date.now() - START_TIME > TIME_LIMIT) {
      console.log(`Approaching timeout at index ${startIndex}. Saving state and passing the baton...`);
      scriptProperties.setProperty('START_INDEX', startIndex.toString());
      scheduleNextRun();
      return; // Exit to avoid the hard timeout exception
    }
  }
}

function scheduleNextRun() { deleteTriggers(); // Prevent duplicate overlapping triggers ScriptApp.newTrigger("autoExtractGmailMedia") .timeBased() .after(60 * 1000) // Fire a new execution 1 minute from now .create(); }

function deleteTriggers() { const triggers = ScriptApp.getProjectTriggers(); for (let i = 0; i < triggers.length; i++) { if (triggers[i].getHandlerFunction() === "autoExtractGmailMedia") { ScriptApp.deleteTrigger(triggers[i]); } } }

Meta: Can someone more familiar with the rules of HN please tell me why some Show HN posts get immediately “flagged” while others don’t? I have seen commercial entires like this be flagged while this one is on the first page.
Just wanted to take a moment to say thank you to everyone who commented today. Launching on HN isn't for the faint of heart, but it’s been really valuable.

What a day. I was told my landing page looks like an AI wrote it, got roasted for a confusing illustration metric (and rightly so), and received the ultimate rite of passage: being told my app could be replaced by a couple of Linux CLI commands.

Unironically, thanks everyone. Because of your feedback, the site copy's a little tighter, and the Windows installer no longer throws a scary UAC prompt. I couldn't have asked for a better (or more intense) test.

I was monitoring this thread because of the comments. Unsure how I came across this post to begin with! (was it on the FP?)

You really handled all the feedback well and if you wouldn't mind answering (email works too), I had some followups:

1. Did you get a boost in sales from this post?

2. What's your typical customer like and do they email you questions/support?

3. If you had provided this as a hosted service and continued to use IMAP, would you have had to ask for the user's GMail password?

4. I see you had toyed with the idea of $5/yr - why did you withdraw it and go $30 flat rate?

5. Any idea how many customers you're leaving on the table with the $30 flat rate that would have converted at a lower price?

6. Did HN throttle your ability to respond to comments ("slow down...") during this episode?

I learned a lot from your thread - Thank You for keeping up with it

Whether or not I could have got this stuff out without the app, I wasn't going to, and I already have $29 worth of nostalgia out of it. Thank you
Watching this thread unfold over 24h was illuminating.

The biggest pushback seemed to be the price: people are upset it's priced at $30. Some suggested $3. A few suggested open sourcing it under MIT and moving on.

The primary argument was that there are already existing, free tools that can be chained together to do exactly what Mail Memories does. The secondary argument was that LLMs can already code this up, implying the OP was rentseeking.

IMHO, this comment (now dead) from the OP was on point and ironic:

> My target audience isn't engineers who know how to parse maildirs, it's everyday people (and busy devs) who just want a secure, 1-click interface that downloads their family photos into a folder on their computer (without touching a terminal).

This is entirely true - this thread is strong indication that this tool wasn't appreciated by the HN crowd (lots of engineers and technical people)! I noticed most of OP's comment went gray and then dead in a matter of minutes. The OP must have had a real hard time even responding to comments before HN throttled them from responding, asking them to "slow down".

But this raises a question - what if I one-shot something that my non-technical parents and family members would find incredibly valuable and so I'm hoping yours does as well? If an LLM could absolutely one shot it, perfectly, should I never post it on HN at all, in fear of the wrath that would be unleashed?

Anyone here can slap together a breakfast sandwich for ~$3 in ingredients. Is it blasphemy that you can't buy the same from a McDonald's or your neighborhood Deli for less than $15?

Just curious if you have looked into other backup types? There are a lot of options for keeping file backups that cant be wiped as easily. I know IPFS is pretty popular, but for longevity maybe look into Arweave as a permanent backup users own. Of course they always have their Google account but that's not infallible in the same way as these backups would be.