{"id":20936104,"url":"https://github.com/flow-storm/cider-storm","last_synced_at":"2026-01-28T04:03:07.890Z","repository":{"id":175554497,"uuid":"654104889","full_name":"flow-storm/cider-storm","owner":"flow-storm","description":"An emacs cider front-end for the FlowStorm debugger with support for Clojure and ClojureScript.","archived":false,"fork":false,"pushed_at":"2024-11-12T14:36:36.000Z","size":50,"stargazers_count":88,"open_issues_count":2,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-19T19:59:54.745Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flow-storm.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["jpmonettas"]}},"created_at":"2023-06-15T11:53:59.000Z","updated_at":"2024-12-25T01:17:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"fcb4204d-7674-4eb7-87f0-45f913ee0c52","html_url":"https://github.com/flow-storm/cider-storm","commit_stats":null,"previous_names":["jpmonettas/cider-storm"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flow-storm%2Fcider-storm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flow-storm%2Fcider-storm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flow-storm%2Fcider-storm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flow-storm%2Fcider-storm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flow-storm","download_url":"https://codeload.github.com/flow-storm/cider-storm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243330259,"owners_count":20274037,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-18T22:17:54.543Z","updated_at":"2026-01-28T04:03:07.884Z","avatar_url":"https://github.com/flow-storm.png","language":"Emacs Lisp","funding_links":["https://github.com/sponsors/jpmonettas"],"categories":[],"sub_categories":[],"readme":"# Cider Storm\n\nCider Storm is an Emacs Cider front-end for the [FlowStorm debugger](https://github.com/flow-storm/flow-storm-debugger) with support for Clojure and ClojureScript.\n\nIt brings the time-travel code stepping capabilities of FlowStorm to Emacs, providing an interface\nsimilar to the Cider debugger one.\n\nIt also contains a bunch of utilities functions for interacting with FlowStorm.\n\nCider Storm isn't trying to re-implement the entire FlowStorm UI, but the most used functionality.\nYou can always start the full FlowStorm UI if you need the extra tools.\n\n\nhttps://github.com/flow-storm/cider-storm/assets/786299/4328309c-9a60-47e1-ae1b-878884f19aa3\n\n\n## Pre-requisites\n\n- cider \u003e= `1.14.0`\n- flow-storm \u003e= `4.0.1`\n- when using ClojureStorm \u003e= `1.11.1-7` or \u003e= `1.12.0-alpha4_1`\n\n## Installation\n\nFirst you need to setup FlowStorm as you normally do for your environment. Check https://flow-storm.github.io/flow-storm-debugger/user_guide.html#_quick_start\n\nApart from that you need two things. First clone this repo (no package yet) and load it into emacs, like :\n\n```elisp\n(add-to-list 'load-path \"/home/user/cider-storm\")\n(require 'cider-storm)\n```\n\nOr, if you are running Emacs \u003e= `30.1` and prefer configuring your packages with `use-package` :\n```elisp\n(use-package cider-storm\n  :vc (:url \"https://github.com/flow-storm/cider-storm\" :rev :newest))\n```\n\nSecond is to add the flow-storm nrepl middleware to your list of middlewares automatically loaded by your `cider-jack-in` commands.\n\nThere are multiple ways of accomplishing this depending on your use case, like :\n\n```elisp\n(add-to-list 'cider-jack-in-nrepl-middlewares \"flow-storm.nrepl.middleware/wrap-flow-storm\")\n```\n\nthen the middleware will be added every time you do a `cider-jack-in`. The problem with this approach is that\nif you jack-in into a project that doesn't contain FlowStorm on the classpath it will fail.\n\nAnother approach is to setup the middlewares like this in your `.dir-locals.el` at the root of each project.\n\n```elisp\n((clojure-mode . ((cider-jack-in-nrepl-middlewares . (\"flow-storm.nrepl.middleware/wrap-flow-storm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t  (\"refactor-nrepl.middleware/wrap-refactor\" :predicate cljr--inject-middleware-p)\n\t\t\t\t\t\t\t\t\t\t\t\t\t  \"cider.nrepl/cider-middleware\")))))\n```\n\nThere are other ways probably depending on what you are using and how you are starting your nrepl servers, but the important thing\nis that the middleware should be loaded in the nrepl server for Cider Storm to work.\n\n### Setup bindings\n\nIf you want to add bindings to your Cider map, you can also add :\n\n```elisp\n(define-key cider-mode-map (kbd \"C-c C-f\") 'cider-storm-map)\n```\n\nwhich will add all the commands below under `C-c C-f`.\n\n## List of commands cider-storm provides (assumes C-c C-f prefix)\n\n|Command name                         |Binding|Description                                                                                        |\n|-------------------------------------|-------|---------------------------------------------------------------------------------------------------|\n|cider-storm-storm-start-gui          | s     | Starts the FlowStrom GUI                                                                          |\n|cider-storm-storm-stop-gui           | x     | Stops the FlowStrom GUI                                                                           |\n|cider-storm-instrument-current-ns    | n     | Instrument the current NS (vanilla only)                                                          |\n|cider-storm-instrument-last-form     | f     | Instrument the form before the cursor (vanilla only)                                              |\n|cider-storm-instrument-current-defn  | c     | Instrument the form surrounding the cursor (vanilla only)                                         |\n|cider-storm-eval-and-debug-last-form | e     | Eval and debug last form (will use #rtrace on vanilla)                                            |\n|cider-storm-tap-last-result          | t     | Taps the last evaluated expression (*1)                                                           |\n|cider-storm-show-current-var-doc     | D     | Shows the FlowStorm doc for the current var                                                       |\n|cider-storm-rtrace-last-sexp         | r     | #rtrace the last s-expression                                                                     |\n|cider-storm-debug-current-fn         | d     | Moves the stepper to the first recording for the current fn (cursor needs to be on the fn symbol) |\n|cider-storm-debug-fn                 | j     | Select a recorded fn and make the stepper jump into it                                            |\n|cider-storm-clear-recordings         | l     | Clear all recordings (same as Ctrl-L on the FlowStorm UI)                                         |\n\n## Stepper Usage\n\n### With ClojureStorm (recommended for Clojure)\n\nIf you are using FlowStorm with ClojureStorm, then you don't need to do anything special, you don't even need the FlowStorm UI running.\n\nTo use the debugger:\n\n1. Toggle FlowStorm recording on: `M-x cider-storm-toggle-recording`.\n\n2. Evaluate some expressions.\n\n3. Run: `M-x cider-storm-debug-fn`.\n\nThis should retrieve a list of all the expressions that FlowStorm has recordings for. When you choose one, it should jump to the first\nrecorded step for that function, and provide a similar interface to the Cider debugger.\n\nOnce the debugging mode is enable you can type `h` to show the keybindings.\n\n### With vanilla FlowStorm\n\nCurrently you need to have the FlowStorm UI running (`flow-storm.api/local-connect`) to use it with vanilla FlowStorm.\n\nAfter you have your recordings you can explore them following the same instructions described in `With ClojureStorm` .\n\n### With ClojureScript\n\nYou need to make sure you have the middleware `flow-storm.nrepl.middleware/wrap-flow-storm` injected on your repl nrepl server.\n\nFor example, if you are using it with shadow-cljs you will have to add the middleware to your shadow-cljs nrepl server config like this :\n\n```clojure\n{...\n :nrepl {:port 7123\n\t :middleware [flow-storm.nrepl.middleware/wrap-flow-storm]}\n :builds {:my-app {...}}}\n```\n\nHaving done that, you can then `cider-jack-in-cljs` \u003e `shadow` \u003e `:my-app` which should start shadow and give you a cljs repl.\n\nOnce you are sure you can eval expressions from your buffers, then try `cider-storm-debug-fn` which should let you choose between\nall recorded functions in the same way as FlowStorm UI `Quick jump`\n\nCurrently we need to have the FlowStorm debugger UI connected to use it with ClojureScript.\n\nAfter you have your recordings you can explore them following the same instructions described in [With ClojureStorm](#with-clojurestorm-recommended-for-clojure).\n\n## Tips\n\n### Clear recordings\n\nSame as when using the FlowStorm UI, it is convenient to clear the recordings frequently so you don't get confused with previous recordings.\nYou can do this from emacs by `M-x cider-storm-clear-recordings`\n\n### Value inspection\n\nBy hitting `i` Cider Storm will inspect the value using the Cider inspector. If you want to inspect values using other inspectors (like the FlowStorm one)\nyou can hit `t` to tap the value.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflow-storm%2Fcider-storm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflow-storm%2Fcider-storm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflow-storm%2Fcider-storm/lists"}