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 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 () => {
|
||||
if (iframeInitialized.current && iframeSrc) return;
|
||||
setIframeLoading(true);
|
||||
setIframeError(null);
|
||||
try {
|
||||
const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url');
|
||||
const { port, token } = res.data;
|
||||
const url = `//${window.location.hostname}:${port}/auth?token=${encodeURIComponent(token)}`;
|
||||
const url = buildProxyAuthUrl(res.data.token);
|
||||
if (!url) throw new Error('Config not loaded');
|
||||
setIframeSrc(url);
|
||||
iframeInitialized.current = true;
|
||||
} catch {
|
||||
@ -190,11 +196,17 @@ export default function ListmonkPage() {
|
||||
} finally {
|
||||
setIframeLoading(false);
|
||||
}
|
||||
}, [iframeSrc]);
|
||||
}, [iframeSrc, buildProxyAuthUrl]);
|
||||
|
||||
const listmonkAdminUrl = config
|
||||
? buildServiceUrl(config.listmonkSubdomain, config.domain, config.listmonkPort)
|
||||
: null;
|
||||
const handleOpenListmonk = useCallback(async () => {
|
||||
try {
|
||||
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(() => {
|
||||
setPageHeader({ title: 'Newsletter / Listmonk', fullBleed: activeTab === 'admin' });
|
||||
@ -234,12 +246,11 @@ export default function ListmonkPage() {
|
||||
>
|
||||
Test Connection
|
||||
</Button>
|
||||
{listmonkAdminUrl && (
|
||||
{config && (
|
||||
<Button
|
||||
size="small"
|
||||
icon={<LinkOutlined />}
|
||||
href={listmonkAdminUrl}
|
||||
target="_blank"
|
||||
onClick={handleOpenListmonk}
|
||||
>
|
||||
Open Listmonk
|
||||
</Button>
|
||||
|
||||
@ -83,7 +83,7 @@ router.get(
|
||||
miniqrSubdomain: 'qr',
|
||||
excalidrawSubdomain: 'draw',
|
||||
// Listmonk (newsletter platform)
|
||||
listmonkPort: 9001,
|
||||
listmonkPort: env.LISTMONK_PROXY_PORT,
|
||||
listmonkSubdomain: 'listmonk',
|
||||
// Code Server (web IDE)
|
||||
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/services/index.png": "9fcf00324266a9f7b58c7b277da2127e8882aa47",
|
||||
"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/donations.png": "a907a64483b99ba1d1b3841a3b5928f1a77d73e4",
|
||||
"assets/images/social/docs/user-guide/events.png": "b4fed5fb2b288500035a68455b01994710c4aa98",
|
||||
@ -149,7 +150,7 @@
|
||||
"assets/images/social/services/postgresql.png": "831fb68dd3e01d9a017e59b100aaa8a455c8c112",
|
||||
"assets/images/social/services/static-server.png": "f36d527c80adba4bcb7778784683f429acb4ce74",
|
||||
"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/testing.png": "f7aaf394b71cbe7084a6afa0e75a324ca59e23d8",
|
||||
"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",
|
||||
"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.",
|
||||
"html_url": "https://gitea.bnkops.com/admin/changemaker.lite",
|
||||
"html_url": "http://gitea.bnkops.com/admin/changemaker.lite",
|
||||
"language": "HTML",
|
||||
"stars_count": 0,
|
||||
"forks_count": 0,
|
||||
"open_issues_count": 23,
|
||||
"updated_at": "2026-03-10T18:27:08-06:00",
|
||||
"open_issues_count": 0,
|
||||
"updated_at": "2026-03-23T15:48:06-06:00",
|
||||
"created_at": "2025-05-28T14:54:59-06:00",
|
||||
"clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git",
|
||||
"ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git",
|
||||
"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.",
|
||||
"html_url": "https://github.com/anthropics/claude-code",
|
||||
"language": "Shell",
|
||||
"stars_count": 77129,
|
||||
"forks_count": 6266,
|
||||
"open_issues_count": 6171,
|
||||
"updated_at": "2026-03-12T17:36:34Z",
|
||||
"stars_count": 81725,
|
||||
"forks_count": 6816,
|
||||
"open_issues_count": 7445,
|
||||
"updated_at": "2026-03-23T23:45:06Z",
|
||||
"created_at": "2025-02-22T17:41:21Z",
|
||||
"clone_url": "https://github.com/anthropics/claude-code.git",
|
||||
"ssh_url": "git@github.com:anthropics/claude-code.git",
|
||||
"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",
|
||||
"html_url": "https://github.com/coder/code-server",
|
||||
"language": "TypeScript",
|
||||
"stars_count": 76609,
|
||||
"forks_count": 6547,
|
||||
"open_issues_count": 172,
|
||||
"updated_at": "2026-03-12T17:13:08Z",
|
||||
"stars_count": 76802,
|
||||
"forks_count": 6567,
|
||||
"open_issues_count": 167,
|
||||
"updated_at": "2026-03-23T23:30:09Z",
|
||||
"created_at": "2019-02-27T16:50:41Z",
|
||||
"clone_url": "https://github.com/coder/code-server.git",
|
||||
"ssh_url": "git@github.com:coder/code-server.git",
|
||||
"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.",
|
||||
"html_url": "https://github.com/gethomepage/homepage",
|
||||
"language": "JavaScript",
|
||||
"stars_count": 28865,
|
||||
"forks_count": 1813,
|
||||
"stars_count": 29108,
|
||||
"forks_count": 1825,
|
||||
"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",
|
||||
"clone_url": "https://github.com/gethomepage/homepage.git",
|
||||
"ssh_url": "git@github.com:gethomepage/homepage.git",
|
||||
"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",
|
||||
"html_url": "https://github.com/go-gitea/gitea",
|
||||
"language": "Go",
|
||||
"stars_count": 54251,
|
||||
"forks_count": 6466,
|
||||
"open_issues_count": 2853,
|
||||
"updated_at": "2026-03-12T17:33:45Z",
|
||||
"stars_count": 54439,
|
||||
"forks_count": 6485,
|
||||
"open_issues_count": 2870,
|
||||
"updated_at": "2026-03-23T23:19:17Z",
|
||||
"created_at": "2016-11-01T02:13:26Z",
|
||||
"clone_url": "https://github.com/go-gitea/gitea.git",
|
||||
"ssh_url": "git@github.com:go-gitea/gitea.git",
|
||||
"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.",
|
||||
"html_url": "https://github.com/knadh/listmonk",
|
||||
"language": "Go",
|
||||
"stars_count": 19256,
|
||||
"forks_count": 1946,
|
||||
"open_issues_count": 101,
|
||||
"updated_at": "2026-03-12T16:54:34Z",
|
||||
"stars_count": 19329,
|
||||
"forks_count": 1958,
|
||||
"open_issues_count": 105,
|
||||
"updated_at": "2026-03-23T23:36:16Z",
|
||||
"created_at": "2019-06-26T05:08:39Z",
|
||||
"clone_url": "https://github.com/knadh/listmonk.git",
|
||||
"ssh_url": "git@github.com:knadh/listmonk.git",
|
||||
"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",
|
||||
"html_url": "https://github.com/lyqht/mini-qr",
|
||||
"language": "Vue",
|
||||
"stars_count": 1905,
|
||||
"forks_count": 241,
|
||||
"open_issues_count": 19,
|
||||
"updated_at": "2026-03-12T17:06:09Z",
|
||||
"stars_count": 1928,
|
||||
"forks_count": 243,
|
||||
"open_issues_count": 20,
|
||||
"updated_at": "2026-03-23T14:42:50Z",
|
||||
"created_at": "2023-04-21T14:20:14Z",
|
||||
"clone_url": "https://github.com/lyqht/mini-qr.git",
|
||||
"ssh_url": "git@github.com:lyqht/mini-qr.git",
|
||||
"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.",
|
||||
"html_url": "https://github.com/n8n-io/n8n",
|
||||
"language": "TypeScript",
|
||||
"stars_count": 178836,
|
||||
"forks_count": 55709,
|
||||
"open_issues_count": 1414,
|
||||
"updated_at": "2026-03-12T17:33:04Z",
|
||||
"stars_count": 180706,
|
||||
"forks_count": 56089,
|
||||
"open_issues_count": 1433,
|
||||
"updated_at": "2026-03-23T23:47:25Z",
|
||||
"created_at": "2019-06-22T09:24:21Z",
|
||||
"clone_url": "https://github.com/n8n-io/n8n.git",
|
||||
"ssh_url": "git@github.com:n8n-io/n8n.git",
|
||||
"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",
|
||||
"html_url": "https://github.com/nocodb/nocodb",
|
||||
"language": "TypeScript",
|
||||
"stars_count": 62459,
|
||||
"forks_count": 4662,
|
||||
"open_issues_count": 636,
|
||||
"updated_at": "2026-03-12T17:22:54Z",
|
||||
"stars_count": 62544,
|
||||
"forks_count": 4679,
|
||||
"open_issues_count": 647,
|
||||
"updated_at": "2026-03-23T22:41:15Z",
|
||||
"created_at": "2017-10-29T18:51:48Z",
|
||||
"clone_url": "https://github.com/nocodb/nocodb.git",
|
||||
"ssh_url": "git@github.com:nocodb/nocodb.git",
|
||||
"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.",
|
||||
"html_url": "https://github.com/ollama/ollama",
|
||||
"language": "Go",
|
||||
"stars_count": 164918,
|
||||
"forks_count": 14922,
|
||||
"open_issues_count": 2623,
|
||||
"updated_at": "2026-03-12T17:11:02Z",
|
||||
"stars_count": 165968,
|
||||
"forks_count": 15121,
|
||||
"open_issues_count": 2708,
|
||||
"updated_at": "2026-03-23T23:47:27Z",
|
||||
"created_at": "2023-06-26T19:39:32Z",
|
||||
"clone_url": "https://github.com/ollama/ollama.git",
|
||||
"ssh_url": "git@github.com:ollama/ollama.git",
|
||||
"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",
|
||||
"html_url": "https://github.com/squidfunk/mkdocs-material",
|
||||
"language": "Python",
|
||||
"stars_count": 26261,
|
||||
"forks_count": 4053,
|
||||
"open_issues_count": 2,
|
||||
"updated_at": "2026-03-12T17:20:59Z",
|
||||
"stars_count": 26370,
|
||||
"forks_count": 4058,
|
||||
"open_issues_count": 1,
|
||||
"updated_at": "2026-03-23T21:42:58Z",
|
||||
"created_at": "2016-01-28T22:09:23Z",
|
||||
"clone_url": "https://github.com/squidfunk/mkdocs-material.git",
|
||||
"ssh_url": "git@github.com:squidfunk/mkdocs-material.git",
|
||||
"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);
|
||||
}
|
||||
|
||||
.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 {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
@ -1167,6 +1190,141 @@
|
||||
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
|
||||
============================================ */
|
||||
@ -1915,6 +2073,7 @@
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
|
||||
</svg>
|
||||
</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>
|
||||
<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">
|
||||
@ -1935,7 +2094,8 @@
|
||||
<a href="#pricing">Pricing</a>
|
||||
<a href="/docs/">Documentation</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>
|
||||
|
||||
<!-- ============================================
|
||||
@ -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.
|
||||
</p>
|
||||
<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="/docs/" class="btn-secondary">Read the Docs</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="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>
|
||||
</div>
|
||||
|
||||
@ -2088,6 +2248,21 @@
|
||||
</div>
|
||||
</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
|
||||
============================================ -->
|
||||
@ -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>
|
||||
<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-icon">📬</div>
|
||||
<h4>Listmonk Newsletters</h4>
|
||||
@ -2120,7 +2296,8 @@
|
||||
<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>
|
||||
<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-icon">🎯</div>
|
||||
<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>
|
||||
<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 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-icon">✉</div>
|
||||
<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>
|
||||
<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 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-icon">💬</div>
|
||||
<h4>Response Wall</h4>
|
||||
@ -2144,7 +2323,8 @@
|
||||
<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>
|
||||
<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-icon">🚀</div>
|
||||
<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>
|
||||
<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 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-icon">🔔</div>
|
||||
<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>
|
||||
<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 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-icon">📱</div>
|
||||
<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>
|
||||
<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 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-icon">🗨</div>
|
||||
<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>
|
||||
<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-icon">🌍</div>
|
||||
<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>
|
||||
<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 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-icon">🚶</div>
|
||||
<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>
|
||||
<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 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-icon">✂</div>
|
||||
<h4>Polygon Cuts</h4>
|
||||
@ -2217,7 +2403,8 @@
|
||||
<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>
|
||||
<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-icon">📅</div>
|
||||
<h4>Volunteer Shifts</h4>
|
||||
@ -2225,7 +2412,8 @@
|
||||
<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>
|
||||
<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-icon">📋</div>
|
||||
<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>
|
||||
<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 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-icon">🇨🇦</div>
|
||||
<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>
|
||||
<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 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-icon">📆</div>
|
||||
<h4>Gancio Events</h4>
|
||||
@ -2252,6 +2442,11 @@
|
||||
</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 ====== -->
|
||||
<div class="branch branch-content" data-branch="content">
|
||||
<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>
|
||||
<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-icon">📹</div>
|
||||
<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>
|
||||
<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 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-icon">🎨</div>
|
||||
<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>
|
||||
<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 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-icon">📖</div>
|
||||
<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>
|
||||
<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 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-icon">💻</div>
|
||||
<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>
|
||||
<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 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-icon">✏</div>
|
||||
<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>
|
||||
<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 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-icon">📷</div>
|
||||
<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>
|
||||
<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 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-icon">🎵</div>
|
||||
<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>
|
||||
<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 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-icon">📲</div>
|
||||
<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>
|
||||
<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-icon">🗄</div>
|
||||
<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>
|
||||
<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 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-icon">⚡</div>
|
||||
<h4>n8n Workflows</h4>
|
||||
@ -2363,7 +2568,8 @@
|
||||
<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>
|
||||
<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-icon">📦</div>
|
||||
<h4>Gitea</h4>
|
||||
@ -2371,7 +2577,8 @@
|
||||
<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>
|
||||
<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-icon">📱</div>
|
||||
<h4>Mini QR</h4>
|
||||
@ -2379,7 +2586,8 @@
|
||||
<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>
|
||||
<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-icon">⌘</div>
|
||||
<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>
|
||||
<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 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-icon">⚙</div>
|
||||
<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>
|
||||
<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-icon">🌐</div>
|
||||
<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>
|
||||
<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 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-icon">📈</div>
|
||||
<h4>Prometheus + Grafana</h4>
|
||||
@ -2428,7 +2639,8 @@
|
||||
<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>
|
||||
<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-icon">🔏</div>
|
||||
<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>
|
||||
<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 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-icon">💾</div>
|
||||
<h4>Automated Backups</h4>
|
||||
@ -2444,7 +2657,8 @@
|
||||
<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>
|
||||
<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-icon">🔐</div>
|
||||
<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>
|
||||
<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 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-icon">👥</div>
|
||||
<h4>User Provisioning</h4>
|
||||
@ -2463,6 +2678,11 @@
|
||||
</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 ====== -->
|
||||
<div class="branch branch-fundraising" data-branch="fundraising">
|
||||
<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>
|
||||
<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-icon">💰</div>
|
||||
<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>
|
||||
<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 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-icon">🔄</div>
|
||||
<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>
|
||||
<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 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-icon">🛒</div>
|
||||
<h4>Product Shop</h4>
|
||||
@ -2501,7 +2724,8 @@
|
||||
<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>
|
||||
<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-icon">📊</div>
|
||||
<h4>Payment Dashboard</h4>
|
||||
@ -2509,7 +2733,8 @@
|
||||
<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>
|
||||
<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-icon">📢</div>
|
||||
<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>
|
||||
<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 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-icon">📝</div>
|
||||
<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>
|
||||
<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-icon">👥</div>
|
||||
<h4>Friend System</h4>
|
||||
@ -2550,7 +2777,8 @@
|
||||
<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>
|
||||
<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-icon">📰</div>
|
||||
<h4>Activity Feed</h4>
|
||||
@ -2558,7 +2786,8 @@
|
||||
<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>
|
||||
<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-icon">🏆</div>
|
||||
<h4>Achievements & Notifications</h4>
|
||||
@ -2566,7 +2795,8 @@
|
||||
<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>
|
||||
<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-icon">👫</div>
|
||||
<h4>Groups & Teams</h4>
|
||||
@ -2574,7 +2804,8 @@
|
||||
<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>
|
||||
<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-icon">😍</div>
|
||||
<h4>Reactions & Comments</h4>
|
||||
|
||||
@ -668,11 +668,11 @@
|
||||
.cm-header-nav__hamburger { display: block; }
|
||||
.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 {
|
||||
--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 {
|
||||
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;
|
||||
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 {
|
||||
position: sticky;
|
||||
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_description: Build Power. Not Rent It. Own your digital infrastructure.
|
||||
site_url: https://bnkserve.org
|
||||
site_url: https://cmlite.org
|
||||
site_author: Bunker Operations
|
||||
docs_dir: docs
|
||||
site_dir: site
|
||||
@ -122,8 +122,8 @@ markdown_extensions:
|
||||
- pymdownx.caret
|
||||
- pymdownx.details
|
||||
- pymdownx.emoji:
|
||||
emoji_index: !!python/name:material.extensions.emoji.twemoji
|
||||
emoji_generator: !!python/name:material.extensions.emoji.to_svg
|
||||
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
|
||||
@ -139,7 +139,7 @@ markdown_extensions:
|
||||
custom_fences:
|
||||
- name: mermaid
|
||||
class: mermaid
|
||||
format: !!python/name:pymdownx.superfences.fence_code_format
|
||||
format: !!python/name:pymdownx.superfences.fence_code_format ""
|
||||
- pymdownx.tabbed:
|
||||
alternate_style: true
|
||||
combine_header_slug: true
|
||||
@ -154,9 +154,7 @@ extra:
|
||||
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.
|
||||
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
|
||||
@ -175,8 +173,7 @@ extra:
|
||||
|
||||
# Copyright
|
||||
copyright: >
|
||||
Copyright © 2024–2026 The Bunker Operations –
|
||||
<a href="#__consent">Change cookie settings</a>
|
||||
Copyright © 2024–2026 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
||||
|
||||
# Navigation
|
||||
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">
|
||||
<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>"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__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 {
|
||||
--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 {
|
||||
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;
|
||||
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 {
|
||||
position: sticky;
|
||||
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>
|
||||
|
||||
|
||||
<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>
|
||||
</div>
|
||||
|
||||
@ -1387,7 +1391,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
<div class="md-copyright">
|
||||
|
||||
<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>
|
||||
|
||||
@ -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">
|
||||
<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>
|
||||
|
||||
|
||||
@ -1424,11 +1428,78 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
<div class="md-dialog__inner md-typeset"></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>
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
<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">
|
||||
<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>"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: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: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:width" content="1200" />
|
||||
<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: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:image" content="https://bnkserve.org/assets/images/social/testing.png" />
|
||||
<meta property="twitter:image" content="https://cmlite.org/assets/images/social/404.png" />
|
||||
</head>
|
||||
|
||||
|
||||
@ -163,7 +163,7 @@
|
||||
<div data-md-component="skip">
|
||||
|
||||
|
||||
<a href="#testing" class="md-skip">
|
||||
<a href="#page-not-found" class="md-skip">
|
||||
Skip to content
|
||||
</a>
|
||||
|
||||
@ -845,11 +845,11 @@
|
||||
.cm-header-nav__hamburger { display: block; }
|
||||
.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 {
|
||||
--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 {
|
||||
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;
|
||||
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 {
|
||||
position: sticky;
|
||||
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__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__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">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
<h1 id="testing">testing<a class="headerlink" href="#testing" title="Permanent link">¶</a></h1>
|
||||
<h1 id="testing_1">testing<a class="headerlink" href="#testing_1" 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>
|
||||
<ul>
|
||||
<li>Doc link: <a href="docs/getting-started/installation/">installation</a></li>
|
||||
<li>Doc link with display text: <a href="docs/getting-started/installation/">Install Guide</a></li>
|
||||
<li>Doc link with anchor: <a href="docs/getting-started/installation/#prerequisites">installation#prerequisites</a></li>
|
||||
<li>Image embed: <img alt="logo.png" src="../assets/logo.png" /></li>
|
||||
<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>
|
||||
|
||||
|
||||
<div style="text-align: center; padding: 4rem 1rem;">
|
||||
<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>
|
||||
<p>The page you're looking for doesn't exist or has been moved.</p>
|
||||
<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>
|
||||
<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>
|
||||
<hr />
|
||||
<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>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@ -1430,15 +1429,24 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</article>
|
||||
</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>
|
||||
</div>
|
||||
|
||||
@ -1459,7 +1467,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
<div class="md-copyright">
|
||||
|
||||
<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>
|
||||
|
||||
@ -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">
|
||||
<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>
|
||||
|
||||
|
||||
@ -1496,11 +1504,78 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
<div class="md-dialog__inner md-typeset"></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>
|
||||
|
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 |