hackmd-cli v2 now only supports the official HackMD instance (hackmd.io) and HackMD EE instances after version 1.38.1. CodiMD is not supported in this package.
CodiMD users: A dedicated standalone CLI is now available at hackmdio/codimd-cli. Please refer to that repository for installation and usage instructions.
- If you are using the CLI with CodiMD, please use the standalone codimd-cli instead.
- If you are using the CLI with HackMD(hackmd.io) or HackMD EE(Enterprise Edition) instances:
- You're using the JSON file-based config: Remove
~/.hackmd/config.jsonand start over again. You can start with configuration section. - You're using environment variable based config:
HMD_CLI_SERVER_URLhas been replaced withHMD_API_ENDPOINT_URL. AndHMD_API_ENDPOINT_URLmay vary depending on your instance. Please check contact your instance admin to get the correctHMD_API_ENDPOINT_URL. For generating access token, please check the configuration section. You'll need to set theHMD_API_ACCESS_TOKENenvironment variable.
- You're using the JSON file-based config: Remove
$ npm install -g @hackmd/hackmd-cli
$ hackmd-cli COMMAND
running command...
$ hackmd-cli (--version|-v)
@hackmd/hackmd-cli/2.4.0 darwin-arm64 node-v24.13.0
$ hackmd-cli --help [COMMAND]
USAGE
$ hackmd-cli COMMAND
...Access token should be set before using hackmd-cli. It can be created by landing hackmd.io -> Setting -> API -> Create API token. Copy the token and set it as config variable. For more details, please follow the tutorial: How to issue an API token.
Set the access token by login command. By doing so, the access token will be saved in ~/.hackmd/config.json.
$ hackmd-cli login
Enter your access token: My_ACCESS_TOKENOr you don't want to keep the credentials in one file, you can set it through environment variable:
export HMD_API_ACCESS_TOKEN=MY_ACCESS_TOKENOr you can write the configuration file manually. Edit ~/.hackmd/config.json with the following content:
{
"accessToken": "MY_ACCESS_TOKEN"
}hackmd-cli operates on the official HackMD API endpoint (https://api.hackmd.io/v1) by default. If you want to use hackmd-cli with a custom HackMD EE instance, you will need to configure the API endpoint by either environment variable or JSON configuration manually.
Set environment variable in your shell profile:
export HMD_API_ENDPOINT_URL=https://my.hackmd-ee.api.endpointOr in JSON file (~/.hackmd/config.json):
{
"hackmdAPIEndpointURL": "https://my.hackmd-ee.api.endpoint"
}All available configurations are listed in the table below.
| Config key | Environment Variable | Data Type | Example Value | Description |
|---|---|---|---|---|
hackmdAPIEndpointURL |
HMD_API_ENDPOINT_URL |
string |
https://api.hackmd.io/v1 |
HackMD EE API endpoint URL |
accessToken |
HMD_API_ACCESS_TOKEN |
string |
UFHR12H7FSEF3ADFY3N9YNRN2E49VGR212NBF |
Token to access HackMD APIs |
hackmd-cli autocomplete [SHELL]hackmd-cli exporthackmd-cli help [COMMANDS]hackmd-cli historyhackmd-cli loginhackmd-cli logouthackmd-cli noteshackmd-cli notes createhackmd-cli notes deletehackmd-cli notes updatehackmd-cli team-noteshackmd-cli team-notes createhackmd-cli team-notes deletehackmd-cli team-notes updatehackmd-cli teamshackmd-cli versionhackmd-cli whoami
display autocomplete installation instructions
USAGE
$ hackmd-cli autocomplete [SHELL] [-r]
ARGUMENTS
SHELL shell type
FLAGS
-r, --refresh-cache Refresh cache (ignores displaying instructions)
DESCRIPTION
display autocomplete installation instructions
EXAMPLES
$ hackmd-cli autocomplete
$ hackmd-cli autocomplete bash
$ hackmd-cli autocomplete fish
$ hackmd-cli autocomplete zsh
$ hackmd-cli autocomplete --refresh-cache
See code: @hackmd/oclif-plugin-autocomplete
Export note content
USAGE
$ hackmd-cli export [-h] [--noteId <value>]
FLAGS
-h, --help Show CLI help.
--noteId=<value> HackMD note id
DESCRIPTION
Export note content
EXAMPLES
$ hackmd-cli export --noteId=kNFWV5E-Qz-QP7u6XnNvyQ
# A note to be exported
See code: src/commands/export.ts
Display help for hackmd-cli.
USAGE
$ hackmd-cli help [COMMANDS] [-n]
ARGUMENTS
COMMANDS Command to show help for.
FLAGS
-n, --nested-commands Include all nested commands in the output.
DESCRIPTION
Display help for hackmd-cli.
See code: @oclif/plugin-help
List user browse history
USAGE
$ hackmd-cli history [-h] [--columns <value> | -x] [--sort <value>] [--filter <value>] [--output
csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--sort=<value> property to sort by (prepend '-' for descending)
DESCRIPTION
List user browse history
EXAMPLES
$ hackmd-cli history
ID Title User Path Team Path
────────────────────── ──────────────────────────────── ────────────────────── ────────
raUuSTetT5uQbqQfLnz9lA CLI test note gvfz2UB5THiKABQJQnLs6Q null
BnC6gN0_TfStV2KKmPPXeg Welcome to your team's workspace null CLI-test
See code: src/commands/history.ts
Login to HackMD server from CLI
USAGE
$ hackmd-cli login [-h]
FLAGS
-h, --help Show CLI help.
DESCRIPTION
Login to HackMD server from CLI
EXAMPLES
$ hackmd-cli login
Enter your access token: MY_ACCESS_TOKEN
Login successfully
See code: src/commands/login.ts
Login to HackMD server from CLI
USAGE
$ hackmd-cli logout [-h]
FLAGS
-h, --help Show CLI help.
DESCRIPTION
Login to HackMD server from CLI
EXAMPLES
$ hackmd-cli logout
You've logged out successfully
See code: src/commands/logout.ts
HackMD notes commands
USAGE
$ hackmd-cli notes [-h] [--noteId <value>] [--columns <value> | -x] [--sort <value>] [--filter <value>]
[--output csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--noteId=<value> HackMD note id
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--sort=<value> property to sort by (prepend '-' for descending)
DESCRIPTION
HackMD notes commands
EXAMPLES
$ hackmd-cli notes
ID Title User Path Team Path
────────────────────── ──────────────────────────────── ────────────────────── ────────
raUuSTetT5uQbqQfLnz9lA CLI test note gvfz2UB5THiKABQJQnLs6Q null
See code: src/commands/notes/index.ts
Create a note
USAGE
$ hackmd-cli notes create [--commentPermission <value>] [--content <value>] [-e] [-h] [--readPermission <value>]
[--title <value>] [--writePermission <value>] [--columns <value> | -x] [--sort <value>] [--filter <value>] [--output
csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-e, --editor create note with $EDITOR
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--commentPermission=<value> set comment permission: disabled, forbidden, owners, signed_in_users, everyone
--content=<value> new note content
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--readPermission=<value> set note permission: owner, signed_in, guest
--sort=<value> property to sort by (prepend '-' for descending)
--title=<value> new note title
--writePermission=<value> set note permission: owner, signed_in, guest
DESCRIPTION
Create a note
EXAMPLES
notes create --content='# A new note' --readPermission=owner --writePermission=owner --commentPermission=disabled
ID Title User Path Team Path
────────────────────── ──────────────────────────────── ────────────────────── ────────
raUuSTetT5uQbqQfLnz9lA A new note gvfz2UB5THiKABQJQnLs6Q null
Or you can pipe content via Unix pipeline:
cat README.md | hackmd-cli notes create
Delete a note
USAGE
$ hackmd-cli notes delete [-h] [--noteId <value>]
FLAGS
-h, --help Show CLI help.
--noteId=<value> HackMD note id
DESCRIPTION
Delete a note
EXAMPLES
$ hackmd-cli notes delete --noteId=WNkLM6gkS0Cg2cQ8rv7bYA
Update note content
USAGE
$ hackmd-cli notes update [--content <value>] [-h] [--noteId <value>]
FLAGS
-h, --help Show CLI help.
--content=<value> new note content
--noteId=<value> HackMD note id
DESCRIPTION
Update note content
EXAMPLES
$ hackmd-cli notes update --noteId=WNkLM6gkS0Cg2cQ8rv7bYA --content='# A new title'
HackMD team-notes commands
USAGE
$ hackmd-cli team-notes [-h] [--teamPath <value>] [--columns <value> | -x] [--sort <value>] [--filter <value>]
[--output csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--sort=<value> property to sort by (prepend '-' for descending)
--teamPath=<value> HackMD team path
DESCRIPTION
HackMD team-notes commands
EXAMPLES
$ hackmd-cli team-notes --teamPath=CLI-test
ID Title User path Team path
────────────────────── ──────────────────────────────── ──────── ────────
WNkLM6gkS0Cg2cQ8rv7bYA a team note null CLI-test
BnC6gN0_TfStV2KKmPPXeg Welcome to your team's workspace null CLI-test
See code: src/commands/team-notes/index.ts
Create a team note
USAGE
$ hackmd-cli team-notes create [--commentPermission <value>] [--content <value>] [-e] [-h] [--readPermission <value>]
[--teamPath <value>] [--title <value>] [--writePermission <value>] [--columns <value> | -x] [--sort <value>]
[--filter <value>] [--output csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-e, --editor create note with $EDITOR
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--commentPermission=<value> set comment permission: disabled, forbidden, owners, signed_in_users, everyone
--content=<value> new note content
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--readPermission=<value> set note permission: owner, signed_in, guest
--sort=<value> property to sort by (prepend '-' for descending)
--teamPath=<value> HackMD team path
--title=<value> new note title
--writePermission=<value> set note permission: owner, signed_in, guest
DESCRIPTION
Create a team note
EXAMPLES
team-notes:create --teamPath=CLI-test --content='# A new note' --readPermission=owner --writePermission=owner --commentPermission=disabled
ID Title User Path Team Path
────────────────────── ──────────────────────────────── ────────────────────── ────────
raUuSTetT5uQbqQfLnz9lA A new note gvfz2UB5THiKABQJQnLs6Q null
Or you can pipe content via Unix pipeline:
cat README.md | hackmd-cli notes create --teamPath=CLI-test
Delete a team note
USAGE
$ hackmd-cli team-notes delete [-h] [--noteId <value>] [--teamPath <value>]
FLAGS
-h, --help Show CLI help.
--noteId=<value> HackMD note id
--teamPath=<value> HackMD team path
DESCRIPTION
Delete a team note
EXAMPLES
$ hackmd-cli team-notes delete --teamPath=CLI-test --noteId=WNkLM6gkS0Cg2cQ8rv7bYA
Update team note content
USAGE
$ hackmd-cli team-notes update [--content <value>] [-h] [--noteId <value>] [--teamPath <value>]
FLAGS
-h, --help Show CLI help.
--content=<value> new note content
--noteId=<value> HackMD note id
--teamPath=<value> HackMD team path
DESCRIPTION
Update team note content
EXAMPLES
$ hackmd-cli team-notes update --teamPath=CLI-test --noteId=WNkLM6gkS0Cg2cQ8rv7bYA --content='# A new title'
List teams
USAGE
$ hackmd-cli teams [-h] [--columns <value> | -x] [--sort <value>] [--filter <value>] [--output
csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--sort=<value> property to sort by (prepend '-' for descending)
DESCRIPTION
List teams
EXAMPLES
$ hackmd-cli teams
ID Name Path Owner ID
──────────────────────────────────── ───────────── ──────── ────────────────────────────────────
f76308a6-d77a-41f6-86d0-8ada426a6fb4 CLI test team CLI-test 82f7f3d9-4079-4c78-8a00-14094272ece9
See code: src/commands/teams.ts
USAGE
$ hackmd-cli version [--json] [--verbose]
FLAGS
--verbose Show additional information about the CLI.
GLOBAL FLAGS
--json Format output as json.
FLAG DESCRIPTIONS
--verbose Show additional information about the CLI.
Additionally shows the architecture, node version, operating system, and versions of plugins that the CLI is using.
See code: @oclif/plugin-version
Show current user information
USAGE
$ hackmd-cli whoami [-h] [--columns <value> | -x] [--sort <value>] [--filter <value>] [--output
csv|json|yaml | | [--csv | --no-truncate]] [--no-header | ]
FLAGS
-h, --help Show CLI help.
-x, --extended show extra columns
--columns=<value> only show provided columns (comma-separated)
--csv output is csv format [alias: --output=csv]
--filter=<value> filter property by partial string matching, ex: name=foo
--no-header hide table header from output
--no-truncate do not truncate output to fit screen
--output=<option> output in a more machine friendly format
<options: csv|json|yaml>
--sort=<value> property to sort by (prepend '-' for descending)
DESCRIPTION
Show current user information
EXAMPLES
$ hackmd-cli whoami
ID Name Email User path
──────────────────────────────────── ────────────── ───── ──────────────────────
82f7f3d9-4079-4c78-8a00-14094272ece9 Ming-Hsiu Tsai null gvfz2UB5THiKABQJQnLs6Q
See code: src/commands/whoami.ts
MIT
See CHANGELOG.md for a list of changes and version history.