diff --git a/git-report.txt b/git-report.txt
new file mode 100644
index 0000000..f789bcd
--- /dev/null
+++ b/git-report.txt
@@ -0,0 +1,68 @@
+e488a23 2025-08-01 | admin | few small changes to language on the admin page
+5b673da 2025-08-01 | admin | A tonne more changes, including new nocodb admin section, search for database, code cleanups, and debugging
+9fcaf48 2025-08-01 | admin | website updates
+55cd626 2025-08-01 | admin | Data converter
+0dacdfc 2025-07-31 | admin | udpated config to properly build for smtp
+52d921c 2025-07-31 | admin | smtp integration and password recovery.
+c0811de 2025-07-31 | admin | a few more dashboard updates
+d775dea 2025-07-30 | admin | mobile friendliness
+373018c 2025-07-30 | admin | anaylitics dashboard
+7edc665 2025-07-30 | admin | square representations of apartments
+0d7bdf0 2025-07-29 | admin | Updated apartment locations to stand out mor
+dfe7c69 2025-07-28 | admin | some auth updates that got over written
+8cebb56 2025-07-27 | admin | Fixed the input form modal to be above the other modals.
+d711456 2025-07-27 | admin | Full update to map css
+994440a 2025-07-27 | admin | Added apartment views and city of edmonton data import
+5da24ae 2025-07-27 | admin | New site frontend updates, search, and general bug fixes
+3b7d382 2025-07-24 | admin | Some udpates to tracking user inputs. Still not happy with it but functional so moving on
+bb7032d 2025-07-24 | admin | A tonne of updates to how the system builds the view points in hopes of having a better mobile expereince
+59ca237 2025-07-22 | admin | QR Code Maker update
+dd416f8 2025-07-20 | admin | fixed the search float
+54b9210 2025-07-19 | admin | new stuff
+5bf87d4 2025-07-19 | admin | New search functionality
+0088ffd 2025-07-19 | admin | few cosmetic updates
+7989ea0 2025-07-18 | admin | added a move system for the pins
+b98207b 2025-07-17 | admin | Fixed some menu bugs
+6aae0fe 2025-07-17 | admin | added in the user managment section. Need to also do some updates to the admin menue and whatnot however itll get figured.
+88b80bc 2025-07-16 | admin | bug fixes for shifts functionality
+65c786d 2025-07-16 | admin | new system for address confrimation
+ff3e1e8 2025-07-16 | admin | Added calendar view to the shifts
+e056290 2025-07-16 | admin | updated the config.sh so that multiple changemakers can be run on each machine easier.
+167b82f 2025-07-16 | admin | added shift titles to the shift signup sheets to make tracking easier and adding shifts easier
+fb90f2a 2025-07-16 | admin | Config fixes for the services. yaml and a couple minor things about making it more url agnostic.
+2c0c943 2025-07-16 | admin | config changes to better build map .env and updates to the login ui controls
+0dd56c0 2025-07-16 | admin | Couple more updates to shiftcontroller to make it more robust
+a5bd0e9 2025-07-16 | admin | Fixed bug for displaying sign ups for shifts
+9e5b319 2025-07-13 | admin | Fixed bug with where maps presents
+2b05b60 2025-07-11 | admin | debugged build precision values on decimal places inside nocodb
+0878237 2025-07-11 | admin | Fixes to the map display and several other bugs
+c29ad2d 2025-07-10 | admin | Shifts manager
+5cba672 2025-07-10 | admin | updates to saving settings
+2778b15 2025-07-09 | admin | map system updates
+1236c6b 2025-07-09 | admin | Mpas manual and udpates to map view buttons for simpler workflow
+34ef38a 2025-07-09 | admin | UI updates to better position map for building dots
+d11837e 2025-07-09 | admin | Added in a password field for login. need to add encryption sometime
+ab2e91e 2025-07-08 | admin | fixed the preview on moblie for the walk sheet
+e31b770 2025-07-08 | admin | naming updates
+de3b349 2025-07-08 | admin | documentation updates
+56ab400 2025-07-07 | admin | map styling update
+488bb99 2025-07-07 | admin | build nocodb udpate - makes new base on every run
+c1f6f25 2025-07-06 | admin | okay bidirectional saving done
+1ba3899 2025-07-06 | admin | final update for the map server omg
+18de90f 2025-07-06 | admin | got config save working
+5f39ce8 2025-07-06 | admin | more configs and readme updates.
+c4ea519 2025-07-06 | admin | reste.sh updatae
+ac01d92 2025-07-06 | admin | okay got to a much more stable state. Fixed race condtion at stat of files. Should be smooth salining for a bit now.
+1fc8b52 2025-07-06 | admin | final round of updates. Still need to stabalize first load for the map, having issues for sure; longer load time
+f4eefa1 2025-07-05 | admin | resolved most in browser errors and got maps stable. Next need to do some work on the save configuration stuff.
+412ca36 2025-07-05 | admin | config.sh fix
+776420b 2025-07-05 | admin | build shell script for NocoDB map data
+77c3a32 2025-07-05 | admin | new maps admin feature
+09c8e02 2025-07-05 | admin | start production updates
+4b6acbd 2025-07-04 | admin | update so we can run more than one changemaker per machine
+e9d5af3 2025-07-04 | admin | removed the cloudflare credentials and yml from up
+d41bd87 2025-07-04 | admin | pushing updates before doing a reset on local machine.
+ed0bd33 2025-07-04 | admin | Clean up
+949be0b 2025-07-03 | admin | maps updates
+7e65665 2025-07-03 | admin | Some updates to the start-production script and just general clean up
+ea6e5f1 2025-07-02 | admin | a tonne of improvements! We got maps updaTed, a tonne of documentaiton done, and several small upgrades to hook logic and other things. Fixed the looping problem for mkdocs and claude is not integrated with coder; if people wanna have a ai anyway
\ No newline at end of file
diff --git a/map/app/controllers/usersController.js b/map/app/controllers/usersController.js
index c265c8a..7da2f64 100644
--- a/map/app/controllers/usersController.js
+++ b/map/app/controllers/usersController.js
@@ -2,6 +2,7 @@ const nocodbService = require('../services/nocodb');
const logger = require('../utils/logger');
const config = require('../config');
const { sanitizeUser, extractId } = require('../utils/helpers');
+const { sendLoginDetails } = require('../services/email');
class UsersController {
async getAll(req, res) {
@@ -155,6 +156,47 @@ class UsersController {
});
}
}
+
+ async sendLoginDetails(req, res) {
+ try {
+ const userId = req.params.id;
+
+ if (!config.nocodb.loginSheetId) {
+ return res.status(500).json({
+ success: false,
+ error: 'Login sheet not configured'
+ });
+ }
+
+ // Get user data from database
+ const user = await nocodbService.getById(
+ config.nocodb.loginSheetId,
+ userId
+ );
+
+ if (!user) {
+ return res.status(404).json({
+ success: false,
+ error: 'User not found'
+ });
+ }
+
+ // Send login details email
+ await sendLoginDetails(user);
+
+ res.json({
+ success: true,
+ message: 'Login details sent successfully'
+ });
+
+ } catch (error) {
+ logger.error('Error sending login details:', error);
+ res.status(500).json({
+ success: false,
+ error: 'Failed to send login details'
+ });
+ }
+ }
}
module.exports = new UsersController();
\ No newline at end of file
diff --git a/map/app/public/js/admin.js b/map/app/public/js/admin.js
index b9f1d50..2ff5f4f 100644
--- a/map/app/public/js/admin.js
+++ b/map/app/public/js/admin.js
@@ -346,7 +346,7 @@ function setupEventListeners() {
}
// User form submission
- const userForm = document.getElementById('user-form');
+ const userForm = document.getElementById('create-user-form');
if (userForm) {
userForm.addEventListener('submit', createUser);
}
@@ -1269,6 +1269,9 @@ function displayUsers(users) {
💡 For security reasons, we recommend changing your password after your first login.
+
+
+
+
+
diff --git a/map/app/templates/email/login-details.txt b/map/app/templates/email/login-details.txt
new file mode 100644
index 0000000..021b747
--- /dev/null
+++ b/map/app/templates/email/login-details.txt
@@ -0,0 +1,17 @@
+Login Details - {{APP_NAME}}
+
+Hello {{USER_NAME}},
+
+Here are your login credentials for {{APP_NAME}}:
+
+Email: {{USER_EMAIL}}
+Password: {{PASSWORD}}
+Role: {{USER_ROLE}}
+
+You can log in at: {{LOGIN_URL}}
+
+For security reasons, we recommend changing your password after your first login.
+
+---
+This email was sent from {{APP_NAME}} at {{TIMESTAMP}}
+If you have any questions, please contact your administrator.
diff --git a/map/files-explainer.md b/map/files-explainer.md
index a75bcf8..2b1dfae 100644
--- a/map/files-explainer.md
+++ b/map/files-explainer.md
@@ -62,7 +62,7 @@ Controller for aggregating and calculating dashboard statistics from locations a
# app/controllers/usersController.js
-Controller for user management (list, create, delete users).
+Controller for user management (list, create, delete users, send login details via email).
# app/middleware/auth.js
@@ -98,7 +98,7 @@ Service for generating QR codes and handling QR-related logic.
# app/services/email.js
-Service for sending emails via SMTP, including password recovery emails using nodemailer. Supports multiple SMTP providers and includes connection verification and error handling.
+Service for sending emails via SMTP, including password recovery emails and login details using nodemailer. Supports multiple SMTP providers and includes connection verification and error handling.
# app/services/emailTemplates.js
@@ -112,6 +112,14 @@ Plain text email template for password recovery notifications. Contains user-fri
HTML email template for password recovery notifications. Features responsive design with styled password display box and security warnings for better user experience.
+# app/templates/email/login-details.txt
+
+Plain text email template for sending login credentials to users. Contains email, password, role, and login URL with security recommendations.
+
+# app/templates/email/login-details.html
+
+HTML email template for sending login credentials to users. Features responsive design with styled credentials display and login button for better user experience.
+
# app/utils/helpers.js
Utility functions for geographic data, validation, and helpers used across the backend.
diff --git a/mkdocs/.cache/plugin/social/bae6e5d76e4a4ee30a1f912a9b050b3a.png b/mkdocs/.cache/plugin/social/bae6e5d76e4a4ee30a1f912a9b050b3a.png
new file mode 100644
index 0000000..3183deb
Binary files /dev/null and b/mkdocs/.cache/plugin/social/bae6e5d76e4a4ee30a1f912a9b050b3a.png differ
diff --git a/mkdocs/docs/assets/repo-data/admin-changemaker.lite.json b/mkdocs/docs/assets/repo-data/admin-changemaker.lite.json
index 8723a7d..8a18e54 100644
--- a/mkdocs/docs/assets/repo-data/admin-changemaker.lite.json
+++ b/mkdocs/docs/assets/repo-data/admin-changemaker.lite.json
@@ -7,10 +7,10 @@
"stars_count": 0,
"forks_count": 0,
"open_issues_count": 8,
- "updated_at": "2025-08-01T10:32:33-06:00",
+ "updated_at": "2025-08-01T15:14:12-06:00",
"created_at": "2025-05-28T14:54:59-06:00",
"clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git",
"ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git",
"default_branch": "main",
- "last_build_update": "2025-08-01T10:32:33-06:00"
+ "last_build_update": "2025-08-01T15:14:12-06:00"
}
\ No newline at end of file
diff --git a/mkdocs/docs/blog/posts/3.md b/mkdocs/docs/blog/posts/3.md
new file mode 100644
index 0000000..70770a3
--- /dev/null
+++ b/mkdocs/docs/blog/posts/3.md
@@ -0,0 +1,74 @@
+---
+date: 2025-08-01
+---
+
+Alrighty yall, it was a wild month of development, and we have a lot to cover! Here’s 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.
+
+Campaigning is going! We have candidates working the system in the field, and we’re excited to see how it performs in real-world scenarios.
+
+# Monthly Development Report – August 2025
+
+## Git Change Summary (July–August 2025)
+
+Below is a summary of all changes pushed to git in the last month:
+
+- **Admin Panel & NocoDB Integration**: Major updates to the admin section, including a new NocoDB admin area, improved database search, and code cleanups.
+- **Website & UI Updates**: Numerous updates to the website, including language tweaks, mobile friendliness, and new frontend features.
+- **Shifts Management**: Comprehensive volunteer shift management system added, with calendar/grid views, admin controls, and real-time updates.
+- **Authentication & User Management**: Enhanced login system, password recovery via SMTP, user management panel for admins, and role-based access control.
+- **Map & Geocoding**: Improved map display, apartment views, geocoding integration, and address confirmation system.
+- **Unified Search System**: Powerful search bar (Ctrl+K) for docs and address search, with real-time results, caching, and QR code generation.
+- **Data Import & Conversion**: CSV data import with batch geocoding and visual progress, plus a new data converter tool.
+- **Email & Notifications**: SMTP integration for email notifications and password recovery.
+- **Performance & Bug Fixes**: Numerous bug fixes, code cleanups, and performance improvements across the stack.
+- **Docker & Deployment**: Docker containerization, improved build scripts, and easier multi-instance deployment.
+- **Documentation**: Expanded and updated documentation, including new manuals and guides.
+
+For a detailed commit log, see `git-report.txt`.
+
+---
+
+## Overview of `lander.html`
+
+The `lander.html` file is a modern, responsive landing page for Changemaker Lite, featuring:
+
+- **Custom Theming**: Light/dark mode toggle with persistent user preference.
+- **Sticky Header & Navigation**: Fixed header with smooth scroll and navigation links.
+- **Hero Section**: Prominent introduction with call-to-action buttons.
+- **Search Integration**: Inline MkDocs search with real-time results and keyboard shortcuts.
+- **Feature Showcases**: Sections for problems, solutions, power tools, data ownership, pricing, integrations, testimonials, and live examples.
+- **Responsive Design**: Mobile-friendly layout with adaptive grids and cards.
+- **Animations**: Intersection observer for fade-in effects on cards and sections.
+- **Video & Media**: Embedded video showcase and rich media support.
+- **Footer**: Informative footer with links and contact info.
+
+The page is styled with CSS variables for easy theming and includes scripts for search, theme switching, and smooth scrolling.
+
+---
+
+## New Features in Map (`README.md`)
+
+The map application has received significant upgrades:
+
+- **Interactive Map**: Real-time visualization with OpenStreetMap and Leaflet.js.
+- **Unified Search**: Docs and address search in one bar, with keyboard shortcuts and smart caching.
+- **Geolocation & Add Locations**: Real-time user geolocation and ability to add new locations directly from the map.
+- **Auto-Refresh**: Map data auto-refreshes every 30 seconds.
+- **Responsive & Mobile Ready**: Fully responsive design for all devices.
+- **Secure API Proxy**: Protects credentials and secures API access.
+- **Admin Panel**: System configuration, user management, and shift management for admins.
+- **Walk Sheet Generator**: For door-to-door canvassing, with customizable titles and QR code integration.
+- **Volunteer Shifts**: Calendar/grid views, signup/cancellation, admin shift creation, and real-time updates.
+- **Role-Based Access**: Admin vs. user permissions throughout the app.
+- **Email Notifications**: SMTP-based notifications and password recovery.
+- **CSV Import & Geocoding**: Batch import with geocoding and progress tracking.
+- **Dockerized Deployment**: Easy setup and scaling with Docker.
+- **Open Source**: 100% open source, no proprietary dependencies.
+
+**API Endpoints**: Comprehensive REST API for locations, shifts, authentication, admin, and geocoding, all with rate limiting and security features.
+
+**Database Schema**: Auto-created tables for locations, users, settings, shifts, and signups, with detailed field definitions.
+
+---
+
+For more details, see the full `README.md` and explore the live application.
diff --git a/mkdocs/docs/phil/index.md b/mkdocs/docs/phil/index.md
index 3c996d6..4412f25 100644
--- a/mkdocs/docs/phil/index.md
+++ b/mkdocs/docs/phil/index.md
@@ -54,20 +54,6 @@ Your data belongs to you and your community. We build tools that let you own you
Real security comes from community control, not corporate promises. We integrate security culture practices into our technology design.
-## The Changemaker Difference
-
-### Traditional Corporate Flow
-
-```
-Your Data → Corporate Server → Surveillance → Profit → Your Oppression
-```
-
-### Changemaker Flow
-
-```
-Your Data → Your Server → Your Community → Your Power → Liberation
-```
-
### Why This Matters
When you control your technology infrastructure:
@@ -90,7 +76,7 @@ Digital security culture asks: "Who controls the infrastructure where this infor
We believe in **community technology** - tools that:
- Are owned and controlled by the communities that use them
-- Are designed with liberation politics from the ground up
+- Are designed with liberation politics from the ground up using free and open source software
- Prioritize care, consent, and collective power
- Can be understood, modified, and improved by community members
@@ -123,19 +109,6 @@ Real security comes from community control, not corporate promises. When you con
- You know exactly where your data is and who can see it
- You can't be de-platformed or locked out of your own data
-## Historical Context
-
-### Learning from Past Struggles
-
-Every liberation movement has had to solve the problem of secure communication and information sharing:
-
-- **Underground Railroad** - Coded songs and safe houses
-- **Labor Movement** - Secret meetings and encrypted telegrams
-- **Civil Rights Movement** - CB radios and phone trees
-- **LGBTQ+ Liberation** - Chosen families and community networks
-
-The internet should expand these traditions, not replace them with corporate surveillance.
-
### The Surveillance Capitalism Trap
As Shoshana Zuboff documents in "The Age of Surveillance Capitalism," we're living through a new form of capitalism that extracts value from human experience itself. Political movements are particularly valuable targets because:
diff --git a/mkdocs/site/assets/images/social/blog/posts/3.png b/mkdocs/site/assets/images/social/blog/posts/3.png
new file mode 100644
index 0000000..3183deb
Binary files /dev/null and b/mkdocs/site/assets/images/social/blog/posts/3.png differ
diff --git a/mkdocs/site/assets/repo-data/admin-changemaker.lite.json b/mkdocs/site/assets/repo-data/admin-changemaker.lite.json
index 8723a7d..8a18e54 100644
--- a/mkdocs/site/assets/repo-data/admin-changemaker.lite.json
+++ b/mkdocs/site/assets/repo-data/admin-changemaker.lite.json
@@ -7,10 +7,10 @@
"stars_count": 0,
"forks_count": 0,
"open_issues_count": 8,
- "updated_at": "2025-08-01T10:32:33-06:00",
+ "updated_at": "2025-08-01T15:14:12-06:00",
"created_at": "2025-05-28T14:54:59-06:00",
"clone_url": "https://gitea.bnkops.com/admin/changemaker.lite.git",
"ssh_url": "git@gitea.bnkops.com:admin/changemaker.lite.git",
"default_branch": "main",
- "last_build_update": "2025-08-01T10:32:33-06:00"
+ "last_build_update": "2025-08-01T15:14:12-06:00"
}
\ No newline at end of file
diff --git a/mkdocs/site/blog/2025/07/10/2/index.html b/mkdocs/site/blog/2025/07/10/2/index.html
index a2e23e8..3ebd12a 100644
--- a/mkdocs/site/blog/2025/07/10/2/index.html
+++ b/mkdocs/site/blog/2025/07/10/2/index.html
@@ -18,6 +18,8 @@
+
+
@@ -879,6 +881,22 @@ Changemaker Archive. Learn more
+
+
+
+
+
+
diff --git a/mkdocs/site/blog/2025/08/01/3/index.html b/mkdocs/site/blog/2025/08/01/3/index.html
new file mode 100644
index 0000000..f356eb8
--- /dev/null
+++ b/mkdocs/site/blog/2025/08/01/3/index.html
@@ -0,0 +1,1030 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3 - Changemaker Lite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Alrighty yall, it was a wild month of development, and we have a lot to cover! Here’s 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.
+
Campaigning is going! We have candidates working the system in the field, and we’re excited to see how it performs in real-world scenarios.
Alrighty yall, it was a wild month of development, and we have a lot to cover! Here’s 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.
+
Campaigning is going! We have candidates working the system in the field, and we’re excited to see how it performs in real-world scenarios.
Alrighty yall, it was a wild month of development, and we have a lot to cover! Here’s 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.
+
Campaigning is going! We have candidates working the system in the field, and we’re excited to see how it performs in real-world scenarios.
As Shoshana Zuboff documents in "The Age of Surveillance Capitalism," we're living through a new form of capitalism that extracts value from human experience itself. Political movements are particularly valuable targets because:
diff --git a/mkdocs/site/search/search_index.json b/mkdocs/site/search/search_index.json
index b438278..d23dfe7 100644
--- a/mkdocs/site/search/search_index.json
+++ b/mkdocs/site/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en"],"separator":"[\\s\\u200b\\-_,:!=\\[\\]()\"`/]+|\\.(?!\\d)|&[lg]t;|(?!\\b)(?=[A-Z][a-z])","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to Changemaker Lite","text":"
Stop feeding your secrets to corporations. Own your political infrastructure.
# Clone the repository\ngit clone https://gitea.bnkops.com/admin/changemaker.lite\ncd changemaker.lite\n\n# Configure environment\n./config.sh\n\n# Start all services\ndocker compose up -d\n\n# For production deployment with Cloudflare tunnels\n./start-production.sh\n
We are also publishing how BNKops does several advanced workflows. These include things like assembling hardware, how to manage a network, how to manage several changemakers simultaneously, and integrating AI.
"},{"location":"adv/ansible/","title":"Setting Up Ansible with Tailscale for Remote Server Management","text":""},{"location":"adv/ansible/#overview","title":"Overview","text":"
This guide walks you through setting up Ansible to manage remote servers (like ThinkCentre units) using Tailscale for secure networking. This approach provides reliable remote access without complex port forwarding or VPN configurations.
In plainer language; this allows you to manage several Changemaker nodes remotely. If you are a full time campaigner, this can enable you to manage several campaigns infrastructure from a central location while each user gets their own Changemaker box.
Permission denied: Verify SSH keys and file permissions
SSH config errors: Ensure PubkeyAuthentication yes is set
"},{"location":"adv/ansible/#part-4-set-up-tailscale-for-remote-access","title":"Part 4: Set Up Tailscale for Remote Access","text":""},{"location":"adv/ansible/#why-tailscale-over-alternatives","title":"Why Tailscale Over Alternatives","text":"
We initially tried Cloudflare Tunnels but encountered complexity with:
DNS routing issues
Complex configuration for SSH
Same-network testing problems
Multiple configuration approaches with varying success
Tailscale is superior because:
Zero configuration mesh networking
Works from any network
Persistent IP addresses
No port forwarding needed
Free for personal use
"},{"location":"adv/ansible/#1-install-tailscale-on-master-node","title":"1. Install Tailscale on Master Node","text":"
"},{"location":"adv/ansible/#part-6-create-and-run-playbooks","title":"Part 6: Create and Run Playbooks","text":""},{"location":"adv/ansible/#1-simple-information-gathering-playbook","title":"1. Simple Information Gathering Playbook","text":"
Verify both devices are authenticated: tailscale status
Check Tailscale is running: sudo systemctl status tailscaled
Restart Tailscale: sudo tailscale up
"},{"location":"adv/ansible/#scaling-to-multiple-nodes","title":"Scaling to Multiple Nodes","text":""},{"location":"adv/ansible/#adding-new-nodes","title":"Adding New Nodes","text":"
"},{"location":"adv/ansible/#alternative-approaches-we-considered","title":"Alternative Approaches We Considered","text":""},{"location":"adv/ansible/#cloudflare-tunnels","title":"Cloudflare Tunnels","text":"
Pros: Good for web services, handles NAT traversal
Cons: Complex SSH setup, DNS routing issues, same-network problems
Use case: Better for web applications than SSH access
The combination of Ansible + Tailscale is ideal for managing distributed infrastructure without the complexity of traditional VPN setups or the limitations of cloud-specific solutions.
# Check Tailscale status\ntailscale status\n\n# Test Ansible connectivity\nansible all -i inventory.ini -m ping\n\n# Run playbook on all hosts\nansible-playbook -i inventory.ini playbook.yml\n\n# Run playbook on specific group\nansible-playbook -i inventory.ini -l groupname playbook.yml\n\n# Run single command on all hosts\nansible all -i inventory.ini -m command -a \"uptime\"\n\n# SSH to node via Tailscale\nssh username@100.x.x.x\n
"},{"location":"adv/vscode-ssh/","title":"Remote Development with VSCode over Tailscale","text":""},{"location":"adv/vscode-ssh/#overview","title":"Overview","text":"
This guide describes how to set up Visual Studio Code for remote development on servers using the Tailscale network. This enables development directly on remote machines as if they were local, with full access to files, terminals, and debugging capabilities.
# Check Tailscale connectivity\ntailscale status\n\n# Test SSH access\nssh <username>@<tailscale-ip>\n\n# Check VSCode is installed\ncode --version\n
"},{"location":"adv/vscode-ssh/#part-1-install-and-configure-remote-ssh-extension","title":"Part 1: Install and Configure Remote-SSH Extension","text":""},{"location":"adv/vscode-ssh/#1-install-the-remote-development-extensions","title":"1. Install the Remote Development Extensions","text":"
Option A: Install Remote Development Pack (Recommended)
Open VSCode
Press Ctrl+Shift+X (or Cmd+Shift+X on Mac)
Search for \"Remote Development\"
Install the Remote Development extension pack by Microsoft
"},{"location":"adv/vscode-ssh/#part-3-connect-to-remote-servers","title":"Part 3: Connect to Remote Servers","text":""},{"location":"adv/vscode-ssh/#1-connect-via-command-palette","title":"1. Connect via Command Palette","text":"
Press Ctrl+Shift+P
Type \"Remote-SSH: Connect to Host...\"
Select the server (e.g., node1)
VSCode will open a new window connected to the remote server
"},{"location":"adv/vscode-ssh/#2-connect-via-remote-explorer","title":"2. Connect via Remote Explorer","text":"
Click the Remote Explorer icon in Activity Bar
Expand SSH Targets
Click the connect icon next to the server name
"},{"location":"adv/vscode-ssh/#3-connect-via-quick-menu","title":"3. Connect via Quick Menu","text":"
Click the remote indicator in bottom-left corner (looks like ><)
Select \"Connect to Host...\"
Choose the server from the list
"},{"location":"adv/vscode-ssh/#4-first-connection-process","title":"4. First Connection Process","text":"
On first connection, VSCode will:
Verify the host key (click \"Continue\" if prompted)
Install VSCode Server on the remote machine (automatic)
Open a remote window with access to the remote file system
"},{"location":"adv/vscode-ssh/#part-4-remote-development-environment-setup","title":"Part 4: Remote Development Environment Setup","text":""},{"location":"adv/vscode-ssh/#1-open-remote-workspace","title":"1. Open Remote Workspace","text":"
Once connected:
# In the VSCode terminal (now running on remote server)\n# Navigate to the project directory\ncd /home/<username>/projects\n\n# Open current directory in VSCode\ncode .\n\n# Or open a specific project\ncode /opt/myproject\n
"},{"location":"adv/vscode-ssh/#2-install-extensions-on-remote-server","title":"2. Install Extensions on Remote Server","text":"
Extensions must be installed separately on the remote server:
Essential Development Extensions:
Python (Microsoft) - Python development
GitLens (GitKraken) - Enhanced Git capabilities
Docker (Microsoft) - Container development
Prettier - Code formatting
ESLint - JavaScript linting
Auto Rename Tag - HTML/XML tag editing
To Install:
Go to Extensions (Ctrl+Shift+X)
Find the desired extension
Click \"Install in SSH: node1\" (not local install)
"},{"location":"adv/vscode-ssh/#3-configure-git-on-remote-server","title":"3. Configure Git on Remote Server","text":"
# In VSCode terminal (remote)\ngit config --global user.name \"<Full Name>\"\ngit config --global user.email \"<email@example.com>\"\n\n# Test Git connectivity\ngit clone https://github.com/<username>/<repo>.git\n
"},{"location":"adv/vscode-ssh/#part-5-remote-development-workflows","title":"Part 5: Remote Development Workflows","text":""},{"location":"adv/vscode-ssh/#1-file-management","title":"1. File Management","text":"
File Explorer:
Shows remote server's file system
Create, edit, delete files directly
Drag and drop between local and remote (limited)
File Transfer:
# Upload files to remote (from local terminal)\nscp localfile.txt <username>@<tailscale-ip>:/home/<username>/\n\n# Download files from remote\nscp <username>@<tailscale-ip>:/remote/path/file.txt ./local/path/\n
"},{"location":"adv/vscode-ssh/#3-port-forwarding","title":"3. Port Forwarding","text":"
Automatic Port Forwarding: VSCode automatically detects and forwards common development ports.
Manual Port Forwarding:
Open Ports tab in terminal panel
Click \"Forward a Port\"
Enter port number (e.g., 3000, 8080, 5000)
Access via http://localhost:port on the local machine
Example: Web Development
# Start a web server on remote (port 3000)\nnpm start\n\n# VSCode automatically suggests forwarding port 3000\n# Access at http://localhost:3000 on the local machine\n
# Check shell path in remote settings\n\"terminal.integrated.shell.linux\": \"/bin/bash\"\n\n# Or let VSCode auto-detect\n\"terminal.integrated.defaultProfile.linux\": \"bash\"\n
"},{"location":"adv/vscode-ssh/#network-and-performance-issues","title":"Network and Performance Issues","text":"
"},{"location":"adv/vscode-ssh/#part-9-best-practices","title":"Part 9: Best Practices","text":""},{"location":"adv/vscode-ssh/#security-best-practices","title":"Security Best Practices","text":"
# Regular backups via Git\ngit push origin main\n\n# Or manual backup\nscp -r <username>@<tailscale-ip>:/important/project ./backup/\n
"},{"location":"adv/vscode-ssh/#part-10-team-collaboration","title":"Part 10: Team Collaboration","text":""},{"location":"adv/vscode-ssh/#shared-development-servers","title":"Shared Development Servers","text":"
SSH Config for Team:
# Shared development server\nHost team-dev\n HostName <tailscale-ip>\n User <team-user>\n IdentityFile ~/.ssh/team_dev_key\n ForwardAgent yes\n\n# Personal development\nHost my-dev\n HostName <tailscale-ip>\n User <username>\n IdentityFile ~/.ssh/id_rsa\n
# Command Palette shortcuts\nCtrl+Shift+P \u2192 \"Remote-SSH: Connect to Host...\"\nCtrl+Shift+P \u2192 \"Remote-SSH: Open SSH Configuration File...\"\nCtrl+Shift+P \u2192 \"Remote-SSH: Kill VS Code Server on Host...\"\n\n# Terminal\nCtrl+` \u2192 Open integrated terminal\nCtrl+Shift+` \u2192 Create new terminal\n\n# File operations\nCtrl+O \u2192 Open file\nCtrl+S \u2192 Save file\nCtrl+Shift+E \u2192 Focus file explorer\n
The combination of VSCode Remote Development with Tailscale networking creates a powerful, flexible development environment that works from anywhere while maintaining security and performance.
Whether developing Python applications, Node.js services, or managing Docker containers, this setup provides a professional remote development experience that rivals local development while leveraging the power and resources of remote servers.
Welcome to Changemaker-Lite! You're about to reclaim your digital sovereignty and stop feeding your secrets to corporations. This guide will help you set up your own political infrastructure that you actually own and control.
This documentation is broken into a few sections:
Build: Instructions on how to build the cm-lite on your own hardware
Services: Overview of all the services that are installed when you install cm-lite
Configuration: Information on how to configure all the services that you install in cm-lite
Manuals: Manuals on how to use the applications inside cm-lite (with videos!)
# Clone the repository\ngit clone https://gitea.bnkops.com/admin/changemaker.lite\ncd changemaker.lite\n
Cloudflare Credentials
The config.sh script will ask you for your Cloudflare credentials to get started. You can find more information on how to find this in the Cloudlflare Configuration
Right now, we suggest deploying using Cloudflare for simplicity and protections against 99% of surface level attacks to digital infrastructure. If you want to avoid using this service, we recommend checking out Pagolin as a drop in replacement.
For secure public access, use the production deployment script:
Before we dive into the technical setup, let's be clear about what you're doing here:
The Reality
If you do politics, who is reading your secrets? Every corporate platform you use is extracting your power, selling your data, and building profiles on your community. It's time to break free.
Want some help getting started with a baseline buildout for a Ubunutu server? You can use our BNKops Server Build Script to roll out a configured server in about 20 mins!
Docker Engine (24.0+)
# Install Docker\ncurl -fsSL https://get.docker.com | sudo sh\n\n# Add your user to docker group\nsudo usermod -aG docker $USER\n\n# Log out and back in for group changes to take effect\n
Docker Compose (v2.20+)
# Verify Docker Compose v2 is installed\ndocker compose version\n
# View all services\ndocker compose ps\n\n# View logs for specific service\ndocker compose logs -f [service-name]\n\n# Restart a service\ndocker compose restart [service-name]\n\n# Stop all services\ndocker compose down\n\n# Stop and remove all data (CAUTION!)\ndocker compose down -v\n
# Get your user and group IDs\nid -u # User ID\nid -g # Group ID\n\n# Update .env file with correct IDs\nUSER_ID=1000\nGROUP_ID=1000\n\n# Restart services\ndocker compose down && docker compose up -d\n
Map is BNKops canvassing application built for community organizing and door-to-door canvassing.
Complete Configuration
For detailed configuration, usage instructions, and troubleshooting, see the Map Configuration Guide.
Clean NocoDB
Currently the way to get a good result is to ensure the target nocodb database is empty. You can do this by deleting all bases. The script should still work with other volumes however may insert tables into odd locations; still debugging. Again, see config if needing to do manually.
Domain name (optional but recommended for production)
"},{"location":"build/map/#quick-build-process","title":"Quick Build Process","text":""},{"location":"build/map/#1-get-nocodb-api-token","title":"1. Get NocoDB API Token","text":"
Login to your NocoDB instance
Click user icon \u2192 Account Settings \u2192 API Tokens
Update your .env file with your NocoDB details, specifically the instance and api token:
# NocoDB API Configuration\nNOCODB_API_URL=https://your-nocodb-instance.com/api/v1\nNOCODB_API_TOKEN=your-api-token-here\n\n# These will be populated after running build-nocodb.sh\nNOCODB_VIEW_URL=\nNOCODB_LOGIN_SHEET=\nNOCODB_SETTINGS_SHEET=\n\n# Server Configuration\nPORT=3000\nNODE_ENV=production\nSESSION_SECRET=your-secure-random-string\n\n# Map Defaults (Edmonton, AB)\nDEFAULT_LAT=53.5461\nDEFAULT_LNG=-113.4938\nDEFAULT_ZOOM=11\n\n# Production Settings\nCOOKIE_DOMAIN=.yourdomain.com\nALLOWED_ORIGINS=https://map.yourdomain.com,http://localhost:3000\n
This creates three tables: - Locations - Main map data with geo-location, contact info, support levels - Login - User authentication (email, name, admin flag) - Settings - Admin configuration and QR codes
"},{"location":"build/map/#4-get-table-urls","title":"4. Get Table URLs","text":"
After the script completes:
Login to your NocoDB instance
Navigate to your project (\"Map Viewer Project\")
Copy the view URLs for each table from your browser address bar
URLs should look like: https://your-nocodb.com/dashboard/#/nc/project-id/table-id
"},{"location":"build/map/#5-update-environment-with-urls","title":"5. Update Environment with URLs","text":"
For detailed configuration, troubleshooting, and usage instructions, see the Map Configuration Guide.
"},{"location":"build/server/","title":"BNKops Server Build","text":"
Purpose: a Ubuntu server build-out for general application
This documentation is a overview of the full build out for a server OS and baseline for running Changemaker-lite. It is a manual to re-install this server on any machine.
All of the following systems are free and the majority are open source.
Visual Studio Code is a new choice of tool that combines the simplicity of a code editor with what developers need for the core edit-build-debug cycle.
"},{"location":"build/server/#install-using-app-centre","title":"Install Using App Centre","text":""},{"location":"build/server/#obsidian","title":"Obsidian","text":"
The free and flexible app for your private\u00a0thoughts.
"},{"location":"build/server/#install-using-app-center","title":"Install Using App Center","text":""},{"location":"build/server/#curl","title":"Curl","text":"
command line tool and library for transferring data with URLs (since 1998)
Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it\u2019s transmitted over the internet.
# Add the \"stable\" channel to your APT sources:\necho \"deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable\" | sudo tee /etc/apt/sources.list.d/syncthing.list\n
# Update and install syncthing:\nsudo apt-get update\nsudo apt-get install syncthing\n
Connect, protect, and build everywhere. We make websites, apps, and networks faster and more secure. Our developer platform is the best place to build modern apps and deliver AI initiatives.
echo \"deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\" | sudo tee /etc/apt/sources.list.d/cloudflared.list\n
The ./config.sh and ./start-production.sh scripts will properly configure a Cloudflare tunnel and service to put your system online. More info in the Cloudflare Configuration.
You can read through all the BNKops cmlite documentation already in your docs folder or you can reset your docs folder to a baseline to start and read more manuals here. To reset docs folder to baseline, run the following:
./reset-site.sh\n
"},{"location":"build/site/#how-to-build-your-site-step-by-step","title":"\ud83d\ude80 How to Build Your Site (Step by Step)","text":"
Open your Coder instance. For example: coder.yourdomain.com
Go to the mkdocs folder: In the terminal (for a new terminal press Crtl - Shift - ~), type:
cd mkdocs\n
Build the site: Type:
mkdocs build\n
This creates the static website from your documents and places them in the mkdocs/site directory.
Preview your site locally: Visit localhost:4000 for local development or live.youdomain.com to see a public live load.
All documentation in the mkdocs/docs folder is included automatically.
The site uses the beautiful and easy-to-use Material for MkDocs theme.
Material for MkDocs Documentation
Build vs Serve
Your website is built in stages. Any edits to documents in the mkdocs directory are instantly served and visible at localhost:4000 or if in production mode live.yourdomain.com. The live site is not meant as a public access point and will crash if too many requests are made to it.
Running mkdocs build pushes any changes to the site directory, which then a ngnix server pushes them to the production server for public access at your root domain (yourdomain.com).
You can think of it as serve/live = draft for personal review and build = save/push to production for the public.
This combination allows for rapid development of documentation while ensuring your live site does not get updated until your content is ready.
"},{"location":"build/site/#resetting-the-site","title":"\ud83e\uddf9 Resetting the Site","text":"
If you want to start fresh:
Delete all folders EXCEPT these folders:
/blog
/javascripts
/hooks
/assets
/stylesheets
/overrides
Reset the landing page:
Open the main index.md file and remove everything at the very top (the \"front matter\").
Or edit /overrides/home.html to change the landing page.
Reset the mkdocs.yml
Open mkdocs.yml and delete the nav section entirely.
This action will enable mkdocs to build your site navigation based on file names in the root directory.
"},{"location":"build/site/#using-ai-to-help-build-your-site","title":"\ud83e\udd16 Using AI to Help Build Your Site","text":"
If you have a claude.ai subscription, you can use powerful AI in your Coder terminal to write or rewrite pages, including a new home.html.
All you need to do is open the terminal and type:
claude\n
You can also try local AI tools like Ollama for on-demand help.
Cloudflare is the largest DNS routing service on the planet. We use their free service tier to provide Changemaker users with a fast, secure, and reliable way to get online that blocks 99% of surface level attacks and has built in user authenticaion (if you so choose to use it)
Purpose: Identifies your Cloudflare account for tunnel creation and management.
How to Obtain:
Log in to your Cloudflare account.
Go to My Profile > API Tokens.
The Account ID is displayed at the top of the page.
"},{"location":"config/cloudflare-config/#4-cloudflare-tunnel-id-optional-in-configsh-required-in-start-productionsh","title":"4. Cloudflare Tunnel ID (Optional in config.sh, Required in start-production.sh)","text":"
Automatic Configuration of Tunnel
The start-production.sh script will automatically create a tunnel and system service for Cloudflare.
Purpose: Identifies the specific Cloudflare Tunnel that will be used to route traffic to your services.
How to Obtain:
This is automatically generated when you create a tunnel using cloudflared tunnel create or via the Cloudflare dashboard.
The start-production.sh script will create this for you if it doesn't exist.
"},{"location":"config/cloudflare-config/#summary-of-required-credentials","title":"Summary of Required Credentials:","text":"
# In .env file\nCF_API_TOKEN=your_cloudflare_api_token\nCF_ZONE_ID=your_cloudflare_zone_id\nCF_ACCOUNT_ID=your_cloudflare_account_id\nCF_TUNNEL_ID=will_be_set_by_start_production # This will be set by start-production.sh\n
The virtual environment for MkDocs is automatically added to your PATH. You can run MkDocs commands directly, or use the provided script. For example, to build the site, from a clean terminal we would rung:
The code-server environment comes with Claude Code (@anthropic-ai/claude-code) globally installed via npm.
"},{"location":"config/coder/#what-is-claude-code","title":"What is Claude Code?","text":"
Claude Code is an AI-powered coding assistant by Anthropic, designed to help you write, refactor, and understand code directly within your development environment.
The code-server environment includes Ollama, a tool for running large language models locally on your machine.
"},{"location":"config/coder/#what-is-ollama","title":"What is Ollama?","text":"
Ollama is a lightweight, extensible framework for building and running language models locally. It provides a simple API for creating, running, and managing models, making it easy to integrate AI capabilities into your development workflow without relying on external services.
"},{"location":"config/coder/#getting-started-with-ollama","title":"Getting Started with Ollama","text":""},{"location":"config/coder/#staring-ollama","title":"Staring Ollama","text":"
For ollama to be available, you need to open a terminal and run:
ollama serve\n
This will start the ollama server and you can then proceed to pulling a model and chatting.
"},{"location":"config/coder/#pulling-a-model","title":"Pulling a Model","text":"
To get started, you'll need to pull a model. For development and testing, we recommend starting with a smaller model like Gemma 2B:
ollama pull gemma2:2b\n
For even lighter resource usage, you can use the 1B parameter version:
ollama pull gemma2:1b\n
"},{"location":"config/coder/#running-a-model","title":"Running a Model","text":"
Once you've pulled a model, you can start an interactive session:
Phi 3.5 (3.8B): Microsoft's compact language model
Code Llama (7B, 13B, 34B): Specialized for code generation
"},{"location":"config/coder/#using-ollama-in-your-development-workflow","title":"Using Ollama in Your Development Workflow","text":""},{"location":"config/coder/#api-access","title":"API Access","text":"
Ollama provides a REST API that runs on http://localhost:11434 by default. You can integrate this into your applications:
curl http://localhost:11434/api/generate -d '{\n \"model\": \"gemma2:2b\",\n \"prompt\": \"Write a Python function to calculate fibonacci numbers\",\n \"stream\": false\n}'\n
The Map system is a containerized web application that visualizes geographic data from NocoDB on an interactive map using Leaflet.js. It's designed for canvassing applications and community organizing.
The script also creates: - A default admin user (admin@example.com) - A default start location setting
"},{"location":"config/map/#step-4-get-table-urls","title":"Step 4: Get Table URLs","text":"
After the script completes successfully:
Login to your NocoDB instance
Navigate to your project (should be named \"Map Viewer Project\")
For each table, get the view URL:
Click on the table name
Copy the URL from your browser's address bar
The URL should look like: https://your-nocodb.com/dashboard/#/nc/project-id/table-id
You need URLs for: - Locations table \u2192 NOCODB_VIEW_URL - Login table \u2192 NOCODB_LOGIN_SHEET - Settings table \u2192 NOCODB_SETTINGS_SHEET
"},{"location":"config/map/#step-5-update-environment-with-urls","title":"Step 5: Update Environment with URLs","text":"
Edit your .env file and add the table URLs:
# Update these with the actual URLs from your NocoDB instance\nNOCODB_VIEW_URL=https://your-nocodb.com/dashboard/#/nc/project-id/locations-table-id\nNOCODB_LOGIN_SHEET=https://your-nocodb.com/dashboard/#/nc/project-id/login-table-id\nNOCODB_SETTINGS_SHEET=https://your-nocodb.com/dashboard/#/nc/project-id/settings-table-id\n
URL Format
Make sure to use the complete dashboard URLs, not the API URLs. The application will automatically extract the project and table IDs from these URLs.
"},{"location":"config/map/#step-6-build-and-deploy","title":"Step 6: Build and Deploy","text":"
Build the Docker image and start the application:
# Build the Docker image\ndocker-compose build\n\n# Start the application\ndocker-compose up -d\n
GET /api/admin/start-location - Get start location with source info
POST /api/admin/start-location - Update map start location
GET /api/admin/walk-sheet-config - Get walk sheet configuration
POST /api/admin/walk-sheet-config - Save walk sheet configuration
"},{"location":"config/map/#troubleshooting","title":"Troubleshooting","text":""},{"location":"config/map/#common-issues","title":"Common Issues","text":""},{"location":"config/map/#locations-not-showing","title":"Locations not showing","text":"
Verify table has required columns (Geo-Location, latitude, longitude)
# Stop the application\ndocker-compose down\n\n# Pull updates (if using git)\ngit pull origin main\n\n# Rebuild and restart\ndocker-compose build\ndocker-compose up -d\n
For issues or questions: 1. Check the troubleshooting section above 2. Review NocoDB documentation 3. Check Docker and Docker Compose documentation 4. Open an issue on GitHub
"},{"location":"config/mkdocs/","title":"MkDocs Customization & Features Overview","text":"
BNKops has been building our own features, widgets, and css styles for MKdocs material theme.
This document explains the custom styling, repository widgets, and key features enabled in this MkDocs site.
For more info on how to build your site see Site Build
"},{"location":"config/mkdocs/#using-the-repository-widget-in-documentation","title":"Using the Repository Widget in Documentation","text":"
You can embed repository widgets directly in your Markdown documentation to display live repository stats and metadata. To do this, add a div with the appropriate class and data-repo attribute for the repository you want to display.
This will render a styled card with information about the admin/changemaker.lite repository:
Options: You can control the widget display with additional data attributes: - data-show-description=\"false\" \u2014 Hide the description - data-show-language=\"false\" \u2014 Hide the language - data-show-last-update=\"false\" \u2014 Hide the last update date
The extra.css file provides extensive custom styling for the site, including:
Login and Git Code Buttons: Custom styles for .login-button and .git-code-button to create visually distinct, modern buttons with hover effects.
Code Block Improvements: Forces code blocks to wrap text (white-space: pre-wrap) and ensures inline code and tables with code display correctly on all devices.
GitHub Widget Styles: Styles for .github-widget and its subcomponents, including:
Card-like container with gradient backgrounds and subtle box-shadows.
Header with icon, repo link, and stats (stars, forks, issues).
Description area with accent border.
Footer with language, last update, and license info.
Loading and error states with spinners and error messages.
Responsive grid layout for multiple widgets.
Compact variant for smaller displays.
Dark mode adjustments.
Gitea Widget Styles: Similar to GitHub widget, but with Gitea branding (green accents). Includes .gitea-widget, .gitea-widget-container, and related classes for header, stats, description, footer, loading, and error states.
Responsive Design: Media queries ensure widgets and tables look good on mobile devices.
Purpose: During the MkDocs build, this hook fetches metadata for a list of GitHub and Gitea repositories and writes JSON files to docs/assets/repo-data/.
How it works:
Runs before build (unless in serve mode).
Fetches repo data (stars, forks, issues, language, etc.) via GitHub/Gitea APIs.
Outputs a JSON file per repo (e.g., lyqht-mini-qr.json).
Used by frontend widgets for fast, client-side rendering.
This MkDocs site is highly customized for developer documentation, with visually rich repository widgets, improved code and table rendering, and a modern, responsive UI. All repository stats are fetched at build time for performance and reliability.
This is BNKops canvassing how to! In the following document, you will find all sorts of tips and tricks for door knocking, canvassing, and using the BNKops canvassing app.
This manual provides step-by-step instructions for using the NocoDB Map Viewer web application. Each section covers a major feature with direct instructions. (Insert screenshot - feature overview)
For help, check the troubleshooting section, review NocoDB docs, or contact your admin. (Insert screenshot - help section)
"},{"location":"phil/","title":"Philosophy: Your Secrets, Your Power, Your Movement","text":""},{"location":"phil/#the-question-that-changes-everything","title":"The Question That Changes Everything!","text":"
If you are a political actor, who do you trust with your secrets?
This isn't just a technical question\u2014it's the core political question of our time. Every email you send, every document you create, every contact list you build, every strategy you develop: where does it live? Who owns the servers? Who has the keys?
"},{"location":"phil/#the-corporate-extraction-machine","title":"The Corporate Extraction Machine","text":""},{"location":"phil/#how-they-hook-you","title":"How They Hook You","text":"
Corporate software companies have perfected the art of digital snake oil sales:
Free Trials - They lure you in with \"free\" accounts
Feature Creep - Essential features require paid tiers
Data Lock-In - Your data becomes harder to export
Price Escalation - $40/month becomes $750/month as you grow
Surveillance Integration - Your organizing becomes their intelligence
"},{"location":"phil/#the-real-product","title":"The Real Product","text":"
You Are Not the Customer
If you're not paying for the product, you ARE the product. But even when you are paying, you're often still the product.
Corporate platforms don't make money from your subscription fees\u2014they make money from:
Data Sales to third parties
Algorithmic Manipulation for corporate and political interests
Surveillance Contracts with governments and corporations
Predictive Analytics about your community and movement
"},{"location":"phil/#the-bnkops-alternative","title":"The BNKops Alternative","text":""},{"location":"phil/#who-we-are","title":"Who We Are","text":"
BNKops is a cooperative based in amiskwaciy-w\u00e2skahikan (Edmonton, Alberta) on Treaty 6 territory. We're not a corporation\u2014we're a collective of skilled organizers, developers, and community builders who believe technology should serve liberation, not oppression.
Technology that centers the most marginalized voices and fights for collective liberation. We believe strongly that the medium is the message; if you the use the medium of fascists, what does that say about your movement?
"},{"location":"phil/#community-over-profit","title":"\ud83e\udd1d Community Over Profit","text":"
We operate as a cooperative because we believe in shared ownership and democratic decision-making. No venture capitalists, no shareholders, no extraction.
"},{"location":"phil/#data-sovereignty","title":"\u26a1 Data Sovereignty","text":"
Your data belongs to you and your community. We build tools that let you own your digital infrastructure completely.
The tools we use shape the movements we build. Corporate tools create corporate movements\u2014hierarchical, surveilled, and dependent. Community-controlled tools create community-controlled movements\u2014democratic, secure, and sovereign.
"},{"location":"phil/#common-questions","title":"Common Questions","text":""},{"location":"phil/#isnt-this-just-for-tech-people","title":"\"Isn't this just for tech people?\"","text":"
No. We specifically designed Changemaker Lite for organizers, activists, and movement builders who may not have technical backgrounds. Our philosophy is that everyone deserves digital sovereignty, not just people with computer science degrees.
This is not to say that you won't need to learn! These tools are just that; tools. They have no fancy or white-labeled marketing and are technical in nature. You will need to learn to use them, just as any worker needs to learn the power tools they use on the job.
"},{"location":"phil/#what-about-convenience","title":"\"What about convenience?\"","text":"
Corporate platforms are convenient because they've extracted billions of dollars from users to fund that convenience. When you own your tools, there's a learning curve\u2014but it's the same learning curve as learning to organize, learning to build power, learning to create change.
"},{"location":"phil/#cant-we-just-use-corporate-tools-carefully","title":"\"Can't we just use corporate tools carefully?\"","text":"
Would you hold your most sensitive organizing meetings in a room owned by your opposition? Would you store your membership lists in filing cabinets at a corporation that profits from surveillance? Digital tools are the same.
"},{"location":"phil/#what-about-security","title":"\"What about security?\"","text":"
Real security comes from community control, not corporate promises. When you control your infrastructure:
You decide what gets logged and what doesn't
You choose who has access and who doesn't
You know exactly where your data is and who can see it
You can't be de-platformed or locked out of your own data
"},{"location":"phil/#historical-context","title":"Historical Context","text":""},{"location":"phil/#learning-from-past-struggles","title":"Learning from Past Struggles","text":"
Every liberation movement has had to solve the problem of secure communication and information sharing:
Underground Railroad - Coded songs and safe houses
Labor Movement - Secret meetings and encrypted telegrams
Civil Rights Movement - CB radios and phone trees
LGBTQ+ Liberation - Chosen families and community networks
The internet should expand these traditions, not replace them with corporate surveillance.
As Shoshana Zuboff documents in \"The Age of Surveillance Capitalism,\" we're living through a new form of capitalism that extracts value from human experience itself. Political movements are particularly valuable targets because:
Political data predicts behavior
Movement intelligence can be used to counter-organize
Community networks can be mapped and disrupted
Organizing strategies can be monitored and neutralized
"},{"location":"phil/#taking-action","title":"Taking Action","text":""},{"location":"phil/#start-where-you-are","title":"Start Where You Are","text":"
You don't have to replace everything at once. Start with one tool, one campaign, one project. Learn the technology alongside your organizing.
"},{"location":"phil/#build-community-capacity","title":"Build Community Capacity","text":"
The goal isn't individual self-sufficiency\u2014it's community technological sovereignty. Share skills, pool resources, learn together.
"},{"location":"phil/#connect-with-others","title":"Connect with Others","text":"
You're not alone in this. The free and open source software community, the digital security community, and the appropriate technology movement are all working on similar problems.
This isn't about technology for its own sake. It's about building the infrastructure for the world we want to see\u2014where communities have power, where people control their own data, where technology serves liberation.
"},{"location":"phil/#resources-for-deeper-learning","title":"Resources for Deeper Learning","text":""},{"location":"phil/#essential-reading","title":"Essential Reading","text":"
De-corp Your Software Stack - Our full manifesto
The Age of Surveillance Capitalism by Shoshana Zuboff
Self-Hosted Awesome List - Open source alternatives
Linux Journey - Learn Linux basics
Docker Curriculum - Learn containerization
This philosophy document is a living document. Contribute your thoughts, experiences, and improvements through the BNKops documentation platform.
"},{"location":"phil/cost-comparison/","title":"Cost Comparison: Corporation vs. Community","text":""},{"location":"phil/cost-comparison/#the-true-cost-of-corporate-dependency","title":"The True Cost of Corporate Dependency","text":"
When movements choose corporate software, they're not just paying subscription fees\u2014they're paying with their power, their privacy, and their future. Let's break down the real costs.
"},{"location":"phil/cost-comparison/#monthly-cost-analysis","title":"Monthly Cost Analysis","text":""},{"location":"phil/cost-comparison/#small-campaign-50-supporters-5000-emailsmonth","title":"Small Campaign (50 supporters, 5,000 emails/month)","text":"Service Category Corporate Solution Monthly Cost Changemaker Lite Monthly Cost Email Marketing Mailchimp $59/month Listmonk $0* Database & CRM Airtable Pro $240/month NocoDB $0* Website Hosting Squarespace $40/month Static Server $0* Documentation Notion Team $96/month MkDocs $0* Development GitHub Codespaces $87/month Code Server $0* Automation Zapier Professional $73/month n8n $0* File Storage Google Workspace $72/month PostgreSQL + Storage $0* Analytics Corporate tracking Privacy cost\u2020 Self-hosted $0* TOTAL $667/month $50/month
*Included in base Changemaker Lite hosting cost \u2020Privacy costs are incalculable but include surveillance, data sales, and community manipulation
"},{"location":"phil/cost-comparison/#medium-campaign-500-supporters-50000-emailsmonth","title":"Medium Campaign (500 supporters, 50,000 emails/month)","text":"Service Category Corporate Solution Monthly Cost Changemaker Lite Monthly Cost Email Marketing Mailchimp $299/month Listmonk $0* Database & CRM Airtable Pro $600/month NocoDB $0* Website Hosting Squarespace $65/month Static Server $0* Documentation Notion Team $240/month MkDocs $0* Development GitHub Codespaces $174/month Code Server $0* Automation Zapier Professional $146/month n8n $0* File Storage Google Workspace $144/month PostgreSQL + Storage $0* Analytics Corporate tracking Privacy cost\u2020 Self-hosted $0* TOTAL $1,668/month $75/month"},{"location":"phil/cost-comparison/#large-campaign-5000-supporters-500000-emailsmonth","title":"Large Campaign (5,000 supporters, 500,000 emails/month)","text":"Service Category Corporate Solution Monthly Cost Changemaker Lite Monthly Cost Email Marketing Mailchimp $1,499/month Listmonk $0* Database & CRM Airtable Pro $1,200/month NocoDB $0* Website Hosting Squarespace + CDN $120/month Static Server $0* Documentation Notion Team $480/month MkDocs $0* Development GitHub Codespaces $348/month Code Server $0* Automation Zapier Professional $292/month n8n $0* File Storage Google Workspace $288/month PostgreSQL + Storage $0* Analytics Corporate tracking Privacy cost\u2020 Self-hosted $0* TOTAL $4,227/month $150/month"},{"location":"phil/cost-comparison/#annual-savings-breakdown","title":"Annual Savings Breakdown","text":""},{"location":"phil/cost-comparison/#3-year-cost-comparison","title":"3-Year Cost Comparison","text":"Campaign Size Corporate Total Changemaker Total Savings Small $24,012 $1,800 $22,212 Medium $60,048 $2,700 $57,348 Large $152,172 $5,400 $146,772"},{"location":"phil/cost-comparison/#hidden-costs-of-corporate-software","title":"Hidden Costs of Corporate Software","text":""},{"location":"phil/cost-comparison/#what-you-cant-put-a-price-on","title":"What You Can't Put a Price On","text":""},{"location":"phil/cost-comparison/#privacy-violations","title":"Privacy Violations","text":"
Data Harvesting: Every interaction monitored and stored
Behavioral Profiling: Your community mapped and analyzed
Third-Party Sales: Your data sold to unknown entities
Government Access: Warrantless surveillance through corporate partnerships
Dependency Creation: Critical infrastructure controlled by adversaries
Community Fragmentation: Platforms designed to extract attention, not build power
Organizing Interference: Corporate algorithms prioritize engagement over solidarity
Cultural Assimilation: Movement culture shaped by corporate values
"},{"location":"phil/cost-comparison/#the-changemaker-advantage","title":"The Changemaker Advantage","text":""},{"location":"phil/cost-comparison/#what-you-get-for-50-150month","title":"What You Get for $50-150/month","text":""},{"location":"phil/cost-comparison/#complete-infrastructure","title":"Complete Infrastructure","text":"
Open Documentation: Complete guides and tutorials available
Community-Driven Development: Built by and for liberation movements
Technical Support: Professional assistance from BNKops cooperative
Political Alignment: Technology designed with movement values
"},{"location":"phil/cost-comparison/#the-compound-effect","title":"The Compound Effect","text":""},{"location":"phil/cost-comparison/#year-over-year-savings","title":"Year Over Year Savings","text":"
Corporate software costs grow exponentially: - Year 1: \"Starter\" pricing to hook you - Year 2: Feature limits force tier upgrades - Year 3: Usage growth triggers premium pricing - Year 4: Platform changes force expensive migrations - Year 5: Lock-in enables arbitrary price increases
Changemaker Lite costs grow linearly with actual infrastructure needs: - Year 1: Base infrastructure costs - Year 2: Modest increases for storage/bandwidth only - Year 3: Scale only with actual technical requirements - Year 4: Community-driven improvements at no extra cost - Year 5: Established infrastructure with declining per-user costs
Changemaker Alternative: $50-150/month Your Annual Savings: $____
"},{"location":"phil/cost-comparison/#beyond-the-numbers","title":"Beyond the Numbers","text":""},{"location":"phil/cost-comparison/#what-movements-do-with-their-savings","title":"What Movements Do With Their Savings","text":"
The money saved by choosing community-controlled technology doesn't disappear\u2014it goes directly back into movement building:
Hire organizers instead of paying corporate executives
Fund direct actions instead of funding surveillance infrastructure
Support community members instead of enriching shareholders
Build lasting power instead of temporary platform dependency
"},{"location":"phil/cost-comparison/#making-the-switch","title":"Making the Switch","text":""},{"location":"phil/cost-comparison/#transition-strategy","title":"Transition Strategy","text":"
You don't have to switch everything at once:
Start with documentation - Move your knowledge base to MkDocs
Add email infrastructure - Set up Listmonk for newsletters
Build your database - Move contact management to NocoDB
Automate connections - Use n8n to integrate everything
Phase out corporate tools - Cancel subscriptions as you replicate functionality
Changemaker Lite includes several powerful services that work together to provide a complete documentation and development platform. Each service is containerized and can be accessed through its dedicated port.
Code Server provides a full Visual Studio Code experience in your web browser, allowing you to develop from any device. It runs on your server and provides access to your development environment through a web interface.
Gitea is a lightweight, self-hosted Git service similar to GitHub, GitLab, and Bitbucket. It provides a web interface for managing repositories, issues, pull requests, and more.
Homepage is a modern, fully static, fast, secure fully configurable application dashboard with integrations for over 100 services. It provides a beautiful and customizable interface to access all your Changemaker Lite services from a single location.
Widget data not updating: Check Docker socket permissions and container access
docker exec homepage-changemaker ls -la /var/run/docker.sock\n
"},{"location":"services/homepage/#configuration-examples","title":"Configuration Examples","text":""},{"location":"services/homepage/#basic-service-widget","title":"Basic Service Widget","text":"
- Code Server:\n href: http://localhost:8888\n description: VS Code in the browser\n icon: code-server\n widget:\n type: docker\n container: code-server-changemaker\n
Listmonk is a modern, feature-rich newsletter and mailing list manager designed for high performance and easy management. It provides a complete solution for email campaigns, subscriber management, and analytics.
The Map service provides an interactive web-based map for displaying, searching, and analyzing geospatial data from a NocoDB backend. It supports real-time geolocation, adding new locations, and is optimized for both desktop and mobile use.
All configuration is done via environment variables:
Variable Description Default NOCODB_API_URL NocoDB API base URL Required NOCODB_API_TOKEN API authentication token Required NOCODB_VIEW_URL Full NocoDB view URL Required PORT Server port 3000 DEFAULT_LAT Default map latitude 53.5461 DEFAULT_LNG Default map longitude -113.4938 DEFAULT_ZOOM Default map zoom level 11"},{"location":"services/map/#volumes","title":"Volumes","text":"
Mini QR is a lightweight service for generating QR codes for URLs, text, or other data. It provides a web interface for quick QR code creation and download.
MkDocs Material is a powerful documentation framework built on top of MkDocs, providing a beautiful Material Design theme and advanced features for creating professional documentation sites.
# Page Title\n\nThis is a sample documentation page.\n\n## Section\n\nContent goes here with **bold** and *italic* text.\n\n### Code Example\n\n```python\ndef hello_world():\n print(\"Hello, World!\")\n
Note
This is an informational note.
## Building and Deployment\n\n### Development\n\nThe development server runs automatically with live reload.\n\n### Building Static Site\n\n```bash\ndocker exec mkdocs-changemaker mkdocs build\n
The built site will be available in the mkdocs/site/ directory.
"},{"location":"services/mkdocs/#customization","title":"Customization","text":""},{"location":"services/mkdocs/#themes-and-colors","title":"Themes and Colors","text":"
n8n is a powerful workflow automation tool that allows you to connect various apps and services together. It provides a visual interface for creating automated workflows, making it easy to integrate different systems and automate repetitive tasks.
"},{"location":"services/n8n/#common-use-cases","title":"Common Use Cases","text":""},{"location":"services/n8n/#documentation-automation","title":"Documentation Automation","text":"
"},{"location":"services/n8n/#example-workflows","title":"Example Workflows","text":""},{"location":"services/n8n/#simple-webhook-to-email","title":"Simple Webhook to Email","text":"
NocoDB is an open-source no-code platform that transforms any database into a smart spreadsheet interface. It provides a user-friendly way to manage data, create forms, build APIs, and collaborate on database operations without requiring extensive technical knowledge.
Create Project: Start with a new project or connect existing databases
Add Tables: Import data or create new tables
Configure Views: Set up different views (Grid, Form, Gallery, etc.)
Set Permissions: Configure user access and sharing settings
"},{"location":"services/nocodb/#common-use-cases","title":"Common Use Cases","text":""},{"location":"services/nocodb/#content-management","title":"Content Management","text":"
NocoDB automatically generates REST APIs for all your tables:
# Get all records from a table\nGET http://localhost:8090/api/v1/db/data/v1/{project}/table/{table}\n\n# Create a new record\nPOST http://localhost:8090/api/v1/db/data/v1/{project}/table/{table}\n\n# Update a record\nPATCH http://localhost:8090/api/v1/db/data/v1/{project}/table/{table}/{id}\n
"},{"location":"services/nocodb/#backup-and-data-management","title":"Backup and Data Management","text":""},{"location":"services/nocodb/#database-backup","title":"Database Backup","text":"
Since NocoDB uses PostgreSQL, you can backup the database:
PostgreSQL is a powerful, open-source relational database system. In Changemaker Lite, it serves as the backend database for Listmonk and can be used by other applications requiring persistent data storage.
Database data is stored in a Docker volume (listmonk-data) to ensure persistence across container restarts.
"},{"location":"services/postgresql/#connecting-to-the-database","title":"Connecting to the Database","text":""},{"location":"services/postgresql/#from-host-machine","title":"From Host Machine","text":"
You can connect to PostgreSQL from your host machine using:
"},{"location":"services/postgresql/#from-other-containers","title":"From Other Containers","text":"
Other containers can connect using the internal hostname listmonk-db on port 5432.
"},{"location":"services/postgresql/#backup-and-restore","title":"Backup and Restore","text":""},{"location":"services/postgresql/#backup","title":"Backup","text":"
The Static Site Server uses Nginx to serve your built documentation and static websites. It's configured to serve the built MkDocs site and other static content with high performance and reliability.
For more information about the underlying Nginx server: - LinuxServer.io Nginx - Nginx Documentation
"},{"location":"blog/archive/2025/","title":"2025","text":""}]}
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\u200b\\-_,:!=\\[\\]()\"`/]+|\\.(?!\\d)|&[lg]t;|(?!\\b)(?=[A-Z][a-z])","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to Changemaker Lite","text":"
Stop feeding your secrets to corporations. Own your political infrastructure.
# Clone the repository\ngit clone https://gitea.bnkops.com/admin/changemaker.lite\ncd changemaker.lite\n\n# Configure environment\n./config.sh\n\n# Start all services\ndocker compose up -d\n\n# For production deployment with Cloudflare tunnels\n./start-production.sh\n
We are also publishing how BNKops does several advanced workflows. These include things like assembling hardware, how to manage a network, how to manage several changemakers simultaneously, and integrating AI.
"},{"location":"adv/ansible/","title":"Setting Up Ansible with Tailscale for Remote Server Management","text":""},{"location":"adv/ansible/#overview","title":"Overview","text":"
This guide walks you through setting up Ansible to manage remote servers (like ThinkCentre units) using Tailscale for secure networking. This approach provides reliable remote access without complex port forwarding or VPN configurations.
In plainer language; this allows you to manage several Changemaker nodes remotely. If you are a full time campaigner, this can enable you to manage several campaigns infrastructure from a central location while each user gets their own Changemaker box.
Permission denied: Verify SSH keys and file permissions
SSH config errors: Ensure PubkeyAuthentication yes is set
"},{"location":"adv/ansible/#part-4-set-up-tailscale-for-remote-access","title":"Part 4: Set Up Tailscale for Remote Access","text":""},{"location":"adv/ansible/#why-tailscale-over-alternatives","title":"Why Tailscale Over Alternatives","text":"
We initially tried Cloudflare Tunnels but encountered complexity with:
DNS routing issues
Complex configuration for SSH
Same-network testing problems
Multiple configuration approaches with varying success
Tailscale is superior because:
Zero configuration mesh networking
Works from any network
Persistent IP addresses
No port forwarding needed
Free for personal use
"},{"location":"adv/ansible/#1-install-tailscale-on-master-node","title":"1. Install Tailscale on Master Node","text":"
"},{"location":"adv/ansible/#part-6-create-and-run-playbooks","title":"Part 6: Create and Run Playbooks","text":""},{"location":"adv/ansible/#1-simple-information-gathering-playbook","title":"1. Simple Information Gathering Playbook","text":"
Verify both devices are authenticated: tailscale status
Check Tailscale is running: sudo systemctl status tailscaled
Restart Tailscale: sudo tailscale up
"},{"location":"adv/ansible/#scaling-to-multiple-nodes","title":"Scaling to Multiple Nodes","text":""},{"location":"adv/ansible/#adding-new-nodes","title":"Adding New Nodes","text":"
"},{"location":"adv/ansible/#alternative-approaches-we-considered","title":"Alternative Approaches We Considered","text":""},{"location":"adv/ansible/#cloudflare-tunnels","title":"Cloudflare Tunnels","text":"
Pros: Good for web services, handles NAT traversal
Cons: Complex SSH setup, DNS routing issues, same-network problems
Use case: Better for web applications than SSH access
The combination of Ansible + Tailscale is ideal for managing distributed infrastructure without the complexity of traditional VPN setups or the limitations of cloud-specific solutions.
# Check Tailscale status\ntailscale status\n\n# Test Ansible connectivity\nansible all -i inventory.ini -m ping\n\n# Run playbook on all hosts\nansible-playbook -i inventory.ini playbook.yml\n\n# Run playbook on specific group\nansible-playbook -i inventory.ini -l groupname playbook.yml\n\n# Run single command on all hosts\nansible all -i inventory.ini -m command -a \"uptime\"\n\n# SSH to node via Tailscale\nssh username@100.x.x.x\n
"},{"location":"adv/vscode-ssh/","title":"Remote Development with VSCode over Tailscale","text":""},{"location":"adv/vscode-ssh/#overview","title":"Overview","text":"
This guide describes how to set up Visual Studio Code for remote development on servers using the Tailscale network. This enables development directly on remote machines as if they were local, with full access to files, terminals, and debugging capabilities.
# Check Tailscale connectivity\ntailscale status\n\n# Test SSH access\nssh <username>@<tailscale-ip>\n\n# Check VSCode is installed\ncode --version\n
"},{"location":"adv/vscode-ssh/#part-1-install-and-configure-remote-ssh-extension","title":"Part 1: Install and Configure Remote-SSH Extension","text":""},{"location":"adv/vscode-ssh/#1-install-the-remote-development-extensions","title":"1. Install the Remote Development Extensions","text":"
Option A: Install Remote Development Pack (Recommended)
Open VSCode
Press Ctrl+Shift+X (or Cmd+Shift+X on Mac)
Search for \"Remote Development\"
Install the Remote Development extension pack by Microsoft
"},{"location":"adv/vscode-ssh/#part-3-connect-to-remote-servers","title":"Part 3: Connect to Remote Servers","text":""},{"location":"adv/vscode-ssh/#1-connect-via-command-palette","title":"1. Connect via Command Palette","text":"
Press Ctrl+Shift+P
Type \"Remote-SSH: Connect to Host...\"
Select the server (e.g., node1)
VSCode will open a new window connected to the remote server
"},{"location":"adv/vscode-ssh/#2-connect-via-remote-explorer","title":"2. Connect via Remote Explorer","text":"
Click the Remote Explorer icon in Activity Bar
Expand SSH Targets
Click the connect icon next to the server name
"},{"location":"adv/vscode-ssh/#3-connect-via-quick-menu","title":"3. Connect via Quick Menu","text":"
Click the remote indicator in bottom-left corner (looks like ><)
Select \"Connect to Host...\"
Choose the server from the list
"},{"location":"adv/vscode-ssh/#4-first-connection-process","title":"4. First Connection Process","text":"
On first connection, VSCode will:
Verify the host key (click \"Continue\" if prompted)
Install VSCode Server on the remote machine (automatic)
Open a remote window with access to the remote file system
"},{"location":"adv/vscode-ssh/#part-4-remote-development-environment-setup","title":"Part 4: Remote Development Environment Setup","text":""},{"location":"adv/vscode-ssh/#1-open-remote-workspace","title":"1. Open Remote Workspace","text":"
Once connected:
# In the VSCode terminal (now running on remote server)\n# Navigate to the project directory\ncd /home/<username>/projects\n\n# Open current directory in VSCode\ncode .\n\n# Or open a specific project\ncode /opt/myproject\n
"},{"location":"adv/vscode-ssh/#2-install-extensions-on-remote-server","title":"2. Install Extensions on Remote Server","text":"
Extensions must be installed separately on the remote server:
Essential Development Extensions:
Python (Microsoft) - Python development
GitLens (GitKraken) - Enhanced Git capabilities
Docker (Microsoft) - Container development
Prettier - Code formatting
ESLint - JavaScript linting
Auto Rename Tag - HTML/XML tag editing
To Install:
Go to Extensions (Ctrl+Shift+X)
Find the desired extension
Click \"Install in SSH: node1\" (not local install)
"},{"location":"adv/vscode-ssh/#3-configure-git-on-remote-server","title":"3. Configure Git on Remote Server","text":"
# In VSCode terminal (remote)\ngit config --global user.name \"<Full Name>\"\ngit config --global user.email \"<email@example.com>\"\n\n# Test Git connectivity\ngit clone https://github.com/<username>/<repo>.git\n
"},{"location":"adv/vscode-ssh/#part-5-remote-development-workflows","title":"Part 5: Remote Development Workflows","text":""},{"location":"adv/vscode-ssh/#1-file-management","title":"1. File Management","text":"
File Explorer:
Shows remote server's file system
Create, edit, delete files directly
Drag and drop between local and remote (limited)
File Transfer:
# Upload files to remote (from local terminal)\nscp localfile.txt <username>@<tailscale-ip>:/home/<username>/\n\n# Download files from remote\nscp <username>@<tailscale-ip>:/remote/path/file.txt ./local/path/\n
"},{"location":"adv/vscode-ssh/#3-port-forwarding","title":"3. Port Forwarding","text":"
Automatic Port Forwarding: VSCode automatically detects and forwards common development ports.
Manual Port Forwarding:
Open Ports tab in terminal panel
Click \"Forward a Port\"
Enter port number (e.g., 3000, 8080, 5000)
Access via http://localhost:port on the local machine
Example: Web Development
# Start a web server on remote (port 3000)\nnpm start\n\n# VSCode automatically suggests forwarding port 3000\n# Access at http://localhost:3000 on the local machine\n
# Check shell path in remote settings\n\"terminal.integrated.shell.linux\": \"/bin/bash\"\n\n# Or let VSCode auto-detect\n\"terminal.integrated.defaultProfile.linux\": \"bash\"\n
"},{"location":"adv/vscode-ssh/#network-and-performance-issues","title":"Network and Performance Issues","text":"
"},{"location":"adv/vscode-ssh/#part-9-best-practices","title":"Part 9: Best Practices","text":""},{"location":"adv/vscode-ssh/#security-best-practices","title":"Security Best Practices","text":"
# Regular backups via Git\ngit push origin main\n\n# Or manual backup\nscp -r <username>@<tailscale-ip>:/important/project ./backup/\n
"},{"location":"adv/vscode-ssh/#part-10-team-collaboration","title":"Part 10: Team Collaboration","text":""},{"location":"adv/vscode-ssh/#shared-development-servers","title":"Shared Development Servers","text":"
SSH Config for Team:
# Shared development server\nHost team-dev\n HostName <tailscale-ip>\n User <team-user>\n IdentityFile ~/.ssh/team_dev_key\n ForwardAgent yes\n\n# Personal development\nHost my-dev\n HostName <tailscale-ip>\n User <username>\n IdentityFile ~/.ssh/id_rsa\n
# Command Palette shortcuts\nCtrl+Shift+P \u2192 \"Remote-SSH: Connect to Host...\"\nCtrl+Shift+P \u2192 \"Remote-SSH: Open SSH Configuration File...\"\nCtrl+Shift+P \u2192 \"Remote-SSH: Kill VS Code Server on Host...\"\n\n# Terminal\nCtrl+` \u2192 Open integrated terminal\nCtrl+Shift+` \u2192 Create new terminal\n\n# File operations\nCtrl+O \u2192 Open file\nCtrl+S \u2192 Save file\nCtrl+Shift+E \u2192 Focus file explorer\n
The combination of VSCode Remote Development with Tailscale networking creates a powerful, flexible development environment that works from anywhere while maintaining security and performance.
Whether developing Python applications, Node.js services, or managing Docker containers, this setup provides a professional remote development experience that rivals local development while leveraging the power and resources of remote servers.
Alrighty yall, it was a wild month of development, and we have a lot to cover! Here\u2019s 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.
Campaigning is going! We have candidates working the system in the field, and we\u2019re excited to see how it performs in real-world scenarios.
"},{"location":"blog/2025/08/01/3/#monthly-development-report-august-2025","title":"Monthly Development Report \u2013 August 2025","text":""},{"location":"blog/2025/08/01/3/#git-change-summary-julyaugust-2025","title":"Git Change Summary (July\u2013August 2025)","text":"
Below is a summary of all changes pushed to git in the last month:
Admin Panel & NocoDB Integration: Major updates to the admin section, including a new NocoDB admin area, improved database search, and code cleanups.
Website & UI Updates: Numerous updates to the website, including language tweaks, mobile friendliness, and new frontend features.
Shifts Management: Comprehensive volunteer shift management system added, with calendar/grid views, admin controls, and real-time updates.
Authentication & User Management: Enhanced login system, password recovery via SMTP, user management panel for admins, and role-based access control.
Welcome to Changemaker-Lite! You're about to reclaim your digital sovereignty and stop feeding your secrets to corporations. This guide will help you set up your own political infrastructure that you actually own and control.
This documentation is broken into a few sections:
Build: Instructions on how to build the cm-lite on your own hardware
Services: Overview of all the services that are installed when you install cm-lite
Configuration: Information on how to configure all the services that you install in cm-lite
Manuals: Manuals on how to use the applications inside cm-lite (with videos!)
# Clone the repository\ngit clone https://gitea.bnkops.com/admin/changemaker.lite\ncd changemaker.lite\n
Cloudflare Credentials
The config.sh script will ask you for your Cloudflare credentials to get started. You can find more information on how to find this in the Cloudlflare Configuration
Right now, we suggest deploying using Cloudflare for simplicity and protections against 99% of surface level attacks to digital infrastructure. If you want to avoid using this service, we recommend checking out Pagolin as a drop in replacement.
For secure public access, use the production deployment script:
Before we dive into the technical setup, let's be clear about what you're doing here:
The Reality
If you do politics, who is reading your secrets? Every corporate platform you use is extracting your power, selling your data, and building profiles on your community. It's time to break free.
Want some help getting started with a baseline buildout for a Ubunutu server? You can use our BNKops Server Build Script to roll out a configured server in about 20 mins!
Docker Engine (24.0+)
# Install Docker\ncurl -fsSL https://get.docker.com | sudo sh\n\n# Add your user to docker group\nsudo usermod -aG docker $USER\n\n# Log out and back in for group changes to take effect\n
Docker Compose (v2.20+)
# Verify Docker Compose v2 is installed\ndocker compose version\n
# View all services\ndocker compose ps\n\n# View logs for specific service\ndocker compose logs -f [service-name]\n\n# Restart a service\ndocker compose restart [service-name]\n\n# Stop all services\ndocker compose down\n\n# Stop and remove all data (CAUTION!)\ndocker compose down -v\n
# Get your user and group IDs\nid -u # User ID\nid -g # Group ID\n\n# Update .env file with correct IDs\nUSER_ID=1000\nGROUP_ID=1000\n\n# Restart services\ndocker compose down && docker compose up -d\n
Map is BNKops canvassing application built for community organizing and door-to-door canvassing.
Complete Configuration
For detailed configuration, usage instructions, and troubleshooting, see the Map Configuration Guide.
Clean NocoDB
Currently the way to get a good result is to ensure the target nocodb database is empty. You can do this by deleting all bases. The script should still work with other volumes however may insert tables into odd locations; still debugging. Again, see config if needing to do manually.
Domain name (optional but recommended for production)
"},{"location":"build/map/#quick-build-process","title":"Quick Build Process","text":""},{"location":"build/map/#1-get-nocodb-api-token","title":"1. Get NocoDB API Token","text":"
Login to your NocoDB instance
Click user icon \u2192 Account Settings \u2192 API Tokens
Update your .env file with your NocoDB details, specifically the instance and api token:
# NocoDB API Configuration\nNOCODB_API_URL=https://your-nocodb-instance.com/api/v1\nNOCODB_API_TOKEN=your-api-token-here\n\n# These will be populated after running build-nocodb.sh\nNOCODB_VIEW_URL=\nNOCODB_LOGIN_SHEET=\nNOCODB_SETTINGS_SHEET=\n\n# Server Configuration\nPORT=3000\nNODE_ENV=production\nSESSION_SECRET=your-secure-random-string\n\n# Map Defaults (Edmonton, AB)\nDEFAULT_LAT=53.5461\nDEFAULT_LNG=-113.4938\nDEFAULT_ZOOM=11\n\n# Production Settings\nCOOKIE_DOMAIN=.yourdomain.com\nALLOWED_ORIGINS=https://map.yourdomain.com,http://localhost:3000\n
This creates three tables: - Locations - Main map data with geo-location, contact info, support levels - Login - User authentication (email, name, admin flag) - Settings - Admin configuration and QR codes
"},{"location":"build/map/#4-get-table-urls","title":"4. Get Table URLs","text":"
After the script completes:
Login to your NocoDB instance
Navigate to your project (\"Map Viewer Project\")
Copy the view URLs for each table from your browser address bar
URLs should look like: https://your-nocodb.com/dashboard/#/nc/project-id/table-id
"},{"location":"build/map/#5-update-environment-with-urls","title":"5. Update Environment with URLs","text":"
For detailed configuration, troubleshooting, and usage instructions, see the Map Configuration Guide.
"},{"location":"build/server/","title":"BNKops Server Build","text":"
Purpose: a Ubuntu server build-out for general application
This documentation is a overview of the full build out for a server OS and baseline for running Changemaker-lite. It is a manual to re-install this server on any machine.
All of the following systems are free and the majority are open source.
Visual Studio Code is a new choice of tool that combines the simplicity of a code editor with what developers need for the core edit-build-debug cycle.
"},{"location":"build/server/#install-using-app-centre","title":"Install Using App Centre","text":""},{"location":"build/server/#obsidian","title":"Obsidian","text":"
The free and flexible app for your private\u00a0thoughts.
"},{"location":"build/server/#install-using-app-center","title":"Install Using App Center","text":""},{"location":"build/server/#curl","title":"Curl","text":"
command line tool and library for transferring data with URLs (since 1998)
Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it\u2019s transmitted over the internet.
# Add the \"stable\" channel to your APT sources:\necho \"deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable\" | sudo tee /etc/apt/sources.list.d/syncthing.list\n
# Update and install syncthing:\nsudo apt-get update\nsudo apt-get install syncthing\n
Connect, protect, and build everywhere. We make websites, apps, and networks faster and more secure. Our developer platform is the best place to build modern apps and deliver AI initiatives.
echo \"deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\" | sudo tee /etc/apt/sources.list.d/cloudflared.list\n
The ./config.sh and ./start-production.sh scripts will properly configure a Cloudflare tunnel and service to put your system online. More info in the Cloudflare Configuration.
You can read through all the BNKops cmlite documentation already in your docs folder or you can reset your docs folder to a baseline to start and read more manuals here. To reset docs folder to baseline, run the following:
./reset-site.sh\n
"},{"location":"build/site/#how-to-build-your-site-step-by-step","title":"\ud83d\ude80 How to Build Your Site (Step by Step)","text":"
Open your Coder instance. For example: coder.yourdomain.com
Go to the mkdocs folder: In the terminal (for a new terminal press Crtl - Shift - ~), type:
cd mkdocs\n
Build the site: Type:
mkdocs build\n
This creates the static website from your documents and places them in the mkdocs/site directory.
Preview your site locally: Visit localhost:4000 for local development or live.youdomain.com to see a public live load.
All documentation in the mkdocs/docs folder is included automatically.
The site uses the beautiful and easy-to-use Material for MkDocs theme.
Material for MkDocs Documentation
Build vs Serve
Your website is built in stages. Any edits to documents in the mkdocs directory are instantly served and visible at localhost:4000 or if in production mode live.yourdomain.com. The live site is not meant as a public access point and will crash if too many requests are made to it.
Running mkdocs build pushes any changes to the site directory, which then a ngnix server pushes them to the production server for public access at your root domain (yourdomain.com).
You can think of it as serve/live = draft for personal review and build = save/push to production for the public.
This combination allows for rapid development of documentation while ensuring your live site does not get updated until your content is ready.
"},{"location":"build/site/#resetting-the-site","title":"\ud83e\uddf9 Resetting the Site","text":"
If you want to start fresh:
Delete all folders EXCEPT these folders:
/blog
/javascripts
/hooks
/assets
/stylesheets
/overrides
Reset the landing page:
Open the main index.md file and remove everything at the very top (the \"front matter\").
Or edit /overrides/home.html to change the landing page.
Reset the mkdocs.yml
Open mkdocs.yml and delete the nav section entirely.
This action will enable mkdocs to build your site navigation based on file names in the root directory.
"},{"location":"build/site/#using-ai-to-help-build-your-site","title":"\ud83e\udd16 Using AI to Help Build Your Site","text":"
If you have a claude.ai subscription, you can use powerful AI in your Coder terminal to write or rewrite pages, including a new home.html.
All you need to do is open the terminal and type:
claude\n
You can also try local AI tools like Ollama for on-demand help.
Cloudflare is the largest DNS routing service on the planet. We use their free service tier to provide Changemaker users with a fast, secure, and reliable way to get online that blocks 99% of surface level attacks and has built in user authenticaion (if you so choose to use it)
Purpose: Identifies your Cloudflare account for tunnel creation and management.
How to Obtain:
Log in to your Cloudflare account.
Go to My Profile > API Tokens.
The Account ID is displayed at the top of the page.
"},{"location":"config/cloudflare-config/#4-cloudflare-tunnel-id-optional-in-configsh-required-in-start-productionsh","title":"4. Cloudflare Tunnel ID (Optional in config.sh, Required in start-production.sh)","text":"
Automatic Configuration of Tunnel
The start-production.sh script will automatically create a tunnel and system service for Cloudflare.
Purpose: Identifies the specific Cloudflare Tunnel that will be used to route traffic to your services.
How to Obtain:
This is automatically generated when you create a tunnel using cloudflared tunnel create or via the Cloudflare dashboard.
The start-production.sh script will create this for you if it doesn't exist.
"},{"location":"config/cloudflare-config/#summary-of-required-credentials","title":"Summary of Required Credentials:","text":"
# In .env file\nCF_API_TOKEN=your_cloudflare_api_token\nCF_ZONE_ID=your_cloudflare_zone_id\nCF_ACCOUNT_ID=your_cloudflare_account_id\nCF_TUNNEL_ID=will_be_set_by_start_production # This will be set by start-production.sh\n
The virtual environment for MkDocs is automatically added to your PATH. You can run MkDocs commands directly, or use the provided script. For example, to build the site, from a clean terminal we would rung:
The code-server environment comes with Claude Code (@anthropic-ai/claude-code) globally installed via npm.
"},{"location":"config/coder/#what-is-claude-code","title":"What is Claude Code?","text":"
Claude Code is an AI-powered coding assistant by Anthropic, designed to help you write, refactor, and understand code directly within your development environment.
The code-server environment includes Ollama, a tool for running large language models locally on your machine.
"},{"location":"config/coder/#what-is-ollama","title":"What is Ollama?","text":"
Ollama is a lightweight, extensible framework for building and running language models locally. It provides a simple API for creating, running, and managing models, making it easy to integrate AI capabilities into your development workflow without relying on external services.
"},{"location":"config/coder/#getting-started-with-ollama","title":"Getting Started with Ollama","text":""},{"location":"config/coder/#staring-ollama","title":"Staring Ollama","text":"
For ollama to be available, you need to open a terminal and run:
ollama serve\n
This will start the ollama server and you can then proceed to pulling a model and chatting.
"},{"location":"config/coder/#pulling-a-model","title":"Pulling a Model","text":"
To get started, you'll need to pull a model. For development and testing, we recommend starting with a smaller model like Gemma 2B:
ollama pull gemma2:2b\n
For even lighter resource usage, you can use the 1B parameter version:
ollama pull gemma2:1b\n
"},{"location":"config/coder/#running-a-model","title":"Running a Model","text":"
Once you've pulled a model, you can start an interactive session:
Phi 3.5 (3.8B): Microsoft's compact language model
Code Llama (7B, 13B, 34B): Specialized for code generation
"},{"location":"config/coder/#using-ollama-in-your-development-workflow","title":"Using Ollama in Your Development Workflow","text":""},{"location":"config/coder/#api-access","title":"API Access","text":"
Ollama provides a REST API that runs on http://localhost:11434 by default. You can integrate this into your applications:
curl http://localhost:11434/api/generate -d '{\n \"model\": \"gemma2:2b\",\n \"prompt\": \"Write a Python function to calculate fibonacci numbers\",\n \"stream\": false\n}'\n
The Map system is a containerized web application that visualizes geographic data from NocoDB on an interactive map using Leaflet.js. It's designed for canvassing applications and community organizing.
The script also creates: - A default admin user (admin@example.com) - A default start location setting
"},{"location":"config/map/#step-4-get-table-urls","title":"Step 4: Get Table URLs","text":"
After the script completes successfully:
Login to your NocoDB instance
Navigate to your project (should be named \"Map Viewer Project\")
For each table, get the view URL:
Click on the table name
Copy the URL from your browser's address bar
The URL should look like: https://your-nocodb.com/dashboard/#/nc/project-id/table-id
You need URLs for: - Locations table \u2192 NOCODB_VIEW_URL - Login table \u2192 NOCODB_LOGIN_SHEET - Settings table \u2192 NOCODB_SETTINGS_SHEET
"},{"location":"config/map/#step-5-update-environment-with-urls","title":"Step 5: Update Environment with URLs","text":"
Edit your .env file and add the table URLs:
# Update these with the actual URLs from your NocoDB instance\nNOCODB_VIEW_URL=https://your-nocodb.com/dashboard/#/nc/project-id/locations-table-id\nNOCODB_LOGIN_SHEET=https://your-nocodb.com/dashboard/#/nc/project-id/login-table-id\nNOCODB_SETTINGS_SHEET=https://your-nocodb.com/dashboard/#/nc/project-id/settings-table-id\n
URL Format
Make sure to use the complete dashboard URLs, not the API URLs. The application will automatically extract the project and table IDs from these URLs.
"},{"location":"config/map/#step-6-build-and-deploy","title":"Step 6: Build and Deploy","text":"
Build the Docker image and start the application:
# Build the Docker image\ndocker-compose build\n\n# Start the application\ndocker-compose up -d\n
GET /api/admin/start-location - Get start location with source info
POST /api/admin/start-location - Update map start location
GET /api/admin/walk-sheet-config - Get walk sheet configuration
POST /api/admin/walk-sheet-config - Save walk sheet configuration
"},{"location":"config/map/#troubleshooting","title":"Troubleshooting","text":""},{"location":"config/map/#common-issues","title":"Common Issues","text":""},{"location":"config/map/#locations-not-showing","title":"Locations not showing","text":"
Verify table has required columns (Geo-Location, latitude, longitude)
# Stop the application\ndocker-compose down\n\n# Pull updates (if using git)\ngit pull origin main\n\n# Rebuild and restart\ndocker-compose build\ndocker-compose up -d\n
For issues or questions: 1. Check the troubleshooting section above 2. Review NocoDB documentation 3. Check Docker and Docker Compose documentation 4. Open an issue on GitHub
"},{"location":"config/mkdocs/","title":"MkDocs Customization & Features Overview","text":"
BNKops has been building our own features, widgets, and css styles for MKdocs material theme.
This document explains the custom styling, repository widgets, and key features enabled in this MkDocs site.
For more info on how to build your site see Site Build
"},{"location":"config/mkdocs/#using-the-repository-widget-in-documentation","title":"Using the Repository Widget in Documentation","text":"
You can embed repository widgets directly in your Markdown documentation to display live repository stats and metadata. To do this, add a div with the appropriate class and data-repo attribute for the repository you want to display.
This will render a styled card with information about the admin/changemaker.lite repository:
Options: You can control the widget display with additional data attributes: - data-show-description=\"false\" \u2014 Hide the description - data-show-language=\"false\" \u2014 Hide the language - data-show-last-update=\"false\" \u2014 Hide the last update date
The extra.css file provides extensive custom styling for the site, including:
Login and Git Code Buttons: Custom styles for .login-button and .git-code-button to create visually distinct, modern buttons with hover effects.
Code Block Improvements: Forces code blocks to wrap text (white-space: pre-wrap) and ensures inline code and tables with code display correctly on all devices.
GitHub Widget Styles: Styles for .github-widget and its subcomponents, including:
Card-like container with gradient backgrounds and subtle box-shadows.
Header with icon, repo link, and stats (stars, forks, issues).
Description area with accent border.
Footer with language, last update, and license info.
Loading and error states with spinners and error messages.
Responsive grid layout for multiple widgets.
Compact variant for smaller displays.
Dark mode adjustments.
Gitea Widget Styles: Similar to GitHub widget, but with Gitea branding (green accents). Includes .gitea-widget, .gitea-widget-container, and related classes for header, stats, description, footer, loading, and error states.
Responsive Design: Media queries ensure widgets and tables look good on mobile devices.
Purpose: During the MkDocs build, this hook fetches metadata for a list of GitHub and Gitea repositories and writes JSON files to docs/assets/repo-data/.
How it works:
Runs before build (unless in serve mode).
Fetches repo data (stars, forks, issues, language, etc.) via GitHub/Gitea APIs.
Outputs a JSON file per repo (e.g., lyqht-mini-qr.json).
Used by frontend widgets for fast, client-side rendering.
This MkDocs site is highly customized for developer documentation, with visually rich repository widgets, improved code and table rendering, and a modern, responsive UI. All repository stats are fetched at build time for performance and reliability.
This is BNKops canvassing how to! In the following document, you will find all sorts of tips and tricks for door knocking, canvassing, and using the BNKops canvassing app.
This manual provides step-by-step instructions for using the NocoDB Map Viewer web application. Each section covers a major feature with direct instructions. (Insert screenshot - feature overview)
For help, check the troubleshooting section, review NocoDB docs, or contact your admin. (Insert screenshot - help section)
"},{"location":"phil/","title":"Philosophy: Your Secrets, Your Power, Your Movement","text":""},{"location":"phil/#the-question-that-changes-everything","title":"The Question That Changes Everything!","text":"
If you are a political actor, who do you trust with your secrets?
This isn't just a technical question\u2014it's the core political question of our time. Every email you send, every document you create, every contact list you build, every strategy you develop: where does it live? Who owns the servers? Who has the keys?
"},{"location":"phil/#the-corporate-extraction-machine","title":"The Corporate Extraction Machine","text":""},{"location":"phil/#how-they-hook-you","title":"How They Hook You","text":"
Corporate software companies have perfected the art of digital snake oil sales:
Free Trials - They lure you in with \"free\" accounts
Feature Creep - Essential features require paid tiers
Data Lock-In - Your data becomes harder to export
Price Escalation - $40/month becomes $750/month as you grow
Surveillance Integration - Your organizing becomes their intelligence
"},{"location":"phil/#the-real-product","title":"The Real Product","text":"
You Are Not the Customer
If you're not paying for the product, you ARE the product. But even when you are paying, you're often still the product.
Corporate platforms don't make money from your subscription fees\u2014they make money from:
Data Sales to third parties
Algorithmic Manipulation for corporate and political interests
Surveillance Contracts with governments and corporations
Predictive Analytics about your community and movement
"},{"location":"phil/#the-bnkops-alternative","title":"The BNKops Alternative","text":""},{"location":"phil/#who-we-are","title":"Who We Are","text":"
BNKops is a cooperative based in amiskwaciy-w\u00e2skahikan (Edmonton, Alberta) on Treaty 6 territory. We're not a corporation\u2014we're a collective of skilled organizers, developers, and community builders who believe technology should serve liberation, not oppression.
Technology that centers the most marginalized voices and fights for collective liberation. We believe strongly that the medium is the message; if you the use the medium of fascists, what does that say about your movement?
"},{"location":"phil/#community-over-profit","title":"\ud83e\udd1d Community Over Profit","text":"
We operate as a cooperative because we believe in shared ownership and democratic decision-making. No venture capitalists, no shareholders, no extraction.
"},{"location":"phil/#data-sovereignty","title":"\u26a1 Data Sovereignty","text":"
Your data belongs to you and your community. We build tools that let you own your digital infrastructure completely.
The tools we use shape the movements we build. Corporate tools create corporate movements\u2014hierarchical, surveilled, and dependent. Community-controlled tools create community-controlled movements\u2014democratic, secure, and sovereign.
"},{"location":"phil/#common-questions","title":"Common Questions","text":""},{"location":"phil/#isnt-this-just-for-tech-people","title":"\"Isn't this just for tech people?\"","text":"
No. We specifically designed Changemaker Lite for organizers, activists, and movement builders who may not have technical backgrounds. Our philosophy is that everyone deserves digital sovereignty, not just people with computer science degrees.
This is not to say that you won't need to learn! These tools are just that; tools. They have no fancy or white-labeled marketing and are technical in nature. You will need to learn to use them, just as any worker needs to learn the power tools they use on the job.
"},{"location":"phil/#what-about-convenience","title":"\"What about convenience?\"","text":"
Corporate platforms are convenient because they've extracted billions of dollars from users to fund that convenience. When you own your tools, there's a learning curve\u2014but it's the same learning curve as learning to organize, learning to build power, learning to create change.
"},{"location":"phil/#cant-we-just-use-corporate-tools-carefully","title":"\"Can't we just use corporate tools carefully?\"","text":"
Would you hold your most sensitive organizing meetings in a room owned by your opposition? Would you store your membership lists in filing cabinets at a corporation that profits from surveillance? Digital tools are the same.
"},{"location":"phil/#what-about-security","title":"\"What about security?\"","text":"
Real security comes from community control, not corporate promises. When you control your infrastructure:
You decide what gets logged and what doesn't
You choose who has access and who doesn't
You know exactly where your data is and who can see it
You can't be de-platformed or locked out of your own data
As Shoshana Zuboff documents in \"The Age of Surveillance Capitalism,\" we're living through a new form of capitalism that extracts value from human experience itself. Political movements are particularly valuable targets because:
Political data predicts behavior
Movement intelligence can be used to counter-organize
Community networks can be mapped and disrupted
Organizing strategies can be monitored and neutralized
"},{"location":"phil/#taking-action","title":"Taking Action","text":""},{"location":"phil/#start-where-you-are","title":"Start Where You Are","text":"
You don't have to replace everything at once. Start with one tool, one campaign, one project. Learn the technology alongside your organizing.
"},{"location":"phil/#build-community-capacity","title":"Build Community Capacity","text":"
The goal isn't individual self-sufficiency\u2014it's community technological sovereignty. Share skills, pool resources, learn together.
"},{"location":"phil/#connect-with-others","title":"Connect with Others","text":"
You're not alone in this. The free and open source software community, the digital security community, and the appropriate technology movement are all working on similar problems.
This isn't about technology for its own sake. It's about building the infrastructure for the world we want to see\u2014where communities have power, where people control their own data, where technology serves liberation.
"},{"location":"phil/#resources-for-deeper-learning","title":"Resources for Deeper Learning","text":""},{"location":"phil/#essential-reading","title":"Essential Reading","text":"
De-corp Your Software Stack - Our full manifesto
The Age of Surveillance Capitalism by Shoshana Zuboff
Self-Hosted Awesome List - Open source alternatives
Linux Journey - Learn Linux basics
Docker Curriculum - Learn containerization
This philosophy document is a living document. Contribute your thoughts, experiences, and improvements through the BNKops documentation platform.
"},{"location":"phil/cost-comparison/","title":"Cost Comparison: Corporation vs. Community","text":""},{"location":"phil/cost-comparison/#the-true-cost-of-corporate-dependency","title":"The True Cost of Corporate Dependency","text":"
When movements choose corporate software, they're not just paying subscription fees\u2014they're paying with their power, their privacy, and their future. Let's break down the real costs.
"},{"location":"phil/cost-comparison/#monthly-cost-analysis","title":"Monthly Cost Analysis","text":""},{"location":"phil/cost-comparison/#small-campaign-50-supporters-5000-emailsmonth","title":"Small Campaign (50 supporters, 5,000 emails/month)","text":"Service Category Corporate Solution Monthly Cost Changemaker Lite Monthly Cost Email Marketing Mailchimp $59/month Listmonk $0* Database & CRM Airtable Pro $240/month NocoDB $0* Website Hosting Squarespace $40/month Static Server $0* Documentation Notion Team $96/month MkDocs $0* Development GitHub Codespaces $87/month Code Server $0* Automation Zapier Professional $73/month n8n $0* File Storage Google Workspace $72/month PostgreSQL + Storage $0* Analytics Corporate tracking Privacy cost\u2020 Self-hosted $0* TOTAL $667/month $50/month
*Included in base Changemaker Lite hosting cost \u2020Privacy costs are incalculable but include surveillance, data sales, and community manipulation
"},{"location":"phil/cost-comparison/#medium-campaign-500-supporters-50000-emailsmonth","title":"Medium Campaign (500 supporters, 50,000 emails/month)","text":"Service Category Corporate Solution Monthly Cost Changemaker Lite Monthly Cost Email Marketing Mailchimp $299/month Listmonk $0* Database & CRM Airtable Pro $600/month NocoDB $0* Website Hosting Squarespace $65/month Static Server $0* Documentation Notion Team $240/month MkDocs $0* Development GitHub Codespaces $174/month Code Server $0* Automation Zapier Professional $146/month n8n $0* File Storage Google Workspace $144/month PostgreSQL + Storage $0* Analytics Corporate tracking Privacy cost\u2020 Self-hosted $0* TOTAL $1,668/month $75/month"},{"location":"phil/cost-comparison/#large-campaign-5000-supporters-500000-emailsmonth","title":"Large Campaign (5,000 supporters, 500,000 emails/month)","text":"Service Category Corporate Solution Monthly Cost Changemaker Lite Monthly Cost Email Marketing Mailchimp $1,499/month Listmonk $0* Database & CRM Airtable Pro $1,200/month NocoDB $0* Website Hosting Squarespace + CDN $120/month Static Server $0* Documentation Notion Team $480/month MkDocs $0* Development GitHub Codespaces $348/month Code Server $0* Automation Zapier Professional $292/month n8n $0* File Storage Google Workspace $288/month PostgreSQL + Storage $0* Analytics Corporate tracking Privacy cost\u2020 Self-hosted $0* TOTAL $4,227/month $150/month"},{"location":"phil/cost-comparison/#annual-savings-breakdown","title":"Annual Savings Breakdown","text":""},{"location":"phil/cost-comparison/#3-year-cost-comparison","title":"3-Year Cost Comparison","text":"Campaign Size Corporate Total Changemaker Total Savings Small $24,012 $1,800 $22,212 Medium $60,048 $2,700 $57,348 Large $152,172 $5,400 $146,772"},{"location":"phil/cost-comparison/#hidden-costs-of-corporate-software","title":"Hidden Costs of Corporate Software","text":""},{"location":"phil/cost-comparison/#what-you-cant-put-a-price-on","title":"What You Can't Put a Price On","text":""},{"location":"phil/cost-comparison/#privacy-violations","title":"Privacy Violations","text":"
Data Harvesting: Every interaction monitored and stored
Behavioral Profiling: Your community mapped and analyzed
Third-Party Sales: Your data sold to unknown entities
Government Access: Warrantless surveillance through corporate partnerships
Dependency Creation: Critical infrastructure controlled by adversaries
Community Fragmentation: Platforms designed to extract attention, not build power
Organizing Interference: Corporate algorithms prioritize engagement over solidarity
Cultural Assimilation: Movement culture shaped by corporate values
"},{"location":"phil/cost-comparison/#the-changemaker-advantage","title":"The Changemaker Advantage","text":""},{"location":"phil/cost-comparison/#what-you-get-for-50-150month","title":"What You Get for $50-150/month","text":""},{"location":"phil/cost-comparison/#complete-infrastructure","title":"Complete Infrastructure","text":"
Open Documentation: Complete guides and tutorials available
Community-Driven Development: Built by and for liberation movements
Technical Support: Professional assistance from BNKops cooperative
Political Alignment: Technology designed with movement values
"},{"location":"phil/cost-comparison/#the-compound-effect","title":"The Compound Effect","text":""},{"location":"phil/cost-comparison/#year-over-year-savings","title":"Year Over Year Savings","text":"
Corporate software costs grow exponentially: - Year 1: \"Starter\" pricing to hook you - Year 2: Feature limits force tier upgrades - Year 3: Usage growth triggers premium pricing - Year 4: Platform changes force expensive migrations - Year 5: Lock-in enables arbitrary price increases
Changemaker Lite costs grow linearly with actual infrastructure needs: - Year 1: Base infrastructure costs - Year 2: Modest increases for storage/bandwidth only - Year 3: Scale only with actual technical requirements - Year 4: Community-driven improvements at no extra cost - Year 5: Established infrastructure with declining per-user costs
Changemaker Alternative: $50-150/month Your Annual Savings: $____
"},{"location":"phil/cost-comparison/#beyond-the-numbers","title":"Beyond the Numbers","text":""},{"location":"phil/cost-comparison/#what-movements-do-with-their-savings","title":"What Movements Do With Their Savings","text":"
The money saved by choosing community-controlled technology doesn't disappear\u2014it goes directly back into movement building:
Hire organizers instead of paying corporate executives
Fund direct actions instead of funding surveillance infrastructure
Support community members instead of enriching shareholders
Build lasting power instead of temporary platform dependency
"},{"location":"phil/cost-comparison/#making-the-switch","title":"Making the Switch","text":""},{"location":"phil/cost-comparison/#transition-strategy","title":"Transition Strategy","text":"
You don't have to switch everything at once:
Start with documentation - Move your knowledge base to MkDocs
Add email infrastructure - Set up Listmonk for newsletters
Build your database - Move contact management to NocoDB
Automate connections - Use n8n to integrate everything
Phase out corporate tools - Cancel subscriptions as you replicate functionality
Changemaker Lite includes several powerful services that work together to provide a complete documentation and development platform. Each service is containerized and can be accessed through its dedicated port.
Code Server provides a full Visual Studio Code experience in your web browser, allowing you to develop from any device. It runs on your server and provides access to your development environment through a web interface.
Gitea is a lightweight, self-hosted Git service similar to GitHub, GitLab, and Bitbucket. It provides a web interface for managing repositories, issues, pull requests, and more.
Homepage is a modern, fully static, fast, secure fully configurable application dashboard with integrations for over 100 services. It provides a beautiful and customizable interface to access all your Changemaker Lite services from a single location.
Widget data not updating: Check Docker socket permissions and container access
docker exec homepage-changemaker ls -la /var/run/docker.sock\n
"},{"location":"services/homepage/#configuration-examples","title":"Configuration Examples","text":""},{"location":"services/homepage/#basic-service-widget","title":"Basic Service Widget","text":"
- Code Server:\n href: http://localhost:8888\n description: VS Code in the browser\n icon: code-server\n widget:\n type: docker\n container: code-server-changemaker\n
Listmonk is a modern, feature-rich newsletter and mailing list manager designed for high performance and easy management. It provides a complete solution for email campaigns, subscriber management, and analytics.
The Map service provides an interactive web-based map for displaying, searching, and analyzing geospatial data from a NocoDB backend. It supports real-time geolocation, adding new locations, and is optimized for both desktop and mobile use.
All configuration is done via environment variables:
Variable Description Default NOCODB_API_URL NocoDB API base URL Required NOCODB_API_TOKEN API authentication token Required NOCODB_VIEW_URL Full NocoDB view URL Required PORT Server port 3000 DEFAULT_LAT Default map latitude 53.5461 DEFAULT_LNG Default map longitude -113.4938 DEFAULT_ZOOM Default map zoom level 11"},{"location":"services/map/#volumes","title":"Volumes","text":"
Mini QR is a lightweight service for generating QR codes for URLs, text, or other data. It provides a web interface for quick QR code creation and download.
MkDocs Material is a powerful documentation framework built on top of MkDocs, providing a beautiful Material Design theme and advanced features for creating professional documentation sites.
# Page Title\n\nThis is a sample documentation page.\n\n## Section\n\nContent goes here with **bold** and *italic* text.\n\n### Code Example\n\n```python\ndef hello_world():\n print(\"Hello, World!\")\n
Note
This is an informational note.
## Building and Deployment\n\n### Development\n\nThe development server runs automatically with live reload.\n\n### Building Static Site\n\n```bash\ndocker exec mkdocs-changemaker mkdocs build\n
The built site will be available in the mkdocs/site/ directory.
"},{"location":"services/mkdocs/#customization","title":"Customization","text":""},{"location":"services/mkdocs/#themes-and-colors","title":"Themes and Colors","text":"
n8n is a powerful workflow automation tool that allows you to connect various apps and services together. It provides a visual interface for creating automated workflows, making it easy to integrate different systems and automate repetitive tasks.
"},{"location":"services/n8n/#common-use-cases","title":"Common Use Cases","text":""},{"location":"services/n8n/#documentation-automation","title":"Documentation Automation","text":"
"},{"location":"services/n8n/#example-workflows","title":"Example Workflows","text":""},{"location":"services/n8n/#simple-webhook-to-email","title":"Simple Webhook to Email","text":"
NocoDB is an open-source no-code platform that transforms any database into a smart spreadsheet interface. It provides a user-friendly way to manage data, create forms, build APIs, and collaborate on database operations without requiring extensive technical knowledge.
Create Project: Start with a new project or connect existing databases
Add Tables: Import data or create new tables
Configure Views: Set up different views (Grid, Form, Gallery, etc.)
Set Permissions: Configure user access and sharing settings
"},{"location":"services/nocodb/#common-use-cases","title":"Common Use Cases","text":""},{"location":"services/nocodb/#content-management","title":"Content Management","text":"
NocoDB automatically generates REST APIs for all your tables:
# Get all records from a table\nGET http://localhost:8090/api/v1/db/data/v1/{project}/table/{table}\n\n# Create a new record\nPOST http://localhost:8090/api/v1/db/data/v1/{project}/table/{table}\n\n# Update a record\nPATCH http://localhost:8090/api/v1/db/data/v1/{project}/table/{table}/{id}\n
"},{"location":"services/nocodb/#backup-and-data-management","title":"Backup and Data Management","text":""},{"location":"services/nocodb/#database-backup","title":"Database Backup","text":"
Since NocoDB uses PostgreSQL, you can backup the database:
PostgreSQL is a powerful, open-source relational database system. In Changemaker Lite, it serves as the backend database for Listmonk and can be used by other applications requiring persistent data storage.
Database data is stored in a Docker volume (listmonk-data) to ensure persistence across container restarts.
"},{"location":"services/postgresql/#connecting-to-the-database","title":"Connecting to the Database","text":""},{"location":"services/postgresql/#from-host-machine","title":"From Host Machine","text":"
You can connect to PostgreSQL from your host machine using:
"},{"location":"services/postgresql/#from-other-containers","title":"From Other Containers","text":"
Other containers can connect using the internal hostname listmonk-db on port 5432.
"},{"location":"services/postgresql/#backup-and-restore","title":"Backup and Restore","text":""},{"location":"services/postgresql/#backup","title":"Backup","text":"
The Static Site Server uses Nginx to serve your built documentation and static websites. It's configured to serve the built MkDocs site and other static content with high performance and reliability.