Browser extensions capture one tab at a time and you name every file yourself. Hosted services render your client's pages on someone else's servers. SiteHaul reads a site's sitemap and captures every page at desktop and mobile in one run, named from each URL, entirely on your Mac. Nothing is uploaded, no account. It also exports each page's copy as Markdown and a urls.md redirect map. Free for 50 pages a month, $49 once.
Hey Product Hunt,
I design and build websites, and I kept losing an afternoon to screenshotting them. Every page twice, once at desktop and once at mobile, then renaming every file by hand so the folder still made sense a week later. If I needed the words as well, that was another pass, pasting the copy out of every page.
I tried the obvious things first. Browser extensions are great at one page, but you are still going tab by tab and naming the files yourself. Hosted screenshot APIs can do a whole site, but every page renders on someone else's servers, which rules them out for client work under NDA or staging behind a password.
So I built the Mac app I wanted. Paste a URL, it finds the sitemap, and it captures every page at desktop and mobile, full-page, named from each URL, into one folder. It bundles its own Chromium and runs entirely on your machine.
The part I did not expect: the first person to use it besides me was my brother, a web designer. He dropped the whole run folder straight into Figma as a moodboard and said it saved him an afternoon on a 40 page site. That is now the use case I hear about most, and it changed how I describe the app.
Happy to answer anything, including how it handles the messy parts (cookie banners get clicked rather than hidden, so the maps and videos they gate actually load) or why it is $49 once instead of a subscription.
Dave
Report
Maker
Capture any list of URLs, and pages behind a password
Version 1.2.0
A sitemap is not the only way to say what you want. You can now paste the URLs instead, and open pages that are protected by a single password.
New
Capture a list of URLs instead, under Advanced. Paste them one per line and SiteHaul skips the sitemap entirely. This is the answer for a page deliberately kept out of the sitemap, for a site that has no sitemap at all, and for the times you want four specific pages rather than to untick eighty.
Page password, also under Advanced. For a page protected by one password and no username, like WordPress's built-in page protection. It is only tried on pages that turn out to be gated, it is never saved, and it is never written into your run folder. A password that gets rejected is reported as exactly that, rather than as a page that happens to be locked.
A pasted list can span several sites, which makes 'grab the pricing page of ten competitors' one run. Those runs are named by site rather than by whichever URL was first, and every filename leads with its host so you can tell whose is whose.
Pulled my whole portfolio site in one run and the files were named exactly like the URLs, which saved me a ton of cleanup. The Markdown export is a nice bonus I didn't expect to actually use.
Report
Maker
Popups and chat widgets get cleared
SiteHaul now clears the things that sit on top of a page, so your captures come back showing the actual site.
Improved
Newsletter and signup popups are closed before the screenshot is taken, including ones that appear late, after the page has finished loading and scrolling. A single popup could otherwise sit over every page in a run, at both sizes.
Live chat widgets are hidden too. A chat bubble sits in the corner of every page of a site, so one widget could turn up in every capture you took.
Fixed
Fixes to how the app starts up, and to the browser it uses to capture pages.
Capture any list of URLs, and pages behind a password
Version 1.2.0
A sitemap is not the only way to say what you want. You can now paste the URLs instead, and open pages that are protected by a single password.
New
Capture a list of URLs instead, under Advanced. Paste them one per line and SiteHaul skips the sitemap entirely. This is the answer for a page deliberately kept out of the sitemap, for a site that has no sitemap at all, and for the times you want four specific pages rather than to untick eighty.
Page password, also under Advanced. For a page protected by one password and no username, like WordPress's built-in page protection. It is only tried on pages that turn out to be gated, it is never saved, and it is never written into your run folder. A password that gets rejected is reported as exactly that, rather than as a page that happens to be locked.
A pasted list can span several sites, which makes 'grab the pricing page of ten competitors' one run. Those runs are named by site rather than by whichever URL was first, and every filename leads with its host so you can tell whose is whose.
Pulled my whole portfolio site in one run and the files were named exactly like the URLs, which saved me a ton of cleanup. The Markdown export is a nice bonus I didn't expect to actually use.
Popups and chat widgets get cleared
SiteHaul now clears the things that sit on top of a page, so your captures come back showing the actual site.
Improved
Newsletter and signup popups are closed before the screenshot is taken, including ones that appear late, after the page has finished loading and scrolling. A single popup could otherwise sit over every page in a run, at both sizes.
Live chat widgets are hidden too. A chat bubble sits in the corner of every page of a site, so one widget could turn up in every capture you took.
Fixed
Fixes to how the app starts up, and to the browser it uses to capture pages.
Pazi
Such a promising launch—congrats on SiteHaul! Screenshot an entire website in one click. is a clever idea. Wishing you a strong Product Hunt day! 🚀