Export

Take the article and its images offline

Single-file .md download keeps image links pointing at the web. ZIP export packs the note with the image files and rewrites the links that downloaded. The side panel does not check a subscription before it builds that archive.

react-hooks-guide.zip
├── react-hooks-guide.md12.4 KB
├── images/
│ ├── cover.webp145 KB
│ ├── diagram.png89 KB
│ └── screenshot.jpg203 KB
Download ZIP

What is inside the archive

One archive

The zip is named from the page title and contains a Markdown file plus an images folder. If the page has no remote images, the zip still holds the Markdown file.

Images downloaded beside the note

Remote images referenced as Markdown images are fetched and stored under images/. Links that succeed are rewritten to images/<file>.

Failures stay as URLs

If an image does not download, the original URL stays in the Markdown. You do not get a relative path to a file that never landed in the archive. Data-URL images are not fetched into the zip.

When to choose ZIP instead of one file

Download .md is the right save when the destination can still reach the image hosts. The file is the templated Markdown, and the name is sanitized: spaces become underscores, and characters that are unsafe in a file name are removed. Download .zip is the right save when the note has to open on a machine that will not fetch those hosts. The archive name is the page title plus .zip, and the Markdown inside uses that title plus .md. Spaces are not rewritten to underscores on the ZIP path. If the page has no title, both downloads fall back to converted_content.

Open the download control in the Markdown tab. The menu has two items, Download .md and Download .zip. While the archive is built, the control shows a spinner and both the button and the ZIP item are disabled. A toast says “Packing images…” and is replaced by one of three results. No remote images, or every fetch succeeded: “Downloaded successfully!” Some fetches failed: “Downloaded! N image(s) failed, original URLs kept.” The archive itself could not be created: “Failed to create zip file.”

This action does not require Premium. Pricing describes the paid subscription, which this download does not consult. The step-by-step choice between copy, one file, and a ZIP is in the save guide.

What the download looks for

The input is the Markdown currently in the panel, after the template has been applied, unless you have edited the text by hand. In that case the edited text is what gets packed. The download looks for ![alt](url). It trims whitespace inside the parentheses. It skips any URL that starts with data:. It does not download ordinary links. It does not parse HTML img tags that never became Markdown images. It does not understand reference-style images. The same URL is downloaded once even when the note repeats it.

Images are requested together, each with a 30 second limit. The extension may request http and https hosts. A host that refuses that request, or that expects the page’s own cookies, comes back as a failure. The original line is then left unchanged. You do not get a relative path to a file that is missing.

File names come from the last segment of the URL path. Query strings are not part of the name, so photo.jpg?width=800 is stored as photo.jpg. If the segment has no extension, one is added from the content type: png, jpeg as jpg, gif, webp, svg, bmp, ico, or avif. An unknown type becomes .png. Characters that are unsafe in a file name are stripped. An empty name becomes image plus that extension. When two different URLs want the same name, the second file is name-1.ext and the third is name-2.ext.

A worked example

This note is an illustration, not a capture. Three images and one ordinary link:

# How hooks remember state

![State diagram](https://cdn.example.com/diagrams/state.png)

![Author mark](data:image/png;base64,iVBORw0KGgo=)

![Chart](https://cdn.example.com/charts/render)

See the [hooks guide](https://example.com/hooks).

Suppose the diagram downloads as image/png and the chart downloads as image/svg+xml with no extension on the path. The data URL is ignored. The hooks guide link is ignored. The Markdown written into the archive looks like this:

# How hooks remember state

![State diagram](images/state.png)

![Author mark](data:image/png;base64,iVBORw0KGgo=)

![Chart](images/render.svg)

See the [hooks guide](https://example.com/hooks).

The archive layout for a title of “How hooks remember state”:

How hooks remember state.zip
├── How hooks remember state.md
└── images/
    ├── state.png
    └── render.svg

If the chart request had failed, its line would still be ![Chart](https://cdn.example.com/charts/render), the images folder would contain only state.png, and the toast would report one failure. If every remote fetch fails, the Markdown file is still written and the original URLs stay in it. The images directory is created in that case, and no file is added to it, because only successful bytes are stored. If the note had no remote images to begin with, the images directory is not created at all. The archive is just the Markdown file.

Scroll first, then convert

The extension reads the document that is open. Figures that appear only after you scroll may be absent from the extracted article, and then they are absent from the Markdown, and then they are absent from the zip. Scroll the page before you convert. Extraction keeps the article and drops the surrounding chrome, so a logo in the site header is not a file in your archive unless it was part of the article HTML that became a Markdown image. The HTML to Markdown page describes that conversion. ZIP does not go back to the DOM to find more pictures.

Lazy images that are still a placeholder URL will be fetched as that placeholder. If the placeholder is a one-pixel file, that is the file you will unzip. Convert again after the real sources are in the page.

Image lines that stay on the web

A title on the image, written ![alt](https://cdn.example.com/a.png "diagram"), is captured as one URL that includes the title text. The fetch fails, and the original line stays. Parentheses in the URL stop the match at the first closing parenthesis, so the fetch URL is truncated and usually fails the same way. A line break between the alt text and the URL is not matched. An image written inside a fenced code sample is still matched, because the scan is a text search, not a Markdown parse. If a tutorial is showing image syntax as an example, that example can be rewritten into images/... and a real download can be attempted. Edit those lines to ordinary text before you pack, or accept the rewrite.

Relative URLs are a separate miss. A path such as images/hero.png is not turned into the article’s full address, so the download fails and the original line stays. Absolute http and https URLs are the ones this export is built for.

A full pass, from tab to folder

Open the article and scroll once so the figures load. Open WebInk. If you want YAML around the body, pick that template before you download. The zip will contain the wrapped text, and only images that survive as ![alt](url) in that text. Choose Download .zip. Wait for the toast. Unzip next to the folder where you keep notes. Open the Markdown file. Links that rewrote should resolve to the sibling images folder. Links that failed should still be the original https URL, which you can retry later or leave as a remote reference.

Compare that with copy. Copy puts the same templated text on the clipboard and downloads nothing. Compare it with Download .md, which saves one file and leaves every image remote, with a sanitized file name. Compare it with the public URL to Markdown tool, which can download a .md file for a public URL and does not build this image archive. The archive is an extension action on the tab you converted. The Obsidian use case is one place people unpack it. A research clip that must keep a figure is the same mechanic, described on the AI research page.

Limits that are easy to miss

The content type is whatever the host returned. A URL that ends in .png but responds with HTML will still be saved under that png name, because an extension already present on the path is kept. Open a suspicious file if the note looks broken. The download does not check that the bytes are an image beyond using the declared type for names that lacked an extension.

Very large pages are limited by the browser that is building the zip, not by a subscription quota. There is no batch mode. One conversion produces one archive. A list of URLs is not a feature of this download. Each image is a separate request, deduped by exact URL string, with a 30 second cap.

Notion export is not an alternative path in the panel. The Notion control is not shown. If you needed a Notion page, copy or download the Markdown and paste it. Do not look for a Notion file inside the zip.

Questions

Is Download .zip a Premium action?

No. The side panel shows Download .zip in the same menu as Download .md. It does not require Premium. Pricing describes the paid subscription. It does not turn this download on or off.

What is inside the zip when the page has no images?

A single Markdown file named from the page title. There is no images folder. The toast is “Downloaded successfully!” The same toast is used when every remote image succeeded.

What happens when some images fail?

The zip still downloads. Successful images are files under images/ and their Markdown links point at those files. Failed images keep the original URL. The toast reads “Downloaded! N image(s) failed, original URLs kept.” A failure to build the archive at all shows “Failed to create zip file.”

Are data URLs and ordinary links included as files?

No. An image whose URL starts with data: is left as written and is not fetched. A normal link, written as [text](url), is not an image and is not downloaded. Only Markdown image syntax is scanned.

How are duplicate image names handled?

The same URL is fetched once. Different URLs that end in the same file name become name.ext, then name-1.ext, then name-2.ext. The extension comes from the URL path when it has one, otherwise from the response content type. Known types include png, jpg, gif, webp, svg, bmp, ico, and avif. Anything else without an extension is saved as .png.

Why did a relative image or a titled image stay remote?

The fetch runs in the extension background and uses the URL string as written. A relative path has no page base there, so it usually fails and the original line stays. A title after the URL, as in ![alt](url "title"), is not split off, so the fetch URL is wrong and the original line stays. Parentheses inside a URL also stop the scan at the first closing parenthesis.

Export from the side panel

Open WebInk on the article, then choose Download .zip when you need the images with the file.

Add to Chrome
More from WebInk