# Hashnode to ghost migration

**URL:** https://forum.ghost.org/t/hashnode-to-ghost-migration/63130
**Category:** Self-hosting
**Created:** [June 16, 2026, 6:24pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130 "2026-06-16T18:24:14Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![anjanesh](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/anjanesh/32/24281_2.png) [@anjanesh](https://forum.ghost.org/u/anjanesh)
#### Post date: [June 16, 2026, 6:24pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/1 "2026-06-16T18:24:14Z")

</div>

[Hashnode has now gone pro-only](https://hashnode.com/changelog/2026-06-11-introducing-hashnode-pro) for some features. Is there some method to import my hashnode posts to ghost ?

I intend to use Ghost 6 on an OpalStack VPS.

---

<div class="post-metadata">

### Author: ![Cathy\_Sarisky](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/cathy_sarisky/32/25750_2.png) [@Cathy\_Sarisky](https://forum.ghost.org/u/Cathy_Sarisky)
#### Post date: [June 16, 2026, 8:29pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/2 "2026-06-16T20:29:29Z")

</div>

Almost certainly. Does Hashnode have an export format?

There are useful tools in the @tryghost migration repository, and gctools is another good resource.

---

<div class="post-metadata">

### Author: ![anjanesh](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/anjanesh/32/24281_2.png) [@anjanesh](https://forum.ghost.org/u/anjanesh)
#### Post date: [June 16, 2026, 9:04pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/3 "2026-06-16T21:04:37Z")

</div>

There is an option to “Back up your articles and drafts to a GitHub repository” - but right now that’s under the PRO option only but I seem to have all my articles backed-up to my private GitHub prior to the PRO date. The articles are in .md in this format :

```auto
---
title: "xxx"
datePublished: Wed Mar 04 2020 10:37:34 GMT+0000 (Coordinated Universal Time)
cuid: xxx
slug: xxx-xxx-xxx
tags: xxx, xxx, xxx

---

Blog Content here

```

So, yes I have a list of all my posts as md files on my GitHub which is downloadable.

---

<div class="post-metadata">

### Author: ![jannis](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/jannis/32/39718_2.png) [@jannis](https://forum.ghost.org/u/jannis)
#### Post date: [June 16, 2026, 9:26pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/4 "2026-06-16T21:26:15Z")

</div>

The `ghst` CLI might be a good place to start, if you have .md files:

> **[GitHub - TryGhost/ghst: A modern Ghost CLI tool](https://github.com/TryGhost/ghst#quick-start)**
>
> A modern Ghost CLI tool

Somebody also shared this tool they’ve build, which looks like it has a few more options, though it’s pretty new:

> [@Publish to Ghost from a Markdown file in one command (free, open-source)](https://forum.ghost.org/t/publish-to-ghost-from-a-markdown-file-in-one-command-free-open-source/63111):
>
> Hi all, Publishing a post with several images by hand in the editor always cost me ~15 minutes of plumbing per piece — paste the body, upload each image one by one, fill in title/slug/excerpt/tags, build the cards. So I wrote a small CLI that does it in one command and open-sourced it (MIT), in case it’s useful to anyone here. ghost-md-publisher — you write in Markdown with YAML front-matter, and it publishes to Ghost via the Admin API: npm install -g @oksigenia/ghost-md-publisher ghost-publi…

---

<div class="post-metadata">

### Author: ![anjanesh](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/anjanesh/32/24281_2.png) [@anjanesh](https://forum.ghost.org/u/anjanesh)
#### Post date: [June 16, 2026, 9:38pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/5 "2026-06-16T21:38:43Z")

</div>

Using the ghost CLI :

`ghst post create --markdown-file ./post1.md`

Do I need to edit anything for ghst to ‘recognize’ the hashnode arguments - sync with the ghost parameters ?  
title, datePublished, cuid, slug, cover, tags

* * *

title: “xxx xxx”  
datePublished: Fri Jan 31 2025 08:48:00 GMT+0000 (Coordinated Universal Time)  
cuid: xxx  
slug: xxx-xxx-xxx  
cover: [https://cdn.hashnode.com/path/to/images/xxx.jpeg](https://cdn.hashnode.com/path/to/images/xxx.jpeg)  
tags: xxx, xxx, xxx

* * *

Blog Content

---

<div class="post-metadata">

### Author: ![jannis](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/jannis/32/39718_2.png) [@jannis](https://forum.ghost.org/u/jannis)
#### Post date: [June 16, 2026, 9:40pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/6 "2026-06-16T21:40:38Z")

</div>

I don’t think it can do that out of the box. Not sure if any existing tool for Ghost can.

So, I’d use them as starting points − I don’t think there is a plug-and-play solution.

---

<div class="post-metadata">

### Author: ![anjanesh](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/anjanesh/32/24281_2.png) [@anjanesh](https://forum.ghost.org/u/anjanesh)
#### Post date: [June 16, 2026, 10:02pm UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/7 "2026-06-16T22:02:47Z")

</div>

So where’s my starting point to writing scripts in JavaScript to import a a bunch of .md files and sequentially run `ghst post create --title `${post_title}` --markdown-file ./hashnode/post-1.md` or something like that ?

---

<div class="post-metadata">

### Author: ![jannis](https://sea1.discourse-cdn.com/flex015/user_avatar/forum.ghost.org/jannis/32/39718_2.png) [@jannis](https://forum.ghost.org/u/jannis)
#### Post date: [June 17, 2026, 5:07am UTC](https://forum.ghost.org/t/hashnode-to-ghost-migration/63130/8 "2026-06-17T05:07:19Z")

</div>

If you’re comfortable with Javascript, the easier path would probably be a script that parses through your .md files and then talks to the Ghost Admin API directly:

> **[Admin API JavaScript Client - Ghost Developer Docs](https://docs.ghost.org/admin-api/javascript)**
>
> Admin API keys should remain secret, and therefore this promise-based JavaScript library is designed for server-side usage only. This library handles all the details of generating correctly formed urls and tokens, authenticating and making requests.

Without ever having done this, this looks like something you’d want to use:

[https://www.npmjs.com/package/gray-matter](https://www.npmjs.com/package/gray-matter)
