if you built a site with solo, mozilla's ai website builder at soloist.ai, it's closing. the date is in solo's own shutdown faq:

"All Solo websites and data will be deleted on November 30, 2026. There will be no way to recover your site, account, or data after that date."

so that's the window. the export is quick, but it leaves out one big thing, and that's most of this post.

1. log in (the soloist ai login bit)

go to soloist.ai and click sign in. solo lets you log in with your email or your google account (solo's interface guide). you land in the designer, the editor with the toolbar across the top.

if you log in and your site isn't there, you're probably on the wrong email. solo's i don't see my websites page says to check your inbox for mail from @soloist.ai to see which address the site was made with. it also says script blockers like noscript stop solo from loading, so allow soloist.ai if you use one.

2. download your website data

the steps from the faq:

  1. log in to solo.
  2. click the menu at the top right and select account settings.
  3. in the account settings popup, click download website data.

you get a zip. per solo it has "an HTML export of your website and a CSV file with links to your image assets, as well as your contact form and newsletter submissions."

unzip it right away and look inside. keep the original zip somewhere safe and work on a copy.

3. the images aren't in the zip

this is the part people miss. solo says it directly:

"Image source files are not included in the ZIP. Download each image individually from the links in the CSV file before the shutdown date on November 30, 2026."

so the csv is a list of links, not your photos. once solo deletes everything, those links stop working, and your html points at nothing.

if you have five images, just open each link and save it. if you have fifty, script it. here's a small python example, standard library only. it's an example to adapt, not a finished tool. i haven't seen every solo export, so check your csv and html before you run it.

# EXAMPLE ONLY. adapt it to your export, and run it on a COPY of the unzipped folder. # usage: python3 grab_images.py path/to/the-image-links.csv import csv, hashlib, re, sys, urllib.request from pathlib import Path from urllib.parse import urlparse csv_path = Path(sys.argv[1]) out = Path("images") out.mkdir(exist_ok=True) # pull every http(s) link out of the csv, whatever the column is called urls = set() with csv_path.open(newline="", encoding="utf-8") as f: for row in csv.reader(f): for cell in row: urls.update(re.findall(r"https?://[^\s\"',]+", cell)) mapping = {} for url in sorted(urls): base = Path(urlparse(url).path).name or "image" base = re.sub(r"[^A-Za-z0-9._-]", "_", base) # short hash prefix so two files both called photo.jpg don't overwrite each other  name = hashlib.sha1(url.encode()).hexdigest()[:8] + "_" + base dest = out / name if not dest.exists(): try: with urllib.request.urlopen(url, timeout=30) as r: dest.write_bytes(r.read()) except Exception as e: print("FAILED", url, e) continue mapping[url] = "images/" + name # point the html at the local copies for page in Path(".").rglob("*.html"): text = page.read_text(encoding="utf-8") for url, local in mapping.items(): text = text.replace(url, local) page.write_text(text, encoding="utf-8") print(len(mapping), "of", len(urls), "images saved") 

a few things to watch:

  • the images/... paths are relative. that's fine if your html files sit next to the images folder. if some pages are in subfolders, they need ../images/ instead.
  • the html might reference an image slightly differently from the csv, like with size settings on the end, or & instead of &. after running it, search your html for leftover remote image links and fix those by hand.
  • anything that prints FAILED, open the link in your browser and save it manually.
  • some image files come back without an extension. if one won't display, check what it actually is and rename it.

prefer the shell? pull the links into a plain text file, one per line, and wget -i links.txt -P images downloads them all. you still have to rewrite the html references yourself though, which is the fiddly half.

then double-click index.html and click around. every image should load with your wifi off.

4. keep form submissions private

the same zip has your contact form and newsletter submissions. that's your customers' names, emails and messages. don't put them on a public host. anything you upload to a static host can be downloaded by anyone who finds the path.

before you upload anything, move the submission files out of the site folder and keep them on your own computer plus one private backup. solo's help also has a separate export contacts option in the designer settings if you want a second copy as csv.

also, the contact form itself stops working when solo closes. a static host can't receive form posts, so swap it for a mailto: link or a form service.

5. host it for free

the folder with index.html at the top is your site. upload the contents of that folder, not the folder that contains it.

netlify drop. go to app.netlify.com/drop and drag the folder in. Log in to Netlify first. Drop works without an account, but if you drop without signing in, the site is protected with a temporary password until you claim it. more in netlify's drop quickstart. they also say deploys under 50mb work best.

cloudflare pages direct upload. in the cloudflare dashboard go to workers & pages, then create application > get started > drag and drop your files. name the project, drop the folder or a zip, deploy. drag and drop allows 1,000 files and 25 mib per file. details in cloudflare's direct upload docs.

either way you get a free subdomain, and you can add your own domain after.

6. move your custom domain

if you bought your domain through solo domains (not ionos), solo is moving those to name.com. the faq steps, roughly:

  1. create a name.com account or log in.
  2. fill in the registrant, administrative and technical contacts on name.com's account contacts page. the transfer can't go through until these are done.
  3. copy the account code from the top right of the name.com dashboard.
  4. email it to support@soloist.ai. solo transfers the domain and emails you when it's done.
  5. add billing info at name.com so it renews.

if the domain is from ionos or another registrar, those steps aren't for you. log in wherever you bought it.

once you control the dns, add the domain in your host's custom domain settings (netlify, cloudflare pages) and copy the records they show you into your dns. leave email (mx) records alone if you use email on that domain. dns changes can take a while to show up.

the other option: data liberation agent

automattic, the company behind wordpress.com, has an open source command-line tool called data liberation agent. you point it at a url and it captures the live site into plain html, css, media and fonts, with references rewritten so it works locally. its readme lists soloist as a supported platform.

the catch is in that word live. it reads your published site, so it has to run before 30 nov, and it won't get your form submissions. it's a node project that also needs playwright's chromium installed, so it's best if you're fine in a terminal. if you are, it's worth running alongside the zip export, not instead of it.

that's it

download the zip today. get the images out while the links still work. keep the form data off the internet. the hosting and domain stuff can happen any time, but the export can't happen after 30 nov.

Written with AI assistance and checked against Solo's shutdown FAQ and help pages, the Netlify and Cloudflare docs, and Automattic's Data Liberation Agent README.