<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Juan Carlos Rodicio</title>
    <description>The latest articles on DEV Community by Juan Carlos Rodicio (@decamp).</description>
    <link>https://dev.to/decamp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193464%2F6fa4f652-0520-454c-8dc9-84321959aefe.png</url>
      <title>DEV Community: Juan Carlos Rodicio</title>
      <link>https://dev.to/decamp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/decamp"/>
    <language>en</language>
    <item>
      <title>Inside a Jimdo Creator site: what an export has to read</title>
      <dc:creator>Juan Carlos Rodicio</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:14:21 +0000</pubDate>
      <link>https://dev.to/decamp/inside-a-jimdo-creator-site-what-an-export-has-to-read-3p3c</link>
      <guid>https://dev.to/decamp/inside-a-jimdo-creator-site-what-an-export-has-to-read-3p3c</guid>
      <description>&lt;p&gt;Jimdo is plain about it: "At Jimdo, there is also no option for creating a backup of your website yourself." (&lt;a href="https://help.jimdo.com/hc/en-us/articles/115005512086" rel="noopener noreferrer"&gt;Jimdo help&lt;/a&gt;). No blog export, no XML file, no ZIP. If you want your content somewhere else, the published site is the only copy you can read.&lt;/p&gt;

&lt;p&gt;So we read one: a public Jimdo Creator blog, a German-language news blog with posts from 2010 to 2013. Here's what a Creator site looks like from the outside, and what trips up anyone copying it, by hand or with a script.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The sitemap is the inventory
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/sitemap.xml&lt;/code&gt; lists 1,615 URLs in one file. 1,202 are blog posts, easy to spot because the date is in the path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/2012/12/31/die-besten-wünsche-zum-jahreswechsel-…/   post
/2012/12/30/hinweise-zum-grenzüberschreitenden-…/   post
/startseite/                                        page
/archiv-info24-blog24/                              page
/dezember-2013/                                     page (a monthly archive)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The other 413 are pages, many of them archive or category pages built by hand. There are no &lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt; dates. The RSS feed (&lt;code&gt;/rss/blog&lt;/code&gt;) has 18 items: fine for a reader, useless as a list of everything you wrote.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A page is a stack of modules
&lt;/h2&gt;

&lt;p&gt;Creator renders every page server-side as a column of &lt;code&gt;j-module&lt;/code&gt; blocks inside &lt;code&gt;#content_area&lt;/code&gt;. One post from December 2012:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;j-header          4   headings
j-text            8   paragraphs
j-textWithImage   8   a paragraph with a floated image
j-hr              5   dividers
j-spacing         2   empty space
j-facebook        1   ┐ from the template sidebar,
j-rss             2   ┘ not from the post
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read only &lt;code&gt;#content_area&lt;/code&gt;, or every post picks up the sidebar widgets. And map each module type deliberately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Column grids&lt;/strong&gt; (&lt;code&gt;j-hgrid&lt;/code&gt;) hold other modules. Skip nested modules and you drop whole columns; read them column by column.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables&lt;/strong&gt; (&lt;code&gt;j-table&lt;/code&gt;) are real HTML tables. Treat them as layout and they vanish: one post we tested went from three tables to one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downloads&lt;/strong&gt; (&lt;code&gt;j-downloadDocument&lt;/code&gt;) link to PDFs under &lt;code&gt;/app/download/&lt;/code&gt; on the Jimdo domain. Those links die with the site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tags&lt;/strong&gt; sit inside the post area. Copy it as text and every post ends with a line of tag names; extract them as tags.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Every image is called image.jpg
&lt;/h2&gt;

&lt;p&gt;The post loads 30 image URLs. Two are the template's header and favicon; of the other 28, 25 end in &lt;code&gt;image.jpg&lt;/code&gt; and three in &lt;code&gt;image.gif&lt;/code&gt;. The path is what tells them apart: a file ID plus the size Jimdo resized it to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image.jimcdn.com/app/cms/image/transf/dimension=210x1024:format=jpg/path/…/image/i8d39…/version/1356172872/image.jpg
image.jimcdn.com/app/cms/image/transf/none/path/…/image/i8d39…/version/1356172872/image.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page asks for ten different &lt;code&gt;dimension=&lt;/code&gt; values, mostly 210–320 px wide. Replace the &lt;code&gt;transf/…&lt;/code&gt; segment with &lt;code&gt;transf/none&lt;/code&gt; to get the file as uploaded; save the thumbnail and the new site gets a blurry 210-px image.&lt;/p&gt;

&lt;p&gt;The shared name causes a second problem: saved by name, images overwrite each other, and the WordPress importer may skip most of them as "already exists" (it compares titles), leaving posts hot-linking Jimdo. We hit exactly that in testing (37 images on one Jimdo site). Fix: a unique name per image.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Creator is not the new Jimdo
&lt;/h2&gt;

&lt;p&gt;Jimdo runs two builders. The newer one has no blog, and "The content on your Creator website can't be moved over to your Jimdo website." (&lt;a href="https://help.jimdo.com/hc/en-us/articles/360020543431" rel="noopener noreferrer"&gt;Jimdo help&lt;/a&gt;). Leaving Creator means leaving Jimdo, or rebuilding by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Count posts from the sitemap (date in the path), not the feed.&lt;/li&gt;
&lt;li&gt;Read &lt;code&gt;#content_area&lt;/code&gt; only, module by module, including inside column grids.&lt;/li&gt;
&lt;li&gt;Swap every image to &lt;code&gt;transf/none&lt;/code&gt; and give each file a unique name.&lt;/li&gt;
&lt;li&gt;Save PDFs from &lt;code&gt;/app/download/&lt;/code&gt; links.&lt;/li&gt;
&lt;li&gt;Keep the old dated post URLs for your redirect map.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://decamp.app" rel="noopener noreferrer"&gt;Decamp&lt;/a&gt;, which exports Jimdo Creator (and Wix, Squarespace, GoDaddy, Weebly) sites to WordPress, Ghost, Webflow, Framer and Markdown with redirects. Originally published at &lt;a href="https://decamp.app/notes/inside-a-jimdo-creator-site" rel="noopener noreferrer"&gt;decamp.app/notes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>scraping</category>
      <category>wordpress</category>
      <category>migration</category>
    </item>
    <item>
      <title>The Wix URLs your redirect map forgets</title>
      <dc:creator>Juan Carlos Rodicio</dc:creator>
      <pubDate>Tue, 20 Oct 2026 07:35:25 +0000</pubDate>
      <link>https://dev.to/decamp/the-wix-urls-your-redirect-map-forgets-3lmi</link>
      <guid>https://dev.to/decamp/the-wix-urls-your-redirect-map-forgets-3lmi</guid>
      <description>&lt;p&gt;When people move a Wix blog, they redirect the posts: &lt;code&gt;/post/my-title&lt;/code&gt; to wherever the post lives now. That covers the URLs you think of. Google has indexed more than that, and every one you don't map turns into a 404 the day the domain moves.&lt;/p&gt;

&lt;p&gt;Here is what a real Wix site exposes, using one we checked this week: a design studio's blog with 356 posts, a shop and some dynamic pages. The patterns are the same on any Wix site.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start from the sitemap, not the feed
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/sitemap.xml&lt;/code&gt; on a Wix site is an index that points to one sitemap per content type. On this site there were nine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blog-posts-sitemap.xml        356 posts at /post/&amp;lt;slug&amp;gt;
blog-categories-sitemap.xml   /blog/categories/&amp;lt;slug&amp;gt;
pages-sitemap.xml             /blog, /portfolio, /about…
store-products-sitemap.xml    /product-page/&amp;lt;slug&amp;gt;
store-categories-sitemap.xml
pricing-plans-sitemap.xml     /pricing-plans/list
member-profiles_…-sitemap.xml
dynamic-…-sitemap.xml         (two CMS collections)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The RSS feed (&lt;code&gt;/blog-feed.xml&lt;/code&gt;) on the same site lists 20 posts. It's a feed of recent items, not an inventory, so a redirect list built from it misses 336 posts here. Large blogs also split the posts sitemap into pages, so follow the nested index too.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Category archives
&lt;/h2&gt;

&lt;p&gt;Every blog category has its own URL, &lt;code&gt;/blog/categories/&amp;lt;slug&amp;gt;&lt;/code&gt;, and Wix lists them in the sitemap, so they get indexed and collect links. The slug is Wix's, not necessarily the category name: a category called "Women in Business" can live at &lt;code&gt;/blog/categories/womeninbusiness&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Point each one at the matching archive on the new platform: &lt;code&gt;/category/women-in-business/&lt;/code&gt; on WordPress, &lt;code&gt;/tag/women-in-business/&lt;/code&gt; on Ghost, or the blog index where the platform has no category pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Paginated blog pages
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/blog/page/2&lt;/code&gt;, &lt;code&gt;/blog/page/3&lt;/code&gt; and so on answer with a 200 and a canonical tag pointing at themselves, so Google can keep them. Their numbering won't match the new blog, so send them all to the blog index with one pattern rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Netlify / Cloudflare Pages (_redirects)
/blog/page/*  /blog/  301

# Apache (.htaccess)
RedirectMatch 301 ^/blog/page/[0-9]+/?$ /blog/

# Nginx
location ~ ^/blog/page/[0-9]+/?$ { return 301 /blog/; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. The old /single-post/ links
&lt;/h2&gt;

&lt;p&gt;Older Wix blogs served posts at &lt;code&gt;/single-post/…&lt;/code&gt; before the switch to &lt;code&gt;/post/&lt;/code&gt;. Links from that era are still out there in old articles, forum threads and newsletters. On the site we checked, &lt;code&gt;/single-post/&amp;lt;slug&amp;gt;&lt;/code&gt; already returns a 404 on Wix itself, so those visitors are being lost today. A move is a chance to win them back: map &lt;code&gt;/single-post/&amp;lt;slug&amp;gt;&lt;/code&gt; to the new post as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Exact paths: slashes and capitals
&lt;/h2&gt;

&lt;p&gt;Wix answers &lt;code&gt;/post/my-title/&lt;/code&gt; with a 301 to the version without the trailing slash, and &lt;code&gt;/Post/my-title&lt;/code&gt; with a 404: paths are case-sensitive. WordPress and Ghost add trailing slashes. Keep the old side of each redirect exactly as Wix wrote it, and the new side exactly as the new platform does, or the redirect chains through an extra hop or misses.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Things that aren't posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Products&lt;/strong&gt; live at &lt;code&gt;/product-page/&amp;lt;slug&amp;gt;&lt;/code&gt;. If the shop moves to Shopify or WooCommerce, map them to the new product URLs; if it closes, to the most relevant page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing plans, member profiles and dynamic CMS pages&lt;/strong&gt; each have their own sitemap. Decide per collection: rebuild, redirect to a parent page, or let them go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images&lt;/strong&gt; are served from &lt;code&gt;static.wixstatic.com&lt;/code&gt;, a Wix domain you can't redirect. Image search traffic only survives if the images are re-hosted on the new site with their alt text, before the Wix plan ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free addresses&lt;/strong&gt; (&lt;code&gt;name.wixsite.com/site&lt;/code&gt;) can't carry redirects at all. Only a custom domain can, which is one more reason to connect the domain to the new host rather than start fresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check it after the switch
&lt;/h2&gt;

&lt;p&gt;Once the domain points at the new host, run the old URLs through a checker and look for anything that isn't a single 301 to a 200. A &lt;a href="https://decamp.app/tools/redirect-checker" rel="noopener noreferrer"&gt;free redirect checker&lt;/a&gt; does that for a pasted list, and the &lt;a href="https://decamp.app/tools/wix-redirect-map" rel="noopener noreferrer"&gt;Wix redirect map tool&lt;/a&gt; builds the list from a live Wix sitemap.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build &lt;a href="https://decamp.app" rel="noopener noreferrer"&gt;Decamp&lt;/a&gt;, which exports Wix sites and writes these redirect files (category archives and the old /single-post/ links included).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>wix</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Getting content out of Wix, Squarespace, GoDaddy and Jimdo: what actually works in 2026</title>
      <dc:creator>Juan Carlos Rodicio</dc:creator>
      <pubDate>Mon, 19 Oct 2026 07:45:18 +0000</pubDate>
      <link>https://dev.to/decamp/getting-content-out-of-wix-squarespace-godaddy-and-jimdo-what-actually-works-in-2026-3p7</link>
      <guid>https://dev.to/decamp/getting-content-out-of-wix-squarespace-godaddy-and-jimdo-what-actually-works-in-2026-3p7</guid>
      <description>&lt;p&gt;Most website builders don't really let you leave. Wix's help centre says blog posts "can't be exported to other platforms". Squarespace exports one blog as a WordPress file, with images left as links that, in its own words, "stop working after you cancel". GoDaddy's builder backups exclude blogs and images. Jimdo says there's "no option for creating a backup of your website yourself".&lt;/p&gt;

&lt;p&gt;We build Decamp, a tool that exports those sites, so we spend our days reading what these platforms publish. Here's what we learned, including two bugs that would have silently lost our users' content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the data the platform already serves
&lt;/h2&gt;

&lt;p&gt;Scraping rendered HTML gets you layout soup. Each builder serves something better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wix&lt;/strong&gt;: the public site issues a visitor token (&lt;code&gt;/_api/v1/access-tokens&lt;/code&gt;) that the Wix Blog API accepts. Posts come as "Ricos", a structured rich-content JSON (paragraphs, lists, galleries, tables, embeds), which converts cleanly to HTML. Static pages render server-side if you ask with &lt;code&gt;?forceSsr=true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Squarespace&lt;/strong&gt;: append &lt;code&gt;?format=json&lt;/code&gt; to any collection or item URL and you get the item body plus metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GoDaddy Website Builder&lt;/strong&gt;: blog posts are embedded in the page as Draft.js JSON (&lt;code&gt;window._BLOG_DATA&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jimdo Creator&lt;/strong&gt;: pages are server-rendered stacks of &lt;code&gt;j-module&lt;/code&gt; blocks, one class per module type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weebly&lt;/strong&gt;: classic sites are server-rendered too (&lt;code&gt;#wsite-content&lt;/code&gt;, &lt;code&gt;.blog-post&lt;/code&gt;), approved comments included, and uploads live under &lt;code&gt;/uploads/&lt;/code&gt; on the site's own host with open CORS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gotcha 1: WordPress silently skips images that share a title
&lt;/h2&gt;

&lt;p&gt;We generate a standard WXR file and let WordPress's own importer pull the images. In a real import, Jimdo sites lost 37 images and GoDaddy sites 20, with no error. The importer treats any item whose &lt;strong&gt;title&lt;/strong&gt; (plus date, when there is one) matches an existing post as "already exists" and skips it. Every Jimdo image is called &lt;code&gt;image.jpg&lt;/code&gt;; pages have no date; and a cover image's alt text often equals the post title. Skipped attachments mean the post keeps hot-linking the old site, which breaks the day the subscription ends.&lt;/p&gt;

&lt;p&gt;Fix: unique titles for every attachment across the file, and distinct timestamps for undated items. Same content, zero skips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotcha 2: Squarespace "website component" blocks
&lt;/h2&gt;

&lt;p&gt;Newer Squarespace sites wrap blocks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sqs-block website-component-block sqs-block-website-component sqs-block-markdown"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you take the first &lt;code&gt;sqs-block-*&lt;/code&gt; class as the type, every block becomes "website-component". On one podcast site that dropped entire episode transcripts (350 words exported instead of 7,633), dropped the audio players, and let "related posts" grids slip in as content. Take the first class that isn't &lt;code&gt;website-component&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smaller lessons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Images: export files, not links. And PNG photos from Wix at 2048px weigh 4 to 6 MB; WebP copies keep transparency at a third of the size.&lt;/li&gt;
&lt;li&gt;Big WordPress imports time out on shared hosting. Splitting the WXR into 100-item files (with shared titles and dates so a re-import still dedupes) fixes it.&lt;/li&gt;
&lt;li&gt;Comments are reachable: Wix through its comments service (keyed by the blog's internal post id), Squarespace through a public endpoint. Sanitize them: visitor HTML goes straight into WordPress, and the importer doesn't filter it.&lt;/li&gt;
&lt;li&gt;Redirects: generate them for every host (Redirection plugin CSV, .htaccess, Nginx, Netlify &lt;code&gt;_redirects&lt;/code&gt;, Vercel, Ghost YAML, Webflow, Squarespace URL mappings), then check them after DNS moves. We built a free checker for that: decamp.app/tools/redirect-checker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're moving a site off one of these builders, Decamp (decamp.app) does all of the above; the inventory and preview are free. Happy to answer questions about any of the internals in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>migration</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
