Bunch more stability fixes

This commit is contained in:
bunker-admin 2026-03-23 22:12:24 -06:00
parent a56f8446f7
commit 63e05adcee
268 changed files with 20626 additions and 2260 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@ -0,0 +1 @@
[ 32ms] [WARNING] Manifest: property 'start_url' ignored, should be same origin as document. @ data:application/json;base64,eyJuYW1lIjoiR2l0ZWE6IEdpdCB3aXRoIGEgY3VwIG9mIHRlYSIsInNob3J0X25hbWUiOiJHaXRlYTogR2l0IHdpdGggYSBjdXAgb2YgdGVhIiwic3RhcnRfdXJsIjoiaHR0cHM6Ly9naXQuY21saXRlLm9yZy8iLCJpY29ucyI6W3sic3JjIjoiaHR0cHM6Ly9naXQuY21saXRlLm9yZy9hc3NldHMvaW1nL2xvZ28ucG5nIiwidHlwZSI6ImltYWdlL3BuZyIsInNpemVzIjoiNTEyeDUxMiJ9LHsic3JjIjoiaHR0cHM6Ly9naXQuY21saXRlLm9yZy9hc3NldHMvaW1nL2xvZ28uc3ZnIiwidHlwZSI6ImltYWdlL3N2Zyt4bWwiLCJzaXplcyI6IjUxMng1MTIifV19:0

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

View File

@ -175,14 +175,20 @@ export default function ListmonkPage() {
const { setPageHeader } = useOutletContext<AppOutletContext>(); const { setPageHeader } = useOutletContext<AppOutletContext>();
const buildProxyAuthUrl = useCallback((token: string) => {
if (!config) return null;
const base = buildServiceUrl(config.listmonkSubdomain, config.domain, config.listmonkPort);
return `${base}/auth?token=${encodeURIComponent(token)}`;
}, [config]);
const loadIframe = useCallback(async () => { const loadIframe = useCallback(async () => {
if (iframeInitialized.current && iframeSrc) return; if (iframeInitialized.current && iframeSrc) return;
setIframeLoading(true); setIframeLoading(true);
setIframeError(null); setIframeError(null);
try { try {
const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url'); const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url');
const { port, token } = res.data; const url = buildProxyAuthUrl(res.data.token);
const url = `//${window.location.hostname}:${port}/auth?token=${encodeURIComponent(token)}`; if (!url) throw new Error('Config not loaded');
setIframeSrc(url); setIframeSrc(url);
iframeInitialized.current = true; iframeInitialized.current = true;
} catch { } catch {
@ -190,11 +196,17 @@ export default function ListmonkPage() {
} finally { } finally {
setIframeLoading(false); setIframeLoading(false);
} }
}, [iframeSrc]); }, [iframeSrc, buildProxyAuthUrl]);
const listmonkAdminUrl = config const handleOpenListmonk = useCallback(async () => {
? buildServiceUrl(config.listmonkSubdomain, config.domain, config.listmonkPort) try {
: null; const res = await api.get<{ port: number; token: string }>('/listmonk/proxy-url');
const url = buildProxyAuthUrl(res.data.token);
if (url) window.open(url, '_blank');
} catch {
message.error('Failed to get Listmonk auth URL');
}
}, [buildProxyAuthUrl]);
useEffect(() => { useEffect(() => {
setPageHeader({ title: 'Newsletter / Listmonk', fullBleed: activeTab === 'admin' }); setPageHeader({ title: 'Newsletter / Listmonk', fullBleed: activeTab === 'admin' });
@ -234,12 +246,11 @@ export default function ListmonkPage() {
> >
Test Connection Test Connection
</Button> </Button>
{listmonkAdminUrl && ( {config && (
<Button <Button
size="small" size="small"
icon={<LinkOutlined />} icon={<LinkOutlined />}
href={listmonkAdminUrl} onClick={handleOpenListmonk}
target="_blank"
> >
Open Listmonk Open Listmonk
</Button> </Button>

View File

@ -83,7 +83,7 @@ router.get(
miniqrSubdomain: 'qr', miniqrSubdomain: 'qr',
excalidrawSubdomain: 'draw', excalidrawSubdomain: 'draw',
// Listmonk (newsletter platform) // Listmonk (newsletter platform)
listmonkPort: 9001, listmonkPort: env.LISTMONK_PROXY_PORT,
listmonkSubdomain: 'listmonk', listmonkSubdomain: 'listmonk',
// Code Server (web IDE) // Code Server (web IDE)
codeServerPort: env.CODE_SERVER_PORT, codeServerPort: env.CODE_SERVER_PORT,

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -112,6 +112,7 @@
"assets/images/social/docs/phil.png": "ffe46a0052d8c23422f82d91e03a213118869539", "assets/images/social/docs/phil.png": "ffe46a0052d8c23422f82d91e03a213118869539",
"assets/images/social/docs/services/index.png": "9fcf00324266a9f7b58c7b277da2127e8882aa47", "assets/images/social/docs/services/index.png": "9fcf00324266a9f7b58c7b277da2127e8882aa47",
"assets/images/social/docs/troubleshooting/index.png": "b0ffadb8b01b261dfe7dea1b55fe02a3d639b7e7", "assets/images/social/docs/troubleshooting/index.png": "b0ffadb8b01b261dfe7dea1b55fe02a3d639b7e7",
"assets/images/social/docs/upgrade-test-canary.png": "3d624f3412465c0f327ac1562675ae45dd30c3ce",
"assets/images/social/docs/user-guide/campaigns.png": "298b1e317e065ba0459d4cd5779ce16a278b3c09", "assets/images/social/docs/user-guide/campaigns.png": "298b1e317e065ba0459d4cd5779ce16a278b3c09",
"assets/images/social/docs/user-guide/donations.png": "a907a64483b99ba1d1b3841a3b5928f1a77d73e4", "assets/images/social/docs/user-guide/donations.png": "a907a64483b99ba1d1b3841a3b5928f1a77d73e4",
"assets/images/social/docs/user-guide/events.png": "b4fed5fb2b288500035a68455b01994710c4aa98", "assets/images/social/docs/user-guide/events.png": "b4fed5fb2b288500035a68455b01994710c4aa98",
@ -149,7 +150,7 @@
"assets/images/social/services/postgresql.png": "831fb68dd3e01d9a017e59b100aaa8a455c8c112", "assets/images/social/services/postgresql.png": "831fb68dd3e01d9a017e59b100aaa8a455c8c112",
"assets/images/social/services/static-server.png": "f36d527c80adba4bcb7778784683f429acb4ce74", "assets/images/social/services/static-server.png": "f36d527c80adba4bcb7778784683f429acb4ce74",
"assets/images/social/test-2.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83", "assets/images/social/test-2.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83",
"assets/images/social/test-page.png": "af2c353ee377343678a58555726f6ad7d0624488", "assets/images/social/test-page.png": "c9d5751a1f0a4c1341336bb7d00c9bc743d33ef4",
"assets/images/social/test.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83", "assets/images/social/test.png": "a6ae43d52d7c58fc106a562777e03b7da2263f83",
"assets/images/social/testing.png": "f7aaf394b71cbe7084a6afa0e75a324ca59e23d8", "assets/images/social/testing.png": "f7aaf394b71cbe7084a6afa0e75a324ca59e23d8",
"assets/images/social/v1/adv/ansible.png": "cb542ad9a3cc9a869258b3b1353966e1b9616a2b", "assets/images/social/v1/adv/ansible.png": "cb542ad9a3cc9a869258b3b1353966e1b9616a2b",

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -2,15 +2,15 @@
"full_name": "admin/changemaker.lite", "full_name": "admin/changemaker.lite",
"name": "changemaker.lite", "name": "changemaker.lite",
"description": "Changemaker-lite is the current active development branch of Changemaker, focused on streamlining core services. These improvements will be merged into the master branch once ready.", "description": "Changemaker-lite is the current active development branch of Changemaker, focused on streamlining core services. These improvements will be merged into the master branch once ready.",
"html_url": "https://gitea.bnkops.com/admin/changemaker.lite", "html_url": "http://gitea.bnkops.com/admin/changemaker.lite",
"language": "HTML", "language": "HTML",
"stars_count": 0, "stars_count": 0,
"forks_count": 0, "forks_count": 0,
"open_issues_count": 23, "open_issues_count": 0,
"updated_at": "2026-03-10T18:27:08-06:00", "updated_at": "2026-03-23T15:48:06-06:00",
"created_at": "2025-05-28T14:54:59-06:00", "created_at": "2025-05-28T14:54:59-06:00",
"clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git", "clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git",
"ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git", "ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git",
"default_branch": "main", "default_branch": "main",
"last_build_update": "2026-03-10T18:27:08-06:00" "last_build_update": "2026-03-23T15:48:06-06:00"
} }

View File

@ -4,13 +4,13 @@
"description": "Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.", "description": "Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.",
"html_url": "https://github.com/anthropics/claude-code", "html_url": "https://github.com/anthropics/claude-code",
"language": "Shell", "language": "Shell",
"stars_count": 77129, "stars_count": 81725,
"forks_count": 6266, "forks_count": 6816,
"open_issues_count": 6171, "open_issues_count": 7445,
"updated_at": "2026-03-12T17:36:34Z", "updated_at": "2026-03-23T23:45:06Z",
"created_at": "2025-02-22T17:41:21Z", "created_at": "2025-02-22T17:41:21Z",
"clone_url": "https://github.com/anthropics/claude-code.git", "clone_url": "https://github.com/anthropics/claude-code.git",
"ssh_url": "git@github.com:anthropics/claude-code.git", "ssh_url": "git@github.com:anthropics/claude-code.git",
"default_branch": "main", "default_branch": "main",
"last_build_update": "2026-03-12T07:12:41Z" "last_build_update": "2026-03-20T22:24:50Z"
} }

View File

@ -4,13 +4,13 @@
"description": "VS Code in the browser", "description": "VS Code in the browser",
"html_url": "https://github.com/coder/code-server", "html_url": "https://github.com/coder/code-server",
"language": "TypeScript", "language": "TypeScript",
"stars_count": 76609, "stars_count": 76802,
"forks_count": 6547, "forks_count": 6567,
"open_issues_count": 172, "open_issues_count": 167,
"updated_at": "2026-03-12T17:13:08Z", "updated_at": "2026-03-23T23:30:09Z",
"created_at": "2019-02-27T16:50:41Z", "created_at": "2019-02-27T16:50:41Z",
"clone_url": "https://github.com/coder/code-server.git", "clone_url": "https://github.com/coder/code-server.git",
"ssh_url": "git@github.com:coder/code-server.git", "ssh_url": "git@github.com:coder/code-server.git",
"default_branch": "main", "default_branch": "main",
"last_build_update": "2026-03-11T22:19:15Z" "last_build_update": "2026-03-23T18:50:37Z"
} }

View File

@ -4,13 +4,13 @@
"description": "A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.", "description": "A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.",
"html_url": "https://github.com/gethomepage/homepage", "html_url": "https://github.com/gethomepage/homepage",
"language": "JavaScript", "language": "JavaScript",
"stars_count": 28865, "stars_count": 29108,
"forks_count": 1813, "forks_count": 1825,
"open_issues_count": 1, "open_issues_count": 1,
"updated_at": "2026-03-12T15:01:15Z", "updated_at": "2026-03-23T22:44:02Z",
"created_at": "2022-08-24T07:29:42Z", "created_at": "2022-08-24T07:29:42Z",
"clone_url": "https://github.com/gethomepage/homepage.git", "clone_url": "https://github.com/gethomepage/homepage.git",
"ssh_url": "git@github.com:gethomepage/homepage.git", "ssh_url": "git@github.com:gethomepage/homepage.git",
"default_branch": "dev", "default_branch": "dev",
"last_build_update": "2026-03-12T12:22:19Z" "last_build_update": "2026-03-23T12:27:34Z"
} }

View File

@ -4,13 +4,13 @@
"description": "Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD", "description": "Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD",
"html_url": "https://github.com/go-gitea/gitea", "html_url": "https://github.com/go-gitea/gitea",
"language": "Go", "language": "Go",
"stars_count": 54251, "stars_count": 54439,
"forks_count": 6466, "forks_count": 6485,
"open_issues_count": 2853, "open_issues_count": 2870,
"updated_at": "2026-03-12T17:33:45Z", "updated_at": "2026-03-23T23:19:17Z",
"created_at": "2016-11-01T02:13:26Z", "created_at": "2016-11-01T02:13:26Z",
"clone_url": "https://github.com/go-gitea/gitea.git", "clone_url": "https://github.com/go-gitea/gitea.git",
"ssh_url": "git@github.com:go-gitea/gitea.git", "ssh_url": "git@github.com:go-gitea/gitea.git",
"default_branch": "main", "default_branch": "main",
"last_build_update": "2026-03-12T08:26:47Z" "last_build_update": "2026-03-23T23:20:24Z"
} }

View File

@ -4,13 +4,13 @@
"description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard. Single binary app.", "description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard. Single binary app.",
"html_url": "https://github.com/knadh/listmonk", "html_url": "https://github.com/knadh/listmonk",
"language": "Go", "language": "Go",
"stars_count": 19256, "stars_count": 19329,
"forks_count": 1946, "forks_count": 1958,
"open_issues_count": 101, "open_issues_count": 105,
"updated_at": "2026-03-12T16:54:34Z", "updated_at": "2026-03-23T23:36:16Z",
"created_at": "2019-06-26T05:08:39Z", "created_at": "2019-06-26T05:08:39Z",
"clone_url": "https://github.com/knadh/listmonk.git", "clone_url": "https://github.com/knadh/listmonk.git",
"ssh_url": "git@github.com:knadh/listmonk.git", "ssh_url": "git@github.com:knadh/listmonk.git",
"default_branch": "master", "default_branch": "master",
"last_build_update": "2026-03-12T16:54:26Z" "last_build_update": "2026-03-23T11:44:19Z"
} }

View File

@ -4,13 +4,13 @@
"description": "Create & scan cute qr codes easily \ud83d\udc7e", "description": "Create & scan cute qr codes easily \ud83d\udc7e",
"html_url": "https://github.com/lyqht/mini-qr", "html_url": "https://github.com/lyqht/mini-qr",
"language": "Vue", "language": "Vue",
"stars_count": 1905, "stars_count": 1928,
"forks_count": 241, "forks_count": 243,
"open_issues_count": 19, "open_issues_count": 20,
"updated_at": "2026-03-12T17:06:09Z", "updated_at": "2026-03-23T14:42:50Z",
"created_at": "2023-04-21T14:20:14Z", "created_at": "2023-04-21T14:20:14Z",
"clone_url": "https://github.com/lyqht/mini-qr.git", "clone_url": "https://github.com/lyqht/mini-qr.git",
"ssh_url": "git@github.com:lyqht/mini-qr.git", "ssh_url": "git@github.com:lyqht/mini-qr.git",
"default_branch": "main", "default_branch": "main",
"last_build_update": "2026-03-11T14:53:40Z" "last_build_update": "2026-03-13T12:48:04Z"
} }

View File

@ -4,13 +4,13 @@
"description": "Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.", "description": "Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.",
"html_url": "https://github.com/n8n-io/n8n", "html_url": "https://github.com/n8n-io/n8n",
"language": "TypeScript", "language": "TypeScript",
"stars_count": 178836, "stars_count": 180706,
"forks_count": 55709, "forks_count": 56089,
"open_issues_count": 1414, "open_issues_count": 1433,
"updated_at": "2026-03-12T17:33:04Z", "updated_at": "2026-03-23T23:47:25Z",
"created_at": "2019-06-22T09:24:21Z", "created_at": "2019-06-22T09:24:21Z",
"clone_url": "https://github.com/n8n-io/n8n.git", "clone_url": "https://github.com/n8n-io/n8n.git",
"ssh_url": "git@github.com:n8n-io/n8n.git", "ssh_url": "git@github.com:n8n-io/n8n.git",
"default_branch": "master", "default_branch": "master",
"last_build_update": "2026-03-12T16:48:37Z" "last_build_update": "2026-03-23T22:55:38Z"
} }

View File

@ -4,13 +4,13 @@
"description": "\ud83d\udd25 \ud83d\udd25 \ud83d\udd25 A Free & Self-hostable Airtable Alternative", "description": "\ud83d\udd25 \ud83d\udd25 \ud83d\udd25 A Free & Self-hostable Airtable Alternative",
"html_url": "https://github.com/nocodb/nocodb", "html_url": "https://github.com/nocodb/nocodb",
"language": "TypeScript", "language": "TypeScript",
"stars_count": 62459, "stars_count": 62544,
"forks_count": 4662, "forks_count": 4679,
"open_issues_count": 636, "open_issues_count": 647,
"updated_at": "2026-03-12T17:22:54Z", "updated_at": "2026-03-23T22:41:15Z",
"created_at": "2017-10-29T18:51:48Z", "created_at": "2017-10-29T18:51:48Z",
"clone_url": "https://github.com/nocodb/nocodb.git", "clone_url": "https://github.com/nocodb/nocodb.git",
"ssh_url": "git@github.com:nocodb/nocodb.git", "ssh_url": "git@github.com:nocodb/nocodb.git",
"default_branch": "develop", "default_branch": "develop",
"last_build_update": "2026-03-12T15:47:46Z" "last_build_update": "2026-03-23T19:39:55Z"
} }

View File

@ -4,13 +4,13 @@
"description": "Get up and running with Kimi-K2.5, GLM-5, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.", "description": "Get up and running with Kimi-K2.5, GLM-5, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.",
"html_url": "https://github.com/ollama/ollama", "html_url": "https://github.com/ollama/ollama",
"language": "Go", "language": "Go",
"stars_count": 164918, "stars_count": 165968,
"forks_count": 14922, "forks_count": 15121,
"open_issues_count": 2623, "open_issues_count": 2708,
"updated_at": "2026-03-12T17:11:02Z", "updated_at": "2026-03-23T23:47:27Z",
"created_at": "2023-06-26T19:39:32Z", "created_at": "2023-06-26T19:39:32Z",
"clone_url": "https://github.com/ollama/ollama.git", "clone_url": "https://github.com/ollama/ollama.git",
"ssh_url": "git@github.com:ollama/ollama.git", "ssh_url": "git@github.com:ollama/ollama.git",
"default_branch": "main", "default_branch": "main",
"last_build_update": "2026-03-12T08:42:26Z" "last_build_update": "2026-03-23T23:31:24Z"
} }

View File

@ -4,13 +4,13 @@
"description": "Documentation that simply works", "description": "Documentation that simply works",
"html_url": "https://github.com/squidfunk/mkdocs-material", "html_url": "https://github.com/squidfunk/mkdocs-material",
"language": "Python", "language": "Python",
"stars_count": 26261, "stars_count": 26370,
"forks_count": 4053, "forks_count": 4058,
"open_issues_count": 2, "open_issues_count": 1,
"updated_at": "2026-03-12T17:20:59Z", "updated_at": "2026-03-23T21:42:58Z",
"created_at": "2016-01-28T22:09:23Z", "created_at": "2016-01-28T22:09:23Z",
"clone_url": "https://github.com/squidfunk/mkdocs-material.git", "clone_url": "https://github.com/squidfunk/mkdocs-material.git",
"ssh_url": "git@github.com:squidfunk/mkdocs-material.git", "ssh_url": "git@github.com:squidfunk/mkdocs-material.git",
"default_branch": "master", "default_branch": "master",
"last_build_update": "2026-03-10T15:42:14Z" "last_build_update": "2026-03-22T15:57:47Z"
} }

7
mkdocs/docs/lander.md Normal file
View File

@ -0,0 +1,7 @@
---
template: lander.html
hide:
- navigation
- toc
title: "lander"
---

7
mkdocs/docs/main.md Normal file
View File

@ -0,0 +1,7 @@
---
template: main.html
hide:
- navigation
- toc
title: "main"
---

View File

@ -386,6 +386,29 @@
box-shadow: 0 4px 16px rgba(111, 66, 193, 0.4); box-shadow: 0 4px 16px rgba(111, 66, 193, 0.4);
} }
.btn-demo {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.625rem 1.5rem;
background: transparent;
color: var(--primary-light);
font-weight: 600;
font-size: 0.9rem;
border-radius: 8px;
border: 1px solid var(--primary-light);
cursor: pointer;
transition: all var(--transition);
text-decoration: none;
}
.btn-demo:hover {
background: rgba(139, 92, 246, 0.1);
color: var(--primary-light);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(111, 66, 193, 0.2);
}
.btn-secondary { .btn-secondary {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
@ -1167,6 +1190,141 @@
color: var(--text-muted); color: var(--text-muted);
} }
/* ============================================
FEATURE NODE — HOVER SCREENSHOT PREVIEW
============================================ */
.feature-node[data-screenshot] {
cursor: pointer;
}
.node-screenshot {
max-height: 0;
overflow: hidden;
margin: 0 -1.5rem;
border-radius: 0;
transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1), margin-top 0.35s ease, margin-bottom 0.35s ease;
margin-top: 0;
margin-bottom: 0;
}
.feature-node:hover .node-screenshot {
max-height: 300px;
margin-top: 0.75rem;
margin-bottom: 0.5rem;
}
.node-screenshot img {
width: 100%;
height: auto;
display: block;
border-top: 1px solid var(--border-color);
border-bottom: 1px solid var(--border-color);
}
.node-screenshot-label {
padding: 0.3rem 1.5rem;
font-size: 0.7rem;
color: var(--text-muted);
display: flex;
align-items: center;
gap: 0.4rem;
background: rgba(0,0,0,0.15);
}
[data-theme="light"] .node-screenshot-label {
background: rgba(0,0,0,0.04);
}
.node-screenshot-label .screenshot-dot {
width: 5px;
height: 5px;
border-radius: 50%;
background: var(--success);
flex-shrink: 0;
}
/* On mobile, hide hover screenshots (touch doesn't hover well) */
@media (max-width: 768px) {
.node-screenshot {
display: none;
}
}
/* ============================================
NARRATIVE BRIDGE SECTION
============================================ */
.narrative-bridge {
padding: 4rem 0 2rem;
background: transparent;
}
.narrative-content {
max-width: 720px;
margin: 0 auto;
text-align: center;
background: rgba(30, 41, 59, 0.85);
border: 1px solid rgba(148, 163, 184, 0.1);
border-radius: var(--radius-lg);
padding: 3rem 2.5rem;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
position: relative;
z-index: 2;
}
[data-theme="light"] .narrative-content {
background: rgba(255, 255, 255, 0.88);
border-color: rgba(100, 116, 139, 0.15);
}
.narrative-eyebrow {
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--primary-light);
margin-bottom: 1rem;
}
.narrative-content h2 {
font-size: clamp(1.5rem, 3vw, 2.25rem);
margin-bottom: 1.25rem;
line-height: 1.3;
}
.narrative-body {
color: var(--text-secondary);
font-size: 1.1rem;
line-height: 1.7;
}
/* In-feature narrative connectors */
.branch-narrative {
max-width: 640px;
margin: 2rem auto 3rem;
text-align: center;
padding: 1.5rem 2rem;
background: rgba(30, 41, 59, 0.85);
border: 1px solid rgba(148, 163, 184, 0.1);
border-radius: var(--radius-lg);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
position: relative;
z-index: 2;
}
[data-theme="light"] .branch-narrative {
background: rgba(255, 255, 255, 0.45);
border-color: rgba(100, 116, 139, 0.1);
}
.branch-narrative p {
color: var(--text-secondary);
font-size: 1rem;
line-height: 1.7;
margin: 0;
}
/* ============================================ /* ============================================
LIVE SITES LIVE SITES
============================================ */ ============================================ */
@ -1915,6 +2073,7 @@
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
</svg> </svg>
</button> </button>
<a href="https://app.cmlite.org" class="btn-demo" target="_blank" rel="noopener">Explore Demo</a>
<a href="#get-started" class="btn-primary">Get Started</a> <a href="#get-started" class="btn-primary">Get Started</a>
<button class="hamburger" id="hamburger" aria-label="Open menu" type="button"> <button class="hamburger" id="hamburger" aria-label="Open menu" type="button">
<svg class="icon-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"> <svg class="icon-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
@ -1935,7 +2094,8 @@
<a href="#pricing">Pricing</a> <a href="#pricing">Pricing</a>
<a href="/docs/">Documentation</a> <a href="/docs/">Documentation</a>
<a href="https://gitea.bnkops.com/admin/changemaker.lite" target="_blank" rel="noopener">Source Code</a> <a href="https://gitea.bnkops.com/admin/changemaker.lite" target="_blank" rel="noopener">Source Code</a>
<a href="#get-started" class="btn-primary" style="text-align:center; margin-top:1rem;">Get Started</a> <a href="https://app.cmlite.org" class="btn-demo" style="text-align:center; margin-top:0.5rem;" target="_blank" rel="noopener">Explore Demo</a>
<a href="#get-started" class="btn-primary" style="text-align:center; margin-top:0.5rem;">Get Started</a>
</div> </div>
<!-- ============================================ <!-- ============================================
@ -1964,8 +2124,8 @@
A <a href="#" class="free-asterisk" id="free-asterisk-link">free*</a> and open source toolkit built for growing political movements. A <a href="#" class="free-asterisk" id="free-asterisk-link">free*</a> and open source toolkit built for growing political movements.
</p> </p>
<div class="hero-cta"> <div class="hero-cta">
<a href="mailto:cmlite@bnkops.ca?subject=Request%20to%20Chat%20-%20CMLITE&body=Hi%20CMlite%20Team%2C%20I%20would%20like%20to%20chat!%20Please%20send%20me%20a%20email%20back.%20Cheers%2C%20" class="btn-primary">Schedule a Chat <span aria-hidden="true">&rarr;</span></a> <a href="https://app.cmlite.org" class="btn-primary" target="_blank" rel="noopener">Explore the Demo <span aria-hidden="true">&rarr;</span></a>
<a href="/docs/" class="btn-secondary">Read the Docs</a> <a href="mailto:cmlite@bnkops.ca?subject=Request%20to%20Chat%20-%20CMLITE&body=Hi%20CMlite%20Team%2C%20I%20would%20like%20to%20chat!%20Please%20send%20me%20a%20email%20back.%20Cheers%2C%20" class="btn-secondary">Schedule a Chat</a>
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2" class="btn-secondary" target="_blank" rel="noopener">Source Code</a> <a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2" class="btn-secondary" target="_blank" rel="noopener">Source Code</a>
</div> </div>
@ -2088,6 +2248,21 @@
</div> </div>
</section> </section>
<!-- ============================================
NARRATIVE BRIDGE — Journey Starts
============================================ -->
<section class="section narrative-bridge" id="journey">
<div class="container">
<div class="narrative-content reveal">
<p class="narrative-eyebrow">The Journey</p>
<h2>What if your entire campaign ran from one place you actually own?</h2>
<p class="narrative-body">
Imagine a new volunteer walks up to your campaign office. Within minutes, they&rsquo;re in your team chat, signed up for a canvassing shift, and synced across your map, newsletter, and event calendar &mdash; <strong>without creating accounts on five different platforms</strong>. That&rsquo;s what an integrated, self-hosted stack makes possible. Below is everything you get from day one.
</p>
</div>
</div>
</section>
<!-- ============================================ <!-- ============================================
FEATURE NETWORK FEATURE NETWORK
============================================ --> ============================================ -->
@ -2112,7 +2287,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Campaigns — postal code lookup to find representatives and send advocacy emails</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Public Campaigns — postal code lookup to find representatives and send advocacy emails</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-listmonk">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-listmonk.png" alt="Listmonk newsletter admin" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Newsletter sync dashboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4EC;</div> <div class="node-icon">&#x1F4EC;</div>
<h4>Listmonk Newsletters</h4> <h4>Listmonk Newsletters</h4>
@ -2120,7 +2296,8 @@
<p>Full newsletter platform with subscriber management, templates, and analytics. Drop-in replacement for Mailchimp.</p> <p>Full newsletter platform with subscriber management, templates, and analytics. Drop-in replacement for Mailchimp.</p>
<div class="node-tags"><span class="node-tag">Unlimited subscribers</span><span class="node-tag">Templates</span><span class="node-tag">Analytics</span></div> <div class="node-tags"><span class="node-tag">Unlimited subscribers</span><span class="node-tag">Templates</span><span class="node-tag">Analytics</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="influence-campaigns">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/influence-campaigns.png" alt="Advocacy campaign management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Campaign management with tracking</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F3AF;</div> <div class="node-icon">&#x1F3AF;</div>
<h4>Influence Campaigns</h4> <h4>Influence Campaigns</h4>
@ -2128,7 +2305,8 @@
<p>Postal code to representative lookup. Automated advocacy emails to elected officials with tracking and response collection.</p> <p>Postal code to representative lookup. Automated advocacy emails to elected officials with tracking and response collection.</p>
<div class="node-tags"><span class="node-tag">Rep lookup</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Tracking</span></div> <div class="node-tags"><span class="node-tag">Rep lookup</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Tracking</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="email-templates">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/email-templates.png" alt="Email template editor" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Visual email template builder</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x2709;</div> <div class="node-icon">&#x2709;</div>
<h4>Email Templates</h4> <h4>Email Templates</h4>
@ -2136,7 +2314,8 @@
<p>GrapesJS visual email editor with variable substitution, versioning, and instant preview. Build once, send everywhere.</p> <p>GrapesJS visual email editor with variable substitution, versioning, and instant preview. Build once, send everywhere.</p>
<div class="node-tags"><span class="node-tag">Visual editor</span><span class="node-tag">Variables</span><span class="node-tag">Versioning</span></div> <div class="node-tags"><span class="node-tag">Visual editor</span><span class="node-tag">Variables</span><span class="node-tag">Versioning</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-campaigns">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-campaigns.png" alt="Public response wall" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public campaign page with rep lookup</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4AC;</div> <div class="node-icon">&#x1F4AC;</div>
<h4>Response Wall</h4> <h4>Response Wall</h4>
@ -2144,7 +2323,8 @@
<p>Public response collection with moderation, upvoting, and verification. Showcase supporter voices on your campaigns.</p> <p>Public response collection with moderation, upvoting, and verification. Showcase supporter voices on your campaigns.</p>
<div class="node-tags"><span class="node-tag">Moderation</span><span class="node-tag">Upvoting</span><span class="node-tag">Verification</span></div> <div class="node-tags"><span class="node-tag">Moderation</span><span class="node-tag">Upvoting</span><span class="node-tag">Verification</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-dashboard">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-dashboard.png" alt="Admin dashboard with chat widget" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Team chat integrated into admin</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F680;</div> <div class="node-icon">&#x1F680;</div>
<h4>Rocket.Chat</h4> <h4>Rocket.Chat</h4>
@ -2152,7 +2332,8 @@
<p>Self-hosted team chat with SSO integration. Automatic channel notifications for shift signups, canvass sessions, and campaign responses.</p> <p>Self-hosted team chat with SSO integration. Automatic channel notifications for shift signups, canvass sessions, and campaign responses.</p>
<div class="node-tags"><span class="node-tag">SSO</span><span class="node-tag">Channels</span><span class="node-tag">Slack alternative</span></div> <div class="node-tags"><span class="node-tag">SSO</span><span class="node-tag">Channels</span><span class="node-tag">Slack alternative</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="email-queue">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/email-queue.png" alt="Email queue dashboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Async email queue with status tracking</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F514;</div> <div class="node-icon">&#x1F514;</div>
<h4>Smart Notifications</h4> <h4>Smart Notifications</h4>
@ -2160,7 +2341,8 @@
<p>Async notification queue for admin alerts and volunteer feedback. Shift reminders, session summaries, and signup confirmations.</p> <p>Async notification queue for admin alerts and volunteer feedback. Shift reminders, session summaries, and signup confirmations.</p>
<div class="node-tags"><span class="node-tag">BullMQ</span><span class="node-tag">Reminders</span><span class="node-tag">Summaries</span></div> <div class="node-tags"><span class="node-tag">BullMQ</span><span class="node-tag">Reminders</span><span class="node-tag">Summaries</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="sms-dashboard">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/sms-dashboard.png" alt="SMS campaign dashboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> SMS outreach via Termux bridge</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4F1;</div> <div class="node-icon">&#x1F4F1;</div>
<h4>SMS Campaigns</h4> <h4>SMS Campaigns</h4>
@ -2168,7 +2350,8 @@
<p>Text message outreach via Termux Android bridge. Contact lists, templated campaigns, delivery tracking, response sync, and device health monitoring.</p> <p>Text message outreach via Termux Android bridge. Contact lists, templated campaigns, delivery tracking, response sync, and device health monitoring.</p>
<div class="node-tags"><span class="node-tag">Termux bridge</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Response sync</span></div> <div class="node-tags"><span class="node-tag">Termux bridge</span><span class="node-tag">BullMQ queue</span><span class="node-tag">Response sync</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-dashboard">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-dashboard.png" alt="Admin with floating chat widget" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Floating chat panel in admin</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F5E8;</div> <div class="node-icon">&#x1F5E8;</div>
<h4>Chat Widget</h4> <h4>Chat Widget</h4>
@ -2193,7 +2376,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Map — interactive Leaflet map with territory cuts, marker clustering, and support levels</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Public Map — interactive Leaflet map with territory cuts, marker clustering, and support levels</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="public-map">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-map.png" alt="Interactive Leaflet map" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Full-screen map with cuts and support levels</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F30D;</div> <div class="node-icon">&#x1F30D;</div>
<h4>Interactive Map</h4> <h4>Interactive Map</h4>
@ -2201,7 +2385,8 @@
<p>Leaflet-powered map with multi-provider geocoding, color-coded markers, cuts overlay, and fullscreen mode.</p> <p>Leaflet-powered map with multi-provider geocoding, color-coded markers, cuts overlay, and fullscreen mode.</p>
<div class="node-tags"><span class="node-tag">6 geocode providers</span><span class="node-tag">Leaflet</span><span class="node-tag">Clustering</span></div> <div class="node-tags"><span class="node-tag">6 geocode providers</span><span class="node-tag">Leaflet</span><span class="node-tag">Clustering</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="volunteer-dashboard">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/volunteer-dashboard.png" alt="GPS canvassing map" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Mobile canvass map with GPS tracking</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F6B6;</div> <div class="node-icon">&#x1F6B6;</div>
<h4>GPS Canvassing</h4> <h4>GPS Canvassing</h4>
@ -2209,7 +2394,8 @@
<p>Full-screen mobile canvass map with real-time GPS, walking route algorithm, visit recording, and outcome tracking.</p> <p>Full-screen mobile canvass map with real-time GPS, walking route algorithm, visit recording, and outcome tracking.</p>
<div class="node-tags"><span class="node-tag">GPS tracking</span><span class="node-tag">Walking routes</span><span class="node-tag">Mobile-first</span></div> <div class="node-tags"><span class="node-tag">GPS tracking</span><span class="node-tag">Walking routes</span><span class="node-tag">Mobile-first</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-cuts">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-cuts.png" alt="Polygon cuts editor" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Territory cut management</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x2702;</div> <div class="node-icon">&#x2702;</div>
<h4>Polygon Cuts</h4> <h4>Polygon Cuts</h4>
@ -2217,7 +2403,8 @@
<p>Draw geographic boundaries on the map. Assign locations to cuts for organized canvassing territories.</p> <p>Draw geographic boundaries on the map. Assign locations to cuts for organized canvassing territories.</p>
<div class="node-tags"><span class="node-tag">Drawing mode</span><span class="node-tag">Point-in-polygon</span><span class="node-tag">Spatial queries</span></div> <div class="node-tags"><span class="node-tag">Drawing mode</span><span class="node-tag">Point-in-polygon</span><span class="node-tag">Spatial queries</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-shifts">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-shifts.png" alt="Public volunteer shifts" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public shift signup with capacity tracking</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4C5;</div> <div class="node-icon">&#x1F4C5;</div>
<h4>Volunteer Shifts</h4> <h4>Volunteer Shifts</h4>
@ -2225,7 +2412,8 @@
<p>Shift scheduling with public signup, confirmation emails, cut assignment, and capacity management.</p> <p>Shift scheduling with public signup, confirmation emails, cut assignment, and capacity management.</p>
<div class="node-tags"><span class="node-tag">Public signup</span><span class="node-tag">Email confirm</span><span class="node-tag">Cut assignment</span></div> <div class="node-tags"><span class="node-tag">Public signup</span><span class="node-tag">Email confirm</span><span class="node-tag">Cut assignment</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="data-quality">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/data-quality.png" alt="Walk sheets and data quality" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Data quality dashboard for canvassing</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4CB;</div> <div class="node-icon">&#x1F4CB;</div>
<h4>Walk Sheets</h4> <h4>Walk Sheets</h4>
@ -2233,7 +2421,8 @@
<p>Printable walk sheet forms with QR codes for each cut. Take the field data offline with printed reports.</p> <p>Printable walk sheet forms with QR codes for each cut. Take the field data offline with printed reports.</p>
<div class="node-tags"><span class="node-tag">QR codes</span><span class="node-tag">Printable</span><span class="node-tag">Cut reports</span></div> <div class="node-tags"><span class="node-tag">QR codes</span><span class="node-tag">Printable</span><span class="node-tag">Cut reports</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-locations">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-locations.png" alt="NAR import and locations" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Location management with NAR import</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F1E8;&#x1F1E6;</div> <div class="node-icon">&#x1F1E8;&#x1F1E6;</div>
<h4>NAR Import</h4> <h4>NAR Import</h4>
@ -2241,7 +2430,8 @@
<p>Import Canadian National Address Register data with province/city/postal filtering, coordinate projection, and streaming.</p> <p>Import Canadian National Address Register data with province/city/postal filtering, coordinate projection, and streaming.</p>
<div class="node-tags"><span class="node-tag">2025 format</span><span class="node-tag">Proj4</span><span class="node-tag">Streaming</span></div> <div class="node-tags"><span class="node-tag">2025 format</span><span class="node-tag">Proj4</span><span class="node-tag">Streaming</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-events">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-events.png" alt="Gancio event calendar" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Community calendar with shift sync</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4C6;</div> <div class="node-icon">&#x1F4C6;</div>
<h4>Gancio Events</h4> <h4>Gancio Events</h4>
@ -2252,6 +2442,11 @@
</div> </div>
</div> </div>
<!-- Narrative connector -->
<div class="branch-narrative reveal">
<p>Your message is only as strong as the channels that carry it. Once your team is connected and your territory mapped, you need to <strong>tell your story</strong> &mdash; through video, documentation, landing pages, and more.</p>
</div>
<!-- ====== BRANCH 3: Content & Media ====== --> <!-- ====== BRANCH 3: Content & Media ====== -->
<div class="branch branch-content" data-branch="content"> <div class="branch branch-content" data-branch="content">
<div class="branch-header reveal"> <div class="branch-header reveal">
@ -2266,7 +2461,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Media Gallery — browse videos, shorts, photos, and playlists with live chat and reactions</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Media Gallery — browse videos, shorts, photos, and playlists with live chat and reactions</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="media-library">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/media-library.png" alt="Video library" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Video management with metadata</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4F9;</div> <div class="node-icon">&#x1F4F9;</div>
<h4>Video Library</h4> <h4>Video Library</h4>
@ -2274,7 +2470,8 @@
<p>Upload and manage videos with FFprobe metadata, scheduled publishing, view analytics, emoji reactions, threaded comments, and live chat.</p> <p>Upload and manage videos with FFprobe metadata, scheduled publishing, view analytics, emoji reactions, threaded comments, and live chat.</p>
<div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">Live chat</span><span class="node-tag">Scheduling</span></div> <div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">Live chat</span><span class="node-tag">Scheduling</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="landing-pages">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/landing-pages.png" alt="Landing page builder" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> GrapesJS drag-and-drop page builder</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F3A8;</div> <div class="node-icon">&#x1F3A8;</div>
<h4>Landing Page Builder</h4> <h4>Landing Page Builder</h4>
@ -2282,7 +2479,8 @@
<p>GrapesJS drag-and-drop page editor with block library, custom components, and instant public publishing at /p/slug.</p> <p>GrapesJS drag-and-drop page editor with block library, custom components, and instant public publishing at /p/slug.</p>
<div class="node-tags"><span class="node-tag">Drag &amp; drop</span><span class="node-tag">Block library</span><span class="node-tag">Instant publish</span></div> <div class="node-tags"><span class="node-tag">Drag &amp; drop</span><span class="node-tag">Block library</span><span class="node-tag">Instant publish</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="mkdocs">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/mkdocs.png" alt="MkDocs documentation site" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Material-themed documentation site</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4D6;</div> <div class="node-icon">&#x1F4D6;</div>
<h4>MkDocs Documentation</h4> <h4>MkDocs Documentation</h4>
@ -2290,7 +2488,8 @@
<p>Material-themed docs with full-text search, blog, social cards, and Gitea-backed page comments with anonymous posting and moderation.</p> <p>Material-themed docs with full-text search, blog, social cards, and Gitea-backed page comments with anonymous posting and moderation.</p>
<div class="node-tags"><span class="node-tag">Material theme</span><span class="node-tag">Comments</span><span class="node-tag">Blog</span></div> <div class="node-tags"><span class="node-tag">Material theme</span><span class="node-tag">Comments</span><span class="node-tag">Blog</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="code-server">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/code-server.png" alt="Code Server IDE" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> VS Code in the browser</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4BB;</div> <div class="node-icon">&#x1F4BB;</div>
<h4>Code Server</h4> <h4>Code Server</h4>
@ -2298,7 +2497,8 @@
<p>Full VS Code in the browser. Edit configuration, templates, and code from anywhere without SSH.</p> <p>Full VS Code in the browser. Edit configuration, templates, and code from anywhere without SSH.</p>
<div class="node-tags"><span class="node-tag">VS Code</span><span class="node-tag">Browser IDE</span><span class="node-tag">Extensions</span></div> <div class="node-tags"><span class="node-tag">VS Code</span><span class="node-tag">Browser IDE</span><span class="node-tag">Extensions</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="excalidraw">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/excalidraw.png" alt="Excalidraw whiteboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Collaborative whiteboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x270F;</div> <div class="node-icon">&#x270F;</div>
<h4>Excalidraw Whiteboard</h4> <h4>Excalidraw Whiteboard</h4>
@ -2306,7 +2506,8 @@
<p>Collaborative diagramming and whiteboard tool. Plan canvassing routes, sketch campaign strategies, and brainstorm as a team.</p> <p>Collaborative diagramming and whiteboard tool. Plan canvassing routes, sketch campaign strategies, and brainstorm as a team.</p>
<div class="node-tags"><span class="node-tag">Collaborative</span><span class="node-tag">Diagrams</span><span class="node-tag">Real-time</span></div> <div class="node-tags"><span class="node-tag">Collaborative</span><span class="node-tag">Diagrams</span><span class="node-tag">Real-time</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="media-analytics">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/media-analytics.png" alt="Media analytics" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Engagement analytics dashboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4F7;</div> <div class="node-icon">&#x1F4F7;</div>
<h4>Photo Management</h4> <h4>Photo Management</h4>
@ -2314,7 +2515,8 @@
<p>Album organization with bulk uploads, metadata extraction, and engagement tracking. Reactions, comments, and a public photo gallery.</p> <p>Album organization with bulk uploads, metadata extraction, and engagement tracking. Reactions, comments, and a public photo gallery.</p>
<div class="node-tags"><span class="node-tag">Albums</span><span class="node-tag">Engagement</span><span class="node-tag">Gallery</span></div> <div class="node-tags"><span class="node-tag">Albums</span><span class="node-tag">Engagement</span><span class="node-tag">Gallery</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-gallery">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-gallery.png" alt="Public media gallery" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public gallery with categories</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F3B5;</div> <div class="node-icon">&#x1F3B5;</div>
<h4>Playlists</h4> <h4>Playlists</h4>
@ -2322,7 +2524,8 @@
<p>Curated video collections with admin, user, and public playlists. Drag-reorder, sidebar navigation, featured carousel, and dedicated viewer page.</p> <p>Curated video collections with admin, user, and public playlists. Drag-reorder, sidebar navigation, featured carousel, and dedicated viewer page.</p>
<div class="node-tags"><span class="node-tag">Curated</span><span class="node-tag">Public/Private</span><span class="node-tag">Reorderable</span></div> <div class="node-tags"><span class="node-tag">Curated</span><span class="node-tag">Public/Private</span><span class="node-tag">Reorderable</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-gallery">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-gallery.png" alt="Shorts video feed" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Video gallery with live chat</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4F2;</div> <div class="node-icon">&#x1F4F2;</div>
<h4>Shorts Feed</h4> <h4>Shorts Feed</h4>
@ -2347,7 +2550,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Public Homepage — hero section, upcoming shifts, latest videos, and activity feed</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Public Homepage — hero section, upcoming shifts, latest videos, and activity feed</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="nocodb">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/nocodb.png" alt="NocoDB data browser" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Airtable-alternative data browser</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F5C4;</div> <div class="node-icon">&#x1F5C4;</div>
<h4>NocoDB</h4> <h4>NocoDB</h4>
@ -2355,7 +2559,8 @@
<p>Airtable-alternative database browser. Browse, filter, and export your campaign data through a spreadsheet-like interface.</p> <p>Airtable-alternative database browser. Browse, filter, and export your campaign data through a spreadsheet-like interface.</p>
<div class="node-tags"><span class="node-tag">Read-only</span><span class="node-tag">Filters</span><span class="node-tag">Export</span></div> <div class="node-tags"><span class="node-tag">Read-only</span><span class="node-tag">Filters</span><span class="node-tag">Export</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="n8n">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/n8n.png" alt="n8n workflow automation" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Visual workflow automation</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x26A1;</div> <div class="node-icon">&#x26A1;</div>
<h4>n8n Workflows</h4> <h4>n8n Workflows</h4>
@ -2363,7 +2568,8 @@
<p>Visual workflow automation. Connect APIs, trigger actions, and build custom integrations without code.</p> <p>Visual workflow automation. Connect APIs, trigger actions, and build custom integrations without code.</p>
<div class="node-tags"><span class="node-tag">Visual builder</span><span class="node-tag">400+ integrations</span><span class="node-tag">Webhooks</span></div> <div class="node-tags"><span class="node-tag">Visual builder</span><span class="node-tag">400+ integrations</span><span class="node-tag">Webhooks</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="gitea">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/gitea.png" alt="Gitea Git hosting" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Self-hosted Git with CI/CD</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4E6;</div> <div class="node-icon">&#x1F4E6;</div>
<h4>Gitea</h4> <h4>Gitea</h4>
@ -2371,7 +2577,8 @@
<p>Self-hosted Git repository. Version control for your campaign code, configs, and documentation.</p> <p>Self-hosted Git repository. Version control for your campaign code, configs, and documentation.</p>
<div class="node-tags"><span class="node-tag">Git hosting</span><span class="node-tag">Issues</span><span class="node-tag">CI/CD</span></div> <div class="node-tags"><span class="node-tag">Git hosting</span><span class="node-tag">Issues</span><span class="node-tag">CI/CD</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="miniqr">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/miniqr.png" alt="Mini QR generator" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> QR code generator</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4F1;</div> <div class="node-icon">&#x1F4F1;</div>
<h4>Mini QR</h4> <h4>Mini QR</h4>
@ -2379,7 +2586,8 @@
<p>QR code generator for walk sheets, campaign materials, and event signage. Instant PNG generation.</p> <p>QR code generator for walk sheets, campaign materials, and event signage. Instant PNG generation.</p>
<div class="node-tags"><span class="node-tag">PNG output</span><span class="node-tag">Embeddable</span><span class="node-tag">Public API</span></div> <div class="node-tags"><span class="node-tag">PNG output</span><span class="node-tag">Embeddable</span><span class="node-tag">Public API</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-dashboard">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-dashboard.png" alt="Command palette search" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Ctrl+K global command palette</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x2318;</div> <div class="node-icon">&#x2318;</div>
<h4>Command Palette</h4> <h4>Command Palette</h4>
@ -2387,7 +2595,8 @@
<p>Global Ctrl+K search across pages, campaigns, locations, users, and settings. Fuzzy matching, recent items, and keyboard-driven navigation.</p> <p>Global Ctrl+K search across pages, campaigns, locations, users, and settings. Fuzzy matching, recent items, and keyboard-driven navigation.</p>
<div class="node-tags"><span class="node-tag">Ctrl+K</span><span class="node-tag">Fuzzy search</span><span class="node-tag">Keyboard-first</span></div> <div class="node-tags"><span class="node-tag">Ctrl+K</span><span class="node-tag">Fuzzy search</span><span class="node-tag">Keyboard-first</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-settings">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-settings.png" alt="Navigation settings" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Organization and nav settings</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x2699;</div> <div class="node-icon">&#x2699;</div>
<h4>Navigation Settings</h4> <h4>Navigation Settings</h4>
@ -2412,7 +2621,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Observability Dashboard — Prometheus metrics, Grafana dashboards, and alert management</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Observability Dashboard — Prometheus metrics, Grafana dashboards, and alert management</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="pangolin-tunnel">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/pangolin-tunnel.png" alt="Pangolin tunnel management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Tunnel management dashboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F310;</div> <div class="node-icon">&#x1F310;</div>
<h4>Pangolin Tunnel</h4> <h4>Pangolin Tunnel</h4>
@ -2420,7 +2630,8 @@
<p>Expose your self-hosted services to the internet without port forwarding. Newt container integration with automatic SSL.</p> <p>Expose your self-hosted services to the internet without port forwarding. Newt container integration with automatic SSL.</p>
<div class="node-tags"><span class="node-tag">No port-forward</span><span class="node-tag">Auto SSL</span><span class="node-tag">Newt</span></div> <div class="node-tags"><span class="node-tag">No port-forward</span><span class="node-tag">Auto SSL</span><span class="node-tag">Newt</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-observability">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-observability.png" alt="Observability dashboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Prometheus + Grafana monitoring</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4C8;</div> <div class="node-icon">&#x1F4C8;</div>
<h4>Prometheus + Grafana</h4> <h4>Prometheus + Grafana</h4>
@ -2428,7 +2639,8 @@
<p>12 custom metrics, 3 dashboards, alert rules, and service health monitoring. Full observability stack.</p> <p>12 custom metrics, 3 dashboards, alert rules, and service health monitoring. Full observability stack.</p>
<div class="node-tags"><span class="node-tag">12 metrics</span><span class="node-tag">3 dashboards</span><span class="node-tag">Alerts</span></div> <div class="node-tags"><span class="node-tag">12 metrics</span><span class="node-tag">3 dashboards</span><span class="node-tag">Alerts</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-users">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-users.png" alt="User management with RBAC" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Role-based access control</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F50F;</div> <div class="node-icon">&#x1F50F;</div>
<h4>Security Hardened</h4> <h4>Security Hardened</h4>
@ -2436,7 +2648,8 @@
<p>13-finding security audit addressed. JWT rotation, rate limiting, XSS prevention, encrypted secrets, HSTS headers.</p> <p>13-finding security audit addressed. JWT rotation, rate limiting, XSS prevention, encrypted secrets, HSTS headers.</p>
<div class="node-tags"><span class="node-tag">Audit complete</span><span class="node-tag">RBAC</span><span class="node-tag">Encryption</span></div> <div class="node-tags"><span class="node-tag">Audit complete</span><span class="node-tag">RBAC</span><span class="node-tag">Encryption</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="mailhog">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/mailhog.png" alt="MailHog email capture" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Email testing with MailHog</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4BE;</div> <div class="node-icon">&#x1F4BE;</div>
<h4>Automated Backups</h4> <h4>Automated Backups</h4>
@ -2444,7 +2657,8 @@
<p>PostgreSQL dumps, Listmonk data, uploads archive, and optional S3 upload. One-command backup script.</p> <p>PostgreSQL dumps, Listmonk data, uploads archive, and optional S3 upload. One-command backup script.</p>
<div class="node-tags"><span class="node-tag">PostgreSQL</span><span class="node-tag">S3 optional</span><span class="node-tag">Scripted</span></div> <div class="node-tags"><span class="node-tag">PostgreSQL</span><span class="node-tag">S3 optional</span><span class="node-tag">Scripted</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-settings">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-settings.png" alt="Vaultwarden password manager" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Organization security settings</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F510;</div> <div class="node-icon">&#x1F510;</div>
<h4>Vaultwarden</h4> <h4>Vaultwarden</h4>
@ -2452,7 +2666,8 @@
<p>Self-hosted Bitwarden-compatible password manager. Secure credential sharing for your team with real-time sync and browser extensions.</p> <p>Self-hosted Bitwarden-compatible password manager. Secure credential sharing for your team with real-time sync and browser extensions.</p>
<div class="node-tags"><span class="node-tag">Bitwarden</span><span class="node-tag">Team sharing</span><span class="node-tag">Encrypted</span></div> <div class="node-tags"><span class="node-tag">Bitwarden</span><span class="node-tag">Team sharing</span><span class="node-tag">Encrypted</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="admin-users">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/admin-users.png" alt="User provisioning" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Multi-service user provisioning</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F465;</div> <div class="node-icon">&#x1F465;</div>
<h4>User Provisioning</h4> <h4>User Provisioning</h4>
@ -2463,6 +2678,11 @@
</div> </div>
</div> </div>
<!-- Narrative connector -->
<div class="branch-narrative reveal">
<p>A movement that can&rsquo;t sustain itself financially will always depend on someone else&rsquo;s goodwill. <strong>Own your revenue</strong> the same way you own your data &mdash; with tools that put every dollar directly into your cause.</p>
</div>
<!-- ====== BRANCH 6: Fundraising & Commerce ====== --> <!-- ====== BRANCH 6: Fundraising & Commerce ====== -->
<div class="branch branch-fundraising" data-branch="fundraising"> <div class="branch branch-fundraising" data-branch="fundraising">
<div class="branch-header reveal"> <div class="branch-header reveal">
@ -2477,7 +2697,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Pricing Plans — subscription tiers with monthly/yearly billing and feature comparison</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Pricing Plans — subscription tiers with monthly/yearly billing and feature comparison</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="public-donations">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-donations.png" alt="Donation platform" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public donation page</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4B0;</div> <div class="node-icon">&#x1F4B0;</div>
<h4>Donation Platform</h4> <h4>Donation Platform</h4>
@ -2485,7 +2706,8 @@
<p>Accept one-time donations with configurable suggested amounts, anonymous giving, and automatic tax receipts via email.</p> <p>Accept one-time donations with configurable suggested amounts, anonymous giving, and automatic tax receipts via email.</p>
<div class="node-tags"><span class="node-tag">Stripe</span><span class="node-tag">Anonymous</span><span class="node-tag">Receipts</span></div> <div class="node-tags"><span class="node-tag">Stripe</span><span class="node-tag">Anonymous</span><span class="node-tag">Receipts</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="subscription-plans">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/subscription-plans.png" alt="Subscription plan management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Plan management dashboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F504;</div> <div class="node-icon">&#x1F504;</div>
<h4>Subscription Plans</h4> <h4>Subscription Plans</h4>
@ -2493,7 +2715,8 @@
<p>Recurring revenue with tiered plans, monthly and yearly billing, and automatic renewal management. Replace Patreon.</p> <p>Recurring revenue with tiered plans, monthly and yearly billing, and automatic renewal management. Replace Patreon.</p>
<div class="node-tags"><span class="node-tag">Recurring</span><span class="node-tag">Tiers</span><span class="node-tag">MRR tracking</span></div> <div class="node-tags"><span class="node-tag">Recurring</span><span class="node-tag">Tiers</span><span class="node-tag">MRR tracking</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-shop">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-shop.png" alt="Product shop" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public product storefront</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F6D2;</div> <div class="node-icon">&#x1F6D2;</div>
<h4>Product Shop</h4> <h4>Product Shop</h4>
@ -2501,7 +2724,8 @@
<p>Sell digital products, event tickets, and merchandise. Inventory management, download delivery, and capacity limits.</p> <p>Sell digital products, event tickets, and merchandise. Inventory management, download delivery, and capacity limits.</p>
<div class="node-tags"><span class="node-tag">Digital goods</span><span class="node-tag">Events</span><span class="node-tag">Inventory</span></div> <div class="node-tags"><span class="node-tag">Digital goods</span><span class="node-tag">Events</span><span class="node-tag">Inventory</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="payments-dashboard">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/payments-dashboard.png" alt="Payment analytics" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Revenue analytics dashboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4CA;</div> <div class="node-icon">&#x1F4CA;</div>
<h4>Payment Dashboard</h4> <h4>Payment Dashboard</h4>
@ -2509,7 +2733,8 @@
<p>Revenue analytics with subscriber counts, MRR tracking, donation history, and CSV exports for accounting.</p> <p>Revenue analytics with subscriber counts, MRR tracking, donation history, and CSV exports for accounting.</p>
<div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">CSV export</span><span class="node-tag">Refunds</span></div> <div class="node-tags"><span class="node-tag">Analytics</span><span class="node-tag">CSV export</span><span class="node-tag">Refunds</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="gallery-ads">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/gallery-ads.png" alt="Gallery ad management" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> In-gallery promotion manager</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4E2;</div> <div class="node-icon">&#x1F4E2;</div>
<h4>Gallery Ads</h4> <h4>Gallery Ads</h4>
@ -2517,7 +2742,8 @@
<p>Promote donations, products, and subscriptions within the media gallery. Visibility targeting, scheduling, and click analytics.</p> <p>Promote donations, products, and subscriptions within the media gallery. Visibility targeting, scheduling, and click analytics.</p>
<div class="node-tags"><span class="node-tag">Targeting</span><span class="node-tag">Scheduling</span><span class="node-tag">CTR tracking</span></div> <div class="node-tags"><span class="node-tag">Targeting</span><span class="node-tag">Scheduling</span><span class="node-tag">CTR tracking</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="donation-pages">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/donation-pages.png" alt="Donation page builder" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Custom branded donation pages</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4DD;</div> <div class="node-icon">&#x1F4DD;</div>
<h4>Donation Pages</h4> <h4>Donation Pages</h4>
@ -2542,7 +2768,8 @@
<div class="branch-preview-caption"><span class="caption-dot"></span> Wall of Fame — volunteer spotlight, achievement leaderboards, and community recognition</div> <div class="branch-preview-caption"><span class="caption-dot"></span> Wall of Fame — volunteer spotlight, achievement leaderboards, and community recognition</div>
</div> </div>
<div class="nodes-grid stagger"> <div class="nodes-grid stagger">
<div class="feature-node"> <div class="feature-node" data-screenshot="volunteer-friends">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/volunteer-friends.png" alt="Friend system" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Volunteer friend connections</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F465;</div> <div class="node-icon">&#x1F465;</div>
<h4>Friend System</h4> <h4>Friend System</h4>
@ -2550,7 +2777,8 @@
<p>Friend requests, suggestions, pokes, cross-module badges on campaigns, shifts, and the map.</p> <p>Friend requests, suggestions, pokes, cross-module badges on campaigns, shifts, and the map.</p>
<div class="node-tags"><span class="node-tag">Friend requests</span><span class="node-tag">Suggestions</span><span class="node-tag">Poke</span></div> <div class="node-tags"><span class="node-tag">Friend requests</span><span class="node-tag">Suggestions</span><span class="node-tag">Poke</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-home">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-home.png" alt="Activity feed" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Public homepage with activity</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F4F0;</div> <div class="node-icon">&#x1F4F0;</div>
<h4>Activity Feed</h4> <h4>Activity Feed</h4>
@ -2558,7 +2786,8 @@
<p>Real-time SSE feed of friend activity across campaigns, shifts, canvassing, and responses.</p> <p>Real-time SSE feed of friend activity across campaigns, shifts, canvassing, and responses.</p>
<div class="node-tags"><span class="node-tag">Real-time</span><span class="node-tag">SSE</span><span class="node-tag">Cross-module</span></div> <div class="node-tags"><span class="node-tag">Real-time</span><span class="node-tag">SSE</span><span class="node-tag">Cross-module</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-wall-of-fame">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-wall-of-fame.png" alt="Achievements and leaderboard" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Volunteer achievements leaderboard</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F3C6;</div> <div class="node-icon">&#x1F3C6;</div>
<h4>Achievements &amp; Notifications</h4> <h4>Achievements &amp; Notifications</h4>
@ -2566,7 +2795,8 @@
<p>Milestone badges, real-time notification bell with friend requests, pokes, comments, and alerts.</p> <p>Milestone badges, real-time notification bell with friend requests, pokes, comments, and alerts.</p>
<div class="node-tags"><span class="node-tag">Badges</span><span class="node-tag">Bell UI</span><span class="node-tag">Real-time</span></div> <div class="node-tags"><span class="node-tag">Badges</span><span class="node-tag">Bell UI</span><span class="node-tag">Real-time</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="volunteer-calendar">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/volunteer-calendar.png" alt="Team calendar" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Personal calendar with layers</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F46B;</div> <div class="node-icon">&#x1F46B;</div>
<h4>Groups &amp; Teams</h4> <h4>Groups &amp; Teams</h4>
@ -2574,7 +2804,8 @@
<p>Auto-groups for shift teams and campaign crews, custom groups, and shared updates.</p> <p>Auto-groups for shift teams and campaign crews, custom groups, and shared updates.</p>
<div class="node-tags"><span class="node-tag">Shift teams</span><span class="node-tag">Campaign crews</span><span class="node-tag">Custom groups</span></div> <div class="node-tags"><span class="node-tag">Shift teams</span><span class="node-tag">Campaign crews</span><span class="node-tag">Custom groups</span></div>
</div> </div>
<div class="feature-node"> <div class="feature-node" data-screenshot="public-gallery">
<div class="node-screenshot"><img src="/assets/images/screenshots/features/public-gallery.png" alt="Reactions and comments" loading="lazy" width="420" height="263"><div class="node-screenshot-label"><span class="screenshot-dot"></span> Gallery with reactions and chat</div></div>
<div class="node-header"> <div class="node-header">
<div class="node-icon">&#x1F60D;</div> <div class="node-icon">&#x1F60D;</div>
<h4>Reactions &amp; Comments</h4> <h4>Reactions &amp; Comments</h4>

View File

@ -668,11 +668,11 @@
.cm-header-nav__hamburger { display: block; } .cm-header-nav__hamburger { display: block; }
.cm-header-nav__dropdown-menu { display: none !important; } .cm-header-nav__dropdown-menu { display: none !important; }
} }
/* Tell Material that sidebar sticky offset = tabs height (blue header scrolls away) */ /* Sidebar sticky offset = 0 since blue header scrolls away */
:root { :root {
--md-header-height: 0px; --md-header-height: 0px;
} }
/* Hidden Material header — 0 height but search children overflow visibly */ /* Hidden Material header — keeps search anchored near tabs */
.md-header--cm-hidden { .md-header--cm-hidden {
height: 0 !important; height: 0 !important;
min-height: 0 !important; min-height: 0 !important;
@ -763,7 +763,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
height: 0 !important; height: 0 !important;
overflow: hidden !important; overflow: hidden !important;
} }
/* Material tabs: sticky at top (blue header scrolls away, tabs persist) */ /* Material tabs: sticky at viewport top when blue header scrolls away */
.md-tabs { .md-tabs {
position: sticky; position: sticky;
top: 0; top: 0;

View 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
View File

@ -0,0 +1,7 @@
---
template: test-page.html
hide:
- navigation
- toc
title: "Test Page"
---

View File

@ -1,6 +1,6 @@
site_name: Changemaker Lite site_name: Changemaker Lite
site_description: Build Power. Not Rent It. Own your digital infrastructure. site_description: Build Power. Not Rent It. Own your digital infrastructure.
site_url: https://bnkserve.org site_url: https://cmlite.org
site_author: Bunker Operations site_author: Bunker Operations
docs_dir: docs docs_dir: docs
site_dir: site site_dir: site
@ -122,8 +122,8 @@ markdown_extensions:
- pymdownx.caret - pymdownx.caret
- pymdownx.details - pymdownx.details
- pymdownx.emoji: - pymdownx.emoji:
emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_index: !!python/name:material.extensions.emoji.twemoji ""
emoji_generator: !!python/name:material.extensions.emoji.to_svg emoji_generator: !!python/name:material.extensions.emoji.to_svg ""
- pymdownx.highlight: - pymdownx.highlight:
anchor_linenums: true anchor_linenums: true
line_spans: __span line_spans: __span
@ -139,7 +139,7 @@ markdown_extensions:
custom_fences: custom_fences:
- name: mermaid - name: mermaid
class: mermaid class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format format: !!python/name:pymdownx.superfences.fence_code_format ""
- pymdownx.tabbed: - pymdownx.tabbed:
alternate_style: true alternate_style: true
combine_header_slug: true combine_header_slug: true
@ -154,9 +154,7 @@ extra:
consent: consent:
title: Cookie consent title: Cookie consent
description: > description: >
We use cookies to recognize your repeated visits and preferences, We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation. With your consent, you help us improve.
as well as to measure the effectiveness of our documentation.
With your consent, you help us improve.
actions: actions:
- accept - accept
- reject - reject
@ -175,8 +173,7 @@ extra:
# Copyright # Copyright
copyright: > copyright: >
Copyright &copy; 20242026 The Bunker Operations Copyright &copy; 20242026 The Bunker Operations <a href="#__consent">Change cookie settings</a>
<a href="#__consent">Change cookie settings</a>
# Navigation # Navigation
nav: nav:

273
mkdocs/mkdocs.yml.bak Normal file
View 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 &copy; 20242026 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

View File

@ -20,7 +20,7 @@
<link rel="icon" href="/assets/favicon.png"> <link rel="icon" href="/assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.2"> <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
@ -124,7 +124,7 @@
})(); })();
</script> </script>
<script>"undefined"!=typeof __md_analytics&&__md_analytics()</script> <script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
@ -825,11 +825,11 @@
.cm-header-nav__hamburger { display: block; } .cm-header-nav__hamburger { display: block; }
.cm-header-nav__dropdown-menu { display: none !important; } .cm-header-nav__dropdown-menu { display: none !important; }
} }
/* Tell Material that sidebar sticky offset = tabs height (blue header scrolls away) */ /* Sidebar sticky offset = 0 since blue header scrolls away */
:root { :root {
--md-header-height: 0px; --md-header-height: 0px;
} }
/* Hidden Material header — 0 height but search children overflow visibly */ /* Hidden Material header — keeps search anchored near tabs */
.md-header--cm-hidden { .md-header--cm-hidden {
height: 0 !important; height: 0 !important;
min-height: 0 !important; min-height: 0 !important;
@ -920,7 +920,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
height: 0 !important; height: 0 !important;
overflow: hidden !important; overflow: hidden !important;
} }
/* Material tabs: sticky at top (blue header scrolls away, tabs persist) */ /* Material tabs: sticky at viewport top when blue header scrolls away */
.md-tabs { .md-tabs {
position: sticky; position: sticky;
top: 0; top: 0;
@ -1278,6 +1278,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
@ -1367,6 +1369,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
</div> </div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div> </div>
@ -1387,7 +1391,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<div class="md-copyright"> <div class="md-copyright">
<div class="md-copyright__highlight"> <div class="md-copyright__highlight">
Copyright &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a> Copyright &copy; 20242026 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div> </div>
@ -1402,7 +1406,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link"> <a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48m80-24c0 32.8-19.7 61-48 73.3V224h176c26.5 0 48-21.5 48-48v-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V176c0 61.9-50.1 112-112 112H112v70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3V153.4C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80m232 0a24 24 0 1 0-48 0 24 24 0 1 0 48 0M80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48"/></svg>
</a> </a>
@ -1424,11 +1428,78 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<div class="md-dialog__inner md-typeset"></div> <div class="md-dialog__inner md-typeset"></div>
</div> </div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
<div class="md-consent__overlay"></div>
<aside class="md-consent__inner">
<form class="md-consent__form md-grid md-typeset" name="consent">
<h4>Cookie consent</h4>
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation. With your consent, you help us improve.
</p>
<input class="md-toggle" type="checkbox" id="__settings" >
<div class="md-consent__settings">
<ul class="task-list">
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="analytics" checked>
<span class="task-list-indicator"></span>
Google Analytics
</label>
</li>
</ul>
</div>
<div class="md-consent__controls">
<button class="md-button md-button--primary">Accept</button>
<button type="reset" class="md-button md-button--primary">Reject</button>
<label class="md-button" for="__settings">Manage settings</label>
</div>
</form>
</aside>
</div>
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
<script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.code.select", "content.tabs.link", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="/assets/javascripts/bundle.79ae519e.min.js"></script> <script src="/assets/javascripts/bundle.79ae519e.min.js"></script>

View File

@ -13,7 +13,7 @@
<meta name="author" content="Bunker Operations"> <meta name="author" content="Bunker Operations">
<link rel="canonical" href="https://bnkserve.org/testing/"> <link rel="canonical" href="https://cmlite.org/404/">
@ -22,11 +22,11 @@
<link rel="icon" href="../assets/favicon.png"> <link rel="icon" href="../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.2"> <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>testing - Changemaker Lite</title> <title>Page Not Found - Changemaker Lite</title>
@ -126,24 +126,24 @@
})(); })();
</script> </script>
<script>"undefined"!=typeof __md_analytics&&__md_analytics()</script> <script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:title" content="testing - Changemaker Lite" /> <meta property="og:title" content="Page Not Found - Changemaker Lite" />
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." /> <meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="og:image" content="https://bnkserve.org/assets/images/social/testing.png" /> <meta property="og:image" content="https://cmlite.org/assets/images/social/404.png" />
<meta property="og:image:type" content="image/png" /> <meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" /> <meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" /> <meta property="og:image:height" content="630" />
<meta property="og:url" content="https://bnkserve.org/testing/" /> <meta property="og:url" content="https://cmlite.org/404/" />
<meta property="twitter:card" content="summary_large_image" /> <meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="testing - Changemaker Lite" /> <meta property="twitter:title" content="Page Not Found - Changemaker Lite" />
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." /> <meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/testing.png" /> <meta property="twitter:image" content="https://cmlite.org/assets/images/social/404.png" />
</head> </head>
@ -163,7 +163,7 @@
<div data-md-component="skip"> <div data-md-component="skip">
<a href="#testing" class="md-skip"> <a href="#page-not-found" class="md-skip">
Skip to content Skip to content
</a> </a>
@ -845,11 +845,11 @@
.cm-header-nav__hamburger { display: block; } .cm-header-nav__hamburger { display: block; }
.cm-header-nav__dropdown-menu { display: none !important; } .cm-header-nav__dropdown-menu { display: none !important; }
} }
/* Tell Material that sidebar sticky offset = tabs height (blue header scrolls away) */ /* Sidebar sticky offset = 0 since blue header scrolls away */
:root { :root {
--md-header-height: 0px; --md-header-height: 0px;
} }
/* Hidden Material header — 0 height but search children overflow visibly */ /* Hidden Material header — keeps search anchored near tabs */
.md-header--cm-hidden { .md-header--cm-hidden {
height: 0 !important; height: 0 !important;
min-height: 0 !important; min-height: 0 !important;
@ -940,7 +940,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
height: 0 !important; height: 0 !important;
overflow: hidden !important; overflow: hidden !important;
} }
/* Material tabs: sticky at top (blue header scrolls away, tabs persist) */ /* Material tabs: sticky at viewport top when blue header scrolls away */
.md-tabs { .md-tabs {
position: sticky; position: sticky;
top: 0; top: 0;
@ -1146,7 +1146,9 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" hidden>
<div class="md-sidebar__scrollwrap"> <div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner"> <div class="md-sidebar__inner">
@ -1298,6 +1300,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
@ -1350,7 +1354,9 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" hidden>
<div class="md-sidebar__scrollwrap"> <div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner"> <div class="md-sidebar__inner">
@ -1375,6 +1381,8 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
@ -1384,10 +1392,12 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<article class="md-content__inner md-typeset"> <article class="md-content__inner md-typeset">
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/testing.md" title="Edit this page" class="md-content__button md-icon" rel="edit"> <a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2/mkdocs/docs/404.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a> </a>
@ -1396,32 +1406,21 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/testing.md" title="View source of this page" class="md-content__button md-icon"> <a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/v2/mkdocs/docs/404.md" title="View source of this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a> </a>
<h1 id="testing">testing<a class="headerlink" href="#testing" title="Permanent link">&para;</a></h1> <div style="text-align: center; padding: 4rem 1rem;">
<h1 id="testing_1">testing<a class="headerlink" href="#testing_1" title="Permanent link">&para;</a></h1> <h1 id="page-not-found"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7m.88 13.75h-1.75V14h1.75m0-1.12h-1.75c0-2.84 2.62-2.62 2.62-4.38A1.75 1.75 0 0 0 12 6.75a1.75 1.75 0 0 0-1.75 1.75H8.5A3.5 3.5 0 0 1 12 5a3.5 3.5 0 0 1 3.5 3.5c0 2.19-2.62 2.41-2.62 4.38"/></svg></span> Page Not Found<a class="headerlink" href="#page-not-found" title="Permanent link">&para;</a></h1>
<h2 id="wiki-link-tests">Wiki-Link Tests<a class="headerlink" href="#wiki-link-tests" title="Permanent link">&para;</a></h2> <p>The page you're looking for doesn't exist or has been moved.</p>
<ul> <p><a class="md-button md-button--primary" href="../docs/">Back to Documentation <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg></span></a>
<li>Doc link: <a href="docs/getting-started/installation/">installation</a></li> <a class="md-button" href="../docs/">Search the Docs <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg></span></a></p>
<li>Doc link with display text: <a href="docs/getting-started/installation/">Install Guide</a></li> <hr />
<li>Doc link with anchor: <a href="docs/getting-started/installation/#prerequisites">installation#prerequisites</a></li> <p><em>If you followed a link here, please <a href="https://gitea.bnkops.com/admin/changemaker.lite/issues/new" target="_blank">report the broken link</a> so we can fix it.</em></p>
<li>Image embed: <img alt="logo.png" src="../assets/logo.png" /></li> </div>
<li>Image with alt: <img alt="Site Logo" src="../assets/logo.png" /></li>
<li>Code block (should NOT be converted):</li>
</ul>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>[[this-should-stay-as-is]]
</span></code></pre></div>
<ul>
<li>Inline code (should NOT be converted): <code>[[not-a-link]]</code></li>
<li>Unresolved link (should stay as-is): [[nonexistent-page]]</li>
</ul>
@ -1430,15 +1429,24 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
</article> </article>
</div> </div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div> </div>
@ -1459,7 +1467,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<div class="md-copyright"> <div class="md-copyright">
<div class="md-copyright__highlight"> <div class="md-copyright__highlight">
Copyright &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a> Copyright &copy; 20242026 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div> </div>
@ -1474,7 +1482,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link"> <a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48m80-24c0 32.8-19.7 61-48 73.3V224h176c26.5 0 48-21.5 48-48v-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V176c0 61.9-50.1 112-112 112H112v70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3V153.4C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80m232 0a24 24 0 1 0-48 0 24 24 0 1 0 48 0M80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48"/></svg>
</a> </a>
@ -1496,11 +1504,78 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
<div class="md-dialog__inner md-typeset"></div> <div class="md-dialog__inner md-typeset"></div>
</div> </div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
<div class="md-consent__overlay"></div>
<aside class="md-consent__inner">
<form class="md-consent__form md-grid md-typeset" name="consent">
<h4>Cookie consent</h4>
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation. With your consent, you help us improve.
</p>
<input class="md-toggle" type="checkbox" id="__settings" >
<div class="md-consent__settings">
<ul class="task-list">
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="analytics" checked>
<span class="task-list-indicator"></span>
Google Analytics
</label>
</li>
</ul>
</div>
<div class="md-consent__controls">
<button class="md-button md-button--primary">Accept</button>
<button type="reset" class="md-button md-button--primary">Reject</button>
<label class="md-button" for="__settings">Manage settings</label>
</div>
</form>
</aside>
</div>
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.code.select", "content.tabs.link", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.path", "navigation.prune", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script> <script src="../assets/javascripts/bundle.79ae519e.min.js"></script>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 435 KiB

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Some files were not shown because too many files have changed in this diff Show More