Bunch more stability fixes
1
.playwright-mcp/console-2026-03-23T20-11-48-316Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 567ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/auth/me:0
|
||||||
66
.playwright-mcp/console-2026-03-23T20-11-59-703Z.log
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
[ 156566ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 159562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 162561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 165562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 168561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 171561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 174562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 177561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 180561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 183561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 186561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 189561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 192561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 195561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 198562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 201561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 204561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 207561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 210561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 213562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 216562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 219561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 222561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 225562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 228561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 231562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 234562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 237562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 240390ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 240562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 243562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 246561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 249561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 252562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 255561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 258561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 261562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 264562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 267562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 270562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 273561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 276562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 279563ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 282561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 285562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 288562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 291562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 294562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 297561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 300562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 303561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 306562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 309561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 312562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 315561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 318561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 321561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 324561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 327561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 330562ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 333561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 336561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 339561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 342561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 345561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 348561ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
2
.playwright-mcp/console-2026-03-23T20-18-54-805Z.log
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[ 480462ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 1440463ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
14
.playwright-mcp/console-2026-03-23T20-52-21-821Z.log
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[ 140214ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 143212ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 146211ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 149211ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/upgrade/status:0
|
||||||
|
[ 360382ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 960378ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 1320377ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 1920379ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 2040375ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 2280391ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 2400379ms] [ERROR] Failed to load resource: the server responded with a status of 500 (Internal Server Error) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 3240382ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 4200393ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
|
[ 5160392ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/dashboard/summary:0
|
||||||
2
.playwright-mcp/console-2026-03-23T22-33-26-262Z.log
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[ 616ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:3002/favicon.ico:0
|
||||||
|
[ 628ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/auth/me:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-48-25-770Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 605ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/auth/me:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-50-36-491Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 1538ms] [ERROR] Failed to load resource: the server responded with a status of 400 (Bad Request) @ http://localhost:8091/auth/token/refresh:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-50-56-794Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 32ms] [WARNING] Manifest: property 'start_url' ignored, should be same origin as document. @ data:application/json;base64,eyJuYW1lIjoiR2l0ZWE6IEdpdCB3aXRoIGEgY3VwIG9mIHRlYSIsInNob3J0X25hbWUiOiJHaXRlYTogR2l0IHdpdGggYSBjdXAgb2YgdGVhIiwic3RhcnRfdXJsIjoiaHR0cHM6Ly9naXQuY21saXRlLm9yZy8iLCJpY29ucyI6W3sic3JjIjoiaHR0cHM6Ly9naXQuY21saXRlLm9yZy9hc3NldHMvaW1nL2xvZ28ucG5nIiwidHlwZSI6ImltYWdlL3BuZyIsInNpemVzIjoiNTEyeDUxMiJ9LHsic3JjIjoiaHR0cHM6Ly9naXQuY21saXRlLm9yZy9hc3NldHMvaW1nL2xvZ28uc3ZnIiwidHlwZSI6ImltYWdlL3N2Zyt4bWwiLCJzaXplcyI6IjUxMng1MTIifV19:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-51-07-562Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 871ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5678/rest/login:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-51-37-826Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 343ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/favicon.ico:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-52-05-150Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 238ms] [WARNING] Simple Analytics: Set hostname on localhost:8090. See https://docs.simpleanalytics.com/overwrite-domain-name @ https://scripts.simpleanalyticscdn.com/latest.js:2
|
||||||
5
.playwright-mcp/console-2026-03-23T22-52-17-790Z.log
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[ 967ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/node_modules/vsda/rust/web/vsda_bg.wasm:0
|
||||||
|
[ 969ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/node_modules/vsda/rust/web/vsda.js:0
|
||||||
|
[ 1271ms] [WARNING] The web worker extension host is started in a same-origin iframe! @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:4591
|
||||||
|
[ 1304ms] [WARNING] An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing. @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html?&vscodeWebWorkerExtHostId=2ab26743-4428-4df3-944e-d603e9a82c44:0
|
||||||
|
[ 2145ms] [WARNING] AI generated workspace trust dialog contents not available. @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:4552
|
||||||
11
.playwright-mcp/console-2026-03-23T22-52-56-849Z.log
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[ 5ms] [ERROR] %c ERR color: #f33 [lifecycle] Long running operations during shutdown are unsupported in the web (id: join.disconnectRemote) @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:37
|
||||||
|
[ 6ms] [ERROR] %c ERR color: #f33 [lifecycle] Long running operations during shutdown are unsupported in the web (id: join.chatSessionStore) @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:37
|
||||||
|
[ 7ms] [ERROR] %c ERR color: #f33 [lifecycle] Long running operations during shutdown are unsupported in the web (id: join.chatEditingSession) @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:37
|
||||||
|
[ 27ms] [ERROR] %c ERR color: #f33 Error creating chat editing session content folder vscode-remote:/home/coder/.local/share/code-server/User/workspaceStorage/4a334e63/chatEditingSessions/266a91b3-2e96-499a-bfc1-6d451b72bd57/contents Canceled: Canceled
|
||||||
|
at Object.call (http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:612:1374)
|
||||||
|
at http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:613:2181
|
||||||
|
at async vOt.W (http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:4587:115075)
|
||||||
|
at async vOt.createFolder (http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:4587:114875)
|
||||||
|
at async ice.storeState (http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:2978:15032)
|
||||||
|
at async Promise.all (index 0) @ http://localhost:8888/stable-13ca0e47310505f4ab1ac59e891e9a3c5e5eec04/static/out/vs/code/browser/workbench/workbench.js:37
|
||||||
|
[ 137ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:8025/api/v2/jim:0
|
||||||
1
.playwright-mcp/console-2026-03-23T22-53-09-505Z.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
[ 1014ms] [WARNING] GPS permission denied — enable location access in your browser settings @ http://localhost:3002/src/components/canvass/GPSTracker.tsx:32
|
||||||
2
.playwright-mcp/console-2026-03-23T22-53-56-906Z.log
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[ 600748ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/social/notifications/count:0
|
||||||
|
[ 1560748ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:3002/api/social/notifications/count:0
|
||||||
12
.playwright-mcp/console-2026-03-23T23-20-48-176Z.log
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[ 127ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 127ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3242:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3307:9) @ http://localhost:4003/lander/:3254
|
||||||
|
[ 626262ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 626262ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3212:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3277:9) @ http://localhost:4003/lander/:3224
|
||||||
|
[ 628485ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 628485ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3212:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3277:9) @ http://localhost:4003/lander/:3224
|
||||||
60
.playwright-mcp/console-2026-03-23T23-31-23-226Z.log
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
[ 86ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 87ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3212:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3277:9) @ http://localhost:4003/lander/:3224
|
||||||
|
[ 426459ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 426459ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3213:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3278:9) @ http://localhost:4003/lander/:3225
|
||||||
|
[ 433706ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 433706ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3214:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3279:9) @ http://localhost:4003/lander/:3226
|
||||||
|
[ 436108ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 436108ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3214:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3279:9) @ http://localhost:4003/lander/:3226
|
||||||
|
[ 445396ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 445396ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3237:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3302:9) @ http://localhost:4003/lander/:3249
|
||||||
|
[ 447757ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 447757ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3237:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3302:9) @ http://localhost:4003/lander/:3249
|
||||||
|
[ 455113ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 455113ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3237:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3302:9) @ http://localhost:4003/lander/:3249
|
||||||
|
[ 457733ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 457733ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3237:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3302:9) @ http://localhost:4003/lander/:3249
|
||||||
|
[ 489124ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 489124ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3252:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3317:9) @ http://localhost:4003/lander/:3264
|
||||||
|
[ 491509ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 491509ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3252:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3317:9) @ http://localhost:4003/lander/:3264
|
||||||
|
[ 510185ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 510185ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3257:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3322:9) @ http://localhost:4003/lander/:3269
|
||||||
|
[ 528536ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 528536ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3262:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3327:9) @ http://localhost:4003/lander/:3274
|
||||||
|
[ 530976ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 530976ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3262:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3327:9) @ http://localhost:4003/lander/:3274
|
||||||
|
[ 541596ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 541596ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3322:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3387:9) @ http://localhost:4003/lander/:3334
|
||||||
|
[ 543950ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 543950ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3322:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3387:9) @ http://localhost:4003/lander/:3334
|
||||||
28
.playwright-mcp/console-2026-03-23T23-40-33-067Z.log
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
[ 96ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 97ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3322:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3387:9) @ http://localhost:4003/lander/:3334
|
||||||
|
[ 320202ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 320202ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3335:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3400:9) @ http://localhost:4003/lander/:3347
|
||||||
|
[ 329151ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 329151ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3337:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3402:9) @ http://localhost:4003/lander/:3349
|
||||||
|
[ 331533ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 331533ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3337:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3402:9) @ http://localhost:4003/lander/:3349
|
||||||
|
[ 628619ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 628619ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3337:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3402:9) @ http://localhost:4003/lander/:3349
|
||||||
|
[ 631005ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 631005ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3337:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3402:9) @ http://localhost:4003/lander/:3349
|
||||||
|
[ 633385ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://localhost:4003/lander/search/search_index.json:0
|
||||||
|
[ 633385ms] [ERROR] Search init failed: Error: Failed to load search index
|
||||||
|
at MkDocsSearch.initialize (http://localhost:4003/lander/:3337:41)
|
||||||
|
at async initSearch (http://localhost:4003/lander/:3402:9) @ http://localhost:4003/lander/:3349
|
||||||
BIN
.playwright-mcp/page-2026-03-23T20-13-17-545Z.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
.playwright-mcp/page-2026-03-23T20-19-33-396Z.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
@ -175,14 +175,20 @@ export default function ListmonkPage() {
|
|||||||
|
|
||||||
const { setPageHeader } = useOutletContext<AppOutletContext>();
|
const { setPageHeader } = useOutletContext<AppOutletContext>();
|
||||||
|
|
||||||
|
const buildProxyAuthUrl = useCallback((token: string) => {
|
||||||
|
if (!config) return null;
|
||||||
|
const base = buildServiceUrl(config.listmonkSubdomain, config.domain, config.listmonkPort);
|
||||||
|
return `${base}/auth?token=${encodeURIComponent(token)}`;
|
||||||
|
}, [config]);
|
||||||
|
|
||||||
const loadIframe = useCallback(async () => {
|
const loadIframe = useCallback(async () => {
|
||||||
if (iframeInitialized.current && iframeSrc) return;
|
if (iframeInitialized.current && iframeSrc) return;
|
||||||
setIframeLoading(true);
|
setIframeLoading(true);
|
||||||
setIframeError(null);
|
setIframeError(null);
|
||||||
try {
|
try {
|
||||||
const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url');
|
const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url');
|
||||||
const { port, token } = res.data;
|
const url = buildProxyAuthUrl(res.data.token);
|
||||||
const url = `//${window.location.hostname}:${port}/auth?token=${encodeURIComponent(token)}`;
|
if (!url) throw new Error('Config not loaded');
|
||||||
setIframeSrc(url);
|
setIframeSrc(url);
|
||||||
iframeInitialized.current = true;
|
iframeInitialized.current = true;
|
||||||
} catch {
|
} catch {
|
||||||
@ -190,11 +196,17 @@ export default function ListmonkPage() {
|
|||||||
} finally {
|
} finally {
|
||||||
setIframeLoading(false);
|
setIframeLoading(false);
|
||||||
}
|
}
|
||||||
}, [iframeSrc]);
|
}, [iframeSrc, buildProxyAuthUrl]);
|
||||||
|
|
||||||
const listmonkAdminUrl = config
|
const handleOpenListmonk = useCallback(async () => {
|
||||||
? buildServiceUrl(config.listmonkSubdomain, config.domain, config.listmonkPort)
|
try {
|
||||||
: null;
|
const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url');
|
||||||
|
const url = buildProxyAuthUrl(res.data.token);
|
||||||
|
if (url) window.open(url, '_blank');
|
||||||
|
} catch {
|
||||||
|
message.error('Failed to get Listmonk auth URL');
|
||||||
|
}
|
||||||
|
}, [buildProxyAuthUrl]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setPageHeader({ title: 'Newsletter / Listmonk', fullBleed: activeTab === 'admin' });
|
setPageHeader({ title: 'Newsletter / Listmonk', fullBleed: activeTab === 'admin' });
|
||||||
@ -234,12 +246,11 @@ export default function ListmonkPage() {
|
|||||||
>
|
>
|
||||||
Test Connection
|
Test Connection
|
||||||
</Button>
|
</Button>
|
||||||
{listmonkAdminUrl && (
|
{config && (
|
||||||
<Button
|
<Button
|
||||||
size="small"
|
size="small"
|
||||||
icon={<LinkOutlined />}
|
icon={<LinkOutlined />}
|
||||||
href={listmonkAdminUrl}
|
onClick={handleOpenListmonk}
|
||||||
target="_blank"
|
|
||||||
>
|
>
|
||||||
Open Listmonk
|
Open Listmonk
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@ -83,7 +83,7 @@ router.get(
|
|||||||
miniqrSubdomain: 'qr',
|
miniqrSubdomain: 'qr',
|
||||||
excalidrawSubdomain: 'draw',
|
excalidrawSubdomain: 'draw',
|
||||||
// Listmonk (newsletter platform)
|
// Listmonk (newsletter platform)
|
||||||
listmonkPort: 9001,
|
listmonkPort: env.LISTMONK_PROXY_PORT,
|
||||||
listmonkSubdomain: 'listmonk',
|
listmonkSubdomain: 'listmonk',
|
||||||
// Code Server (web IDE)
|
// Code Server (web IDE)
|
||||||
codeServerPort: env.CODE_SERVER_PORT,
|
codeServerPort: env.CODE_SERVER_PORT,
|
||||||
|
|||||||
|
After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 64 KiB |
@ -112,6 +112,7 @@
|
|||||||
"assets/images/social/docs/phil.png": "ffe46a0052d8c23422f82d91e03a213118869539",
|
"assets/images/social/docs/phil.png": "ffe46a0052d8c23422f82d91e03a213118869539",
|
||||||
"assets/images/social/docs/services/index.png": "9fcf00324266a9f7b58c7b277da2127e8882aa47",
|
"assets/images/social/docs/services/index.png": "9fcf00324266a9f7b58c7b277da2127e8882aa47",
|
||||||
"assets/images/social/docs/troubleshooting/index.png": "b0ffadb8b01b261dfe7dea1b55fe02a3d639b7e7",
|
"assets/images/social/docs/troubleshooting/index.png": "b0ffadb8b01b261dfe7dea1b55fe02a3d639b7e7",
|
||||||
|
"assets/images/social/docs/upgrade-test-canary.png": "3d624f3412465c0f327ac1562675ae45dd30c3ce",
|
||||||
"assets/images/social/docs/user-guide/campaigns.png": "298b1e317e065ba0459d4cd5779ce16a278b3c09",
|
"assets/images/social/docs/user-guide/campaigns.png": "298b1e317e065ba0459d4cd5779ce16a278b3c09",
|
||||||
"assets/images/social/docs/user-guide/donations.png": "a907a64483b99ba1d1b3841a3b5928f1a77d73e4",
|
"assets/images/social/docs/user-guide/donations.png": "a907a64483b99ba1d1b3841a3b5928f1a77d73e4",
|
||||||
"assets/images/social/docs/user-guide/events.png": "b4fed5fb2b288500035a68455b01994710c4aa98",
|
"assets/images/social/docs/user-guide/events.png": "b4fed5fb2b288500035a68455b01994710c4aa98",
|
||||||
@ -149,7 +150,7 @@
|
|||||||
"assets/images/social/services/postgresql.png": "831fb68dd3e01d9a017e59b100aaa8a455c8c112",
|
"assets/images/social/services/postgresql.png": "831fb68dd3e01d9a017e59b100aaa8a455c8c112",
|
||||||
"assets/images/social/services/static-server.png": "f36d527c80adba4bcb7778784683f429acb4ce74",
|
"assets/images/social/services/static-server.png": "f36d527c80adba4bcb7778784683f429acb4ce74",
|
||||||
"assets/images/social/test-2.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83",
|
"assets/images/social/test-2.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83",
|
||||||
"assets/images/social/test-page.png": "af2c353ee377343678a58555726f6ad7d0624488",
|
"assets/images/social/test-page.png": "c9d5751a1f0a4c1341336bb7d00c9bc743d33ef4",
|
||||||
"assets/images/social/test.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83",
|
"assets/images/social/test.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83",
|
||||||
"assets/images/social/testing.png": "f7aaf394b71cbe7084a6afa0e75a324ca59e23d8",
|
"assets/images/social/testing.png": "f7aaf394b71cbe7084a6afa0e75a324ca59e23d8",
|
||||||
"assets/images/social/v1/adv/ansible.png": "cb542ad9a3cc9a869258b3b1353966e1b9616a2b",
|
"assets/images/social/v1/adv/ansible.png": "cb542ad9a3cc9a869258b3b1353966e1b9616a2b",
|
||||||
|
|||||||
BIN
mkdocs/docs/assets/images/screenshots/features/admin-cuts.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 82 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/admin-shifts.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/admin-users.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 298 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/code-server.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/data-quality.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 69 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/email-queue.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 168 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/excalidraw.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/gallery-ads.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/gitea.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 106 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/landing-pages.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/mailhog.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/map-settings.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 82 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/media-library.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/miniqr.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/mkdocs.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/n8n.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/nocodb.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 78 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/products-shop.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 145 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/public-events.png
Normal file
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 254 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/public-home.png
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/public-map.png
Normal file
|
After Width: | Height: | Size: 993 KiB |
|
After Width: | Height: | Size: 87 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/public-shifts.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/public-shop.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 69 KiB |
BIN
mkdocs/docs/assets/images/screenshots/features/sms-dashboard.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 301 KiB |
|
After Width: | Height: | Size: 67 KiB |
@ -2,15 +2,15 @@
|
|||||||
"full_name": "admin/changemaker.lite",
|
"full_name": "admin/changemaker.lite",
|
||||||
"name": "changemaker.lite",
|
"name": "changemaker.lite",
|
||||||
"description": "Changemaker-lite is the current active development branch of Changemaker, focused on streamlining core services. These improvements will be merged into the master branch once ready.",
|
"description": "Changemaker-lite is the current active development branch of Changemaker, focused on streamlining core services. These improvements will be merged into the master branch once ready.",
|
||||||
"html_url": "https://gitea.bnkops.com/admin/changemaker.lite",
|
"html_url": "http://gitea.bnkops.com/admin/changemaker.lite",
|
||||||
"language": "HTML",
|
"language": "HTML",
|
||||||
"stars_count": 0,
|
"stars_count": 0,
|
||||||
"forks_count": 0,
|
"forks_count": 0,
|
||||||
"open_issues_count": 23,
|
"open_issues_count": 0,
|
||||||
"updated_at": "2026-03-10T18:27:08-06:00",
|
"updated_at": "2026-03-23T15:48:06-06:00",
|
||||||
"created_at": "2025-05-28T14:54:59-06:00",
|
"created_at": "2025-05-28T14:54:59-06:00",
|
||||||
"clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git",
|
"clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git",
|
||||||
"ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git",
|
"ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"last_build_update": "2026-03-10T18:27:08-06:00"
|
"last_build_update": "2026-03-23T15:48:06-06:00"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.",
|
"description": "Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.",
|
||||||
"html_url": "https://github.com/anthropics/claude-code",
|
"html_url": "https://github.com/anthropics/claude-code",
|
||||||
"language": "Shell",
|
"language": "Shell",
|
||||||
"stars_count": 77129,
|
"stars_count": 81725,
|
||||||
"forks_count": 6266,
|
"forks_count": 6816,
|
||||||
"open_issues_count": 6171,
|
"open_issues_count": 7445,
|
||||||
"updated_at": "2026-03-12T17:36:34Z",
|
"updated_at": "2026-03-23T23:45:06Z",
|
||||||
"created_at": "2025-02-22T17:41:21Z",
|
"created_at": "2025-02-22T17:41:21Z",
|
||||||
"clone_url": "https://github.com/anthropics/claude-code.git",
|
"clone_url": "https://github.com/anthropics/claude-code.git",
|
||||||
"ssh_url": "git@github.com:anthropics/claude-code.git",
|
"ssh_url": "git@github.com:anthropics/claude-code.git",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"last_build_update": "2026-03-12T07:12:41Z"
|
"last_build_update": "2026-03-20T22:24:50Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "VS Code in the browser",
|
"description": "VS Code in the browser",
|
||||||
"html_url": "https://github.com/coder/code-server",
|
"html_url": "https://github.com/coder/code-server",
|
||||||
"language": "TypeScript",
|
"language": "TypeScript",
|
||||||
"stars_count": 76609,
|
"stars_count": 76802,
|
||||||
"forks_count": 6547,
|
"forks_count": 6567,
|
||||||
"open_issues_count": 172,
|
"open_issues_count": 167,
|
||||||
"updated_at": "2026-03-12T17:13:08Z",
|
"updated_at": "2026-03-23T23:30:09Z",
|
||||||
"created_at": "2019-02-27T16:50:41Z",
|
"created_at": "2019-02-27T16:50:41Z",
|
||||||
"clone_url": "https://github.com/coder/code-server.git",
|
"clone_url": "https://github.com/coder/code-server.git",
|
||||||
"ssh_url": "git@github.com:coder/code-server.git",
|
"ssh_url": "git@github.com:coder/code-server.git",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"last_build_update": "2026-03-11T22:19:15Z"
|
"last_build_update": "2026-03-23T18:50:37Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.",
|
"description": "A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.",
|
||||||
"html_url": "https://github.com/gethomepage/homepage",
|
"html_url": "https://github.com/gethomepage/homepage",
|
||||||
"language": "JavaScript",
|
"language": "JavaScript",
|
||||||
"stars_count": 28865,
|
"stars_count": 29108,
|
||||||
"forks_count": 1813,
|
"forks_count": 1825,
|
||||||
"open_issues_count": 1,
|
"open_issues_count": 1,
|
||||||
"updated_at": "2026-03-12T15:01:15Z",
|
"updated_at": "2026-03-23T22:44:02Z",
|
||||||
"created_at": "2022-08-24T07:29:42Z",
|
"created_at": "2022-08-24T07:29:42Z",
|
||||||
"clone_url": "https://github.com/gethomepage/homepage.git",
|
"clone_url": "https://github.com/gethomepage/homepage.git",
|
||||||
"ssh_url": "git@github.com:gethomepage/homepage.git",
|
"ssh_url": "git@github.com:gethomepage/homepage.git",
|
||||||
"default_branch": "dev",
|
"default_branch": "dev",
|
||||||
"last_build_update": "2026-03-12T12:22:19Z"
|
"last_build_update": "2026-03-23T12:27:34Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD",
|
"description": "Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD",
|
||||||
"html_url": "https://github.com/go-gitea/gitea",
|
"html_url": "https://github.com/go-gitea/gitea",
|
||||||
"language": "Go",
|
"language": "Go",
|
||||||
"stars_count": 54251,
|
"stars_count": 54439,
|
||||||
"forks_count": 6466,
|
"forks_count": 6485,
|
||||||
"open_issues_count": 2853,
|
"open_issues_count": 2870,
|
||||||
"updated_at": "2026-03-12T17:33:45Z",
|
"updated_at": "2026-03-23T23:19:17Z",
|
||||||
"created_at": "2016-11-01T02:13:26Z",
|
"created_at": "2016-11-01T02:13:26Z",
|
||||||
"clone_url": "https://github.com/go-gitea/gitea.git",
|
"clone_url": "https://github.com/go-gitea/gitea.git",
|
||||||
"ssh_url": "git@github.com:go-gitea/gitea.git",
|
"ssh_url": "git@github.com:go-gitea/gitea.git",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"last_build_update": "2026-03-12T08:26:47Z"
|
"last_build_update": "2026-03-23T23:20:24Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard. Single binary app.",
|
"description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard. Single binary app.",
|
||||||
"html_url": "https://github.com/knadh/listmonk",
|
"html_url": "https://github.com/knadh/listmonk",
|
||||||
"language": "Go",
|
"language": "Go",
|
||||||
"stars_count": 19256,
|
"stars_count": 19329,
|
||||||
"forks_count": 1946,
|
"forks_count": 1958,
|
||||||
"open_issues_count": 101,
|
"open_issues_count": 105,
|
||||||
"updated_at": "2026-03-12T16:54:34Z",
|
"updated_at": "2026-03-23T23:36:16Z",
|
||||||
"created_at": "2019-06-26T05:08:39Z",
|
"created_at": "2019-06-26T05:08:39Z",
|
||||||
"clone_url": "https://github.com/knadh/listmonk.git",
|
"clone_url": "https://github.com/knadh/listmonk.git",
|
||||||
"ssh_url": "git@github.com:knadh/listmonk.git",
|
"ssh_url": "git@github.com:knadh/listmonk.git",
|
||||||
"default_branch": "master",
|
"default_branch": "master",
|
||||||
"last_build_update": "2026-03-12T16:54:26Z"
|
"last_build_update": "2026-03-23T11:44:19Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "Create & scan cute qr codes easily \ud83d\udc7e",
|
"description": "Create & scan cute qr codes easily \ud83d\udc7e",
|
||||||
"html_url": "https://github.com/lyqht/mini-qr",
|
"html_url": "https://github.com/lyqht/mini-qr",
|
||||||
"language": "Vue",
|
"language": "Vue",
|
||||||
"stars_count": 1905,
|
"stars_count": 1928,
|
||||||
"forks_count": 241,
|
"forks_count": 243,
|
||||||
"open_issues_count": 19,
|
"open_issues_count": 20,
|
||||||
"updated_at": "2026-03-12T17:06:09Z",
|
"updated_at": "2026-03-23T14:42:50Z",
|
||||||
"created_at": "2023-04-21T14:20:14Z",
|
"created_at": "2023-04-21T14:20:14Z",
|
||||||
"clone_url": "https://github.com/lyqht/mini-qr.git",
|
"clone_url": "https://github.com/lyqht/mini-qr.git",
|
||||||
"ssh_url": "git@github.com:lyqht/mini-qr.git",
|
"ssh_url": "git@github.com:lyqht/mini-qr.git",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"last_build_update": "2026-03-11T14:53:40Z"
|
"last_build_update": "2026-03-13T12:48:04Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.",
|
"description": "Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.",
|
||||||
"html_url": "https://github.com/n8n-io/n8n",
|
"html_url": "https://github.com/n8n-io/n8n",
|
||||||
"language": "TypeScript",
|
"language": "TypeScript",
|
||||||
"stars_count": 178836,
|
"stars_count": 180706,
|
||||||
"forks_count": 55709,
|
"forks_count": 56089,
|
||||||
"open_issues_count": 1414,
|
"open_issues_count": 1433,
|
||||||
"updated_at": "2026-03-12T17:33:04Z",
|
"updated_at": "2026-03-23T23:47:25Z",
|
||||||
"created_at": "2019-06-22T09:24:21Z",
|
"created_at": "2019-06-22T09:24:21Z",
|
||||||
"clone_url": "https://github.com/n8n-io/n8n.git",
|
"clone_url": "https://github.com/n8n-io/n8n.git",
|
||||||
"ssh_url": "git@github.com:n8n-io/n8n.git",
|
"ssh_url": "git@github.com:n8n-io/n8n.git",
|
||||||
"default_branch": "master",
|
"default_branch": "master",
|
||||||
"last_build_update": "2026-03-12T16:48:37Z"
|
"last_build_update": "2026-03-23T22:55:38Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "\ud83d\udd25 \ud83d\udd25 \ud83d\udd25 A Free & Self-hostable Airtable Alternative",
|
"description": "\ud83d\udd25 \ud83d\udd25 \ud83d\udd25 A Free & Self-hostable Airtable Alternative",
|
||||||
"html_url": "https://github.com/nocodb/nocodb",
|
"html_url": "https://github.com/nocodb/nocodb",
|
||||||
"language": "TypeScript",
|
"language": "TypeScript",
|
||||||
"stars_count": 62459,
|
"stars_count": 62544,
|
||||||
"forks_count": 4662,
|
"forks_count": 4679,
|
||||||
"open_issues_count": 636,
|
"open_issues_count": 647,
|
||||||
"updated_at": "2026-03-12T17:22:54Z",
|
"updated_at": "2026-03-23T22:41:15Z",
|
||||||
"created_at": "2017-10-29T18:51:48Z",
|
"created_at": "2017-10-29T18:51:48Z",
|
||||||
"clone_url": "https://github.com/nocodb/nocodb.git",
|
"clone_url": "https://github.com/nocodb/nocodb.git",
|
||||||
"ssh_url": "git@github.com:nocodb/nocodb.git",
|
"ssh_url": "git@github.com:nocodb/nocodb.git",
|
||||||
"default_branch": "develop",
|
"default_branch": "develop",
|
||||||
"last_build_update": "2026-03-12T15:47:46Z"
|
"last_build_update": "2026-03-23T19:39:55Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "Get up and running with Kimi-K2.5, GLM-5, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.",
|
"description": "Get up and running with Kimi-K2.5, GLM-5, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.",
|
||||||
"html_url": "https://github.com/ollama/ollama",
|
"html_url": "https://github.com/ollama/ollama",
|
||||||
"language": "Go",
|
"language": "Go",
|
||||||
"stars_count": 164918,
|
"stars_count": 165968,
|
||||||
"forks_count": 14922,
|
"forks_count": 15121,
|
||||||
"open_issues_count": 2623,
|
"open_issues_count": 2708,
|
||||||
"updated_at": "2026-03-12T17:11:02Z",
|
"updated_at": "2026-03-23T23:47:27Z",
|
||||||
"created_at": "2023-06-26T19:39:32Z",
|
"created_at": "2023-06-26T19:39:32Z",
|
||||||
"clone_url": "https://github.com/ollama/ollama.git",
|
"clone_url": "https://github.com/ollama/ollama.git",
|
||||||
"ssh_url": "git@github.com:ollama/ollama.git",
|
"ssh_url": "git@github.com:ollama/ollama.git",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
"last_build_update": "2026-03-12T08:42:26Z"
|
"last_build_update": "2026-03-23T23:31:24Z"
|
||||||
}
|
}
|
||||||
@ -4,13 +4,13 @@
|
|||||||
"description": "Documentation that simply works",
|
"description": "Documentation that simply works",
|
||||||
"html_url": "https://github.com/squidfunk/mkdocs-material",
|
"html_url": "https://github.com/squidfunk/mkdocs-material",
|
||||||
"language": "Python",
|
"language": "Python",
|
||||||
"stars_count": 26261,
|
"stars_count": 26370,
|
||||||
"forks_count": 4053,
|
"forks_count": 4058,
|
||||||
"open_issues_count": 2,
|
"open_issues_count": 1,
|
||||||
"updated_at": "2026-03-12T17:20:59Z",
|
"updated_at": "2026-03-23T21:42:58Z",
|
||||||
"created_at": "2016-01-28T22:09:23Z",
|
"created_at": "2016-01-28T22:09:23Z",
|
||||||
"clone_url": "https://github.com/squidfunk/mkdocs-material.git",
|
"clone_url": "https://github.com/squidfunk/mkdocs-material.git",
|
||||||
"ssh_url": "git@github.com:squidfunk/mkdocs-material.git",
|
"ssh_url": "git@github.com:squidfunk/mkdocs-material.git",
|
||||||
"default_branch": "master",
|
"default_branch": "master",
|
||||||
"last_build_update": "2026-03-10T15:42:14Z"
|
"last_build_update": "2026-03-22T15:57:47Z"
|
||||||
}
|
}
|
||||||
7
mkdocs/docs/lander.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
template: lander.html
|
||||||
|
hide:
|
||||||
|
- navigation
|
||||||
|
- toc
|
||||||
|
title: "lander"
|
||||||
|
---
|
||||||
7
mkdocs/docs/main.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
template: main.html
|
||||||
|
hide:
|
||||||
|
- navigation
|
||||||
|
- toc
|
||||||
|
title: "main"
|
||||||
|
---
|
||||||
@ -386,6 +386,29 @@
|
|||||||
box-shadow: 0 4px 16px rgba(111, 66, 193, 0.4);
|
box-shadow: 0 4px 16px rgba(111, 66, 193, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn-demo {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.625rem 1.5rem;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--primary-light);
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid var(--primary-light);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all var(--transition);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-demo:hover {
|
||||||
|
background: rgba(139, 92, 246, 0.1);
|
||||||
|
color: var(--primary-light);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 4px 16px rgba(111, 66, 193, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
.btn-secondary {
|
.btn-secondary {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -1167,6 +1190,141 @@
|
|||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ============================================
|
||||||
|
FEATURE NODE — HOVER SCREENSHOT PREVIEW
|
||||||
|
============================================ */
|
||||||
|
.feature-node[data-screenshot] {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-screenshot {
|
||||||
|
max-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 0 -1.5rem;
|
||||||
|
border-radius: 0;
|
||||||
|
transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1), margin-top 0.35s ease, margin-bottom 0.35s ease;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-node:hover .node-screenshot {
|
||||||
|
max-height: 300px;
|
||||||
|
margin-top: 0.75rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-screenshot img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-screenshot-label {
|
||||||
|
padding: 0.3rem 1.5rem;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.4rem;
|
||||||
|
background: rgba(0,0,0,0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="light"] .node-screenshot-label {
|
||||||
|
background: rgba(0,0,0,0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-screenshot-label .screenshot-dot {
|
||||||
|
width: 5px;
|
||||||
|
height: 5px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: var(--success);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* On mobile, hide hover screenshots (touch doesn't hover well) */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.node-screenshot {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================
|
||||||
|
NARRATIVE BRIDGE SECTION
|
||||||
|
============================================ */
|
||||||
|
.narrative-bridge {
|
||||||
|
padding: 4rem 0 2rem;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.narrative-content {
|
||||||
|
max-width: 720px;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
background: rgba(30, 41, 59, 0.85);
|
||||||
|
border: 1px solid rgba(148, 163, 184, 0.1);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
padding: 3rem 2.5rem;
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
-webkit-backdrop-filter: blur(12px);
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="light"] .narrative-content {
|
||||||
|
background: rgba(255, 255, 255, 0.88);
|
||||||
|
border-color: rgba(100, 116, 139, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.narrative-eyebrow {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
color: var(--primary-light);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.narrative-content h2 {
|
||||||
|
font-size: clamp(1.5rem, 3vw, 2.25rem);
|
||||||
|
margin-bottom: 1.25rem;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.narrative-body {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 1.1rem;
|
||||||
|
line-height: 1.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In-feature narrative connectors */
|
||||||
|
.branch-narrative {
|
||||||
|
max-width: 640px;
|
||||||
|
margin: 2rem auto 3rem;
|
||||||
|
text-align: center;
|
||||||
|
padding: 1.5rem 2rem;
|
||||||
|
background: rgba(30, 41, 59, 0.85);
|
||||||
|
border: 1px solid rgba(148, 163, 184, 0.1);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
-webkit-backdrop-filter: blur(12px);
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="light"] .branch-narrative {
|
||||||
|
background: rgba(255, 255, 255, 0.45);
|
||||||
|
border-color: rgba(100, 116, 139, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.branch-narrative p {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: 1.7;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* ============================================
|
/* ============================================
|
||||||
LIVE SITES
|
LIVE SITES
|
||||||
============================================ */
|
============================================ */
|
||||||
@ -1915,6 +2073,7 @@
|
|||||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
|
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
<a href="https://app.cmlite.org" class="btn-demo" target="_blank" rel="noopener">Explore Demo</a>
|
||||||
<a href="#get-started" class="btn-primary">Get Started</a>
|
<a href="#get-started" class="btn-primary">Get Started</a>
|
||||||
<button class="hamburger" id="hamburger" aria-label="Open menu" type="button">
|
<button class="hamburger" id="hamburger" aria-label="Open menu" type="button">
|
||||||
<svg class="icon-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
|
<svg class="icon-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
|
||||||
@ -1935,7 +2094,8 @@
|
|||||||
<a href="#pricing">Pricing</a>
|
<a href="#pricing">Pricing</a>
|
||||||
<a href="/docs/">Documentation</a>
|
<a href="/docs/">Documentation</a>
|
||||||
<a href="https://gitea.bnkops.com/admin/changemaker.lite" target="_blank" rel="noopener">Source Code</a>
|
<a href="https://gitea.bnkops.com/admin/changemaker.lite" target="_blank" rel="noopener">Source Code</a>
|
||||||
<a href="#get-started" class="btn-primary" style="text-align:center; margin-top:1rem;">Get Started</a>
|
<a href="https://app.cmlite.org" class="btn-demo" style="text-align:center; margin-top:0.5rem;" target="_blank" rel="noopener">Explore Demo</a>
|
||||||
|
<a href="#get-started" class="btn-primary" style="text-align:center; margin-top:0.5rem;">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ============================================
|
<!-- ============================================
|
||||||
@ -1964,8 +2124,8 @@
|
|||||||
A <a href="#" class="free-asterisk" id="free-asterisk-link">free*</a> and open source toolkit built for growing political movements.
|
A <a href="#" class="free-asterisk" id="free-asterisk-link">free*</a> and open source toolkit built for growing political movements.
|
||||||
</p>
|
</p>
|
||||||
<div class="hero-cta">
|
<div class="hero-cta">
|
||||||
<a href="mailto:cmlite@bnkops.ca?subject=Request%20to%20Chat%20-%20CMLITE&body=Hi%20CMlite%20Team%2C%20I%20would%20like%20to%20chat!%20Please%20send%20me%20a%20email%20back.%20Cheers%2C%20" class="btn-primary">Schedule a Chat <span aria-hidden="true">→</span></a>
|
<a href="https://app.cmlite.org" class="btn-primary" target="_blank" rel="noopener">Explore the Demo <span aria-hidden="true">→</span></a>
|
||||||
<a href="/docs/" class="btn-secondary">Read the Docs</a>
|
<a href="mailto:cmlite@bnkops.ca?subject=Request%20to%20Chat%20-%20CMLITE&body=Hi%20CMlite%20Team%2C%20I%20would%20like%20to%20chat!%20Please%20send%20me%20a%20email%20back.%20Cheers%2C%20" class="btn-secondary">Schedule a Chat</a>
|
||||||
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2" class="btn-secondary" target="_blank" rel="noopener">Source Code</a>
|
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2" class="btn-secondary" target="_blank" rel="noopener">Source Code</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -2088,6 +2248,21 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- ============================================
|
||||||
|
NARRATIVE BRIDGE — Journey Starts
|
||||||
|
============================================ -->
|
||||||
|
<section class="section narrative-bridge" id="journey">
|
||||||
|
<div class="container">
|
||||||
|
<div class="narrative-content reveal">
|
||||||
|
<p class="narrative-eyebrow">The Journey</p>
|
||||||
|
<h2>What if your entire campaign ran from one place you actually own?</h2>
|
||||||
|
<p class="narrative-body">
|
||||||
|
Imagine a new volunteer walks up to your campaign office. Within minutes, they’re in your team chat, signed up for a canvassing shift, and synced across your map, newsletter, and event calendar — <strong>without creating accounts on five different platforms</strong>. That’s what an integrated, self-hosted stack makes possible. Below is everything you get from day one.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- ============================================
|
<!-- ============================================
|
||||||
FEATURE NETWORK
|
FEATURE NETWORK
|
||||||
============================================ -->
|
============================================ -->
|
||||||
@ -2112,7 +2287,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Campaigns — postal code lookup to find representatives and send advocacy emails</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Campaigns — postal code lookup to find representatives and send advocacy emails</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-listmonk">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-listmonk.png" alt="Listmonk newsletter admin" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Newsletter sync dashboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📬</div>
|
<div class="node-icon">📬</div>
|
||||||
<h4>Listmonk Newsletters</h4>
|
<h4>Listmonk Newsletters</h4>
|
||||||
@ -2120,7 +2296,8 @@
|
|||||||
<p>Full newsletter platform with subscriber management, templates, and analytics. Drop-in replacement for Mailchimp.</p>
|
<p>Full newsletter platform with subscriber management, templates, and analytics. Drop-in replacement for Mailchimp.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Unlimited subscribers</span><span class="node-tag">Templates</span><span class="node-tag">Analytics</span></div>
|
<div class="node-tags"><span class="node-tag">Unlimited subscribers</span><span class="node-tag">Templates</span><span class="node-tag">Analytics</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="influence-campaigns">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/influence-campaigns.png" alt="Advocacy campaign management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Campaign management with tracking</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🎯</div>
|
<div class="node-icon">🎯</div>
|
||||||
<h4>Influence Campaigns</h4>
|
<h4>Influence Campaigns</h4>
|
||||||
@ -2128,7 +2305,8 @@
|
|||||||
<p>Postal code to representative lookup. Automated advocacy emails to elected officials with tracking and response collection.</p>
|
<p>Postal code to representative lookup. Automated advocacy emails to elected officials with tracking and response collection.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Rep lookup</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Tracking</span></div>
|
<div class="node-tags"><span class="node-tag">Rep lookup</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Tracking</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="email-templates">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/email-templates.png" alt="Email template editor" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Visual email template builder</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">✉</div>
|
<div class="node-icon">✉</div>
|
||||||
<h4>Email Templates</h4>
|
<h4>Email Templates</h4>
|
||||||
@ -2136,7 +2314,8 @@
|
|||||||
<p>GrapesJS visual email editor with variable substitution, versioning, and instant preview. Build once, send everywhere.</p>
|
<p>GrapesJS visual email editor with variable substitution, versioning, and instant preview. Build once, send everywhere.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Visual editor</span><span class="node-tag">Variables</span><span class="node-tag">Versioning</span></div>
|
<div class="node-tags"><span class="node-tag">Visual editor</span><span class="node-tag">Variables</span><span class="node-tag">Versioning</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-campaigns">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-campaigns.png" alt="Public response wall" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public campaign page with rep lookup</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">💬</div>
|
<div class="node-icon">💬</div>
|
||||||
<h4>Response Wall</h4>
|
<h4>Response Wall</h4>
|
||||||
@ -2144,7 +2323,8 @@
|
|||||||
<p>Public response collection with moderation, upvoting, and verification. Showcase supporter voices on your campaigns.</p>
|
<p>Public response collection with moderation, upvoting, and verification. Showcase supporter voices on your campaigns.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Moderation</span><span class="node-tag">Upvoting</span><span class="node-tag">Verification</span></div>
|
<div class="node-tags"><span class="node-tag">Moderation</span><span class="node-tag">Upvoting</span><span class="node-tag">Verification</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-dashboard">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-dashboard.png" alt="Admin dashboard with chat widget" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Team chat integrated into admin</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🚀</div>
|
<div class="node-icon">🚀</div>
|
||||||
<h4>Rocket.Chat</h4>
|
<h4>Rocket.Chat</h4>
|
||||||
@ -2152,7 +2332,8 @@
|
|||||||
<p>Self-hosted team chat with SSO integration. Automatic channel notifications for shift signups, canvass sessions, and campaign responses.</p>
|
<p>Self-hosted team chat with SSO integration. Automatic channel notifications for shift signups, canvass sessions, and campaign responses.</p>
|
||||||
<div class="node-tags"><span class="node-tag">SSO</span><span class="node-tag">Channels</span><span class="node-tag">Slack alternative</span></div>
|
<div class="node-tags"><span class="node-tag">SSO</span><span class="node-tag">Channels</span><span class="node-tag">Slack alternative</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="email-queue">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/email-queue.png" alt="Email queue dashboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Async email queue with status tracking</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🔔</div>
|
<div class="node-icon">🔔</div>
|
||||||
<h4>Smart Notifications</h4>
|
<h4>Smart Notifications</h4>
|
||||||
@ -2160,7 +2341,8 @@
|
|||||||
<p>Async notification queue for admin alerts and volunteer feedback. Shift reminders, session summaries, and signup confirmations.</p>
|
<p>Async notification queue for admin alerts and volunteer feedback. Shift reminders, session summaries, and signup confirmations.</p>
|
||||||
<div class="node-tags"><span class="node-tag">BullMQ</span><span class="node-tag">Reminders</span><span class="node-tag">Summaries</span></div>
|
<div class="node-tags"><span class="node-tag">BullMQ</span><span class="node-tag">Reminders</span><span class="node-tag">Summaries</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="sms-dashboard">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/sms-dashboard.png" alt="SMS campaign dashboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> SMS outreach via Termux bridge</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📱</div>
|
<div class="node-icon">📱</div>
|
||||||
<h4>SMS Campaigns</h4>
|
<h4>SMS Campaigns</h4>
|
||||||
@ -2168,7 +2350,8 @@
|
|||||||
<p>Text message outreach via Termux Android bridge. Contact lists, templated campaigns, delivery tracking, response sync, and device health monitoring.</p>
|
<p>Text message outreach via Termux Android bridge. Contact lists, templated campaigns, delivery tracking, response sync, and device health monitoring.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Termux bridge</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Response sync</span></div>
|
<div class="node-tags"><span class="node-tag">Termux bridge</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Response sync</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-dashboard">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-dashboard.png" alt="Admin with floating chat widget" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Floating chat panel in admin</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🗨</div>
|
<div class="node-icon">🗨</div>
|
||||||
<h4>Chat Widget</h4>
|
<h4>Chat Widget</h4>
|
||||||
@ -2193,7 +2376,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Map — interactive Leaflet map with territory cuts, marker clustering, and support levels</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Map — interactive Leaflet map with territory cuts, marker clustering, and support levels</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-map">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-map.png" alt="Interactive Leaflet map" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Full-screen map with cuts and support levels</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🌍</div>
|
<div class="node-icon">🌍</div>
|
||||||
<h4>Interactive Map</h4>
|
<h4>Interactive Map</h4>
|
||||||
@ -2201,7 +2385,8 @@
|
|||||||
<p>Leaflet-powered map with multi-provider geocoding, color-coded markers, cuts overlay, and fullscreen mode.</p>
|
<p>Leaflet-powered map with multi-provider geocoding, color-coded markers, cuts overlay, and fullscreen mode.</p>
|
||||||
<div class="node-tags"><span class="node-tag">6 geocode providers</span><span class="node-tag">Leaflet</span><span class="node-tag">Clustering</span></div>
|
<div class="node-tags"><span class="node-tag">6 geocode providers</span><span class="node-tag">Leaflet</span><span class="node-tag">Clustering</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="volunteer-dashboard">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/volunteer-dashboard.png" alt="GPS canvassing map" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Mobile canvass map with GPS tracking</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🚶</div>
|
<div class="node-icon">🚶</div>
|
||||||
<h4>GPS Canvassing</h4>
|
<h4>GPS Canvassing</h4>
|
||||||
@ -2209,7 +2394,8 @@
|
|||||||
<p>Full-screen mobile canvass map with real-time GPS, walking route algorithm, visit recording, and outcome tracking.</p>
|
<p>Full-screen mobile canvass map with real-time GPS, walking route algorithm, visit recording, and outcome tracking.</p>
|
||||||
<div class="node-tags"><span class="node-tag">GPS tracking</span><span class="node-tag">Walking routes</span><span class="node-tag">Mobile-first</span></div>
|
<div class="node-tags"><span class="node-tag">GPS tracking</span><span class="node-tag">Walking routes</span><span class="node-tag">Mobile-first</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-cuts">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-cuts.png" alt="Polygon cuts editor" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Territory cut management</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">✂</div>
|
<div class="node-icon">✂</div>
|
||||||
<h4>Polygon Cuts</h4>
|
<h4>Polygon Cuts</h4>
|
||||||
@ -2217,7 +2403,8 @@
|
|||||||
<p>Draw geographic boundaries on the map. Assign locations to cuts for organized canvassing territories.</p>
|
<p>Draw geographic boundaries on the map. Assign locations to cuts for organized canvassing territories.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Drawing mode</span><span class="node-tag">Point-in-polygon</span><span class="node-tag">Spatial queries</span></div>
|
<div class="node-tags"><span class="node-tag">Drawing mode</span><span class="node-tag">Point-in-polygon</span><span class="node-tag">Spatial queries</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-shifts">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-shifts.png" alt="Public volunteer shifts" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public shift signup with capacity tracking</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📅</div>
|
<div class="node-icon">📅</div>
|
||||||
<h4>Volunteer Shifts</h4>
|
<h4>Volunteer Shifts</h4>
|
||||||
@ -2225,7 +2412,8 @@
|
|||||||
<p>Shift scheduling with public signup, confirmation emails, cut assignment, and capacity management.</p>
|
<p>Shift scheduling with public signup, confirmation emails, cut assignment, and capacity management.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Public signup</span><span class="node-tag">Email confirm</span><span class="node-tag">Cut assignment</span></div>
|
<div class="node-tags"><span class="node-tag">Public signup</span><span class="node-tag">Email confirm</span><span class="node-tag">Cut assignment</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="data-quality">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/data-quality.png" alt="Walk sheets and data quality" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Data quality dashboard for canvassing</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📋</div>
|
<div class="node-icon">📋</div>
|
||||||
<h4>Walk Sheets</h4>
|
<h4>Walk Sheets</h4>
|
||||||
@ -2233,7 +2421,8 @@
|
|||||||
<p>Printable walk sheet forms with QR codes for each cut. Take the field data offline with printed reports.</p>
|
<p>Printable walk sheet forms with QR codes for each cut. Take the field data offline with printed reports.</p>
|
||||||
<div class="node-tags"><span class="node-tag">QR codes</span><span class="node-tag">Printable</span><span class="node-tag">Cut reports</span></div>
|
<div class="node-tags"><span class="node-tag">QR codes</span><span class="node-tag">Printable</span><span class="node-tag">Cut reports</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-locations">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-locations.png" alt="NAR import and locations" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Location management with NAR import</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🇨🇦</div>
|
<div class="node-icon">🇨🇦</div>
|
||||||
<h4>NAR Import</h4>
|
<h4>NAR Import</h4>
|
||||||
@ -2241,7 +2430,8 @@
|
|||||||
<p>Import Canadian National Address Register data with province/city/postal filtering, coordinate projection, and streaming.</p>
|
<p>Import Canadian National Address Register data with province/city/postal filtering, coordinate projection, and streaming.</p>
|
||||||
<div class="node-tags"><span class="node-tag">2025 format</span><span class="node-tag">Proj4</span><span class="node-tag">Streaming</span></div>
|
<div class="node-tags"><span class="node-tag">2025 format</span><span class="node-tag">Proj4</span><span class="node-tag">Streaming</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-events">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-events.png" alt="Gancio event calendar" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Community calendar with shift sync</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📆</div>
|
<div class="node-icon">📆</div>
|
||||||
<h4>Gancio Events</h4>
|
<h4>Gancio Events</h4>
|
||||||
@ -2252,6 +2442,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Narrative connector -->
|
||||||
|
<div class="branch-narrative reveal">
|
||||||
|
<p>Your message is only as strong as the channels that carry it. Once your team is connected and your territory mapped, you need to <strong>tell your story</strong> — through video, documentation, landing pages, and more.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- ====== BRANCH 3: Content & Media ====== -->
|
<!-- ====== BRANCH 3: Content & Media ====== -->
|
||||||
<div class="branch branch-content" data-branch="content">
|
<div class="branch branch-content" data-branch="content">
|
||||||
<div class="branch-header reveal">
|
<div class="branch-header reveal">
|
||||||
@ -2266,7 +2461,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Media Gallery — browse videos, shorts, photos, and playlists with live chat and reactions</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Media Gallery — browse videos, shorts, photos, and playlists with live chat and reactions</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="media-library">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/media-library.png" alt="Video library" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Video management with metadata</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📹</div>
|
<div class="node-icon">📹</div>
|
||||||
<h4>Video Library</h4>
|
<h4>Video Library</h4>
|
||||||
@ -2274,7 +2470,8 @@
|
|||||||
<p>Upload and manage videos with FFprobe metadata, scheduled publishing, view analytics, emoji reactions, threaded comments, and live chat.</p>
|
<p>Upload and manage videos with FFprobe metadata, scheduled publishing, view analytics, emoji reactions, threaded comments, and live chat.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">Live chat</span><span class="node-tag">Scheduling</span></div>
|
<div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">Live chat</span><span class="node-tag">Scheduling</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="landing-pages">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/landing-pages.png" alt="Landing page builder" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> GrapesJS drag-and-drop page builder</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🎨</div>
|
<div class="node-icon">🎨</div>
|
||||||
<h4>Landing Page Builder</h4>
|
<h4>Landing Page Builder</h4>
|
||||||
@ -2282,7 +2479,8 @@
|
|||||||
<p>GrapesJS drag-and-drop page editor with block library, custom components, and instant public publishing at /p/slug.</p>
|
<p>GrapesJS drag-and-drop page editor with block library, custom components, and instant public publishing at /p/slug.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Drag & drop</span><span class="node-tag">Block library</span><span class="node-tag">Instant publish</span></div>
|
<div class="node-tags"><span class="node-tag">Drag & drop</span><span class="node-tag">Block library</span><span class="node-tag">Instant publish</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="mkdocs">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/mkdocs.png" alt="MkDocs documentation site" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Material-themed documentation site</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📖</div>
|
<div class="node-icon">📖</div>
|
||||||
<h4>MkDocs Documentation</h4>
|
<h4>MkDocs Documentation</h4>
|
||||||
@ -2290,7 +2488,8 @@
|
|||||||
<p>Material-themed docs with full-text search, blog, social cards, and Gitea-backed page comments with anonymous posting and moderation.</p>
|
<p>Material-themed docs with full-text search, blog, social cards, and Gitea-backed page comments with anonymous posting and moderation.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Material theme</span><span class="node-tag">Comments</span><span class="node-tag">Blog</span></div>
|
<div class="node-tags"><span class="node-tag">Material theme</span><span class="node-tag">Comments</span><span class="node-tag">Blog</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="code-server">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/code-server.png" alt="Code Server IDE" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> VS Code in the browser</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">💻</div>
|
<div class="node-icon">💻</div>
|
||||||
<h4>Code Server</h4>
|
<h4>Code Server</h4>
|
||||||
@ -2298,7 +2497,8 @@
|
|||||||
<p>Full VS Code in the browser. Edit configuration, templates, and code from anywhere without SSH.</p>
|
<p>Full VS Code in the browser. Edit configuration, templates, and code from anywhere without SSH.</p>
|
||||||
<div class="node-tags"><span class="node-tag">VS Code</span><span class="node-tag">Browser IDE</span><span class="node-tag">Extensions</span></div>
|
<div class="node-tags"><span class="node-tag">VS Code</span><span class="node-tag">Browser IDE</span><span class="node-tag">Extensions</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="excalidraw">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/excalidraw.png" alt="Excalidraw whiteboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Collaborative whiteboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">✏</div>
|
<div class="node-icon">✏</div>
|
||||||
<h4>Excalidraw Whiteboard</h4>
|
<h4>Excalidraw Whiteboard</h4>
|
||||||
@ -2306,7 +2506,8 @@
|
|||||||
<p>Collaborative diagramming and whiteboard tool. Plan canvassing routes, sketch campaign strategies, and brainstorm as a team.</p>
|
<p>Collaborative diagramming and whiteboard tool. Plan canvassing routes, sketch campaign strategies, and brainstorm as a team.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Collaborative</span><span class="node-tag">Diagrams</span><span class="node-tag">Real-time</span></div>
|
<div class="node-tags"><span class="node-tag">Collaborative</span><span class="node-tag">Diagrams</span><span class="node-tag">Real-time</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="media-analytics">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/media-analytics.png" alt="Media analytics" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Engagement analytics dashboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📷</div>
|
<div class="node-icon">📷</div>
|
||||||
<h4>Photo Management</h4>
|
<h4>Photo Management</h4>
|
||||||
@ -2314,7 +2515,8 @@
|
|||||||
<p>Album organization with bulk uploads, metadata extraction, and engagement tracking. Reactions, comments, and a public photo gallery.</p>
|
<p>Album organization with bulk uploads, metadata extraction, and engagement tracking. Reactions, comments, and a public photo gallery.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Albums</span><span class="node-tag">Engagement</span><span class="node-tag">Gallery</span></div>
|
<div class="node-tags"><span class="node-tag">Albums</span><span class="node-tag">Engagement</span><span class="node-tag">Gallery</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-gallery">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-gallery.png" alt="Public media gallery" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public gallery with categories</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🎵</div>
|
<div class="node-icon">🎵</div>
|
||||||
<h4>Playlists</h4>
|
<h4>Playlists</h4>
|
||||||
@ -2322,7 +2524,8 @@
|
|||||||
<p>Curated video collections with admin, user, and public playlists. Drag-reorder, sidebar navigation, featured carousel, and dedicated viewer page.</p>
|
<p>Curated video collections with admin, user, and public playlists. Drag-reorder, sidebar navigation, featured carousel, and dedicated viewer page.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Curated</span><span class="node-tag">Public/Private</span><span class="node-tag">Reorderable</span></div>
|
<div class="node-tags"><span class="node-tag">Curated</span><span class="node-tag">Public/Private</span><span class="node-tag">Reorderable</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-gallery">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-gallery.png" alt="Shorts video feed" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Video gallery with live chat</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📲</div>
|
<div class="node-icon">📲</div>
|
||||||
<h4>Shorts Feed</h4>
|
<h4>Shorts Feed</h4>
|
||||||
@ -2347,7 +2550,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Homepage — hero section, upcoming shifts, latest videos, and activity feed</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Homepage — hero section, upcoming shifts, latest videos, and activity feed</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="nocodb">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/nocodb.png" alt="NocoDB data browser" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Airtable-alternative data browser</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🗄</div>
|
<div class="node-icon">🗄</div>
|
||||||
<h4>NocoDB</h4>
|
<h4>NocoDB</h4>
|
||||||
@ -2355,7 +2559,8 @@
|
|||||||
<p>Airtable-alternative database browser. Browse, filter, and export your campaign data through a spreadsheet-like interface.</p>
|
<p>Airtable-alternative database browser. Browse, filter, and export your campaign data through a spreadsheet-like interface.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Read-only</span><span class="node-tag">Filters</span><span class="node-tag">Export</span></div>
|
<div class="node-tags"><span class="node-tag">Read-only</span><span class="node-tag">Filters</span><span class="node-tag">Export</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="n8n">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/n8n.png" alt="n8n workflow automation" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Visual workflow automation</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">⚡</div>
|
<div class="node-icon">⚡</div>
|
||||||
<h4>n8n Workflows</h4>
|
<h4>n8n Workflows</h4>
|
||||||
@ -2363,7 +2568,8 @@
|
|||||||
<p>Visual workflow automation. Connect APIs, trigger actions, and build custom integrations without code.</p>
|
<p>Visual workflow automation. Connect APIs, trigger actions, and build custom integrations without code.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Visual builder</span><span class="node-tag">400+ integrations</span><span class="node-tag">Webhooks</span></div>
|
<div class="node-tags"><span class="node-tag">Visual builder</span><span class="node-tag">400+ integrations</span><span class="node-tag">Webhooks</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="gitea">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/gitea.png" alt="Gitea Git hosting" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Self-hosted Git with CI/CD</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📦</div>
|
<div class="node-icon">📦</div>
|
||||||
<h4>Gitea</h4>
|
<h4>Gitea</h4>
|
||||||
@ -2371,7 +2577,8 @@
|
|||||||
<p>Self-hosted Git repository. Version control for your campaign code, configs, and documentation.</p>
|
<p>Self-hosted Git repository. Version control for your campaign code, configs, and documentation.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Git hosting</span><span class="node-tag">Issues</span><span class="node-tag">CI/CD</span></div>
|
<div class="node-tags"><span class="node-tag">Git hosting</span><span class="node-tag">Issues</span><span class="node-tag">CI/CD</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="miniqr">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/miniqr.png" alt="Mini QR generator" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> QR code generator</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📱</div>
|
<div class="node-icon">📱</div>
|
||||||
<h4>Mini QR</h4>
|
<h4>Mini QR</h4>
|
||||||
@ -2379,7 +2586,8 @@
|
|||||||
<p>QR code generator for walk sheets, campaign materials, and event signage. Instant PNG generation.</p>
|
<p>QR code generator for walk sheets, campaign materials, and event signage. Instant PNG generation.</p>
|
||||||
<div class="node-tags"><span class="node-tag">PNG output</span><span class="node-tag">Embeddable</span><span class="node-tag">Public API</span></div>
|
<div class="node-tags"><span class="node-tag">PNG output</span><span class="node-tag">Embeddable</span><span class="node-tag">Public API</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-dashboard">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-dashboard.png" alt="Command palette search" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Ctrl+K global command palette</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">⌘</div>
|
<div class="node-icon">⌘</div>
|
||||||
<h4>Command Palette</h4>
|
<h4>Command Palette</h4>
|
||||||
@ -2387,7 +2595,8 @@
|
|||||||
<p>Global Ctrl+K search across pages, campaigns, locations, users, and settings. Fuzzy matching, recent items, and keyboard-driven navigation.</p>
|
<p>Global Ctrl+K search across pages, campaigns, locations, users, and settings. Fuzzy matching, recent items, and keyboard-driven navigation.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Ctrl+K</span><span class="node-tag">Fuzzy search</span><span class="node-tag">Keyboard-first</span></div>
|
<div class="node-tags"><span class="node-tag">Ctrl+K</span><span class="node-tag">Fuzzy search</span><span class="node-tag">Keyboard-first</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-settings">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-settings.png" alt="Navigation settings" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Organization and nav settings</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">⚙</div>
|
<div class="node-icon">⚙</div>
|
||||||
<h4>Navigation Settings</h4>
|
<h4>Navigation Settings</h4>
|
||||||
@ -2412,7 +2621,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Observability Dashboard — Prometheus metrics, Grafana dashboards, and alert management</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Observability Dashboard — Prometheus metrics, Grafana dashboards, and alert management</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="pangolin-tunnel">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/pangolin-tunnel.png" alt="Pangolin tunnel management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Tunnel management dashboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🌐</div>
|
<div class="node-icon">🌐</div>
|
||||||
<h4>Pangolin Tunnel</h4>
|
<h4>Pangolin Tunnel</h4>
|
||||||
@ -2420,7 +2630,8 @@
|
|||||||
<p>Expose your self-hosted services to the internet without port forwarding. Newt container integration with automatic SSL.</p>
|
<p>Expose your self-hosted services to the internet without port forwarding. Newt container integration with automatic SSL.</p>
|
||||||
<div class="node-tags"><span class="node-tag">No port-forward</span><span class="node-tag">Auto SSL</span><span class="node-tag">Newt</span></div>
|
<div class="node-tags"><span class="node-tag">No port-forward</span><span class="node-tag">Auto SSL</span><span class="node-tag">Newt</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-observability">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-observability.png" alt="Observability dashboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Prometheus + Grafana monitoring</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📈</div>
|
<div class="node-icon">📈</div>
|
||||||
<h4>Prometheus + Grafana</h4>
|
<h4>Prometheus + Grafana</h4>
|
||||||
@ -2428,7 +2639,8 @@
|
|||||||
<p>12 custom metrics, 3 dashboards, alert rules, and service health monitoring. Full observability stack.</p>
|
<p>12 custom metrics, 3 dashboards, alert rules, and service health monitoring. Full observability stack.</p>
|
||||||
<div class="node-tags"><span class="node-tag">12 metrics</span><span class="node-tag">3 dashboards</span><span class="node-tag">Alerts</span></div>
|
<div class="node-tags"><span class="node-tag">12 metrics</span><span class="node-tag">3 dashboards</span><span class="node-tag">Alerts</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-users">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-users.png" alt="User management with RBAC" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Role-based access control</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🔏</div>
|
<div class="node-icon">🔏</div>
|
||||||
<h4>Security Hardened</h4>
|
<h4>Security Hardened</h4>
|
||||||
@ -2436,7 +2648,8 @@
|
|||||||
<p>13-finding security audit addressed. JWT rotation, rate limiting, XSS prevention, encrypted secrets, HSTS headers.</p>
|
<p>13-finding security audit addressed. JWT rotation, rate limiting, XSS prevention, encrypted secrets, HSTS headers.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Audit complete</span><span class="node-tag">RBAC</span><span class="node-tag">Encryption</span></div>
|
<div class="node-tags"><span class="node-tag">Audit complete</span><span class="node-tag">RBAC</span><span class="node-tag">Encryption</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="mailhog">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/mailhog.png" alt="MailHog email capture" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Email testing with MailHog</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">💾</div>
|
<div class="node-icon">💾</div>
|
||||||
<h4>Automated Backups</h4>
|
<h4>Automated Backups</h4>
|
||||||
@ -2444,7 +2657,8 @@
|
|||||||
<p>PostgreSQL dumps, Listmonk data, uploads archive, and optional S3 upload. One-command backup script.</p>
|
<p>PostgreSQL dumps, Listmonk data, uploads archive, and optional S3 upload. One-command backup script.</p>
|
||||||
<div class="node-tags"><span class="node-tag">PostgreSQL</span><span class="node-tag">S3 optional</span><span class="node-tag">Scripted</span></div>
|
<div class="node-tags"><span class="node-tag">PostgreSQL</span><span class="node-tag">S3 optional</span><span class="node-tag">Scripted</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-settings">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-settings.png" alt="Vaultwarden password manager" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Organization security settings</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🔐</div>
|
<div class="node-icon">🔐</div>
|
||||||
<h4>Vaultwarden</h4>
|
<h4>Vaultwarden</h4>
|
||||||
@ -2452,7 +2666,8 @@
|
|||||||
<p>Self-hosted Bitwarden-compatible password manager. Secure credential sharing for your team with real-time sync and browser extensions.</p>
|
<p>Self-hosted Bitwarden-compatible password manager. Secure credential sharing for your team with real-time sync and browser extensions.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Bitwarden</span><span class="node-tag">Team sharing</span><span class="node-tag">Encrypted</span></div>
|
<div class="node-tags"><span class="node-tag">Bitwarden</span><span class="node-tag">Team sharing</span><span class="node-tag">Encrypted</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="admin-users">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-users.png" alt="User provisioning" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Multi-service user provisioning</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">👥</div>
|
<div class="node-icon">👥</div>
|
||||||
<h4>User Provisioning</h4>
|
<h4>User Provisioning</h4>
|
||||||
@ -2463,6 +2678,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Narrative connector -->
|
||||||
|
<div class="branch-narrative reveal">
|
||||||
|
<p>A movement that can’t sustain itself financially will always depend on someone else’s goodwill. <strong>Own your revenue</strong> the same way you own your data — with tools that put every dollar directly into your cause.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- ====== BRANCH 6: Fundraising & Commerce ====== -->
|
<!-- ====== BRANCH 6: Fundraising & Commerce ====== -->
|
||||||
<div class="branch branch-fundraising" data-branch="fundraising">
|
<div class="branch branch-fundraising" data-branch="fundraising">
|
||||||
<div class="branch-header reveal">
|
<div class="branch-header reveal">
|
||||||
@ -2477,7 +2697,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Pricing Plans — subscription tiers with monthly/yearly billing and feature comparison</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Pricing Plans — subscription tiers with monthly/yearly billing and feature comparison</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-donations">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-donations.png" alt="Donation platform" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public donation page</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">💰</div>
|
<div class="node-icon">💰</div>
|
||||||
<h4>Donation Platform</h4>
|
<h4>Donation Platform</h4>
|
||||||
@ -2485,7 +2706,8 @@
|
|||||||
<p>Accept one-time donations with configurable suggested amounts, anonymous giving, and automatic tax receipts via email.</p>
|
<p>Accept one-time donations with configurable suggested amounts, anonymous giving, and automatic tax receipts via email.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Stripe</span><span class="node-tag">Anonymous</span><span class="node-tag">Receipts</span></div>
|
<div class="node-tags"><span class="node-tag">Stripe</span><span class="node-tag">Anonymous</span><span class="node-tag">Receipts</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="subscription-plans">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/subscription-plans.png" alt="Subscription plan management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Plan management dashboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🔄</div>
|
<div class="node-icon">🔄</div>
|
||||||
<h4>Subscription Plans</h4>
|
<h4>Subscription Plans</h4>
|
||||||
@ -2493,7 +2715,8 @@
|
|||||||
<p>Recurring revenue with tiered plans, monthly and yearly billing, and automatic renewal management. Replace Patreon.</p>
|
<p>Recurring revenue with tiered plans, monthly and yearly billing, and automatic renewal management. Replace Patreon.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Recurring</span><span class="node-tag">Tiers</span><span class="node-tag">MRR tracking</span></div>
|
<div class="node-tags"><span class="node-tag">Recurring</span><span class="node-tag">Tiers</span><span class="node-tag">MRR tracking</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-shop">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-shop.png" alt="Product shop" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public product storefront</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🛒</div>
|
<div class="node-icon">🛒</div>
|
||||||
<h4>Product Shop</h4>
|
<h4>Product Shop</h4>
|
||||||
@ -2501,7 +2724,8 @@
|
|||||||
<p>Sell digital products, event tickets, and merchandise. Inventory management, download delivery, and capacity limits.</p>
|
<p>Sell digital products, event tickets, and merchandise. Inventory management, download delivery, and capacity limits.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Digital goods</span><span class="node-tag">Events</span><span class="node-tag">Inventory</span></div>
|
<div class="node-tags"><span class="node-tag">Digital goods</span><span class="node-tag">Events</span><span class="node-tag">Inventory</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="payments-dashboard">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/payments-dashboard.png" alt="Payment analytics" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Revenue analytics dashboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📊</div>
|
<div class="node-icon">📊</div>
|
||||||
<h4>Payment Dashboard</h4>
|
<h4>Payment Dashboard</h4>
|
||||||
@ -2509,7 +2733,8 @@
|
|||||||
<p>Revenue analytics with subscriber counts, MRR tracking, donation history, and CSV exports for accounting.</p>
|
<p>Revenue analytics with subscriber counts, MRR tracking, donation history, and CSV exports for accounting.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">CSV export</span><span class="node-tag">Refunds</span></div>
|
<div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">CSV export</span><span class="node-tag">Refunds</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="gallery-ads">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/gallery-ads.png" alt="Gallery ad management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> In-gallery promotion manager</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📢</div>
|
<div class="node-icon">📢</div>
|
||||||
<h4>Gallery Ads</h4>
|
<h4>Gallery Ads</h4>
|
||||||
@ -2517,7 +2742,8 @@
|
|||||||
<p>Promote donations, products, and subscriptions within the media gallery. Visibility targeting, scheduling, and click analytics.</p>
|
<p>Promote donations, products, and subscriptions within the media gallery. Visibility targeting, scheduling, and click analytics.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Targeting</span><span class="node-tag">Scheduling</span><span class="node-tag">CTR tracking</span></div>
|
<div class="node-tags"><span class="node-tag">Targeting</span><span class="node-tag">Scheduling</span><span class="node-tag">CTR tracking</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="donation-pages">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/donation-pages.png" alt="Donation page builder" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Custom branded donation pages</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📝</div>
|
<div class="node-icon">📝</div>
|
||||||
<h4>Donation Pages</h4>
|
<h4>Donation Pages</h4>
|
||||||
@ -2542,7 +2768,8 @@
|
|||||||
<div class="branch-preview-caption"><span class="caption-dot"></span> Wall of Fame — volunteer spotlight, achievement leaderboards, and community recognition</div>
|
<div class="branch-preview-caption"><span class="caption-dot"></span> Wall of Fame — volunteer spotlight, achievement leaderboards, and community recognition</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nodes-grid stagger">
|
<div class="nodes-grid stagger">
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="volunteer-friends">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/volunteer-friends.png" alt="Friend system" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Volunteer friend connections</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">👥</div>
|
<div class="node-icon">👥</div>
|
||||||
<h4>Friend System</h4>
|
<h4>Friend System</h4>
|
||||||
@ -2550,7 +2777,8 @@
|
|||||||
<p>Friend requests, suggestions, pokes, cross-module badges on campaigns, shifts, and the map.</p>
|
<p>Friend requests, suggestions, pokes, cross-module badges on campaigns, shifts, and the map.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Friend requests</span><span class="node-tag">Suggestions</span><span class="node-tag">Poke</span></div>
|
<div class="node-tags"><span class="node-tag">Friend requests</span><span class="node-tag">Suggestions</span><span class="node-tag">Poke</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-home">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-home.png" alt="Activity feed" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public homepage with activity</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">📰</div>
|
<div class="node-icon">📰</div>
|
||||||
<h4>Activity Feed</h4>
|
<h4>Activity Feed</h4>
|
||||||
@ -2558,7 +2786,8 @@
|
|||||||
<p>Real-time SSE feed of friend activity across campaigns, shifts, canvassing, and responses.</p>
|
<p>Real-time SSE feed of friend activity across campaigns, shifts, canvassing, and responses.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Real-time</span><span class="node-tag">SSE</span><span class="node-tag">Cross-module</span></div>
|
<div class="node-tags"><span class="node-tag">Real-time</span><span class="node-tag">SSE</span><span class="node-tag">Cross-module</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-wall-of-fame">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-wall-of-fame.png" alt="Achievements and leaderboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Volunteer achievements leaderboard</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">🏆</div>
|
<div class="node-icon">🏆</div>
|
||||||
<h4>Achievements & Notifications</h4>
|
<h4>Achievements & Notifications</h4>
|
||||||
@ -2566,7 +2795,8 @@
|
|||||||
<p>Milestone badges, real-time notification bell with friend requests, pokes, comments, and alerts.</p>
|
<p>Milestone badges, real-time notification bell with friend requests, pokes, comments, and alerts.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Badges</span><span class="node-tag">Bell UI</span><span class="node-tag">Real-time</span></div>
|
<div class="node-tags"><span class="node-tag">Badges</span><span class="node-tag">Bell UI</span><span class="node-tag">Real-time</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="volunteer-calendar">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/volunteer-calendar.png" alt="Team calendar" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Personal calendar with layers</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">👫</div>
|
<div class="node-icon">👫</div>
|
||||||
<h4>Groups & Teams</h4>
|
<h4>Groups & Teams</h4>
|
||||||
@ -2574,7 +2804,8 @@
|
|||||||
<p>Auto-groups for shift teams and campaign crews, custom groups, and shared updates.</p>
|
<p>Auto-groups for shift teams and campaign crews, custom groups, and shared updates.</p>
|
||||||
<div class="node-tags"><span class="node-tag">Shift teams</span><span class="node-tag">Campaign crews</span><span class="node-tag">Custom groups</span></div>
|
<div class="node-tags"><span class="node-tag">Shift teams</span><span class="node-tag">Campaign crews</span><span class="node-tag">Custom groups</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-node">
|
<div class="feature-node" data-screenshot="public-gallery">
|
||||||
|
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-gallery.png" alt="Reactions and comments" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Gallery with reactions and chat</div></div>
|
||||||
<div class="node-header">
|
<div class="node-header">
|
||||||
<div class="node-icon">😍</div>
|
<div class="node-icon">😍</div>
|
||||||
<h4>Reactions & Comments</h4>
|
<h4>Reactions & Comments</h4>
|
||||||
|
|||||||
@ -668,11 +668,11 @@
|
|||||||
.cm-header-nav__hamburger { display: block; }
|
.cm-header-nav__hamburger { display: block; }
|
||||||
.cm-header-nav__dropdown-menu { display: none !important; }
|
.cm-header-nav__dropdown-menu { display: none !important; }
|
||||||
}
|
}
|
||||||
/* Tell Material that sidebar sticky offset = tabs height (blue header scrolls away) */
|
/* Sidebar sticky offset = 0 since blue header scrolls away */
|
||||||
:root {
|
:root {
|
||||||
--md-header-height: 0px;
|
--md-header-height: 0px;
|
||||||
}
|
}
|
||||||
/* Hidden Material header — 0 height but search children overflow visibly */
|
/* Hidden Material header — keeps search anchored near tabs */
|
||||||
.md-header--cm-hidden {
|
.md-header--cm-hidden {
|
||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
min-height: 0 !important;
|
min-height: 0 !important;
|
||||||
@ -763,7 +763,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
}
|
}
|
||||||
/* Material tabs: sticky at top (blue header scrolls away, tabs persist) */
|
/* Material tabs: sticky at viewport top when blue header scrolls away */
|
||||||
.md-tabs {
|
.md-tabs {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|||||||
7
mkdocs/docs/overrides/test-page.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{% extends "main.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<style>
|
||||||
|
* { box-sizing: border-box; } body {margin: 0;}#i25w{padding:10px;}
|
||||||
|
</style>
|
||||||
|
<body id="i7af"><div id="i25w">Insert your text here</div></body>
|
||||||
|
{% endblock %}
|
||||||
7
mkdocs/docs/test-page.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
template: test-page.html
|
||||||
|
hide:
|
||||||
|
- navigation
|
||||||
|
- toc
|
||||||
|
title: "Test Page"
|
||||||
|
---
|
||||||
@ -1,6 +1,6 @@
|
|||||||
site_name: Changemaker Lite
|
site_name: Changemaker Lite
|
||||||
site_description: Build Power. Not Rent It. Own your digital infrastructure.
|
site_description: Build Power. Not Rent It. Own your digital infrastructure.
|
||||||
site_url: https://bnkserve.org
|
site_url: https://cmlite.org
|
||||||
site_author: Bunker Operations
|
site_author: Bunker Operations
|
||||||
docs_dir: docs
|
docs_dir: docs
|
||||||
site_dir: site
|
site_dir: site
|
||||||
@ -122,8 +122,8 @@ markdown_extensions:
|
|||||||
- pymdownx.caret
|
- pymdownx.caret
|
||||||
- pymdownx.details
|
- pymdownx.details
|
||||||
- pymdownx.emoji:
|
- pymdownx.emoji:
|
||||||
emoji_index: !!python/name:material.extensions.emoji.twemoji
|
emoji_index: !!python/name:material.extensions.emoji.twemoji ""
|
||||||
emoji_generator: !!python/name:material.extensions.emoji.to_svg
|
emoji_generator: !!python/name:material.extensions.emoji.to_svg ""
|
||||||
- pymdownx.highlight:
|
- pymdownx.highlight:
|
||||||
anchor_linenums: true
|
anchor_linenums: true
|
||||||
line_spans: __span
|
line_spans: __span
|
||||||
@ -139,7 +139,7 @@ markdown_extensions:
|
|||||||
custom_fences:
|
custom_fences:
|
||||||
- name: mermaid
|
- name: mermaid
|
||||||
class: mermaid
|
class: mermaid
|
||||||
format: !!python/name:pymdownx.superfences.fence_code_format
|
format: !!python/name:pymdownx.superfences.fence_code_format ""
|
||||||
- pymdownx.tabbed:
|
- pymdownx.tabbed:
|
||||||
alternate_style: true
|
alternate_style: true
|
||||||
combine_header_slug: true
|
combine_header_slug: true
|
||||||
@ -154,9 +154,7 @@ extra:
|
|||||||
consent:
|
consent:
|
||||||
title: Cookie consent
|
title: Cookie consent
|
||||||
description: >
|
description: >
|
||||||
We use cookies to recognize your repeated visits and preferences,
|
We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation. With your consent, you help us improve.
|
||||||
as well as to measure the effectiveness of our documentation.
|
|
||||||
With your consent, you help us improve.
|
|
||||||
actions:
|
actions:
|
||||||
- accept
|
- accept
|
||||||
- reject
|
- reject
|
||||||
@ -175,8 +173,7 @@ extra:
|
|||||||
|
|
||||||
# Copyright
|
# Copyright
|
||||||
copyright: >
|
copyright: >
|
||||||
Copyright © 2024–2026 The Bunker Operations –
|
Copyright © 2024–2026 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
||||||
<a href="#__consent">Change cookie settings</a>
|
|
||||||
|
|
||||||
# Navigation
|
# Navigation
|
||||||
nav:
|
nav:
|
||||||
|
|||||||
273
mkdocs/mkdocs.yml.bak
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
site_name: Changemaker Lite
|
||||||
|
site_description: Build Power. Not Rent It. Own your digital infrastructure.
|
||||||
|
site_url: https://bnkserve.org
|
||||||
|
site_author: Bunker Operations
|
||||||
|
docs_dir: docs
|
||||||
|
site_dir: site
|
||||||
|
use_directory_urls: true
|
||||||
|
|
||||||
|
# Repository
|
||||||
|
repo_url: https://gitea.bnkops.com/admin/changemaker.lite
|
||||||
|
repo_name: changemaker.lite
|
||||||
|
edit_uri: src/branch/v2/mkdocs/docs
|
||||||
|
|
||||||
|
# Theme
|
||||||
|
theme:
|
||||||
|
name: material
|
||||||
|
custom_dir: docs/overrides
|
||||||
|
logo: assets/logo.png
|
||||||
|
favicon: assets/favicon.png
|
||||||
|
palette:
|
||||||
|
- scheme: slate
|
||||||
|
primary: deep purple
|
||||||
|
accent: amber
|
||||||
|
toggle:
|
||||||
|
icon: material/weather-night
|
||||||
|
name: Switch to light mode
|
||||||
|
- scheme: default
|
||||||
|
primary: deep purple
|
||||||
|
accent: amber
|
||||||
|
toggle:
|
||||||
|
icon: material/weather-sunny
|
||||||
|
name: Switch to dark mode
|
||||||
|
font:
|
||||||
|
text: Inter
|
||||||
|
code: JetBrains Mono
|
||||||
|
features:
|
||||||
|
- announce.dismiss
|
||||||
|
- content.action.edit
|
||||||
|
- content.action.view
|
||||||
|
- content.code.annotate
|
||||||
|
- content.code.copy
|
||||||
|
- content.code.select
|
||||||
|
- content.tabs.link
|
||||||
|
- content.tooltips
|
||||||
|
- navigation.footer
|
||||||
|
- navigation.indexes
|
||||||
|
- navigation.instant
|
||||||
|
- navigation.instant.prefetch
|
||||||
|
- navigation.instant.progress
|
||||||
|
- navigation.path
|
||||||
|
- navigation.prune
|
||||||
|
- navigation.tabs
|
||||||
|
- navigation.tabs.sticky
|
||||||
|
- navigation.top
|
||||||
|
- navigation.tracking
|
||||||
|
- search.highlight
|
||||||
|
- search.share
|
||||||
|
- search.suggest
|
||||||
|
- toc.follow
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
plugins:
|
||||||
|
- search:
|
||||||
|
separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
|
||||||
|
- social:
|
||||||
|
cards_layout_options:
|
||||||
|
background_color: "#5BCEFA"
|
||||||
|
color: "#FFFFFF"
|
||||||
|
- blog:
|
||||||
|
blog_dir: blog
|
||||||
|
post_date_format: medium
|
||||||
|
archive_name: Archive
|
||||||
|
categories_name: Categories
|
||||||
|
authors: true
|
||||||
|
authors_file: blog/.authors.yml
|
||||||
|
- tags
|
||||||
|
|
||||||
|
# Extra CSS and JS
|
||||||
|
extra_css:
|
||||||
|
- stylesheets/extra.css
|
||||||
|
- stylesheets/home.css
|
||||||
|
- stylesheets/docs-comments.css
|
||||||
|
- assets/css/video-player.css
|
||||||
|
- assets/css/image-gallery.css
|
||||||
|
- assets/css/payment-widgets.css
|
||||||
|
|
||||||
|
extra_javascript:
|
||||||
|
- javascripts/home.js
|
||||||
|
- javascripts/github-widget.js
|
||||||
|
- javascripts/gitea-widget.js
|
||||||
|
# env-config.js is auto-generated by hooks/env_config_hook.py
|
||||||
|
- assets/js/env-config.js
|
||||||
|
- assets/js/video-player.js
|
||||||
|
- assets/js/image-gallery.js
|
||||||
|
- assets/js/gancio-events.js
|
||||||
|
- assets/js/payment-widgets.js
|
||||||
|
- assets/js/scheduling-poll.js
|
||||||
|
- javascripts/ad-widgets.js
|
||||||
|
- javascripts/docs-comments.js
|
||||||
|
|
||||||
|
hooks:
|
||||||
|
- docs/hooks/repo_widget_hook.py
|
||||||
|
- docs/hooks/env_config_hook.py
|
||||||
|
- docs/hooks/wikilinks_hook.py
|
||||||
|
|
||||||
|
# Markdown Extensions
|
||||||
|
markdown_extensions:
|
||||||
|
- abbr
|
||||||
|
- admonition
|
||||||
|
- attr_list
|
||||||
|
- def_list
|
||||||
|
- footnotes
|
||||||
|
- md_in_html
|
||||||
|
- meta
|
||||||
|
- toc:
|
||||||
|
permalink: true
|
||||||
|
title: On this page
|
||||||
|
- pymdownx.arithmatex:
|
||||||
|
generic: true
|
||||||
|
- pymdownx.betterem:
|
||||||
|
smart_enable: all
|
||||||
|
- pymdownx.caret
|
||||||
|
- pymdownx.details
|
||||||
|
- pymdownx.emoji:
|
||||||
|
emoji_index: !!python/name:material.extensions.emoji.twemoji
|
||||||
|
emoji_generator: !!python/name:material.extensions.emoji.to_svg
|
||||||
|
- pymdownx.highlight:
|
||||||
|
anchor_linenums: true
|
||||||
|
line_spans: __span
|
||||||
|
pygments_lang_class: true
|
||||||
|
- pymdownx.inlinehilite
|
||||||
|
- pymdownx.keys
|
||||||
|
- pymdownx.mark
|
||||||
|
- pymdownx.smartsymbols
|
||||||
|
- pymdownx.snippets:
|
||||||
|
auto_append:
|
||||||
|
- includes/abbreviations.md
|
||||||
|
- pymdownx.superfences:
|
||||||
|
custom_fences:
|
||||||
|
- name: mermaid
|
||||||
|
class: mermaid
|
||||||
|
format: !!python/name:pymdownx.superfences.fence_code_format
|
||||||
|
- pymdownx.tabbed:
|
||||||
|
alternate_style: true
|
||||||
|
combine_header_slug: true
|
||||||
|
- pymdownx.tasklist:
|
||||||
|
custom_checkbox: true
|
||||||
|
- pymdownx.tilde
|
||||||
|
|
||||||
|
# Extra configuration
|
||||||
|
extra:
|
||||||
|
analytics:
|
||||||
|
provider: custom
|
||||||
|
consent:
|
||||||
|
title: Cookie consent
|
||||||
|
description: >
|
||||||
|
We use cookies to recognize your repeated visits and preferences,
|
||||||
|
as well as to measure the effectiveness of our documentation.
|
||||||
|
With your consent, you help us improve.
|
||||||
|
actions:
|
||||||
|
- accept
|
||||||
|
- reject
|
||||||
|
- manage
|
||||||
|
generator: false
|
||||||
|
status:
|
||||||
|
new: Recently added
|
||||||
|
deprecated: Legacy
|
||||||
|
social:
|
||||||
|
- icon: fontawesome/solid/code-branch
|
||||||
|
link: https://gitea.bnkops.com/admin
|
||||||
|
name: Gitea Repository
|
||||||
|
- icon: fontawesome/solid/paper-plane
|
||||||
|
link: https://listmonk.bnkops.com/subscription/form
|
||||||
|
name: Newsletter
|
||||||
|
|
||||||
|
# Copyright
|
||||||
|
copyright: >
|
||||||
|
Copyright © 2024–2026 The Bunker Operations –
|
||||||
|
<a href="#__consent">Change cookie settings</a>
|
||||||
|
|
||||||
|
# Navigation
|
||||||
|
nav:
|
||||||
|
- Home: index.md
|
||||||
|
- Docs:
|
||||||
|
- docs/index.md
|
||||||
|
- Getting Started:
|
||||||
|
- docs/getting-started/index.md
|
||||||
|
- Installation: docs/getting-started/installation.md
|
||||||
|
- Services Overview: docs/getting-started/services.md
|
||||||
|
- Environment Variables: docs/getting-started/environment-variables.md
|
||||||
|
- First Steps: docs/getting-started/first-steps.md
|
||||||
|
- Updates & Upgrades: docs/getting-started/upgrades.md
|
||||||
|
- Control Panel (CCP): docs/getting-started/control-panel.md
|
||||||
|
- Features at a Glance: docs/getting-started/features.md
|
||||||
|
- Admin Guide:
|
||||||
|
- docs/admin/index.md
|
||||||
|
- Dashboard: docs/admin/dashboard.md
|
||||||
|
- People & Access: docs/admin/people-access.md
|
||||||
|
- Advocacy:
|
||||||
|
- docs/admin/advocacy/index.md
|
||||||
|
- Campaigns: docs/admin/advocacy/campaigns.md
|
||||||
|
- Responses: docs/admin/advocacy/responses.md
|
||||||
|
- Representatives: docs/admin/advocacy/representatives.md
|
||||||
|
- Email Queue: docs/admin/advocacy/email-queue.md
|
||||||
|
- Broadcast:
|
||||||
|
- docs/admin/broadcast/index.md
|
||||||
|
- Newsletter: docs/admin/broadcast/newsletter.md
|
||||||
|
- Email Templates: docs/admin/broadcast/email-templates.md
|
||||||
|
- SMS: docs/admin/broadcast/sms.md
|
||||||
|
- Web Content:
|
||||||
|
- docs/admin/web/index.md
|
||||||
|
- Landing Pages: docs/admin/web/landing-pages.md
|
||||||
|
- Homepage: docs/admin/web/homepage.md
|
||||||
|
- Navigation: docs/admin/web/navigation.md
|
||||||
|
- Documentation: docs/admin/web/documentation.md
|
||||||
|
- Map & Canvassing:
|
||||||
|
- docs/admin/map/index.md
|
||||||
|
- Locations: docs/admin/map/locations.md
|
||||||
|
- Areas: docs/admin/map/areas.md
|
||||||
|
- Shifts: docs/admin/map/shifts.md
|
||||||
|
- Canvassing: docs/admin/map/canvassing.md
|
||||||
|
- Data Quality: docs/admin/map/data-quality.md
|
||||||
|
- Map Settings: docs/admin/map/settings.md
|
||||||
|
- Media:
|
||||||
|
- docs/admin/media/index.md
|
||||||
|
- Library: docs/admin/media/library.md
|
||||||
|
- Analytics: docs/admin/media/analytics.md
|
||||||
|
- Curated Gallery: docs/admin/media/curated.md
|
||||||
|
- Moderation: docs/admin/media/moderation.md
|
||||||
|
- Gallery Ads: docs/admin/media/ads.md
|
||||||
|
- Payments:
|
||||||
|
- docs/admin/payments/index.md
|
||||||
|
- Products: docs/admin/payments/products.md
|
||||||
|
- Donations: docs/admin/payments/donations.md
|
||||||
|
- Plans: docs/admin/payments/plans.md
|
||||||
|
- Settings: docs/admin/payments/settings.md
|
||||||
|
- Services:
|
||||||
|
- docs/admin/services/index.md
|
||||||
|
- Tunnel: docs/admin/services/tunnel.md
|
||||||
|
- CrowdSec & Security: docs/admin/services/crowdsec.md
|
||||||
|
- Monitoring: docs/admin/services/monitoring.md
|
||||||
|
- Integrations: docs/admin/services/integrations.md
|
||||||
|
- User Provisioning: docs/admin/services/user-provisioning.md
|
||||||
|
- Settings: docs/admin/settings.md
|
||||||
|
- User Guide:
|
||||||
|
- docs/user-guide/index.md
|
||||||
|
- Campaigns: docs/user-guide/campaigns.md
|
||||||
|
- Map: docs/user-guide/map.md
|
||||||
|
- Shifts: docs/user-guide/shifts.md
|
||||||
|
- Events: docs/user-guide/events.md
|
||||||
|
- Gallery: docs/user-guide/gallery.md
|
||||||
|
- Shop & Pricing: docs/user-guide/shop.md
|
||||||
|
- Donations: docs/user-guide/donations.md
|
||||||
|
- Your Profile: docs/user-guide/profile.md
|
||||||
|
- Volunteer Guide:
|
||||||
|
- docs/volunteer/index.md
|
||||||
|
- Canvassing: docs/volunteer/canvassing.md
|
||||||
|
- Shifts: docs/volunteer/shifts.md
|
||||||
|
- Social: docs/volunteer/social.md
|
||||||
|
- Achievements: docs/volunteer/achievements.md
|
||||||
|
- Deployment:
|
||||||
|
- docs/deployment/index.md
|
||||||
|
- Architecture:
|
||||||
|
- docs/architecture/index.md
|
||||||
|
- Services:
|
||||||
|
- docs/services/index.md
|
||||||
|
- API Reference:
|
||||||
|
- docs/api/index.md
|
||||||
|
- Troubleshooting:
|
||||||
|
- docs/troubleshooting/index.md
|
||||||
|
- Philosophy: docs/phil.md
|
||||||
|
- Blog:
|
||||||
|
- blog/index.md
|
||||||
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<link rel="icon" href="/assets/favicon.png">
|
<link rel="icon" href="/assets/favicon.png">
|
||||||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.2">
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -124,7 +124,7 @@
|
|||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>"undefined"!=typeof __md_analytics&&__md_analytics()</script>
|
<script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -825,11 +825,11 @@
|
|||||||
.cm-header-nav__hamburger { display: block; }
|
.cm-header-nav__hamburger { display: block; }
|
||||||
.cm-header-nav__dropdown-menu { display: none !important; }
|
.cm-header-nav__dropdown-menu { display: none !important; }
|
||||||
}
|
}
|
||||||
/* Tell Material that sidebar sticky offset = tabs height (blue header scrolls away) */
|
/* Sidebar sticky offset = 0 since blue header scrolls away */
|
||||||
:root {
|
:root {
|
||||||
--md-header-height: 0px;
|
--md-header-height: 0px;
|
||||||
}
|
}
|
||||||
/* Hidden Material header — 0 height but search children overflow visibly */
|
/* Hidden Material header — keeps search anchored near tabs */
|
||||||
.md-header--cm-hidden {
|
.md-header--cm-hidden {
|
||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
min-height: 0 !important;
|
min-height: 0 !important;
|
||||||
@ -920,7 +920,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
}
|
}
|
||||||
/* Material tabs: sticky at top (blue header scrolls away, tabs persist) */
|
/* Material tabs: sticky at viewport top when blue header scrolls away */
|
||||||
.md-tabs {
|
.md-tabs {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -1278,6 +1278,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1367,6 +1369,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
|
||||||
|
|
||||||
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -1387,7 +1391,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
<div class="md-copyright">
|
<div class="md-copyright">
|
||||||
|
|
||||||
<div class="md-copyright__highlight">
|
<div class="md-copyright__highlight">
|
||||||
Copyright © 2024 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
Copyright © 2024–2026 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -1402,7 +1406,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
|
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48m80-24c0 32.8-19.7 61-48 73.3V224h176c26.5 0 48-21.5 48-48v-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V176c0 61.9-50.1 112-112 112H112v70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3V153.4C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80m232 0a24 24 0 1 0-48 0 24 24 0 1 0 48 0M80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48"/></svg>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
@ -1424,11 +1428,78 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
<div class="md-dialog__inner md-typeset"></div>
|
<div class="md-dialog__inner md-typeset"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
|
||||||
|
<div class="md-consent__overlay"></div>
|
||||||
|
<aside class="md-consent__inner">
|
||||||
|
<form class="md-consent__form md-grid md-typeset" name="consent">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h4>Cookie consent</h4>
|
||||||
|
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation. With your consent, you help us improve.
|
||||||
|
</p>
|
||||||
|
<input class="md-toggle" type="checkbox" id="__settings" >
|
||||||
|
<div class="md-consent__settings">
|
||||||
|
<ul class="task-list">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="task-list-item">
|
||||||
|
<label class="task-list-control">
|
||||||
|
<input type="checkbox" name="analytics" checked>
|
||||||
|
<span class="task-list-indicator"></span>
|
||||||
|
Google Analytics
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="md-consent__controls">
|
||||||
|
|
||||||
|
|
||||||
|
<button class="md-button md-button--primary">Accept</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button type="reset" class="md-button md-button--primary">Reject</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-button" for="__settings">Manage settings</label>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
<script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.code.select", "content.tabs.link", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
||||||
|
|
||||||
|
|
||||||
<script src="/assets/javascripts/bundle.79ae519e.min.js"></script>
|
<script src="/assets/javascripts/bundle.79ae519e.min.js"></script>
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
<meta name="author" content="Bunker Operations">
|
<meta name="author" content="Bunker Operations">
|
||||||
|
|
||||||
|
|
||||||
<link rel="canonical" href="https://bnkserve.org/testing/">
|
<link rel="canonical" href="https://cmlite.org/404/">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -22,11 +22,11 @@
|
|||||||
|
|
||||||
|
|
||||||
<link rel="icon" href="../assets/favicon.png">
|
<link rel="icon" href="../assets/favicon.png">
|
||||||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.2">
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<title>testing - Changemaker Lite</title>
|
<title>Page Not Found - Changemaker Lite</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -126,24 +126,24 @@
|
|||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>"undefined"!=typeof __md_analytics&&__md_analytics()</script>
|
<script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:title" content="testing - Changemaker Lite" />
|
<meta property="og:title" content="Page Not Found - Changemaker Lite" />
|
||||||
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
|
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
|
||||||
<meta property="og:image" content="https://bnkserve.org/assets/images/social/testing.png" />
|
<meta property="og:image" content="https://cmlite.org/assets/images/social/404.png" />
|
||||||
<meta property="og:image:type" content="image/png" />
|
<meta property="og:image:type" content="image/png" />
|
||||||
<meta property="og:image:width" content="1200" />
|
<meta property="og:image:width" content="1200" />
|
||||||
<meta property="og:image:height" content="630" />
|
<meta property="og:image:height" content="630" />
|
||||||
<meta property="og:url" content="https://bnkserve.org/testing/" />
|
<meta property="og:url" content="https://cmlite.org/404/" />
|
||||||
<meta property="twitter:card" content="summary_large_image" />
|
<meta property="twitter:card" content="summary_large_image" />
|
||||||
<meta property="twitter:title" content="testing - Changemaker Lite" />
|
<meta property="twitter:title" content="Page Not Found - Changemaker Lite" />
|
||||||
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
|
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
|
||||||
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/testing.png" />
|
<meta property="twitter:image" content="https://cmlite.org/assets/images/social/404.png" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
||||||
@ -163,7 +163,7 @@
|
|||||||
<div data-md-component="skip">
|
<div data-md-component="skip">
|
||||||
|
|
||||||
|
|
||||||
<a href="#testing" class="md-skip">
|
<a href="#page-not-found" class="md-skip">
|
||||||
Skip to content
|
Skip to content
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
@ -845,11 +845,11 @@
|
|||||||
.cm-header-nav__hamburger { display: block; }
|
.cm-header-nav__hamburger { display: block; }
|
||||||
.cm-header-nav__dropdown-menu { display: none !important; }
|
.cm-header-nav__dropdown-menu { display: none !important; }
|
||||||
}
|
}
|
||||||
/* Tell Material that sidebar sticky offset = tabs height (blue header scrolls away) */
|
/* Sidebar sticky offset = 0 since blue header scrolls away */
|
||||||
:root {
|
:root {
|
||||||
--md-header-height: 0px;
|
--md-header-height: 0px;
|
||||||
}
|
}
|
||||||
/* Hidden Material header — 0 height but search children overflow visibly */
|
/* Hidden Material header — keeps search anchored near tabs */
|
||||||
.md-header--cm-hidden {
|
.md-header--cm-hidden {
|
||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
min-height: 0 !important;
|
min-height: 0 !important;
|
||||||
@ -940,7 +940,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
}
|
}
|
||||||
/* Material tabs: sticky at top (blue header scrolls away, tabs persist) */
|
/* Material tabs: sticky at viewport top when blue header scrolls away */
|
||||||
.md-tabs {
|
.md-tabs {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -1146,7 +1146,9 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" hidden>
|
||||||
<div class="md-sidebar__scrollwrap">
|
<div class="md-sidebar__scrollwrap">
|
||||||
<div class="md-sidebar__inner">
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
@ -1298,6 +1300,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1350,7 +1354,9 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" hidden>
|
||||||
<div class="md-sidebar__scrollwrap">
|
<div class="md-sidebar__scrollwrap">
|
||||||
<div class="md-sidebar__inner">
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
@ -1375,6 +1381,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1384,10 +1392,12 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
<article class="md-content__inner md-typeset">
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/testing.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
|
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2/mkdocs/docs/404.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
|
||||||
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
|
||||||
</a>
|
</a>
|
||||||
@ -1396,32 +1406,21 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/testing.md" title="View source of this page" class="md-content__button md-icon">
|
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2/mkdocs/docs/404.md" title="View source of this page" class="md-content__button md-icon">
|
||||||
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h1 id="testing">testing<a class="headerlink" href="#testing" title="Permanent link">¶</a></h1>
|
<div style="text-align: center; padding: 4rem 1rem;">
|
||||||
<h1 id="testing_1">testing<a class="headerlink" href="#testing_1" title="Permanent link">¶</a></h1>
|
<h1 id="page-not-found"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7m.88 13.75h-1.75V14h1.75m0-1.12h-1.75c0-2.84 2.62-2.62 2.62-4.38A1.75 1.75 0 0 0 12 6.75a1.75 1.75 0 0 0-1.75 1.75H8.5A3.5 3.5 0 0 1 12 5a3.5 3.5 0 0 1 3.5 3.5c0 2.19-2.62 2.41-2.62 4.38"/></svg></span> Page Not Found<a class="headerlink" href="#page-not-found" title="Permanent link">¶</a></h1>
|
||||||
<h2 id="wiki-link-tests">Wiki-Link Tests<a class="headerlink" href="#wiki-link-tests" title="Permanent link">¶</a></h2>
|
<p>The page you're looking for doesn't exist or has been moved.</p>
|
||||||
<ul>
|
<p><a class="md-button md-button--primary" href="../docs/">Back to Documentation <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg></span></a>
|
||||||
<li>Doc link: <a href="docs/getting-started/installation/">installation</a></li>
|
<a class="md-button" href="../docs/">Search the Docs <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg></span></a></p>
|
||||||
<li>Doc link with display text: <a href="docs/getting-started/installation/">Install Guide</a></li>
|
<hr />
|
||||||
<li>Doc link with anchor: <a href="docs/getting-started/installation/#prerequisites">installation#prerequisites</a></li>
|
<p><em>If you followed a link here, please <a href="https://gitea.bnkops.com/admin/changemaker.lite/issues/new" target="_blank">report the broken link</a> so we can fix it.</em></p>
|
||||||
<li>Image embed: <img alt="logo.png" src="../assets/logo.png" /></li>
|
</div>
|
||||||
<li>Image with alt: <img alt="Site Logo" src="../assets/logo.png" /></li>
|
|
||||||
<li>Code block (should NOT be converted):</li>
|
|
||||||
</ul>
|
|
||||||
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>[[this-should-stay-as-is]]
|
|
||||||
</span></code></pre></div>
|
|
||||||
<ul>
|
|
||||||
<li>Inline code (should NOT be converted): <code>[[not-a-link]]</code></li>
|
|
||||||
<li>Unresolved link (should stay as-is): [[nonexistent-page]]</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1430,15 +1429,24 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
|
||||||
|
|
||||||
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -1459,7 +1467,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
<div class="md-copyright">
|
<div class="md-copyright">
|
||||||
|
|
||||||
<div class="md-copyright__highlight">
|
<div class="md-copyright__highlight">
|
||||||
Copyright © 2024 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
Copyright © 2024–2026 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -1474,7 +1482,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
|
|
||||||
|
|
||||||
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
|
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48m80-24c0 32.8-19.7 61-48 73.3V224h176c26.5 0 48-21.5 48-48v-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V176c0 61.9-50.1 112-112 112H112v70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3V153.4C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80m232 0a24 24 0 1 0-48 0 24 24 0 1 0 48 0M80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48"/></svg>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
@ -1496,11 +1504,78 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
|||||||
<div class="md-dialog__inner md-typeset"></div>
|
<div class="md-dialog__inner md-typeset"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
|
||||||
|
<div class="md-consent__overlay"></div>
|
||||||
|
<aside class="md-consent__inner">
|
||||||
|
<form class="md-consent__form md-grid md-typeset" name="consent">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h4>Cookie consent</h4>
|
||||||
|
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation. With your consent, you help us improve.
|
||||||
|
</p>
|
||||||
|
<input class="md-toggle" type="checkbox" id="__settings" >
|
||||||
|
<div class="md-consent__settings">
|
||||||
|
<ul class="task-list">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="task-list-item">
|
||||||
|
<label class="task-list-control">
|
||||||
|
<input type="checkbox" name="analytics" checked>
|
||||||
|
<span class="task-list-indicator"></span>
|
||||||
|
Google Analytics
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="md-consent__controls">
|
||||||
|
|
||||||
|
|
||||||
|
<button class="md-button md-button--primary">Accept</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button type="reset" class="md-button md-button--primary">Reject</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-button" for="__settings">Manage settings</label>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.code.select", "content.tabs.link", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
||||||
|
|
||||||
|
|
||||||
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
|
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
|
||||||
|
Before Width: | Height: | Size: 435 KiB After Width: | Height: | Size: 179 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 92 KiB |
BIN
mkdocs/site/assets/images/screenshots/features/admin-cuts.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 159 KiB |