Migration·5 min read·

How do I move my Hashnode developer blog to VeloCMS?

There's no dedicated Hashnode importer, but the generic 'Any Site' importer can crawl a live blog. Here's the real way to move your posts to VeloCMS.

Hashnode is popular with developers precisely because it's developer-friendly — Markdown-first writing, clean code blocks, and a built-in tech audience. If you're looking at VeloCMS, it's probably because you want more control: your own design, a domain without Hashnode branding, or a subscriber list you actually own. Here's the honest state of moving your posts over.

The honest answer: no dedicated importer, but a generic one works

VeloCMS's import page (Admin → Import) has dedicated importers for platforms like WordPress, Substack, Ghost, Medium, and others — Hashnode isn't one of them. What does cover Hashnode is the 'Any Site' importer on the same page: point it at your live Hashnode blog's URL and it discovers your posts through the sitemap and RSS feed, then extracts each post's content. It imports posts only (no comments or reactions), and your Hashnode blog needs to still be online while it runs. For most Hashnode blogs this gets the archive across in one pass; the sections below cover the cases it doesn't — fine-grained control, embeds, and images.

Moving a handful of posts by hand

For a small blog, the fastest real path is opening each post fresh: Admin → Posts → New Post, then writing or reformatting the content directly in VeloCMS's editor. Fenced code blocks keep their syntax highlighting and get a copy button automatically — your developer readers get the same reading experience they had on Hashnode, and you can now restyle the code block colors to match your own theme.

Scripting it with the API, for a larger archive

If you've got dozens of posts, retyping each one isn't realistic. VeloCMS has a public REST API for creating posts programmatically — POST /api/v1/posts. Generate a key with the posts:write scope at Admin → Settings → Advanced → API Keys (this requires a Pro plan or higher, the same as VeloCMS's platform importers), convert each post's Markdown body to HTML with any converter you're comfortable with, and send it across as content_html along with title, slug, tags, and status.

curl -X POST https://yourname.velocms.org/api/v1/posts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Building a REST API with Node.js",
    "slug": "building-rest-api-nodejs",
    "content_html": "<h2>Building a REST API with Node.js</h2><p>...</p>",
    "tags": ["Node.js", "REST API"],
    "status": "draft"
  }'

status: "draft" lands the post in Admin → Posts as a draft so you can review formatting and images before publishing — a sensible default while you're scripting a batch.

Moving images

There's no ZIP-with-an-images-folder convention. Upload each image at Admin → Media (or POST /api/v1/media with a media:write key) and use the URL it hands back inside your post's content_html. If an image is still hosted somewhere else — your old Hashnode static/ folder on GitHub, a CDN — you can reference that URL directly instead; VeloCMS doesn't require you to re-host it before it will display.

Handling embeds

Hashnode's CodePen, GitHub Gist, and other widget embeds don't survive a plain text or HTML copy — they'll show up as bare links at best. To restore one, paste the embed service's iframe code (e.g. the GitHub Gist embed snippet) directly into VeloCMS's editor as an HTML embed block. It's a one-time fix per embedded item, not automatic.

Moving your custom domain

If your Hashnode blog runs on your own domain, go to Admin → Settings → Branding, open the Custom Domain section, and add the domain — you'll see a status panel with the exact DNS records (a CNAME target and a TXT ownership record) to add. Replace the CNAME your DNS provider currently sends to Hashnode with the target the panel shows. Propagation is typically 5–30 minutes on Cloudflare, up to 24 hours on some other providers.

Keeping your audience

Hashnode's follower graph is Hashnode's — there's no export for it. The honest playbook: publish a final post on Hashnode linking to your new VeloCMS blog and RSS feed, send a migration note through Hashnode's own newsletter tool if you used it, and set canonical URLs on any Hashnode posts you leave up so search engines credit the new home.

Frequently asked questions

  • Does VeloCMS support the SEO basics developers care about? Yes — Article JSON-LD, Open Graph tags, canonical URLs, and an /llms.txt file for AI indexers ship on every post automatically.
  • Is there a headless or API-first way to publish, like Hashnode's GraphQL API? VeloCMS's REST API — the same one described above, /api/v1/posts — covers creating, updating, and publishing posts with a scoped API key. It's REST, not GraphQL, but it serves the same 'publish from a script' use case.
  • Will my Hashnode comments or reactions carry over? No — those live on Hashnode's platform and there's no VeloCMS equivalent for reactions. Comments start fresh on VeloCMS's native comment system.