Manage Your Hashnode Blog Using the `hn` CLI
I’m a visually impaired software engineer who finds deep joy in exploring ideas and uncovering unexpected connections. I’m drawn to patterns that often go unnoticed. I love finding those veered threads that do not seem related until they suddenly come together. I write to make sense of what I learn and enjoy breaking things down for others. For me, it is about connecting ideas, sharing the process, and letting curiosity lead the way.
Introducing hn: The Git-Like CLI for Managing Your Hashnode Blog
Writing a blog should feel like writing code—not filling out forms in a web UI.
hn is a command-line tool that lets you manage your Hashnode blog directly from a Git repository, using familiar developer workflows: staging, planning, snapshots, and explicit publishing. It’s designed to be safe, predictable, and observable, even if your blog grows to dozens or hundreds of posts.
Official GitHub repository: adil-adysh/hashnode-cli
This post walks through all major operations of hn, why they matter, and how they fit into a clear, developer-friendly workflow.
Installation
hn can be installed on Windows using Scoop:
# List existing Scoop buckets
scoop bucket list
# Add the hashnode-cli bucket if not present
scoop bucket add hashnode-cli https://github.com/adil-adysh/scoop-bucket.git
# Install hn
scoop install hn
# If already installed, update to the latest version
scoop update hn
`
Once installed, verify:
hn --help
This lists all available commands and flags.
Blogging as a State Machine
At its core, hn treats blogging like version control:
- Local Markdown files → where you create content
- Staging area → what you intend to publish
- Ledger (
hashnode.sum) → what exists on Hashnode - Plan & Apply → preview changes before executing
Nothing is published implicitly. Every action is intentional.
hn init: Setup Your Repository
Before using hn, initialize your repo:
hn init
This will:
- Prompt for your Hashnode Personal Access Token (or read it from
HASHNODE_TOKEN) - Verify the token via the Hashnode API
- Let you select a publication (one blog per repo)
- Create a
.hashnodedirectory andblog.ymlfor CLI-managed state
⚠️ Do not edit files under
.hashnode/manually; they are CLI-owned.
Local-First Markdown Workflow
hn works directly with your filesystem:
- Write posts as plain
.mdfiles - Organize them however you like:
2025/07/my-first-post.md
ai/rag-design.md
- Front matter is required for metadata (title, slug, tags, image URL, meta description)
- No hidden metadata inside content
- Repository stays readable and future-proof
Tip: Images are supported via front matter—just generate the URL and add it to the YAML.
Staging Posts (hn stage)
Before publishing, posts must be staged:
hn stage ai/rag-design.md
Staging:
- Captures your intent
- Creates a snapshot in
.hashnode/snapshots/ - Does not publish
Review staged posts:
hn stage list
Everything is visible, reversible, and safe.
Planning Changes (hn plan)
Preview exactly what will happen:
hn plan
The plan shows:
- 🟢 New posts
- 🟡 Updates
- 🔴 Deletes
Example:
🟢 CREATIONS
ai/rag-design.md
└─ Reason: New draft (Local-only)
🟡 UPDATES
2025/07/my-first-post.md
└─ Reason: Content changed (Snapshot updated)
No side effects. No surprises.
Updating Posts
Editing workflow:
- Edit the Markdown file:
notepad ai/rag-design.md
- Restage modified file:
hn stage ai/rag-design.md
- Preview plan:
hn plan
- Apply changes:
hn apply
Deleting Posts
Deletion is explicit:
hn delete ai/rag-design.md
hn apply --yes
--yesis required to confirm deletes- Local removal does not affect remote unless staged for deletion
- Prevents accidental data loss
Import Existing Posts (hn import)
Sync your local repo with Hashnode:
hn import
- Fetches posts from Hashnode
- Writes them as Markdown files
- Updates
hashnode.sum
Safe to run repeatedly; won’t overwrite staged changes.
Applying Changes (hn apply)
After staging and planning, apply changes:
hn apply
- Creates new posts
- Updates modified posts
- Deletes staged posts (with
--yes)
All operations are logged and visible for traceability.
Garbage Collection (hn gc)
Clean up unreferenced snapshots:
hn gc
Keeps your .hashnode/snapshots/ directory tidy and avoids unnecessary storage.
Available Commands Overview
hn [command]
Available Commands:
apply Apply planned changes
delete Mark a file for remote deletion
gc Garbage collect unreferenced snapshots
import Import posts from Hashnode and sync ledger
init Setup hashnode-cli with your account
plan Show planned changes
stage Manage staging area
unstage Remove a file from the stage
completion Generate shell autocompletion
help Help about any command
Series management is not supported at this time.
Final Thoughts
hn brings a Git-like workflow to blogging:
- Edit → Stage → Plan → Apply → Delete
- Explicit intent, predictable updates, and traceable history
- Front matter keeps metadata clear, snapshots protect intent, ledger tracks reality
By treating your blog as a version-controlled system, you stay in Markdown, Git, and full control, without relying on a web UI.
Official GitHub repository: adil-adysh/hashnode-cli

