Add video card insert feature + MkDocs video hydration + fixes

- New video card block for GrapesJS landing pages, email templates,
  MkDocs export, and documentation editor Insert dropdown
- Shared HTML generators in admin/src/utils/videoCardHtml.ts
- MkDocs video-player.js hydrates .video-card-block elements:
  thumbnail fix via MEDIA_API_URL, click-to-play inline, Gallery link
- Media API CORS: auto-add MkDocs + docs subdomain origins
- env_config_hook.py: smart Docker hostname detection, ADMIN_PORT
  resolution, pass env vars to MkDocs container
- Gallery URL uses /gallery?expanded=ID format
- VideoPickerModal: fix double /api prefix and Docker hostname thumbs
- Seed: default-video-card PageBlock
- Remove V1 legacy code (influence/, map/)

Bunker Admin
This commit is contained in:
2026-02-17 15:42:32 -07:00
parent 58dc1942ec
commit 99a6abab06
1511 changed files with 14551 additions and 1625410 deletions

View File

@@ -15,11 +15,9 @@
<link rel="canonical" href="https://bnkserve.org/blog/">
<link rel="prev" href="../v1/adv/vscode-ssh/">
<link rel="prev" href="..">
<link rel="next" href="archive/2025/">
@@ -29,7 +27,7 @@
<title>Index - Changemaker Lite</title>
<title>Blog - Changemaker Lite</title>
@@ -69,7 +67,7 @@
<meta property="og:type" content="website" />
<meta property="og:title" content="Index - Changemaker Lite" />
<meta property="og:title" content="Blog - 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" />
@@ -77,7 +75,7 @@
<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:title" content="Blog - 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>
@@ -98,6 +96,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#blog" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
@@ -129,7 +132,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Index
Blog
</span>
</div>
@@ -258,72 +261,6 @@
<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>
@@ -425,229 +362,6 @@
<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>
@@ -679,7 +393,7 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<div class="md-nav__link md-nav__container">
@@ -701,14 +415,14 @@
</a>
<label class="md-nav__link md-nav__link--active" for="__nav_5" id="__nav_5_label" tabindex="">
<label class="md-nav__link md-nav__link--active" for="__nav_2" id="__nav_2_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">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
@@ -724,82 +438,17 @@
<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">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
2025
Archive
@@ -819,14 +468,6 @@
</li>
</ul>
</nav>
</li>
</ul>
</nav>
@@ -847,6 +488,8 @@
</nav>
</div>
@@ -858,234 +501,9 @@
<div class="md-content" data-md-component="content">
<div class="md-content__inner">
<header class="md-typeset">
<h1 id="blog">Blog<a class="headerlink" href="#blog" title="Permanent link">&para;</a></h1>
</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>
@@ -1109,7 +527,7 @@
<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">
<a href=".." class="md-footer__link md-footer__link--prev" aria-label="Previous: Home">
<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>
@@ -1119,28 +537,12 @@
Previous
</span>
<div class="md-ellipsis">
SSH + VScode
Home
</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>