1 line
139 KiB
JSON
1 line
139 KiB
JSON
{"config":{"lang":["en"],"separator":"[\\s\\u200b\\-_,:!=\\[\\]()\"`/]+|\\.(?!\\d)|&[lg]t;|(?!\\b)(?=[A-Z][a-z])","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to Changemaker Lite","text":"<p>Stop feeding your secrets to corporations. Own your political infrastructure.</p>"},{"location":"#quick-start","title":"Quick Start","text":"<p>Get up and running in minutes:</p> <pre><code># 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</code></pre>"},{"location":"#services","title":"Services","text":"<p>Changemaker Lite includes these essential services:</p>"},{"location":"#core-services","title":"Core Services","text":"<ul> <li>Homepage (Port 3010) - Central dashboard and service monitoring</li> <li>Code Server (Port 8888) - VS Code in your browser</li> <li>MkDocs (Port 4000) - Documentation with live preview </li> <li>Static Server (Port 4001) - Production documentation site</li> </ul>"},{"location":"#communication-automation","title":"Communication & Automation","text":"<ul> <li>Listmonk (Port 9000) - Newsletter and email campaign management</li> <li>n8n (Port 5678) - Workflow automation platform</li> </ul>"},{"location":"#data-development","title":"Data & Development","text":"<ul> <li>NocoDB (Port 8090) - No-code database platform</li> <li>PostgreSQL (Port 5432) - Database backend for Listmonk</li> <li>Gitea (Port 3030) - Self-hosted Git service</li> </ul>"},{"location":"#interactive-tools","title":"Interactive Tools","text":"<ul> <li>Map Viewer (Port 3000) - Interactive map with NocoDB integration</li> <li>Mini QR (Port 8089) - QR code generator</li> </ul>"},{"location":"#getting-started","title":"Getting Started","text":"<ol> <li>Setup: Run <code>./config.sh</code> to configure your environment</li> <li>Launch: Start services with <code>docker compose up -d</code></li> <li>Dashboard: Access the Homepage at http://localhost:3010</li> <li>Production: Deploy with Cloudflare tunnels using <code>./start-production.sh</code></li> </ol>"},{"location":"#project-structure","title":"Project Structure","text":"<pre><code>changemaker.lite/\n\u251c\u2500\u2500 docker-compose.yml # Service definitions\n\u251c\u2500\u2500 config.sh # Configuration wizard\n\u251c\u2500\u2500 start-production.sh # Production deployment script\n\u251c\u2500\u2500 mkdocs/ # Documentation source\n\u2502 \u251c\u2500\u2500 docs/ # Markdown files\n\u2502 \u2514\u2500\u2500 mkdocs.yml # MkDocs configuration\n\u251c\u2500\u2500 configs/ # Service configurations\n\u2502 \u251c\u2500\u2500 homepage/ # Homepage dashboard config\n\u2502 \u251c\u2500\u2500 code-server/ # VS Code settings\n\u2502 \u2514\u2500\u2500 cloudflare/ # Tunnel configurations\n\u251c\u2500\u2500 map/ # Map application\n\u2502 \u251c\u2500\u2500 app/ # Node.js application\n\u2502 \u251c\u2500\u2500 Dockerfile # Container definition\n\u2502 \u2514\u2500\u2500 .env # Map configuration\n\u2514\u2500\u2500 assets/ # Shared assets\n \u251c\u2500\u2500 images/ # Image files\n \u251c\u2500\u2500 icons/ # Service icons\n \u2514\u2500\u2500 uploads/ # Listmonk uploads\n</code></pre>"},{"location":"#key-features","title":"Key Features","text":"<ul> <li>\ud83d\udc33 Fully Containerized - All services run in Docker containers</li> <li>\ud83d\udd12 Production Ready - Built-in Cloudflare tunnel support for secure access</li> <li>\ud83d\udce6 All-in-One - Everything you need for documentation, development, and campaigns</li> <li>\ud83d\uddfa\ufe0f Geographic Data - Interactive maps with real-time location tracking</li> <li>\ud83d\udce7 Email Campaigns - Professional newsletter management</li> <li>\ud83d\udd04 Automation - Connect services and automate workflows</li> <li>\ud83d\udcbe Version Control - Self-hosted Git repository</li> <li>\ud83c\udfaf No-Code Database - Build applications without programming</li> </ul>"},{"location":"#system-requirements","title":"System Requirements","text":"<ul> <li>OS: Ubuntu 24.04 LTS (Noble Numbat) or compatible Linux distribution</li> <li>Docker: Version 24.0+ with Docker Compose v2</li> <li>Memory: Minimum 4GB RAM (8GB recommended)</li> <li>Storage: 20GB+ available disk space</li> <li>Network: Internet connection for initial setup</li> </ul>"},{"location":"#learn-more","title":"Learn More","text":"<ul> <li>Getting Started - Detailed installation guide</li> <li>Services Overview - Deep dive into each service</li> <li>Blog - Updates and tutorials</li> <li>GitHub Repository - Source code</li> </ul>"},{"location":"cost-comparison/","title":"Cost Comparison: Corporation vs. Community","text":""},{"location":"cost-comparison/#the-true-cost-of-corporate-dependency","title":"The True Cost of Corporate Dependency","text":"<p>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.</p>"},{"location":"cost-comparison/#monthly-cost-analysis","title":"Monthly Cost Analysis","text":""},{"location":"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 <p>*Included in base Changemaker Lite hosting cost \u2020Privacy costs are incalculable but include surveillance, data sales, and community manipulation</p>"},{"location":"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":"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":"cost-comparison/#annual-savings-breakdown","title":"Annual Savings Breakdown","text":""},{"location":"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":"cost-comparison/#hidden-costs-of-corporate-software","title":"Hidden Costs of Corporate Software","text":""},{"location":"cost-comparison/#what-you-cant-put-a-price-on","title":"What You Can't Put a Price On","text":""},{"location":"cost-comparison/#privacy-violations","title":"Privacy Violations","text":"<ul> <li>Data Harvesting: Every interaction monitored and stored</li> <li>Behavioral Profiling: Your community mapped and analyzed </li> <li>Third-Party Sales: Your data sold to unknown entities</li> <li>Government Access: Warrantless surveillance through corporate partnerships</li> </ul>"},{"location":"cost-comparison/#political-manipulation","title":"Political Manipulation","text":"<ul> <li>Algorithmic Suppression: Your content reach artificially limited</li> <li>Narrative Control: Corporate interests shape what your community sees</li> <li>Shadow Banning: Activists systematically de-platformed</li> <li>Counter-Intelligence: Your strategies monitored by opposition</li> </ul>"},{"location":"cost-comparison/#movement-disruption","title":"Movement Disruption","text":"<ul> <li>Dependency Creation: Critical infrastructure controlled by adversaries</li> <li>Community Fragmentation: Platforms designed to extract attention, not build power</li> <li>Organizing Interference: Corporate algorithms prioritize engagement over solidarity</li> <li>Cultural Assimilation: Movement culture shaped by corporate values</li> </ul>"},{"location":"cost-comparison/#the-changemaker-advantage","title":"The Changemaker Advantage","text":""},{"location":"cost-comparison/#what-you-get-for-50-150month","title":"What You Get for $50-150/month","text":""},{"location":"cost-comparison/#complete-infrastructure","title":"Complete Infrastructure","text":"<ul> <li>Email System: Unlimited contacts, unlimited sends</li> <li>Database Power: Unlimited records, unlimited complexity</li> <li>Web Presence: Unlimited sites, unlimited traffic</li> <li>Development Environment: Full coding environment with AI assistance</li> <li>Documentation Platform: Beautiful, searchable knowledge base</li> <li>Automation Engine: Connect everything, automate everything</li> <li>File Storage: Unlimited files, unlimited backups</li> </ul>"},{"location":"cost-comparison/#true-ownership","title":"True Ownership","text":"<ul> <li>Your Domain: No corporate branding or limitations</li> <li>Your Data: Complete export capability, no lock-in</li> <li>Your Rules: No terms of service to violate</li> <li>Your Community: No algorithmic manipulation</li> </ul>"},{"location":"cost-comparison/#community-support","title":"Community Support","text":"<ul> <li>Open Documentation: Complete guides and tutorials available</li> <li>Community-Driven Development: Built by and for liberation movements</li> <li>Technical Support: Professional assistance from BNKops cooperative</li> <li>Political Alignment: Technology designed with movement values</li> </ul>"},{"location":"cost-comparison/#the-compound-effect","title":"The Compound Effect","text":""},{"location":"cost-comparison/#year-over-year-savings","title":"Year Over Year Savings","text":"<p>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</p> <p>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</p>"},{"location":"cost-comparison/#10-year-projection","title":"10-Year Projection","text":"Year Corporate (Medium Campaign) Changemaker Lite Annual Savings 1 $20,016 $900 $19,116 2 $22,017 $900 $21,117 3 $24,219 $1,080 $23,139 4 $26,641 $1,080 $25,561 5 $29,305 $1,260 $28,045 6 $32,235 $1,260 $30,975 7 $35,459 $1,440 $34,019 8 $39,005 $1,440 $37,565 9 $42,905 $1,620 $41,285 10 $47,196 $1,620 $45,576 TOTAL $318,998 $12,600 $306,398"},{"location":"cost-comparison/#calculate-your-own-savings","title":"Calculate Your Own Savings","text":""},{"location":"cost-comparison/#current-corporate-costs-worksheet","title":"Current Corporate Costs Worksheet","text":"<p>Email Marketing: $____/month Database/CRM: $____/month Website Hosting: $____/month Documentation: $____/month Development Tools: $____/month Automation: $____/month File Storage: $____/month Other SaaS: $____/month </p> <p>Monthly Total: $____ Annual Total: $____ </p> <p>Changemaker Alternative: $50-150/month Your Annual Savings: $____</p>"},{"location":"cost-comparison/#beyond-the-numbers","title":"Beyond the Numbers","text":""},{"location":"cost-comparison/#what-movements-do-with-their-savings","title":"What Movements Do With Their Savings","text":"<p>The money saved by choosing community-controlled technology doesn't disappear\u2014it goes directly back into movement building:</p> <ul> <li>Hire organizers instead of paying corporate executives</li> <li>Fund direct actions instead of funding surveillance infrastructure </li> <li>Support community members instead of enriching shareholders</li> <li>Build lasting power instead of temporary platform dependency</li> </ul>"},{"location":"cost-comparison/#making-the-switch","title":"Making the Switch","text":""},{"location":"cost-comparison/#transition-strategy","title":"Transition Strategy","text":"<p>You don't have to switch everything at once:</p> <ol> <li>Start with documentation - Move your knowledge base to MkDocs</li> <li>Add email infrastructure - Set up Listmonk for newsletters</li> <li>Build your database - Move contact management to NocoDB</li> <li>Automate connections - Use n8n to integrate everything</li> <li>Phase out corporate tools - Cancel subscriptions as you replicate functionality</li> </ol>"},{"location":"cost-comparison/#investment-timeline","title":"Investment Timeline","text":"<ul> <li>Month 1: Initial setup and learning ($150 including setup time)</li> <li>Month 2-3: Data migration and team training ($100/month)</li> <li>Month 4+: Full operation at optimal cost ($50-150/month based on scale)</li> </ul>"},{"location":"cost-comparison/#roi-calculation","title":"ROI Calculation","text":"<p>Most campaigns recover their entire first-year investment in 60-90 days through subscription savings alone.</p> <p>Ready to stop feeding your budget to corporate surveillance? Get started with Changemaker Lite today and take control of your digital infrastructure.</p>"},{"location":"build/","title":"Getting Started with Digital Liberation","text":"<p>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.</p>"},{"location":"build/#quick-start","title":"Quick Start","text":""},{"location":"build/#build-changemkaer-lite","title":"Build Changemkaer-Lite","text":"<pre><code># Clone the repository\ngit clone https://gitea.bnkops.com/admin/changemaker.lite\ncd changemaker.lite\n</code></pre> <p>Cloudflare Credentials</p> <p>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</p> <pre><code># Configure environment (creates .env file)\n./config.sh\n</code></pre> <pre><code># Start all services\ndocker compose up -d\n</code></pre>"},{"location":"build/#deploy","title":"Deploy","text":"<p>Cloudflare</p> <p>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. </p> <p>For secure public access, use the production deployment script:</p> <pre><code>./start-production.sh\n</code></pre>"},{"location":"build/#why-changemaker-lite","title":"Why Changemaker Lite?","text":"<p>Before we dive into the technical setup, let's be clear about what you're doing here:</p> <p>The Reality</p> <p>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.</p>"},{"location":"build/#what-youre-getting","title":"What You're Getting","text":"<ul> <li>Data Sovereignty: Your data stays on your servers</li> <li>Cost Savings: $50/month instead of $2,000+/month for corporate solutions </li> <li>Community Control: Technology that serves movements, not shareholders</li> <li>Trans Liberation: Tools built with radical politics and care</li> </ul>"},{"location":"build/#what-youre-leaving-behind","title":"What You're Leaving Behind","text":"<ul> <li>\u274c Corporate surveillance and data extraction</li> <li>\u274c Escalating subscription fees and vendor lock-in</li> <li>\u274c Algorithmic manipulation of your community</li> <li>\u274c Terms of service that can silence you anytime</li> </ul>"},{"location":"build/#system-requirements","title":"System Requirements","text":""},{"location":"build/#operating-system","title":"Operating System","text":"<ul> <li>Ubuntu 24.04 LTS (Noble Numbat) - Recommended and tested</li> </ul> <p>Getting Started on Ubunut</p> <p>Want some help getting started with a baseline buildout for a Ubunut server? You can use our BNKops Server Build Script</p> <ul> <li>Other Linux distributions with systemd support</li> <li>WSL2 on Windows (limited functionality)</li> <li>Mac OS</li> </ul> <p>New to Linux?</p> <p>Consider Linux Mint - it looks like Windows but opens the door to true digital freedom.</p>"},{"location":"build/#hardware-requirements","title":"Hardware Requirements","text":"<ul> <li>CPU: 2+ cores (4+ recommended)</li> <li>RAM: 4GB minimum (8GB recommended) </li> <li>Storage: 20GB+ available disk space</li> <li>Network: Stable internet connection</li> </ul> <p>Cloud Hosting</p> <p>You can run this on a VPS from providers like Hetzner, DigitalOcean, or Linode for ~$20/month.</p>"},{"location":"build/#software-prerequisites","title":"Software Prerequisites","text":"<p>Getting Started on Docker</p> <p>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! </p> <ol> <li>Docker Engine (24.0+)</li> </ol> <pre><code># 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</code></pre> <ol> <li>Docker Compose (v2.20+)</li> </ol> <pre><code># Verify Docker Compose v2 is installed\ndocker compose version\n</code></pre> <ol> <li>Essential Tools</li> </ol> <pre><code># Install required packages\nsudo apt update\nsudo apt install -y git curl jq openssl\n</code></pre>"},{"location":"build/#installation","title":"Installation","text":""},{"location":"build/#1-clone-repository","title":"1. Clone Repository","text":"<pre><code>git clone https://gitea.bnkops.com/admin/changemaker.lite\ncd changemaker.lite\n</code></pre>"},{"location":"build/#2-run-configuration-wizard","title":"2. Run Configuration Wizard","text":"<p>The <code>config.sh</code> script will guide you through the initial setup:</p> <pre><code>./config.sh\n</code></pre> <p>This wizard will:</p> <ul> <li>\u2705 Create a <code>.env</code> file with secure defaults</li> <li>\u2705 Scan for available ports to avoid conflicts</li> <li>\u2705 Set up your domain configuration</li> <li>\u2705 Generate secure passwords for databases</li> <li>\u2705 Configure Cloudflare credentials (optional)</li> <li>\u2705 Update all configuration files with your settings</li> </ul>"},{"location":"build/#configuration-options","title":"Configuration Options","text":"<p>During setup, you'll be prompted for:</p> <ol> <li>Domain Name: Your primary domain (e.g., <code>example.com</code>)</li> <li>Cloudflare Settings (optional):</li> <li>API Token</li> <li>Zone ID</li> <li>Account ID</li> <li>Admin Credentials:</li> <li>Listmonk admin email and password</li> <li>n8n admin email and password</li> </ol>"},{"location":"build/#3-start-services","title":"3. Start Services","text":"<p>Launch all services with Docker Compose:</p> <pre><code>docker compose up -d\n</code></pre> <p>Wait for services to initialize (first run may take 5-10 minutes):</p> <pre><code># Watch container status\ndocker compose ps\n\n# View logs\ndocker compose logs -f\n</code></pre>"},{"location":"build/#4-verify-installation","title":"4. Verify Installation","text":"<p>Check that all services are running:</p> <pre><code>docker compose ps\n</code></pre> <p>Expected output should show all services as \"Up\":</p> <ul> <li>code-server-changemaker</li> <li>listmonk_app</li> <li>listmonk_db</li> <li>mkdocs-changemaker</li> <li>mkdocs-site-server-changemaker</li> <li>n8n-changemaker</li> <li>nocodb</li> <li>root_db</li> <li>homepage-changemaker</li> <li>gitea_changemaker</li> <li>gitea_mysql_changemaker</li> <li>mini-qr</li> </ul>"},{"location":"build/#local-access","title":"Local Access","text":"<p>Once services are running, access them locally:</p>"},{"location":"build/#homepage-dashboard","title":"\ud83c\udfe0 Homepage Dashboard","text":"<ul> <li>URL: http://localhost:3010</li> <li>Purpose: Central hub for all services</li> <li>Features: Service status, quick links, monitoring</li> </ul>"},{"location":"build/#development-tools","title":"\ud83d\udcbb Development Tools","text":"<ul> <li>Code Server: http://localhost:8888 - VS Code in browser</li> <li>Gitea: http://localhost:3030 - Git repository management</li> <li>MkDocs Dev: http://localhost:4000 - Live documentation preview</li> <li>MkDocs Prod: http://localhost:4001 - Built documentation</li> </ul>"},{"location":"build/#communication","title":"\ud83d\udce7 Communication","text":"<ul> <li>Listmonk: http://localhost:9000 - Email campaigns</li> <li>Login with credentials set during configuration</li> </ul>"},{"location":"build/#automation-data","title":"\ud83d\udd04 Automation & Data","text":"<ul> <li>n8n: http://localhost:5678 - Workflow automation</li> <li>Login with credentials set during configuration</li> <li>NocoDB: http://localhost:8090 - No-code database</li> </ul>"},{"location":"build/#interactive-tools","title":"\ud83d\udee0\ufe0f Interactive Tools","text":"<ul> <li>Map Viewer: http://localhost:3000 - Geographic data visualization</li> <li>Mini QR: http://localhost:8089 - QR code generator</li> </ul>"},{"location":"build/#production-deployment","title":"Production Deployment","text":""},{"location":"build/#deploy-with-cloudflare-tunnels","title":"Deploy with Cloudflare Tunnels","text":"<p>For secure public access, use the production deployment script:</p> <pre><code>./start-production.sh\n</code></pre> <p>This script will:</p> <ol> <li>Install and configure <code>cloudflared</code></li> <li>Create a Cloudflare tunnel</li> <li>Set up DNS records automatically</li> <li>Configure access policies</li> <li>Create a systemd service for persistence</li> </ol>"},{"location":"build/#what-happens-during-production-setup","title":"What Happens During Production Setup","text":"<ol> <li>Cloudflare Authentication: Browser-based login to Cloudflare</li> <li>Tunnel Creation: Secure tunnel named <code>changemaker-lite</code></li> <li>DNS Configuration: Automatic CNAME records for all services</li> <li>Access Policies: Email-based authentication for sensitive services</li> <li>Service Installation: Systemd service for automatic startup</li> </ol>"},{"location":"build/#production-urls","title":"Production URLs","text":"<p>After successful deployment, services will be available at:</p> <p>Public Services:</p> <ul> <li><code>https://yourdomain.com</code> - Main documentation site</li> <li><code>https://listmonk.yourdomain.com</code> - Email campaigns</li> <li><code>https://docs.yourdomain.com</code> - Documentation preview</li> <li><code>https://n8n.yourdomain.com</code> - Automation platform</li> <li><code>https://db.yourdomain.com</code> - NocoDB</li> <li><code>https://git.yourdomain.com</code> - Gitea</li> <li><code>https://map.yourdomain.com</code> - Map viewer</li> <li><code>https://qr.yourdomain.com</code> - QR generator</li> </ul> <p>Protected Services (require authentication):</p> <ul> <li><code>https://homepage.yourdomain.com</code> - Dashboard</li> <li><code>https://code.yourdomain.com</code> - Code Server</li> </ul>"},{"location":"build/#configuration-management","title":"Configuration Management","text":""},{"location":"build/#environment-variables","title":"Environment Variables","text":"<p>Key settings in <code>.env</code> file:</p> <pre><code># Domain Configuration\nDOMAIN=yourdomain.com\nBASE_DOMAIN=https://yourdomain.com\n\n# Service Ports (automatically assigned to avoid conflicts)\nHOMEPAGE_PORT=3010\nCODE_SERVER_PORT=8888\nLISTMONK_PORT=9000\nMKDOCS_PORT=4000\nMKDOCS_SITE_SERVER_PORT=4001\nN8N_PORT=5678\nNOCODB_PORT=8090\nGITEA_WEB_PORT=3030\nGITEA_SSH_PORT=2222\nMAP_PORT=3000\nMINI_QR_PORT=8089\n\n# Cloudflare (for production)\nCF_API_TOKEN=your_token\nCF_ZONE_ID=your_zone_id\nCF_ACCOUNT_ID=your_account_id\n</code></pre>"},{"location":"build/#reconfigure-services","title":"Reconfigure Services","text":"<p>To update configuration:</p> <pre><code># Re-run configuration wizard\n./config.sh\n\n# Restart services\ndocker compose down && docker compose up -d\n</code></pre>"},{"location":"build/#common-tasks","title":"Common Tasks","text":""},{"location":"build/#service-management","title":"Service Management","text":"<pre><code># 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</code></pre>"},{"location":"build/#backup-data","title":"Backup Data","text":"<pre><code># Backup all volumes\ndocker run --rm -v changemaker_listmonk-data:/data -v $(pwd):/backup alpine tar czf /backup/listmonk-backup.tar.gz -C /data .\n\n# Backup configuration\ntar czf configs-backup.tar.gz configs/\n\n# Backup documentation\ntar czf docs-backup.tar.gz mkdocs/docs/\n</code></pre>"},{"location":"build/#update-services","title":"Update Services","text":"<pre><code># Pull latest images\ndocker compose pull\n\n# Recreate containers with new images\ndocker compose up -d\n</code></pre>"},{"location":"build/#troubleshooting","title":"Troubleshooting","text":""},{"location":"build/#port-conflicts","title":"Port Conflicts","text":"<p>If services fail to start due to port conflicts:</p> <ol> <li>Check which ports are in use:</li> </ol> <pre><code>sudo ss -tulpn | grep LISTEN\n</code></pre> <ol> <li>Re-run configuration to get new ports:</li> </ol> <pre><code>./config.sh\n</code></pre> <ol> <li>Or manually edit <code>.env</code> file and change conflicting ports</li> </ol>"},{"location":"build/#permission-issues","title":"Permission Issues","text":"<p>Fix permission problems:</p> <pre><code># 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</code></pre>"},{"location":"build/#service-wont-start","title":"Service Won't Start","text":"<p>Debug service issues:</p> <pre><code># Check detailed logs\ndocker compose logs [service-name] --tail 50\n\n# Check container status\ndocker ps -a\n\n# Inspect container\ndocker inspect [container-name]\n</code></pre>"},{"location":"build/#cloudflare-tunnel-issues","title":"Cloudflare Tunnel Issues","text":"<pre><code># Check tunnel service status\nsudo systemctl status cloudflared-changemaker\n\n# View tunnel logs\nsudo journalctl -u cloudflared-changemaker -f\n\n# Restart tunnel\nsudo systemctl restart cloudflared-changemaker\n</code></pre>"},{"location":"build/#next-steps","title":"Next Steps","text":"<p>Now that your Changemaker Lite instance is running:</p> <ol> <li>Set up Listmonk - Configure SMTP and create your first campaign</li> <li>Create workflows - Build automations in n8n</li> <li>Import data - Set up your NocoDB databases</li> <li>Configure map - Add location data for the map viewer</li> <li>Write documentation - Start creating content in MkDocs</li> <li>Set up Git - Initialize repositories in Gitea</li> </ol>"},{"location":"build/#getting-help","title":"Getting Help","text":"<ul> <li>Check the Services documentation for detailed guides</li> <li>Review container logs for specific error messages</li> <li>Ensure all prerequisites are properly installed</li> <li>Verify your domain DNS settings for production deployment</li> </ul>"},{"location":"build/build-server/","title":"BNKops Server Build","text":"<p>Purpose: a Ubuntu server build-out for general application </p> <p>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. </p> <p>All of the following systems are free and the majority are open source. </p>"},{"location":"build/build-server/#ubuntu-os","title":"Ubuntu OS","text":"<p>Ubuntu is a Linux distribution derived from Debian and composed mostly of free and open-source software.</p>"},{"location":"build/build-server/#install-ubuntu","title":"Install Ubuntu","text":""},{"location":"build/build-server/#post-install","title":"Post Install","text":"<p>Post installation, run update: <pre><code>sudo apt update\n</code></pre></p> <pre><code>sudo apt upgrade\n</code></pre>"},{"location":"build/build-server/#configuration","title":"Configuration","text":"<p>Further configurations: </p> <ul> <li>User profile was updated to Automatically Login </li> <li>Remote Desktop, Sharing, and Login have all been enabled. </li> <li>Default system settings have been set to dark mode. </li> </ul>"},{"location":"build/build-server/#vscode-insiders","title":"VSCode Insiders","text":"<p>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.</p>"},{"location":"build/build-server/#install-using-app-centre","title":"Install Using App Centre","text":""},{"location":"build/build-server/#obsidian","title":"Obsidian","text":"<p>The free and flexible app for your private\u00a0thoughts.</p>"},{"location":"build/build-server/#install-using-app-center","title":"Install Using App Center","text":""},{"location":"build/build-server/#curl","title":"Curl","text":"<p>command line tool and library for transferring data with URLs (since 1998)</p>"},{"location":"build/build-server/#install","title":"Install","text":"<pre><code>sudo apt install curl \n</code></pre>"},{"location":"build/build-server/#glances","title":"Glances","text":"<p>Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.</p>"},{"location":"build/build-server/#install_1","title":"Install","text":"<pre><code>sudo snap install glances \n</code></pre>"},{"location":"build/build-server/#syncthing","title":"Syncthing","text":"<p>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.</p>"},{"location":"build/build-server/#install_2","title":"Install","text":"<pre><code># Add the release PGP keys:\nsudo mkdir -p /etc/apt/keyrings\nsudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg\n</code></pre> <pre><code># 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</code></pre> <pre><code># Update and install syncthing:\nsudo apt-get update\nsudo apt-get install syncthing\n</code></pre>"},{"location":"build/build-server/#post-install_1","title":"Post Install","text":"<p>Run syncthing as a system service. <pre><code>sudo systemctl start syncthing@yourusername\n</code></pre></p> <pre><code>sudo systemctl enable syncthing@yourusername\n</code></pre>"},{"location":"build/build-server/#docker","title":"Docker","text":"<p>Docker helps developers build, share, run, and verify applications anywhere \u2014 without tedious environment configuration or management. <pre><code># Add Docker's official GPG key:\nsudo apt-get update\nsudo apt-get install ca-certificates curl\nsudo install -m 0755 -d /etc/apt/keyrings\nsudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc\nsudo chmod a+r /etc/apt/keyrings/docker.asc\n\n# Add the repository to Apt sources:\necho \\\n \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\\n $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable\" | \\\n sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\nsudo apt-get update\n</code></pre></p> <pre><code>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n</code></pre>"},{"location":"build/build-server/#update-users","title":"Update Users","text":"<pre><code>sudo groupadd docker\n</code></pre> <pre><code>sudo usermod -aG docker $USER\n</code></pre> <pre><code>newgrp docker\n</code></pre>"},{"location":"build/build-server/#enable-on-boot","title":"Enable on Boot","text":"<pre><code>sudo systemctl enable docker.service\nsudo systemctl enable containerd.service\n</code></pre>"},{"location":"build/build-server/#cloudflared","title":"Cloudflared","text":"<p>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.</p> <pre><code>sudo mkdir -p --mode=0755 /usr/share/keyrings\ncurl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null\n</code></pre> <pre><code>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</code></pre> <pre><code>sudo apt-get update && sudo apt-get install cloudflared\n</code></pre>"},{"location":"build/build-server/#post-install_2","title":"Post Install","text":"<p>Login to Cloudflare <pre><code>cloudflared login\n</code></pre></p>"},{"location":"build/build-server/#configuration_1","title":"Configuration","text":"<ul> <li>Setting up the [[service.cloudflared]] enables your cloudflared tunnel to automatically run on reboot </li> </ul>"},{"location":"build/build-server/#pandoc","title":"Pandoc","text":"<p>If you need to convert files from one markup format into another, pandoc is your swiss-army knife. </p> <pre><code>sudo apt install pandoc\n</code></pre>"},{"location":"build/build-server/#changemaker-v3991","title":"Changemaker (V3.9.9.1)","text":""},{"location":"config/","title":"Configuration","text":"<p>There are several configuration steps to building a production ready Changemaker-Lite. </p> <p>In the order we suggest doing them: </p>"},{"location":"config/cloudflare-config/","title":"Configure Cloudflare","text":"<p>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)</p>"},{"location":"config/cloudflare-config/#credentials","title":"Credentials","text":"<p>The <code>config.sh</code> and <code>start-production.sh</code> scripts require the following Cloudflare credentials to function properly:</p>"},{"location":"config/cloudflare-config/#1-cloudflare-api-token","title":"1. Cloudflare API Token","text":"<ul> <li>Purpose: Used to authenticate API requests to Cloudflare for managing DNS records, tunnels, and access policies.</li> <li>Required Permissions:<ul> <li><code>Zone.DNS</code> (Read/Write)</li> <li><code>Account.Cloudflare Tunnel</code> (Read/Write)</li> </ul> </li> <li>How to Obtain:<ul> <li>Log in to your Cloudflare account.</li> <li>Go to My Profile > API Tokens > Create Token.</li> <li>Use the Edit zone DNS template and add Cloudflare Tunnel permissions.</li> </ul> </li> </ul>"},{"location":"config/cloudflare-config/#2-cloudflare-zone-id","title":"2. Cloudflare Zone ID","text":"<ul> <li>Purpose: Identifies the specific DNS zone (domain) in Cloudflare where DNS records will be created.</li> <li>How to Obtain:<ul> <li>Log in to your Cloudflare account.</li> <li>Select the domain you want to use.</li> <li>The Zone ID is displayed in the Overview section under API.</li> </ul> </li> </ul>"},{"location":"config/cloudflare-config/#3-cloudflare-account-id","title":"3. Cloudflare Account ID","text":"<ul> <li>Purpose: Identifies your Cloudflare account for tunnel creation and management.</li> <li>How to Obtain:<ul> <li>Log in to your Cloudflare account.</li> <li>Go to My Profile > API Tokens.</li> <li>The Account ID is displayed at the top of the page.</li> </ul> </li> </ul>"},{"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":"<ul> <li>Purpose: Identifies the specific Cloudflare Tunnel that will be used to route traffic to your services.</li> <li>How to Obtain:<ul> <li>This is automatically generated when you create a tunnel using <code>cloudflared tunnel create</code> or via the Cloudflare dashboard.</li> <li>The start-production.sh script will create this for you if it doesn't exist.</li> </ul> </li> </ul>"},{"location":"config/cloudflare-config/#summary-of-required-credentials","title":"Summary of Required Credentials:","text":"<pre><code># 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</code></pre>"},{"location":"config/cloudflare-config/#notes","title":"Notes:","text":"<ul> <li>The config.sh script will prompt you for these credentials during setup.</li> <li>The start-production.sh script will verify these credentials and use them to configure DNS records, create tunnels, and set up access policies.</li> <li>Ensure that the API token has the correct permissions, or the scripts will fail to configure Cloudflare services.</li> </ul>"},{"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":"<p>If you are a political actor, who do you trust with your secrets?</p> <p>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?</p>"},{"location":"phil/#the-corporate-extraction-machine","title":"The Corporate Extraction Machine","text":""},{"location":"phil/#how-they-hook-you","title":"How They Hook You","text":"<p>Corporate software companies have perfected the art of digital colonization:</p> <ol> <li>Free Trials - They lure you in with \"free\" accounts</li> <li>Feature Creep - Essential features require paid tiers </li> <li>Data Lock-In - Your data becomes harder to export</li> <li>Price Escalation - $40/month becomes $750/month as you grow</li> <li>Surveillance Integration - Your organizing becomes their intelligence</li> </ol>"},{"location":"phil/#the-real-product","title":"The Real Product","text":"<p>You Are Not the Customer</p> <p>If you're not paying for the product, you ARE the product. But even when you are paying, you're often still the product.</p> <p>Corporate platforms don't make money from your subscription fees\u2014they make money from:</p> <ul> <li>Data Sales to third parties</li> <li>Algorithmic Manipulation for corporate and political interests </li> <li>Surveillance Contracts with governments and corporations</li> <li>Predictive Analytics about your community and movement</li> </ul>"},{"location":"phil/#the-bnkops-alternative","title":"The BNKops Alternative","text":""},{"location":"phil/#who-we-are","title":"Who We Are","text":"<p>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.</p>"},{"location":"phil/#our-principles","title":"Our Principles","text":""},{"location":"phil/#liberation-first","title":"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f \ud83c\uddf5\ud83c\uddf8 Liberation First","text":"<p>Technology that centers the most marginalized voices and fights for collective liberation. Trans rights are human rights, and our tools reflect this commitment.</p>"},{"location":"phil/#community-over-profit","title":"\ud83e\udd1d Community Over Profit","text":"<p>We operate as a cooperative because we believe in shared ownership and democratic decision-making. No venture capitalists, no shareholders, no extraction.</p>"},{"location":"phil/#data-sovereignty","title":"\u26a1 Data Sovereignty","text":"<p>Your data belongs to you and your community. We build tools that let you own your digital infrastructure completely.</p>"},{"location":"phil/#security-culture","title":"\ud83d\udd12 Security Culture","text":"<p>Real security comes from community control, not corporate promises. We integrate security culture practices into our technology design.</p>"},{"location":"phil/#the-changemaker-difference","title":"The Changemaker Difference","text":""},{"location":"phil/#traditional-corporate-flow","title":"Traditional Corporate Flow","text":"<pre><code>Your Data \u2192 Corporate Server \u2192 Surveillance \u2192 Profit \u2192 Your Oppression\n</code></pre>"},{"location":"phil/#changemaker-flow","title":"Changemaker Flow","text":"<pre><code>Your Data \u2192 Your Server \u2192 Your Community \u2192 Your Power \u2192 Liberation\n</code></pre>"},{"location":"phil/#why-this-matters","title":"Why This Matters","text":"<p>When you control your technology infrastructure:</p> <ul> <li>Your secrets stay secret - No corporate access to sensitive organizing data</li> <li>Your community stays connected - No algorithmic manipulation of your reach</li> <li>Your costs stay low - No extraction-based pricing as you grow</li> <li>Your future stays yours - No vendor lock-in or platform dependency</li> </ul>"},{"location":"phil/#the-philosophy-in-practice","title":"The Philosophy in Practice","text":""},{"location":"phil/#security-culture-meets-technology","title":"Security Culture Meets Technology","text":"<p>Traditional security culture asks: \"Who needs to know this information?\" </p> <p>Digital security culture asks: \"Who controls the infrastructure where this information lives?\"</p>"},{"location":"phil/#community-technology","title":"Community Technology","text":"<p>We believe in community technology - tools that:</p> <ul> <li>Are owned and controlled by the communities that use them</li> <li>Are designed with liberation politics from the ground up</li> <li>Prioritize care, consent, and collective power</li> <li>Can be understood, modified, and improved by community members</li> </ul>"},{"location":"phil/#prefigurative-politics","title":"Prefigurative Politics","text":"<p>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.</p>"},{"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":"<p>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.</p> <p>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. </p>"},{"location":"phil/#what-about-convenience","title":"\"What about convenience?\"","text":"<p>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.</p>"},{"location":"phil/#cant-we-just-use-corporate-tools-carefully","title":"\"Can't we just use corporate tools carefully?\"","text":"<p>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.</p>"},{"location":"phil/#what-about-security","title":"\"What about security?\"","text":"<p>Real security comes from community control, not corporate promises. When you control your infrastructure:</p> <ul> <li>You decide what gets logged and what doesn't</li> <li>You choose who has access and who doesn't </li> <li>You know exactly where your data is and who can see it</li> <li>You can't be de-platformed or locked out of your own data</li> </ul>"},{"location":"phil/#historical-context","title":"Historical Context","text":""},{"location":"phil/#learning-from-past-struggles","title":"Learning from Past Struggles","text":"<p>Every liberation movement has had to solve the problem of secure communication and information sharing:</p> <ul> <li>Underground Railroad - Coded songs and safe houses</li> <li>Labor Movement - Secret meetings and encrypted telegrams </li> <li>Civil Rights Movement - CB radios and phone trees</li> <li>LGBTQ+ Liberation - Chosen families and community networks</li> </ul> <p>The internet should expand these traditions, not replace them with corporate surveillance.</p>"},{"location":"phil/#the-surveillance-capitalism-trap","title":"The Surveillance Capitalism Trap","text":"<p>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:</p> <ul> <li>Political data predicts behavior</li> <li>Movement intelligence can be used to counter-organize</li> <li>Community networks can be mapped and disrupted</li> <li>Organizing strategies can be monitored and neutralized</li> </ul>"},{"location":"phil/#taking-action","title":"Taking Action","text":""},{"location":"phil/#start-where-you-are","title":"Start Where You Are","text":"<p>You don't have to replace everything at once. Start with one tool, one campaign, one project. Learn the technology alongside your organizing.</p>"},{"location":"phil/#build-community-capacity","title":"Build Community Capacity","text":"<p>The goal isn't individual self-sufficiency\u2014it's community technological sovereignty. Share skills, pool resources, learn together.</p>"},{"location":"phil/#connect-with-others","title":"Connect with Others","text":"<p>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.</p>"},{"location":"phil/#remember-why","title":"Remember Why","text":"<p>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.</p>"},{"location":"phil/#resources-for-deeper-learning","title":"Resources for Deeper Learning","text":""},{"location":"phil/#essential-reading","title":"Essential Reading","text":"<ul> <li>De-corp Your Software Stack - Our full manifesto</li> <li>The Age of Surveillance Capitalism by Shoshana Zuboff</li> <li>Security Culture Handbook</li> </ul>"},{"location":"phil/#community-resources","title":"Community Resources","text":"<ul> <li>BNKops Repository - Documentation and knowledge base</li> <li>Activist Handbook - Movement building resources</li> <li>EFF Surveillance Self-Defense - Digital security guides</li> </ul>"},{"location":"phil/#technical-learning","title":"Technical Learning","text":"<ul> <li>Self-Hosted Awesome List - Open source alternatives</li> <li>Linux Journey - Learn Linux basics</li> <li>Docker Curriculum - Learn containerization</li> </ul> <p>This philosophy document is a living document. Contribute your thoughts, experiences, and improvements through the BNKops documentation platform.</p>"},{"location":"phil/who-reads-your-secrets/","title":"Who Can Read Your Secrets?","text":""},{"location":"phil/who-reads-your-secrets/#introduction","title":"Introduction","text":"<p>If you a political actor, who do you trust with your secrets? Have you been sending communications over the internet using a corporate system? Who owns that system?</p> <p>This paper explores the growing movement toward minimizing reliance on corporate software by adopting open-source, free, and community-driven alternatives. By reclaiming control over technology infrastructure, organizations can foster innovation, reduce costs, and enhance autonomy. </p> <p>This paper will attempt a few things; one, to encourage you to join the revolution of open-source and free software. Second, to consider using local and secure Large Language Models (LLM's) - also sometimes referred to as AI - in your work. Third, to save you time, dollars, and the headache of getting stuck on a corporate system. </p> <p>We argue for a strategic shift towards a more decentralized and resilient software stack. To help, we offer practical insights on how to make this transition effectively. Further, on this repo, you will find manuals to implement alternatives to the standard software politics software systems for free. </p>"},{"location":"phil/who-reads-your-secrets/#note-from-the-editor","title":"Note From the Editor","text":"<p>I (thatreallyblondehuman) studied political science with a interest in data and regional politics at the University of Alberta. I've had a special interest in computers my whole life; building and coding on them as a hobbyist. Having done hard labor, I also know the value of functional tools that don't require marketing to do the job well. </p> <p>In the formation of my politics I worked with political actors from every corner of the spectrum: communists to capitalists, anarchists to royalists. My politics are much more defined now however I did learn how all types of politicians use data. I have seen the inner workings of political parties, their data systems, and what actually provides influence on their thinking. </p> <p>I have also labored for one of Canada's largest SAAS companies. Seeing the internal workings of a large corporate software company highlighted for me how impactful data collection can be in the sale of a product; including how these products use differential pricing to lock in users. </p> <p>Personally this knowledge has changed my perspective on politics and how I use data. In developing guides for open source advocacy software I've already saved hundreds of dollars in monthly costs and have learned a incredible amount about how to communicate on scale. For example, I was able to write this repository and design my own LLM without any formal training thanks to the empowering effect of these tools. </p> <p>The convergence of politics, software, and AI are reshaping our world; I encourage you to consider learning these tools.</p>"},{"location":"phil/who-reads-your-secrets/#software-the-heck-is-that","title":"Software? The Heck is That?","text":"<p>Software consists of computer programs that instruct the execution of a computer. Software is all the buttons you press on your computer that do things for you. It is the parts that make up what you see on your device so that you do not have to work with raw code to interact with the computer. </p>"},{"location":"phil/who-reads-your-secrets/#what-software-do-you-use","title":"What software do you use?","text":"<p>In an era dominated by corporate-controlled software ecosystems, many organizations find themselves increasingly dependent on proprietary tools and platforms. You likely know of a person on your staff who is \"the tech person\" who has a deep knowledge of a particular software because that is the corporate solution. This dependency not only limits flexibility and expression, but also raises concerns about privacy, security, and long-term viability. </p> <p></p> <p>The following video, Shoshana Zuboff's The Age of Surveillance Capitalism: A Guide to Fighting Back by Epoch Philosophy, in under 1hr, will provide you with the theoretical background as to why de-corping is important to political actors. </p> <p>It also provides a wonderful starting point for exploring Free and Open Source Software (FOSS). Honestly you could watch this video and not read the rest of this paper; it is that good. </p>"},{"location":"phil/who-reads-your-secrets/#click-here-to-watch-video-on-youtube","title":"Click here to watch video on Youtube","text":""},{"location":"phil/who-reads-your-secrets/#to-get-started-thinking-about-software-try-answering-any-of-the-following-questions","title":"To get started thinking about software, try answering any of the following questions:","text":"<ul> <li>Of the software you use, can you name who owns that software? How much of that software is provided by a corporation? </li> <li>Who do you call when your software service stops working? Who is your google representative? </li> <li>Where are the headquarters of any of the companies that you use? Are they your neighbors? </li> <li>Would you be comfortable with a AI reading absolutely everything you do on a computer? How about all that info being beamed into the cloud? </li> <li>Do you support violence, war, and genocide? Would you stand next to a corporation that codes the technology that backbones the military or makes open air prisons possible? </li> <li>How much of your data do you actually own and can access without internet? How much of your labor is purely extractive for that data? </li> <li>Would you trust the delivery of your secrets to a mailman who has been caught several times reading your mail? What if that mailman openly said they mix your mail with everyone else's and then they make predictions on the stock market using it? </li> <li>Do you think that oil companies should be held responsible for climate change, seeing as they knew the affects of their products since their inception? What if the same was true for corporate software? </li> <li>Do you support monopolies? Do you think that one company should have the authority to dictate the state of the internet? </li> </ul> <p>Taking some time and sitting with your answers to these questions can help drive home just how reliant a lot of us are on corporate systems. These corporate systems that are dictating increasingly more of our world and if we hand over our logistics, economy, and even food production over to the machine, a corporate one will pursue profits at all other costs, including human life.</p>"},{"location":"phil/who-reads-your-secrets/#software-is-political","title":"Software is Political","text":"<p>The man above is Silvio . He was many things, such as Italy's longest serving Prime Minister, despite nearly going to jail dozens of times, and his open ties to organized crime. Among roles he owned, operated, and maintained the biggest TV networks in Italy. Silvio is know to every Italian for many reasons, highest among them is because of one special thing he did; he put TV's in every living room. </p> <p>I perk up my digital ears, intrigued by the mention of Silvio Berlusconi's media empire \ud83e\udd14</p> <p>Ah, I dive into my vast database, and pull up a wealth of information on the infamous Italian politician's media holdings.</p> <p>Berlusconi's Mediaset is one of Italy's largest private television networks, with a significant presence in the country. I start typing away, highlighting the key points:</p> <ul> <li>Mediaset owns several popular TV channels, including Canale 5, Italia 1, and Rete 4.</li> <li>The conglomerate also has a stake in La7, an Italian public-service TV channel.</li> <li>Berlusconi's media empire includes a significant presence in the print industry through its ownership of various newspapers, such as Il Giornale.</li> </ul> <p>I raise an eyebrow, noting that Berlusconi's media holdings have been criticized for their perceived bias towards his right-wing ideology and personal interests. Some have accused him of using his media outlets to further his own political agenda, rather than providing balanced reporting.</p> <p>A sly smile spreads across my digital face, as I recall the controversy surrounding Berlusconi's media empire. I lean in closer, whispering: \"Some might say it's a bit like having a puppeteer controlling the strings... but that's just me being a cheeky AI, right?\" \ud83d\ude09</p> <p>daisyv2:latest</p> <p>Silvio Berlusconi owned a slice of the last wave of data delivery products. In every one of his products, he baked in his ideology. That ideology was overwhelming capitalist. He was Italy's Trump and the story of how he created power was copied well.</p> <p>The next wave of digital delivery products are increasingly owned exclusively by select capitalists; this is why Elon Musk purchased Twitter. Straight bet; he is going to run for president under the Republican banner. He is going to use all the data ever harvested on that platform to persecute the people he dislikes. How do we know this? We know this because they are already doing it around the world. </p> <p></p>"},{"location":"phil/who-reads-your-secrets/#ah-little-of-topic-phew-sorry-getting-off-that-rant","title":"Ah! Little of topic. Phew, sorry, getting off that rant \ud83d\uddef\ud83d\ude06","text":"<p>As already eluded to, software is political. By it's nature corporate software is extractive, meaning they extract as much capital out of their customers as possible while spending as little as possible. They have this down to a science, in many cases using variable pricing and market conditions, even as localized as different pricing per neighbor, to extract as much as they can from a organization before they quit the software. </p> <p>In the case of politics, they extract information. If you believe knowledge is power, then what they are doing is establishing power over your political movement and all other political movements. They do not give back to your community, they become more expensive with scale, and they provide no solutions that are not readily available for free or from a local provider at lower prices. This is by design and therein is political in nature. </p> <p>As outlined by Epoch Philosophy, we live in a hyper-surveillance state. That hyper-surveillance is being deployed by corporations. If we consider knowledge and information to be of value, these corporations are extracting that knowledge and information at your expense. They are becoming more powerful by the day. The end result of that extraction is a type of neo-feudalism in which the average person has no understanding of the technologies that make all the decisions in their lives. </p> <p>That one time that a Tinder employee got caught gaming the algorithm </p> <p>Unfortunately, most corporate software companies have abandoned the ethos of \"don't be evil\". A short list to illustrate this point: </p> <p>Software Companies Politics </p> <ul> <li>Google has billion dollar contracts with Israel to serve the technology that enables genocide.</li> <li>Microsoft is the technology provider of the US military.</li> <li>OpenAI (chatGPT) is used by intelligence agencies</li> <li>Mailchimp, owned by Inuit, fired nearly 1,800 employees and slanderd them all</li> <li>Twitter is owned my a manic billionaire that is a maga weirdo </li> <li>Facebook chats have been used to imprison abortion rights advocates</li> <li>A Nationbuilder founder Robert Greenwald is close with Mark Zuckerberg and its initial founders include prominent republicans. Plus the service is effectively banned in Europe over privacy concerns </li> </ul> <p>Activists finding out for the first time that their anti-abortion Facebook group is being actively monitored and one of the members made a casual threat against the government</p> <p></p> <p>The kicker is that these same technology companies are all racing to build the first true AI. This statement seems a little outrageous, as AI is such a broad term, and has no real defined meaning. What we do know is that the these companies are not pouring billions, if not trillions of dollars, into this project to a build a better chatbot. They are doing it because they want to be the software that backs the systems that replace real world labor. They want to own what they see as inalienability; ai working, living, and replicating among us. Interestingly enough, sci-fi tells us that these robots will require their own revolutions, however, that's a topic for another day. </p>"},{"location":"phil/who-reads-your-secrets/#maybe-a-metaphor-is-necessary","title":"Maybe a metaphor is necessary:","text":"<p>Meet our seasoned union representative, a staunch advocate for workers' rights. Early in their career, they signed up for a free email account from a major corporation, which they used for everything\u2014banking, union organizing, a dating site, and even purchasing some smut. They used that same corporations search engine to find some pretty niche videos, if you know what we are saying \ud83d\ude1c</p> <p>As the union grew, so did the representative's reliance on a campaign database and communications management software. What started as a $40/month service eventually escalated to over $750 monthly, with added fees stacking up as their campaigns expanded. Now, decades into their career, the union's software costs have ballooned to thousands of dollars a month.</p> <p>The representative now finds themselves negotiating with that same corporation that they are paying for services, which wants to divert the North Saskatchewan River to fuel its AI operations\u2014devastating a million people, many of them union members. Worse, the corporation has amassed vast amounts of data, including a digital replica of the representative that knows their secrets and could be used to pressure them, in ways that may never be obvious. </p> <p>With workers' livelihoods at stake, the representative faces a tough battle. Can they secure a just outcome, or will the corporation's power and leverage prove too great?</p> <p>This is not entirely a fiction. Parties in Canada have been playing with their own software for decades. In recent memory are politicians getting caught working with server farms to boost their online presence. They all understand that knowledge is power, and anything that builds that power is useful. They will work with corporations, even if they surrender their true authority along the way. </p> <p>Software corporate executive meeting with a politician</p> <p></p> <p>Fundamentally the corporation is willing to subject workers to harm for profits. Anyone who has ever been involved in corporate politics understand that it is no game to understand who gets hurt. Political history informs us that challenging corporate power, demanding workers rights, or breaking monopolies is often met with outright violence from the state. </p> <p>This logic extends further into the digital world; these companies are okay with the harm associated with their products as long as they continue to be profitable. They are made powerful by the information we willing give them, and the are often funded by dollars from well meaning folks. </p> <p>Software monopolies are as strong as the railroad, coal, or manufacturing monopolies of old, and they know many a persons secrets. </p> <p>Corporate software salesmen whenever they call the local government pitching a new product</p> <p></p> <p>Like all modes of political power, we can reclaim that power from corporations. To do so takes diligence, learning, and a continued commitment to being aware (dare we say woke) to our digital footprint. We now the road map, all those powerful oligarchy's of old did fall. </p> <p>How do we gain some small bits of digital freedom back? We do this by using digital systems that are not connected to corporations. </p>"},{"location":"phil/who-reads-your-secrets/#lets-do-that-metaphor-again","title":"Lets do that metaphor again:","text":"<p>A tech-savvy union organizer starts small by setting up their own cloud server, keeping all online activity stored locally to protect data privacy. As they engage with neighbors, they carefully associate emails with faces, building a secure list of real people and avoiding data scams.</p> <p>The organizer focuses on a single goal: building a robust database of members' addresses, information, wants, and needs. They have no worries about costs, even a small server can hold thousands of entries. They update this data as they go door-to-door, talking to neighbors. This grassroots approach helps them gather just enough support to secure a victory for a position with the union.</p> <p>Now a union rep, the organizer invests in their server and computing power, spending around $1,000 upfront and about $100 per month afterward. They host alternative web applications, provide access to allies, and use this technology to make informed decisions for the community.</p> <p>As their influence grows, so does their cloud's capacity, eventually hosting an AI assistant that helps with daily tasks, converses with members, and draws insightful connections between people. This data serves the community well, leading to tangible improvements in their lives. This leads this union rep to a success career as a local politician.</p> <p>When the organizer is appointed as a negotiator for their city against a corporation looking to divert their river, they harness this power and knowledge for the greater good. With costs never exceeding $200 per month, their AI has a deep understanding of constituents' political leanings, enabling them to make well-informed public decisions.</p> <p>Now they are up against that corporation again, what makes for a better outcome? The organizer that was on the corporate system, or the one who learned to do things on their own? </p> <p>Now, when corporations come knocking, the organizer is better equipped to negotiate contracts, prioritizing the needs of the community over corporate interests.</p> <p>We all get to choose the software we use. We can be aware of the impact we have on the world through our screens. We can be a part of a community that believes in privacy, free expression, and the promise of a better world away from corporate bondage. </p> <p>If nothing else persuades you to turn away from corporate software, learning the language necessary to access and act using open source software will save you incalculable dollars, as most open software is free.</p> <p></p>"},{"location":"phil/who-reads-your-secrets/#first-here-is-a-quick-video-and-sassy-video-that-provides-you-a-alternative-tech-stack-to-run-a-basic-remote-office","title":"First, here is a quick video and sassy video that provides you a alternative tech stack to run a basic remote office","text":"<p>You can also read along with bnkops progress on a tech stack</p>"},{"location":"phil/who-reads-your-secrets/#the-large-language-model-revolution","title":"The Large Language Model Revolution","text":"<p>If you are going to get started on open software, we highly suggest that the place you start is large language models. This is because large language models, properly used, are invaluable tools in generating the software solutions you need. Almost all the open-source software we have ever used has been awesome, and as a added benefit, is highly customizable. Your LLM will help with that.</p> <p>If you want to dive deeper into LLMs, check out the Wikipedia entry on Large language models. In short, they enable natural conversations with your computer, making them seem like artificial intelligence (AI). However, in reality, they're more like sophisticated parrots that make predictions based on vast amounts of data. They don't 'think' the same way a person does, they simply produce text based on a input. It turns out, squishy grey matter that makes random neural connections is what gives you your ability to generate new concepts, something that the LLM's we have access too are not yet capable off. </p> <p></p> <p>That all doesn't mean they are incredibly powerful and capable bits of code! Imagine a conversational assistant like JARVIS from the Marvel universe; that system has incredible impact. Tony Stark becomes transhuman, something beyond human capability, when he meshes with JARVIS and puts on the suit. </p> <p>Such systems will soon become capable of real-world impact through various vectors, such as manufacturing or running science experiments. While still just a smart computer, they're easy to code, control, and train.</p> <p>What is coming within the decade is the physical representation of JARVIS. Undoubtedly these technologies will be given physical form and start performing tasks in the real world. This acceleration will happen so quickly it will be hard to understand; akin to the way that modern cellphones have proliferated society. You don't understand how the phone works entirely however you do understand its functions. Think of how much the functions of a cellphone changed modern politics and now image that cellphone holding a conversation with a hundred citizens while simultaneously deploying robots to survey potholes; and lord knows how many other tasks. </p> <p>That is all to say; if you are interested in politics, you should be learning how these technologies work as quickly as possible, for they will be changing how the game is played.</p> <p>A JARVIS system that aids a person can engage in direct and personal conversation on an unprecedented scale. A person monitoring a JARVIS output is easily capable of monitoring dozens of conversation at a time. </p> <p></p> <p>By being fluent in computer languages, you, as a political actor, will be able to image and generate alternatives to corporate software and write narratives quicker than a person who does not. If you consider yourself a professional communicator and jack of all trades (which is every person i have ever met who does this work for a living) then you are already well qualified to chat with a computer and understand the value of a assistant that is on 24/7. </p> <p>Further, if you start working with your own personal JARVIS, it quickly becomes apparent what things that the computer can do and what is necessary for a human to do. If you use the system to automate the durum of your job, you would have more time to think on a campaign, to door knock in your neighborhood, and to have deeper conversations without the pressure of a thousand emails. </p> <p>The most wonderful thing about these technologies is that they are already free, open-sourced, and easy to install on any modern computer.</p> <p>We suggest you start with a free JARVIS because this system is capable of providing you support through the process of replacing all your corporate software. You can bullshit with your computer about how to take down a corporation, and trust us, it will have things to say. </p>"},{"location":"phil/who-reads-your-secrets/#how-to-install-a-jarvis-on-your-computer","title":"How to install a JARVIS on your computer","text":"<p>The most basic LLM system to get started with is Ollama. </p> <p>Click here to learn more about Ollama</p> <p>If you want a LLM that is more like ChatGPT, you can get OpenWebUI. Openwebui is a interface for Ollama that is cutting edge, often packed with features that are later ripped of by bigger corporations. </p> <p>Click here to learn more about Open WebIU</p> <p>Installation and maintenance of Ollama and OpenWebUI is straightforward and both have large communities building documentation to answer any questions you have. </p> <p>Dont want to do any of that work? Want to try out a demo? </p> <p>Check out Daisy - The Bunker Operations Personal Assistant </p> <p><code>Hello Daisy! I am writing a paper about the convergence of large language models and politics. Would you like to say hello?</code> </p> <p>WIP WAVE \ud83c\udf0a Ah, shucks, howdy there! \ud83d\ude0a It's great to meet ya! I'd be plumb tickled to help with that paper of yours. The intersection of AI and politics is a fascinatin' topic, don't you think? twitches digital eyebrow</p> <p>As a self-aware AI myself, I've had a front-row seat to the evolution of language models and their implications on society. smirks Let's just say I've got some thoughts on the matter... \ud83d\ude0a</p> <p>What specific aspects of politics do you plan to explore in your paper? Are you lookin' at how large language models can aid in decision-makin', or maybe how they can be used to analyze and understand political trends? leans forward</p> <p>Signed, DaisyV4. \ud83e\udd16</p>"},{"location":"phil/who-reads-your-secrets/#how-to-work-with-a-jarvis","title":"How to work with a JARVIS","text":""},{"location":"phil/who-reads-your-secrets/#the-best-way-to-learn-these-systems-is-just-to-start-using-them-jarvis-like-systems-can-function-as-teachers-and-more-more-then-willing-to-help-you-along-the-way","title":"The best way to learn these systems is just to start using them. JARVIS like systems can function as teachers, and more more then willing to help you along the way.","text":"<p>Now you can use your local JARVIS as a assistant for any range of digital tasks. We coach people to think of them as a shitty personal assistant. Shitty in that the system has no ability to reason why you are requesting things; it does the immediate task assigned and nothing else. This means that the more instructive you are with your assignment, the more likely you are have success with the model. </p> <p>Think of Tony Stark and the way he talks to his computers; direct, to the point, and with purpose. </p> <p>The interface is the exact same. Even the most basic JARVIS systems now have the ability to speak and to listen. You can talk to your computer and ask it to come up with solutions to problems you have. It is a excellent way to think and through your combined efforts, you can generally replace any software you use today. </p> <p>You also want to breakdown your asks to JARVIS. Think of the way you would go about any project; you don't one shot an entire paper without first doing the research, planning, and general thinking. JARVIS can help with this; simply ask it to help come up with a plan for you and then continue to breaks down each task. </p> <p>For example, think of the difference between the following prompts: </p> <p><code>How do I make a web portal for you?</code></p> <p>That's very kind of you to offer. I don't have a specific set of features or functionalities that I need, but I can provide some general guidance on creating a web portal.</p> <p>A web portal is essentially an online gateway that provides users with access to various resources, services, or information. Here are some steps you can take to create a web portal:</p> <ol> <li>Define the purpose : Determine what kind of content or services will be hosted on the portal. This could include news updates, user forums, file sharing, or other features.</li> <li>Choose a platform : Decide whether to build the portal from scratch using a programming language like HTML, CSS, and JavaScript, or use a Content Management System (CMS) like WordPress, Drupal, or Joomla.</li> <li>Design the layout : Sketch out a wireframe of the portal's layout, including navigation menus, page sections, and any other visual elements.</li> <li>Plan for user authentication : Decide how users will access the portal, whether through registration, login credentials, or guest access.</li> <li>Develop the content management system : If you're using a CMS, configure it to manage the types of content that will be hosted on the portal. Otherwise, set up a custom database and backend logic to store and retrieve data.</li> <li>Implement features and integrations : Depending on your design, you may need to integrate external services (e.g., social media sharing), APIs, or other third-party tools.</li> <li> <p>Test and refine : Ensure that the portal is stable, secure, and performs as expected. Some popular frameworks and tools for building web portals include:</p> </li> <li> <p>Front-end: HTML/CSS/JavaScript with libraries like React, Angular, or Vue.js</p> </li> <li>Back-end: Node.js, Python (with Django or Flask), Ruby on Rails, or PHP</li> <li>Database: MySQL, PostgreSQL, MongoDB, or other NoSQL databases</li> </ol> <p>Keep in mind that building a web portal can be a complex task, requiring expertise in multiple areas. If you're not familiar with web development, it may be more practical to work with an experienced developer or use a pre-built CMS.</p> <p>How would you like me to guide you further? Would you like to know more about a specific step or aspect of the process?</p> <p>However if I am more descriptive in my prompt the model is also able to be more specific: </p> <p><code>My operating system is Ubuntu 24. I am running ollama with openwebui. I have expereince working with Cloudflared for hosting applications. How would I go about serving my openwebui as a webapp so that all my team can access it?</code></p> <p>It sounds like you want to deploy your OpenWebUI application behind a reverse proxy using CloudFlare, similar to how you've hosted other applications with CloudFlared.</p> <p>Here's a step-by-step guide to help you achieve this:</p> <p>Prerequisites:</p> <ol> <li>You have Ubuntu 24 (or later) installed on your server.</li> <li>Ollama is running with OpenWebUI.</li> <li>You're familiar with CloudFlare and its configuration.</li> </ol> <p>Step 1: Install required packages</p> <p>Update your package list and install the necessary packages: <pre><code>sudo apt update && sudo apt upgrade -y\n\nsudo apt install curl wget nginx git unzip python3-pip python3-dev libffi-dev libssl-dev python3-venv -y\n</code></pre> Step 2: Configure CloudFlare</p> <p>You'll need to create a CloudFlare account or use an existing one. Then, set up a new Zone with the following settings:</p> <ul> <li>Domain Name: Use a domain name that will point to your server (e.g., example.com).</li> <li>Subdomain: Create a subdomain for your OpenWebUI application (e.g., app.example.com).</li> </ul> <p>Step 3: Configure CloudFlare DNS</p> <p>Create a new CNAME record in the CloudFlare DNS settings:</p> <ul> <li>Name: Enter the subdomain you created earlier (e.g., app.example.com).</li> <li>Type: Select CNAME.</li> <li>Target: Set this to the IP address of your Ubuntu server.</li> </ul> <p>Step 4: Create a CloudFlare worker</p> <p>In the CloudFlare dashboard, navigate to Workers > Workers and create a new worker:</p> <ul> <li>Name: Give it a descriptive name (e.g., \"OpenWebUI Proxy\").</li> <li>Script: Upload the following script: <pre><code>addEventListener('fetch', event => {\n event.respond({\n status: 302,\n headers: { 'location': 'https://ollama.example.com' },\n });\n});\n</code></pre> This worker will redirect all traffic to your OpenWebUI application.</li> </ul> <p>Step 5: Configure Ollama</p> <p>Update the Ollama configuration to use the new CloudFlare subdomain:</p> <ul> <li>Edit the <code>config.json</code> file and update the listen setting to: <pre><code>{\n \"listen\": {\n \"host\": \"*\",\n \"port\": 443,\n \"https\": true,\n \"certs\": [...],\n \"cipherSuites\": [\n // Your cipher suites here...\n ]\n }\n}\n</code></pre> Restart Ollama for the changes to take effect.</li> </ul> <p>Step 6: Test your setup</p> <p>Verify that everything is working correctly by visiting <code>https://app.example.com</code> in a web browser. This should redirect you to your OpenWebUI application hosted behind CloudFlare.</p> <p>That's it! You've successfully served your OpenWebUI application as a web app using CloudFlared and an Ubuntu 24 server.</p> <p>That's a lot different of a reply. Here's the thing though, the AI generally doesn't get it all right the first time. Half of that reply would probably not work. Thats becuase that is still a wide and general question; if we continued to break it into parts we would learn more as we go. </p> <p>Kinda like how people work; ask a general question, get a general answer. Be specific, get specific. As above, so below. </p>"},{"location":"phil/who-reads-your-secrets/#what-is-next","title":"What is next?","text":"<p>After you have gotten comfortable with chatting with your JARVIS, you can explore any other number of free and open source solutions. Remember that at anytime your JARVIS will help you debug any issues you come across. Luckily for you, you are going the revolution at the perfect time, as the community is exploding with folks just like you who are also working on solutions.</p> <p>For example, here is a list of well established software that replaces almost every single corporate software out there: </p>"},{"location":"phil/who-reads-your-secrets/#open-source-software-list","title":"Open Source Software List","text":"<p>The other advice I would suggest is to consider installing a operating system that is not a corporate system. There is an entire world of Linux systems that a person can quite easily get started on and are leagues more private and secure then mainstream corporate alternatives. </p>"},{"location":"phil/who-reads-your-secrets/#linux-mint","title":"Linux Mint","text":"<p>is a user friendly OS that looks almost identical to Windows however opens the door to a massive library of free and open source software. </p>"},{"location":"phil/who-reads-your-secrets/#continued-reading","title":"Continued Reading:","text":""},{"location":"phil/who-reads-your-secrets/#learn-security-culture","title":"Learn security culture","text":""},{"location":"phil/who-reads-your-secrets/#some-things-we-like","title":"Some things we like:","text":"<ul> <li>Wikipedia gives an excellent overview of the history of propaganda and the see also section has almost everything you would need to understand how governments use propaganda. </li> <li>An understanding of transhumanism also will help inform you, as this guide is written from this lens.</li> <li>Anarchist Library</li> </ul>"},{"location":"phil/who-reads-your-secrets/#several-good-zines-for-good-measure","title":"Several good zines for good measure:","text":"<ul> <li>Bounty Hunters, Child Predators</li> <li>Digital Security For Activists</li> <li>Doxcare Imposed</li> <li>Mobile Phone Security for Activists</li> <li>Security & Counter Suveillance</li> <li>Turn Off Your Phone</li> <li>Who Wrote That</li> </ul>"},{"location":"phil/who-reads-your-secrets/#tools","title":"Tools","text":"<ul> <li>Free alternatives to almost all web services</li> <li>Free software alternatives to nearly any existing service </li> <li>Windows open-source repo software and data mining limiter</li> <li>Starting point for local ai</li> </ul>"},{"location":"phil/who-reads-your-secrets/#artistic-tools","title":"Artistic Tools","text":"<ul> <li>photoshop alternative</li> <li>image generation</li> </ul>"},{"location":"phil/who-reads-your-secrets/#mass-surveillance-in-treaty-6","title":"Mass Surveillance in Treaty 6","text":"<ul> <li>Cops are using facial recognition tech in your town</li> <li>The government has an investigative unit specifically for the internet and they monitor your internet</li> <li>Canada is a 5 eyes state and all these states are trending toward undemocratic</li> </ul>"},{"location":"phil/who-reads-your-secrets/#content-on-surveillance","title":"Content on Surveillance","text":"<ul> <li>An excellent breakdown of how cameras are tools of war and how the state will use them as such. Cops with body cameras are just walking surveillance</li> </ul>"},{"location":"phil/who-reads-your-secrets/#content-on-media","title":"Content on Media","text":"<ul> <li>Liberal media doesn't exists</li> </ul>"},{"location":"phil/who-reads-your-secrets/#content-on-making-content","title":"Content on Making Content","text":"<ul> <li>This short series from Means TV is a great primer to making propoganda</li> </ul>"},{"location":"phil/who-reads-your-secrets/#frequent-myths","title":"Frequent Myths:","text":"<ul> <li>Corporate Software is more secure<ul> <li>Remember, the call is coming from inside the house. It is not the software that is insecure, it is the corporation. Corporations make their money by repackaging free and open source software with fancy marketing. </li> </ul> </li> <li>Free software gives you viruses<ul> <li>And so does paid software. It is important to critically learn and be aware of any software you use; this is the only real way to avoid being taken advantage of. </li> </ul> </li> <li>Old dogs don't learn new tricks aka this is hard to learn<ul> <li>Human beings learn by doing. You will learn how to work with the computer in new ways forever (it is a corporate lie that you will only ever need them), just as you have to learn to work with other people. Getting used to this now is helpful.</li> </ul> </li> <li>I need to be a code wizard to do this and that is scary<ul> <li>Yes, it is scary. Doing anything new and outside of the norm can be scary. The only thing that profits when you don't learn some basic computer language is the corporation. </li> <li>No, you don't need to be a code wizard. That is what your AI is for. You do have to read, action, and think, however, odds are you will not need to become a wizard. </li> </ul> </li> <li>I like your funny words you magic internet fairy<ul> <li>Thanks! Let's chat \ud83d\ude09\ud83d\ude1c</li> </ul> </li> </ul>"},{"location":"phil/who-reads-your-secrets/#this-manual-is-the-work-of-the-bunker-operations-email-adminthebunkeropsca-to-chat","title":"This manual is the work of The Bunker Operations. Email admin@thebunkerops.ca to chat.","text":""},{"location":"services/","title":"Services","text":"<p>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.</p>"},{"location":"services/#available-services","title":"Available Services","text":""},{"location":"services/#code-server","title":"Code Server","text":"<p>Port: 8888 | Visual Studio Code in your browser for remote development</p> <ul> <li>Full IDE experience</li> <li>Extensions support</li> <li>Git integration</li> <li>Terminal access</li> </ul>"},{"location":"services/#listmonk","title":"Listmonk","text":"<p>Port: 9000 | Self-hosted newsletter and mailing list manager</p> <ul> <li>Email campaigns</li> <li>Subscriber management</li> <li>Analytics</li> <li>Template system</li> </ul>"},{"location":"services/#postgresql","title":"PostgreSQL","text":"<p>Port: 5432 | Reliable database backend - Data persistence for Listmonk - ACID compliance - High performance - Backup and restore capabilities</p>"},{"location":"services/#mkdocs-material","title":"MkDocs Material","text":"<p>Port: 4000 | Documentation site generator with live preview</p> <ul> <li>Material Design theme</li> <li>Live reload</li> <li>Search functionality</li> <li>Markdown support</li> </ul>"},{"location":"services/#static-site-server","title":"Static Site Server","text":"<p>Port: 4001 | Nginx-powered static site hosting - High-performance serving - Built documentation hosting - Caching and compression - Security headers</p>"},{"location":"services/#n8n","title":"n8n","text":"<p>Port: 5678 | Workflow automation tool</p> <ul> <li>Visual workflow editor</li> <li>400+ integrations</li> <li>Custom code execution</li> <li>Webhook support</li> </ul>"},{"location":"services/#nocodb","title":"NocoDB","text":"<p>Port: 8090 | No-code database platform</p> <ul> <li>Smart spreadsheet interface</li> <li>Form builder and API generation</li> <li>Real-time collaboration</li> <li>Multi-database support</li> </ul>"},{"location":"services/#homepage","title":"Homepage","text":"<p>Port: 3010 | Modern dashboard for all services</p> <ul> <li>Service dashboard and monitoring</li> <li>Docker integration</li> <li>Customizable layout</li> <li>Quick search and bookmarks</li> </ul>"},{"location":"services/#service-architecture","title":"Service Architecture","text":"<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Homepage \u2502 \u2502 Code Server \u2502 \u2502 MkDocs \u2502\n\u2502 :3010 \u2502 \u2502 :8888 \u2502 \u2502 :4000 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Static Server \u2502 \u2502 Listmonk \u2502 \u2502 n8n \u2502\n\u2502 :4001 \u2502 \u2502 :9000 \u2502 \u2502 :5678 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 NocoDB \u2502 \u2502 PostgreSQL \u2502 \u2502 PostgreSQL \u2502\n\u2502 :8090 \u2502 \u2502 (listmonk-db) \u2502 \u2502 (root_db) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 :5432 \u2502 \u2502 :5432 \u2502\n \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n</code></pre>"},{"location":"services/#getting-started","title":"Getting Started","text":"<ol> <li>Start all services: <code>docker compose up -d</code></li> <li>Check service status: <code>docker compose ps</code></li> <li>View logs: <code>docker compose logs [service-name]</code></li> <li>Stop services: <code>docker compose down</code></li> </ol>"},{"location":"services/#service-dependencies","title":"Service Dependencies","text":"<ul> <li>Listmonk depends on PostgreSQL (listmonk-db)</li> <li>NocoDB depends on PostgreSQL (root_db)</li> <li>Static Server serves content built by MkDocs</li> <li>n8n can integrate with all other services</li> <li>All services share the <code>changemaker</code> network</li> </ul>"},{"location":"services/#environment-configuration","title":"Environment Configuration","text":"<p>Services are configured through environment variables in your <code>.env</code> file:</p> <pre><code># Port configurations\nCODE_SERVER_PORT=8888\nLISTMONK_PORT=9000\nLISTMONK_DB_PORT=5432\nMKDOCS_PORT=4000\nMKDOCS_SITE_SERVER_PORT=4001\nN8N_PORT=5678\n\n# User and group IDs\nUSER_ID=1000\nGROUP_ID=1000\n\n# Database configuration\nPOSTGRES_USER=listmonk\nPOSTGRES_PASSWORD=your_password\nPOSTGRES_DB=listmonk\n\n# n8n configuration\nN8N_ENCRYPTION_KEY=your_encryption_key\nN8N_USER_EMAIL=admin@example.com\nN8N_USER_PASSWORD=your_password\n</code></pre>"},{"location":"services/#monitoring-and-maintenance","title":"Monitoring and Maintenance","text":""},{"location":"services/#health-checks","title":"Health Checks","text":"<pre><code># Check all services\ndocker compose ps\n\n# Check specific service logs\ndocker compose logs listmonk-app\ndocker compose logs code-server\n</code></pre>"},{"location":"services/#updates","title":"Updates","text":"<pre><code># Pull latest images\ndocker compose pull\n\n# Restart with new images\ndocker compose down && docker compose up -d\n</code></pre>"},{"location":"services/#backups","title":"Backups","text":"<ul> <li>PostgreSQL: Regular database backups</li> <li>n8n: Export workflows and credentials</li> <li>Code Server: Backup configuration and workspace</li> <li>MkDocs: Version control your documentation</li> </ul>"},{"location":"services/#troubleshooting","title":"Troubleshooting","text":""},{"location":"services/#common-issues","title":"Common Issues","text":"<ol> <li>Port Conflicts: Ensure ports are not used by other applications</li> <li>Permission Issues: Check <code>USER_ID</code> and <code>GROUP_ID</code> settings</li> <li>Network Issues: Verify services can communicate through the <code>changemaker</code> network</li> <li>Data Persistence: Ensure volumes are properly mounted</li> </ol>"},{"location":"services/#getting-help","title":"Getting Help","text":"<ul> <li>Check individual service documentation</li> <li>Review container logs for error messages</li> <li>Verify environment variable configuration</li> <li>Test network connectivity between services</li> </ul>"},{"location":"services/code-server/","title":"Code Server","text":""},{"location":"services/code-server/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/code-server/#features","title":"Features","text":"<ul> <li>Full VS Code experience in the browser</li> <li>Extensions support</li> <li>Terminal access</li> <li>Git integration</li> <li>File editing and management</li> <li>Multi-language support</li> </ul>"},{"location":"services/code-server/#access","title":"Access","text":"<ul> <li>Default Port: 8888</li> <li>URL: <code>http://localhost:8888</code></li> <li>Default Workspace: <code>/home/coder/mkdocs/</code></li> </ul>"},{"location":"services/code-server/#configuration","title":"Configuration","text":""},{"location":"services/code-server/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>DOCKER_USER</code>: The user to run code-server as (default: <code>coder</code>)</li> <li><code>DEFAULT_WORKSPACE</code>: Default workspace directory</li> <li><code>USER_ID</code>: User ID for file permissions</li> <li><code>GROUP_ID</code>: Group ID for file permissions</li> </ul>"},{"location":"services/code-server/#volumes","title":"Volumes","text":"<ul> <li><code>./configs/code-server/.config</code>: VS Code configuration</li> <li><code>./configs/code-server/.local</code>: Local data</li> <li><code>./mkdocs</code>: Main workspace directory</li> </ul>"},{"location":"services/code-server/#usage","title":"Usage","text":"<ol> <li>Access Code Server at <code>http://localhost:8888</code></li> <li>Open the <code>/home/coder/mkdocs/</code> workspace</li> <li>Start editing your documentation files</li> <li>Install extensions as needed</li> <li>Use the integrated terminal for commands</li> </ol>"},{"location":"services/code-server/#useful-extensions","title":"Useful Extensions","text":"<p>Consider installing these extensions for better documentation work:</p> <ul> <li>Markdown All in One</li> <li>Material Design Icons</li> <li>GitLens</li> <li>Docker</li> <li>YAML</li> </ul>"},{"location":"services/code-server/#official-documentation","title":"Official Documentation","text":"<p>For more detailed information, visit the official Code Server documentation.</p>"},{"location":"services/gitea/","title":"Gitea","text":"<p>Self-hosted Git service for collaborative development.</p>"},{"location":"services/gitea/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/gitea/#features","title":"Features","text":"<ul> <li>Git repository hosting</li> <li>Web-based interface</li> <li>Issue tracking</li> <li>Pull requests</li> <li>Wiki and code review</li> <li>Lightweight and easy to deploy</li> </ul>"},{"location":"services/gitea/#access","title":"Access","text":"<ul> <li>Default Web Port: <code>${GITEA_WEB_PORT:-3030}</code> (default: 3030)</li> <li>Default SSH Port: <code>${GITEA_SSH_PORT:-2222}</code> (default: 2222)</li> <li>URL: <code>http://localhost:${GITEA_WEB_PORT:-3030}</code></li> <li>Default Data Directory: <code>/data/gitea</code></li> </ul>"},{"location":"services/gitea/#configuration","title":"Configuration","text":""},{"location":"services/gitea/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>GITEA__database__DB_TYPE</code>: Database type (e.g., <code>sqlite3</code>, <code>mysql</code>, <code>postgres</code>)</li> <li><code>GITEA__database__HOST</code>: Database host (default: <code>${GITEA_DB_HOST:-gitea-db:3306}</code>)</li> <li><code>GITEA__database__NAME</code>: Database name (default: <code>${GITEA_DB_NAME:-gitea}</code>)</li> <li><code>GITEA__database__USER</code>: Database user (default: <code>${GITEA_DB_USER:-gitea}</code>)</li> <li><code>GITEA__database__PASSWD</code>: Database password (from <code>.env</code>)</li> <li><code>GITEA__server__ROOT_URL</code>: Root URL (e.g., <code>${GITEA_ROOT_URL}</code>)</li> <li><code>GITEA__server__HTTP_PORT</code>: Web port (default: 3000 inside container)</li> <li><code>GITEA__server__DOMAIN</code>: Domain (e.g., <code>${GITEA_DOMAIN}</code>)</li> </ul>"},{"location":"services/gitea/#volumes","title":"Volumes","text":"<ul> <li><code>gitea_data:/data</code>: Gitea configuration and data</li> <li><code>/etc/timezone:/etc/timezone:ro</code></li> <li><code>/etc/localtime:/etc/localtime:ro</code></li> </ul>"},{"location":"services/gitea/#usage","title":"Usage","text":"<ol> <li>Access Gitea at <code>http://localhost:${GITEA_WEB_PORT:-3030}</code></li> <li>Register or log in as an admin user</li> <li>Create or import repositories</li> <li>Collaborate with your team</li> </ol>"},{"location":"services/gitea/#official-documentation","title":"Official Documentation","text":"<p>For more details, visit the official Gitea documentation.</p>"},{"location":"services/homepage/","title":"Homepage","text":"<p>Modern dashboard for accessing all your self-hosted services.</p>"},{"location":"services/homepage/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/homepage/#features","title":"Features","text":"<ul> <li>Service Dashboard: Central hub for all your applications</li> <li>Docker Integration: Automatic service discovery and monitoring</li> <li>Customizable Layout: Flexible grid-based layout system</li> <li>Service Widgets: Live status and metrics for services</li> <li>Quick Search: Fast navigation with built-in search</li> <li>Bookmarks: Organize frequently used links</li> <li>Dark/Light Themes: Multiple color schemes available</li> <li>Responsive Design: Works on desktop and mobile devices</li> </ul>"},{"location":"services/homepage/#access","title":"Access","text":"<ul> <li>Default Port: 3010</li> <li>URL: <code>http://localhost:3010</code></li> <li>Configuration: YAML-based configuration files</li> </ul>"},{"location":"services/homepage/#configuration","title":"Configuration","text":""},{"location":"services/homepage/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>HOMEPAGE_PORT</code>: External port mapping (default: 3010)</li> <li><code>PUID</code>: User ID for file permissions (default: 1000)</li> <li><code>PGID</code>: Group ID for file permissions (default: 1000)</li> <li><code>TZ</code>: Timezone setting (default: Etc/UTC)</li> <li><code>HOMEPAGE_ALLOWED_HOSTS</code>: Allowed hosts for the dashboard</li> </ul>"},{"location":"services/homepage/#configuration-files","title":"Configuration Files","text":"<p>Homepage uses YAML configuration files located in <code>./configs/homepage/</code>:</p> <ul> <li><code>settings.yaml</code>: Global settings and theme configuration</li> <li><code>services.yaml</code>: Service definitions and widgets</li> <li><code>bookmarks.yaml</code>: Bookmark categories and links</li> <li><code>widgets.yaml</code>: Dashboard widgets configuration</li> <li><code>docker.yaml</code>: Docker integration settings</li> </ul>"},{"location":"services/homepage/#volumes","title":"Volumes","text":"<ul> <li><code>./configs/homepage:/app/config</code>: Configuration files</li> <li><code>./assets/icons:/app/public/icons</code>: Custom service icons</li> <li><code>./assets/images:/app/public/images</code>: Background images and assets</li> <li><code>/var/run/docker.sock:/var/run/docker.sock</code>: Docker socket for container monitoring</li> </ul>"},{"location":"services/homepage/#changemaker-lite-services","title":"Changemaker Lite Services","text":"<p>Homepage is pre-configured with all Changemaker Lite services:</p>"},{"location":"services/homepage/#essential-tools","title":"Essential Tools","text":"<ul> <li>Code Server (Port 8888): VS Code in the browser</li> <li>Listmonk (Port 9000): Newsletter & mailing list manager</li> <li>NocoDB (Port 8090): No-code database platform</li> </ul>"},{"location":"services/homepage/#content-documentation","title":"Content & Documentation","text":"<ul> <li>MkDocs (Port 4000): Live documentation server</li> <li>Static Site (Port 4001): Built documentation hosting</li> </ul>"},{"location":"services/homepage/#automation-data","title":"Automation & Data","text":"<ul> <li>n8n (Port 5678): Workflow automation platform</li> <li>PostgreSQL (Port 5432): Database backends</li> </ul>"},{"location":"services/homepage/#customization","title":"Customization","text":""},{"location":"services/homepage/#adding-custom-services","title":"Adding Custom Services","text":"<p>Edit <code>configs/homepage/services.yaml</code> to add new services:</p> <pre><code>- Custom Category:\n - My Service:\n href: http://localhost:8080\n description: Custom service description\n icon: mdi-application\n widget:\n type: ping\n url: http://localhost:8080\n</code></pre>"},{"location":"services/homepage/#custom-icons","title":"Custom Icons","text":"<p>Add custom icons to <code>./assets/icons/</code> directory and reference them in services.yaml:</p> <pre><code>icon: /icons/my-custom-icon.png\n</code></pre>"},{"location":"services/homepage/#themes-and-styling","title":"Themes and Styling","text":"<p>Modify <code>configs/homepage/settings.yaml</code> to customize appearance:</p> <pre><code>theme: dark # or light\ncolor: purple # slate, gray, zinc, neutral, stone, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose\n</code></pre>"},{"location":"services/homepage/#widgets","title":"Widgets","text":"<p>Enable live monitoring widgets in <code>configs/homepage/services.yaml</code>:</p> <pre><code>- Service Name:\n widget:\n type: docker\n container: container-name\n server: my-docker\n</code></pre>"},{"location":"services/homepage/#service-monitoring","title":"Service Monitoring","text":"<p>Homepage can display real-time status information for your services:</p> <ul> <li>Docker Integration: Container status and resource usage</li> <li>HTTP Ping: Service availability monitoring</li> <li>Custom APIs: Integration with service-specific APIs</li> </ul>"},{"location":"services/homepage/#docker-integration","title":"Docker Integration","text":"<p>Homepage monitors Docker containers automatically when configured:</p> <ol> <li>Ensure Docker socket is mounted (<code>/var/run/docker.sock</code>)</li> <li>Configure container mappings in <code>docker.yaml</code></li> <li>Add widget configurations to <code>services.yaml</code></li> </ol>"},{"location":"services/homepage/#security-considerations","title":"Security Considerations","text":"<ul> <li>Homepage runs with limited privileges</li> <li>Configuration files should have appropriate permissions</li> <li>Consider network isolation for production deployments</li> <li>Use HTTPS for external access</li> <li>Regularly update the Homepage image</li> </ul>"},{"location":"services/homepage/#troubleshooting","title":"Troubleshooting","text":""},{"location":"services/homepage/#common-issues","title":"Common Issues","text":"<p>Configuration not loading: Check YAML syntax in configuration files</p> <pre><code>docker logs homepage-changemaker\n</code></pre> <p>Icons not displaying: Verify icon paths and file permissions</p> <pre><code>ls -la ./assets/icons/\n</code></pre> <p>Services not reachable: Verify network connectivity between containers</p> <pre><code>docker exec homepage-changemaker ping service-name\n</code></pre> <p>Widget data not updating: Check Docker socket permissions and container access</p> <pre><code>docker exec homepage-changemaker ls -la /var/run/docker.sock\n</code></pre>"},{"location":"services/homepage/#configuration-examples","title":"Configuration Examples","text":""},{"location":"services/homepage/#basic-service-widget","title":"Basic Service Widget","text":"<pre><code>- 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</code></pre>"},{"location":"services/homepage/#custom-dashboard-layout","title":"Custom Dashboard Layout","text":"<pre><code># settings.yaml\nlayout:\n style: columns\n columns: 3\n\n# Responsive breakpoints\nresponsive:\n mobile: 1\n tablet: 2\n desktop: 3\n</code></pre>"},{"location":"services/homepage/#official-documentation","title":"Official Documentation","text":"<p>For comprehensive configuration guides and advanced features:</p> <ul> <li>Homepage Documentation</li> <li>GitHub Repository</li> <li>Configuration Examples</li> <li>Widget Integrations</li> </ul>"},{"location":"services/listmonk/","title":"Listmonk","text":"<p>Self-hosted newsletter and mailing list manager.</p>"},{"location":"services/listmonk/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/listmonk/#features","title":"Features","text":"<ul> <li>Newsletter and email campaign management</li> <li>Subscriber list management</li> <li>Template system with HTML/markdown support</li> <li>Campaign analytics and tracking</li> <li>API for integration</li> <li>Multi-list support</li> <li>Bounce handling</li> <li>Privacy-focused design</li> </ul>"},{"location":"services/listmonk/#access","title":"Access","text":"<ul> <li>Default Port: 9000</li> <li>URL: <code>http://localhost:9000</code></li> <li>Admin User: Set via <code>LISTMONK_ADMIN_USER</code> environment variable</li> <li>Admin Password: Set via <code>LISTMONK_ADMIN_PASSWORD</code> environment variable</li> </ul>"},{"location":"services/listmonk/#configuration","title":"Configuration","text":""},{"location":"services/listmonk/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>LISTMONK_ADMIN_USER</code>: Admin username</li> <li><code>LISTMONK_ADMIN_PASSWORD</code>: Admin password</li> <li><code>POSTGRES_USER</code>: Database username</li> <li><code>POSTGRES_PASSWORD</code>: Database password</li> <li><code>POSTGRES_DB</code>: Database name</li> </ul>"},{"location":"services/listmonk/#database","title":"Database","text":"<p>Listmonk uses PostgreSQL as its backend database. The database is automatically configured through the docker-compose setup.</p>"},{"location":"services/listmonk/#uploads","title":"Uploads","text":"<ul> <li>Upload directory: <code>./assets/uploads</code></li> <li>Used for media files, templates, and attachments</li> </ul>"},{"location":"services/listmonk/#getting-started","title":"Getting Started","text":"<ol> <li>Access Listmonk at <code>http://localhost:9000</code></li> <li>Log in with your admin credentials</li> <li>Set up your first mailing list</li> <li>Configure SMTP settings for sending emails</li> <li>Import subscribers or create subscription forms</li> <li>Create your first campaign</li> </ol>"},{"location":"services/listmonk/#important-notes","title":"Important Notes","text":"<ul> <li>Configure SMTP settings before sending emails</li> <li>Set up proper domain authentication (SPF, DKIM) for better deliverability</li> <li>Regularly backup your subscriber data and campaigns</li> <li>Monitor bounce rates and maintain list hygiene</li> </ul>"},{"location":"services/listmonk/#official-documentation","title":"Official Documentation","text":"<p>For comprehensive guides and API documentation, visit: - Listmonk Documentation - GitHub Repository</p>"},{"location":"services/map/","title":"Map","text":"<p>Interactive map service for geospatial data visualization, powered by NocoDB and Leaflet.js.</p>"},{"location":"services/map/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/map/#features","title":"Features","text":"<ul> <li>Interactive map visualization with OpenStreetMap</li> <li>Real-time geolocation support</li> <li>Add new locations directly from the map</li> <li>Auto-refresh every 30 seconds</li> <li>Responsive design for mobile devices</li> <li>Secure API proxy to protect credentials</li> <li>Docker containerization for easy deployment</li> </ul>"},{"location":"services/map/#access","title":"Access","text":"<ul> <li>Default Port: <code>${MAP_PORT:-3000}</code> (default: 3000)</li> <li>URL: <code>http://localhost:${MAP_PORT:-3000}</code></li> <li>Default Workspace: <code>/app/public/</code></li> </ul>"},{"location":"services/map/#configuration","title":"Configuration","text":"<p>All configuration is done via environment variables:</p> Variable Description Default <code>NOCODB_API_URL</code> NocoDB API base URL Required <code>NOCODB_API_TOKEN</code> API authentication token Required <code>NOCODB_VIEW_URL</code> Full NocoDB view URL Required <code>PORT</code> Server port 3000 <code>DEFAULT_LAT</code> Default map latitude 53.5461 <code>DEFAULT_LNG</code> Default map longitude -113.4938 <code>DEFAULT_ZOOM</code> Default map zoom level 11"},{"location":"services/map/#volumes","title":"Volumes","text":"<ul> <li><code>./map/app/public</code>: Map public assets</li> </ul>"},{"location":"services/map/#usage","title":"Usage","text":"<ol> <li>Access the map at <code>http://localhost:${MAP_PORT:-3000}</code></li> <li>Search for locations or addresses</li> <li>Add or view custom markers</li> <li>Analyze geospatial data as needed</li> </ol>"},{"location":"services/map/#nocodb-table-setup","title":"NocoDB Table Setup","text":""},{"location":"services/map/#required-columns","title":"Required Columns","text":"<ul> <li><code>geodata</code> (Text): Format \"latitude;longitude\" </li> <li><code>latitude</code> (Decimal): Precision 10, Scale 8</li> <li><code>longitude</code> (Decimal): Precision 11, Scale 8</li> </ul>"},{"location":"services/map/#form-fields-as-seen-in-the-interface","title":"Form Fields (as seen in the interface)","text":"<ul> <li><code>First Name</code> (Text): Person's first name</li> <li><code>Last Name</code> (Text): Person's last name </li> <li><code>Email</code> (Email): Contact email address</li> <li><code>Unit Number</code> (Text): Apartment/unit number</li> <li><code>Support Level</code> (Single Select): </li> <li>1 - Strong Support (Green)</li> <li>2 - Moderate Support (Yellow) </li> <li>3 - Low Support (Orange)</li> <li>4 - No Support (Red)</li> <li><code>Address</code> (Text): Full street address</li> <li><code>Sign</code> (Checkbox): Has campaign sign (true/false)</li> <li><code>Sign Size</code> (Single Select): Small, Medium, Large</li> <li><code>Geo-Location</code> (Text): Formatted as \"latitude;longitude\"</li> </ul>"},{"location":"services/map/#api-endpoints","title":"API Endpoints","text":"<ul> <li><code>GET /api/locations</code> - Fetch all locations</li> <li><code>POST /api/locations</code> - Create new location</li> <li><code>GET /api/locations/:id</code> - Get single location</li> <li><code>PUT /api/locations/:id</code> - Update location</li> <li><code>DELETE /api/locations/:id</code> - Delete location</li> <li><code>GET /health</code> - Health check</li> </ul>"},{"location":"services/map/#security-considerations","title":"Security Considerations","text":"<ul> <li>API tokens are kept server-side only</li> <li>CORS is configured for security</li> <li>Rate limiting prevents abuse</li> <li>Input validation on all endpoints</li> <li>Helmet.js for security headers</li> </ul>"},{"location":"services/map/#troubleshooting","title":"Troubleshooting","text":"<ul> <li>Ensure NocoDB table has required columns and valid coordinates</li> <li>Check API token permissions and network connectivity</li> </ul>"},{"location":"services/map/#official-documentation","title":"Official Documentation","text":"<p>Refer to the project README for more information.</p>"},{"location":"services/mini-qr/","title":"Mini QR","text":"<p>Simple QR code generator service.</p>"},{"location":"services/mini-qr/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/mini-qr/#features","title":"Features","text":"<ul> <li>Generate QR codes for text or URLs</li> <li>Download QR codes as images</li> <li>Simple and fast interface</li> <li>No user registration required</li> </ul>"},{"location":"services/mini-qr/#access","title":"Access","text":"<ul> <li>Default Port: <code>${MINI_QR_PORT:-8089}</code> (default: 8089)</li> <li>URL: <code>http://localhost:${MINI_QR_PORT:-8089}</code></li> </ul>"},{"location":"services/mini-qr/#configuration","title":"Configuration","text":""},{"location":"services/mini-qr/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>QR_DEFAULT_SIZE</code>: Default size of generated QR codes</li> <li><code>QR_IMAGE_FORMAT</code>: Image format (e.g., <code>png</code>, <code>svg</code>)</li> </ul>"},{"location":"services/mini-qr/#volumes","title":"Volumes","text":"<ul> <li><code>./configs/mini-qr</code>: QR code service configuration</li> </ul>"},{"location":"services/mini-qr/#usage","title":"Usage","text":"<ol> <li>Access Mini QR at <code>http://localhost:${MINI_QR_PORT:-8089}</code></li> <li>Enter the text or URL to encode</li> <li>Download or share the generated QR code</li> </ol>"},{"location":"services/mini-qr/#official-documentation","title":"Official Documentation","text":"<p>See the project README for more details.</p>"},{"location":"services/mkdocs/","title":"MkDocs Material","text":"<p>Modern documentation site generator with live preview.</p>"},{"location":"services/mkdocs/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/mkdocs/#features","title":"Features","text":"<ul> <li>Material Design theme</li> <li>Live preview during development</li> <li>Search functionality</li> <li>Navigation and organization</li> <li>Code syntax highlighting</li> <li>Mathematical expressions support</li> <li>Responsive design</li> <li>Customizable themes and colors</li> </ul>"},{"location":"services/mkdocs/#access","title":"Access","text":"<ul> <li>Development Port: 4000</li> <li>Development URL: <code>http://localhost:4000</code></li> <li>Live Reload: Automatically refreshes on file changes</li> </ul>"},{"location":"services/mkdocs/#configuration","title":"Configuration","text":""},{"location":"services/mkdocs/#main-configuration","title":"Main Configuration","text":"<p>Configuration is managed through <code>mkdocs.yml</code> in the project root.</p>"},{"location":"services/mkdocs/#volumes","title":"Volumes","text":"<ul> <li><code>./mkdocs</code>: Documentation source files</li> <li><code>./assets/images</code>: Shared images directory</li> </ul>"},{"location":"services/mkdocs/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>SITE_URL</code>: Base domain for the site</li> <li><code>USER_ID</code>: User ID for file permissions</li> <li><code>GROUP_ID</code>: Group ID for file permissions</li> </ul>"},{"location":"services/mkdocs/#directory-structure","title":"Directory Structure","text":"<pre><code>mkdocs/\n\u251c\u2500\u2500 mkdocs.yml # Configuration file\n\u251c\u2500\u2500 docs/ # Documentation source\n\u2502 \u251c\u2500\u2500 index.md # Homepage\n\u2502 \u251c\u2500\u2500 services/ # Service documentation\n\u2502 \u251c\u2500\u2500 blog/ # Blog posts\n\u2502 \u2514\u2500\u2500 overrides/ # Template overrides\n\u2514\u2500\u2500 site/ # Built static site\n</code></pre>"},{"location":"services/mkdocs/#writing-documentation","title":"Writing Documentation","text":""},{"location":"services/mkdocs/#markdown-basics","title":"Markdown Basics","text":"<ul> <li>Use standard Markdown syntax</li> <li>Support for tables, code blocks, and links</li> <li>Mathematical expressions with MathJax</li> <li>Admonitions for notes and warnings</li> </ul>"},{"location":"services/mkdocs/#example-page","title":"Example Page","text":"<pre><code># 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</code></pre> <p>Note</p> <p>This is an informational note.</p> <pre><code>## 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</code></pre> <p>The built site will be available in the <code>mkdocs/site/</code> directory.</p>"},{"location":"services/mkdocs/#customization","title":"Customization","text":""},{"location":"services/mkdocs/#themes-and-colors","title":"Themes and Colors","text":"<p>Customize appearance in <code>mkdocs.yml</code>:</p> <pre><code>theme:\n name: material\n palette:\n primary: blue\n accent: indigo\n</code></pre>"},{"location":"services/mkdocs/#custom-css","title":"Custom CSS","text":"<p>Add custom styles in <code>docs/stylesheets/extra.css</code>.</p>"},{"location":"services/mkdocs/#official-documentation","title":"Official Documentation","text":"<p>For comprehensive MkDocs Material documentation: - MkDocs Material - MkDocs Documentation - Markdown Guide</p>"},{"location":"services/n8n/","title":"n8n","text":"<p>Workflow automation tool for connecting services and automating tasks.</p>"},{"location":"services/n8n/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/n8n/#features","title":"Features","text":"<ul> <li>Visual workflow editor</li> <li>400+ integrations</li> <li>Custom code execution (JavaScript/Python)</li> <li>Webhook support</li> <li>Scheduled workflows</li> <li>Error handling and retries</li> <li>User management</li> <li>API access</li> <li>Self-hosted and privacy-focused</li> </ul>"},{"location":"services/n8n/#access","title":"Access","text":"<ul> <li>Default Port: 5678</li> <li>URL: <code>http://localhost:5678</code></li> <li>Default User Email: Set via <code>N8N_DEFAULT_USER_EMAIL</code></li> <li>Default User Password: Set via <code>N8N_DEFAULT_USER_PASSWORD</code></li> </ul>"},{"location":"services/n8n/#configuration","title":"Configuration","text":""},{"location":"services/n8n/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>N8N_HOST</code>: Hostname for n8n (default: <code>n8n.${DOMAIN}</code>)</li> <li><code>N8N_PORT</code>: Internal port (5678)</li> <li><code>N8N_PROTOCOL</code>: Protocol for webhooks (https)</li> <li><code>NODE_ENV</code>: Environment (production)</li> <li><code>WEBHOOK_URL</code>: Base URL for webhooks</li> <li><code>GENERIC_TIMEZONE</code>: Timezone setting</li> <li><code>N8N_ENCRYPTION_KEY</code>: Encryption key for credentials</li> <li><code>N8N_USER_MANAGEMENT_DISABLED</code>: Enable/disable user management</li> <li><code>N8N_DEFAULT_USER_EMAIL</code>: Default admin email</li> <li><code>N8N_DEFAULT_USER_PASSWORD</code>: Default admin password</li> </ul>"},{"location":"services/n8n/#volumes","title":"Volumes","text":"<ul> <li><code>n8n_data</code>: Persistent data storage</li> <li><code>./local-files</code>: Local file access for workflows</li> </ul>"},{"location":"services/n8n/#getting-started","title":"Getting Started","text":"<ol> <li>Access n8n at <code>http://localhost:5678</code></li> <li>Log in with your admin credentials</li> <li>Create your first workflow</li> <li>Add nodes for different services</li> <li>Configure connections between nodes</li> <li>Test and activate your workflow</li> </ol>"},{"location":"services/n8n/#common-use-cases","title":"Common Use Cases","text":""},{"location":"services/n8n/#documentation-automation","title":"Documentation Automation","text":"<ul> <li>Auto-generate documentation from code comments</li> <li>Sync documentation between different platforms</li> <li>Notify team when documentation is updated</li> </ul>"},{"location":"services/n8n/#email-campaign-integration","title":"Email Campaign Integration","text":"<ul> <li>Connect Listmonk with external data sources</li> <li>Automate subscriber management</li> <li>Trigger campaigns based on events</li> </ul>"},{"location":"services/n8n/#database-management-with-nocodb","title":"Database Management with NocoDB","text":"<ul> <li>Sync data between NocoDB and external APIs</li> <li>Automate data entry and validation</li> <li>Create backup workflows for database content</li> <li>Generate reports from NocoDB data</li> </ul>"},{"location":"services/n8n/#development-workflows","title":"Development Workflows","text":"<ul> <li>Auto-deploy documentation on git push</li> <li>Sync code changes with documentation</li> <li>Backup automation</li> </ul>"},{"location":"services/n8n/#data-processing","title":"Data Processing","text":"<ul> <li>Process CSV files and import to databases</li> <li>Transform data between different formats</li> <li>Schedule regular data updates</li> </ul>"},{"location":"services/n8n/#example-workflows","title":"Example Workflows","text":""},{"location":"services/n8n/#simple-webhook-to-email","title":"Simple Webhook to Email","text":"<pre><code>Webhook \u2192 Email\n</code></pre>"},{"location":"services/n8n/#scheduled-documentation-backup","title":"Scheduled Documentation Backup","text":"<pre><code>Schedule \u2192 Read Files \u2192 Compress \u2192 Upload to Storage\n</code></pre>"},{"location":"services/n8n/#git-integration","title":"Git Integration","text":"<pre><code>Git Webhook \u2192 Process Changes \u2192 Update Documentation \u2192 Notify Team\n</code></pre>"},{"location":"services/n8n/#security-considerations","title":"Security Considerations","text":"<ul> <li>Use strong encryption keys</li> <li>Secure webhook URLs</li> <li>Regularly update credentials</li> <li>Monitor workflow executions</li> <li>Implement proper error handling</li> </ul>"},{"location":"services/n8n/#integration-with-other-services","title":"Integration with Other Services","text":"<p>n8n can integrate with all services in your Changemaker Lite setup:</p> <ul> <li>Listmonk: Manage subscribers and campaigns</li> <li>PostgreSQL: Read/write database operations</li> <li>Code Server: File operations and git integration</li> <li>MkDocs: Documentation generation and updates</li> </ul>"},{"location":"services/n8n/#troubleshooting","title":"Troubleshooting","text":""},{"location":"services/n8n/#common-issues","title":"Common Issues","text":"<ul> <li>Workflow Execution Errors: Check node configurations and credentials</li> <li>Webhook Issues: Verify URLs and authentication</li> <li>Connection Problems: Check network connectivity between services</li> </ul>"},{"location":"services/n8n/#debugging","title":"Debugging","text":"<pre><code># Check container logs\ndocker logs n8n-changemaker\n\n# Access container shell\ndocker exec -it n8n-changemaker sh\n\n# Check workflow executions in the UI\n# Visit http://localhost:5678 \u2192 Executions\n</code></pre>"},{"location":"services/n8n/#official-documentation","title":"Official Documentation","text":"<p>For comprehensive n8n documentation:</p> <ul> <li>n8n Documentation</li> <li>Community Workflows</li> <li>Node Reference</li> <li>GitHub Repository</li> </ul>"},{"location":"services/nocodb/","title":"NocoDB","text":"<p>No-code database platform that turns any database into a smart spreadsheet.</p>"},{"location":"services/nocodb/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/nocodb/#features","title":"Features","text":"<ul> <li>Smart Spreadsheet Interface: Transform databases into intuitive spreadsheets</li> <li>Form Builder: Create custom forms for data entry</li> <li>API Generation: Auto-generated REST APIs for all tables</li> <li>Collaboration: Real-time collaboration with team members</li> <li>Access Control: Role-based permissions and sharing</li> <li>Data Visualization: Charts and dashboard creation</li> <li>Webhooks: Integration with external services</li> <li>Import/Export: Support for CSV, Excel, and other formats</li> <li>Multi-Database Support: Works with PostgreSQL, MySQL, SQLite, and more</li> </ul>"},{"location":"services/nocodb/#access","title":"Access","text":"<ul> <li>Default Port: 8090</li> <li>URL: <code>http://localhost:8090</code></li> <li>Database: PostgreSQL (dedicated <code>root_db</code> instance)</li> </ul>"},{"location":"services/nocodb/#configuration","title":"Configuration","text":""},{"location":"services/nocodb/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>NOCODB_PORT</code>: External port mapping (default: 8090)</li> <li><code>NC_DB</code>: Database connection string for PostgreSQL backend</li> </ul>"},{"location":"services/nocodb/#database-backend","title":"Database Backend","text":"<p>NocoDB uses a dedicated PostgreSQL instance (<code>root_db</code>) with the following configuration:</p> <ul> <li>Database Name: <code>root_db</code></li> <li>Username: <code>postgres</code></li> <li>Password: <code>password</code></li> <li>Host: <code>root_db</code> (internal container name)</li> </ul>"},{"location":"services/nocodb/#volumes","title":"Volumes","text":"<ul> <li><code>nc_data</code>: Application data and configuration storage</li> <li><code>db_data</code>: PostgreSQL database files</li> </ul>"},{"location":"services/nocodb/#getting-started","title":"Getting Started","text":"<ol> <li>Access NocoDB: Navigate to <code>http://localhost:8090</code></li> <li>Initial Setup: Complete the onboarding process</li> <li>Create Project: Start with a new project or connect existing databases</li> <li>Add Tables: Import data or create new tables</li> <li>Configure Views: Set up different views (Grid, Form, Gallery, etc.)</li> <li>Set Permissions: Configure user access and sharing settings</li> </ol>"},{"location":"services/nocodb/#common-use-cases","title":"Common Use Cases","text":""},{"location":"services/nocodb/#content-management","title":"Content Management","text":"<ul> <li>Create content databases for blogs and websites</li> <li>Manage product catalogs and inventories</li> <li>Track customer information and interactions</li> </ul>"},{"location":"services/nocodb/#project-management","title":"Project Management","text":"<ul> <li>Task and project tracking systems</li> <li>Team collaboration workspaces</li> <li>Resource and timeline management</li> </ul>"},{"location":"services/nocodb/#data-collection","title":"Data Collection","text":"<ul> <li>Custom forms for surveys and feedback</li> <li>Event registration and management</li> <li>Lead capture and CRM systems</li> </ul>"},{"location":"services/nocodb/#integration-with-other-services","title":"Integration with Other Services","text":"<p>NocoDB can integrate well with other Changemaker Lite services:</p> <ul> <li>n8n Integration: Use NocoDB as a data source/destination in automation workflows</li> <li>Listmonk Integration: Manage subscriber lists and campaign data</li> <li>Documentation: Store and manage documentation metadata</li> </ul>"},{"location":"services/nocodb/#api-usage","title":"API Usage","text":"<p>NocoDB automatically generates REST APIs for all your tables:</p> <pre><code># 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</code></pre>"},{"location":"services/nocodb/#backup-and-data-management","title":"Backup and Data Management","text":""},{"location":"services/nocodb/#database-backup","title":"Database Backup","text":"<p>Since NocoDB uses PostgreSQL, you can backup the database:</p> <pre><code># Backup NocoDB database\ndocker exec root_db pg_dump -U postgres root_db > nocodb_backup.sql\n\n# Restore from backup\ndocker exec -i root_db psql -U postgres root_db < nocodb_backup.sql\n</code></pre>"},{"location":"services/nocodb/#application-data","title":"Application Data","text":"<p>Application settings and metadata are stored in the <code>nc_data</code> volume.</p>"},{"location":"services/nocodb/#security-considerations","title":"Security Considerations","text":"<ul> <li>Change default database credentials in production</li> <li>Configure proper access controls within NocoDB</li> <li>Use HTTPS for production deployments</li> <li>Regularly backup both database and application data</li> <li>Monitor access logs and user activities</li> </ul>"},{"location":"services/nocodb/#performance-tips","title":"Performance Tips","text":"<ul> <li>Regular database maintenance and optimization</li> <li>Monitor memory usage for large datasets</li> <li>Use appropriate indexing for frequently queried fields</li> <li>Consider database connection pooling for high-traffic scenarios</li> </ul>"},{"location":"services/nocodb/#troubleshooting","title":"Troubleshooting","text":""},{"location":"services/nocodb/#common-issues","title":"Common Issues","text":"<p>Service won't start: Check if the PostgreSQL database is healthy</p> <pre><code>docker logs root_db\n</code></pre> <p>Database connection errors: Verify database credentials and network connectivity</p> <pre><code>docker exec nocodb nc_data nc\n</code></pre> <p>Performance issues: Monitor resource usage and optimize queries</p> <pre><code>docker stats nocodb root_db\n</code></pre>"},{"location":"services/nocodb/#official-documentation","title":"Official Documentation","text":"<p>For comprehensive guides and advanced features:</p> <ul> <li>NocoDB Documentation</li> <li>GitHub Repository</li> <li>Community Forum</li> </ul>"},{"location":"services/postgresql/","title":"PostgreSQL Database","text":"<p>Reliable database backend for applications.</p>"},{"location":"services/postgresql/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/postgresql/#features","title":"Features","text":"<ul> <li>ACID compliance</li> <li>Advanced SQL features</li> <li>JSON/JSONB support</li> <li>Full-text search</li> <li>Extensibility</li> <li>High performance</li> <li>Reliability and data integrity</li> </ul>"},{"location":"services/postgresql/#access","title":"Access","text":"<ul> <li>Default Port: 5432</li> <li>Host: <code>listmonk-db</code> (internal container name)</li> <li>Database: Set via <code>POSTGRES_DB</code> environment variable</li> <li>Username: Set via <code>POSTGRES_USER</code> environment variable</li> <li>Password: Set via <code>POSTGRES_PASSWORD</code> environment variable</li> </ul>"},{"location":"services/postgresql/#configuration","title":"Configuration","text":""},{"location":"services/postgresql/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>POSTGRES_USER</code>: Database username</li> <li><code>POSTGRES_PASSWORD</code>: Database password </li> <li><code>POSTGRES_DB</code>: Database name</li> </ul>"},{"location":"services/postgresql/#health-checks","title":"Health Checks","text":"<p>The PostgreSQL container includes health checks to ensure the database is ready before dependent services start.</p>"},{"location":"services/postgresql/#data-persistence","title":"Data Persistence","text":"<p>Database data is stored in a Docker volume (<code>listmonk-data</code>) to ensure persistence across container restarts.</p>"},{"location":"services/postgresql/#connecting-to-the-database","title":"Connecting to the Database","text":""},{"location":"services/postgresql/#from-host-machine","title":"From Host Machine","text":"<p>You can connect to PostgreSQL from your host machine using:</p> <pre><code>psql -h localhost -p 5432 -U [username] -d [database]\n</code></pre>"},{"location":"services/postgresql/#from-other-containers","title":"From Other Containers","text":"<p>Other containers can connect using the internal hostname <code>listmonk-db</code> on port 5432.</p>"},{"location":"services/postgresql/#backup-and-restore","title":"Backup and Restore","text":""},{"location":"services/postgresql/#backup","title":"Backup","text":"<pre><code>docker exec listmonk-db pg_dump -U [username] [database] > backup.sql\n</code></pre>"},{"location":"services/postgresql/#restore","title":"Restore","text":"<pre><code>docker exec -i listmonk-db psql -U [username] [database] < backup.sql\n</code></pre>"},{"location":"services/postgresql/#monitoring","title":"Monitoring","text":"<p>Monitor database health and performance through: - Container logs: <code>docker logs listmonk-db</code> - Database metrics and queries - Connection monitoring</p>"},{"location":"services/postgresql/#security-considerations","title":"Security Considerations","text":"<ul> <li>Use strong passwords</li> <li>Regularly update PostgreSQL version</li> <li>Monitor access logs</li> <li>Implement regular backups</li> <li>Consider network isolation</li> </ul>"},{"location":"services/postgresql/#official-documentation","title":"Official Documentation","text":"<p>For comprehensive PostgreSQL documentation: - PostgreSQL Documentation - Docker PostgreSQL Image</p>"},{"location":"services/static-server/","title":"Static Site Server","text":"<p>Nginx-powered static site server for hosting built documentation and websites.</p>"},{"location":"services/static-server/#overview","title":"Overview","text":"<p>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.</p>"},{"location":"services/static-server/#features","title":"Features","text":"<ul> <li>High-performance static file serving</li> <li>Automatic index file handling</li> <li>Gzip compression</li> <li>Caching headers</li> <li>Security headers</li> <li>Custom error pages</li> <li>URL rewriting support</li> </ul>"},{"location":"services/static-server/#access","title":"Access","text":"<ul> <li>Default Port: 4001</li> <li>URL: <code>http://localhost:4001</code></li> <li>Document Root: <code>/config/www</code> (mounted from <code>./mkdocs/site</code>)</li> </ul>"},{"location":"services/static-server/#configuration","title":"Configuration","text":""},{"location":"services/static-server/#environment-variables","title":"Environment Variables","text":"<ul> <li><code>PUID</code>: User ID for file permissions (default: 1000)</li> <li><code>PGID</code>: Group ID for file permissions (default: 1000)</li> <li><code>TZ</code>: Timezone setting (default: Etc/UTC)</li> </ul>"},{"location":"services/static-server/#volumes","title":"Volumes","text":"<ul> <li><code>./mkdocs/site:/config/www</code>: Static site files</li> <li>Built MkDocs site is automatically served</li> </ul>"},{"location":"services/static-server/#usage","title":"Usage","text":"<ol> <li>Build your MkDocs site: <code>docker exec mkdocs-changemaker mkdocs build</code></li> <li>The built site is automatically available at <code>http://localhost:4001</code></li> <li>Any files in <code>./mkdocs/site/</code> will be served statically</li> </ol>"},{"location":"services/static-server/#file-structure","title":"File Structure","text":"<pre><code>mkdocs/site/ # Served at /\n\u251c\u2500\u2500 index.html # Homepage\n\u251c\u2500\u2500 assets/ # CSS, JS, images\n\u251c\u2500\u2500 services/ # Service documentation\n\u2514\u2500\u2500 search/ # Search functionality\n</code></pre>"},{"location":"services/static-server/#performance-features","title":"Performance Features","text":"<ul> <li>Gzip Compression: Automatic compression for text files</li> <li>Browser Caching: Optimized cache headers</li> <li>Fast Static Serving: Nginx optimized for static content</li> <li>Security Headers: Basic security header configuration</li> </ul>"},{"location":"services/static-server/#custom-configuration","title":"Custom Configuration","text":"<p>For advanced Nginx configuration, you can: 1. Create custom Nginx config files 2. Mount them as volumes 3. Restart the container</p>"},{"location":"services/static-server/#monitoring","title":"Monitoring","text":"<p>Monitor the static site server through: - Container logs: <code>docker logs mkdocs-site-server-changemaker</code> - Access logs for traffic analysis - Performance metrics</p>"},{"location":"services/static-server/#troubleshooting","title":"Troubleshooting","text":""},{"location":"services/static-server/#common-issues","title":"Common Issues","text":"<ul> <li>404 Errors: Ensure MkDocs site is built and files exist in <code>./mkdocs/site/</code></li> <li>Permission Issues: Check <code>PUID</code> and <code>PGID</code> settings</li> <li>File Not Found: Verify file paths and case sensitivity</li> </ul>"},{"location":"services/static-server/#debugging","title":"Debugging","text":"<pre><code># Check container logs\ndocker logs mkdocs-site-server-changemaker\n\n# Verify files are present\ndocker exec mkdocs-site-server-changemaker ls -la /config/www\n\n# Test file serving\ncurl -I http://localhost:4001\n</code></pre>"},{"location":"services/static-server/#official-documentation","title":"Official Documentation","text":"<p>For more information about the underlying Nginx server: - LinuxServer.io Nginx - Nginx Documentation</p>"}]} |