Roam Research Docs · Developer documentation
clojure.core
clojure.pprint
cljs.pprint
roam.datascript.reactive for re-rendering reagent components, or roam.katex for rendering katex reagent components
roam.datascript
q
[query & inputs]
:in clause is compulsory (for eg :in $ input1 input2)
(ns developer-doc.rd.q
(:require
[roam.datascript :as rd]))
(defn main []
[:div
(str
(rd/q
'[:find ?parent-page-title .
:in $ ?block-uid
:where
[?block :block/uid ?block-uid]
[?block :block/page ?page]
[?page :node/title ?parent-page-title]]
"TpIGtsnL7"))])}}
(ns developer-doc.rd.q
(:require
[roam.datascript :as rd]))
(defn main []
[:div
(str
(rd/q
'[:find ?parent-page-title .
:in $ ?block-uid
:where
[?block :block/uid ?block-uid]
[?block :block/page ?page]
[?page :node/title ?parent-page-title]]
"TpIGtsnL7"))])
pull
[pattern eid]
(ns developer-doc.rd.pull
(:require
[roam.datascript :as rd]))
(defn main []
[:div
(str
(rd/pull
'[:block/uid
:node/title
{:block/children [:block/uid :block/string]}]
'[:block/uid "11-20-2021"]))])}}
(ns developer-doc.rd.pull
(:require
[roam.datascript :as rd]))
(defn main []
[:div
(str
(rd/pull
'[:block/uid
:node/title
{:block/children [:block/uid :block/string]}]
'[:block/uid "11-20-2021"]))])
entity
db automatically
7161
'[:block/uid "11-27-2021"]
(ns developer-doc.rd.entity
(:require
[roam.datascript :as rd]))
(defn main []
(let [page-ent (rd/entity '[:block/uid "11-27-2021"])
title (:node/title page-ent)
children (->> (:block/children page-ent)
(sort :block/order))]
[:div
[:h1 title]
[:ul
(for [child children]
[:li (:block/string child)])]]))}}
(ns developer-doc.rd.entity
(:require
[roam.datascript :as rd]))
(defn main []
(let [page-ent (rd/entity '[:block/uid "11-27-2021"])
title (:node/title page-ent)
children (->> (:block/children page-ent)
(sort :block/order))]
[:div
[:h1 title]
[:ul
(for [child children]
[:li (:block/string child)])]]))
datoms
[index & args]
:eavt
:aevt
:avet
:eavt and :aevt contain all datoms.
:avet only contains datoms for references, :db/unique and :db/index attributes.
:node/title
:window/id
:user/email
:db/unique properties, so you may be better off doing a direct entity lookup
(ns developer-doc.rd.datoms
(:require
[roam.datascript :as rd]))
(defn main []
(let [page-ents (map (comp rd/entity :e) (rd/datoms :aevt :page/permissions))]
[:div
[:h2 "Shared pages"]
[:ol
(for [page-ent page-ents]
[:li (str (:node/title page-ent) ": " (:page/permissions page-ent))])]]))}}
(ns developer-doc.rd.datoms
(:require
[roam.datascript :as rd]))
(defn main []
(let [page-ents (map (comp rd/entity :e) (rd/datoms :aevt :page/permissions))]
[:div
[:h2 "Shared pages"]
[:ol
(for [page-ent page-ents]
[:li (str (:node/title page-ent) ": " (:page/permissions page-ent))])]]))
roam.datascript.reactive
q
pull
f-entity
(apply f (rd/entity eid) args)
[f eid & args]
(ns developer-doc.rdr.f-entity.2
(:require
[roam.datascript.reactive :as rdr]))
(defn main []
(let [block-uid "pXh1FJfIX"
block-str-atom (rdr/f-entity
:block/string ;;f
[:block/uid block-uid] ;;eid
)]
[:div
[:h3
(str "Reactive display of block with :block/uid: " block-uid)]
[:ul
[:li @block-str-atom]]]))}}
(ns developer-doc.rdr.f-entity.2
(:require
[roam.datascript.reactive :as rdr]))
(defn main []
(let [block-uid "pXh1FJfIX"
block-str-atom (rdr/f-entity
:block/string ;;f
[:block/uid block-uid] ;;eid
)]
[:div
[:h3
(str "Reactive display of block with :block/uid: " block-uid)]
[:ul
[:li @block-str-atom]]]))
(ns developer-doc.rdr.f-entity.2
(:require
[roam.datascript.reactive :as rdr]))
(defn get-backref-page-string [ent]
(mapv (juxt (comp :node/title :block/page) :block/string) (:block/_refs ent)))
(defn main []
(let [block-uid "11-26-2021"
backrefs-atom (rdr/f-entity
get-backref-page-string ;;f
[:block/uid block-uid] ;;eid
)]
[:div
[:h3
(str "Reactive display of back refs of block with :block/uid: " block-uid)]
[:ul
(for [[page-title block-string] @backrefs-atom]
[:li (str page-title ": " block-string)])
]]))}}
(ns developer-doc.rdr.f-entity.2
(:require
[roam.datascript.reactive :as rdr]))
(defn get-backref-page-string [ent]
(mapv (juxt (comp :node/title :block/page) :block/string) (:block/_refs ent)))
(defn main []
(let [block-uid "11-26-2021"
backrefs-atom (rdr/f-entity
get-backref-page-string ;;f
[:block/uid block-uid] ;;eid
)]
[:div
[:h3
(str "Reactive display of back refs of block with :block/uid: " block-uid)]
[:ul
(for [[page-title block-string] @backrefs-atom]
[:li (str page-title ": " block-string)])
]]))
datoms
roam.util
parse these are equivalent to those in roamAlphaAPI.util
generate-uid
(roam.util/generate-uid)
page-title->date
(roam.util/page-title->date "August 1st, 2022")
date->page-title
(roam.util/date->page-title (new js/Date))
date->page-uid
(roam.util/date->page-uid (new js/Date))
parse
[s]
(ns dev-docs.parse-example
(:require [roam.util :refer [parse]]))
(defn main []
[parse "**apple** __banana__ [[test-parse]]"])
{{[[roam/render]]: ((uUxqZ4Bwb))}}
(ns dev-docs.parse-example
(:require [roam.util :refer [parse]]))
(defn main []
[parse "**apple** __banana__ [[test-parse]]"])}}
roam.ui.main-window
open-page
(main-window/open-page {:page {:uid "ljs1l3kj4"}})
open-block
(main-window/open-block {:page {:uid "ljs1l3kj4"}})
open-daily-notes
(main-window/open-daily-notes)
get-open-page-or-block-uid
(main-window/get-open-page-or-block-uid)
focus-first-block
(main-window/focus-first-block)
roam.ui.left-sidebar
open
(left-sidebar/open)
close
(left-sidebar/close)
roam.ui.right-sidebar
open
(right-sidebar/open)
close
(right-sidebar/close)
get-windows
(right-sidebar/get-windows)
add-window
(right-sidebar/add-window
{:window {:type "block" :block-uid "1fasdfef"}})
remove-window
(right-sidebar/remove-window
{:window {:type "block" :block-uid "1fasdfef"}})
expand-window
(right-sidebar/expand-window
{:window {:type "block" :block-uid "1fasdfef"}})
collapse-window
(right-sidebar/collapse-window
{:window {:type "block" :block-uid "1fasdfef"}})
pin-window
(right-sidebar/pin-window
{:window {:type "block" :block-uid "1fasdfef"}})
unpin-window
(right-sidebar/unpin-window
{:window {:type "block" :block-uid "1fasdfef"}})
roam.ui.filters
add-global-filter
(filters/add-global-filter
{:title "test"
:type "includes"})
remove-global-filter
(filters/remove-global-filter
{:title "test"
:type "includes"})
get-global-filters
(filters/get-global-filters)
get-page-filters
(filters/get-page-filters
{:page {:title "test"}})
get-page-linked-refs-filter
(filters/get-pagelinked-refs-filters
{:page {:title "test"}})
get-sidebar-window-filters
(filters/get-sidebar-window-filters
{:window {:block-uid "sdl3kefj"
:type "outline"}})
set-page-filters
(filters/set-page-filters
{:page {:title "test"}
:filters {:includes ["March 11th, 2022"]}})
;; clears filters
(filters/set-page-filters
{:page {:title "test"}
:filters {}})
set-page-linked-refs-filters
(filters/set-page-linked-refs-filters
{:page {:title "test"}
:filters {:includes ["March 11th, 2022"]}})
;; clears filters
(filters/set-page-linked-refs-filters
{:page {:title "test"}
:filters {}})
set-sidebar-window-filters
(filters/set-sidebar-window-filters
{:window {:block-uid "sdl3kefj"
:type "outline"}
:filters {:includes ["March 11th, 2022"]}})
;; clears filters
(filters/set-sidebar-window-filters
{:window {:block-uid "sdl3kefj"
:type "outline"}
:filters {}})
roam.ui.block-context-menu
add-command
(block-context-menu/add-command
{:label "test"
:callback (fn []
(prn "hey!"))})
remove-command
(block-context-menu/remove-command
{:label "test"})
roam.ui.individual-multiselect
get-selected-uids
(get-selected-uids)
roam.ui.ms-context-menu
add-command
(add-command
{:label "test"
:callback (fn []
(prn "hey!"))})
remove-command
(remove-command
{:label "test"})
roam.ui.command-palette
add-command
(add-command
{:label "test"
:callback (fn []
(prn "hello world!"))})
remove-command
(remove-command
{:label "test"})
roam.graph
name #def
type #def
"hosted" or "offline"
is-encrypted? #def
roam.platform
is-desktop? #def
is-mobile-app? #def
is-mobile? #def
max-width: 450px
is-ios? #def
is-pc? #def
is-touch-device #def
roam.katex
roam.user
upsert
roam.block
window
.roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": "01-21-2021",
"order": 0},
"block":
{"string": "test"}}) to use in clojure
(ns dev-doc.roam.block.2
(:require [roam.block :as block]))
(defn main []
[:button
{:on-click
(fn [] (-> (block/create {:location {:parent-uid "06-14-2022"
:order 0}
:block {:string "test"}})
(.then #(js/console.log "done"))
(.catch #(js/console.log "failed" %))))}
"Click me to create the block"])}}
(ns dev-doc.roam.block.2
(:require [roam.block :as block]))
(defn main []
[:button
{:on-click
(fn [] (-> (block/create {:location {:parent-uid "06-14-2022"
:order 0}
:block {:string "test"}})
(.then #(js/console.log "done"))
(.catch #(js/console.log "failed" %))))}
"Click me to create the block"])
create
(roam.block/create
{:location {:parent-uid "asdlkjfe"
:order "first"}
:block {:string "hello world"}})
move
(roam.block/move
{:location {:parent-uid "asdlkjfe"
:order "last"}
:block {:uid "f8cXfDIRn"}})
update
(roam.block/update
{:block {:uid "f8cXfDIRn"
:string "foo"}})
delete
(roam.block/delete
{:block {:uid "f8cXfDIRn}})
reorder-blocks
(reorder-blocks
{:location {:parent-uid "hisjslk"}
:blocks ["QCE0cNNNL" "IATKcVmWE" "nC22orMO4"]})
roam.page
create
(roam.page/create
{:page {:title "test me!"}})
update
(roam.page/update
{:page {:uid "asdflele"
:title "test me!"}})
delete
(roam.page/delete
{:page {:uid "asdflele"}})
reagent/reagent {:mvn/version "1.1.0"}
reagent.core
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "reagent.core"}}
reagent.dom
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "reagent.dom"}}
datascript.core
roam.datascript or roam.datascript.reactive
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "datascript.core"}}
instaparse.core
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "instaparse.core"}}
instaparse.core readme example
(ns developer-documentation.test-instaparse.1
(:require
[reagent.core :as r]
[roam.block :as block]
[blueprintjs.core :as bp-core]
[cljs.pprint :refer [pprint]]
[instaparse.core :as insta]))
(def as-and-bs
(insta/parser
"S = AB*
AB = A B
A = 'a'+
B = 'b'+"))
(defn main [{:keys [block-uid]}]
[:button
{:on-click
#(pprint (as-and-bs "aaaaabbbaaaabb"))} "Click me!"])
{{[[roam/render]]: ((6DXyUOHhH))}}
(ns developer-documentation.test-instaparse.1
(:require
[reagent.core :as r]
[roam.block :as block]
[blueprintjs.core :as bp-core]
[cljs.pprint :refer [pprint]]
[instaparse.core :as insta]))
(def as-and-bs
(insta/parser
"S = AB*
AB = A B
A = 'a'+
B = 'b'+"))
(defn main [{:keys [block-uid]}]
[:button
{:on-click
#(pprint (as-and-bs "aaaaabbbaaaabb"))} "Click me!"])}} (check console after clicking)
blueprintjs.core
blueprintjs.core
(ns dev-docs.test-blueprint.1
(:require
[reagent.core :as r]
[roam.block :as block]
[blueprintjs.core :as bp-core]))
(defonce bp3-button (r/adapt-react-class bp-core/Button))
(defn main [{:keys [block-uid]}]
[bp3-button
{:large true
:disabled true
:icon "history"
:on-click
#(block/update
{:block {:uid block-uid
:string "Hello world!"}})}
"Click me!"])
{{[[roam/render]]: ((O1iyYWZsW))}}
(ns dev-docs.test-blueprint.1
(:require
[reagent.core :as r]
[roam.block :as block]
[blueprintjs.core :as bp-core]))
(defonce bp3-button (r/adapt-react-class bp-core/Button))
(defn main [{:keys [block-uid]}]
[bp3-button
{:large true
:disabled true
:icon "history"
:on-click
#(block/update
{:block {:uid block-uid
:string "Hello world!"}})}
"Click me!"])}}
funcool/promesa {:mvn/version "6.0.0"}
promesa.core
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "promesa.core"}}
promesa.protocols
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "promesa.protocols"}}
applied-science.js-interop
applied-science/js-interop {:mvn/version "0.3.3"}
(ns ns-vars-lister
(:require [reagent.core]))
(defn main [{:keys [block-uid]} ns-name]
(let [ns-symbol (symbol ns-name)]
[:div [:div
[:h3 "public vars of ns: " (pr-str ns-symbol)]
[:div (map
(fn [n] [:div (pr-str n)])
(->> (ns-publics ns-symbol)
(seq)
(sort)))]]])) "applied-science.js-interop"}}
markdown version · view in Roam Research · exported 2026-07-03