9 ms·
Show HN: Mail Memories – A desktop app to rescue photos from Gmail
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.
- deleted 3mo ago[deleted]
- tribal808 3mo agoidk if other tools do it for free, but cool idea, hope that it gains the deserved visibility
- ltiger 3mo ago[flagged]
- T3RMINATED 3mo ago[dead]
- baron3dl 3mo agoFirst, 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.
- Tiberium 3mo agoThe website is clearly AI-written (along with the text), and the screenshot also looks quite like the styles that LLMs love
- ltiger 3mo agoYou'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.
- abirch 3mo agoMy question is why not use IMAP?
- subhobroto 3mo agoThat's what they used to do: https://news.ycombinator.com/item?id=48708270 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.
- ltiger 3mo agoNo, 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).
- KomoD 3mo agoOr you can just use Google Takeout: https://takeout.google.com https://takeout.google.com Deselect everything, select "Mail", create export, wait until it's done, and then download the zip.
- ltiger 3mo agoTakeout 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.
- nuclearsugar 3mo agoThis script will extract all of the attachments from a MBOX file - https://gist.github.com/georgy7/3a80bce2cd8bf2f9985c https://gist.github.com/georgy7/3a80bce2cd8bf2f9985c
- threecheese 3mo agoI 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.
- skzo 3mo agoThank you Claude
- ltiger 3mo agoNah, but thanks. I actually spent a lot of time checking out Takeout, shell scripts, and existing options before writing a single line of code for the app. Non-technical users don't want to deal with mbox files no matter how many scripts someone recommends. And shell shells scripts... I made this to bridge the gap. I wanted a utility that handles the protocol mess locally, avoids downloading gigabytes of metadata, skips the cloud, and just gives you your own photos back.
- Thaxll 3mo agoFor $30 you should sign your binary so you don't have a UAC popup. Also is it not doable with Google takeout ( with Gmail )?
- subhobroto 3mo agoI 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.
- KomoD 3mo ago> 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.
- ltiger 3mo ago[dead]
- ltiger 3mo ago[dead]
- murats 3mo agoI like the idea. Google Takeout works, but a focused app that helps you actually find and recover old photos could still be useful.
- ltiger 3mo agoThanks! 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.
- shuirong 3mo agoI 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?
- ltiger 3mo agoThanks!
- artisinal 3mo ago> 100% local, no cloud, no subscriptions, no AI. The world needs more of this
- ltiger 3mo agoThanks, 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.
- TazeTSchnitzel 3mo agoIf I have to look at yet another website with this same fucking AI-generated theme I'm gonna have to kill somebody.
- ltiger 3mo agoNah, 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.
- KomoD 3mo ago> 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-specific-search 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#downloading-message-parts 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"?
- ltiger 3mo ago[flagged]
- subhobroto 3mo agoThe details are interesting! How did you find all of this out? Did you download the tool in a VM and disasm it? I assumed the OP was literally making throttled, batched, parallel IMAP FETCH calls with the BODYSTRUCTURE parameter to the mailbox, inspecting the `Content-Type` and/or `Content-Disposition` for image fingerprints and then grabbing the real payload. However, from what you said here, it's a bit less sophisticated than that?
- ks2048 3mo ago“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.
- t_mahmood 3mo agoInteresting! 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
- nickjj 3mo agoI'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.
- Grombobulous 3mo agoI 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.
- zazerr 3mo agoI have the same issue and found this worked great https://unattach.com/ https://unattach.com/ (no affiliation, just a user)
- nickjj 3mo agoOh 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 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.
- benzofuran 3mo agoHere'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]); } } }
- ksajadi 3mo agoMeta: 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.
- ltiger 3mo agoJust 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.
- jborichevskiy 3mo agoThis place can get a little snarky but congrats on shipping!
- ltiger 3mo agoThanks so much! Definitely a trial by fire, but I'm glad I put it out here. 'Preciate the kind words.
- subhobroto 3mo agoI 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
- adamtheturtle 3mo agoWhether 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
- ltiger 3mo ago[dead]
- Brocode122 3mo ago[flagged]
- subhobroto 3mo agoWatching 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?
- jonnyringo711 2mo agoJust 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.