1210 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Build Power. Not Rent It. Own your digital infrastructure.">
<meta name="author" content="Bunker Operations">
<link rel="canonical" href="https://bnkserve.org/blog/">
<link rel="prev" href="../v1/adv/vscode-ssh/">
<link rel="next" href="archive/2025/">
<link rel="icon" href="../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
<title>Index - Changemaker Lite</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="../stylesheets/extra.css">
<link rel="stylesheet" href="../stylesheets/home.css">
<link rel="stylesheet" href="../assets/css/video-player.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" />
<meta property="og:title" content="Index - Changemaker Lite" />
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="og:image" content="https://bnkserve.org/assets/images/social/blog/index.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://bnkserve.org/blog/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Index - Changemaker Lite" />
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/blog/index.png" />
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Changemaker Lite" class="md-header__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../assets/logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Changemaker Lite
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Index
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<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>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<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>
<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>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<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="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../v2/" class="md-tabs__link">
V2 Documentation
</a>
</li>
<li class="md-tabs__item">
<a href="../phil/" class="md-tabs__link">
Philosophy
</a>
</li>
<li class="md-tabs__item">
<a href="../v1/" class="md-tabs__link">
V1 Documentation (Legacy)
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="./" class="md-tabs__link">
Blog
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Changemaker Lite" class="md-nav__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../assets/logo.png" alt="logo">
</a>
Changemaker Lite
</label>
<div class="md-nav__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<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="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../v2/" class="md-nav__link">
<span class="md-ellipsis">
V2 Documentation
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../phil/" class="md-nav__link">
<span class="md-ellipsis">
Philosophy
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../v1/" class="md-nav__link">
<span class="md-ellipsis">
V1 Documentation (Legacy)
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<div class="md-nav__link md-nav__container">
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Blog
</span>
</a>
<label class="md-nav__link md-nav__link--active" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Blog
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="">
<span class="md-ellipsis">
Archive
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Archive
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="archive/2025/" class="md-nav__link">
<span class="md-ellipsis">
2025
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="On this page">
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<div class="md-content__inner">
<header class="md-typeset">
</header>
<article class="md-post md-post--excerpt">
<header class="md-post__header">
<div class="md-post__meta md-meta">
<ul class="md-meta__list">
<li class="md-meta__item">
<time datetime="2025-09-24 00:00:00+00:00">Sep 24, 2025</time></li>
<li class="md-meta__item">
2 min read
</li>
</ul>
</div>
</header>
<div class="md-post__content md-typeset">
<h2 id="4"><a class="toclink" href="2025/09/24/4/">4</a></h2>
<p>Okay! Wow! Its been nearly 2 months since I wrote a blog update for this system. </p>
<p>We have pushed out <a href="https://influence.bnkops.com">influence</a> as a beta product, and will be pushing it out to get feedback from real users over the next month. </p>
<p>Our campaign software Map was also used by a real campaign for the first time, and we have some great feedback to incorporate into the system.</p>
<h3 id="what-weve-built-since-august"><a class="toclink" href="2025/09/24/4/#what-weve-built-since-august">What We've Built Since August</a></h3>
<p>Here's a quick rundown of everything we've committed to the codebase over the past three months:</p>
<h4 id="influence-app-major-launch"><a class="toclink" href="2025/09/24/4/#influence-app-major-launch">Influence App - Major Launch</a></h4>
<ul>
<li><strong>Complete UI Overhaul</strong>: Built an entirely new user interface and user system from the ground up</li>
<li><strong>Response Wall</strong>: Developed a comprehensive response wall system where elected officials can respond to campaigns, including verified response system with QR codes and verify buttons</li>
<li><strong>Campaign Management</strong>: Created new system for creating campaigns from the main site dashboard with campaign cover photos and phone numbers</li>
<li><strong>Social Features</strong>: Added social share buttons and site info improvements</li>
<li><strong>Geocoding Enhancements</strong>: Implemented automatic scanning of NocoDB locations to build geo-locations, plus premium Mapbox option for better street address matching</li>
<li><strong>User Management</strong>: Built password updater for users/admins and improved overall user management</li>
<li><strong>Network Integration</strong>: Integrated Influence into the Changemaker network</li>
<li><strong>Monitoring &amp; Maintenance</strong>: Added health check utility, logger, metrics, backup, and SMTP toggle scripts</li>
</ul>
<h4 id="map-app-production-ready"><a class="toclink" href="2025/09/24/4/#map-app-production-ready">Map App - Production Ready</a></h4>
<ul>
<li><strong>Map Cuts Feature</strong>: Built a comprehensive "cuts" system for dividing territories, including assignment workflows, print views, and spatial data handling</li>
<li><strong>Public Shifts</strong>: Implemented new public shifts system for volunteer coordination</li>
<li><strong>Performance</strong>: Optimized loading for maps with 1000+ locations and improved shift loading speeds</li>
<li><strong>Admin Improvements</strong>: Major refactor of admin.js into readable, maintainable files, plus new NocoDB admin section with database search</li>
<li><strong>Temp Users</strong>: Enhanced temporary user system with proper access controls and limited data sending</li>
<li><strong>Data Tools</strong>: Added CSV import reporting and ListMonk synchronization</li>
<li><strong>UI/UX</strong>: Standardized z-indexes, updated pop-ups, fixed menu bugs, and improved cut overlays</li>
<li><strong>CORS &amp; Auth</strong>: Fixed authentication, lockouts, and CORS for local dev access</li>
</ul>
<h4 id="infrastructure-devops"><a class="toclink" href="2025/09/24/4/#infrastructure-devops">Infrastructure &amp; DevOps</a></h4>
<ul>
<li><strong>Documentation</strong>: Updated MkDocs documentation with search functionality</li>
<li><strong>Build System</strong>: Improved build-nocodb script to migrate data and auto-input URLs to .env</li>
<li><strong>Docker</strong>: Cleaned up docker-compose configuration and fixed container duplication issues</li>
<li><strong>Configuration</strong>: Updated homepage configs, Cloudflare tunnel settings, and general system configs</li>
</ul>
<p>The velocity has been incredible - we went from concept to production with Influence in just a few weeks, and Map has evolved into a robust campaigning tool that's battle-tested in real elections. Looking forward to incorporating user feedback and continuing to iterate!</p>
</div>
</article>
<article class="md-post md-post--excerpt">
<header class="md-post__header">
<div class="md-post__meta md-meta">
<ul class="md-meta__list">
<li class="md-meta__item">
<time datetime="2025-08-01 00:00:00+00:00">Aug 1, 2025</time></li>
<li class="md-meta__item">
3 min read
</li>
</ul>
</div>
</header>
<div class="md-post__content md-typeset">
<h2 id="3"><a class="toclink" href="2025/08/01/3/">3</a></h2>
<p>Alrighty yall, it was a wild month of development, and we have a lot to cover! Heres the latest on Changemaker Lite, including our new landing page, major updates to the map application, and a comprehensive overview of all changes made in the last month.</p>
<p>Campaigning is going! We have candidates working the system in the field, and were excited to see how it performs in real-world scenarios.</p>
<h2 id="monthly-development-report-august-2025"><a class="toclink" href="2025/08/01/3/#monthly-development-report-august-2025">Monthly Development Report August 2025</a></h2>
<h3 id="git-change-summary-julyaugust-2025"><a class="toclink" href="2025/08/01/3/#git-change-summary-julyaugust-2025">Git Change Summary (JulyAugust 2025)</a></h3>
<p>Below is a summary of all changes pushed to git in the last month:</p>
<ul>
<li><strong>Admin Panel &amp; NocoDB Integration</strong>: Major updates to the admin section, including a new NocoDB admin area, improved database search, and code cleanups.</li>
<li><strong>Website &amp; UI Updates</strong>: Numerous updates to the website, including language tweaks, mobile friendliness, and new frontend features.</li>
<li><strong>Shifts Management</strong>: Comprehensive volunteer shift management system added, with calendar/grid views, admin controls, and real-time updates.</li>
<li><strong>Authentication &amp; User Management</strong>: Enhanced login system, password recovery via SMTP, user management panel for admins, and role-based access control.</li>
<li><strong>Map &amp; Geocoding</strong>: Improved map display, apartment views, geocoding integration, and address confirmation system.</li>
<li><strong>Unified Search System</strong>: Powerful search bar (Ctrl+K) for docs and address search, with real-time results, caching, and QR code generation.</li>
<li><strong>Data Import &amp; Conversion</strong>: CSV data import with batch geocoding and visual progress, plus a new data converter tool.</li>
<li><strong>Email &amp; Notifications</strong>: SMTP integration for email notifications and password recovery.</li>
<li><strong>Performance &amp; Bug Fixes</strong>: Numerous bug fixes, code cleanups, and performance improvements across the stack.</li>
<li><strong>Docker &amp; Deployment</strong>: Docker containerization, improved build scripts, and easier multi-instance deployment.</li>
<li><strong>Documentation</strong>: Expanded and updated documentation, including new manuals and guides.</li>
</ul>
<p>For a detailed commit log, see <code>git-report.txt</code>.</p>
<hr />
<h3 id="overview-of-landerhtml"><a class="toclink" href="2025/08/01/3/#overview-of-landerhtml">Overview of <code>lander.html</code></a></h3>
<p>The <code>lander.html</code> file is a modern, responsive landing page for Changemaker Lite, featuring:</p>
<ul>
<li><strong>Custom Theming</strong>: Light/dark mode toggle with persistent user preference.</li>
<li><strong>Sticky Header &amp; Navigation</strong>: Fixed header with smooth scroll and navigation links.</li>
<li><strong>Hero Section</strong>: Prominent introduction with call-to-action buttons.</li>
<li><strong>Search Integration</strong>: Inline MkDocs search with real-time results and keyboard shortcuts.</li>
<li><strong>Feature Showcases</strong>: Sections for problems, solutions, power tools, data ownership, pricing, integrations, testimonials, and live examples.</li>
<li><strong>Responsive Design</strong>: Mobile-friendly layout with adaptive grids and cards.</li>
<li><strong>Animations</strong>: Intersection observer for fade-in effects on cards and sections.</li>
<li><strong>Video &amp; Media</strong>: Embedded video showcase and rich media support.</li>
<li><strong>Footer</strong>: Informative footer with links and contact info.</li>
</ul>
<p>The page is styled with CSS variables for easy theming and includes scripts for search, theme switching, and smooth scrolling.</p>
<hr />
<h3 id="new-features-in-map-readmemd"><a class="toclink" href="2025/08/01/3/#new-features-in-map-readmemd">New Features in Map (<code>README.md</code>)</a></h3>
<p>The map application has received significant upgrades:</p>
<ul>
<li><strong>Interactive Map</strong>: Real-time visualization with OpenStreetMap and Leaflet.js.</li>
<li><strong>Unified Search</strong>: Docs and address search in one bar, with keyboard shortcuts and smart caching.</li>
<li><strong>Geolocation &amp; Add Locations</strong>: Real-time user geolocation and ability to add new locations directly from the map.</li>
<li><strong>Auto-Refresh</strong>: Map data auto-refreshes every 30 seconds.</li>
<li><strong>Responsive &amp; Mobile Ready</strong>: Fully responsive design for all devices.</li>
<li><strong>Secure API Proxy</strong>: Protects credentials and secures API access.</li>
<li><strong>Admin Panel</strong>: System configuration, user management, and shift management for admins.</li>
<li><strong>Walk Sheet Generator</strong>: For door-to-door canvassing, with customizable titles and QR code integration.</li>
<li><strong>Volunteer Shifts</strong>: Calendar/grid views, signup/cancellation, admin shift creation, and real-time updates.</li>
<li><strong>Role-Based Access</strong>: Admin vs. user permissions throughout the app.</li>
<li><strong>Email Notifications</strong>: SMTP-based notifications and password recovery.</li>
<li><strong>CSV Import &amp; Geocoding</strong>: Batch import with geocoding and progress tracking.</li>
<li><strong>Dockerized Deployment</strong>: Easy setup and scaling with Docker.</li>
<li><strong>Open Source</strong>: 100% open source, no proprietary dependencies.</li>
</ul>
<p><strong>API Endpoints</strong>: Comprehensive REST API for locations, shifts, authentication, admin, and geocoding, all with rate limiting and security features.</p>
<p><strong>Database Schema</strong>: Auto-created tables for locations, users, settings, shifts, and signups, with detailed field definitions.</p>
<hr />
<p>For more details, see the full <code>README.md</code> and explore the live application.</p>
</div>
</article>
<article class="md-post md-post--excerpt">
<header class="md-post__header">
<div class="md-post__meta md-meta">
<ul class="md-meta__list">
<li class="md-meta__item">
<time datetime="2025-07-10 00:00:00+00:00">Jul 10, 2025</time></li>
<li class="md-meta__item">
1 min read
</li>
</ul>
</div>
</header>
<div class="md-post__content md-typeset">
<h2 id="2"><a class="toclink" href="2025/07/10/2/">2</a></h2>
<p>Wow. Big build day. Added (admittedly still buggy) shifts support to the system. Power did it in a day. </p>
<p>Other updates recently include: </p>
<ul>
<li>Fully reworked backend <code>server.js</code> into modular components. </li>
<li>Bunch of mobile related fixes and improvements.</li>
<li>Bi-directional saving of configs fixed up </li>
<li>Some style upgrades </li>
</ul>
<p>Need to make more content about how to use the system in general too. </p>
</div>
</article>
<article class="md-post md-post--excerpt">
<header class="md-post__header">
<div class="md-post__meta md-meta">
<ul class="md-meta__list">
<li class="md-meta__item">
<time datetime="2025-07-03 00:00:00+00:00">Jul 3, 2025</time></li>
<li class="md-meta__item">
1 min read
</li>
</ul>
</div>
</header>
<div class="md-post__content md-typeset">
<h2 id="blog-1"><a class="toclink" href="2025/07/03/blog-1/">Blog 1</a></h2>
<p>Hello! Just putting something up here because, well, gosh darn, feels like the right thing to do. </p>
<p>Making swift progress. Can now write things fast as heck lad. </p>
</div>
</article>
<nav class="md-pagination">
</nav>
</div>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../v1/adv/vscode-ssh/" class="md-footer__link md-footer__link--prev" aria-label="Previous: SSH + VScode">
<div class="md-footer__button md-icon">
<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>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
SSH + VScode
</div>
</div>
</a>
<a href="archive/2025/" class="md-footer__link md-footer__link--next" aria-label="Next: 2025">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
2025
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div>
</div>
<div class="md-social">
<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>
</a>
<a href="https://listmonk.bnkops.com/subscription/form" target="_blank" rel="noopener" title="Newsletter" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 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="M536.4-26.3c9.8-3.5 20.6-1 28 6.3s9.8 18.2 6.3 28l-178 496.9c-5 13.9-18.1 23.1-32.8 23.1-14.2 0-27-8.6-32.3-21.7l-64.2-158c-4.5-11-2.5-23.6 5.2-32.6l94.5-112.4c5.1-6.1 4.7-15-.9-20.6s-14.6-6-20.6-.9l-112.4 94.3c-9.1 7.6-21.6 9.6-32.6 5.2L38.1 216.8c-13.1-5.3-21.7-18.1-21.7-32.3 0-14.7 9.2-27.8 23.1-32.8z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<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.expand", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.sections", "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="../javascripts/home.js"></script>
<script src="../javascripts/github-widget.js"></script>
<script src="../javascripts/gitea-widget.js"></script>
<script src="../assets/js/env-config.js"></script>
<script src="../assets/js/video-player.js"></script>
</body>
</html>