A tiny CLI to perform common operations on HedgeDoc (the largest open-source fork of HackMD).
For more background, see the initial discussion on the hackmd codimd repo.
There is an alternative, TypeScript-based CodiMD CLI for hackmdio/codimd maintained by the HackMD team here: https://github.com/hackmdio/codimd-cli.
(it may or may not be compatible with the hedgedoc/hedgedoc server)
Dependencies:
- A HedgeDoc server running somewhere
curl(install viaapt install curlorbrew install curlon Mac)wget(install viaapt install wgetorbrew install wgeton Mac)jq(install viaapt install jqorbrew install jqon Mac)
git clone https://github.com/hedgedoc/cli
cd cli/bin
# optionally symlink the hedgedoc script somewhere into your $PATH
ln -s $PWD/hedgedoc /usr/local/bin/hedgedoc
# set HEDGEDOC_SERVER environment variable to your server's URL
# it defaults to http://127.0.0.1:3000
export HEDGEDOC_SERVER='https://hedgedoc.example.com'
# Test by creating a new note
hedgedoc login --email
hedgedoc import test.md$ hedgedoc import <input_path> [note_id] # takes a local path to a text file, and an optional note id for the new note
qhmNmwmxSmK1H2oJmkKBQQ # returns <note_id> on successYou can open the new note on the server by going to $HEDGEDOC_SERVER/<note_id>.
$ hedgedoc publish qhmNmwmxSmK1H2oJmkKBQQ # takes a <note_id>
S1ok9no3f # returns public note idYou can open the published note on the server by going to $HEDGEDOC_SERVER/s/<public_note_id>.
$ hedgedoc export --pdf qhmNmwmxSmK1H2oJmkKBQQ # takes a <note_id>, outputs to <note_id>.pdf by default
$ hedgedoc export --md qhmNmwmxSmK1H2oJmkKBQQ my_note.md # or you can specify an output path explicitly
$ hedgedoc export --html qhmNmwmxSmK1H2oJmkKBQQ
$ hedgedoc export --slides qhmNmwmxSmK1H2oJmkKBQQ my_slides.zip# optionally add the HEDGEDOC_COOKIES_FILE environment variable to specify
# where cookies will be stored. It defaults to ~/.config/hedgedoc-cli/key.conf
$ export HEDGEDOC_COOKIES_FILE=~/.config/hedgedoc-cli/key.conf$ hedgedoc login --email email@example.net p4sW0rD # takes an email and password as optional args
$ hedgedoc login --email # or pass them via stdin prompt instead$ hedgedoc login --ldap username p4sW0rD # takes a username and a password as optional args
$ hedgedoc login --ldap # or pass them via stdin prompt instead$ hedgedoc profile
You are logged in to a HedgeDoc server.
HEDGEDOC_SERVER=https://hedgedoc.example.com
HEDGEDOC_COOKIES_FILE=/Users/someuser/.config/hedgedoc/key.conf
USER_NAME=alice
USER_ID=abc93e9b-bf57-490f-a4c6-0d7a842b7cd4
USER_PHOTO=https://cdn.libravatar.org/avatar/ba8b1ebe25440cd38748639eebdc8eaf?s=96
$ hedgedoc history
ID Title
fCbvG5pdSYOLobNN1SDUhg Example-note-title
...
$ hedgedoc logoutYour hedgedoc auth session cookie is written to $HEDGEDOC_COOKIES_FILE (which defaults to ~/.config/hedgedoc/key.conf).
You may need to log in again if:
- your session expired
- the hedgedoc server was restarted (which force-expires all sessions as a side-effect)
- the is
$HEDGEDOC_COOKIES_FILEdeleted, moved, or becomes unreadable byhedgedoc-cli
These server endpoints are used by this project and can be unstable and undocumented, but may be of use if you're developing your own projects that need API access to HedgeDoc.
https://<hedgedoc_server>/loginhttps://<hedgedoc_server>/logouthttps://<hedgedoc_server>/mehttps://<hedgedoc_server>/history(requires auth)https://<hedgedoc_server>/newhttps://<hedgedoc_server>/new/<note_id>https://<hedgedoc_server>/<note_id>/publishhttps://<hedgedoc_server>/<note_id>/downloadhttps://<hedgedoc_server>/<note_id>/pdfhttps://<hedgedoc_server>/<note_id>/slide
We'd love a PR for any one of these commands!
hedgedoc edit <note_id> < new_content.mdhedgedoc inviteuser <email_to_invite>hedgedoc chmod <permissions> <note_id>hedgedoc chown <user> <note_id>hedgedoc delete <note_id>hedgedoc list --alllist all notes on the server by id: titlehedgedoc list <user_email>list notes for a given user by id: titlehedgedoc search <query>find a note ids matching a given query
If you want to build something with this CLI, here are some ideas that the community has requested:
Import/Export:
- Tests for HedgeDoc: write some easy tests with the hedgedoc-cli
- Saving to local filesystem: this is easy with
./hedgedoc export - Export to PDF:
./hedgedoc export --pdf <note_id> <output.pdf>bam. - Arbitrary file upload: we should support this with
./hedgedoc import <file.extension> - Export slides as PDF & hackmdio/codimd#545: we should add this to
./hedgedoc export --slidesonce it's ready - Show all files in database:
./hedgedoc list --all - Import/export file in GitHub repository:
wget <file from github> > file.md; ./hedgedoc import file.md - API to download HTML: works already
./hedgedoc export --html <note_id> note.html - CLI for adding new note: can be documented in the README with
hackmdcommand - "Takeout" feature: ability to download all user data with
./hedgedoc export
Permission management:
- Support permission of invitee only:
./hedgedoc inviteuser --permissions r <user_email>could work by firstchmodandchowning the note, then sending an email invite to that note - Find the notes by the owner:
./hedgedoc list <user_email>works as a rudimentary API to do this form the command line - Add user administration: setup a script that creates all the users & their notes from .md files on disk,
chown&chmods them to their proper permissions, then invites all the users to join. Would be possible to run this on a timer to do regularly as well.
Sync backends:
- Import/Export with Github: trigger
./hedgedoc import|exportscript via timer or webhook upon github file modification - Import/Export with Evernote: same deal as github/dropbox sync, write a script with import/export
- Support for ownCloud: same deal as github/dropbox sync, write a script with import/export
- Support auto sync with dropbox: write a script that does a full
importandexportor merge in whatever direction desired - Support auto sync with Google Drive: write a script that does a full
importandexportor merge in whatever direction desired