digraph root { graph [_draw_="c 9 -#fffffe00 C 7 -#f8f8f2 P 4 0 0 0 1150 1519.5 1150 1519.5 0 ", applyCss=true, arrowsize=0.6, bb="0,0,1519.5,1150", bgcolor="#f8f8f2", charset="UTF-8", clusterize=true, color="#282a36", fontcolor="#44475a", fontname=Agave, intention=semi, margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, rankdir=BT, shape=box, splines=spline, style=rounded, truecolor=true, xdotversion=1.7 ]; node [arrowsize=0.6, bgcolor="#f8f8f2", color="#282a36", fontcolor="#44475a", fontname=Agave, label="\N", margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, shape=box, splines=true, style=rounded, truecolor=true ]; edge [arrowsize=0.6, bgcolor="#f8f8f2", color="#282a36", fontcolor="#44475a", fontname=Agave, fontsize=6.8, margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, shape=box, splines=true, style=rounded, truecolor=true ]; subgraph G_cc_0 { graph [applyCss=true, arrowsize=0.6, bb="", bgcolor="#f8f8f2", charset="UTF-8", clusterize=true, color="#282a36", fontcolor="#44475a", fontname=Agave, intention=semi, margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, rankdir=BT, shape=box, splines=spline, style=rounded, truecolor=true ]; node [arrowsize=0.6, bgcolor="#f8f8f2", color="#282a36", fillcolor="", fontcolor="#44475a", fontname=Agave, fontsize="", height="", href="", label="\N", margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, pos="", shape=box, splines=true, style=rounded, truecolor=true, width="" ]; edge [arrowhead="", arrowsize=0.6, bgcolor="#f8f8f2", color="#282a36", fontcolor="#44475a", fontname=Agave, fontsize=6.8, href="", margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, pos="", reverse="", shape=box, splines=true, style=rounded, tooltip="", truecolor=true, type="" ]; technology [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#7ef7ee P 4 763.5 686.5 380.5 686.5 380.5 178.5 763.5 178.5 ", _ldraw_="F 19 5 -Agave c 7 -#44475a t 1 T 382 671.3 -1 98 10 -technology F 19 5 -Agave c 7 -#44475a t 0 T 382 647.3 -1 283 32 -• aspect \ of technology choice F 19 5 -Agave c 7 -#44475a T 382 626.3 -1 322 36 -• what can easilly run on linode? F 19 5 -Agave c 7 -#\ 44475a T 382 605.3 -1 381 42 -• what software is used/needed at this F 19 5 -Agave c 7 -#44475a T 543 584.3 -1 59 6 -stage? \ F 19 5 -Agave c 7 -#44475a T 382 563.3 -1 79 11 -• duckdb F 19 5 -Agave c 7 -#44475a T 382 542.3 -1 88 12 -• imagick F 19 \ 5 -Agave c 7 -#44475a T 382 521.3 -1 79 11 -• sparql F 19 5 -Agave c 7 -#44475a T 382 500.3 -1 59 9 -• bash F 19 5 -Agave \ c 7 -#44475a T 382 479.3 -1 79 11 -• nodejs F 19 5 -Agave c 7 -#44475a T 465 458.3 -1 235 27 -• databox-libs: ast-lake F 19 \ 5 -Agave c 7 -#44475a T 382 437.3 -1 108 14 -• bc (calc) F 19 5 -Agave c 7 -#44475a T 382 416.3 -1 137 17 -• rsvg-convert \ F 19 5 -Agave c 7 -#44475a T 382 395.3 -1 79 11 -• towebp F 19 5 -Agave c 7 -#44475a T 382 374.3 -1 98 13 -• graphviz F 19 \ 5 -Agave c 7 -#44475a T 382 353.3 -1 108 14 -• inkscape? F 19 5 -Agave c 7 -#44475a T 382 332.3 -1 98 13 -• TODO ... F 19 \ 5 -Agave c 7 -#44475a T 382 311.3 -1 88 12 -• webhook F 19 5 -Agave c 7 -#44475a T 417 290.3 -1 332 39 -• ☐ do we really \ need webhook? VS F 19 5 -Agave c 7 -#44475a T 543.5 269.3 -1 79 8 -rabbitMq F 19 5 -Agave c 7 -#44475a T 382 248.3 -1 98 13 -• rabbitMq \ F 19 5 -Agave c 7 -#44475a T 485 227.3 -1 69 10 -• wget F 19 5 -Agave c 7 -#44475a T 485 206.3 -1 196 20 -https:/rabbitmqadmin \ F 19 5 -Agave c 7 -#44475a T 382 185.3 -1 69 10 -• redis ", fillcolor="#7EF7EE", fontsize=19, height=7.0556, href="#technology", label=<
technology
• aspect of technology choice
• what can easilly run on linode?
• what software is used/needed at this
stage?
• duckdb
• imagick
• sparql
• bash
• nodejs
• databox-libs: ast-lake
• bc (calc)
• rsvg-convert
• towebp
• graphviz
• inkscape?
• TODO ...
• webhook
• ☐ do we really need webhook? VS
rabbitMq
• rabbitMq
• wget
https:/rabbitmqadmin
• redis
>, pos="572,432.5", shape=plain, style=filled, width=5.3194]; technology__web_scrape_ing [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#7ef7ee P 4 356 876.5 0 876.5 0 722.5 356 722.5 ", _ldraw_="F 9.5 5 -Agave c 7 -#44475a t 1 T 1 868.9 -1 64 14 -web scrape-ing F 9.5 5 -Agave c 7 -#44475a t 0 T 1 855.9 -1 10 5 -•  F 9.5 \ 5 -Agave c 7 -#44475a T 143 845.9 -1 91 23 -• https:/crawlee.dev F 9.5 5 -Agave c 7 -#44475a T 1 835.9 -1 91 23 -• amerkurev/\ scrapper F 9.5 5 -Agave c 7 -#44475a T 21 825.9 -1 37 11 -• pecka! F 9.5 5 -Agave c 7 -#44475a T 21 815.9 -1 64 17 -• curl \ -X GET F 9.5 5 -Agave c 7 -#44475a T 21 805.9 -1 235 52 -\"localhost:3000/api/article?url=https:/web_scraping\" F 9.5 5 -Agave c \ 7 -#44475a T 21 795.9 -1 64 17 -• curl -X GET F 9.5 5 -Agave c 7 -#44475a T 21 785.9 -1 334 74 -\"localhost:3000/api/article?\ cache=no&url=https:/povod-pellegriniho-miliono F 9.5 5 -Agave c 7 -#44475a T 1 775.9 -1 82 21 -• https:/seo-tools F 9.5 5 -Agave \ c 7 -#44475a T 120 765.9 -1 136 33 -• https:/seobility-seo-checker F 9.5 5 -Agave c 7 -#44475a T 1 755.9 -1 64 17 -• https:/\ colly F 9.5 5 -Agave c 7 -#44475a T 1 745.9 -1 91 23 -• https:/scrapey-cli F 9.5 5 -Agave c 7 -#44475a T 1 735.9 -1 127 31 -• see \ databox-libs: fetchish F 9.5 5 -Agave c 7 -#44475a T 1 725.9 -1 10 5 -•  ", fillcolor="#7EF7EE", fontsize=9.5, height=2.1389, href="#technology__web_scrape_ing", label=<
web scrape-ing
• 
• https:/crawlee.dev
• amerkurev/scrapper
• pecka!
• curl -X GET
"localhost:3000/api/article?url=https:/web_scraping"
• curl -X GET
"localhost:3000/api/article?cache=no&url=https:/povod-pellegriniho-miliono
• https:/seo-tools
• https:/seobility-seo-checker
• https:/colly
• https:/scrapey-cli
• see databox-libs: fetchish
• 
>, pos="178,799.5", shape=plain, style=filled, width=4.9444]; technology -> technology__web_scrape_ing [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 380.48 610.92 341.15 647.36 301.52 684.07 267.88 715.24 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 260.35 722.21 264.63 712.11 264.02 718.81 267.69 715.42 267.69 \ 715.42 267.69 715.42 264.02 718.81 270.75 718.72 260.35 722.21 ", arrowhead=open, arrowsize=1.0, href="#technology👉 technology__web_scrape_ing", pos="e,260.35,722.21 380.48,610.92 341.15,647.36 301.52,684.07 267.88,715.24", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; technology__redis____ [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#7ef7ee P 4 532 846.5 374 846.5 374 752.5 532 752.5 ", _ldraw_="F 9.5 5 -Agave c 7 -#44475a t 1 T 375 838.9 -1 41 9 -redis + ? F 9.5 5 -Agave c 7 -#44475a t 0 T 375 825.9 -1 86 22 -• https:/\ RediSearch F 9.5 5 -Agave c 7 -#44475a T 375 815.9 -1 104 26 -• https:/docs.keydb.dev F 9.5 5 -Agave c 7 -#44475a T 375 805.9 \ -1 122 30 -• https:/www.dragonflydb.io F 9.5 5 -Agave c 7 -#44475a T 375 795.9 -1 131 32 -• https:/awesome-redis-module F \ 9.5 5 -Agave c 7 -#44475a T 375 785.9 -1 109 27 -• see duck.ai_redis*.mdd F 9.5 5 -Agave c 7 -#44475a T 375 775.9 -1 77 20 -• ORM \ for Redis: F 9.5 5 -Agave c 7 -#44475a T 375 765.9 -1 118 26 -https:/redisom-for-node-js F 9.5 5 -Agave c 7 -#44475a T 395 755.9 \ -1 136 33 -• https:/gnuprolog-redisclient ", fillcolor="#7EF7EE", fontsize=9.5, height=1.3056, href="#technology__redis____", label=<
redis + ?
• https:/RediSearch
• https:/docs.keydb.dev
• https:/www.dragonflydb.io
• https:/awesome-redis-module
• see duck.ai_redis*.mdd
• ORM for Redis:
https:/redisom-for-node-js
• https:/gnuprolog-redisclient
>, pos="453,799.5", shape=plain, style=filled, width=2.1944]; technology -> technology__redis____ [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 489.51 686.51 482.82 707.03 476.59 726.16 471.23 742.58 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 468.01 752.45 466.83 741.55 469.56 747.7 471.11 742.94 471.11 742.94 \ 471.11 742.94 469.56 747.7 475.39 744.34 468.01 752.45 ", arrowhead=open, arrowsize=1.0, href="#technology👉 technology__redis____", pos="e,468.01,752.45 489.51,686.51 482.82,707.03 476.59,726.16 471.23,742.58", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; technology__rabbit_mq [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#7ef7ee P 4 593.5 816.5 550.5 816.5 550.5 782.5 593.5 782.5 ", _ldraw_="F 9.5 5 -Agave c 7 -#44475a t 1 T 552 808.9 -1 41 9 -rabbit-mq F 9.5 5 -Agave c 7 -#44475a t 0 T 552 795.9 -1 37 11 -• suoper \ F 9.5 5 -Agave c 7 -#44475a T 552 785.9 -1 10 5 -•  ", fillcolor="#7EF7EE", fontsize=9.5, height=0.47222, href="#technology__rabbit_mq", label=<
rabbit-mq
• suoper
• 
>, pos="572,799.5", shape=plain, style=filled, width=0.59722]; technology -> technology__rabbit_mq [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 572 686.51 572 721.12 572 751.74 572 772.18 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 572 782.44 567.5 772.44 572 777.44 572 772.44 572 772.44 572 772.44 \ 572 777.44 576.5 772.44 572 782.44 ", arrowhead=open, arrowsize=1.0, href="#technology👉 technology__rabbit_mq", pos="e,572,782.44 572,686.51 572,721.12 572,751.74 572,772.18", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; technology__LLM [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#7ef7ee P 4 740.5 826.5 611.5 826.5 611.5 772.5 740.5 772.5 ", _ldraw_="F 9.5 5 -Agave c 7 -#44475a t 1 T 613 818.9 -1 14 3 -LLM F 9.5 5 -Agave c 7 -#44475a t 0 T 613 805.9 -1 86 22 -• https:/www.jan.ai \ F 9.5 5 -Agave c 7 -#44475a T 613 795.9 -1 86 22 -• https:/localai.io F 9.5 5 -Agave c 7 -#44475a T 613 785.9 -1 109 27 -• see \ llm-tagger... shit F 9.5 5 -Agave c 7 -#44475a T 613 775.9 -1 127 31 -• https:/watch?v=0XLRZavOjSs ", fillcolor="#7EF7EE", fontsize=9.5, height=0.75, href="#technology__LLM", label=<
LLM
• https:/www.jan.ai
• https:/localai.io
• see llm-tagger... shit
• https:/watch?v=0XLRZavOjSs
>, pos="676,799.5", shape=plain, style=filled, width=1.7917]; technology -> technology__LLM [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 644.09 686.51 652.5 716.04 660.09 742.66 665.75 762.53 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 668.53 772.28 661.46 763.9 667.16 767.47 665.79 762.66 665.79 762.66 \ 665.79 762.66 667.16 767.47 670.12 761.43 668.53 772.28 ", arrowhead=open, arrowsize=1.0, href="#technology👉 technology__LLM", pos="e,668.53,772.28 644.09,686.51 652.5,716.04 660.09,742.66 665.75,762.53", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; technology__collabora_for_markdown [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#ffffff P 4 1093.5 826.5 758.5 826.5 758.5 772.5 1093.5 772.5 ", _ldraw_="F 9.5 5 -Agave c 7 -#44475a t 1 T 760 818.9 -1 100 22 -collabora for markdown F 9.5 5 -Agave c 7 -#44475a t 0 T 760 806.9 -1 10 \ 5 -•  F 9.5 14 -Overpass Heavy c 7 -#44475a T 770 806.9 -1 125 22 -Etherpad⸨Etherpad⸩ F 9.5 5 -Agave c 7 -#44475a T 760 796.9 \ -1 10 5 -•  F 9.5 14 -Overpass Heavy c 7 -#44475a T 770 796.9 -1 323 57 -GitHub - docmost/docmost:⸨GitHub - docmost/docmost: \ ⸩ F 9.5 5 -Agave c 7 -#44475a T 760 785.9 -1 163 43 -• 【Outline – Team knowledge base & F 9.5 5 -Agave c 7 -#44475a T \ 832 775.9 -1 19 4 -wiki ", fillcolor="#FFFFFF", fontsize=9.5, height=0.75, href="#technology__collabora_for_markdown", label=<
collabora for markdown
• Etherpad⸨Etherpad⸩
• GitHub - docmost/docmost:⸨GitHub - docmost/docmost: ⸩
• 【Outline – Team knowledge base &
wiki
>, pos="926,799.5", shape=plain, style=filled, width=4.6528]; technology -> technology__collabora_for_markdown [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 763.51 630.96 814.03 683.05 862.97 733.51 893.7 765.2 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 900.73 772.45 890.54 768.4 897.25 768.86 893.77 765.27 893.77 765.27 \ 893.77 765.27 897.25 768.86 897 762.14 900.73 772.45 ", arrowhead=open, arrowsize=1.0, href="#technology👉 technology__collabora_for_markdown", pos="e,900.73,772.45 763.51,630.96 814.03,683.05 862.97,733.51 893.7,765.2", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; technology__collabora_for_markdown___technology__hedgedoc [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#ffffff P 4 1038 1038 814 1038 814 913 1038 913 ", _ldraw_="F 4.75 5 -Agave c 7 -#44475a t 1 T 815 1033.7 -1 19 8 -hedgedoc F 4.75 5 -Agave c 7 -#44475a t 0 T 815 1026.7 -1 5 5 -•  F 4.75 \ 14 -Overpass Heavy c 7 -#44475a T 820 1026.7 -1 98 22 -HedgeDoc⸨HedgeDoc⸩ F 4.75 5 -Agave c 7 -#44475a T 815 1021.7 -1 5 5 -•  \ F 4.75 14 -Overpass Heavy c 7 -#44475a T 820 1021.7 -1 98 22 -HedgeDoc⸨HedgeDoc⸩ F 4.75 5 -Agave c 7 -#44475a T 815 1016.7 -1 \ 12 8 -• !!! F 4.75 14 -Overpass Heavy c 7 -#44475a T 827 1016.7 -1 98 22 -HedgeDoc⸨HedgeDoc⸩ F 4.75 5 -Agave c 7 -#44475a \ T 815 1010.7 -1 84 40 -• HedgeDoc = flat key-value store of F 4.75 5 -Agave c 7 -#44475a T 836.5 1005.7 -1 41 18 -Markdown documents \ F 4.75 5 -Agave c 7 -#44475a T 909 1000.7 -1 55 27 -• its DB can be hijacked F 4.75 5 -Agave c 7 -#44475a T 815 996.7 -1 14 9 \ -• api: F 4.75 14 -Overpass Heavy c 7 -#44475a T 829 996.7 -1 208 58 -%5BHedgeDoc%5D(https://doc⸨%5BHedgeDoc%5D(https://doc⸩ \ F 4.75 5 -Agave c 7 -#44475a T 815 990.7 -1 21 12 -• prompt: F 4.75 5 -Agave c 7 -#ff79c6 T 815 979.95 -1 73 33 - Collaborative \ Markdown editors F 4.75 5 -Agave c 7 -#ff79c6 T 815 975.2 -1 94 36 -(closest to Collabora use case) ⭐ F 4.75 5 -Agave c 7 -#\ ff79c6 T 815 970.45 -1 88 39 -HedgeDoc Real-time collaboration (like F 4.75 5 -Agave c 7 -#ff79c6 T 815 965.7 -1 84 37 -Google \ Docs) Native Markdown editing F 4.75 5 -Agave c 7 -#ff79c6 T 815 960.95 -1 88 39 -TOC, headings, anchors all first-class F 4.75 \ 5 -Agave c 7 -#ff79c6 T 815 956.2 -1 88 39 -Easy self-host (Docker) ### collabora F 4.75 5 -Agave c 7 -#ff79c6 T 815 951.45 -1 \ 46 20 -for markdown - !!! F 4.75 5 -Agave c 7 -#ff79c6 T 815 946.7 -1 93 43 -【HedgeDoc】(https:/docs.hedgedoc.org) - F 4.75 \ 5 -Agave c 7 -#ff79c6 T 815 941.95 -1 19 9 -prompt:  F 4.75 5 -Agave c 7 -#44475a T 815 934.7 -1 64 31 -• how to embed in a \ website? F 4.75 5 -Agave c 7 -#44475a T 815 929.7 -1 97 46 -• Use polling + incremental APIs (standard F 4.75 5 -Agave c 7 -#\ 44475a T 853 924.7 -1 21 9 -approach) F 4.75 5 -Agave c 7 -#44475a T 901 919.7 -1 70 34 -• see hedgedoc-to-files.js and F 4.75 \ 5 -Agave c 7 -#44475a T 911 914.7 -1 50 22 -hedgedoc-from-files.js ", fillcolor="#FFFFFF", fontsize=4.75, height=1.7361, href="#technology__collabora_for_markdown___technology__hedgedoc", label=<
hedgedoc
• HedgeDoc⸨HedgeDoc⸩
• HedgeDoc⸨HedgeDoc⸩
• !!!HedgeDoc⸨HedgeDoc⸩
• HedgeDoc = flat key-value store of
Markdown documents
• its DB can be hijacked
• api:%5BHedgeDoc%5D(https://doc⸨%5BHedgeDoc%5D(https://doc⸩
• prompt:

 Collaborative Markdown editors
(closest to Collabora use case) ⭐
HedgeDoc Real-time collaboration (like
Google Docs) Native Markdown editing
TOC, headings, anchors all first-class
Easy self-host (Docker) ### collabora
for markdown - !!!
【HedgeDoc】(https:/docs.hedgedoc.org) -
prompt: 

• how to embed in a website?
• Use polling + incremental APIs (standard
approach)
• see hedgedoc-to-files.js and
hedgedoc-from-files.js
>, pos="926,975.5", shape=plain, style=filled, width=3.1111]; technology__collabora_for_markdown -> technology__collabora_for_markdown___technology__hedgedoc [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 926 826.85 926 846.94 926 875.61 926 902.31 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 926 912.43 921.5 902.43 926 907.43 926 902.43 926 902.43 926 902.43 \ 926 907.43 930.5 902.43 926 912.43 ", arrowhead=open, arrowsize=1.0, href="#technology__collabora_for_markdown👉 technology__collabora_for_markdown___technology__hedgedoc", pos="e,926,912.43 926,826.85 926,846.94 926,875.61 926,902.31", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav_ [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#ffffff P 4 958 1103.5 894 1103.5 894 1073.5 958 1073.5 ", _ldraw_="F 2.38 5 -Agave c 7 -#44475a t 1 T 895 1101.6 -1 28 18 -collabora ast-nav? F 2.38 5 -Agave c 7 -#44475a t 0 T 895 1099.22 -1 58 \ 38 -Collabora Online WOPI lacks an API to F 2.38 5 -Agave c 7 -#44475a T 895 1096.85 -1 61 40 -move the cursor directly to headings \ or F 2.38 5 -Agave c 7 -#44475a T 895 1094.47 -1 62 41 -TOC entries. The practical workaround is F 2.38 5 -Agave c 7 -#44475a \ T 895 1092.1 -1 61 40 -using the postMessage search command to F 2.38 5 -Agave c 7 -#44475a T 895 1089.72 -1 61 40 -locate heading \ text and jump there. For F 2.38 5 -Agave c 7 -#44475a T 895 1087.35 -1 50 33 -reliable positioning, preprocess F 2.38 5 -Agave \ c 7 -#44475a T 895 1084.97 -1 61 40 -documents to insert unique bookmarks or F 2.38 5 -Agave c 7 -#44475a T 895 1082.6 -1 61 40 \ -hidden markers at headings, then search F 2.38 5 -Agave c 7 -#44475a T 895 1080.22 -1 50 33 -for those identifiers to achieve \ F 2.38 5 -Agave c 7 -#44475a T 895 1077.85 -1 62 41 -precise, deterministic cursor navigation F 2.38 5 -Agave c 7 -#44475a T 910.5 \ 1075.47 -1 31 20 -within the document. ", fillcolor="#FFFFFF", fontsize=2.375, height=0.41667, href="#technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav_", label=<
collabora ast-nav?
Collabora Online WOPI lacks an API to
move the cursor directly to headings or
TOC entries. The practical workaround is
using the postMessage search command to
locate heading text and jump there. For
reliable positioning, preprocess
documents to insert unique bookmarks or
hidden markers at headings, then search
for those identifiers to achieve
precise, deterministic cursor navigation
within the document.
>, pos="926,1088.5", shape=plain, style=filled, width=0.88889]; technology__collabora_for_markdown___technology__hedgedoc -> technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav_ [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 926 1037.6 926 1046.5 926 1055.3 926 1062.9 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 926 1073.1 921.5 1063.1 926 1068.1 926 1063.1 926 1063.1 926 1063.1 \ 926 1068.1 930.5 1063.1 926 1073.1 ", arrowhead=open, arrowsize=1.0, href="#technology__collabora_for_markdown___technology__hedgedoc👉 technology__collabora_for_markdown___technology__hedgedoc___technology__\ collabora_for_markdown___technology__collabora_ast_nav_", pos="e,926,1073.1 926,1037.6 926,1046.5 926,1055.3 926,1062.9", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; "technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav____\ technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__Option_2__Search___\ jump" [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#ffffff P 4 942 1150 910 1150 910 1139 942 1139 ", _ldraw_="F 1.19 5 -Agave c 7 -#44475a t 1 T 911 1148.55 -1 18 25 -Option 2: Search → jump F 1.19 5 -Agave c 7 -#ff79c6 t 0 T 911 1146.17 \ -1 28 38 - iframe.contentWindow.postMessage( F 1.19 5 -Agave c 7 -#ff79c6 T 911 1144.99 -1 25 32 -JSON.stringify({ MessageId: \ F 1.19 5 -Agave c 7 -#ff79c6 T 911 1143.8 -1 26 34 -\"Search\", SearchItem: { F 1.19 5 -Agave c 7 -#ff79c6 T 911 1142.61 \ -1 26 34 -SearchString: \"My Heading\", F 1.19 5 -Agave c 7 -#ff79c6 T 911 1141.42 -1 30 39 -Backward: false, Command: \ 0, F 1.19 5 -Agave c 7 -#ff79c6 T 911 1140.24 -1 15 20 -}, }), \"*\", );  ", fillcolor="#FFFFFF", fontsize=1.1875, height=0.15278, href="#technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav____\ technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__Option_2__Search___\ jump", label=<
Option 2: Search → jump

 iframe.contentWindow.postMessage(
JSON.stringify({ MessageId:
"Search", SearchItem: {
SearchString: "My Heading",
Backward: false, Command: 0,
}, }), "*", ); 

>, pos="926,1144.5", shape=plain, style=filled, width=0.44444]; technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav_ -> "technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav____\ technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__Option_2__Search___\ jump" [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 926 1103.5 926 1111.4 926 1121.2 926 1129.2 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 926 1139.5 921.5 1129.5 926 1134.5 926 1129.5 926 1129.5 926 1129.5 \ 926 1134.5 930.5 1129.5 926 1139.5 ", arrowhead=open, arrowsize=1.0, href="#technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_nav_\ 👉 technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__collabora_ast_\ nav____technology__collabora_for_markdown___technology__hedgedoc___technology__collabora_for_markdown___technology__Option_2__Search___\ jump", pos="e,926,1139.5 926,1103.5 926,1111.4 926,1121.2 926,1129.2", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; } subgraph G_cc_1 { graph [applyCss=true, arrowsize=0.6, bb="", bgcolor="#f8f8f2", charset="UTF-8", clusterize=true, color="#282a36", fontcolor="#44475a", fontname=Agave, intention=semi, margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, rankdir=BT, shape=box, splines=spline, style=rounded, truecolor=true ]; node [arrowsize=0.6, bgcolor="#f8f8f2", color="#282a36", fillcolor="", fontcolor="#44475a", fontname=Agave, fontsize="", height="", href="", label="\N", margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, pos="", shape=box, splines=true, style=rounded, truecolor=true, width="" ]; edge [arrowhead="", arrowsize=0.6, bgcolor="#f8f8f2", color="#282a36", fontcolor="#44475a", fontname=Agave, fontsize=6.8, href="", margin=4.3, overlap=voronoi, pencolor="#282a36", penwidth=0.8, pos="", reverse="", shape=box, splines=true, style=rounded, tooltip="", truecolor=true, type="" ]; database [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#6effc0 P 4 1519.5 67 1136.5 67 1136.5 0 1519.5 0 ", _ldraw_="F 19 5 -Agave c 7 -#44475a t 1 T 1138 51.3 -1 79 8 -database F 19 5 -Agave c 7 -#44475a t 0 T 1138 27.3 -1 381 42 -• sqlite alternative: \ https:/turso.tech F 19 5 -Agave c 7 -#44475a T 1138 6.3 -1 196 23 -• todo sqlite-tricks ", fillcolor="#6EFFC0", fontsize=19, height=0.93056, href="#database", label=<
database
• sqlite alternative: https:/turso.tech
• todo sqlite-tricks
>, pos="1328,33.5", shape=plain, style=filled, width=5.3194]; database__sqlite_tricks [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#6effc0 P 4 1406 177.5 1250 177.5 1250 103.5 1406 103.5 ", _ldraw_="F 9.5 5 -Agave c 7 -#44475a t 1 T 1251 169.9 -1 59 13 -sqlite tricks F 9.5 5 -Agave c 7 -#44475a t 0 T 1251 156.9 -1 95 24 -• https:/\ absurder-sql F 9.5 5 -Agave c 7 -#44475a T 1251 146.9 -1 73 19 -• https:/SQLPage F 9.5 5 -Agave c 7 -#44475a T 1251 136.9 -1 \ 154 37 -• https:/sqlime?tab=readme-ov-file F 9.5 5 -Agave c 7 -#44475a T 1251 126.9 -1 68 18 -• https:/sqlean F 9.5 5 -Agave \ c 7 -#44475a T 1251 116.9 -1 95 24 -• https:/datasette.io F 9.5 5 -Agave c 7 -#44475a T 1275 106.9 -1 127 31 -• https:/watch?\ v=wc8FBhQtdsA ", fillcolor="#6EFFC0", fontsize=9.5, height=1.0278, href="#database__sqlite_tricks", label=<
sqlite tricks
• https:/absurder-sql
• https:/SQLPage
• https:/sqlime?tab=readme-ov-file
• https:/sqlean
• https:/datasette.io
• https:/watch?v=wc8FBhQtdsA
>, pos="1328,140.5", shape=plain, style=filled, width=2.1667]; database -> database__sqlite_tricks [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 1327.5 67.78 1327.5 75.78 1327.5 84.49 1327.5 92.99 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 1327.5 103.21 1323 93.21 1327.5 98.21 1327.5 93.21 1327.5 93.21 \ 1327.5 93.21 1327.5 98.21 1332 93.21 1327.5 103.21 ", arrowhead=open, arrowsize=1.0, href="#database👉 database__sqlite_tricks", pos="e,1327.5,103.21 1327.5,67.778 1327.5,75.778 1327.5,84.489 1327.5,92.994", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; database__sqlite_tricks___database__JSON_to_sqlite [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#6effc0 P 4 1335.5 275 1176.5 275 1176.5 226 1335.5 226 ", _ldraw_="F 4.75 5 -Agave c 7 -#44475a t 1 T 1178 270.7 -1 32 14 -JSON to sqlite F 4.75 5 -Agave c 7 -#44475a t 0 T 1178 262.7 -1 25 14 -• datasette \ F 4.75 5 -Agave c 7 -#44475a T 1198 257.7 -1 64 31 -• https:/watch?v=wc8FBhQtdsA F 4.75 5 -Agave c 7 -#44475a T 1198 252.7 -1 \ 70 34 -• sqlite-utils (Simon Willison) F 4.75 5 -Agave c 7 -#44475a T 1238 247.7 -1 97 46 -• sqlite-utils insert my.db rows \ data.json F 4.75 5 -Agave c 7 -#44475a T 1256 242.7 -1 61 27 ---table mytable --flatten 1 F 4.75 5 -Agave c 7 -#44475a T 1178 237.7 \ -1 91 43 -• LanceDB + DuckDB + SQLite is a killer F 4.75 5 -Agave c 7 -#44475a T 1217.5 232.7 -1 12 5 -combo F 4.75 5 -Agave \ c 7 -#44475a T 1248 227.7 -1 37 19 -• https:/lancedb ", fillcolor="#6EFFC0", fontsize=4.75, height=0.68056, href="#database__sqlite_tricks___database__JSON_to_sqlite", label=<
JSON to sqlite
• datasette
• https:/watch?v=wc8FBhQtdsA
• sqlite-utils (Simon Willison)
• sqlite-utils insert my.db rows data.json
--table mytable --flatten 1
• LanceDB + DuckDB + SQLite is a killer
combo
• https:/lancedb
>, pos="1256,250.5", shape=plain, style=filled, width=2.2083]; database__sqlite_tricks -> database__sqlite_tricks___database__JSON_to_sqlite [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 1303.3 177.76 1294.8 190.49 1285.4 204.68 1277.1 217.07 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 1271.3 225.72 1273.13 214.91 1274.08 221.57 1276.87 217.41 1276.87 \ 217.41 1276.87 217.41 1274.08 221.57 1280.61 219.92 1271.3 225.72 ", arrowhead=open, arrowsize=1.0, href="#database__sqlite_tricks👉 database__sqlite_tricks___database__JSON_to_sqlite", pos="e,1271.3,225.72 1303.3,177.76 1294.8,190.49 1285.4,204.68 1277.1,217.07", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; database__sqlite_tricks___database__admins [_draw_="S 17 -setlinewidth(0.8) c 9 -#fffffe00 C 7 -#6effc0 P 4 1448.5 287.5 1353.5 287.5 1353.5 213.5 1448.5 213.5 ", _ldraw_="F 4.75 5 -Agave c 7 -#44475a t 1 T 1355 283.7 -1 14 6 -admins F 4.75 5 -Agave c 7 -#44475a t 0 T 1355 275.7 -1 79 38 -• https:/\ couch-photon?utm_source=ch F 4.75 5 -Agave c 7 -#44475a T 1355 270.7 -1 30 16 -• SQLite Web? F 4.75 5 -Agave c 7 -#44475a T 1355 \ 265.7 -1 39 20 -• https:/download F 4.75 5 -Agave c 7 -#44475a T 1355 260.7 -1 70 34 -• https:/www.beekeeperstudio.io F 4.75 \ 5 -Agave c 7 -#44475a T 1355 255.7 -1 34 18 -• https:/litefs F 4.75 5 -Agave c 7 -#44475a T 1355 250.7 -1 46 23 -• ./pocketbase \ serve F 4.75 5 -Agave c 7 -#44475a T 1355 245.7 -1 28 15 -• npx dbgate F 4.75 5 -Agave c 7 -#ff79c6 T 1355 234.95 -1 59 27 - docker \ run -d \ --name F 4.75 5 -Agave c 7 -#ff79c6 T 1355 230.2 -1 93 41 -dbgate-instance \ --restart always \ F 4.75 5 -Agave \ c 7 -#ff79c6 T 1355 225.45 -1 46 20 --p 3000:3000 \ -v F 4.75 5 -Agave c 7 -#ff79c6 T 1355 220.7 -1 64 28 -/home/stefan/data:/\ data \ F 4.75 5 -Agave c 7 -#ff79c6 T 1355 215.95 -1 32 15 -dbgate/dbgate  ", fillcolor="#6EFFC0", fontsize=4.75, height=1.0278, href="#database__sqlite_tricks___database__admins", label=<
admins
• https:/couch-photon?utm_source=ch
• SQLite Web?
• https:/download
• https:/www.beekeeperstudio.io
• https:/litefs
• ./pocketbase serve
• npx dbgate

 docker run -d \ --name
dbgate-instance \ --restart always \
-p 3000:3000 \ -v
/home/stefan/data:/data \
dbgate/dbgate 

>, pos="1401,250.5", shape=plain, style=filled, width=1.3194]; database__sqlite_tricks -> database__sqlite_tricks___database__admins [_draw_="S 17 -setlinewidth(0.8) S 6 -dashed c 7 -#282a36 B 4 1352 177.76 1357.8 186.4 1364.2 195.72 1370.2 204.69 ", _hdraw_="S 17 -setlinewidth(0.8) S 5 -solid c 7 -#282a36 C 7 -#282a36 P 9 1375.9 213.15 1366.58 207.37 1373.11 209 1370.31 204.86 1370.31 \ 204.86 1370.31 204.86 1373.11 209 1374.04 202.34 1375.9 213.15 ", arrowhead=open, arrowsize=1.0, href="#database__sqlite_tricks👉 database__sqlite_tricks___database__admins", pos="e,1375.9,213.15 1352,177.76 1357.8,186.4 1364.2,195.72 1370.2,204.69", reverse=false, style=dashed, tooltip="-> isAnInputTo", type=isAnInputTo]; } }