alt.hn

7/2/2026 at 2:16:57 PM

Show HN: Mail Memories – A desktop app to rescue photos from Gmail

https://mailmemories.com

by ltiger

7/2/2026 at 3:22:46 PM

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.

by KomoD

7/2/2026 at 3:33:50 PM

Takeout is great for a total archive backup, but using it just to extract photos is where the UX breaks down for most people.

When you export Mail with Takeout, Google dumps your entire history into a huge .mbox file. If you have a 20-year-old account, you're downloading tens of gigabytes of raw text data, headers, and metadata just to get to the images. Once you have that huge file, you still have to figure out a way to extract and decode the image attachments from the raw email text.

Mail Memories just gives you what you want: the photos.

by ltiger

7/2/2026 at 5:57:21 PM

This script will extract all of the attachments from a MBOX file - https://gist.github.com/georgy7/3a80bce2cd8bf2f9985c

by nuclearsugar

7/2/2026 at 6:15:10 PM

I think the target market isn’t doing this; heck, I’d normally be like you, but the price is low enough here to “one and done and forget it” here.

by threecheese

7/2/2026 at 7:14:50 PM

Thank you Claude

by skzo

7/2/2026 at 3:07:57 PM

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.

by baron3dl

7/2/2026 at 3:18:53 PM

The website is clearly AI-written (along with the text), and the screenshot also looks quite like the styles that LLMs love

by Tiberium

7/2/2026 at 6:44:38 PM

You're half right. The HTML and CSS are from a standard template that I imagine exists in just about every LLM's dataset, since they've scraped an internet's worth of them. I wrote (and rewrote and rewrote...) and edited every single word on the page, though.

by ltiger

7/2/2026 at 3:24:41 PM

My question is why not use IMAP?

by abirch

7/2/2026 at 3:31:12 PM

That's what they used to do: https://news.ycombinator.com/item?id=48708270

The OP had posted a detailed reply here as well, that they since deleted - I think because they didn't want to deal with all the pushback here.

by subhobroto

7/2/2026 at 4:02:56 PM

No, I'm not afraid of pushback at all. I'm actually really glad I used IMAP.

Building on top of it let me solve a few major protocol headaches directly in the client:

The app filters out signature junk (like tiny social media and logo icons), pulls down just the raw attachments instead of downloading entire 20-year-old message threads, and handles thousands of images while gracefully managing Google's rate limits (to avoid connection drops).

by ltiger

7/2/2026 at 3:43:31 PM

It actually does use IMAP! The app connects directly to Google's IMAP servers via SSL straight from your machine.

I intentionally chose a local IMAP pipeline over the official Gmail API because of platform gatekeeping. To use the API for this, Google forces independent developers into a "Restricted Scope" tier, which requires an annual $15,000+ third-party security assessment.

Going the local IMAP route lets me bypass that completely while keeping user data 100% local and secure.

by ltiger

7/2/2026 at 5:34:00 PM

I don't like how somebody is flagging/downvoting all your comments. This is about your product; it's highly relevant, whatever somebody might think about it.

by kbelder

7/2/2026 at 6:02:11 PM

I don't think it's just "somebody"; I think it's a lot of bodies. I'm downvoting him too because he vibe-coded a super simple "app", then is trying to sell it here as some life-saving tool .

My main complaints:

- Why is this $30?

- Why is it Windows/Mac only?

- Why is it Gmail only when it's using IMAP?

But what really irks me is that you know you can do this exact thing with like two Linux CLI commands?

  ``` 
  $ offlineimap -c <configfile with credentials>
  $ mae export --maildir=test/fixtures/simple --output-dir=test/tmp_output
  ```


[1] https://github.com/mrtazz/mae

by mmh0000

7/2/2026 at 6:30:37 PM

[flagged]

by ltiger

7/2/2026 at 3:28:23 PM

> 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.

I'm assuming the author put in the effort to validate their program handles all kinds of pictures. With that assumption:

- how did *you* validate the one-shot script that Claude handed you works correctly?

- after all said and done, and getting it to work correctly, did you end up spending atleast $30 in time, effort and money?

I am curious how coding agents would affect the future of "micro apps" - apps/scripts that do one thing and just one thing very well.

by subhobroto

7/2/2026 at 6:27:00 PM

The website is clearly vibecoded, and that makes me assume the app is also vibecoded. When I open the installer, Edge gives me a warning that the file is not safe. I know that just means the dev hasn't purchased a certificate, but it adds to the general feeling that this is a rushed project that asks 30 dollars for something that I can make with Gemini in about the time it took to write this comment.

I'm pretty sure the dev has good intentions, the app is safe, and it works... but I'm not going to find out because it's too much money and too risky.

It is a good idea, though. I'll check the comments for free, open-source alternatives, but if I don't find one, I'll probably just generate a script that does this when I get back home.

by boca_honey

7/2/2026 at 6:39:41 PM

It worked fist shot, and found 3k+ photos, which feels about right. Validated with Vibes. It's going to take more than $30 in time to look at them all, and it's 3k+ more photos than I had before. So, I'm satisfied.

For apps without a network-effect, or highly specialized domains, coding agents are driving a convergence of the cost of software toward the cost of tokens to generate it. OP should have MIT licensed this, collected his 15m, and moved on to the next idea.

by baron3dl

7/2/2026 at 3:29:08 PM

Thanks for the feedback! You're right, if you know how to write a script or prompt Claude, you can absolutely spin up a quick tool to scrape attachments in a few minutes.

That said, the $29 price point is for the execution and friction-removal. Turning a raw script into a compiled, code-signed desktop app that handles OS security gates (Mac Dev ID and Windows Smartscreen), dynamically manages Google rate limits, and a provides a beautiful UI for non-technical users takes a lot of effort.

For people who want to rescue their photos without opening a terminal - or who don't even know what a terminal is - this app is a huge win for them.

by ltiger

7/2/2026 at 8:03:11 PM

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.

by ltiger

7/2/2026 at 5:34:28 PM

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.

by nickjj

7/2/2026 at 8:22:57 PM

I will tell you who this is for: my parents who “back up” their photos by emailing them to themselves, and finally get convinced to use a real cloud photo solution.

by Grombobulous

7/2/2026 at 5:47:35 PM

I have the same issue and found this worked great https://unattach.com/ (no affiliation, just a user)

by zazerr

7/2/2026 at 6:04:50 PM

Oh nice, if everything they say is true, this seems like a good match but it seems like it has 1 big potential downside.

THE GOOD:

Their FAQ says it uses OAuth to connect to your Google account and the emails never leave your browser.

It also costs 83 cents for 1 month so you can go nuts. Alternatively you can pay 1 cent per email if you have a handful.

I see another HN thread about it here from a few years ago: https://news.ycombinator.com/item?id=32462878

THE BAD:

I don't know if it can be used with total confidence because that HN thread makes it sound like they delete the original email and create a new email with the same meta data but some of the comments indicate that's not quite the same as the original. If you had to present this email as evidence, you could run into friction since the original no longer exists. Technically it looks like you can back the original up but as someone mentioned in a comment that seems like it would add a lot of friction in a legal case.

I have no intent on ever needing to use old emails with large attachments in a legal case but knowing this could be a problem makes me hesitant. Although on the bright side, it would be fine to use for anything you 100% know won't ever be used legally.

by nickjj

7/2/2026 at 3:24:01 PM

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 )?

by Thaxll

7/2/2026 at 3:36:09 PM

I have not used Windows for decades. With that context:

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

How much does it cost to be able to sign a binary so you can deploy it on Windows without a UAC popup? How arduous is it?

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

It sure is. You do a takeout and iterate over the compressed mbox looking for media attachments. Then you write them out. The edge cases, and the actual value is ensuring you properly grab all the media dispositions.

I also have emails from people who like to zip up a bunch of pictures and then email them to me - my own script takes care of this detail but I wonder if most other tools, including this one does.

by subhobroto

7/2/2026 at 3:44:50 PM

> How much does it cost to be able to sign a binary so you can deploy it on Windows without a UAC popup?

You can get a cert for $130-300/yr, and then you can use signtool to sign it.

by KomoD

7/2/2026 at 5:59:09 PM

[dead]

by ltiger

7/2/2026 at 4:29:12 PM

[dead]

by ltiger

7/2/2026 at 3:52:51 PM

> 100% local, no cloud, no subscriptions, no AI.

The world needs more of this

by artisinal

7/2/2026 at 4:13:51 PM

Thanks, that means a lot.

I rebuilt the app because I was feeling that same fatigue. It felt like every cool new tool I looked at wanted to upload personal data to a remote server, hook it up to a third-party AI API, or charge a recurring fee.

The original version of the app actually was a cloud-based SaaS. But I figured people would feel significantly more comfortable having a sensitive tool like this run entirely on their own hardware instead of in the cloud like everything else. Making it local-first also makes it easier for people to download and try it out.

by ltiger

7/2/2026 at 7:21:17 PM

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.

by ksajadi

7/2/2026 at 4:25:00 PM

“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.

by ks2048

7/2/2026 at 6:04:12 PM

Just pushed an update to the site around this. Changing the text to "Downloaded" still might confuse someone, so I removed that line from the illustration altogether.

by ltiger

7/2/2026 at 5:04:45 PM

[flagged]

by ltiger

7/2/2026 at 5:29:39 PM

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

by t_mahmood

7/2/2026 at 3:29:20 PM

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?

by shuirong

7/2/2026 at 3:53:51 PM

Thanks!

by ltiger

7/2/2026 at 3:27:15 PM

I like the idea. Google Takeout works, but a focused app that helps you actually find and recover old photos could still be useful.

by murats

7/2/2026 at 3:52:34 PM

Thanks!

Yes, use Google Takeout if you want a full account archive. It's a pain if you just want to get your photos, though.

You have to deal with huge .mbox files, download gigabytes of unnecessary text, and sometimes you have to wait days for the export.

The short version is that Mail Memories lets you get the images you want instead of an all-or-nothing data dump.

by ltiger

7/2/2026 at 2:42:33 PM

idk if other tools do it for free, but cool idea, hope that it gains the deserved visibility

by tribal808

7/2/2026 at 4:43:50 PM

[flagged]

by ltiger

7/2/2026 at 4:02:15 PM

If I have to look at yet another website with this same fucking AI-generated theme I'm gonna have to kill somebody.

by TazeTSchnitzel

7/2/2026 at 4:38:21 PM

Nah, don't do that.

Totally fair, though. In my defense, 98% of my time went into wrestling with IMAP parsing architectures, optimizing memory, and code-signing certificates instead of designing custom CSS layouts from scratch. I'll finesse the design in the future.

by ltiger

7/2/2026 at 4:52:11 PM

> 98% of my time went into wrestling with IMAP parsing architectures, optimizing memory, and code-signing certificates instead of designing custom CSS layouts from scratch

You're just using imapflow and their Gmail search method. Why are you making things up? https://imapflow.com/docs/guides/fetching-messages#gmail-spe...

You call that function with this query over and over again:

filename:(jpg OR jpeg OR png OR gif OR webp OR heic OR tif) after:${year}/01/01 before:${year + 1}/01/01

And then you call their download method: https://imapflow.com/docs/guides/fetching-messages#downloadi...

All you did was throw together a frontend, package it into Electron, paywall it, and try to obfuscate the code.

What part of that is "wrestling IMAP parsing architectures"?

by KomoD

7/2/2026 at 5:47:49 PM

[flagged]

by ltiger

7/2/2026 at 2:59:15 PM

[dead]

by T3RMINATED

7/2/2026 at 6:06:53 PM

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]); } } }

by benzofuran

7/2/2026 at 9:15:57 PM

Clever. But Gmail and Google Drive share the exact same 15 gb storage quota. If a user has 10 gigs of photos in their Gmail and runs this script, it'll create another 10 gb of files in their Drive.

Instead of saving space, this script doubles their storage usage to 20 gb, breaking through the 15 gb free tier and forcing them to buy a Google One subscription.

That’s one of the reasons this desktop app exists, it streams the files straight to your hard drive so you can avoid this

by ltiger