collabmd 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +453 -0
  3. package/bin/collabmd.js +241 -0
  4. package/docker-compose.yml +43 -0
  5. package/package.json +93 -0
  6. package/public/assets/css/base.css +1 -0
  7. package/public/assets/css/style.css +1 -0
  8. package/public/assets/js/assets/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
  9. package/public/assets/js/assets/Assistant-Medium-DZ25RZU3.woff2 +0 -0
  10. package/public/assets/js/assets/Assistant-Regular-PLF2XOGW.woff2 +0 -0
  11. package/public/assets/js/assets/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
  12. package/public/assets/js/chunks/CodeMirrorEditor-UCMRAMCV-MAKZFDBE.js +12 -0
  13. package/public/assets/js/chunks/apl-C5P5JBDI.js +1 -0
  14. package/public/assets/js/chunks/ar-SA-NXDWD63E-MF6HMEA4.js +8 -0
  15. package/public/assets/js/chunks/architecture-PBZL5I3N-55LDZ5WS.js +1 -0
  16. package/public/assets/js/chunks/architectureDiagram-2XIMDMQ5-2VP562X7.js +36 -0
  17. package/public/assets/js/chunks/asciiarmor-3NCLLELT.js +1 -0
  18. package/public/assets/js/chunks/asn1-KF4WXU3M.js +1 -0
  19. package/public/assets/js/chunks/asterisk-EA3VIN65.js +1 -0
  20. package/public/assets/js/chunks/az-AZ-MXSORGZV-AIGO4TNU.js +1 -0
  21. package/public/assets/js/chunks/bg-BG-O6MV2KSF-X6AVO2AF.js +5 -0
  22. package/public/assets/js/chunks/blockDiagram-WCTKOSBZ-KM56WWDE.js +132 -0
  23. package/public/assets/js/chunks/bn-BD-T2VJNT7N-7OMHRIGC.js +3 -0
  24. package/public/assets/js/chunks/bn-IN-MMW2ORAC-EPKMNKG7.js +3 -0
  25. package/public/assets/js/chunks/brainfuck-A3CTQVFD.js +1 -0
  26. package/public/assets/js/chunks/c4Diagram-IC4MRINW-KX6UEGQZ.js +10 -0
  27. package/public/assets/js/chunks/ca-ES-MKBCGNOG-U44SUUTN.js +8 -0
  28. package/public/assets/js/chunks/chunk-2NTQWLZD.js +25 -0
  29. package/public/assets/js/chunks/chunk-2YRP2AWD.js +1 -0
  30. package/public/assets/js/chunks/chunk-3BUCGSSJ.js +1 -0
  31. package/public/assets/js/chunks/chunk-47L7JGE3.js +1 -0
  32. package/public/assets/js/chunks/chunk-4BCHPULB.js +1 -0
  33. package/public/assets/js/chunks/chunk-4NKM6YFO.js +161 -0
  34. package/public/assets/js/chunks/chunk-4WGMPBK5.js +1 -0
  35. package/public/assets/js/chunks/chunk-55WF6Y2Q.js +1 -0
  36. package/public/assets/js/chunks/chunk-775E65SU.js +1 -0
  37. package/public/assets/js/chunks/chunk-AJRGTECU.js +70 -0
  38. package/public/assets/js/chunks/chunk-B2J3PHGY.js +1 -0
  39. package/public/assets/js/chunks/chunk-B4JKB3BC.js +1 -0
  40. package/public/assets/js/chunks/chunk-BBHPYU2R.js +1 -0
  41. package/public/assets/js/chunks/chunk-CGVY4PKT.js +13 -0
  42. package/public/assets/js/chunks/chunk-CVTRX3TE.js +220 -0
  43. package/public/assets/js/chunks/chunk-DW6KK6VF.js +1 -0
  44. package/public/assets/js/chunks/chunk-E2HMNOQL.js +189 -0
  45. package/public/assets/js/chunks/chunk-EPTJZP5H.js +7 -0
  46. package/public/assets/js/chunks/chunk-G7NUGGE7.js +13 -0
  47. package/public/assets/js/chunks/chunk-GI7LBIBP.js +1 -0
  48. package/public/assets/js/chunks/chunk-GXRL27M7.js +1 -0
  49. package/public/assets/js/chunks/chunk-H6EYDHRW.js +1 -0
  50. package/public/assets/js/chunks/chunk-HOCBCDA5.js +1 -0
  51. package/public/assets/js/chunks/chunk-HS2CUOC6.js +1 -0
  52. package/public/assets/js/chunks/chunk-HUAS4BYI.js +12 -0
  53. package/public/assets/js/chunks/chunk-HVNNEPP5.js +2 -0
  54. package/public/assets/js/chunks/chunk-I2GVZI7W.js +38 -0
  55. package/public/assets/js/chunks/chunk-I6PVWGBN.js +14 -0
  56. package/public/assets/js/chunks/chunk-IR2DOYV4.js +7 -0
  57. package/public/assets/js/chunks/chunk-IZ3V3F2A.js +1 -0
  58. package/public/assets/js/chunks/chunk-KPAQHIOI.js +1 -0
  59. package/public/assets/js/chunks/chunk-M3EW4V74.js +1 -0
  60. package/public/assets/js/chunks/chunk-MK3AFU3C.js +90 -0
  61. package/public/assets/js/chunks/chunk-NM6J3ND7.js +1 -0
  62. package/public/assets/js/chunks/chunk-NO7UPWTU.js +1 -0
  63. package/public/assets/js/chunks/chunk-OG2TNZEU.js +9 -0
  64. package/public/assets/js/chunks/chunk-OHGDMMWM.js +1 -0
  65. package/public/assets/js/chunks/chunk-OOT2HALX.js +1 -0
  66. package/public/assets/js/chunks/chunk-OQLLZFFN.js +1 -0
  67. package/public/assets/js/chunks/chunk-PF6TP4EI.js +1 -0
  68. package/public/assets/js/chunks/chunk-PMOZMECZ.js +85 -0
  69. package/public/assets/js/chunks/chunk-QBGS6DJR.js +1 -0
  70. package/public/assets/js/chunks/chunk-QF3ZQ6UQ.js +1 -0
  71. package/public/assets/js/chunks/chunk-QFXMAUW4.js +1 -0
  72. package/public/assets/js/chunks/chunk-QSTBGTWJ.js +1 -0
  73. package/public/assets/js/chunks/chunk-QYKIT2IH.js +41 -0
  74. package/public/assets/js/chunks/chunk-S75BI2UQ.js +1 -0
  75. package/public/assets/js/chunks/chunk-SKEZZ3H6.js +1 -0
  76. package/public/assets/js/chunks/chunk-SO6QBCB6.js +1 -0
  77. package/public/assets/js/chunks/chunk-SR3U53EQ.js +1 -0
  78. package/public/assets/js/chunks/chunk-TFP6LRYJ.js +53 -0
  79. package/public/assets/js/chunks/chunk-U6APNHAF.js +15 -0
  80. package/public/assets/js/chunks/chunk-VOODXHXA.js +1 -0
  81. package/public/assets/js/chunks/chunk-W7WJUTSA.js +3 -0
  82. package/public/assets/js/chunks/chunk-WNXFO2F2.js +1 -0
  83. package/public/assets/js/chunks/chunk-X6EEYWV4.js +6 -0
  84. package/public/assets/js/chunks/chunk-YVW3ZETS.js +1 -0
  85. package/public/assets/js/chunks/chunk-ZR2QRTBG.js +339 -0
  86. package/public/assets/js/chunks/chunk-ZZJX4LQ2.js +1 -0
  87. package/public/assets/js/chunks/classDiagram-VBA2DB6C-IYW4O2RM.js +1 -0
  88. package/public/assets/js/chunks/classDiagram-v2-RAHNMMFH-DNKVN2WD.js +1 -0
  89. package/public/assets/js/chunks/clike-RTBH33GE.js +1 -0
  90. package/public/assets/js/chunks/clojure-BR2VJ2JI.js +1 -0
  91. package/public/assets/js/chunks/cmake-2HEWVFEE.js +1 -0
  92. package/public/assets/js/chunks/cobol-V6EIK6DN.js +1 -0
  93. package/public/assets/js/chunks/coffeescript-JW3ZOGMD.js +1 -0
  94. package/public/assets/js/chunks/commonlisp-UCWSIHYK.js +1 -0
  95. package/public/assets/js/chunks/cose-bilkent-S5V4N54A-QVYRFFNC.js +1 -0
  96. package/public/assets/js/chunks/crystal-GR4VLC3M.js +1 -0
  97. package/public/assets/js/chunks/cs-CZ-V77HGUP7-OLBAKFG5.js +7 -0
  98. package/public/assets/js/chunks/css-C5DVWGB4.js +1 -0
  99. package/public/assets/js/chunks/cypher-K7FZM5GC.js +1 -0
  100. package/public/assets/js/chunks/d-CF3QNNH5.js +1 -0
  101. package/public/assets/js/chunks/da-DK-I5RFNTM4-QJIG2SEZ.js +2 -0
  102. package/public/assets/js/chunks/dagre-KLK3FWXG-KVNBUDOY.js +4 -0
  103. package/public/assets/js/chunks/de-CH-WLRDEVBV-4MMJDMVD.js +7 -0
  104. package/public/assets/js/chunks/de-DE-DTI4WUSC-ML7C46TT.js +7 -0
  105. package/public/assets/js/chunks/diagram-E7M64L7V-ZP33VRUC.js +24 -0
  106. package/public/assets/js/chunks/diagram-IFDJBPK2-ZG35YWOD.js +43 -0
  107. package/public/assets/js/chunks/diagram-P4PSJMXO-ZGIGM7D2.js +24 -0
  108. package/public/assets/js/chunks/diff-KOMSZU7O.js +1 -0
  109. package/public/assets/js/chunks/dist-7RQKSOUX.js +7 -0
  110. package/public/assets/js/chunks/dist-ARWGZ6MN.js +1 -0
  111. package/public/assets/js/chunks/dist-DPBSGC3Y.js +2 -0
  112. package/public/assets/js/chunks/dist-E36PJE5M.js +1 -0
  113. package/public/assets/js/chunks/dist-E5NM7OBW.js +1 -0
  114. package/public/assets/js/chunks/dist-ERADYPEK.js +1 -0
  115. package/public/assets/js/chunks/dist-F43RIHBZ.js +1 -0
  116. package/public/assets/js/chunks/dist-HAB5NIXI.js +1 -0
  117. package/public/assets/js/chunks/dist-HG23OLRA.js +1 -0
  118. package/public/assets/js/chunks/dist-IEJXBSDJ.js +1 -0
  119. package/public/assets/js/chunks/dist-IQA4KVJK.js +1 -0
  120. package/public/assets/js/chunks/dist-OIQTNVT2.js +3 -0
  121. package/public/assets/js/chunks/dist-PMZJ734S.js +1 -0
  122. package/public/assets/js/chunks/dist-RCQFQRLD.js +1 -0
  123. package/public/assets/js/chunks/dist-RQLC4GVI.js +1 -0
  124. package/public/assets/js/chunks/dist-RSJGLSKC.js +1 -0
  125. package/public/assets/js/chunks/dist-SGNQZVVX.js +1 -0
  126. package/public/assets/js/chunks/dist-VCFTF7Z6.js +1 -0
  127. package/public/assets/js/chunks/dist-VTO23SHH.js +1 -0
  128. package/public/assets/js/chunks/dist-XOODBV4L.js +1 -0
  129. package/public/assets/js/chunks/dist-ZFZNCRZY.js +1 -0
  130. package/public/assets/js/chunks/dockerfile-XCIKYOSI.js +1 -0
  131. package/public/assets/js/chunks/dtd-3XFH7W6Z.js +1 -0
  132. package/public/assets/js/chunks/dylan-3UWPKVOR.js +1 -0
  133. package/public/assets/js/chunks/ebnf-OLHTL3VN.js +1 -0
  134. package/public/assets/js/chunks/ecl-43LZ3ZRM.js +1 -0
  135. package/public/assets/js/chunks/editor-session-IHFTYG5D.js +22 -0
  136. package/public/assets/js/chunks/eiffel-ISPO2UJF.js +1 -0
  137. package/public/assets/js/chunks/el-GR-ZXDJ2OS4-WSCEIO6J.js +7 -0
  138. package/public/assets/js/chunks/elm-CLK576PK.js +1 -0
  139. package/public/assets/js/chunks/en-CTDJDZ6K-IC3QAUOI.js +1 -0
  140. package/public/assets/js/chunks/erDiagram-INFDFZHY-ZMS6H2TH.js +70 -0
  141. package/public/assets/js/chunks/erlang-AVQXQFOT.js +1 -0
  142. package/public/assets/js/chunks/es-ES-DYQHAD43-XGB5X5IM.js +7 -0
  143. package/public/assets/js/chunks/eu-ES-QDSYU5Y3-LA3JTIJ2.js +7 -0
  144. package/public/assets/js/chunks/excalidraw-mermaid-stub-NYXTOJ4H.js +1 -0
  145. package/public/assets/js/chunks/fa-IR-26LZG4PM-PFALMEDX.js +9 -0
  146. package/public/assets/js/chunks/factor-CRTVBD6Q.js +1 -0
  147. package/public/assets/js/chunks/fcl-FX24LKTH.js +1 -0
  148. package/public/assets/js/chunks/fi-FI-6YS4KDE4-ES5MV6P4.js +6 -0
  149. package/public/assets/js/chunks/flowDiagram-PKNHOUZH-QD4L5IE5.js +162 -0
  150. package/public/assets/js/chunks/forth-YKDKCTVS.js +1 -0
  151. package/public/assets/js/chunks/fortran-UJWC6SLU.js +1 -0
  152. package/public/assets/js/chunks/fr-FR-BRLLPTZC-VMFE22YV.js +12 -0
  153. package/public/assets/js/chunks/ganttDiagram-A5KZAMGK-VTMTQESP.js +292 -0
  154. package/public/assets/js/chunks/gas-MYEMWGRE.js +1 -0
  155. package/public/assets/js/chunks/gherkin-JWHAU2YG.js +1 -0
  156. package/public/assets/js/chunks/gitGraph-HDMCJU4V-YPHS74XX.js +1 -0
  157. package/public/assets/js/chunks/gitGraphDiagram-K3NZZRJ6-Z3EZ634T.js +65 -0
  158. package/public/assets/js/chunks/gl-ES-OKUZTLYG-GPT42ZHV.js +6 -0
  159. package/public/assets/js/chunks/groovy-QZIZQIAK.js +1 -0
  160. package/public/assets/js/chunks/haskell-JR3G7YNW.js +1 -0
  161. package/public/assets/js/chunks/haxe-TVLAIYEN.js +1 -0
  162. package/public/assets/js/chunks/he-IL-26MGYIU7-VQ5XQYYY.js +8 -0
  163. package/public/assets/js/chunks/hi-IN-Q4ZOGTP2-2Z766MXA.js +3 -0
  164. package/public/assets/js/chunks/http-YXQRE77G.js +1 -0
  165. package/public/assets/js/chunks/hu-HU-P2OXPSN5-6XDVPGTE.js +3 -0
  166. package/public/assets/js/chunks/id-ID-2EIKXYN6-J5GWSY2S.js +8 -0
  167. package/public/assets/js/chunks/idl-RAQGJ6LJ.js +1 -0
  168. package/public/assets/js/chunks/image-32MOCVDX-JN2EUMQG.js +1 -0
  169. package/public/assets/js/chunks/image-blob-reduce.esm-K5OWL55S.js +13 -0
  170. package/public/assets/js/chunks/info-3K5VOQVL-CXJSPNNP.js +1 -0
  171. package/public/assets/js/chunks/infoDiagram-LFFYTUFH-WQ34MUJA.js +2 -0
  172. package/public/assets/js/chunks/ishikawaDiagram-PHBUUO56-4IARWKJK.js +70 -0
  173. package/public/assets/js/chunks/it-IT-4CFKVXI2-NMBWUWFF.js +12 -0
  174. package/public/assets/js/chunks/ja-JP-MAND2Z4V-GQZYXXOC.js +7 -0
  175. package/public/assets/js/chunks/javascript-NM7KDJUE.js +1 -0
  176. package/public/assets/js/chunks/journeyDiagram-4ABVD52K-FJ4LF4SX.js +139 -0
  177. package/public/assets/js/chunks/julia-LG3BH25B.js +1 -0
  178. package/public/assets/js/chunks/kaa-HQRTCXTJ-7D6PAKDJ.js +1 -0
  179. package/public/assets/js/chunks/kab-KAB-JKIKKTGH-TNKFXNAX.js +4 -0
  180. package/public/assets/js/chunks/kanban-definition-K7BYSVSG-TY4EVYI3.js +89 -0
  181. package/public/assets/js/chunks/katex-5YJCUCFD.js +261 -0
  182. package/public/assets/js/chunks/kk-KZ-HXQ63ZFC-T4HCMWED.js +1 -0
  183. package/public/assets/js/chunks/km-KH-PKL3LSGX-HTLHEJV6.js +7 -0
  184. package/public/assets/js/chunks/ko-KR-KXLREZX3-QMR52QVI.js +5 -0
  185. package/public/assets/js/chunks/ku-TR-MJ4IER3X-K5CNY4UO.js +6 -0
  186. package/public/assets/js/chunks/livescript-4CVWVI4M.js +1 -0
  187. package/public/assets/js/chunks/lt-LT-H6WFQ6FJ-IW25FAGX.js +3 -0
  188. package/public/assets/js/chunks/lua-VWGE7DQ7.js +1 -0
  189. package/public/assets/js/chunks/lv-LV-GOCK6SJW-KTDFW5OH.js +4 -0
  190. package/public/assets/js/chunks/mathematica-D7APQSEU.js +1 -0
  191. package/public/assets/js/chunks/mbox-BN3XQBYX.js +1 -0
  192. package/public/assets/js/chunks/mermaid-runtime-BIFNJ2CT.js +18 -0
  193. package/public/assets/js/chunks/mindmap-definition-YRQLILUH-5B565RNP.js +68 -0
  194. package/public/assets/js/chunks/mirc-565WBI76.js +1 -0
  195. package/public/assets/js/chunks/mllike-VV3KS46B.js +1 -0
  196. package/public/assets/js/chunks/modelica-EGX44FZV.js +1 -0
  197. package/public/assets/js/chunks/mr-IN-IXVLDMEQ-PHM5DT7Q.js +9 -0
  198. package/public/assets/js/chunks/mscgen-GFGTHENT.js +1 -0
  199. package/public/assets/js/chunks/mumps-POZYWSMI.js +1 -0
  200. package/public/assets/js/chunks/my-MM-YG6MYTTD-ZHLCMEVA.js +1 -0
  201. package/public/assets/js/chunks/nb-NO-XGWJISD2-KSDFG6YU.js +8 -0
  202. package/public/assets/js/chunks/nginx-JUBX55EU.js +1 -0
  203. package/public/assets/js/chunks/nl-NL-XVDVCPNC-KVF3ZO2R.js +13 -0
  204. package/public/assets/js/chunks/nn-NO-EMX5MJX5-34QKSHNR.js +4 -0
  205. package/public/assets/js/chunks/nsis-RC4CREGM.js +1 -0
  206. package/public/assets/js/chunks/ntriples-4WK6CNVE.js +1 -0
  207. package/public/assets/js/chunks/oc-FR-ROEINTVO-5GP4AOYO.js +4 -0
  208. package/public/assets/js/chunks/octave-GOKFN2V7.js +1 -0
  209. package/public/assets/js/chunks/oz-OQUMNC63.js +1 -0
  210. package/public/assets/js/chunks/pa-IN-ZYN6SUDY-MVL7O44W.js +4 -0
  211. package/public/assets/js/chunks/packet-RMMSAZCW-D7XTR5TT.js +1 -0
  212. package/public/assets/js/chunks/pascal-BBWQWWWD.js +1 -0
  213. package/public/assets/js/chunks/percentages-5DKR754L-DG7W23CV.js +1 -0
  214. package/public/assets/js/chunks/perl-KTPJTTAM.js +1 -0
  215. package/public/assets/js/chunks/pica-6G3NROWT.js +17 -0
  216. package/public/assets/js/chunks/pie-UPGHQEXC-KGC3O6LN.js +1 -0
  217. package/public/assets/js/chunks/pieDiagram-SKSYHLDU-KWKRDEZS.js +30 -0
  218. package/public/assets/js/chunks/pig-IJMBS4FZ.js +1 -0
  219. package/public/assets/js/chunks/pl-PL-6VTG7PHC-VADRWSX4.js +12 -0
  220. package/public/assets/js/chunks/powershell-6YGCBHDP.js +1 -0
  221. package/public/assets/js/chunks/preview-render-compiler-WD3A76I6.js +25 -0
  222. package/public/assets/js/chunks/properties-5QTD3364.js +1 -0
  223. package/public/assets/js/chunks/protobuf-LTRWBIK3.js +1 -0
  224. package/public/assets/js/chunks/pt-BR-5YFKRR5G-HHF4UPO4.js +6 -0
  225. package/public/assets/js/chunks/pt-PT-GEIXXZ67-TUTAUZJK.js +8 -0
  226. package/public/assets/js/chunks/pug-U4PV3WLG.js +1 -0
  227. package/public/assets/js/chunks/puppet-WGYJPR3Y.js +1 -0
  228. package/public/assets/js/chunks/python-6YGH4S47.js +1 -0
  229. package/public/assets/js/chunks/q-VIG4IJLI.js +1 -0
  230. package/public/assets/js/chunks/quadrantDiagram-337W2JSQ-GWQRUFHQ.js +7 -0
  231. package/public/assets/js/chunks/quick-switcher-controller-JYDIJVAJ.js +5 -0
  232. package/public/assets/js/chunks/r-NVPCXGTR.js +1 -0
  233. package/public/assets/js/chunks/radar-KQ55EAFF-OPO64DRI.js +1 -0
  234. package/public/assets/js/chunks/requirementDiagram-Z7DCOOCP-ASW7IPJL.js +73 -0
  235. package/public/assets/js/chunks/ro-RO-E2P6TFZI-RJFCULYF.js +12 -0
  236. package/public/assets/js/chunks/roundRect-Z3DX3W5S.js +1 -0
  237. package/public/assets/js/chunks/rpm-UEA257HD.js +1 -0
  238. package/public/assets/js/chunks/ru-RU-YBIIY43T-BF27TNVK.js +10 -0
  239. package/public/assets/js/chunks/ruby-KPQRAJGE.js +1 -0
  240. package/public/assets/js/chunks/sankeyDiagram-WA2Y5GQK-W6BBWCLW.js +10 -0
  241. package/public/assets/js/chunks/sas-L7VATVH5.js +1 -0
  242. package/public/assets/js/chunks/scheme-T2NOWR3P.js +1 -0
  243. package/public/assets/js/chunks/sequenceDiagram-2WXFIKYE-H4G3ISLN.js +145 -0
  244. package/public/assets/js/chunks/shell-DLVDUNFA.js +1 -0
  245. package/public/assets/js/chunks/si-LK-673C2CI2-IOFGU4U2.js +1 -0
  246. package/public/assets/js/chunks/sieve-BKBZYDBU.js +1 -0
  247. package/public/assets/js/chunks/sk-SK-CKZHQ4AP-6O5JGN26.js +7 -0
  248. package/public/assets/js/chunks/sl-SI-557H2GWM-2NEHLV7W.js +6 -0
  249. package/public/assets/js/chunks/smalltalk-WRJQKJSD.js +1 -0
  250. package/public/assets/js/chunks/solr-66B3BIDL.js +1 -0
  251. package/public/assets/js/chunks/sparql-S25Z47JG.js +1 -0
  252. package/public/assets/js/chunks/spreadsheet-B272EF7Y.js +1 -0
  253. package/public/assets/js/chunks/sql-BPLIIUYC.js +1 -0
  254. package/public/assets/js/chunks/stateDiagram-RAJIS63D-OF5XXRUS.js +1 -0
  255. package/public/assets/js/chunks/stateDiagram-v2-FVOUBMTO-IV2CSQSQ.js +1 -0
  256. package/public/assets/js/chunks/stex-4IJY64QX.js +1 -0
  257. package/public/assets/js/chunks/stylus-PJUHLGPT.js +1 -0
  258. package/public/assets/js/chunks/subset-shared.chunk-4NMWHS4D.js +1 -0
  259. package/public/assets/js/chunks/subset-worker.chunk-NTLP7Y66.js +1 -0
  260. package/public/assets/js/chunks/sv-SE-XOPKKDWS-Q2L6KGFV.js +8 -0
  261. package/public/assets/js/chunks/swift-UYHTO4SX.js +1 -0
  262. package/public/assets/js/chunks/ta-IN-XBH7DQI3-ISSUGZAK.js +6 -0
  263. package/public/assets/js/chunks/tcl-OQ5J3VO2.js +1 -0
  264. package/public/assets/js/chunks/textile-NOGVBEYF.js +1 -0
  265. package/public/assets/js/chunks/th-TH-TOCWH3R4-TABEAMJA.js +1 -0
  266. package/public/assets/js/chunks/tiddlywiki-SYTK4QUE.js +1 -0
  267. package/public/assets/js/chunks/tiki-P7K4ZLOM.js +1 -0
  268. package/public/assets/js/chunks/timeline-definition-YZTLITO2-HBCANIUC.js +61 -0
  269. package/public/assets/js/chunks/toml-AUZYRP36.js +1 -0
  270. package/public/assets/js/chunks/tr-TR-GXW6CYY5-5NQRN52Y.js +4 -0
  271. package/public/assets/js/chunks/treemap-KZPCXAKY-WYMCT5F7.js +1 -0
  272. package/public/assets/js/chunks/troff-XFYJNQOJ.js +1 -0
  273. package/public/assets/js/chunks/ttcn-AK2IXWU6.js +1 -0
  274. package/public/assets/js/chunks/ttcn-cfg-3IDPIYPU.js +1 -0
  275. package/public/assets/js/chunks/turtle-OIDMF46P.js +1 -0
  276. package/public/assets/js/chunks/uk-UA-IJKTNUDG-2IIL3TO5.js +6 -0
  277. package/public/assets/js/chunks/uz-UZ-TBZZEA4V-X22KVKBP.js +1 -0
  278. package/public/assets/js/chunks/vb-J6K4XVA2.js +1 -0
  279. package/public/assets/js/chunks/vbscript-FM7DDZZE.js +1 -0
  280. package/public/assets/js/chunks/velocity-6KZFEOFD.js +1 -0
  281. package/public/assets/js/chunks/vennDiagram-LZ73GAT5-EBRF3MZR.js +34 -0
  282. package/public/assets/js/chunks/verilog-EWWQPMNN.js +1 -0
  283. package/public/assets/js/chunks/vhdl-CJ3M4IHI.js +1 -0
  284. package/public/assets/js/chunks/vi-VN-MULSGNVB-TENM65C7.js +7 -0
  285. package/public/assets/js/chunks/webidl-XVBHXCRV.js +1 -0
  286. package/public/assets/js/chunks/xquery-7WZOZ4UK.js +1 -0
  287. package/public/assets/js/chunks/xychartDiagram-JWTSCODW-WIFVRQPR.js +7 -0
  288. package/public/assets/js/chunks/yacas-MZ2ZZPF3.js +1 -0
  289. package/public/assets/js/chunks/z80-I447CBF7.js +1 -0
  290. package/public/assets/js/chunks/zh-CN-MVX3E32U-S5VA2BA5.js +11 -0
  291. package/public/assets/js/chunks/zh-HK-JNU5RLIE-A4VUKZFV.js +1 -0
  292. package/public/assets/js/chunks/zh-TW-LENVCA6T-KFB6KHMM.js +9 -0
  293. package/public/assets/js/excalidraw-editor-7ORML5YA.css +1 -0
  294. package/public/assets/js/excalidraw-editor-LKW2AZBU.js +347 -0
  295. package/public/assets/js/excalidraw-editor.css +1 -0
  296. package/public/assets/js/excalidraw-editor.js +1 -0
  297. package/public/assets/js/main.js +354 -0
  298. package/public/assets/js/preview-render-worker.js +30 -0
  299. package/public/assets/vendor/highlight/github-dark.min.css +10 -0
  300. package/public/assets/vendor/highlight/github.min.css +10 -0
  301. package/public/excalidraw-editor.html +31 -0
  302. package/public/index.html +549 -0
  303. package/scripts/cloudflare-tunnel.mjs +145 -0
  304. package/scripts/local-plantuml-compose.mjs +92 -0
  305. package/server.js +1 -0
  306. package/src/client/application/app-shell/chat-feature.js +363 -0
  307. package/src/client/application/app-shell/comments-feature.js +33 -0
  308. package/src/client/application/app-shell/git-feature.js +394 -0
  309. package/src/client/application/app-shell/presence-feature.js +229 -0
  310. package/src/client/application/app-shell/ui-feature.js +535 -0
  311. package/src/client/application/app-shell/workspace-feature.js +132 -0
  312. package/src/client/application/app-shell-elements.js +78 -0
  313. package/src/client/application/diagram-preview-hydrator.js +382 -0
  314. package/src/client/application/file-open-lifecycle.js +26 -0
  315. package/src/client/application/mermaid-preview-hydrator.js +570 -0
  316. package/src/client/application/plantuml-preview-hydrator.js +563 -0
  317. package/src/client/application/preview-diagram-utils.js +223 -0
  318. package/src/client/application/preview-render-compiler.js +426 -0
  319. package/src/client/application/preview-render-executor.js +153 -0
  320. package/src/client/application/preview-render-profile.js +63 -0
  321. package/src/client/application/preview-render-scheduler.js +73 -0
  322. package/src/client/application/preview-render-worker.js +19 -0
  323. package/src/client/application/preview-renderer.js +452 -0
  324. package/src/client/application/wiki-link-file-controller.js +58 -0
  325. package/src/client/application/workspace-chrome-controller.js +84 -0
  326. package/src/client/application/workspace-coordinator.js +238 -0
  327. package/src/client/application/workspace-preview-controller.js +237 -0
  328. package/src/client/application/workspace-route-controller.js +170 -0
  329. package/src/client/application/workspace-state-store.js +46 -0
  330. package/src/client/bootstrap/collabmd-app-shell.js +479 -0
  331. package/src/client/domain/diagram-action-icons.js +41 -0
  332. package/src/client/domain/excalidraw-collaboration.js +153 -0
  333. package/src/client/domain/excalidraw-scene.js +87 -0
  334. package/src/client/domain/markdown-formatting.js +370 -0
  335. package/src/client/domain/plantuml-language.js +226 -0
  336. package/src/client/domain/room.js +49 -0
  337. package/src/client/domain/runtime-paths.js +136 -0
  338. package/src/client/domain/vault-api-client.js +1 -0
  339. package/src/client/domain/vault-paths.js +80 -0
  340. package/src/client/domain/vault-utils.js +49 -0
  341. package/src/client/domain/wiki-link-completions.js +78 -0
  342. package/src/client/excalidraw-editor.js +630 -0
  343. package/src/client/excalidraw-mermaid-stub.js +7 -0
  344. package/src/client/infrastructure/auth-client.js +383 -0
  345. package/src/client/infrastructure/browser-navigation-port.js +19 -0
  346. package/src/client/infrastructure/browser-notification-port.js +40 -0
  347. package/src/client/infrastructure/browser-preferences-port.js +79 -0
  348. package/src/client/infrastructure/comment-thread-store.js +293 -0
  349. package/src/client/infrastructure/editor-collaboration-client.js +240 -0
  350. package/src/client/infrastructure/editor-session.js +255 -0
  351. package/src/client/infrastructure/editor-view-adapter.js +578 -0
  352. package/src/client/infrastructure/excalidraw-room-client.js +651 -0
  353. package/src/client/infrastructure/lobby-presence.js +304 -0
  354. package/src/client/infrastructure/runtime-config.js +65 -0
  355. package/src/client/infrastructure/tab-activity-lock.js +193 -0
  356. package/src/client/infrastructure/vault-api-client.js +61 -0
  357. package/src/client/infrastructure/yjs-provider-reset-guard.js +19 -0
  358. package/src/client/main.js +16 -0
  359. package/src/client/mermaid-runtime.js +3 -0
  360. package/src/client/presentation/backlinks-panel.js +188 -0
  361. package/src/client/presentation/comment-ui-controller.js +1235 -0
  362. package/src/client/presentation/comments-panel.js +531 -0
  363. package/src/client/presentation/excalidraw-embed-controller.js +968 -0
  364. package/src/client/presentation/excalidraw-embed-reconciler.js +37 -0
  365. package/src/client/presentation/file-action-controller.js +596 -0
  366. package/src/client/presentation/file-explorer-controller.js +81 -0
  367. package/src/client/presentation/file-explorer-view.js +256 -0
  368. package/src/client/presentation/file-tree-state.js +77 -0
  369. package/src/client/presentation/git-diff-view-controller.js +656 -0
  370. package/src/client/presentation/git-panel-controller.js +516 -0
  371. package/src/client/presentation/layout-controller.js +222 -0
  372. package/src/client/presentation/outline-controller.js +239 -0
  373. package/src/client/presentation/quick-switcher-controller.js +300 -0
  374. package/src/client/presentation/scroll-sync-controller.js +500 -0
  375. package/src/client/presentation/theme-controller.js +64 -0
  376. package/src/client/presentation/toast-controller.js +21 -0
  377. package/src/client/presentation/video-embed-controller.js +264 -0
  378. package/src/client/styles/base.css +58 -0
  379. package/src/client/styles/style.css +4245 -0
  380. package/src/domain/comment-threads.js +233 -0
  381. package/src/domain/excalidraw-room-codec.js +427 -0
  382. package/src/domain/file-kind.js +104 -0
  383. package/src/domain/wiki-link-resolver.js +75 -0
  384. package/src/server/auth/create-auth-service.js +272 -0
  385. package/src/server/auth/session-cookie.js +125 -0
  386. package/src/server/config/env.js +186 -0
  387. package/src/server/create-app-server.js +143 -0
  388. package/src/server/domain/backlink-index.js +291 -0
  389. package/src/server/domain/collaboration/collaboration-document-store.js +155 -0
  390. package/src/server/domain/collaboration/collaboration-room.js +603 -0
  391. package/src/server/domain/collaboration/protocol.js +2 -0
  392. package/src/server/domain/collaboration/room-client-state-store.js +28 -0
  393. package/src/server/domain/collaboration/room-persistence-controller.js +80 -0
  394. package/src/server/domain/collaboration/room-registry.js +94 -0
  395. package/src/server/domain/git-service.js +1 -0
  396. package/src/server/domain/plantuml-encoder.js +49 -0
  397. package/src/server/domain/plantuml-renderer.js +1 -0
  398. package/src/server/index.js +72 -0
  399. package/src/server/infrastructure/git/command-runner.js +48 -0
  400. package/src/server/infrastructure/git/concurrency.js +19 -0
  401. package/src/server/infrastructure/git/diff-service.js +389 -0
  402. package/src/server/infrastructure/git/errors.js +5 -0
  403. package/src/server/infrastructure/git/git-service.js +216 -0
  404. package/src/server/infrastructure/git/parsers.js +401 -0
  405. package/src/server/infrastructure/git/path-utils.js +65 -0
  406. package/src/server/infrastructure/git/responses.js +108 -0
  407. package/src/server/infrastructure/git/status-service.js +99 -0
  408. package/src/server/infrastructure/git/untracked-files.js +101 -0
  409. package/src/server/infrastructure/http/create-auth-api-handler.js +48 -0
  410. package/src/server/infrastructure/http/create-esm-proxy-handler.js +130 -0
  411. package/src/server/infrastructure/http/create-git-api-command-handler.js +170 -0
  412. package/src/server/infrastructure/http/create-git-api-handler.js +40 -0
  413. package/src/server/infrastructure/http/create-git-api-query-handler.js +62 -0
  414. package/src/server/infrastructure/http/create-plantuml-api-handler.js +43 -0
  415. package/src/server/infrastructure/http/create-request-handler.js +138 -0
  416. package/src/server/infrastructure/http/create-static-handler.js +167 -0
  417. package/src/server/infrastructure/http/create-vault-api-command-handler.js +161 -0
  418. package/src/server/infrastructure/http/create-vault-api-handler.js +43 -0
  419. package/src/server/infrastructure/http/create-vault-api-query-handler.js +82 -0
  420. package/src/server/infrastructure/http/http-errors.js +13 -0
  421. package/src/server/infrastructure/http/http-response.js +167 -0
  422. package/src/server/infrastructure/http/request-body.js +56 -0
  423. package/src/server/infrastructure/persistence/path-utils.js +90 -0
  424. package/src/server/infrastructure/persistence/sidecar-store.js +150 -0
  425. package/src/server/infrastructure/persistence/vault-content-adapter.js +49 -0
  426. package/src/server/infrastructure/persistence/vault-file-store.js +435 -0
  427. package/src/server/infrastructure/plantuml/plantuml-renderer.js +56 -0
  428. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +194 -0
  429. package/src/server/infrastructure/websocket/client-socket-session.js +151 -0
  430. package/src/server/startup/git-remote-bootstrap.js +435 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 andes90
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,453 @@
1
+ # CollabMD
2
+
3
+ Browser collaboration for existing markdown folders, diagram files, and git-backed docs.
4
+
5
+ <p align="center">
6
+ <img src="./docs/assets/collabmd-hero.png" alt="CollabMD showing a file tree, markdown editor, live preview, and collaborator presence." width="100%">
7
+ </p>
8
+
9
+ <p align="center">
10
+ <strong>Turn an existing markdown-and-diagram workspace into a realtime collaborative web app.</strong>
11
+ </p>
12
+
13
+ <p align="center">
14
+ No migration. Plain files stay on disk. Collaborators get live editing, source-anchored comments, chat, Markdown video embeds, Mermaid, PlantUML, Excalidraw, and vault-style navigation in the browser.
15
+ </p>
16
+
17
+ ## See it in action
18
+
19
+ ![CollabMD live demo](./docs/assets/collabmd-demo.gif)
20
+
21
+ Prefer video? [Open the WebM demo](./docs/assets/collabmd-demo.webm).
22
+
23
+ ## Why teams use CollabMD
24
+
25
+ - **No migration** — point CollabMD at an existing markdown folder, diagram workspace, Obsidian-style vault, or git-backed docs repo
26
+ - **Local-files-first** — your filesystem remains the source of truth
27
+ - **Realtime collaboration** — multiple people can edit the same file at the same time via Yjs
28
+ - **Markdown with context** — live preview, wiki-links, backlinks, outline, quick switcher, and scroll sync
29
+ - **Source-anchored comments** — comment on lines or selected text with inline markers, preview bubbles, and thread cards
30
+ - **Collaboration built in** — collaborator presence, follow mode, and team chat
31
+ - **Diagram-friendly** — Mermaid fences and standalone `.mmd` / `.mermaid`, PlantUML `.puml` / `.plantuml`, `.excalidraw`, and public video embeds in Markdown
32
+ - **Easy browser access** — optional Cloudflare Tunnel support makes a running session easy to share
33
+
34
+ ## Best fit for
35
+
36
+ - Collaborating on an existing Obsidian-style vault without migrating files
37
+ - Reviewing RFCs, product docs, architecture notes, and runbooks in real time
38
+ - Reviewing drafts and diagrams with anchored comment threads instead of side-channel feedback
39
+ - Sharing markdown-heavy knowledge bases with remote teammates
40
+ - Editing notes and diagrams together while keeping everything as plain files on disk
41
+ - Giving browser access to collaborators who do not use your local markdown setup
42
+
43
+ ## Quick start
44
+
45
+ ### Requirements
46
+
47
+ - macOS or Linux
48
+ - Node.js 24 if installing from source
49
+
50
+ ### Install with Homebrew
51
+
52
+ ```bash
53
+ brew tap andes90/tap
54
+ brew install collabmd
55
+ collabmd ~/my-vault --no-tunnel
56
+ ```
57
+
58
+ Or in a single command:
59
+
60
+ ```bash
61
+ brew install andes90/tap/collabmd
62
+ collabmd ~/my-vault --no-tunnel
63
+ ```
64
+
65
+ Open `http://localhost:1234`.
66
+
67
+ ### Install from source
68
+
69
+ ```bash
70
+ git clone https://github.com/andes90/collabmd.git
71
+ cd collabmd
72
+ npm install
73
+ npm run build
74
+ npm link # optional: makes `collabmd` available globally
75
+ collabmd ~/my-vault --no-tunnel
76
+ ```
77
+
78
+ Open `http://localhost:1234`.
79
+
80
+ For a safer first run, start local-only:
81
+
82
+ ```bash
83
+ collabmd ~/my-vault --no-tunnel
84
+ ```
85
+
86
+ If you want to share the session over the internet, protect it first:
87
+
88
+ ```bash
89
+ collabmd ~/my-vault --auth password
90
+ ```
91
+
92
+ If `cloudflared` is installed, CollabMD starts a quick tunnel by default unless you pass `--no-tunnel`.
93
+
94
+ ## Safety first
95
+
96
+ - Treat the URL as write access to the vault unless you enable auth
97
+ - `--auth password` protects `/api/*` and `/ws/*` with a host password and signed session cookie
98
+ - If `cloudflared` is installed, CollabMD may expose the app through a Cloudflare Quick Tunnel unless you pass `--no-tunnel`
99
+ - `oidc` is reserved for a future implementation and is not usable yet
100
+
101
+ ## How it works
102
+
103
+ ```bash
104
+ collabmd ~/my-vault --no-tunnel
105
+ ```
106
+
107
+ CollabMD starts a local server, scans the vault, and opens a browser-based editor with:
108
+
109
+ - **File explorer sidebar** — browse, create, rename, and delete `.md`, `.mmd`, `.mermaid`, `.puml`, `.plantuml`, and `.excalidraw` files plus folders
110
+ - **Live preview** — rendered as you type, with syntax-highlighted code blocks, public video embeds, plus Mermaid and PlantUML diagrams
111
+ - **Anchored comments** — add comments from the editor, open threads from inline markers or preview bubbles, and review them from the comments drawer
112
+ - **`[[wiki-links]]` + backlinks** — jump between notes and inspect linked mentions
113
+ - **Room chat** — discuss changes without leaving the workspace
114
+ - **Presence + follow mode** — see who is online and follow another collaborator's active cursor
115
+ - **Quick switcher + outline** — move around large vaults and long documents faster
116
+ - **Standalone diagram files** — open `.mmd` / `.mermaid` or `.puml` / `.plantuml` files in side-by-side editor + preview, or `.excalidraw` files in direct preview mode
117
+
118
+ Comment threads are source-anchored and currently supported for markdown, Mermaid, and PlantUML text files. You can comment on a whole line or a text selection, then reopen the thread from either the editor marker or the preview bubble. Excalidraw files are currently excluded from comments.
119
+
120
+ Markdown video embeds are opt-in and use standard image syntax such as `![Video](https://www.youtube.com/watch?v=...)` or `![Video](https://cdn.example.com/demo.webm)`. The preview currently supports public YouTube URLs plus direct public `https` video files ending in `.mp4`, `.webm`, or `.ogg`. The editor toolbar also includes a `Video` action that inserts the same Markdown syntax for you.
121
+
122
+ Your filesystem is the source of truth. CollabMD reads files from disk, uses Yjs for realtime collaboration, and writes plain text back to disk when the last editor disconnects.
123
+
124
+ ## Usage
125
+
126
+ ```bash
127
+ collabmd [directory] [options]
128
+ ```
129
+
130
+ ### Arguments
131
+
132
+ | Argument | Description |
133
+ |----------|-------------|
134
+ | `directory` | Path to the vault directory (default: current directory) |
135
+
136
+ ### Options
137
+
138
+ | Option | Description | Default |
139
+ |--------|-------------|---------|
140
+ | `-p, --port` | Port to listen on | `1234` |
141
+ | `--host` | Host to bind to | `127.0.0.1` |
142
+ | `--auth` | Auth strategy: `none`, `password`, `oidc` | `none` |
143
+ | `--auth-password` | Password for `--auth password` | generated per run |
144
+ | `--local-plantuml` | Start the bundled local docker-compose PlantUML service | off |
145
+ | `--no-tunnel` | Don't start Cloudflare Tunnel | tunnel on |
146
+ | `-v, --version` | Show version | |
147
+ | `-h, --help` | Show help | |
148
+
149
+ ### Examples
150
+
151
+ ```bash
152
+ # Serve the current directory locally
153
+ collabmd --no-tunnel
154
+
155
+ # Serve a specific vault locally
156
+ collabmd ~/my-vault --no-tunnel
157
+
158
+ # Use a custom port, no tunnel
159
+ collabmd --port 3000 --no-tunnel
160
+
161
+ # Share with collaborators using a generated password
162
+ collabmd --auth password
163
+
164
+ # Require an explicit password
165
+ collabmd --auth password --auth-password "shared-secret"
166
+
167
+ # Use the local docker-compose PlantUML service
168
+ collabmd --local-plantuml
169
+
170
+ # Serve an Obsidian vault
171
+ collabmd ~/Documents/Obsidian/MyVault
172
+ ```
173
+
174
+ ## Cloudflare Tunnel
175
+
176
+ When `cloudflared` is available, the CLI starts a [Cloudflare Quick Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) by default so your vault is accessible from the internet. Since the editor uses same-origin WebSocket routing (`/ws/:file`), the tunnel works for both HTTP and collaboration traffic.
177
+
178
+ If you are exposing the app through the tunnel, `collabmd --auth password` is the intended first-line protection. When you do not pass `--auth-password`, CollabMD generates a password for that host run and prints it in the terminal. Restarting the app rotates that password and the signed session secret.
179
+
180
+ `cloudflared` is optional. Install it only if you want public tunnel access:
181
+
182
+ - macOS: `brew install cloudflared`
183
+ - Linux/Windows: [official installer](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/)
184
+
185
+ To disable the tunnel:
186
+
187
+ ```bash
188
+ collabmd --no-tunnel
189
+ ```
190
+
191
+ You can also configure the tunnel via environment variables:
192
+
193
+ ```bash
194
+ TUNNEL_TARGET_PORT=4000 collabmd
195
+ TUNNEL_TARGET_URL=http://127.0.0.1:4000 collabmd
196
+ CLOUDFLARED_EXTRA_ARGS="--loglevel info" collabmd
197
+ ```
198
+
199
+ ## Docker / Coolify deployment
200
+
201
+ ```bash
202
+ docker build -t collabmd .
203
+ docker run -p 1234:1234 -v /path/to/vault:/data collabmd
204
+ ```
205
+
206
+ The container listens on `0.0.0.0:1234` and stores vault files at `/data`.
207
+
208
+ To bootstrap `/data` from a private git repository instead, pass the repo URL plus SSH credentials:
209
+
210
+ ```bash
211
+ docker run \
212
+ -p 1234:1234 \
213
+ -v /path/to/persistent/vault:/data \
214
+ -e COLLABMD_GIT_REPO_URL=git@github.com:your-org/your-private-vault.git \
215
+ -e COLLABMD_GIT_SSH_PRIVATE_KEY_B64="$(base64 < ~/.ssh/id_ed25519 | tr -d '\n')" \
216
+ -e COLLABMD_GIT_USER_NAME="CollabMD Bot" \
217
+ -e COLLABMD_GIT_USER_EMAIL="bot@example.com" \
218
+ collabmd
219
+ ```
220
+
221
+ For a full local and Docker test walkthrough, including key generation and deploy-key setup, see [docs/private-git-deployment.md](./docs/private-git-deployment.md).
222
+
223
+ When `COLLABMD_GIT_REPO_URL` is set, CollabMD clones into `COLLABMD_VAULT_DIR` on first boot, then reuses that checkout on later starts. If the checkout already exists, startup validates that `origin` matches. Clean checkouts are fast-forwarded to the remote default branch; dirty checkouts are reused as-is and startup skips the sync.
224
+
225
+ After bootstrap, CollabMD adds `.collabmd/` to the checkout's local git exclude file at `.git/info/exclude` so runtime metadata stays out of git status without modifying the repo's tracked `.gitignore`.
226
+
227
+ File-based secrets are also supported and take precedence over base64 input:
228
+
229
+ ```bash
230
+ docker run \
231
+ -p 1234:1234 \
232
+ -v /path/to/persistent/vault:/data \
233
+ -v ~/.ssh/id_ed25519:/run/secrets/collabmd_git_key:ro \
234
+ -v ~/.ssh/known_hosts:/run/secrets/collabmd_known_hosts:ro \
235
+ -e COLLABMD_GIT_REPO_URL=git@github.com:your-org/your-private-vault.git \
236
+ -e COLLABMD_GIT_SSH_PRIVATE_KEY_FILE=/run/secrets/collabmd_git_key \
237
+ -e COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE=/run/secrets/collabmd_known_hosts \
238
+ -e COLLABMD_GIT_USER_NAME="CollabMD Bot" \
239
+ -e COLLABMD_GIT_USER_EMAIL="bot@example.com" \
240
+ collabmd
241
+ ```
242
+
243
+ ### Local docker-compose with a private PlantUML server
244
+
245
+ The included `docker-compose.yml` runs a prebuilt CollabMD image together with a local `plantuml/plantuml-server:jetty` container and points `PLANTUML_SERVER_URL` at the private service automatically.
246
+
247
+ ```bash
248
+ mkdir -p data/vault
249
+ docker build -t collabmd:local .
250
+ docker compose up
251
+ ```
252
+
253
+ Open `http://localhost:1234`.
254
+
255
+ By default, compose uses `COLLABMD_IMAGE=collabmd:local`. To run the published GitHub Container Registry image instead:
256
+
257
+ ```bash
258
+ COLLABMD_IMAGE=ghcr.io/<owner>/<repo>:latest docker compose up
259
+ ```
260
+
261
+ The PlantUML container is also published on loopback by default at `http://127.0.0.1:18080`, so the host-based CLI can reuse it with:
262
+
263
+ ```bash
264
+ npm run start:local-plantuml
265
+ ```
266
+
267
+ To use an existing vault on your machine instead of `./data/vault`:
268
+
269
+ ```bash
270
+ HOST_VAULT_DIR=/absolute/path/to/vault docker compose up
271
+ ```
272
+
273
+ To bootstrap the compose-managed vault from a private repo, set the git env vars in `.env` and keep `HOST_VAULT_DIR` on a persistent host path. For file-based SSH auth, point `COLLABMD_GIT_SSH_PRIVATE_KEY_FILE` and `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` at mounted secret paths; for simpler setups, set `COLLABMD_GIT_SSH_PRIVATE_KEY_B64` instead.
274
+
275
+ If you want the in-app Git commit action to work inside the container, also set `COLLABMD_GIT_USER_NAME` and `COLLABMD_GIT_USER_EMAIL` so CollabMD can configure the checkout identity automatically.
276
+
277
+ To change the host port:
278
+
279
+ ```bash
280
+ COLLABMD_HOST_PORT=3000 docker compose up
281
+ ```
282
+
283
+ To change the local PlantUML host port used by both `docker compose` and `--local-plantuml`:
284
+
285
+ ```bash
286
+ PLANTUML_HOST_PORT=18081 npm run start:local-plantuml
287
+ ```
288
+
289
+ Recommended Coolify setup:
290
+
291
+ 1. Use the included `Dockerfile`.
292
+ 2. Expose port `1234`.
293
+ 3. Mount a persistent volume to `/data` for the vault checkout and runtime files. It can be pre-populated with markdown files or start empty when `COLLABMD_GIT_REPO_URL` is enabled.
294
+ 4. Add `COLLABMD_GIT_REPO_URL` plus either `COLLABMD_GIT_SSH_PRIVATE_KEY_FILE` or `COLLABMD_GIT_SSH_PRIVATE_KEY_B64` if the vault should be cloned from a private repo.
295
+ 5. Mount `known_hosts` and set `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` if you want strict host verification.
296
+ 6. Add a health check for `GET /health` with enough startup grace for the initial clone.
297
+ 7. Run a single replica only because room state is in-process and not shared across instances.
298
+ 8. Set `BASE_PATH` if the app is mounted under a subpath such as `/collabmd`.
299
+ 9. Set `PUBLIC_WS_BASE_URL` only if your WebSocket endpoint differs from the app origin.
300
+
301
+ For a standard Coolify reverse-proxy setup, the default same-origin WebSocket routing works as-is and you should not need `PUBLIC_WS_BASE_URL`.
302
+
303
+ Health check: `GET /health`
304
+
305
+ ## Development
306
+
307
+ Install dependencies:
308
+
309
+ ```bash
310
+ npm install
311
+ ```
312
+
313
+ Build and run:
314
+
315
+ ```bash
316
+ npm start
317
+ ```
318
+
319
+ Open `http://localhost:1234`.
320
+
321
+ Useful commands:
322
+
323
+ ```bash
324
+ npm run build # Build client bundle
325
+ npm run check # Syntax check all entry points
326
+ npm run start # Build + start server
327
+ npm run start:local-plantuml # Build + start server with local docker-compose PlantUML
328
+ npm run start:prod # Start server (expects previous build)
329
+ npm run test # Run unit + e2e tests
330
+ npm run test:unit # Fast Node-based unit tests
331
+ npm run test:e2e # Playwright browser tests
332
+ npm run tunnel # Start only the Cloudflare tunnel
333
+ npm run plantuml:up # Start only the local docker-compose PlantUML service
334
+ npm run plantuml:down # Stop only the local docker-compose PlantUML service
335
+ npm run capture:readme-assets # Regenerate the README screenshot and demo assets
336
+ ```
337
+
338
+ ## Testing
339
+
340
+ ### Unit tests
341
+
342
+ ```bash
343
+ npm run test:unit
344
+ ```
345
+
346
+ Covers the vault file store, HTTP endpoints, collaboration room behavior, WebSocket integration, and supporting domain logic.
347
+
348
+ ### End-to-end tests
349
+
350
+ ```bash
351
+ npx playwright install chromium # first time only
352
+ npm run test:e2e
353
+ ```
354
+
355
+ Playwright boots the full app against the `test-vault/` directory and verifies the file explorer, editor, preview, collaboration, chat, outline, and scroll sync flows.
356
+
357
+ ### All tests
358
+
359
+ ```bash
360
+ npm run test
361
+ ```
362
+
363
+ <details>
364
+ <summary>Architecture</summary>
365
+
366
+ ```text
367
+ bin/
368
+ collabmd.js CLI entry point
369
+ src/
370
+ client/
371
+ application/ app orchestration, preview rendering, workspace coordination
372
+ bootstrap/ app-shell composition and startup wiring
373
+ domain/ markdown editing, wiki-link, room, and vault helpers
374
+ infrastructure/ runtime config, auth bootstrap, browser ports, collaborative editor session
375
+ presentation/ file explorer, backlinks, quick switcher, outline, scroll sync, theme, layout
376
+ styles/ app CSS
377
+ domain/ shared wiki-link helpers
378
+ server/
379
+ auth/ strategy selection and cookie-backed auth sessions
380
+ config/ environment loading
381
+ domain/ collaboration room model, registry, backlink index, server-side abstractions
382
+ infrastructure/ HTTP handlers, git service, vault file store, PlantUML, WebSocket gateway
383
+ startup/ preflight vault bootstrap, including remote git checkout setup
384
+ public/
385
+ assets/ built CSS, JS, and vendored browser assets
386
+ index.html app shell
387
+ scripts/
388
+ build-client.mjs client bundling and vendored browser assets
389
+ cloudflare-tunnel.mjs Cloudflare quick tunnel helper
390
+ local-plantuml-compose.mjs
391
+ capture-readme-assets.mjs
392
+ ```
393
+
394
+ </details>
395
+
396
+ <details>
397
+ <summary>Environment variables</summary>
398
+
399
+ | Variable | Description | Default |
400
+ |----------|-------------|---------|
401
+ | `HOST` | Bind host | `127.0.0.1` (dev), `0.0.0.0` (prod) |
402
+ | `PORT` | HTTP + WebSocket port | `1234` |
403
+ | `AUTH_STRATEGY` | Auth strategy: `none`, `password`, `oidc` | `none` |
404
+ | `AUTH_PASSWORD` | Shared password for `AUTH_STRATEGY=password` | generated per run |
405
+ | `AUTH_SESSION_COOKIE_NAME` | Session cookie name | `collabmd_auth` |
406
+ | `AUTH_SESSION_SECRET` | Cookie signing secret | generated per run |
407
+ | `BASE_PATH` | URL path prefix for subpath deployments | |
408
+ | `PLANTUML_SERVER_URL` | Upstream PlantUML server base URL used for server-side SVG rendering | `https://www.plantuml.com/plantuml` |
409
+ | `COLLABMD_VAULT_DIR` | Vault directory path | current directory |
410
+ | `COLLABMD_GIT_ENABLED` | Enable or disable git integration in the UI and API | `true` |
411
+ | `COLLABMD_GIT_REPO_URL` | Remote git repository used to bootstrap the vault checkout | |
412
+ | `COLLABMD_GIT_SSH_PRIVATE_KEY_FILE` | SSH private key file path for remote git auth; preferred over base64 input | |
413
+ | `COLLABMD_GIT_SSH_PRIVATE_KEY_B64` | Base64-encoded SSH private key used when no key file path is provided | |
414
+ | `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` | Optional `known_hosts` file path for strict SSH host verification | |
415
+ | `COLLABMD_GIT_USER_NAME` | Git author/committer name configured for in-app commits in git-backed deployments | |
416
+ | `COLLABMD_GIT_USER_EMAIL` | Git author/committer email configured for in-app commits in git-backed deployments | |
417
+ | `WS_BASE_PATH` | WebSocket base path | `/ws` |
418
+ | `PUBLIC_WS_BASE_URL` | Public WebSocket URL override for reverse proxies | |
419
+ | `HTTP_KEEP_ALIVE_TIMEOUT_MS` | Keep-alive timeout | `5000` |
420
+ | `HTTP_HEADERS_TIMEOUT_MS` | Header read timeout | `60000` |
421
+ | `HTTP_REQUEST_TIMEOUT_MS` | Request timeout | `30000` |
422
+ | `WS_HEARTBEAT_INTERVAL_MS` | Heartbeat interval for evicting dead clients | `30000` |
423
+ | `WS_MAX_BUFFERED_AMOUNT_BYTES` | Max outbound buffer per WebSocket | `16777216` |
424
+ | `WS_MAX_PAYLOAD_BYTES` | Max inbound WebSocket frame | `16777216` |
425
+ | `CLOUDFLARED_BIN` | `cloudflared` binary path | `cloudflared` |
426
+ | `TUNNEL_TARGET_HOST` | Tunnel target host | `127.0.0.1` |
427
+ | `TUNNEL_TARGET_PORT` | Tunnel target port | `1234` |
428
+ | `TUNNEL_TARGET_URL` | Full tunnel target URL override | |
429
+ | `CLOUDFLARED_EXTRA_ARGS` | Extra `cloudflared` flags | |
430
+
431
+ Copy the example file:
432
+
433
+ ```bash
434
+ cp .env.example .env
435
+ ```
436
+
437
+ </details>
438
+
439
+ ## Notes
440
+
441
+ - The filesystem is the source of truth; Yjs provides the collaboration layer.
442
+ - When `COLLABMD_GIT_REPO_URL` is set, startup clones the configured repo into `COLLABMD_VAULT_DIR` on first boot and reuses an existing same-origin checkout on later starts.
443
+ - If `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` is not set, SSH falls back to `StrictHostKeyChecking=accept-new`.
444
+ - CollabMD assumes it is the only writer while a file is open; there is no live `fs.watch` reconciliation.
445
+ - `.obsidian`, `.git`, `.trash`, and `node_modules` directories are ignored.
446
+ - Only `.md`, `.markdown`, and `.mdx` files are indexed.
447
+ - PlantUML preview rendering is server-side and uses `PLANTUML_SERVER_URL`; point it at a self-hosted renderer if you do not want to use the public PlantUML service.
448
+ - `docker compose up --build` uses the included local PlantUML service and avoids the public renderer by default. The initial git clone may also require a longer health-check grace period than a purely local vault.
449
+ - `collabmd --local-plantuml` and `npm run start:local-plantuml` will start the local PlantUML compose service first, then run CollabMD against `http://127.0.0.1:${PLANTUML_HOST_PORT:-18080}`.
450
+
451
+ ## License
452
+
453
+ MIT