collabmd 0.1.48 → 0.1.51
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.
- package/README.md +15 -608
- package/bin/collabmd.js +39 -20
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-Crf9Y3Q6.js +1 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-PuinKbSQ.js +1 -0
- package/dist/client/assets/ar-SA-5WIASEJP-Di7OimCN.js +10 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-I39sYjHI.js → architectureDiagram-5GKGNRK7-46hPkrZv.js} +3 -3
- package/dist/client/assets/az-AZ-V5EUQD6C-C19OGTT_.js +1 -0
- package/dist/client/assets/bg-BG-EXASCMTR-BIt0xWyb.js +5 -0
- package/dist/client/assets/{blockDiagram-NRAW4CY4-C6DtJy5Y.js → blockDiagram-I7D4REHJ-C1S5Bzf8.js} +4 -4
- package/dist/client/assets/bn-BD-U4SYNFCO-CdNaPy4Q.js +3 -0
- package/dist/client/assets/bn-IN-HKDJIITE-CdNaPy4Q.js +3 -0
- package/dist/client/assets/{browser-BKLM0ThC-IxjwuOIz-BBqQnUEb.js → browser-BKLM0ThC-IxjwuOIz-DyJcVMFR.js} +1 -1
- package/dist/client/assets/browser-utils-DbXSMI-6.js +1 -0
- package/dist/client/assets/{c4Diagram-UCG6FXSJ-CtWtxS9_.js → c4Diagram-7LVT6UL2-VAk1HPmz.js} +1 -1
- package/dist/client/assets/ca-ES-2KGUU5XB-C9t-c0cH.js +8 -0
- package/dist/client/assets/channel-jwdhnPiV.js +1 -0
- package/dist/client/assets/chunk-2E4U76K2-Ba8Wf22k.js +1 -0
- package/dist/client/assets/{chunk-TEH6E4GO-DVayPj-q.js → chunk-4HAMMTFA-Ht-73lsT.js} +20 -20
- package/dist/client/assets/chunk-5XKZK2GL-D4UAZSOJ.js +1 -0
- package/dist/client/assets/{chunk-75Z2AOVW-CdFSaPjz.js → chunk-75Z2AOVW-B2cZexqK.js} +1 -1
- package/dist/client/assets/{chunk-CLGD4ZFX-DQLgbQrv.js → chunk-CLGD4ZFX-Cmtx89ht.js} +1 -1
- package/dist/client/assets/chunk-DU6HZSFF-C6d6PJfE.js +127 -0
- package/dist/client/assets/{chunk-F27PBJKO-CNHIFhjo.js → chunk-F27PBJKO-Dg3H6KLL.js} +1 -1
- package/dist/client/assets/{chunk-GMAD6QVW-CbcBqPM5.js → chunk-GMAD6QVW-DUfjx_d5.js} +1 -1
- package/dist/client/assets/{chunk-OBVCFTLP-BJR7u1jh.js → chunk-GVQU2GXP-D1l7oRGR.js} +1 -1
- package/dist/client/assets/{chunk-G27WJ6UU-D9-eg537.js → chunk-IMKFNOWR-3F6NhHUP.js} +2 -2
- package/dist/client/assets/{chunk-JQ64N6SF-DSFNH4bh.js → chunk-L3NEJ4N5-BmCVn4y-.js} +1 -1
- package/dist/client/assets/chunk-OSK3NFVY-CWHXAmfx.js +10 -0
- package/dist/client/assets/{chunk-P2QGCYS3-BRpqY32H.js → chunk-P2QGCYS3-Du8EtwOa.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-Cb4SlVZF.js → chunk-POPQ4Y6H-B5yJIrZE.js} +1 -1
- package/dist/client/assets/{chunk-PWAF6VOD-Cz8IwBB5.js → chunk-PWAF6VOD-B3gML4ps.js} +1 -1
- package/dist/client/assets/{chunk-RHFEMEQ7-CWY8cf4H.js → chunk-SHT3W25Y-BKaI8jZO.js} +5 -5
- package/dist/client/assets/{chunk-SVP7TREG-CyHOmcac.js → chunk-SVP7TREG-XlsB_ZMZ.js} +1 -1
- package/dist/client/assets/{chunk-LCL6LL3I-DmDkVukh.js → chunk-TICWLB2K-Cpp2z8yK.js} +4 -4
- package/dist/client/assets/chunk-TLUHSLCS-Yl7B0Vrz.js +1 -0
- package/dist/client/assets/chunk-ZNVOA63L-BmCQjhx-.js +40 -0
- package/dist/client/assets/{chunk-FLYJHZSQ-Be7lKF17.js → chunk-ZPMXAHWN-Dt0TxJa6.js} +2 -2
- package/dist/client/assets/classDiagram-ZZMXUADV-BRw9vo8U.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BRw9vo8U.js +1 -0
- package/dist/client/assets/comment-markdown-renderer-B9_vPc3F.js +1 -0
- package/dist/client/assets/comment-thread-store-NNHqRVsX.js +1 -0
- package/dist/client/assets/comment-threads-nJhK1yfc.js +4 -0
- package/dist/client/assets/cs-CZ-VUCGPRML-BfCoYAgj.js +7 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CdTPi2yO.js → cynefinDiagram-5FMLGOSQ-BRoCEoZM.js} +1 -1
- package/dist/client/assets/da-DK-NNDP2IVP-DBw9ZNTR.js +2 -0
- package/dist/client/assets/{dagre-3AP2YEHR-5gtJtd0O.js → dagre-GXQ25YYZ-BSfKCfy7.js} +2 -2
- package/dist/client/assets/de-CH-I7RAVIZN-DYW18Vsr.js +11 -0
- package/dist/client/assets/de-DE-WBQ3DQLR-DYW18Vsr.js +11 -0
- package/dist/client/assets/deferred-collab-rBe4nuQ2.css +1 -0
- package/dist/client/assets/deferred-git-BHKtkFYi.css +1 -0
- package/dist/client/assets/deferred-preview-pe7Iwwx3.css +1 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BudWz9WU.js → diagram-S7CK7UJ4-D7KaM9yj.js} +2 -2
- package/dist/client/assets/{diagram-UQ7AKVKN-3v4rbH-s.js → diagram-UQ7AKVKN-JevUZuYi.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-B3-U-Q2E.js +3 -0
- package/dist/client/assets/{diagram-VX7I27RA-C_-rj0sw.js → diagram-VX7I27RA-pSD4HMh1.js} +1 -1
- package/dist/client/assets/{diagram-Z3DM3KII-B4yxavgj.js → diagram-Z3DM3KII-D8r1_CIb.js} +1 -1
- package/dist/client/assets/{direct-engine-DdrQKpgq-CtKfQzCt.js → direct-engine-DdrQKpgq-B5zIoeQw.js} +1 -1
- package/dist/client/assets/dist-B3HdUPsK.js +1 -0
- package/dist/client/assets/{dist-Tw-Fxpeb.js → dist-B7XMN9AT.js} +1 -1
- package/dist/client/assets/dist-BIRygGYH.js +1 -0
- package/dist/client/assets/dist-BPyOlNLY.js +2 -0
- package/dist/client/assets/{dist-D5wCC32z.js → dist-BR81yxMt.js} +1 -1
- package/dist/client/assets/{dist-Bw3VIE_v.js → dist-B_B4XLmq.js} +1 -1
- package/dist/client/assets/dist-Bdy9ZRzd.js +9 -0
- package/dist/client/assets/{dist-netZOQtD.js → dist-Bfxzlnrf.js} +1 -1
- package/dist/client/assets/{dist-CietwTVS.js → dist-Bx3QkS-3.js} +1 -1
- package/dist/client/assets/{dist-mj2Ht75J.js → dist-By7ieqAf.js} +1 -1
- package/dist/client/assets/dist-ByhQbe-x.js +1 -0
- package/dist/client/assets/{dist-CdmKGRGr.js → dist-BzFSJM0U.js} +1 -1
- package/dist/client/assets/dist-C5NkYKAa.js +1 -0
- package/dist/client/assets/{dist-D3fehAZ2.js → dist-CELhfKzh.js} +1 -1
- package/dist/client/assets/dist-CEirJSxk.js +1 -0
- package/dist/client/assets/dist-CO0-4CuV.js +39 -0
- package/dist/client/assets/dist-CRnJ0D9h.js +1 -0
- package/dist/client/assets/{dist-DDUn5zTz.js → dist-CbDyXgCo.js} +1 -1
- package/dist/client/assets/{dist-BeajGMhO.js → dist-CqXVyYoH.js} +1 -1
- package/dist/client/assets/{dist-LQ4kDCKz.js → dist-CrWzIWEE.js} +1 -1
- package/dist/client/assets/dist-CyNrloSI.js +1 -0
- package/dist/client/assets/dist-D60_kdpQ.js +1 -0
- package/dist/client/assets/{dist-DuH3ZrHo.js → dist-DCpIH3-_.js} +1 -1
- package/dist/client/assets/{dist-BPHLJ09L.js → dist-DJAMplZI.js} +2 -2
- package/dist/client/assets/{dist-DGEbEfw4.js → dist-DVXzbeDx.js} +1 -1
- package/dist/client/assets/{dist-C5NgpdG5.js → dist-Drv_wZYC.js} +1 -1
- package/dist/client/assets/{dist-DVy5woUy.js → dist-EWJYvBK1.js} +1 -1
- package/dist/client/assets/dist-Hdhj3L3t.js +1 -0
- package/dist/client/assets/{dist-B_yQaEv_.js → dist-gRRhmB-2.js} +3 -3
- package/dist/client/assets/dist-kWb2d1CH.js +1 -0
- package/dist/client/assets/dist-kiD2GIsD.js +13 -0
- package/dist/client/assets/dist-l-56SowH.js +19 -0
- package/dist/client/assets/{dist-BK9QvQrc.js → dist-nxQErAaK.js} +2 -2
- package/dist/client/assets/dist-sLzRQQk7.js +1 -0
- package/dist/client/assets/{document-formatter-Dxl_a8XO.js → document-formatter-Qdiq9uJs.js} +1 -2
- package/dist/client/assets/drawioEditor-CHf1vtdQ.js +9 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-UJ0Fz5ci.js +1 -0
- package/dist/client/assets/editor-session-4Bn81iWm.js +14 -0
- package/dist/client/assets/el-GR-TYQHVGXW-Dx82YYAS.js +7 -0
- package/dist/client/assets/embedded-editor-base-jK221GC8.css +1 -0
- package/dist/client/assets/{embedpdf-DA4bA119-BPqZxwjc.js → embedpdf-DA4bA119-E8wZ11J2.js} +2 -3
- package/dist/client/assets/{embedpdf-BmE13ZZ0.js → embedpdf-LUXDBD3-.js} +1 -1
- package/dist/client/assets/{en-SJ2YIMFF-CJBL3nkq.js → en-2RFA324Y-BsuNJTcL.js} +1 -1
- package/dist/client/assets/{erDiagram-SSCWMZ5O-C-iy6VkX.js → erDiagram-RLTQ6QDP-CWrH1UJ9.js} +2 -2
- package/dist/client/assets/es-ES-JEUOREKJ-Rx0NUQDl.js +12 -0
- package/dist/client/assets/eu-ES-SO5DEEAN-CDYm-BcK.js +8 -0
- package/dist/client/assets/excalidraw-element-link-iA6zo0_f.js +7 -0
- package/dist/client/assets/{excalidraw-scene-BOben2gr.js → excalidraw-scene-6uROebca.js} +1 -1
- package/dist/client/assets/{excalidraw-editor-BbSbI80a.css → excalidrawEditor-DDE0n1Pk.css} +1 -1
- package/dist/client/assets/excalidrawEditor-WIuguTz7.js +9 -0
- package/dist/client/assets/export-page-AN-wI5p4.js +56 -0
- package/dist/client/assets/exportDocument-B7IagJhQ.css +1 -0
- package/dist/client/assets/exportDocument-B9xNKpQe.js +2 -0
- package/dist/client/assets/fa-IR-FIYUE2GQ-C865Nx3X.js +9 -0
- package/dist/client/assets/fi-FI-REAEF6HQ-BIpjJqIb.js +6 -0
- package/dist/client/assets/flowDiagram-HODETNUW-kb1lUSBo.js +1 -0
- package/dist/client/assets/fr-FR-SUCL7J6B-DGAKE8jH.js +12 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DtKHAbez.js → ganttDiagram-EL5Y4UJY-BBNzDfaV.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-oue8fQ5o.js → gitGraphDiagram-WWUBYQGX-Csf0Dm_1.js} +1 -1
- package/dist/client/assets/gl-ES-KHCSOGVH-DWKh0CMu.js +6 -0
- package/dist/client/assets/he-IL-JYXVXV2Q-zqbcM-4g.js +9 -0
- package/dist/client/assets/hi-IN-BU52H3BO-CY8v6eG9.js +3 -0
- package/dist/client/assets/highlight-theme-CzNkO-IJ.js +1 -0
- package/dist/client/assets/hu-HU-OWADXDQ3-CEl6Udfh.js +3 -0
- package/dist/client/assets/id-ID-EOMR5R3I-CGQwUjoL.js +8 -0
- package/dist/client/assets/image-2QKV3NAF-BUbX0y5Y.js +1 -0
- package/dist/client/assets/index-BAmZnTFV.css +1 -0
- package/dist/client/assets/index-mWiw418b.js +1111 -0
- package/dist/client/assets/{infoDiagram-RXCK75RN-BMzo6KIn.js → infoDiagram-27XIBGKW-Bzy6kCbb.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BIM3h287.js → ishikawaDiagram-5VMMS53U-CRy9vIS5.js} +1 -1
- package/dist/client/assets/it-IT-FC2VTM3L-KTijNcUe.js +12 -0
- package/dist/client/assets/ja-JP-JBNTKYP4-BflWlGhw.js +12 -0
- package/dist/client/assets/{journeyDiagram-EYS64GPL-mF6Lh8O-.js → journeyDiagram-3NMN7TZE-D4ZR_s9J.js} +2 -2
- package/dist/client/assets/kaa-TC3VIB7V-B-xtZfy0.js +1 -0
- package/dist/client/assets/kab-KAB-UOUDSQKM-BmO0O4Y4.js +4 -0
- package/dist/client/assets/{kanban-definition-3QL26DDD-DLN2NyoR.js → kanban-definition-UXKFOSKX-CIDTmu5g.js} +4 -4
- package/dist/client/assets/kk-KZ-P5H2X7YS-CSQFB8IN.js +1 -0
- package/dist/client/assets/{km-KH-PCWDKPHP-DSmy5shj.js → km-KH-IHMV2US7-BxrjuEzr.js} +4 -4
- package/dist/client/assets/ko-KR-ZTMANIDF-BnNRXd5J.js +5 -0
- package/dist/client/assets/ku-TR-GPJTRB5G-BZM7f2aT.js +6 -0
- package/dist/client/assets/{line-BfTWJmgf.js → line-DSWLHgpx.js} +1 -1
- package/dist/client/assets/lobby-presence-Rdjnc0_0.js +1 -0
- package/dist/client/assets/lt-LT-V3XDOK3P-MVQBOHmF.js +3 -0
- package/dist/client/assets/lv-LV-DVQ3FADO-CrenwAhS.js +4 -0
- package/dist/client/assets/markdown-it-CocJWnjv.js +13 -0
- package/dist/client/assets/mermaid-parser.core-DrdLA3p0.js +3 -0
- package/dist/client/assets/mermaid.core-C_FK-7n4.js +1 -0
- package/dist/client/assets/mermaid.core-D0cMM4Rl.js +10 -0
- package/dist/client/assets/{mindmap-definition-FBJOCRG2-CRyHaHTk.js → mindmap-definition-YA3MSWOX-DO8NB9VH.js} +8 -8
- package/dist/client/assets/mr-IN-VZ6HH5FE-B-PHPglH.js +9 -0
- package/dist/client/assets/my-MM-XYKWHRK6-Be5sYp5q.js +1 -0
- package/dist/client/assets/nb-NO-UNO2GGZJ-BvSKGdja.js +8 -0
- package/dist/client/assets/nl-NL-76EFHT4P-C2yNx1Cj.js +13 -0
- package/dist/client/assets/nn-NO-CFKD7ABE-4NsqlDRP.js +4 -0
- package/dist/client/assets/oc-FR-YBJTCJ3J-B4OTQsWW.js +4 -0
- package/dist/client/assets/pa-IN-SNOXSMRV-CKj_sOG7.js +4 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DS6Ab21R.js +1 -0
- package/dist/client/assets/percentages-Q7USCRWZ-DWE6uvTs.js +1 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-B5OZPb88.js → pieDiagram-E7YTZNPT-BbFe6Tgs.js} +1 -1
- package/dist/client/assets/pl-PL-BSY6YFZ3-CFuzA6L0.js +12 -0
- package/dist/client/assets/preload-helper-CtT0-S4g.js +1 -0
- package/dist/client/assets/preview-render-compiler-C_7J7eia.js +43 -0
- package/dist/client/assets/preview-render-compiler-DzJ1KR_M.js +1 -0
- package/dist/client/assets/preview-render-worker-1DoIDllV.js +59 -0
- package/dist/client/assets/prod-D5TxmmoB.js +1 -0
- package/dist/client/assets/prod-pbFU4TaM.js +145 -0
- package/dist/client/assets/pt-BR-CZDV62R3-CkPMtyNx.js +10 -0
- package/dist/client/assets/pt-PT-JO57XJJW-CBSnfGtF.js +12 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Drrw14YH.js → quadrantDiagram-AXDQQJYC-fJE7iAxt.js} +1 -1
- package/dist/client/assets/quick-switcher-De4PjZFC.css +1 -0
- package/dist/client/assets/quick-switcher-controller-CUajuy78.js +1 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CUQKqbCK.js +1 -0
- package/dist/client/assets/{requirementDiagram-EFPCY7ZU-CRZG6mRB.js → requirementDiagram-BXWQKSXE-Balm0WW8.js} +2 -2
- package/dist/client/assets/ro-RO-UZ5ICYYN-BOuntc_r.js +12 -0
- package/dist/client/assets/room-DX7lIfnu.js +1 -0
- package/dist/client/assets/ru-RU-AN7JPREC-D-ow3SNR.js +10 -0
- package/dist/client/assets/runtime-config-BFVdhnJu.js +1 -0
- package/dist/client/assets/runtime-paths-Cn0snt_9.js +1 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DvarEJpo.js → sankeyDiagram-P5KCCOFB-CcbMqrlQ.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-B4oWlb-w.js → sequenceDiagram-WJ2MYXX4-BL1j3Sn-.js} +6 -6
- package/dist/client/assets/si-LK-7CBLD6QQ-c91EepX0.js +1 -0
- package/dist/client/assets/sk-SK-SWR6DKBI-D5vFMIL6.js +7 -0
- package/dist/client/assets/sl-SI-JRML4FIH-D53L_0S2.js +6 -0
- package/dist/client/assets/{stateDiagram-HBIQ2CUA-qbHIIqRZ.js → stateDiagram-D77RDMKH-DNi924hh.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C62JEwak.js +1 -0
- package/dist/client/assets/sv-SE-4ZPKFFXF-DT-G7RCI.js +12 -0
- package/dist/client/assets/{swimlanes-XN3QIQJK-xB6CtUGj.js → swimlanes-42K2YHIH-ColgjSH4.js} +1 -1
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B9UZhEj4.js +8 -0
- package/dist/client/assets/ta-IN-V6NHHU6Z-D5jy7_AE.js +6 -0
- package/dist/client/assets/th-TH-P7CTMGDK-6sy0NO7K.js +1 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-Lj_yTNlY.js → timeline-definition-24CTP7MA-7pch5JAr.js} +1 -1
- package/dist/client/assets/tr-TR-GUFYG22B-ClVaf8h1.js +4 -0
- package/dist/client/assets/uk-UA-K6SV5NFQ-BLTTtyNB.js +6 -0
- package/dist/client/assets/uz-UZ-TVKTZO2G-Bm02Eg3D.js +1 -0
- package/dist/client/assets/vault-api-client-QjZ_T03l.js +7 -0
- package/dist/client/assets/vault-utils-Bct69Xw2.js +1 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-BekRp5Y0.js → vennDiagram-4TSXK5OY-C5taziCX.js} +1 -1
- package/dist/client/assets/vi-VN-7FKFXJNO-CL3WPhmG.js +7 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-kdnV_Hdm.js → wardleyDiagram-VM6X3IG4-BbSlUwuM.js} +1 -1
- package/dist/client/assets/wiki-link-resolver-C2P_WmTV.js +1 -0
- package/dist/client/assets/{worker-engine-m0rlHn8R-S8mpn_O0.js → worker-engine-m0rlHn8R-eSDcDGEI.js} +1 -1
- package/dist/client/assets/workspace-change-CVA9dVmy.js +1 -0
- package/dist/client/assets/workspace-sync-client-D4nblH_2.js +1 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DufGwNSB.js → xychartDiagram-S5SC5T6Z-D06X1arY.js} +1 -1
- package/dist/client/assets/yjs-B41tM6Sz.js +4 -0
- package/dist/client/assets/yjs-provider-reset-guard-R43MnLNc.js +1 -0
- package/dist/client/assets/zh-CN-AOKVLNNK-DGidDH2b.js +11 -0
- package/dist/client/assets/zh-HK-CDKPF5DC-CRcNR3rk.js +1 -0
- package/dist/client/assets/zh-TW-ZVGYESGW-C7Qji1y6.js +13 -0
- package/dist/client/drawio-editor.html +12 -5
- package/dist/client/excalidraw-editor.html +46 -5
- package/dist/client/export-document.html +6 -8
- package/dist/client/index.html +79 -43
- package/package.json +39 -36
- package/src/client/app/drawio-editor.html +3 -3
- package/src/client/app/excalidraw-editor.html +3 -3
- package/src/client/app/export-document.html +2 -2
- package/src/client/app/index.html +77 -37
- package/src/client/app/main-entry.js +13 -17
- package/src/client/application/app-shell/chat-feature.js +7 -22
- package/src/client/application/app-shell/comments-feature.js +6 -0
- package/src/client/application/app-shell/git-feature.js +23 -5
- package/src/client/application/app-shell/presence-feature.js +8 -25
- package/src/client/application/app-shell/ui-feature-shell.js +172 -149
- package/src/client/application/app-shell/ui-feature-sidebar.js +43 -7
- package/src/client/application/app-shell/ui-feature-tab-activity.js +27 -9
- package/src/client/application/app-shell/ui-feature-toolbar.js +16 -129
- package/src/client/application/app-shell-elements.js +9 -0
- package/src/client/application/highlight-theme.js +16 -0
- package/src/client/application/preview-render-compiler.js +44 -107
- package/src/client/application/preview-render-executor.js +0 -26
- package/src/client/application/preview-render-scheduler.js +8 -24
- package/src/client/application/preview-renderer.js +26 -9
- package/src/client/application/webmcp-diagram-renderer.js +47 -0
- package/src/client/application/workspace-coordinator.js +23 -22
- package/src/client/application/workspace-route-controller.js +7 -0
- package/src/client/bootstrap/collabmd-app-shell.js +148 -35
- package/src/client/bootstrap/lazy-collab-clients.js +90 -0
- package/src/client/domain/excalidraw-element-link.js +73 -0
- package/src/client/domain/excalidraw-scene-reconcile.js +5 -2
- package/src/client/domain/excalidraw-scene.js +21 -0
- package/src/client/domain/hash-routes.js +13 -0
- package/src/client/domain/highlight-runtime.js +47 -0
- package/src/client/domain/lobby-chat.js +2 -0
- package/src/client/domain/room.js +1 -5
- package/src/client/domain/runtime-paths.js +61 -7
- package/src/client/domain/vault-utils.js +11 -0
- package/src/client/excalidraw-editor.js +155 -14
- package/src/client/export/export-host.js +3 -1
- package/src/client/export/export-pipeline.js +4 -17
- package/src/client/infrastructure/agent-connection-api-client.js +23 -0
- package/src/client/infrastructure/auth-client.js +4 -15
- package/src/client/infrastructure/browser-preferences-port.js +16 -0
- package/src/client/infrastructure/editor-session.js +11 -0
- package/src/client/infrastructure/editor-view-adapter.js +56 -8
- package/src/client/infrastructure/excalidraw-room-client.js +89 -2
- package/src/client/infrastructure/git-api-client.js +39 -33
- package/src/client/infrastructure/hosted-api-client.js +60 -0
- package/src/client/infrastructure/lobby-presence.js +4 -7
- package/src/client/infrastructure/runtime-config.js +14 -2
- package/src/client/infrastructure/tab-activity-lock.js +2 -5
- package/src/client/infrastructure/vault-api-client.js +33 -26
- package/src/client/infrastructure/webmcp-tool-registry.js +297 -0
- package/src/client/infrastructure/workspace-sync-client.js +6 -4
- package/src/client/presentation/agent-connection-controller.js +255 -0
- package/src/client/presentation/backlinks-panel.js +3 -0
- package/src/client/presentation/bases-preview-controller.js +27 -18
- package/src/client/presentation/comment-markdown-renderer.js +2 -14
- package/src/client/presentation/comment-overview-controller.js +1 -2
- package/src/client/presentation/comment-ui/comment-ui-card.js +4 -2
- package/src/client/presentation/comment-ui/comment-ui-shared.js +5 -2
- package/src/client/presentation/create-menu-presenter.js +19 -16
- package/src/client/presentation/excalidraw-embed-controller.js +164 -4
- package/src/client/presentation/file-explorer-controller.js +3 -0
- package/src/client/presentation/file-explorer-view.js +338 -182
- package/src/client/presentation/file-history-view-controller.js +13 -11
- package/src/client/presentation/git-diff-view-controller.js +35 -43
- package/src/client/presentation/git-panel-controller.js +78 -28
- package/src/client/presentation/hosted-workspace-gate-controller.js +180 -0
- package/src/client/presentation/image-lightbox-controller.js +20 -16
- package/src/client/presentation/layout-controller.js +13 -2
- package/src/client/presentation/quick-switcher-controller.js +20 -78
- package/src/client/presentation/quick-switcher-text-search.js +10 -14
- package/src/client/presentation/team-settings-controller.js +228 -0
- package/src/client/styles/components/navigation.css +1 -2
- package/src/client/styles/deferred-collab.css +5 -0
- package/src/client/styles/deferred-git.css +7 -0
- package/src/client/styles/deferred-preview.css +6 -0
- package/src/client/styles/features/agent-connection.css +202 -0
- package/src/client/styles/features/collaboration-chat.css +8 -1
- package/src/client/styles/features/collaboration-dialogs.css +16 -1
- package/src/client/styles/features/collaboration-presence.css +17 -4
- package/src/client/styles/features/diagram-preview.css +0 -15
- package/src/client/styles/features/diff-toolbar.css +1 -1
- package/src/client/styles/features/media-lightbox.css +12 -3
- package/src/client/styles/features/outline.css +4 -2
- package/src/client/styles/features/preview-markdown.css +25 -11
- package/src/client/styles/features/quick-switcher.css +20 -11
- package/src/client/styles/features/team-settings.css +162 -0
- package/src/client/styles/foundation/themes.css +2 -0
- package/src/client/styles/foundation/tokens.css +2 -2
- package/src/client/styles/layout/editor-page.css +25 -24
- package/src/client/styles/layout/overlays.css +16 -0
- package/src/client/styles/layout/responsive.css +7 -25
- package/src/client/styles/layout/shell.css +21 -1
- package/src/client/styles/layout/sidebar.css +99 -7
- package/src/client/styles/primitives/controls.css +21 -54
- package/src/client/styles/style.css +4 -19
- package/src/domain/agent-tool-definitions.js +872 -0
- package/src/domain/collabmd-content-capabilities.js +149 -0
- package/src/domain/collaboration-protocol.js +2 -0
- package/src/domain/comment-threads.js +3 -5
- package/src/domain/diagram-source.js +50 -0
- package/src/domain/editable-content-revision.js +10 -0
- package/src/domain/editable-text.js +3 -0
- package/src/domain/exact-text-edits.js +69 -0
- package/src/domain/excalidraw-agent-scene.js +624 -0
- package/src/domain/excalidraw-agent-verification.js +554 -0
- package/src/domain/excalidraw-room-codec.js +13 -6
- package/src/domain/literal-text-search.js +13 -0
- package/src/domain/video-embed.js +76 -0
- package/src/server/application/agent-connection-service.js +178 -0
- package/src/server/application/agent-content-service.js +841 -0
- package/src/server/application/workspace-reconciliation.js +5 -7
- package/src/server/config/env.js +147 -6
- package/src/server/create-app-server.js +47 -141
- package/src/server/domain/bases/base-query-service.js +1 -5
- package/src/server/domain/collaboration/collaboration-room.js +121 -25
- package/src/server/domain/collaboration/protocol.js +4 -0
- package/src/server/domain/hosted-workspace.js +31 -1
- package/src/server/domain/markdown-reference-extractor.js +15 -1
- package/src/server/domain/ripgrep-search-service.js +68 -21
- package/src/server/infrastructure/git/git-service.js +19 -1
- package/src/server/infrastructure/git/history-service.js +1 -1
- package/src/server/infrastructure/git/local-exclude.js +37 -0
- package/src/server/infrastructure/git/parsers.js +19 -17
- package/src/server/infrastructure/git/path-utils.js +0 -16
- package/src/server/infrastructure/git/status-service.js +1 -1
- package/src/server/infrastructure/git/untracked-files.js +12 -21
- package/src/server/infrastructure/http/create-agent-api-handler.js +171 -0
- package/src/server/infrastructure/http/create-git-api-command-handler.js +32 -0
- package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -0
- package/src/server/infrastructure/http/create-request-handler.js +123 -26
- package/src/server/infrastructure/http/create-static-handler.js +9 -0
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +15 -2
- package/src/server/infrastructure/mcp/create-agent-mcp-handler.js +200 -0
- package/src/server/infrastructure/persistence/agent-connection-store.js +120 -0
- package/src/server/infrastructure/persistence/pull-backup-store.js +2 -27
- package/src/server/infrastructure/persistence/sidecar-store.js +12 -5
- package/src/server/infrastructure/persistence/vault-file-store.js +11 -5
- package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +48 -22
- package/src/server/shared/agent-tool-image.js +22 -0
- package/src/server/shared/agent-tool-rate-limiter.js +27 -0
- package/src/server/startup/git-remote-bootstrap.js +58 -79
- package/src/server/vault-registry.js +251 -0
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-BPH4FJkv.js +0 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-BNDLzJ7L.js +0 -1
- package/dist/client/assets/ar-SA-PQUY64WN-xjXgbW6d.js +0 -10
- package/dist/client/assets/az-AZ-OXJXL76K-4JkO4Pca.js +0 -1
- package/dist/client/assets/base-CaIEJUF9.css +0 -1
- package/dist/client/assets/bg-BG-W2GKIJDF-DnkH_o81.js +0 -5
- package/dist/client/assets/bn-BD-TGL7M4PJ-CG4JkmtP.js +0 -3
- package/dist/client/assets/bn-IN-BKETKYEH-CG4JkmtP.js +0 -3
- package/dist/client/assets/browser-utils--H_DkyEF.js +0 -1
- package/dist/client/assets/ca-ES-LD5SCRVV-U6_TVMX9.js +0 -8
- package/dist/client/assets/channel-CaoKA_We.js +0 -1
- package/dist/client/assets/chunk-7XWMRXBY-CfMzEq80.js +0 -1
- package/dist/client/assets/chunk-CKBBP62Z-DG26UiBv.js +0 -2
- package/dist/client/assets/chunk-DSNCTWBM-8xkug7fQ.js +0 -2
- package/dist/client/assets/chunk-DU6HZSFF-COXDzJK1.js +0 -127
- package/dist/client/assets/chunk-R7TYR2AO-CTd0Yj98.js +0 -10
- package/dist/client/assets/chunk-RM4UPSZO-CWRwxNWJ.js +0 -41
- package/dist/client/assets/classDiagram-DTDB5LWJ-7fEmn0zV.js +0 -1
- package/dist/client/assets/classDiagram-v2-JRS7N3AN-7fEmn0zV.js +0 -1
- package/dist/client/assets/comment-thread-store-CdcwrObc.js +0 -1
- package/dist/client/assets/comment-threads-9J6Em-_y.js +0 -4
- package/dist/client/assets/comment-ui-shared-DuoyznXW.js +0 -7
- package/dist/client/assets/cs-CZ-OFPU5DBV-BmFAIhqX.js +0 -7
- package/dist/client/assets/da-DK-FRDJFYWF-H387Jw8B.js +0 -2
- package/dist/client/assets/de-CH-ZG7H3QK3-C_groygo.js +0 -11
- package/dist/client/assets/de-DE-SIJYH4IH-C_groygo.js +0 -11
- package/dist/client/assets/diagram-VSXAHHWV-CQRVEZR7.js +0 -3
- package/dist/client/assets/dist-73RPdcyU.js +0 -1
- package/dist/client/assets/dist-BJ1bJs33.js +0 -1
- package/dist/client/assets/dist-ByrG2qBA.js +0 -1
- package/dist/client/assets/dist-CH-sQu3r.js +0 -1
- package/dist/client/assets/dist-CKS_-are.js +0 -1
- package/dist/client/assets/dist-D37Hyu3h.js +0 -9
- package/dist/client/assets/dist-DZAAWTG-.js +0 -1
- package/dist/client/assets/dist-Dir5dDKZ.js +0 -1
- package/dist/client/assets/dist-Dl_tpDSr.js +0 -1
- package/dist/client/assets/dist-DutPuFmC.js +0 -1
- package/dist/client/assets/dist-RKBTaQMb.js +0 -13
- package/dist/client/assets/dist-eBx8q6Sy.js +0 -1
- package/dist/client/assets/drawio-editor-BVaNNtYp.js +0 -9
- package/dist/client/assets/drawioEditor-BkIBlXx0.js +0 -2
- package/dist/client/assets/ebnfDiagram-PWID7BFC-OXa8VEp1.js +0 -1
- package/dist/client/assets/editor-session-DMyVdHLj.js +0 -54
- package/dist/client/assets/el-GR-IEE2CGI2-BkT6YT54.js +0 -7
- package/dist/client/assets/embedded-editor-base-B3l6Xy65.css +0 -1
- package/dist/client/assets/es-ES-TVVPWKV5-CpPKJXTM.js +0 -12
- package/dist/client/assets/eu-ES-CGBMFQDT-Bu3N2493.js +0 -8
- package/dist/client/assets/excalidraw-editor-BjYaNEMY.js +0 -9
- package/dist/client/assets/excalidraw-mermaid-stub-BNckbX2n.js +0 -1
- package/dist/client/assets/excalidraw-mermaid-stub-DE5FTiZB.js +0 -1
- package/dist/client/assets/excalidrawEditor-ChqF_d82.js +0 -2
- package/dist/client/assets/export-page-Dyu0XCbu.js +0 -57
- package/dist/client/assets/exportDocument-CJBx4Xjx.css +0 -1
- package/dist/client/assets/exportDocument-Dgvfa2Sd.js +0 -2
- package/dist/client/assets/fa-IR-IE6XAPR4-BEvLCORD.js +0 -9
- package/dist/client/assets/fi-FI-P7TKNHRM-DI0q8iSX.js +0 -6
- package/dist/client/assets/file-icon-svg-Y_kpF957.js +0 -1
- package/dist/client/assets/flowDiagram-A5DVABFB-CiW1eN8C.js +0 -1
- package/dist/client/assets/fr-FR-QI2XZNT7-y8kXd8LA.js +0 -12
- package/dist/client/assets/gl-ES-TLYCNOZZ-Br-Fhff-.js +0 -6
- package/dist/client/assets/he-IL-ZX43XLGP-qKQq6V9X.js +0 -9
- package/dist/client/assets/hi-IN-UTYRMTUF-DOUcwrDO.js +0 -3
- package/dist/client/assets/hu-HU-AJOSEBW6-FqTyvHlD.js +0 -3
- package/dist/client/assets/id-ID-ETLTVG6C-CQqh3CLS.js +0 -8
- package/dist/client/assets/image-ZVKINSPA-0zXSnE7M.js +0 -1
- package/dist/client/assets/index-CSNIMyOP.css +0 -1
- package/dist/client/assets/index-DG3N2Ps-.js +0 -2
- package/dist/client/assets/it-IT-B4B6TP6L-V-yK3SZz.js +0 -12
- package/dist/client/assets/ja-JP-IYKVURR5-BQKBXRpX.js +0 -12
- package/dist/client/assets/kaa-SE2BUIKX-CZ5kfwPg.js +0 -1
- package/dist/client/assets/kab-KAB-Y3GLKXLR-Do7GWfuN.js +0 -4
- package/dist/client/assets/kk-KZ-ABWUFVOH-BpqVciQz.js +0 -1
- package/dist/client/assets/ko-KR-7JQDXKGM-N42lep78.js +0 -5
- package/dist/client/assets/ku-TR-NAH2Q5B7-K8LLl9fk.js +0 -6
- package/dist/client/assets/lt-LT-VQFYRSNQ-BmOd0ALn.js +0 -3
- package/dist/client/assets/lv-LV-T62VSYUM-B22WdPhp.js +0 -4
- package/dist/client/assets/main-D0wCxpVn.js +0 -903
- package/dist/client/assets/mermaid-parser.core-Bl0efOMt.js +0 -4
- package/dist/client/assets/mermaid.core-BJRLUQZE.js +0 -11
- package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +0 -1
- package/dist/client/assets/mr-IN-V4FHLCJE-XX069tpm.js +0 -9
- package/dist/client/assets/my-MM-E3SQ6E54-cst_-5SB.js +0 -1
- package/dist/client/assets/nb-NO-MLNOFN5H-Bu2URWko.js +0 -8
- package/dist/client/assets/nl-NL-D5L3ZV4M-BqrV0btt.js +0 -13
- package/dist/client/assets/nn-NO-NNHDGPKB-DK-xZaWM.js +0 -4
- package/dist/client/assets/oc-FR-DWCRF55G-BZ5Po5R6.js +0 -4
- package/dist/client/assets/pa-IN-3JSAY44M-BZQSjKrS.js +0 -4
- package/dist/client/assets/pegDiagram-XKGWAZYB-B31fKPR2.js +0 -1
- package/dist/client/assets/percentages-ETZPVQEE-DFxFqXgH.js +0 -1
- package/dist/client/assets/pl-PL-ACURYKP3-qcEOSfCk.js +0 -12
- package/dist/client/assets/preload-helper-HclGiUj8.js +0 -1
- package/dist/client/assets/preview-render-compiler-CrJIooVD.js +0 -35
- package/dist/client/assets/preview-render-compiler-O0JxBVNF.js +0 -1
- package/dist/client/assets/preview-render-profile-B4RWYWHt.js +0 -1
- package/dist/client/assets/preview-render-worker-_QTxqKvP.js +0 -60
- package/dist/client/assets/prod-BiYPMR1i.js +0 -177
- package/dist/client/assets/prod-VxdGZ5Ly.js +0 -1
- package/dist/client/assets/pt-BR-LOX7MLGD-DLueHSyZ.js +0 -10
- package/dist/client/assets/pt-PT-CZ2U2RFQ-BJ-GAEm6.js +0 -12
- package/dist/client/assets/quick-switcher-controller-CaEjEtq_.js +0 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BPifP0MB.js +0 -1
- package/dist/client/assets/ro-RO-2HECL2X6-CJUvKAf0.js +0 -12
- package/dist/client/assets/ru-RU-HAYNXO46-BWSlvTrt.js +0 -10
- package/dist/client/assets/runtime-config-BLrEKVO1.js +0 -1
- package/dist/client/assets/si-LK-W5KNS4H6-DGGCsn7k.js +0 -1
- package/dist/client/assets/sk-SK-7K2CFGDV-CY4uTYgQ.js +0 -7
- package/dist/client/assets/sl-SI-OXV2QZWW-2-weqaBY.js +0 -6
- package/dist/client/assets/stateDiagram-v2-4QOOHH4V-B--gjrit.js +0 -1
- package/dist/client/assets/sv-SE-JTOBZRGL-9-IUtVkO.js +0 -12
- package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DO8XNXEg.js +0 -8
- package/dist/client/assets/ta-IN-KFAVKXGT-gHO6Q_DH.js +0 -6
- package/dist/client/assets/th-TH-VDMSCPDL-BvJuw6PJ.js +0 -1
- package/dist/client/assets/tr-TR-CEZ6GX45-CG6UU3Su.js +0 -4
- package/dist/client/assets/uk-UA-Q3H3OXQC-CSuIg_DY.js +0 -6
- package/dist/client/assets/uz-UZ-NGCSWWPX-mom7rxSP.js +0 -1
- package/dist/client/assets/vault-api-client-BkwdFjx0.js +0 -6
- package/dist/client/assets/vault-utils-DvoSftJT.js +0 -22
- package/dist/client/assets/vi-VN-P3NDEVPS-BB0Fu9ck.js +0 -7
- package/dist/client/assets/yjs-provider-reset-guard-DE0vINDP.js +0 -4
- package/dist/client/assets/zh-CN-SS3O57GA-Bj8wsiMe.js +0 -11
- package/dist/client/assets/zh-HK-LWJT3VCF-DOTquTCh.js +0 -1
- package/dist/client/assets/zh-TW-VJXC72RT-B48PRo-l.js +0 -13
- package/src/client/app/drawio-editor-entry.js +0 -1
- package/src/client/app/excalidraw-editor-entry.js +0 -1
- package/src/client/excalidraw-mermaid-stub.js +0 -7
- package/src/client/main.js +0 -16
- /package/dist/client/assets/{vault-api-client-C3mlS_4N.css → auth-gate-C3mlS_4N.css} +0 -0
- /package/dist/client/assets/{drawio-editor-UQQ8XHou.css → drawioEditor-UQQ8XHou.css} +0 -0
- /package/dist/client/assets/{base-BYODPHdS.js → github.min-DBihDoic.js} +0 -0
- /package/dist/client/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ Throughout this guide, **vault** simply means a regular folder on your computer
|
|
|
26
26
|
|
|
27
27
|
Requirements for the fastest first run:
|
|
28
28
|
|
|
29
|
-
- Node.js
|
|
29
|
+
- Node.js 26 for `npx` and source installs
|
|
30
30
|
- ripgrep for global text search (`rg`; included in the Docker image)
|
|
31
31
|
- Homebrew only if you want the `brew install` path
|
|
32
32
|
|
|
@@ -49,7 +49,7 @@ Tunnel: disabled
|
|
|
49
49
|
Ready for collaboration. Press Ctrl+C to stop.
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
Prefer Homebrew or source install? Jump to [Installation options](
|
|
52
|
+
Prefer Homebrew or source install? Jump to [Installation options](docs/installation.md).
|
|
53
53
|
|
|
54
54
|
## See it in action
|
|
55
55
|
|
|
@@ -66,6 +66,8 @@ Prefer video? [Open the WebM demo](https://raw.githubusercontent.com/andes90/col
|
|
|
66
66
|
- **Realtime collaboration** — multiple people can edit the same file at the same time via Yjs
|
|
67
67
|
- **External edit sync** — changes made from tools like Obsidian or direct file writes are reflected back into open documents and the file explorer
|
|
68
68
|
- **Git review** — review an open file's changes, include them in the next commit, and commit with a message from the browser
|
|
69
|
+
- **Experimental WebMCP workspace access** — supported browser agents can use the same Vault search, read, exact-edit, document-creation, syntax, and Excalidraw tools as remote MCP while acting as the logged-in collaborator
|
|
70
|
+
- **Remote AI agent access** — connect any Streamable HTTP MCP client to search, cite, edit, and create supported Vault Content; protected workspaces use scoped, revocable Agent Connections
|
|
69
71
|
- **File upload** — import multiple supported Markdown, HTML, Base, diagram, image, and PDF files into the vault from the file explorer
|
|
70
72
|
- **Markdown with context** — live preview, wiki-links, backlinks, outline, quick switcher, and scroll sync
|
|
71
73
|
- **Global text search** — search text across supported vault files with ripgrep-backed results grouped by file
|
|
@@ -83,68 +85,6 @@ Prefer video? [Open the WebM demo](https://raw.githubusercontent.com/andes90/col
|
|
|
83
85
|
- Editing notes and diagrams together while keeping everything as plain files on disk
|
|
84
86
|
- Giving browser access to collaborators who do not use your local markdown setup
|
|
85
87
|
|
|
86
|
-
## Installation options
|
|
87
|
-
|
|
88
|
-
### Requirements
|
|
89
|
-
|
|
90
|
-
- macOS, Linux, or Windows (via WSL2)
|
|
91
|
-
- Node.js 24 for `npx` and source installs
|
|
92
|
-
- ripgrep for global text search. Install with `brew install ripgrep` on macOS, `apk add ripgrep` on Alpine, or `apt install ripgrep` on Debian/Ubuntu. Docker images already include it.
|
|
93
|
-
|
|
94
|
-
### Run via npx (Node.js)
|
|
95
|
-
|
|
96
|
-
If you have Node.js installed, you can run CollabMD directly without installing it globally:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
npx collabmd@latest ~/my-vault --no-tunnel
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Open `http://localhost:1234`.
|
|
103
|
-
|
|
104
|
-
### Install with Homebrew
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
brew tap andes90/tap
|
|
108
|
-
brew install collabmd
|
|
109
|
-
collabmd ~/my-vault --no-tunnel
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Or in a single command:
|
|
113
|
-
|
|
114
|
-
```bash
|
|
115
|
-
brew install andes90/tap/collabmd
|
|
116
|
-
collabmd ~/my-vault --no-tunnel
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Open `http://localhost:1234`.
|
|
120
|
-
|
|
121
|
-
### Install from source
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
git clone https://github.com/andes90/collabmd.git
|
|
125
|
-
cd collabmd
|
|
126
|
-
npm install
|
|
127
|
-
npm run build
|
|
128
|
-
npm link # optional: makes `collabmd` available globally
|
|
129
|
-
collabmd ~/my-vault --no-tunnel
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
Open `http://localhost:1234`.
|
|
133
|
-
|
|
134
|
-
For a safer first run, start local-only:
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
collabmd ~/my-vault --no-tunnel
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
If you want to share the session over the internet, protect it first:
|
|
141
|
-
|
|
142
|
-
```bash
|
|
143
|
-
collabmd ~/my-vault --auth password
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
If `cloudflared` is installed, CollabMD starts a quick tunnel by default unless you pass `--no-tunnel`.
|
|
147
|
-
|
|
148
88
|
## Share with a collaborator
|
|
149
89
|
|
|
150
90
|
If you want to share the workspace over the internet, start with password auth:
|
|
@@ -169,8 +109,9 @@ Then share the printed URL and password with your collaborator. If `cloudflared`
|
|
|
169
109
|
|
|
170
110
|
- Single-instance deployment only: collaboration room state is kept in-process and is not shared across replicas
|
|
171
111
|
- `oidc` currently supports Google only
|
|
172
|
-
- Hosted workspace mode
|
|
112
|
+
- Hosted workspace mode now includes a basic Team Settings UI (collaborators, pending invitations, roles, and access history) plus claim, setup, and invitation-acceptance screens; invitation email delivery, GitHub callback redirect polish, and GitHub App checkout/publish wiring are still pending
|
|
173
113
|
- Text-anchored comments support markdown, Mermaid, PlantUML, and Structurizr DSL files. Excalidraw supports element-anchored threads; draw.io comments are not supported
|
|
114
|
+
- WebMCP requires experimental browser support and an active CollabMD tab; for local Chrome testing, enable `chrome://flags/#enable-webmcp-testing`. It uses the browser session rather than an Agent Connection and does not provide remote access, per-agent scopes, delete, rename, attachments, Git, commit, or publish tools
|
|
174
115
|
- Windows use is supported via WSL2 rather than native Windows execution
|
|
175
116
|
|
|
176
117
|
## How it works
|
|
@@ -183,7 +124,7 @@ CollabMD starts a local server, scans the vault, and opens a browser-based edito
|
|
|
183
124
|
|
|
184
125
|
- **File explorer sidebar** — upload, browse, create, rename, and delete `.md`, `.markdown`, `.mdx`, `.html`, `.htm`, `.base`, `.mmd`, `.mermaid`, `.puml`, `.plantuml`, `.dsl`, `.excalidraw`, `.drawio`, `.pdf`, and supported image files plus folders
|
|
185
126
|
- **Live preview** — rendered as you type, with sandboxed static HTML, syntax-highlighted code blocks, public video embeds, plus Mermaid, PlantUML, and Structurizr diagrams
|
|
186
|
-
- **Anchored comments** — add comments from the editor or selected Excalidraw elements, reopen threads in context, and
|
|
127
|
+
- **Anchored comments and diagram links** — add comments from the editor or selected Excalidraw elements, reopen threads in context, and link Excalidraw elements to other vault diagrams with focused navigation
|
|
187
128
|
- **`[[wiki-links]]` + backlinks** — jump between notes and inspect linked mentions
|
|
188
129
|
- **Room chat** — discuss changes without leaving the workspace
|
|
189
130
|
- **Presence + follow mode** — see who is online and follow another collaborator's active cursor
|
|
@@ -203,550 +144,16 @@ Markdown video embeds are opt-in and use standard image syntax such as `![Video]
|
|
|
203
144
|
|
|
204
145
|
Your filesystem is the source of truth. CollabMD reads files from disk, uses Yjs for realtime collaboration, and continuously writes plain text back to disk as you type. External changes from tools like Obsidian, direct file writes, or git-driven file updates are watched and reconciled back into live rooms and the explorer. The file explorer can import multiple supported vault files at once; uploads preserve their names and bytes, reject duplicates, and include PDF files for readonly preview.
|
|
205
146
|
|
|
206
|
-
## Usage
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
collabmd [directory] [options]
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### Arguments
|
|
213
|
-
|
|
214
|
-
| Argument | Description |
|
|
215
|
-
|----------|-------------|
|
|
216
|
-
| `directory` | Path to the vault directory (default: current directory) |
|
|
217
|
-
|
|
218
|
-
### Options
|
|
219
|
-
|
|
220
|
-
| Option | Description | Default |
|
|
221
|
-
|--------|-------------|---------|
|
|
222
|
-
| `-p, --port` | Port to listen on | `1234` |
|
|
223
|
-
| `--host` | Host to bind to | `127.0.0.1` |
|
|
224
|
-
| `--auth` | Auth strategy: `none`, `password`, `oidc` | `none` |
|
|
225
|
-
| `--auth-password` | Password for `--auth password` | generated per run |
|
|
226
|
-
| `--local-plantuml` | Start the bundled local docker-compose PlantUML service | off |
|
|
227
|
-
| `--local-structurizr` | Start the bundled local Structurizr renderer | off |
|
|
228
|
-
| `--no-tunnel` | Don't start Cloudflare Tunnel | tunnel on |
|
|
229
|
-
| `-v, --version` | Show version | |
|
|
230
|
-
| `-h, --help` | Show help | |
|
|
231
|
-
|
|
232
|
-
### Examples
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
# Serve the current directory locally
|
|
236
|
-
collabmd --no-tunnel
|
|
237
|
-
|
|
238
|
-
# Serve a specific vault locally
|
|
239
|
-
collabmd ~/my-vault --no-tunnel
|
|
240
|
-
|
|
241
|
-
# Use a custom port, no tunnel
|
|
242
|
-
collabmd --port 3000 --no-tunnel
|
|
243
|
-
|
|
244
|
-
# Share with collaborators using a generated password
|
|
245
|
-
collabmd --auth password
|
|
246
|
-
|
|
247
|
-
# Require an explicit password
|
|
248
|
-
collabmd --auth password --auth-password "shared-secret"
|
|
249
|
-
|
|
250
|
-
# Use Google OIDC on a stable public domain
|
|
251
|
-
PUBLIC_BASE_URL=https://notes.example.com \
|
|
252
|
-
AUTH_OIDC_CLIENT_ID=your-google-client-id \
|
|
253
|
-
AUTH_OIDC_CLIENT_SECRET=your-google-client-secret \
|
|
254
|
-
collabmd --auth oidc --no-tunnel
|
|
255
|
-
|
|
256
|
-
# Use the local docker-compose PlantUML service
|
|
257
|
-
collabmd --local-plantuml
|
|
258
|
-
|
|
259
|
-
# Use the local Structurizr renderer for .dsl workspaces
|
|
260
|
-
collabmd --local-structurizr
|
|
261
|
-
|
|
262
|
-
# Serve an Obsidian vault
|
|
263
|
-
collabmd ~/Documents/Obsidian/MyVault
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
## Public access
|
|
267
|
-
|
|
268
|
-
CollabMD can optionally expose the session using a [Cloudflare Quick Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/). Since the editor uses same-origin WebSocket routing (`/ws/:file`), the tunnel works for both HTTP and collaboration traffic.
|
|
269
|
-
|
|
270
|
-
If you are exposing the session publicly, `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.
|
|
271
|
-
|
|
272
|
-
To share safely:
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
collabmd ~/my-vault --auth password
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
`cloudflared` is optional. Install it only if you want public tunnel access:
|
|
279
|
-
|
|
280
|
-
- macOS: `brew install cloudflared`
|
|
281
|
-
- Linux/Windows: [official installer](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/)
|
|
282
|
-
|
|
283
|
-
To disable the tunnel:
|
|
284
|
-
|
|
285
|
-
```bash
|
|
286
|
-
collabmd --no-tunnel
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### Google OIDC setup
|
|
290
|
-
|
|
291
|
-
`--auth oidc` uses Google OpenID Connect with the authorization code + PKCE flow.
|
|
292
|
-
|
|
293
|
-
For the full Google Cloud Console walkthrough, including where to create the OAuth client and copy the client ID/client secret, see [docs/google-oidc-setup.md](https://github.com/andes90/collabmd/blob/master/docs/google-oidc-setup.md).
|
|
294
|
-
|
|
295
|
-
Required environment variables:
|
|
296
|
-
|
|
297
|
-
```bash
|
|
298
|
-
PUBLIC_BASE_URL=https://notes.example.com
|
|
299
|
-
AUTH_OIDC_CLIENT_ID=your-google-client-id
|
|
300
|
-
AUTH_OIDC_CLIENT_SECRET=your-google-client-secret
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
In Google Cloud Console, create a Web application OAuth client and register this redirect URI:
|
|
304
|
-
|
|
305
|
-
```text
|
|
306
|
-
https://notes.example.com/api/auth/oidc/callback
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
If you mount the app under a subpath with `BASE_PATH=/collabmd`, the redirect URI becomes:
|
|
310
|
-
|
|
311
|
-
```text
|
|
312
|
-
https://notes.example.com/collabmd/api/auth/oidc/callback
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
Notes:
|
|
316
|
-
|
|
317
|
-
- OIDC requires a stable public URL and is not compatible with ephemeral Cloudflare Quick Tunnel URLs
|
|
318
|
-
- After sign-in, the verified Google name/email become the displayed app identity and the default in-app git commit author
|
|
319
|
-
- Set `AUTH_SESSION_MAX_AGE_MS` to keep the signed-in session valid longer than the default token lifetime
|
|
320
|
-
- You can restrict sign-in to exact users with `AUTH_OIDC_ALLOWED_EMAILS` or entire domains with `AUTH_OIDC_ALLOWED_DOMAINS`
|
|
321
|
-
- The CLI disables the tunnel automatically when `--auth oidc` is active
|
|
322
|
-
|
|
323
|
-
### Single-tenant hosted workspace mode
|
|
324
|
-
|
|
325
|
-
Hosted workspace mode is for manually provisioned, single-tenant deployments: one CollabMD app replica for one team, one workspace, one vault source, and one hosted metadata store. It is not a shared multi-tenant account system.
|
|
326
|
-
|
|
327
|
-
Hosted mode requires Google OIDC:
|
|
328
|
-
|
|
329
|
-
```bash
|
|
330
|
-
AUTH_STRATEGY=oidc
|
|
331
|
-
PUBLIC_BASE_URL=https://notes.example.com
|
|
332
|
-
AUTH_OIDC_CLIENT_ID=your-google-client-id
|
|
333
|
-
AUTH_OIDC_CLIENT_SECRET=your-google-client-secret
|
|
334
|
-
COLLABMD_HOSTED_ENABLED=true
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
The first Team Admin is created through an email-bound workspace claim. Set the intended admin email and a one-time claim token when provisioning the deployment:
|
|
338
|
-
|
|
339
|
-
```bash
|
|
340
|
-
COLLABMD_HOSTED_CLAIM_EMAIL=admin@example.com
|
|
341
|
-
COLLABMD_HOSTED_CLAIM_TOKEN=generated-one-time-secret
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
The claim is seeded into hosted metadata and expires after 7 days. The claimant must sign in with the matching verified Google email. After claim, Team Admins can manage active memberships, pending invitations, roles, and the access audit trail through the hosted API. The first roles are:
|
|
345
|
-
|
|
346
|
-
- `admin` — can manage team access and configure initial workspace setup
|
|
347
|
-
- `collaborator` — can access, edit, and publish changes after setup is complete
|
|
348
|
-
|
|
349
|
-
Hosted metadata is stored in SQLite and defaults to `.collabmd/hosted.sqlite` inside the vault directory. Override it when the metadata store should live on a separate persistent volume:
|
|
350
|
-
|
|
351
|
-
```bash
|
|
352
|
-
COLLABMD_HOSTED_METADATA_DB_PATH=/data/.collabmd/hosted.sqlite
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
Hosted vault-source setup is GitHub-only in the first version and uses a GitHub App installation flow. Configure the GitHub App credentials on the server:
|
|
356
|
-
|
|
357
|
-
```bash
|
|
358
|
-
COLLABMD_GITHUB_APP_ID=123456
|
|
359
|
-
COLLABMD_GITHUB_APP_SLUG=collabmd
|
|
360
|
-
COLLABMD_GITHUB_APP_PRIVATE_KEY_FILE=/run/secrets/collabmd_github_app_private_key.pem
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
`COLLABMD_GITHUB_APP_PRIVATE_KEY` is also supported for environments that inject the private key directly. The Team Admin starts setup, installs the GitHub App, and selects exactly one repository. CollabMD resolves the installation and repository from GitHub, captures the selected repository's default branch as the configured branch, and stores that vault-source metadata in SQLite. The browser does not directly submit trusted repository or installation metadata.
|
|
364
|
-
|
|
365
|
-
Current backend endpoints include:
|
|
366
|
-
|
|
367
|
-
- `GET /api/hosted/status`
|
|
368
|
-
- `POST /api/hosted/claim`
|
|
369
|
-
- `POST /api/hosted/vault-source/github/setup`
|
|
370
|
-
- `GET /api/hosted/vault-source/github/callback`
|
|
371
|
-
- `GET /api/hosted/memberships`
|
|
372
|
-
- `POST /api/hosted/invitations`
|
|
373
|
-
- `POST /api/hosted/invitations/accept`
|
|
374
|
-
- `GET /api/hosted/audit`
|
|
375
|
-
|
|
376
|
-
Until the Team Settings UI and invitation email delivery are added, these are backend integration points rather than a complete hosted onboarding screen.
|
|
377
|
-
|
|
378
|
-
### Draw.io setup
|
|
379
|
-
|
|
380
|
-
CollabMD uses diagrams.net for `.drawio` rendering and editing. By default it points at the hosted embed runtime:
|
|
381
|
-
|
|
382
|
-
```bash
|
|
383
|
-
COLLABMD_DRAWIO_BASE_URL=https://embed.diagrams.net
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
You can also point it at a self-hosted diagrams.net deployment:
|
|
387
|
-
|
|
388
|
-
```bash
|
|
389
|
-
COLLABMD_DRAWIO_BASE_URL=https://drawio.example.com
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
If the draw.io runtime is unavailable, direct `.drawio` file opens fall back to plain XML editing instead of leaving the file inaccessible.
|
|
393
|
-
|
|
394
|
-
You can also configure the tunnel via environment variables:
|
|
395
|
-
|
|
396
|
-
```bash
|
|
397
|
-
TUNNEL_TARGET_PORT=4000 collabmd
|
|
398
|
-
TUNNEL_TARGET_URL=http://127.0.0.1:4000 collabmd
|
|
399
|
-
CLOUDFLARED_EXTRA_ARGS="--loglevel info" collabmd
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
For the full runtime env var reference, see the `Environment variables` details block in the Development section below.
|
|
403
|
-
|
|
404
|
-
## Docker / Coolify deployment
|
|
405
|
-
|
|
406
|
-
Published image: `ghcr.io/andes90/collabmd:latest`
|
|
407
|
-
|
|
408
|
-
From the vault directory:
|
|
409
|
-
|
|
410
|
-
```bash
|
|
411
|
-
docker run --rm -p 1234:1234 -v "$PWD:/data" ghcr.io/andes90/collabmd:latest
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
Open `http://localhost:1234`. The published Docker image includes `ripgrep`, so global text search works without installing extra packages in the container.
|
|
415
|
-
|
|
416
|
-
The container listens on `0.0.0.0:1234` and stores vault files at `/data`.
|
|
417
|
-
|
|
418
|
-
### Kubernetes / Helm
|
|
419
|
-
|
|
420
|
-
CollabMD now includes a Helm chart at [`packaging/helm/collabmd`](./packaging/helm/collabmd).
|
|
421
|
-
|
|
422
|
-
Use it when you want a Kubernetes-native deployment with:
|
|
423
|
-
|
|
424
|
-
- one supported application replica
|
|
425
|
-
- a persistent volume mounted at `/data`
|
|
426
|
-
- optional ingress
|
|
427
|
-
- optional bundled PlantUML
|
|
428
|
-
- secret-backed auth and private git bootstrap settings
|
|
429
|
-
|
|
430
|
-
Quick start:
|
|
431
|
-
|
|
432
|
-
```bash
|
|
433
|
-
helm install collabmd ./packaging/helm/collabmd
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
For examples covering ingress, OIDC, PlantUML, and private git bootstrap, see [packaging/helm/collabmd/README.md](./packaging/helm/collabmd/README.md).
|
|
437
|
-
|
|
438
|
-
To bootstrap `/data` from a private git repository instead, pass the repo URL plus SSH credentials:
|
|
439
|
-
|
|
440
|
-
```bash
|
|
441
|
-
docker run \
|
|
442
|
-
-p 1234:1234 \
|
|
443
|
-
-v /path/to/persistent/vault:/data \
|
|
444
|
-
-e COLLABMD_GIT_REPO_URL=git@github.com:your-org/your-private-vault.git \
|
|
445
|
-
-e COLLABMD_GIT_SSH_PRIVATE_KEY_B64="$(base64 < ~/.ssh/id_ed25519 | tr -d '\n')" \
|
|
446
|
-
-e COLLABMD_GIT_USER_NAME="CollabMD Bot" \
|
|
447
|
-
-e COLLABMD_GIT_USER_EMAIL="bot@example.com" \
|
|
448
|
-
ghcr.io/andes90/collabmd:latest
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
For a full local and Docker test walkthrough, including key generation and deploy-key setup, see [docs/private-git-deployment.md](https://github.com/andes90/collabmd/blob/master/docs/private-git-deployment.md).
|
|
452
|
-
|
|
453
|
-
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.
|
|
454
|
-
|
|
455
|
-
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`.
|
|
456
|
-
|
|
457
|
-
File-based secrets are also supported and take precedence over base64 input:
|
|
458
|
-
|
|
459
|
-
```bash
|
|
460
|
-
docker run \
|
|
461
|
-
-p 1234:1234 \
|
|
462
|
-
-v /path/to/persistent/vault:/data \
|
|
463
|
-
-v ~/.ssh/id_ed25519:/run/secrets/collabmd_git_key:ro \
|
|
464
|
-
-v ~/.ssh/known_hosts:/run/secrets/collabmd_known_hosts:ro \
|
|
465
|
-
-e COLLABMD_GIT_REPO_URL=git@github.com:your-org/your-private-vault.git \
|
|
466
|
-
-e COLLABMD_GIT_SSH_PRIVATE_KEY_FILE=/run/secrets/collabmd_git_key \
|
|
467
|
-
-e COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE=/run/secrets/collabmd_known_hosts \
|
|
468
|
-
-e COLLABMD_GIT_USER_NAME="CollabMD Bot" \
|
|
469
|
-
-e COLLABMD_GIT_USER_EMAIL="bot@example.com" \
|
|
470
|
-
ghcr.io/andes90/collabmd:latest
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
### Local docker-compose with private diagram renderers
|
|
474
|
-
|
|
475
|
-
The included `docker-compose.yml` runs a prebuilt CollabMD image together with local PlantUML and Structurizr containers. PlantUML SVG rendering and Structurizr `workspace.dsl` previews stay on the private Docker network automatically.
|
|
476
|
-
|
|
477
|
-
```bash
|
|
478
|
-
mkdir -p data/vault
|
|
479
|
-
docker compose up
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
Open `http://localhost:1234`.
|
|
483
|
-
|
|
484
|
-
To test Google OIDC locally with the included compose setup, register this redirect URI in Google Cloud Console:
|
|
485
|
-
|
|
486
|
-
```text
|
|
487
|
-
http://localhost:1234/api/auth/oidc/callback
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
Then start compose with the OIDC env vars:
|
|
491
|
-
|
|
492
|
-
```bash
|
|
493
|
-
AUTH_STRATEGY=oidc \
|
|
494
|
-
PUBLIC_BASE_URL=http://localhost:1234 \
|
|
495
|
-
AUTH_OIDC_CLIENT_ID=your-google-client-id \
|
|
496
|
-
AUTH_OIDC_CLIENT_SECRET=your-google-client-secret \
|
|
497
|
-
docker compose up
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
If you change `COLLABMD_HOST_PORT`, update `PUBLIC_BASE_URL` and the Google redirect URI to match that host port.
|
|
501
|
-
|
|
502
|
-
By default, compose uses `COLLABMD_IMAGE=ghcr.io/andes90/collabmd:latest`. If you want to test a local image while developing instead:
|
|
503
|
-
|
|
504
|
-
```bash
|
|
505
|
-
docker build -t collabmd:local .
|
|
506
|
-
COLLABMD_IMAGE=collabmd:local docker compose up
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
The PlantUML container is published on loopback by default at `http://127.0.0.1:18080`, and Structurizr is published at `http://127.0.0.1:19090` for host-based CLI use:
|
|
510
|
-
|
|
511
|
-
```bash
|
|
512
|
-
npm run start:local-plantuml
|
|
513
|
-
|
|
514
|
-
# Start CollabMD with Structurizr DSL support
|
|
515
|
-
npm run start:local-structurizr -- --no-tunnel
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
To use an existing vault on your machine instead of `./data/vault`:
|
|
519
|
-
|
|
520
|
-
```bash
|
|
521
|
-
HOST_VAULT_DIR=/absolute/path/to/vault docker compose up
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
`HOST_VAULT_DIR` controls the host-side bind mount source. The app uses `COLLABMD_VAULT_DIR` for the in-container vault path and defaults that to `/data` in Docker.
|
|
525
|
-
|
|
526
|
-
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.
|
|
527
|
-
|
|
528
|
-
If you want the in-app Git commit action to work inside the container without OIDC, also set `COLLABMD_GIT_USER_NAME` and `COLLABMD_GIT_USER_EMAIL` so CollabMD can configure the checkout identity automatically. With `AUTH_STRATEGY=oidc`, CollabMD uses the signed-in Google identity for each commit instead.
|
|
529
|
-
|
|
530
|
-
To change the host port:
|
|
531
|
-
|
|
532
|
-
```bash
|
|
533
|
-
COLLABMD_HOST_PORT=3000 docker compose up
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
To change the local PlantUML host port used by both `docker compose` and `--local-plantuml`:
|
|
537
|
-
|
|
538
|
-
```bash
|
|
539
|
-
PLANTUML_HOST_PORT=18081 npm run start:local-plantuml
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
Recommended Coolify setup:
|
|
543
|
-
|
|
544
|
-
1. Use the included `Dockerfile`.
|
|
545
|
-
2. Expose port `1234`.
|
|
546
|
-
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.
|
|
547
|
-
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.
|
|
548
|
-
5. Mount `known_hosts` and set `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` if you want strict host verification.
|
|
549
|
-
6. Add a health check for `GET /health` with enough startup grace for the initial clone.
|
|
550
|
-
7. Run a single replica only because room state is in-process and not shared across instances.
|
|
551
|
-
8. Set `BASE_PATH` if the app is mounted under a subpath such as `/collabmd`.
|
|
552
|
-
9. Set `PUBLIC_WS_BASE_URL` only if your WebSocket endpoint differs from the app origin.
|
|
553
|
-
|
|
554
|
-
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`.
|
|
555
|
-
|
|
556
|
-
Health check: `GET /health`
|
|
557
|
-
|
|
558
|
-
## Troubleshooting
|
|
559
|
-
|
|
560
|
-
- `npx collabmd@latest` fails immediately: confirm you are running Node.js 24, which is the supported runtime for source and npm usage
|
|
561
|
-
- The app is reachable only from localhost: pass `--host 0.0.0.0` or set `HOST=0.0.0.0` when you intend to expose it on your network
|
|
562
|
-
- Port `1234` is already in use: pass `--port 3000` or set `PORT` to another free port
|
|
563
|
-
- Tunnel did not start: install `cloudflared`, or pass `--no-tunnel` to stay local-only
|
|
564
|
-
- `--auth oidc` fails on startup: set `PUBLIC_BASE_URL`, `AUTH_OIDC_CLIENT_ID`, and `AUTH_OIDC_CLIENT_SECRET`, and make sure the Google redirect URI matches `/api/auth/oidc/callback`
|
|
565
|
-
- Google login loops back to the auth screen: verify the configured `PUBLIC_BASE_URL` matches the browser URL and that your reverse proxy forwards HTTPS correctly
|
|
566
|
-
- `--local-plantuml` fails: make sure Docker is installed and running, or point `PLANTUML_SERVER_URL` at another PlantUML server
|
|
567
|
-
- Global text search is disabled: install `ripgrep` on the server host and restart CollabMD. Docker images already include `ripgrep`.
|
|
568
|
-
- Private git bootstrap fails on startup: verify `COLLABMD_GIT_REPO_URL` plus either `COLLABMD_GIT_SSH_PRIVATE_KEY_FILE` or `COLLABMD_GIT_SSH_PRIVATE_KEY_B64`
|
|
569
|
-
- WSL2 path issues: run CollabMD against a directory inside your Linux filesystem when possible rather than a mounted Windows path
|
|
570
|
-
|
|
571
|
-
## Development
|
|
572
|
-
|
|
573
|
-
Install dependencies:
|
|
574
|
-
|
|
575
|
-
```bash
|
|
576
|
-
npm install
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
Build and run:
|
|
580
|
-
|
|
581
|
-
```bash
|
|
582
|
-
npm start
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
Open `http://localhost:1234`.
|
|
586
|
-
|
|
587
|
-
Useful commands:
|
|
588
|
-
|
|
589
|
-
```bash
|
|
590
|
-
npm run build # Build the Vite client into dist/client
|
|
591
|
-
npm run check # Syntax check all entry points
|
|
592
|
-
npm run dev:client # Start the Vite dev server with API/WebSocket proxying
|
|
593
|
-
npm run dev:server # Start only the backend server for local frontend development
|
|
594
|
-
npm run start # Build + start server
|
|
595
|
-
npm run start:local-plantuml # Build + start server with local docker-compose PlantUML
|
|
596
|
-
npm run start:local-structurizr # Build + start server with local Structurizr
|
|
597
|
-
npm run start:prod # Start server (expects previous build)
|
|
598
|
-
npm run test # Run unit + e2e tests
|
|
599
|
-
npm run test:unit # Fast Node-based unit tests
|
|
600
|
-
npm run test:e2e # Playwright browser tests
|
|
601
|
-
npm run tunnel # Start only the Cloudflare tunnel
|
|
602
|
-
npm run plantuml:up # Start only the local docker-compose PlantUML service
|
|
603
|
-
npm run plantuml:down # Stop only the local docker-compose PlantUML service
|
|
604
|
-
npm run structurizr:up # Start only the local Structurizr renderer
|
|
605
|
-
npm run structurizr:down # Stop only the local Structurizr renderer
|
|
606
|
-
npm run capture:readme-assets # Regenerate the README screenshot and demo assets
|
|
607
|
-
```
|
|
608
|
-
|
|
609
|
-
## Testing
|
|
610
|
-
|
|
611
|
-
### Unit tests
|
|
612
|
-
|
|
613
|
-
```bash
|
|
614
|
-
npm run test:unit
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
Covers the vault file store, HTTP endpoints, collaboration room behavior, WebSocket integration, and supporting domain logic.
|
|
618
|
-
|
|
619
|
-
### End-to-end tests
|
|
620
|
-
|
|
621
|
-
```bash
|
|
622
|
-
npx playwright install chromium # first time only
|
|
623
|
-
npm run test:e2e
|
|
624
|
-
```
|
|
625
|
-
|
|
626
|
-
Playwright boots the full app against the `test-vault/` directory and verifies the file explorer, editor, preview, collaboration, chat, outline, and scroll sync flows.
|
|
627
|
-
|
|
628
|
-
### All tests
|
|
629
|
-
|
|
630
|
-
```bash
|
|
631
|
-
npm run test
|
|
632
|
-
```
|
|
633
|
-
|
|
634
|
-
<details>
|
|
635
|
-
<summary>Architecture</summary>
|
|
636
|
-
|
|
637
|
-
```text
|
|
638
|
-
bin/
|
|
639
|
-
collabmd.js CLI entry point
|
|
640
|
-
src/
|
|
641
|
-
client/
|
|
642
|
-
app/ Vite-owned HTML entries and browser entry modules
|
|
643
|
-
application/ app orchestration, preview rendering, workspace coordination
|
|
644
|
-
bootstrap/ app-shell composition and startup wiring
|
|
645
|
-
domain/ markdown editing, wiki-link, room, and vault helpers
|
|
646
|
-
infrastructure/ runtime config, auth bootstrap, browser ports, collaborative editor session
|
|
647
|
-
presentation/ file explorer, backlinks, quick switcher, outline, scroll sync, theme, layout
|
|
648
|
-
static/ Vite passthrough assets copied into the built client
|
|
649
|
-
styles/ app CSS
|
|
650
|
-
domain/ shared wiki-link helpers
|
|
651
|
-
server/
|
|
652
|
-
auth/ strategy selection and cookie-backed auth sessions
|
|
653
|
-
config/ environment loading
|
|
654
|
-
domain/ collaboration room model, registry, backlink index, server-side abstractions
|
|
655
|
-
infrastructure/ HTTP handlers, git service, vault file store, PlantUML, WebSocket gateway
|
|
656
|
-
startup/ preflight vault bootstrap, including remote git checkout setup
|
|
657
|
-
dist/
|
|
658
|
-
client/ built client served by the backend and packaged for release
|
|
659
|
-
scripts/
|
|
660
|
-
cloudflare-tunnel.mjs Cloudflare quick tunnel helper
|
|
661
|
-
local-plantuml-compose.mjs
|
|
662
|
-
capture-readme-assets.mjs
|
|
663
|
-
vite.config.mjs Vite multi-page build and dev-server proxy config
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
</details>
|
|
667
|
-
|
|
668
|
-
<details>
|
|
669
|
-
<summary>Environment variables</summary>
|
|
670
|
-
|
|
671
|
-
| Variable | Description | Default |
|
|
672
|
-
|----------|-------------|---------|
|
|
673
|
-
| `HOST` | Bind host | `127.0.0.1` (dev), `0.0.0.0` (prod) |
|
|
674
|
-
| `PORT` | HTTP + WebSocket port | `1234` |
|
|
675
|
-
| `AUTH_STRATEGY` | Auth strategy: `none`, `password`, `oidc` | `none` |
|
|
676
|
-
| `AUTH_PASSWORD` | Shared password for `AUTH_STRATEGY=password` | generated per run |
|
|
677
|
-
| `AUTH_SESSION_COOKIE_NAME` | Session cookie name | `collabmd_auth` |
|
|
678
|
-
| `AUTH_SESSION_SECRET` | Cookie signing secret | generated per run |
|
|
679
|
-
| `AUTH_SESSION_MAX_AGE_MS` | Optional auth session lifetime in milliseconds; when set, cookies persist until that expiry | |
|
|
680
|
-
| `PUBLIC_BASE_URL` | Stable public app origin required for `AUTH_STRATEGY=oidc` | |
|
|
681
|
-
| `AUTH_OIDC_CLIENT_ID` | Google OAuth client ID used for `AUTH_STRATEGY=oidc` | |
|
|
682
|
-
| `AUTH_OIDC_CLIENT_SECRET` | Google OAuth client secret used for `AUTH_STRATEGY=oidc` | |
|
|
683
|
-
| `AUTH_OIDC_ALLOWED_EMAILS` | Comma-separated exact email allowlist for `AUTH_STRATEGY=oidc` | |
|
|
684
|
-
| `AUTH_OIDC_ALLOWED_DOMAINS` | Comma-separated email domain allowlist for `AUTH_STRATEGY=oidc` | |
|
|
685
|
-
| `BASE_PATH` | URL path prefix for subpath deployments | |
|
|
686
|
-
| `COLLABMD_HOSTED_ENABLED` | Enable single-tenant hosted workspace mode; requires `AUTH_STRATEGY=oidc` | `false` |
|
|
687
|
-
| `COLLABMD_HOSTED_METADATA_DB_PATH` | SQLite database path for hosted workspace metadata | `<vault>/.collabmd/hosted.sqlite` |
|
|
688
|
-
| `COLLABMD_HOSTED_CLAIM_EMAIL` | Verified Google email allowed to claim the first Team Admin role | |
|
|
689
|
-
| `COLLABMD_HOSTED_CLAIM_TOKEN` | One-time token required for the first workspace claim | |
|
|
690
|
-
| `COLLABMD_GITHUB_APP_ID` | GitHub App ID used for hosted vault-source setup | |
|
|
691
|
-
| `COLLABMD_GITHUB_APP_SLUG` | GitHub App slug used to build the installation setup URL | |
|
|
692
|
-
| `COLLABMD_GITHUB_APP_PRIVATE_KEY` | GitHub App private key; `\n` escapes are converted to newlines | |
|
|
693
|
-
| `COLLABMD_GITHUB_APP_PRIVATE_KEY_FILE` | File path for the GitHub App private key; used when direct key input is not set | |
|
|
694
|
-
| `COLLABMD_GITHUB_API_BASE_URL` | GitHub API base URL for hosted vault-source setup | `https://api.github.com` |
|
|
695
|
-
| `COLLABMD_GITHUB_HTML_BASE_URL` | GitHub web base URL for installation setup | `https://github.com` |
|
|
696
|
-
| `COLLABMD_GITHUB_SETUP_FLOW_COOKIE_NAME` | Signed cookie name for the GitHub App setup callback flow | `collabmd_github_setup_flow` |
|
|
697
|
-
| `PLANTUML_SERVER_URL` | Upstream PlantUML server base URL used for server-side SVG rendering | `https://www.plantuml.com/plantuml` |
|
|
698
|
-
| `STRUCTURIZR_SERVER_URL` | Structurizr Local-compatible sidecar base URL used for `.dsl` previews | disabled |
|
|
699
|
-
| `COLLABMD_STRUCTURIZR_MIRROR_DIR` | Writable disposable mirror directory passed to Structurizr | `<vault>/.collabmd/structurizr` |
|
|
700
|
-
| `COLLABMD_STRUCTURIZR_TRUSTED_EXECUTABLE_DSL` | Allow Structurizr `!script` and `!plugin` directives; keep false for untrusted vaults | `false` |
|
|
701
|
-
| `COLLABMD_DRAWIO_BASE_URL` | diagrams.net base URL used for `.drawio` viewing and editing | `https://embed.diagrams.net` |
|
|
702
|
-
| `COLLABMD_WIKI_LINK_AUTO_CREATE` | Create missing markdown files when clicking unresolved wiki-links; set to `false` to disable | `true` |
|
|
703
|
-
| `COLLABMD_SEARCH_MAX_FILE_SIZE` | Maximum size of each file considered by global text search; supports bytes or `K`, `M`, and `G` suffixes | `1M` |
|
|
704
|
-
| `COLLABMD_SEARCH_MAX_BUFFER_BYTES` | Maximum ripgrep output buffer for one global text search | `2097152` |
|
|
705
|
-
| `COLLABMD_MAX_PDF_UPLOAD_BYTES` | Maximum size of a PDF upload in bytes; other uploads remain limited to the default 8 MiB request-body limit | `52428800` |
|
|
706
|
-
| `COLLABMD_VAULT_DIR` | Vault directory path | CLI: current directory, server entrypoint: `data/vault`, Docker: `/data` |
|
|
707
|
-
| `COLLABMD_GIT_ENABLED` | Enable or disable git integration in the UI and API | `true` |
|
|
708
|
-
| `COLLABMD_GIT_REPO_URL` | Remote git repository used to bootstrap the vault checkout | |
|
|
709
|
-
| `COLLABMD_GIT_SSH_PRIVATE_KEY_FILE` | SSH private key file path for remote git auth; preferred over base64 input | |
|
|
710
|
-
| `COLLABMD_GIT_SSH_PRIVATE_KEY_B64` | Base64-encoded SSH private key used when no key file path is provided | |
|
|
711
|
-
| `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` | Optional `known_hosts` file path for strict SSH host verification | |
|
|
712
|
-
| `COLLABMD_GIT_USER_NAME` | Fallback git author/committer name for in-app commits when OIDC is not active | |
|
|
713
|
-
| `COLLABMD_GIT_USER_EMAIL` | Fallback git author/committer email for in-app commits when OIDC is not active | |
|
|
714
|
-
| `WS_BASE_PATH` | WebSocket base path | `/ws` |
|
|
715
|
-
| `PUBLIC_WS_BASE_URL` | Public WebSocket URL override for reverse proxies | |
|
|
716
|
-
| `HTTP_KEEP_ALIVE_TIMEOUT_MS` | Keep-alive timeout | `5000` |
|
|
717
|
-
| `HTTP_HEADERS_TIMEOUT_MS` | Header read timeout | `60000` |
|
|
718
|
-
| `HTTP_REQUEST_TIMEOUT_MS` | Request timeout | `30000` |
|
|
719
|
-
| `WS_HEARTBEAT_INTERVAL_MS` | Heartbeat interval for evicting dead clients | `30000` |
|
|
720
|
-
| `WS_ROOM_IDLE_GRACE_MS` | Delay before closing empty collaboration rooms to disk | `15000` |
|
|
721
|
-
| `WS_MAX_BUFFERED_AMOUNT_BYTES` | Max outbound buffer per WebSocket | `16777216` |
|
|
722
|
-
| `WS_MAX_PAYLOAD_BYTES` | Max inbound WebSocket frame | `16777216` |
|
|
723
|
-
| `CLOUDFLARED_BIN` | `cloudflared` binary path | `cloudflared` |
|
|
724
|
-
| `TUNNEL_TARGET_HOST` | Tunnel target host | `127.0.0.1` |
|
|
725
|
-
| `TUNNEL_TARGET_PORT` | Tunnel target port | `1234` |
|
|
726
|
-
| `TUNNEL_TARGET_URL` | Full tunnel target URL override | |
|
|
727
|
-
| `CLOUDFLARED_EXTRA_ARGS` | Extra `cloudflared` flags | |
|
|
728
|
-
|
|
729
|
-
Copy the example file:
|
|
730
|
-
|
|
731
|
-
```bash
|
|
732
|
-
cp .env.example .env
|
|
733
|
-
```
|
|
734
|
-
|
|
735
|
-
</details>
|
|
736
|
-
|
|
737
|
-
## Notes
|
|
738
147
|
|
|
739
|
-
|
|
740
|
-
- 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.
|
|
741
|
-
- If `COLLABMD_GIT_SSH_KNOWN_HOSTS_FILE` is not set, SSH falls back to `StrictHostKeyChecking=accept-new`.
|
|
742
|
-
- External filesystem edits are reconciled back into active rooms and the explorer. Ambiguous watcher bursts still fall back to batched workspace reconciliation.
|
|
743
|
-
- `.obsidian`, `.git`, `.trash`, and `node_modules` directories are ignored.
|
|
744
|
-
- Markdown, HTML, Base, Mermaid, PlantUML, Structurizr DSL, draw.io, Excalidraw, PDF, and image files are tracked by the vault tree; global text search indexes supported text formats.
|
|
745
|
-
- 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.
|
|
746
|
-
- Structurizr previews use a read-only official Local sidecar and a disposable `.collabmd/structurizr` mirror; the authoritative vault is never mounted into the renderer as its data directory.
|
|
747
|
-
- `docker compose up` uses the included local PlantUML and Structurizr services and avoids public diagram renderers by default. The initial git clone may also require a longer health-check grace period than a purely local vault.
|
|
748
|
-
- `collabmd --local-plantuml` and `npm run start:local-plantuml` start the local PlantUML compose service. `collabmd --local-structurizr` starts Structurizr Local against `http://127.0.0.1:${STRUCTURIZR_HOST_PORT:-19090}`.
|
|
148
|
+
## Docs
|
|
749
149
|
|
|
150
|
+
- [Installation](docs/installation.md) — requirements, npx, Homebrew, and source installs
|
|
151
|
+
- [Configuration](docs/configuration.md) — CLI usage and environment variables
|
|
152
|
+
- [Auth and access](docs/auth-and-access.md) — password, Google OIDC, and hosted workspaces
|
|
153
|
+
- [Deployment](docs/deployment.md) — Docker, Coolify, Helm, and private git
|
|
154
|
+
- [AI agents](docs/ai-agents.md) — MCP and WebMCP access
|
|
155
|
+
- [Development](docs/dev/development.md) — architecture, dev commands, and tests
|
|
156
|
+
- [Troubleshooting](docs/troubleshooting.md)
|
|
750
157
|
## License
|
|
751
158
|
|
|
752
159
|
MIT
|