Skip to content
Write HTTP requests in Org mode and replay them at will using cURL
Emacs Lisp
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
test style fix Feb 4, 2020
.gitignore fix trivial issues (#1) Feb 11, 2020
Cask fix trivial issues (#1) Feb 11, 2020
LICENSE package linting Jan 29, 2020 adding hacky curl-to-org Sep 30, 2019
walkman.el fix trivial issues (#1) Feb 11, 2020
walkman.gif update readme Jan 29, 2020


Write HTTP requests in Org mode and replay them at will using cURL

walkman demo gif


  • write HTTP requests as org mode "walkman entries"
  • execute walkman entries via curl
  • export walkman entries to a curl command
  • import curl command to walkman entries (beta)
  • support lisp variable or functions in a walkman entry
  • execute a series of lisp callbacks, passing the status code, headers, and response body


Load up the walkman.el file.


By default, after calling M-x walkman-mode, these bindings will be added to org-mode:

C-c C-RETURN   to execute the entry at point
C-c C-'        for the walkman menu
C-c C-' c      to copy the entry at point as a curl command
C-c C-' i      to import a curl command and insert as walkman entry

How to write a walkman entry

See the file for example of walkman entries.

The general structure is

* Request Title
  - Header1: value
  - Header2: value
      "body": "in any mode/format"
  1. First Callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (message "status %s, headers %s, body %s" status headers body))
  2. Second Callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (message "Second callback"))

Note that only the HTTP action and URL are required, everything else is up to you.

Simple GET request

* Simple GET request

Simple POST request with JSON body

* Simple POST request
  - Accept: application/json
  - Content-Type: application/json
  #+begin_src json
      "data": {
        "title": "Hello",
        "hello": "world"

Request with lisp variable

Define my-http-status with

(setq my-http-status "400")

and run

* Embedded lisp variable

Request with callbacks

* Request with callbacks
  #+begin_src json
      "some": "body"
  1. First callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (message "status %s, headers %s, body %s" status headers body))
  2. Second callback
     #+begin_src emacs-lisp
       (lambda (status headers body)
         (pp (assoc 'url (json-read-from-string body))))


Always keep the headers

If you don't want to bother with the -v flag to keep the headers in the response buffer, you can do

(setq walkman-keep-headers t)

Custom key bindings

By default, running walkman-mode will run

(define-key org-mode-map (kbd "C-c C-'") #'walkman-transient)
(define-key org-mode-map (kbd "C-c <C-return>") #'walkman-at-point)

If you want to setup your own binding, don't run walkman-mode and instead bind

  • walkman-at-point for quick execution under the cursor
  • walkman-transient for the transient-based interactive menu


  • insert response in org doc?
  • execute all requests sequentially
  • unit tests
  • option to run async
  • multiple backends

Similar projects

You can’t perform that action at this time.