{"id":13491291,"url":"https://github.com/djblue/portal","last_synced_at":"2025-05-13T20:11:44.015Z","repository":{"id":37690335,"uuid":"268949665","full_name":"djblue/portal","owner":"djblue","description":"A clojure tool to navigate through your data.","archived":false,"fork":false,"pushed_at":"2025-05-07T21:07:43.000Z","size":6614,"stargazers_count":952,"open_issues_count":10,"forks_count":83,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-05-07T21:19:02.511Z","etag":null,"topics":["babashka","clojure","clojurescript","datafy","devtools","inspector","nav","portal","rebl"],"latest_commit_sha":null,"homepage":"https://djblue.github.io/portal/","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/djblue.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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,"zenodo":null},"funding":{"github":["djblue"]}},"created_at":"2020-06-03T01:43:48.000Z","updated_at":"2025-05-07T20:59:01.000Z","dependencies_parsed_at":"2023-12-17T00:24:18.559Z","dependency_job_id":"f0d4546c-f093-410d-8b28-4498dd849f30","html_url":"https://github.com/djblue/portal","commit_stats":{"total_commits":1508,"total_committers":39,"mean_commits":"38.666666666666664","dds":"0.051724137931034475","last_synced_commit":"bf98fa0c4b11a5e27e0ece19480147c6da86b2ad"},"previous_names":[],"tags_count":107,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djblue%2Fportal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djblue%2Fportal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djblue%2Fportal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djblue%2Fportal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/djblue","download_url":"https://codeload.github.com/djblue/portal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254020613,"owners_count":22000754,"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":["babashka","clojure","clojurescript","datafy","devtools","inspector","nav","portal","rebl"],"created_at":"2024-07-31T19:00:55.289Z","updated_at":"2025-05-13T20:11:44.008Z","avatar_url":"https://github.com/djblue.png","language":"Clojure","funding_links":["https://github.com/sponsors/djblue"],"categories":["Clojure","Visualization"],"sub_categories":[],"readme":"# portal\n\nA clojure tool to navigate through your data.\n\n[![cljdoc][cljdoc-badge]][cljdoc]\n[![Clojars Project][clojars-badge]][clojars]\n[![VS Code Extension][vscode-badge]][vscode]\n[![Version][intellij-badge]][intellij]\n[![Get help on Slack][clojurians-badge]][clojurians]\n\n\n\n\u003ca target=\"_blank\" href=\"https://djblue.github.io/portal/?content-type=application/edn\u0026content-url=https://raw.githubusercontent.com/djblue/portal/gh-pages/docs.edn\"\u003e\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/1986211/196015562-238cf450-6467-451c-a985-04c7a9b49dba.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://user-images.githubusercontent.com/1986211/196015567-74ba9153-341a-4fd7-be47-2c26f0c88c2e.png\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/1986211/196015562-238cf450-6467-451c-a985-04c7a9b49dba.png\"\u003e\n\u003c/picture\u003e\n\u003c/a\u003e\n\nThe portal UI can be used to inspect values of various shapes and sizes. The UX\nwill probably evolve over time and user feedback is welcome!\n\nFor an in-depth explanation of the UI, you can jump to the [UI][ui-concepts]\ndocs.\n\n## Demo\n\nTo get an overview of the Portal UI and workflow, checkout the following\nrecording of a [live demo][live-demo] I gave for [London\nClojurians][london-clojurians].\n\n\u003ca target=\"_blank\" href=\"https://www.youtube.com/watch?v=Tj-iyDo3bq0\"\u003e\n\u003cimg src=\"https://img.youtube.com/vi/Tj-iyDo3bq0/hqdefault.jpg\" alt=\"London Clojurians Demo\" /\u003e\n\u003c/a\u003e\n\nMore video presentations on Portal can be found [here](./doc/videos.md).\n\n## Usage\n\nTo start a repl with portal, run the **clojure \u003e= 1.10.0** cli with:\n\n```bash\nclj -Sdeps '{:deps {djblue/portal {:mvn/version \"0.59.1\"}}}'\n```\n\nor for a **web** **clojurescript \u003e= 1.10.773** repl, do:\n\n```bash\nclj -Sdeps '{:deps {djblue/portal {:mvn/version \"0.59.1\"}\n                    org.clojure/clojurescript {:mvn/version \"1.10.844\"}}}' \\\n    -m cljs.main\n```\n\nor for a **node** **clojurescript \u003e= 1.10.773** repl, do:\n\n```bash\nclj -Sdeps '{:deps {djblue/portal {:mvn/version \"0.59.1\"}\n                    org.clojure/clojurescript {:mvn/version \"1.10.844\"}}}' \\\n    -m cljs.main -re node\n```\n\nor for a **babashka \u003e=0.2.4** repl, do:\n\n```bash\nbb -Sdeps '{:deps {djblue/portal {:mvn/version \"0.59.1\"}}}'\n```\n\nor for a lein `project.clj`, add:\n\n```clojure\n{:profiles {:dev {:dependencies [[djblue/portal \"0.59.1\"]]}}}\n```\n\nor as a global profile, add to `~/.lein/profiles.clj`:\n\n```clojure\n{:portal {:dependencies [[djblue/portal \"0.59.1\"]]}}\n```\n\n\u003e [!NOTE]\n\u003e If you add Portal to a profile other than `:dev`, when starting a REPL\n\u003e start it with `with-profiles +portal`. The `+` is important.\n\nor for [**Clojure CLR**][clojure-clr], checkout this [example project](./examples/clr),\n\nor for examples on how to integrate portal into an existing project, look\nthrough the [examples](./examples) directory.\n\n\u003e [!NOTE]\n\u003e Portal can also be used without a runtime via the [standalone version](./doc/guides/standalone.md).\n\n### API\n\nTry the [portal api](./src/portal/api.cljc) with the following commands:\n\n```clojure\n;; for node and jvm\n(require '[portal.api :as p])\n\n;; for web\n;; NOTE: you might need to enable popups for the portal ui to work in the\n;; browser.\n(require '[portal.web :as p])\n\n\n(def p (p/open)) ; Open a new inspector\n\n;; or with an extension installed, do:\n(def p (p/open {:launcher :vs-code}))  ; jvm / node only\n(def p (p/open {:launcher :intellij})) ; jvm / node only\n\n(add-tap #'p/submit) ; Add portal as a tap\u003e target\n\n(tap\u003e :hello) ; Start tapping out values\n\n(p/clear) ; Clear all values\n\n(tap\u003e :world) ; Tap out more values\n\n(prn @p) ; bring selected value back into repl\n\n(remove-tap #'p/submit) ; Remove portal from tap\u003e targetset\n\n(p/close) ; Close the inspector when done\n\n(p/docs) ; View docs locally via Portal - jvm / node only\n```\n\n\u003e [!WARNING] \n\u003e Portal will keep objects from being garbage collected until they are cleared\n\u003e from the UI.\n\n### Options\n\nOptions for `portal.api/open`:\n\n| Option          | Description                                 | Default             | Spec                                                                        |\n|-----------------|---------------------------------------------|---------------------|-----------------------------------------------------------------------------|\n| `:window-title` | Custom window title for UI                  | \"portal\"            | string?                                                                     |\n| `:theme`        | Default theme for UI                        | :portal.colors/nord |                                                                             |\n| `:value`        | Root value of UI                            | (atom (list))       |                                                                             |\n| `:app`          | Launch UI in Chrome app window              | true                | boolean?                                                                    |\n| `:launcher`     | Launch UI using this editor                 |                     | #{[:vs-code][vs-code-docs] [:intellij][intellij-docs] [:emacs][emacs-docs]} |\n| `:editor`       | Enable editor commands, but use separate UI |                     | #{[:vs-code][vs-code-docs] [:intellij][intellij-docs] [:emacs][emacs-docs]} |\n| `:port`         | Http server port for UI                     | 0                   | int?                                                                        |\n| `:host`         | Http server host for UI                     | \"localhost\"         | string?                                                                     |\n\n\nFor more documentation, take a look through the [docs][docs].\n\n[cljdoc]: https://cljdoc.org/d/djblue/portal/CURRENT\n[cljdoc-badge]: https://cljdoc.org/badge/djblue/portal\n[clojars]: https://clojars.org/djblue/portal\n[clojars-badge]: https://img.shields.io/clojars/v/djblue/portal?color=380036\n[vscode]: https://marketplace.visualstudio.com/items?itemName=djblue.portal\n[vscode-badge]: https://img.shields.io/visual-studio-marketplace/v/djblue.portal?label=vs-code\u0026color=007ACC\u0026logo=vs\n[intellij]: https://plugins.jetbrains.com/plugin/18467-portal\n[intellij-badge]: https://img.shields.io/jetbrains/plugin/v/18467?label=intellij\n\n[clojurians]: https://clojurians.slack.com/channels/portal\n[clojurians-badge]: https://img.shields.io/badge/slack-clojurians%20%23portal-4A154B?color=63B132\n\n[live-demo]: https://www.youtube.com/watch?v=Tj-iyDo3bq0\n[london-clojurians]: https://www.youtube.com/channel/UC-pYfofTyvVDMwM4ttfFGqw\n[docs]: https://cljdoc.org/d/djblue/portal/0.59.1/doc/ui-concepts\n[ui-concepts]: https://cljdoc.org/d/djblue/portal/0.59.1/doc/ui-concepts\n\n[vs-code-docs]: ./doc/editors/vs-code.md\n[intellij-docs]: ./doc/editors/intellij.md\n[emacs-docs]: ./doc/editors/emacs.md#xwidget-webkit-embed\n\n[clojure-clr]: https://github.com/clojure/clojure-clr\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjblue%2Fportal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdjblue%2Fportal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjblue%2Fportal/lists"}