6909 lines
165 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Build Power. Not Rent It. Own your digital infrastructure.">
<meta name="author" content="Bunker Operations">
<link rel="canonical" href="https://bnkserve.org/v2/troubleshooting/faq/">
<link rel="prev" href="../">
<link rel="next" href="../common-errors/">
<link rel="icon" href="../../../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
<title>FAQ - Changemaker Lite</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="../../../stylesheets/extra.css">
<link rel="stylesheet" href="../../../stylesheets/home.css">
<link rel="stylesheet" href="../../../assets/css/video-player.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" />
<meta property="og:title" content="FAQ - Changemaker Lite" />
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="og:image" content="https://bnkserve.org/assets/images/social/v2/troubleshooting/faq.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://bnkserve.org/v2/troubleshooting/faq/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="FAQ - Changemaker Lite" />
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/v2/troubleshooting/faq.png" />
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#frequently-asked-questions-faq" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Changemaker Lite" class="md-header__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../../assets/logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Changemaker Lite
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
FAQ
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
V2 Documentation
</a>
</li>
<li class="md-tabs__item">
<a href="../../../phil/" class="md-tabs__link">
Philosophy
</a>
</li>
<li class="md-tabs__item">
<a href="../../../v1/" class="md-tabs__link">
V1 Documentation (Legacy)
</a>
</li>
<li class="md-tabs__item">
<a href="../../../blog/" class="md-tabs__link">
Blog
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Changemaker Lite" class="md-nav__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../../assets/logo.png" alt="logo">
</a>
Changemaker Lite
</label>
<div class="md-nav__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
V2 Documentation
</span>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
V2 Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_2" >
<div class="md-nav__link md-nav__container">
<a href="../../getting-started/" class="md-nav__link ">
<span class="md-ellipsis">
Getting Started
</span>
</a>
<label class="md-nav__link " for="__nav_2_2" id="__nav_2_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../getting-started/quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_3" >
<div class="md-nav__link md-nav__container">
<a href="../../architecture/" class="md-nav__link ">
<span class="md-ellipsis">
Architecture
</span>
</a>
<label class="md-nav__link " for="__nav_2_3" id="__nav_2_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Architecture
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../architecture/dual-api/" class="md-nav__link">
<span class="md-ellipsis">
Dual API System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication & Security
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_4" >
<div class="md-nav__link md-nav__container">
<a href="../../backend/" class="md-nav__link ">
<span class="md-ellipsis">
Backend
</span>
</a>
<label class="md-nav__link " for="__nav_2_4" id="__nav_2_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_4">
<span class="md-nav__icon md-icon"></span>
Backend
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/modules/" class="md-nav__link">
<span class="md-ellipsis">
Modules
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/services/" class="md-nav__link">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/middleware/" class="md-nav__link">
<span class="md-ellipsis">
Middleware
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/utilities/" class="md-nav__link">
<span class="md-ellipsis">
Utilities
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_5" >
<div class="md-nav__link md-nav__container">
<a href="../../frontend/" class="md-nav__link ">
<span class="md-ellipsis">
Frontend
</span>
</a>
<label class="md-nav__link " for="__nav_2_5" id="__nav_2_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Frontend
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/components/" class="md-nav__link">
<span class="md-ellipsis">
Components
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/layouts/" class="md-nav__link">
<span class="md-ellipsis">
Layouts
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/pages/" class="md-nav__link">
<span class="md-ellipsis">
Pages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_6" >
<div class="md-nav__link md-nav__container">
<a href="../../database/" class="md-nav__link ">
<span class="md-ellipsis">
Database
</span>
</a>
<label class="md-nav__link " for="__nav_2_6" id="__nav_2_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../database/schema/" class="md-nav__link">
<span class="md-ellipsis">
Schema Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/migrations/" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/seeding/" class="md-nav__link">
<span class="md-ellipsis">
Seeding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/indexes/" class="md-nav__link">
<span class="md-ellipsis">
Indexes
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../database/models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_7" >
<div class="md-nav__link md-nav__container">
<a href="../../features/" class="md-nav__link ">
<span class="md-ellipsis">
Features
</span>
</a>
<label class="md-nav__link " for="__nav_2_7" id="__nav_2_7_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7">
<span class="md-nav__icon md-icon"></span>
Features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/influence/" class="md-nav__link">
<span class="md-ellipsis">
Influence
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/map/" class="md-nav__link">
<span class="md-ellipsis">
Map
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/landing-pages/" class="md-nav__link">
<span class="md-ellipsis">
Landing Pages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/email-templates/" class="md-nav__link">
<span class="md-ellipsis">
Email Templates
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/media/" class="md-nav__link">
<span class="md-ellipsis">
Media
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/newsletter/" class="md-nav__link">
<span class="md-ellipsis">
Newsletter
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/observability/" class="md-nav__link">
<span class="md-ellipsis">
Observability
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/tunnel/" class="md-nav__link">
<span class="md-ellipsis">
Tunnel
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_8" >
<div class="md-nav__link md-nav__container">
<a href="../../deployment/" class="md-nav__link ">
<span class="md-ellipsis">
Deployment
</span>
</a>
<label class="md-nav__link " for="__nav_2_8" id="__nav_2_8_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Deployment
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../deployment/docker-compose/" class="md-nav__link">
<span class="md-ellipsis">
Docker Compose
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/environment-variables/" class="md-nav__link">
<span class="md-ellipsis">
Environment Variables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/nginx/" class="md-nav__link">
<span class="md-ellipsis">
Nginx Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/ssl-tls/" class="md-nav__link">
<span class="md-ellipsis">
SSL/TLS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/tunneling/" class="md-nav__link">
<span class="md-ellipsis">
Tunneling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/monitoring-stack/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Stack
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/healthchecks/" class="md-nav__link">
<span class="md-ellipsis">
Health Checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/scaling/" class="md-nav__link">
<span class="md-ellipsis">
Scaling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/backup-restore/" class="md-nav__link">
<span class="md-ellipsis">
Backup & Restore
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_9" >
<div class="md-nav__link md-nav__container">
<a href="../../development/" class="md-nav__link ">
<span class="md-ellipsis">
Development
</span>
</a>
<label class="md-nav__link " for="__nav_2_9" id="__nav_2_9_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_9">
<span class="md-nav__icon md-icon"></span>
Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../development/local-setup/" class="md-nav__link">
<span class="md-ellipsis">
Local Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/docker-workflow/" class="md-nav__link">
<span class="md-ellipsis">
Docker Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/git-workflow/" class="md-nav__link">
<span class="md-ellipsis">
Git Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/npm-commands/" class="md-nav__link">
<span class="md-ellipsis">
NPM Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/migrations/" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/typescript/" class="md-nav__link">
<span class="md-ellipsis">
TypeScript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/testing/" class="md-nav__link">
<span class="md-ellipsis">
Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/debugging/" class="md-nav__link">
<span class="md-ellipsis">
Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/code-style/" class="md-nav__link">
<span class="md-ellipsis">
Code Style
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_10" >
<div class="md-nav__link md-nav__container">
<a href="../../api-reference/" class="md-nav__link ">
<span class="md-ellipsis">
API Reference
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_10">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_11" >
<div class="md-nav__link md-nav__container">
<a href="../../user-guides/" class="md-nav__link ">
<span class="md-ellipsis">
User Guides
</span>
</a>
<label class="md-nav__link " for="__nav_2_11" id="__nav_2_11_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_11">
<span class="md-nav__icon md-icon"></span>
User Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user-guides/admin-guide/" class="md-nav__link">
<span class="md-ellipsis">
Admin Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/campaign-manager-guide/" class="md-nav__link">
<span class="md-ellipsis">
Campaign Manager Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/map-organizer-guide/" class="md-nav__link">
<span class="md-ellipsis">
Map Organizer Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/content-editor-guide/" class="md-nav__link">
<span class="md-ellipsis">
Content Editor Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/volunteer-guide/" class="md-nav__link">
<span class="md-ellipsis">
Volunteer Guide
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_12" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<label class="md-nav__link " for="__nav_2_12" id="__nav_2_12_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_12_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2_12">
<span class="md-nav__icon md-icon"></span>
Troubleshooting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
FAQ
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
FAQ
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#general-questions" class="md-nav__link">
<span class="md-ellipsis">
General Questions
</span>
</a>
<nav class="md-nav" aria-label="General Questions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-changemaker-lite" class="md-nav__link">
<span class="md-ellipsis">
What is Changemaker Lite?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#v1-vs-v2-differences" class="md-nav__link">
<span class="md-ellipsis">
V1 vs V2 Differences
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#system-requirements" class="md-nav__link">
<span class="md-ellipsis">
System Requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#browser-compatibility" class="md-nav__link">
<span class="md-ellipsis">
Browser Compatibility
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#installation-setup" class="md-nav__link">
<span class="md-ellipsis">
Installation &amp; Setup
</span>
</a>
<nav class="md-nav" aria-label="Installation &amp; Setup">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-install" class="md-nav__link">
<span class="md-ellipsis">
How to Install?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#default-credentials" class="md-nav__link">
<span class="md-ellipsis">
Default Credentials
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-change-password" class="md-nav__link">
<span class="md-ellipsis">
How to Change Password?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-enable-https" class="md-nav__link">
<span class="md-ellipsis">
How to Enable HTTPS?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#user-management" class="md-nav__link">
<span class="md-ellipsis">
User Management
</span>
</a>
<nav class="md-nav" aria-label="User Management">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-create-users" class="md-nav__link">
<span class="md-ellipsis">
How to Create Users?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-reset-passwords" class="md-nav__link">
<span class="md-ellipsis">
How to Reset Passwords?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-are-the-user-roles" class="md-nav__link">
<span class="md-ellipsis">
What are the User Roles?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-suspend-users" class="md-nav__link">
<span class="md-ellipsis">
How to Suspend Users?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#campaigns" class="md-nav__link">
<span class="md-ellipsis">
Campaigns
</span>
</a>
<nav class="md-nav" aria-label="Campaigns">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-create-campaign" class="md-nav__link">
<span class="md-ellipsis">
How to Create Campaign?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-publish-campaign" class="md-nav__link">
<span class="md-ellipsis">
How to Publish Campaign?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-track-emails" class="md-nav__link">
<span class="md-ellipsis">
How to Track Emails?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-moderate-responses" class="md-nav__link">
<span class="md-ellipsis">
How to Moderate Responses?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#map-canvassing" class="md-nav__link">
<span class="md-ellipsis">
Map &amp; Canvassing
</span>
</a>
<nav class="md-nav" aria-label="Map &amp; Canvassing">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-import-locations" class="md-nav__link">
<span class="md-ellipsis">
How to Import Locations?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-create-cuts" class="md-nav__link">
<span class="md-ellipsis">
How to Create Cuts?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-organize-shifts" class="md-nav__link">
<span class="md-ellipsis">
How to Organize Shifts?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-start-canvassing" class="md-nav__link">
<span class="md-ellipsis">
How to Start Canvassing?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#technical-questions" class="md-nav__link">
<span class="md-ellipsis">
Technical Questions
</span>
</a>
<nav class="md-nav" aria-label="Technical Questions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#which-database" class="md-nav__link">
<span class="md-ellipsis">
Which Database?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#which-orm" class="md-nav__link">
<span class="md-ellipsis">
Which ORM?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-architecture" class="md-nav__link">
<span class="md-ellipsis">
API Architecture?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authentication-method" class="md-nav__link">
<span class="md-ellipsis">
Authentication Method?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#performance" class="md-nav__link">
<span class="md-ellipsis">
Performance
</span>
</a>
<nav class="md-nav" aria-label="Performance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-many-users-supported" class="md-nav__link">
<span class="md-ellipsis">
How Many Users Supported?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-scale" class="md-nav__link">
<span class="md-ellipsis">
How to Scale?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-size-limits" class="md-nav__link">
<span class="md-ellipsis">
Database Size Limits?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#security" class="md-nav__link">
<span class="md-ellipsis">
Security
</span>
</a>
<nav class="md-nav" aria-label="Security">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#is-data-encrypted" class="md-nav__link">
<span class="md-ellipsis">
Is Data Encrypted?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#password-requirements" class="md-nav__link">
<span class="md-ellipsis">
Password Requirements?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-backup" class="md-nav__link">
<span class="md-ellipsis">
How to Backup?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#where-are-logs" class="md-nav__link">
<span class="md-ellipsis">
Where are Logs?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-restart-services" class="md-nav__link">
<span class="md-ellipsis">
How to Restart Services?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-reset-database" class="md-nav__link">
<span class="md-ellipsis">
How to Reset Database?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#getting-help" class="md-nav__link">
<span class="md-ellipsis">
Getting Help
</span>
</a>
<nav class="md-nav" aria-label="Getting Help">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#documentation-links" class="md-nav__link">
<span class="md-ellipsis">
Documentation Links
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#github-issues" class="md-nav__link">
<span class="md-ellipsis">
GitHub Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#community-support" class="md-nav__link">
<span class="md-ellipsis">
Community Support
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../common-errors/" class="md-nav__link">
<span class="md-ellipsis">
Common Errors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../auth-issues/" class="md-nav__link">
<span class="md-ellipsis">
Auth Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../database-issues/" class="md-nav__link">
<span class="md-ellipsis">
Database Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docker-issues/" class="md-nav__link">
<span class="md-ellipsis">
Docker Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../email-issues/" class="md-nav__link">
<span class="md-ellipsis">
Email Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../geocoding-issues/" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../monitoring-issues/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../performance-optimization/" class="md-nav__link">
<span class="md-ellipsis">
Performance Optimization
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_13" >
<div class="md-nav__link md-nav__container">
<a href="../../migration/" class="md-nav__link ">
<span class="md-ellipsis">
Migration
</span>
</a>
<label class="md-nav__link " for="__nav_2_13" id="__nav_2_13_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_13">
<span class="md-nav__icon md-icon"></span>
Migration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../migration/feature-parity/" class="md-nav__link">
<span class="md-ellipsis">
Feature Parity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/breaking-changes/" class="md-nav__link">
<span class="md-ellipsis">
Breaking Changes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/api-changes/" class="md-nav__link">
<span class="md-ellipsis">
API Changes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/data-migration/" class="md-nav__link">
<span class="md-ellipsis">
Data Migration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_14" >
<div class="md-nav__link md-nav__container">
<a href="../../contributing/" class="md-nav__link ">
<span class="md-ellipsis">
Contributing
</span>
</a>
<label class="md-nav__link " for="__nav_2_14" id="__nav_2_14_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_14">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../contributing/development-setup/" class="md-nav__link">
<span class="md-ellipsis">
Development Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/code-of-conduct/" class="md-nav__link">
<span class="md-ellipsis">
Code of Conduct
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/pull-requests/" class="md-nav__link">
<span class="md-ellipsis">
Pull Requests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/roadmap/" class="md-nav__link">
<span class="md-ellipsis">
Roadmap
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../phil/" class="md-nav__link">
<span class="md-ellipsis">
Philosophy
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../v1/" class="md-nav__link">
<span class="md-ellipsis">
V1 Documentation (Legacy)
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../blog/" class="md-nav__link">
<span class="md-ellipsis">
Blog
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#general-questions" class="md-nav__link">
<span class="md-ellipsis">
General Questions
</span>
</a>
<nav class="md-nav" aria-label="General Questions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-changemaker-lite" class="md-nav__link">
<span class="md-ellipsis">
What is Changemaker Lite?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#v1-vs-v2-differences" class="md-nav__link">
<span class="md-ellipsis">
V1 vs V2 Differences
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#system-requirements" class="md-nav__link">
<span class="md-ellipsis">
System Requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#browser-compatibility" class="md-nav__link">
<span class="md-ellipsis">
Browser Compatibility
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#installation-setup" class="md-nav__link">
<span class="md-ellipsis">
Installation &amp; Setup
</span>
</a>
<nav class="md-nav" aria-label="Installation &amp; Setup">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-install" class="md-nav__link">
<span class="md-ellipsis">
How to Install?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#default-credentials" class="md-nav__link">
<span class="md-ellipsis">
Default Credentials
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-change-password" class="md-nav__link">
<span class="md-ellipsis">
How to Change Password?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-enable-https" class="md-nav__link">
<span class="md-ellipsis">
How to Enable HTTPS?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#user-management" class="md-nav__link">
<span class="md-ellipsis">
User Management
</span>
</a>
<nav class="md-nav" aria-label="User Management">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-create-users" class="md-nav__link">
<span class="md-ellipsis">
How to Create Users?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-reset-passwords" class="md-nav__link">
<span class="md-ellipsis">
How to Reset Passwords?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-are-the-user-roles" class="md-nav__link">
<span class="md-ellipsis">
What are the User Roles?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-suspend-users" class="md-nav__link">
<span class="md-ellipsis">
How to Suspend Users?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#campaigns" class="md-nav__link">
<span class="md-ellipsis">
Campaigns
</span>
</a>
<nav class="md-nav" aria-label="Campaigns">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-create-campaign" class="md-nav__link">
<span class="md-ellipsis">
How to Create Campaign?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-publish-campaign" class="md-nav__link">
<span class="md-ellipsis">
How to Publish Campaign?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-track-emails" class="md-nav__link">
<span class="md-ellipsis">
How to Track Emails?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-moderate-responses" class="md-nav__link">
<span class="md-ellipsis">
How to Moderate Responses?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#map-canvassing" class="md-nav__link">
<span class="md-ellipsis">
Map &amp; Canvassing
</span>
</a>
<nav class="md-nav" aria-label="Map &amp; Canvassing">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-to-import-locations" class="md-nav__link">
<span class="md-ellipsis">
How to Import Locations?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-create-cuts" class="md-nav__link">
<span class="md-ellipsis">
How to Create Cuts?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-organize-shifts" class="md-nav__link">
<span class="md-ellipsis">
How to Organize Shifts?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-start-canvassing" class="md-nav__link">
<span class="md-ellipsis">
How to Start Canvassing?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#technical-questions" class="md-nav__link">
<span class="md-ellipsis">
Technical Questions
</span>
</a>
<nav class="md-nav" aria-label="Technical Questions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#which-database" class="md-nav__link">
<span class="md-ellipsis">
Which Database?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#which-orm" class="md-nav__link">
<span class="md-ellipsis">
Which ORM?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-architecture" class="md-nav__link">
<span class="md-ellipsis">
API Architecture?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authentication-method" class="md-nav__link">
<span class="md-ellipsis">
Authentication Method?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#performance" class="md-nav__link">
<span class="md-ellipsis">
Performance
</span>
</a>
<nav class="md-nav" aria-label="Performance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-many-users-supported" class="md-nav__link">
<span class="md-ellipsis">
How Many Users Supported?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-scale" class="md-nav__link">
<span class="md-ellipsis">
How to Scale?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-size-limits" class="md-nav__link">
<span class="md-ellipsis">
Database Size Limits?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#security" class="md-nav__link">
<span class="md-ellipsis">
Security
</span>
</a>
<nav class="md-nav" aria-label="Security">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#is-data-encrypted" class="md-nav__link">
<span class="md-ellipsis">
Is Data Encrypted?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#password-requirements" class="md-nav__link">
<span class="md-ellipsis">
Password Requirements?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-backup" class="md-nav__link">
<span class="md-ellipsis">
How to Backup?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#where-are-logs" class="md-nav__link">
<span class="md-ellipsis">
Where are Logs?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-restart-services" class="md-nav__link">
<span class="md-ellipsis">
How to Restart Services?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-reset-database" class="md-nav__link">
<span class="md-ellipsis">
How to Reset Database?
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#getting-help" class="md-nav__link">
<span class="md-ellipsis">
Getting Help
</span>
</a>
<nav class="md-nav" aria-label="Getting Help">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#documentation-links" class="md-nav__link">
<span class="md-ellipsis">
Documentation Links
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#github-issues" class="md-nav__link">
<span class="md-ellipsis">
GitHub Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#community-support" class="md-nav__link">
<span class="md-ellipsis">
Community Support
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../../.." class="md-path__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../" class="md-path__link">
<span class="md-ellipsis">
V2 Documentation
</span>
</a>
</li>
<li class="md-path__item">
<a href="../" class="md-path__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/troubleshooting/faq.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/troubleshooting/faq.md" title="View source of this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<h1 id="frequently-asked-questions-faq">Frequently Asked Questions (FAQ)<a class="headerlink" href="#frequently-asked-questions-faq" title="Permanent link">&para;</a></h1>
<p>Comprehensive answers to common questions about Changemaker Lite V2.</p>
<h2 id="general-questions">General Questions<a class="headerlink" href="#general-questions" title="Permanent link">&para;</a></h2>
<h3 id="what-is-changemaker-lite">What is Changemaker Lite?<a class="headerlink" href="#what-is-changemaker-lite" title="Permanent link">&para;</a></h3>
<p><strong>Changemaker Lite</strong> is a self-hosted political campaign platform that consolidates:</p>
<ul>
<li><strong>Advocacy email campaigns</strong> - Contact elected representatives</li>
<li><strong>Geographic mapping</strong> - Location management and visualization</li>
<li><strong>Canvassing system</strong> - Door-to-door volunteer coordination</li>
<li><strong>Volunteer management</strong> - Shift scheduling and tracking</li>
<li><strong>Landing pages</strong> - Custom campaign pages with GrapesJS editor</li>
<li><strong>Newsletter platform</strong> - Listmonk integration for marketing emails</li>
<li><strong>Media library</strong> - Video management and public galleries</li>
<li><strong>Admin dashboard</strong> - Comprehensive management interface</li>
</ul>
<p><strong>Key features:</strong></p>
<ul>
<li>100% self-hosted (no external services required except email)</li>
<li>Docker Compose deployment (single command to start)</li>
<li>Full TypeScript stack (type-safe development)</li>
<li>Production-ready security (JWT auth, bcrypt passwords, rate limiting)</li>
<li>Monitoring included (Prometheus + Grafana)</li>
<li>Canadian electoral data support (NAR format)</li>
</ul>
<hr />
<h3 id="v1-vs-v2-differences">V1 vs V2 Differences<a class="headerlink" href="#v1-vs-v2-differences" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Aspect</th>
<th>V1</th>
<th>V2</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Architecture</strong></td>
<td>Two separate Node apps (Influence + Map)</td>
<td>Single unified Express API</td>
</tr>
<tr>
<td><strong>Database</strong></td>
<td>NocoDB REST API</td>
<td>PostgreSQL 16 + Prisma ORM</td>
</tr>
<tr>
<td><strong>Authentication</strong></td>
<td>Sessions (express-session)</td>
<td>JWT (access + refresh tokens)</td>
</tr>
<tr>
<td><strong>Frontend</strong></td>
<td>EJS templates</td>
<td>React + Vite + Ant Design</td>
</tr>
<tr>
<td><strong>State</strong></td>
<td>Server-side</td>
<td>Zustand (client-side)</td>
</tr>
<tr>
<td><strong>Email</strong></td>
<td>Bull queues</td>
<td>BullMQ queues</td>
</tr>
<tr>
<td><strong>Monitoring</strong></td>
<td>Basic logging</td>
<td>Prometheus + Grafana + Alertmanager</td>
</tr>
<tr>
<td><strong>Security</strong></td>
<td>Basic</td>
<td>Production-grade (audit completed)</td>
</tr>
<tr>
<td><strong>Status</strong></td>
<td>Legacy (reference only)</td>
<td>Current (active development)</td>
</tr>
</tbody>
</table>
<p><strong>Migration path:</strong> V1 → V2 requires data export/import. See <a href="../migration/v1-to-v2.md">Migration Guide</a>.</p>
<hr />
<h3 id="system-requirements">System Requirements<a class="headerlink" href="#system-requirements" title="Permanent link">&para;</a></h3>
<p><strong>Minimum (Development):</strong></p>
<ul>
<li><strong>CPU:</strong> 2 cores</li>
<li><strong>RAM:</strong> 4GB</li>
<li><strong>Disk:</strong> 10GB</li>
<li><strong>OS:</strong> Linux, macOS, or Windows with WSL2</li>
<li><strong>Docker:</strong> 20.10+ and Docker Compose v2+</li>
</ul>
<p><strong>Recommended (Production):</strong></p>
<ul>
<li><strong>CPU:</strong> 4+ cores</li>
<li><strong>RAM:</strong> 8-16GB</li>
<li><strong>Disk:</strong> 50GB+ SSD</li>
<li><strong>OS:</strong> Ubuntu 22.04 LTS or similar</li>
<li><strong>Docker:</strong> Latest stable version</li>
</ul>
<p><strong>External services (optional):</strong></p>
<ul>
<li>SMTP server (for emails) - can use Gmail, SendGrid, Mailgun, etc.</li>
<li>Pangolin/Cloudflare tunnel (for HTTPS) - or use your own reverse proxy</li>
</ul>
<hr />
<h3 id="browser-compatibility">Browser Compatibility<a class="headerlink" href="#browser-compatibility" title="Permanent link">&para;</a></h3>
<p><strong>Supported browsers:</strong></p>
<ul>
<li>✅ Chrome 90+ (recommended)</li>
<li>✅ Firefox 88+</li>
<li>✅ Safari 14+</li>
<li>✅ Edge 90+</li>
<li>❌ Internet Explorer (not supported)</li>
</ul>
<p><strong>Mobile browsers:</strong></p>
<ul>
<li>✅ Chrome on Android</li>
<li>✅ Safari on iOS</li>
<li>⚠️ Some features desktop-only (GrapesJS editor, map drawing)</li>
</ul>
<p><strong>Required features:</strong></p>
<ul>
<li>JavaScript enabled</li>
<li>Local Storage enabled</li>
<li>Cookies enabled (for Listmonk only)</li>
<li>WebSockets supported (for real-time features)</li>
</ul>
<hr />
<h2 id="installation-setup">Installation &amp; Setup<a class="headerlink" href="#installation-setup" title="Permanent link">&para;</a></h2>
<h3 id="how-to-install">How to Install?<a class="headerlink" href="#how-to-install" title="Permanent link">&para;</a></h3>
<p><strong>Quick start:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># 1. Clone repository</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>git<span class="w"> </span>clone<span class="w"> </span>&lt;repo-url&gt;<span class="w"> </span>changemaker.lite
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nb">cd</span><span class="w"> </span>changemaker.lite
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>git<span class="w"> </span>checkout<span class="w"> </span>v2
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="c1"># 2. Create environment file</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>nano<span class="w"> </span>.env<span class="w"> </span><span class="c1"># Edit and set passwords/secrets</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="c1"># 3. Start services</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>v2-postgres<span class="w"> </span>redis<span class="w"> </span>api<span class="w"> </span>admin
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="c1"># 4. Run migrations</span>
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a>
</span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a><span class="c1"># 5. Access application</span>
</span><span id="__span-0-18"><a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a><span class="c1"># Admin GUI: http://localhost:3000</span>
</span><span id="__span-0-19"><a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="c1"># API: http://localhost:4000</span>
</span><span id="__span-0-20"><a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="c1"># Login: admin@example.com / Admin123!</span>
</span><span id="__span-0-21"><a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a>
</span><span id="__span-0-22"><a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="c1"># 6. Change default password immediately</span>
</span></code></pre></div>
<p>See <a href="../user/installation.md">Installation Guide</a> for detailed instructions.</p>
<hr />
<h3 id="default-credentials">Default Credentials<a class="headerlink" href="#default-credentials" title="Permanent link">&para;</a></h3>
<p><strong>Admin user (created by seed):</strong></p>
<ul>
<li><strong>Email:</strong> admin@example.com</li>
<li><strong>Password:</strong> Admin123!</li>
<li><strong>Role:</strong> SUPER_ADMIN</li>
</ul>
<p>⚠️ <strong>IMPORTANT:</strong> Change this password immediately after first login!</p>
<p><strong>Other services:</strong></p>
<ul>
<li><strong>Grafana:</strong> admin / admin</li>
<li><strong>NocoDB:</strong> Set via NC_ADMIN_EMAIL / NC_ADMIN_PASSWORD in .env</li>
<li><strong>Listmonk:</strong> Set via LISTMONK_WEB_ADMIN_USER / LISTMONK_WEB_ADMIN_PASSWORD in .env</li>
</ul>
<hr />
<h3 id="how-to-change-password">How to Change Password?<a class="headerlink" href="#how-to-change-password" title="Permanent link">&para;</a></h3>
<p><strong>Via Admin UI (recommended):</strong></p>
<ol>
<li>Login to admin at http://localhost:3000</li>
<li>Navigate to Users (/app/users)</li>
<li>Click user row</li>
<li>Click Edit</li>
<li>Enter new password (12+ chars, uppercase, lowercase, digit)</li>
<li>Save</li>
</ol>
<p><strong>Via database:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="c1"># Generate bcrypt hash</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>node<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="s2">const bcrypt = require(&#39;bcryptjs&#39;);</span>
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="s2">console.log(bcrypt.hashSync(&#39;NewPassword123!&#39;, 10));</span>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="s2">&quot;</span>
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a>
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="c1"># Update password</span>
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>changemaker<span class="w"> </span>-d<span class="w"> </span>changemaker_v2<span class="w"> </span><span class="se">\</span>
</span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="w"> </span>-c<span class="w"> </span><span class="s2">&quot;UPDATE \&quot;User\&quot; SET password = &#39;PASTE_HASH_HERE&#39; WHERE email = &#39;admin@example.com&#39;;&quot;</span>
</span></code></pre></div>
<p><strong>Password requirements:</strong></p>
<ul>
<li>Minimum 12 characters</li>
<li>At least 1 uppercase letter</li>
<li>At least 1 lowercase letter</li>
<li>At least 1 digit</li>
<li>No maximum length</li>
</ul>
<hr />
<h3 id="how-to-enable-https">How to Enable HTTPS?<a class="headerlink" href="#how-to-enable-https" title="Permanent link">&para;</a></h3>
<p>Changemaker Lite doesn't include HTTPS natively. Use one of these options:</p>
<p><strong>Option 1: Pangolin Tunnel (Recommended)</strong></p>
<p>Built-in integration:</p>
<ol>
<li>Navigate to <code>/app/pangolin</code></li>
<li>Follow setup wizard</li>
<li>Configure tunnel</li>
<li>Access via HTTPS URL provided by Pangolin</li>
</ol>
<p>See <a href="../features/pangolin.md">Pangolin Integration</a>.</p>
<p><strong>Option 2: Cloudflare Tunnel</strong></p>
<ol>
<li>Install cloudflared</li>
<li>Configure tunnel</li>
<li>Point to localhost:3000 (admin) and localhost:4000 (API)</li>
</ol>
<p><strong>Option 3: Reverse Proxy</strong></p>
<p>Add nginx/Caddy in front:</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># docker-compose.yml</span>
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="nt">reverse-proxy</span><span class="p">:</span>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">nginx:alpine</span>
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;443:443&quot;</span>
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span>
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./nginx/ssl.conf:/etc/nginx/nginx.conf</span>
</span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./ssl:/etc/nginx/ssl</span><span class="w"> </span><span class="c1"># Your SSL certificates</span>
</span></code></pre></div>
<p><strong>Option 4: Hosting Provider</strong></p>
<p>Deploy to provider with built-in HTTPS:
- DigitalOcean App Platform
- Heroku
- Railway
- Render</p>
<hr />
<h2 id="user-management">User Management<a class="headerlink" href="#user-management" title="Permanent link">&para;</a></h2>
<h3 id="how-to-create-users">How to Create Users?<a class="headerlink" href="#how-to-create-users" title="Permanent link">&para;</a></h3>
<p><strong>Via Admin UI (recommended):</strong></p>
<ol>
<li>Navigate to <code>/app/users</code></li>
<li>Click "Create User"</li>
<li>Fill in form:</li>
<li>Email (required, unique)</li>
<li>Password (required, 12+ chars)</li>
<li>Name (required)</li>
<li>Role (default: USER)</li>
<li>Click "Create"</li>
</ol>
<p><strong>Via API:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>curl<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>http://localhost:4000/api/auth/register<span class="w"> </span><span class="se">\</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span>-H<span class="w"> </span><span class="s2">&quot;Content-Type: application/json&quot;</span><span class="w"> </span><span class="se">\</span>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span>-d<span class="w"> </span><span class="s1">&#39;{</span>
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="s1"> &quot;email&quot;: &quot;newuser@example.com&quot;,</span>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="s1"> &quot;password&quot;: &quot;SecurePass123!&quot;,</span>
</span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="s1"> &quot;name&quot;: &quot;New User&quot;</span>
</span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="s1"> }&#39;</span>
</span></code></pre></div>
<p><strong>Via database:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Generate password hash first</span>
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>node<span class="w"> </span>-e<span class="w"> </span><span class="s2">&quot;</span>
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="s2">const bcrypt = require(&#39;bcryptjs&#39;);</span>
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="s2">console.log(bcrypt.hashSync(&#39;Password123!&#39;, 10));</span>
</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="s2">&quot;</span>
</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>
</span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="c1"># Create user</span>
</span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>changemaker<span class="w"> </span>-d<span class="w"> </span>changemaker_v2<span class="w"> </span><span class="se">\</span>
</span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span>-c<span class="w"> </span><span class="s2">&quot;INSERT INTO \&quot;User\&quot; (id, email, password, name, role)</span>
</span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="s2"> VALUES (gen_random_uuid(), &#39;user@example.com&#39;, &#39;HASH_HERE&#39;, &#39;User Name&#39;, &#39;USER&#39;);&quot;</span>
</span></code></pre></div>
<hr />
<h3 id="how-to-reset-passwords">How to Reset Passwords?<a class="headerlink" href="#how-to-reset-passwords" title="Permanent link">&para;</a></h3>
<p><strong>Current:</strong> V2 doesn't have password reset flow yet (planned for Phase 15).</p>
<p><strong>Workaround:</strong> Reset manually via database (see "How to Change Password?" above).</p>
<p><strong>Future:</strong> Will include:
- Forgot password form
- Email with reset link
- 24-hour expiration
- One-time use tokens</p>
<hr />
<h3 id="what-are-the-user-roles">What are the User Roles?<a class="headerlink" href="#what-are-the-user-roles" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Role</th>
<th>Level</th>
<th>Capabilities</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SUPER_ADMIN</strong></td>
<td>5</td>
<td>Full access to everything (users, settings, all features)</td>
</tr>
<tr>
<td><strong>INFLUENCE_ADMIN</strong></td>
<td>4</td>
<td>Manage campaigns, responses, email queue</td>
</tr>
<tr>
<td><strong>MAP_ADMIN</strong></td>
<td>3</td>
<td>Manage locations, cuts, shifts, canvassing</td>
</tr>
<tr>
<td><strong>USER</strong></td>
<td>2</td>
<td>View public content, participate in canvassing (if assigned)</td>
</tr>
<tr>
<td><strong>TEMP</strong></td>
<td>1</td>
<td>Very limited - shift signup confirmation only</td>
</tr>
</tbody>
</table>
<p><strong>Permission matrix:</strong></p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>SUPER_ADMIN</th>
<th>INFLUENCE_ADMIN</th>
<th>MAP_ADMIN</th>
<th>USER</th>
<th>TEMP</th>
</tr>
</thead>
<tbody>
<tr>
<td>User management</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Site settings</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Campaigns (admin)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Responses (moderation)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Email queue</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Locations (admin)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Cuts (admin)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Shifts (admin)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Canvass dashboard</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>View public campaigns</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>View public map</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Sign up for shifts</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Canvass (volunteer)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p><strong>Login redirects:</strong></p>
<ul>
<li>SUPER_ADMIN / INFLUENCE_ADMIN / MAP_ADMIN → <code>/app</code> (admin dashboard)</li>
<li>USER / TEMP → <code>/volunteer</code> (volunteer portal)</li>
</ul>
<hr />
<h3 id="how-to-suspend-users">How to Suspend Users?<a class="headerlink" href="#how-to-suspend-users" title="Permanent link">&para;</a></h3>
<p><strong>Current:</strong> V2 doesn't have user suspension yet (planned for Phase 15).</p>
<p><strong>Workaround:</strong> Delete user account or change role to TEMP (limited permissions).</p>
<p><strong>Future:</strong> Will include:
- Suspended flag on User model
- Suspension reason tracking
- Auto-logout suspended users
- Reactivation workflow</p>
<hr />
<h2 id="campaigns">Campaigns<a class="headerlink" href="#campaigns" title="Permanent link">&para;</a></h2>
<h3 id="how-to-create-campaign">How to Create Campaign?<a class="headerlink" href="#how-to-create-campaign" title="Permanent link">&para;</a></h3>
<ol>
<li>Navigate to <code>/app/influence/campaigns</code></li>
<li>Click "Create Campaign"</li>
<li>Fill in form:</li>
<li><strong>Name</strong> (required) - Campaign title</li>
<li><strong>Slug</strong> (required, unique) - URL-friendly name</li>
<li><strong>Description</strong> (optional) - Campaign details</li>
<li><strong>Email Subject</strong> (optional) - Default email subject</li>
<li><strong>Email Body</strong> (optional) - Default email template</li>
<li><strong>Active</strong> (checkbox) - Show on public site</li>
<li><strong>Allow Custom Message</strong> (checkbox) - Let users edit message</li>
<li>Click "Create"</li>
<li>Campaign now appears in admin table and public listing (if active)</li>
</ol>
<hr />
<h3 id="how-to-publish-campaign">How to Publish Campaign?<a class="headerlink" href="#how-to-publish-campaign" title="Permanent link">&para;</a></h3>
<ol>
<li>Navigate to <code>/app/influence/campaigns</code></li>
<li>Find campaign in table</li>
<li>Click row to expand</li>
<li>Toggle "Active" switch to ON</li>
<li>Campaign now visible at <code>/campaigns</code> (public)</li>
</ol>
<hr />
<h3 id="how-to-track-emails">How to Track Emails?<a class="headerlink" href="#how-to-track-emails" title="Permanent link">&para;</a></h3>
<ol>
<li>Navigate to <code>/app/influence/campaigns</code></li>
<li>Click campaign row</li>
<li>Click "View Emails" button</li>
<li>Drawer shows:</li>
<li>Total emails sent</li>
<li>Email list with timestamps</li>
<li>Recipient addresses</li>
<li>Email status (sent/failed)</li>
</ol>
<p><strong>Via Email Queue Page:</strong></p>
<ol>
<li>Navigate to <code>/app/influence/email-queue</code></li>
<li>View stats:</li>
<li>Total emails processed</li>
<li>Success/fail counts</li>
<li>Queue depth</li>
<li>View recent jobs</li>
<li>Retry failed jobs if needed</li>
</ol>
<hr />
<h3 id="how-to-moderate-responses">How to Moderate Responses?<a class="headerlink" href="#how-to-moderate-responses" title="Permanent link">&para;</a></h3>
<ol>
<li>Navigate to <code>/app/influence/responses</code></li>
<li>Table shows all responses with:</li>
<li>Participant name/email</li>
<li>Campaign</li>
<li>Message excerpt</li>
<li>Submission timestamp</li>
<li>Verification status</li>
<li>Filters:</li>
<li>Campaign dropdown</li>
<li>Verified/unverified toggle</li>
<li>Click row to view full response</li>
<li>Actions:</li>
<li>Verify (if unverified)</li>
<li>Delete (if inappropriate)</li>
</ol>
<p><strong>Response verification workflow:</strong></p>
<ol>
<li>User submits response → marked unverified</li>
<li>User receives verification email</li>
<li>User clicks verification link → marked verified</li>
<li>Only verified responses show on public response wall</li>
</ol>
<hr />
<h2 id="map-canvassing">Map &amp; Canvassing<a class="headerlink" href="#map-canvassing" title="Permanent link">&para;</a></h2>
<h3 id="how-to-import-locations">How to Import Locations?<a class="headerlink" href="#how-to-import-locations" title="Permanent link">&para;</a></h3>
<p><strong>Via CSV:</strong></p>
<ol>
<li>Navigate to <code>/app/map/locations</code></li>
<li>Click "Import CSV"</li>
<li>Prepare CSV with columns:
<div class="language-text highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>address,city,province,postalCode,notes
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>123 Main St,Toronto,ON,M5H 2N2,Corner house
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>456 Oak Ave,Toronto,ON,M5H 2N3,Blue door
</span></code></pre></div></li>
<li>Upload file</li>
<li>Map columns (if headers don't match exactly)</li>
<li>Click "Import"</li>
<li>Locations imported, geocoding starts automatically</li>
</ol>
<p><strong>Via NAR (Canadian Electoral Data):</strong></p>
<ol>
<li>Obtain NAR data files (Location + Address)</li>
<li>Place in <code>/data</code> directory (mapped volume)</li>
<li>Navigate to <code>/app/map/locations</code></li>
<li>Click "NAR Import" tab</li>
<li>Select province</li>
<li>Select dataset</li>
<li>Apply filters (city, postal code, cut, residential only)</li>
<li>Preview count</li>
<li>Click "Import"</li>
<li>Import processes in background (can take minutes for large files)</li>
</ol>
<p>See <a href="../user-guides/nar-import.md">NAR Import Guide</a>.</p>
<hr />
<h3 id="how-to-create-cuts">How to Create Cuts?<a class="headerlink" href="#how-to-create-cuts" title="Permanent link">&para;</a></h3>
<p><strong>Via Map Drawing:</strong></p>
<ol>
<li>Navigate to <code>/app/map/cuts</code></li>
<li>Click "Map Drawing" tab</li>
<li>Map shows with drawing controls</li>
<li>Click "Draw Cut" button</li>
<li>Click on map to place vertices</li>
<li>Click first vertex again to close polygon (or click "Finish")</li>
<li>Fill in form:</li>
<li>Name (required)</li>
<li>Description (optional)</li>
<li>Color (pick color for map display)</li>
<li>Click "Save"</li>
</ol>
<p><strong>Via GeoJSON Import:</strong></p>
<ol>
<li>Prepare GeoJSON file:
<div class="language-json highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="p">{</span>
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Polygon&quot;</span><span class="p">,</span>
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="w"> </span><span class="nt">&quot;coordinates&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[[</span>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="w"> </span><span class="p">[</span><span class="mf">-79.38</span><span class="p">,</span><span class="w"> </span><span class="mf">43.65</span><span class="p">],</span>
</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="w"> </span><span class="p">[</span><span class="mf">-79.37</span><span class="p">,</span><span class="w"> </span><span class="mf">43.65</span><span class="p">],</span>
</span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="w"> </span><span class="p">[</span><span class="mf">-79.37</span><span class="p">,</span><span class="w"> </span><span class="mf">43.64</span><span class="p">],</span>
</span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="w"> </span><span class="p">[</span><span class="mf">-79.38</span><span class="p">,</span><span class="w"> </span><span class="mf">43.64</span><span class="p">],</span>
</span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="w"> </span><span class="p">[</span><span class="mf">-79.38</span><span class="p">,</span><span class="w"> </span><span class="mf">43.65</span><span class="p">]</span>
</span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="w"> </span><span class="p">]]</span>
</span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="p">}</span>
</span></code></pre></div></li>
<li>Navigate to <code>/app/map/cuts</code></li>
<li>Click "Create Cut"</li>
<li>Paste GeoJSON in geometry field</li>
<li>Fill in name/description</li>
<li>Click "Create"</li>
</ol>
<hr />
<h3 id="how-to-organize-shifts">How to Organize Shifts?<a class="headerlink" href="#how-to-organize-shifts" title="Permanent link">&para;</a></h3>
<ol>
<li>Navigate to <code>/app/map/shifts</code></li>
<li>Click "Create Shift"</li>
<li>Fill in form:</li>
<li><strong>Title</strong> (required) - Shift name</li>
<li><strong>Description</strong> (optional) - Shift details</li>
<li><strong>Start Time</strong> (required) - When shift starts</li>
<li><strong>End Time</strong> (required) - When shift ends</li>
<li><strong>Cut</strong> (optional) - Assign to specific cut</li>
<li><strong>Max Volunteers</strong> (optional) - Capacity limit</li>
<li><strong>Public</strong> (checkbox) - Show on public shifts page</li>
<li>Click "Create"</li>
<li>Shift appears in admin table and public listing (if public)</li>
</ol>
<p><strong>Manage signups:</strong></p>
<ol>
<li>Click shift row in table</li>
<li>Click "View Signups"</li>
<li>Drawer shows:</li>
<li>Signup count</li>
<li>List of volunteers</li>
<li>Email addresses</li>
<li>Actions:</li>
<li>"Email All" - Send message to all volunteers</li>
<li>Remove individual signups if needed</li>
</ol>
<hr />
<h3 id="how-to-start-canvassing">How to Start Canvassing?<a class="headerlink" href="#how-to-start-canvassing" title="Permanent link">&para;</a></h3>
<p><strong>For volunteers:</strong></p>
<ol>
<li>Login to volunteer portal</li>
<li>Navigate to "My Assignments" (/volunteer/assignments)</li>
<li>Find assigned shift</li>
<li>Click "Start Canvassing"</li>
<li>Full-screen map opens (/volunteer/canvass/:cutId)</li>
<li>GPS tracks your location</li>
<li>Map shows:</li>
<li>Your current position (blue dot)</li>
<li>Locations in cut (markers)</li>
<li>Walking route (blue line)</li>
<li>Legend (outcome colors)</li>
<li>Click location marker to record visit:</li>
<li>Select outcome (Home, Away, Refused, etc.)</li>
<li>Add notes (optional)</li>
<li>Save</li>
<li>Continue until all locations visited</li>
<li>Session auto-saves progress</li>
</ol>
<p><strong>For admins (monitoring):</strong></p>
<ol>
<li>Navigate to <code>/app/canvass/dashboard</code></li>
<li>View:</li>
<li>Active sessions count</li>
<li>Total visits recorded</li>
<li>Recent activity feed</li>
<li>Cut progress (% complete)</li>
<li>Leaderboard (top canvassers)</li>
<li>Click activity item to see details</li>
</ol>
<p>See <a href="../user-guides/canvassing.md">Canvassing Guide</a>.</p>
<hr />
<h2 id="technical-questions">Technical Questions<a class="headerlink" href="#technical-questions" title="Permanent link">&para;</a></h2>
<h3 id="which-database">Which Database?<a class="headerlink" href="#which-database" title="Permanent link">&para;</a></h3>
<p><strong>PostgreSQL 16</strong> with two ORMs:</p>
<ol>
<li><strong>Prisma</strong> - Main API (Express)</li>
<li>Schema: <code>api/prisma/schema.prisma</code></li>
<li>Migrations: <code>api/prisma/migrations/</code></li>
<li>
<p>30+ models (User, Campaign, Location, etc.)</p>
</li>
<li>
<p><strong>Drizzle</strong> - Media API (Fastify)</p>
</li>
<li>Schema: <code>api/src/modules/media/db/schema.ts</code></li>
<li>Tables: <code>media_videos</code>, <code>media_reactions</code>, etc.</li>
</ol>
<p><strong>Connection:</strong></p>
<ul>
<li>Host: v2-postgres (container) or localhost:5433 (host)</li>
<li>Database: changemaker_v2</li>
<li>User: changemaker</li>
<li>Password: V2_POSTGRES_PASSWORD (from .env)</li>
</ul>
<p><strong>Shared database:</strong> Both ORMs use same PostgreSQL database, different tables.</p>
<hr />
<h3 id="which-orm">Which ORM?<a class="headerlink" href="#which-orm" title="Permanent link">&para;</a></h3>
<p><strong>Prisma</strong> for main API:</p>
<ul>
<li>Type-safe queries</li>
<li>Auto-generated client</li>
<li>Migrations workflow</li>
<li>Prisma Studio GUI</li>
</ul>
<p><strong>Drizzle</strong> for media API:</p>
<ul>
<li>Lightweight</li>
<li>SQL-like API</li>
<li>Schema-first approach</li>
<li>No migration files (push to sync)</li>
</ul>
<p><strong>Why two ORMs?</strong></p>
<p>Media API was added later as separate Fastify microservice. Using Drizzle allowed faster development without modifying main Prisma schema.</p>
<hr />
<h3 id="api-architecture">API Architecture?<a class="headerlink" href="#api-architecture" title="Permanent link">&para;</a></h3>
<p><strong>Dual API architecture:</strong></p>
<ol>
<li><strong>Express API</strong> (Main)</li>
<li>Port: 4000</li>
<li>Language: TypeScript</li>
<li>ORM: Prisma</li>
<li>Features: Auth, campaigns, locations, shifts, canvass, pages</li>
<li>
<p>Endpoints: <code>/api/*</code></p>
</li>
<li>
<p><strong>Fastify Media API</strong> (Microservice)</p>
</li>
<li>Port: 4100</li>
<li>Language: TypeScript</li>
<li>ORM: Drizzle</li>
<li>Features: Video library, uploads, reactions</li>
<li>Endpoints: <code>/api/media/*</code></li>
</ol>
<p><strong>Shared:</strong></p>
<ul>
<li>Same PostgreSQL database</li>
<li>Same Redis instance</li>
<li>Same Docker network</li>
<li>Separate containerization (can scale independently)</li>
</ul>
<p><strong>Frontend:</strong></p>
<ul>
<li>React SPA (Vite)</li>
<li>Port: 3000</li>
<li>State: Zustand</li>
<li>UI: Ant Design</li>
<li>Routing: React Router v6</li>
</ul>
<hr />
<h3 id="authentication-method">Authentication Method?<a class="headerlink" href="#authentication-method" title="Permanent link">&para;</a></h3>
<p><strong>JWT-based authentication:</strong></p>
<p><strong>Tokens:</strong></p>
<ol>
<li><strong>Access Token</strong></li>
<li>Duration: 15 minutes</li>
<li>Stored: Memory (localStorage)</li>
<li>Contains: userId, email, role</li>
<li>
<p>Used: All authenticated requests</p>
</li>
<li>
<p><strong>Refresh Token</strong></p>
</li>
<li>Duration: 7 days</li>
<li>Stored: Database + localStorage</li>
<li>Used: Renew access token</li>
<li>Rotation: New refresh token on each refresh</li>
</ol>
<p><strong>Flow:</strong></p>
<ol>
<li>Login → Returns access + refresh tokens</li>
<li>Store in localStorage (Zustand persist)</li>
<li>Add access token to Authorization header</li>
<li>Access token expires after 15min</li>
<li>Frontend auto-refreshes using refresh token</li>
<li>New access + refresh tokens returned</li>
<li>Continue seamlessly</li>
</ol>
<p><strong>Security features:</strong></p>
<ul>
<li>bcrypt password hashing (10 rounds)</li>
<li>Token rotation prevents replay attacks</li>
<li>Refresh tokens stored in database (can revoke)</li>
<li>Rate limiting on auth endpoints (10/min)</li>
<li>User enumeration prevention</li>
<li>Redis authentication required</li>
</ul>
<p>See <a href="../technical/authentication.md">Authentication Flow</a>.</p>
<hr />
<h2 id="performance">Performance<a class="headerlink" href="#performance" title="Permanent link">&para;</a></h2>
<h3 id="how-many-users-supported">How Many Users Supported?<a class="headerlink" href="#how-many-users-supported" title="Permanent link">&para;</a></h3>
<p><strong>Concurrent users:</strong></p>
<ul>
<li><strong>Development:</strong> 10-50 users</li>
<li><strong>Production (default config):</strong> 100-500 users</li>
<li><strong>Production (optimized):</strong> 1000+ users</li>
</ul>
<p><strong>Factors:</strong></p>
<ul>
<li>Database connection pool (default: 10 connections)</li>
<li>API worker concurrency (default: 1 worker)</li>
<li>Server resources (CPU/RAM)</li>
<li>Network bandwidth</li>
</ul>
<p><strong>Scaling:</strong></p>
<ul>
<li>Horizontal: Run multiple API instances</li>
<li>Vertical: Increase server resources</li>
<li>Database: Read replicas for read-heavy loads</li>
<li>Caching: Redis caching for frequently accessed data</li>
</ul>
<hr />
<h3 id="how-to-scale">How to Scale?<a class="headerlink" href="#how-to-scale" title="Permanent link">&para;</a></h3>
<p><strong>Horizontal scaling (recommended):</strong></p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="c1"># docker-compose.yml</span>
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="nt">api</span><span class="p">:</span>
</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="w"> </span><span class="nt">deploy</span><span class="p">:</span>
</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="w"> </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span><span class="w"> </span><span class="c1"># Run 3 API instances</span>
</span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="w"> </span><span class="c1"># Each instance:</span>
</span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="w"> </span><span class="c1"># - Handles requests independently</span>
</span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a><span class="w"> </span><span class="c1"># - Connects to same database</span>
</span><span id="__span-7-8"><a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a><span class="w"> </span><span class="c1"># - Processes queue jobs</span>
</span><span id="__span-7-9"><a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a><span class="w"> </span><span class="c1"># - Shares Redis cache</span>
</span></code></pre></div>
<p>Add load balancer in front:</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="nt">nginx</span><span class="p">:</span>
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">nginx:alpine</span>
</span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
</span><span id="__span-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;80:80&quot;</span>
</span><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span>
</span><span id="__span-8-6"><a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./nginx/lb.conf:/etc/nginx/nginx.conf</span>
</span><span id="__span-8-7"><a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="w"> </span><span class="c1"># Distributes requests across API instances</span>
</span></code></pre></div>
<p><strong>Vertical scaling:</strong></p>
<p>Increase resources:</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="nt">api</span><span class="p">:</span>
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="w"> </span><span class="nt">deploy</span><span class="p">:</span>
</span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a><span class="w"> </span><span class="nt">resources</span><span class="p">:</span>
</span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="w"> </span><span class="nt">limits</span><span class="p">:</span>
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="w"> </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;4.0&#39;</span><span class="w"> </span><span class="c1"># More CPU</span>
</span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="w"> </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8G</span><span class="w"> </span><span class="c1"># More RAM</span>
</span></code></pre></div>
<p><strong>Database scaling:</strong></p>
<ul>
<li>Add read replicas for read-heavy queries</li>
<li>Use connection pooler (PgBouncer)</li>
<li>Optimize queries and indexes</li>
</ul>
<p><strong>Caching:</strong></p>
<ul>
<li>Redis caching for geocoding results</li>
<li>Redis caching for representative lookups</li>
<li>HTTP caching headers (Nginx)</li>
<li>Static asset CDN</li>
</ul>
<hr />
<h3 id="database-size-limits">Database Size Limits?<a class="headerlink" href="#database-size-limits" title="Permanent link">&para;</a></h3>
<p><strong>PostgreSQL:</strong></p>
<ul>
<li>Maximum database size: ~32 TB (theoretical)</li>
<li>Practical limit: Depends on storage and backup strategy</li>
</ul>
<p><strong>Typical sizes (after 1 year):</strong></p>
<ul>
<li><strong>Small campaign:</strong> 100MB-500MB (1k locations, 10 campaigns)</li>
<li><strong>Medium campaign:</strong> 500MB-2GB (10k locations, 50 campaigns)</li>
<li><strong>Large campaign:</strong> 2GB-10GB (100k locations, 200 campaigns)</li>
</ul>
<p><strong>Storage requirements:</strong></p>
<ul>
<li><strong>Database:</strong> 1-10GB</li>
<li><strong>Uploads:</strong> 5-50GB (videos)</li>
<li><strong>Backups:</strong> 2× database size (keep multiple backups)</li>
<li><strong>Logs:</strong> 1-5GB/month</li>
<li><strong>Total:</strong> 20-100GB recommended</li>
</ul>
<p><strong>Optimization:</strong></p>
<ul>
<li>Regular VACUUM (auto-enabled)</li>
<li>Archive old campaigns</li>
<li>Delete old logs</li>
<li>Compress backups</li>
</ul>
<hr />
<h2 id="security">Security<a class="headerlink" href="#security" title="Permanent link">&para;</a></h2>
<h3 id="is-data-encrypted">Is Data Encrypted?<a class="headerlink" href="#is-data-encrypted" title="Permanent link">&para;</a></h3>
<p><strong>At rest:</strong></p>
<ul>
<li>Database: Not encrypted by default (enable PostgreSQL encryption if needed)</li>
<li>Passwords: bcrypt hashed (cannot be decrypted)</li>
<li>Sensitive fields: ENCRYPTION_KEY env var for encrypting secrets</li>
</ul>
<p><strong>In transit:</strong></p>
<ul>
<li>HTTPS: Use Pangolin/Cloudflare tunnel (encrypts all traffic)</li>
<li>Database: PostgreSQL connections within Docker network (isolated)</li>
<li>Redis: Authenticated (password required)</li>
</ul>
<p><strong>Recommendations:</strong></p>
<ul>
<li>Use HTTPS in production</li>
<li>Rotate ENCRYPTION_KEY periodically</li>
<li>Enable PostgreSQL SSL if database exposed</li>
<li>Use strong passwords for all services</li>
</ul>
<hr />
<h3 id="password-requirements">Password Requirements?<a class="headerlink" href="#password-requirements" title="Permanent link">&para;</a></h3>
<p><strong>Enforced policy:</strong></p>
<ul>
<li>Minimum 12 characters</li>
<li>At least 1 uppercase letter (A-Z)</li>
<li>At least 1 lowercase letter (a-z)</li>
<li>At least 1 digit (0-9)</li>
<li>No maximum length</li>
</ul>
<p><strong>Valid examples:</strong></p>
<ul>
<li><code>SecurePass123!</code></li>
<li><code>MyPassword99</code></li>
<li><code>Admin12345678</code></li>
</ul>
<p><strong>Invalid:</strong></p>
<ul>
<li><code>short</code> (too short)</li>
<li><code>nouppercase123</code> (no uppercase)</li>
<li><code>NOLOWERCASE123</code> (no lowercase)</li>
<li><code>NoDigitsHere</code> (no digit)</li>
</ul>
<p><strong>Storage:</strong></p>
<ul>
<li>bcrypt hashed with salt (10 rounds)</li>
<li>Hash stored in database (not plaintext)</li>
<li>Cannot be decrypted (one-way hash)</li>
</ul>
<hr />
<h3 id="how-to-backup">How to Backup?<a class="headerlink" href="#how-to-backup" title="Permanent link">&para;</a></h3>
<p><strong>Manual backup:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="c1"># Use provided script</span>
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a>./scripts/backup.sh
</span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a>
</span><span id="__span-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a><span class="c1"># Creates:</span>
</span><span id="__span-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="c1"># - PostgreSQL dump</span>
</span><span id="__span-10-6"><a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="c1"># - Listmonk dump (if enabled)</span>
</span><span id="__span-10-7"><a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a><span class="c1"># - Uploads archive (videos, images)</span>
</span><span id="__span-10-8"><a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a><span class="c1"># - Timestamped filename: backup_2026-02-13_100000.tar.gz</span>
</span></code></pre></div>
<p><strong>What's included:</strong></p>
<ul>
<li>Complete database dump (all tables)</li>
<li>Uploaded files (videos, images, documents)</li>
<li>Listmonk database (if enabled)</li>
</ul>
<p><strong>What's NOT included:</strong></p>
<ul>
<li>Docker images (rebuild from Dockerfile)</li>
<li>.env file (keep separate, has secrets)</li>
<li>Temporary files (logs, cache)</li>
</ul>
<p><strong>Automated backups:</strong></p>
<p>Add cron job:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="c1"># Run daily at 2 AM</span>
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="m">0</span><span class="w"> </span><span class="m">2</span><span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>/path/to/changemaker.lite<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>./scripts/backup.sh
</span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a>
</span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="c1"># With S3 upload (if configured)</span>
</span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="m">0</span><span class="w"> </span><span class="m">2</span><span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span>*<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>/path/to/changemaker.lite<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>./scripts/backup.sh<span class="w"> </span>--upload-s3
</span></code></pre></div>
<p><strong>Restore:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="c1"># Stop services</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>down
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a>
</span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a><span class="c1"># Restore database</span>
</span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a>gunzip<span class="w"> </span>-c<span class="w"> </span>backup.sql.gz<span class="w"> </span><span class="p">|</span><span class="w"> </span>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>-T<span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>changemaker<span class="w"> </span>-d<span class="w"> </span>changemaker_v2
</span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a>
</span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a><span class="c1"># Restore uploads</span>
</span><span id="__span-12-8"><a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a>tar<span class="w"> </span>-xzf<span class="w"> </span>uploads.tar.gz<span class="w"> </span>-C<span class="w"> </span>./uploads
</span><span id="__span-12-9"><a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a>
</span><span id="__span-12-10"><a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a><span class="c1"># Start services</span>
</span><span id="__span-12-11"><a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
</span></code></pre></div>
<p>See <a href="../../deployment/backup-restore/">Backup Guide</a>.</p>
<hr />
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="where-are-logs">Where are Logs?<a class="headerlink" href="#where-are-logs" title="Permanent link">&para;</a></h3>
<p><strong>Docker logs:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="c1"># View API logs</span>
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>api
</span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a>
</span><span id="__span-13-4"><a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a><span class="c1"># View all logs</span>
</span><span id="__span-13-5"><a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs
</span><span id="__span-13-6"><a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a>
</span><span id="__span-13-7"><a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="c1"># Follow logs (real-time)</span>
</span><span id="__span-13-8"><a id="__codelineno-13-8" name="__codelineno-13-8" href="#__codelineno-13-8"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>api
</span><span id="__span-13-9"><a id="__codelineno-13-9" name="__codelineno-13-9" href="#__codelineno-13-9"></a>
</span><span id="__span-13-10"><a id="__codelineno-13-10" name="__codelineno-13-10" href="#__codelineno-13-10"></a><span class="c1"># Last 100 lines</span>
</span><span id="__span-13-11"><a id="__codelineno-13-11" name="__codelineno-13-11" href="#__codelineno-13-11"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>api<span class="w"> </span>--tail<span class="o">=</span><span class="m">100</span>
</span><span id="__span-13-12"><a id="__codelineno-13-12" name="__codelineno-13-12" href="#__codelineno-13-12"></a>
</span><span id="__span-13-13"><a id="__codelineno-13-13" name="__codelineno-13-13" href="#__codelineno-13-13"></a><span class="c1"># Since timestamp</span>
</span><span id="__span-13-14"><a id="__codelineno-13-14" name="__codelineno-13-14" href="#__codelineno-13-14"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>api<span class="w"> </span>--since<span class="o">=</span><span class="s2">&quot;2026-02-13T10:00:00&quot;</span>
</span><span id="__span-13-15"><a id="__codelineno-13-15" name="__codelineno-13-15" href="#__codelineno-13-15"></a>
</span><span id="__span-13-16"><a id="__codelineno-13-16" name="__codelineno-13-16" href="#__codelineno-13-16"></a><span class="c1"># Save to file</span>
</span><span id="__span-13-17"><a id="__codelineno-13-17" name="__codelineno-13-17" href="#__codelineno-13-17"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>api<span class="w"> </span>&gt;<span class="w"> </span>api-logs.txt
</span></code></pre></div>
<p><strong>Log locations inside containers:</strong></p>
<ul>
<li>API: Console output (docker logs)</li>
<li>PostgreSQL: Console + <code>/var/lib/postgresql/data/log/</code> (if logging enabled)</li>
<li>Nginx: <code>/var/log/nginx/access.log</code>, <code>/var/log/nginx/error.log</code></li>
</ul>
<p><strong>Log levels:</strong></p>
<ul>
<li><strong>ERROR:</strong> Errors requiring attention</li>
<li><strong>WARN:</strong> Warnings (not critical)</li>
<li><strong>INFO:</strong> Informational messages</li>
<li><strong>DEBUG:</strong> Debugging information (enable with LOG_LEVEL=debug)</li>
</ul>
<hr />
<h3 id="how-to-restart-services">How to Restart Services?<a class="headerlink" href="#how-to-restart-services" title="Permanent link">&para;</a></h3>
<p><strong>Restart specific service:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="c1"># Restart API</span>
</span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>restart<span class="w"> </span>api
</span><span id="__span-14-3"><a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a>
</span><span id="__span-14-4"><a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a><span class="c1"># Restart multiple services</span>
</span><span id="__span-14-5"><a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>restart<span class="w"> </span>api<span class="w"> </span>admin<span class="w"> </span>v2-postgres
</span></code></pre></div>
<p><strong>Restart all services:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="c1"># Graceful restart (preserves data)</span>
</span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>restart
</span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a>
</span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a><span class="c1"># Stop and start (recreates containers)</span>
</span><span id="__span-15-5"><a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>down
</span><span id="__span-15-6"><a id="__codelineno-15-6" name="__codelineno-15-6" href="#__codelineno-15-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
</span></code></pre></div>
<p><strong>Force recreate:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="c1"># Rebuild and recreate</span>
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>--build<span class="w"> </span>--force-recreate
</span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a>
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a><span class="c1"># Recreate specific service</span>
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>--build<span class="w"> </span>--force-recreate<span class="w"> </span>api
</span></code></pre></div>
<p><strong>Restart single container:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="c1"># Get container name</span>
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps
</span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a>
</span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a><span class="c1"># Restart by name</span>
</span><span id="__span-17-5"><a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a>docker<span class="w"> </span>restart<span class="w"> </span>changemaker-lite-api-1
</span></code></pre></div>
<hr />
<h3 id="how-to-reset-database">How to Reset Database?<a class="headerlink" href="#how-to-reset-database" title="Permanent link">&para;</a></h3>
<p>⚠️ <strong>WARNING:</strong> This deletes ALL data!</p>
<p><strong>Full reset:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="c1"># Stop services</span>
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>down
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>
</span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a><span class="c1"># Delete database volume</span>
</span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a>docker<span class="w"> </span>volume<span class="w"> </span>rm<span class="w"> </span>changemaker-lite_postgres-data
</span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a>
</span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a><span class="c1"># Start fresh</span>
</span><span id="__span-18-8"><a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>v2-postgres
</span><span id="__span-18-9"><a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a>
</span><span id="__span-18-10"><a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a><span class="c1"># Wait for database ready</span>
</span><span id="__span-18-11"><a id="__codelineno-18-11" name="__codelineno-18-11" href="#__codelineno-18-11"></a>sleep<span class="w"> </span><span class="m">10</span>
</span><span id="__span-18-12"><a id="__codelineno-18-12" name="__codelineno-18-12" href="#__codelineno-18-12"></a>
</span><span id="__span-18-13"><a id="__codelineno-18-13" name="__codelineno-18-13" href="#__codelineno-18-13"></a><span class="c1"># Run migrations</span>
</span><span id="__span-18-14"><a id="__codelineno-18-14" name="__codelineno-18-14" href="#__codelineno-18-14"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy
</span><span id="__span-18-15"><a id="__codelineno-18-15" name="__codelineno-18-15" href="#__codelineno-18-15"></a>
</span><span id="__span-18-16"><a id="__codelineno-18-16" name="__codelineno-18-16" href="#__codelineno-18-16"></a><span class="c1"># Seed initial data</span>
</span><span id="__span-18-17"><a id="__codelineno-18-17" name="__codelineno-18-17" href="#__codelineno-18-17"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span><span id="__span-18-18"><a id="__codelineno-18-18" name="__codelineno-18-18" href="#__codelineno-18-18"></a>
</span><span id="__span-18-19"><a id="__codelineno-18-19" name="__codelineno-18-19" href="#__codelineno-18-19"></a><span class="c1"># Default admin: admin@example.com / Admin123!</span>
</span></code></pre></div>
<p><strong>Reset specific tables:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="c1"># Delete all users (keeps schema)</span>
</span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>changemaker<span class="w"> </span>-d<span class="w"> </span>changemaker_v2<span class="w"> </span><span class="se">\</span>
</span><span id="__span-19-3"><a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a><span class="w"> </span>-c<span class="w"> </span><span class="s1">&#39;TRUNCATE &quot;User&quot; CASCADE;&#39;</span>
</span><span id="__span-19-4"><a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-4"></a>
</span><span id="__span-19-5"><a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a><span class="c1"># Re-seed</span>
</span><span id="__span-19-6"><a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span></code></pre></div>
<p><strong>Reset without deleting volumes:</strong></p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="c1"># Drop and recreate database</span>
</span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span><span class="se">\</span>
</span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a><span class="w"> </span>-c<span class="w"> </span><span class="s1">&#39;DROP DATABASE changemaker_v2;&#39;</span>
</span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a>
</span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span><span class="se">\</span>
</span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a><span class="w"> </span>-c<span class="w"> </span><span class="s1">&#39;CREATE DATABASE changemaker_v2 OWNER changemaker;&#39;</span>
</span><span id="__span-20-7"><a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a>
</span><span id="__span-20-8"><a id="__codelineno-20-8" name="__codelineno-20-8" href="#__codelineno-20-8"></a><span class="c1"># Run migrations</span>
</span><span id="__span-20-9"><a id="__codelineno-20-9" name="__codelineno-20-9" href="#__codelineno-20-9"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy
</span><span id="__span-20-10"><a id="__codelineno-20-10" name="__codelineno-20-10" href="#__codelineno-20-10"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span></code></pre></div>
<hr />
<h2 id="getting-help">Getting Help<a class="headerlink" href="#getting-help" title="Permanent link">&para;</a></h2>
<h3 id="documentation-links">Documentation Links<a class="headerlink" href="#documentation-links" title="Permanent link">&para;</a></h3>
<p><strong>User Guides:</strong></p>
<ul>
<li><a href="../user/installation.md">Installation Guide</a></li>
<li><a href="../user/user-guide.md">User Guide</a></li>
<li><a href="../user/admin-guide.md">Admin Guide</a></li>
<li><a href="../user-guides/canvassing.md">Canvassing Guide</a></li>
<li><a href="../user-guides/nar-import.md">NAR Import Guide</a></li>
</ul>
<p><strong>Technical Documentation:</strong></p>
<ul>
<li><a href="../technical/architecture.md">Architecture Overview</a></li>
<li><a href="../technical/api-reference.md">API Reference</a></li>
<li><a href="../technical/database-schema.md">Database Schema</a></li>
<li><a href="../technical/authentication.md">Authentication Flow</a></li>
</ul>
<p><strong>Troubleshooting:</strong></p>
<ul>
<li><a href="../common-errors/">Common Errors</a></li>
<li><a href="../docker-issues/">Docker Issues</a></li>
<li><a href="../database-issues/">Database Issues</a></li>
<li><a href="../auth-issues/">Auth Issues</a></li>
<li><a href="../email-issues/">Email Issues</a></li>
<li><a href="../geocoding-issues/">Geocoding Issues</a></li>
<li><a href="../monitoring-issues/">Monitoring Issues</a></li>
<li><a href="../performance-optimization/">Performance Optimization</a></li>
</ul>
<hr />
<h3 id="github-issues">GitHub Issues<a class="headerlink" href="#github-issues" title="Permanent link">&para;</a></h3>
<p><strong>Before creating issue:</strong></p>
<ol>
<li>Check <a href="https://github.com/yourusername/changemaker.lite/issues">existing issues</a></li>
<li>Search closed issues (may already be fixed)</li>
<li>Check <a href="../common-errors/">Troubleshooting guides</a></li>
<li>Try latest version (<code>git pull origin v2</code>)</li>
</ol>
<p><strong>Creating good issues:</strong></p>
<p><strong>Bug reports:</strong></p>
<div class="language-markdown highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="gs">**Describe the bug**</span>
</span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a>Clear description of what&#39;s wrong.
</span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a>
</span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a><span class="gs">**To Reproduce**</span>
</span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a><span class="k">1.</span> Go to &#39;...&#39;
</span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a><span class="k">2.</span> Click on &#39;...&#39;
</span><span id="__span-21-7"><a id="__codelineno-21-7" name="__codelineno-21-7" href="#__codelineno-21-7"></a><span class="k">3.</span> See error
</span><span id="__span-21-8"><a id="__codelineno-21-8" name="__codelineno-21-8" href="#__codelineno-21-8"></a>
</span><span id="__span-21-9"><a id="__codelineno-21-9" name="__codelineno-21-9" href="#__codelineno-21-9"></a><span class="gs">**Expected behavior**</span>
</span><span id="__span-21-10"><a id="__codelineno-21-10" name="__codelineno-21-10" href="#__codelineno-21-10"></a>What should happen instead.
</span><span id="__span-21-11"><a id="__codelineno-21-11" name="__codelineno-21-11" href="#__codelineno-21-11"></a>
</span><span id="__span-21-12"><a id="__codelineno-21-12" name="__codelineno-21-12" href="#__codelineno-21-12"></a><span class="gs">**Screenshots**</span>
</span><span id="__span-21-13"><a id="__codelineno-21-13" name="__codelineno-21-13" href="#__codelineno-21-13"></a>If applicable, add screenshots.
</span><span id="__span-21-14"><a id="__codelineno-21-14" name="__codelineno-21-14" href="#__codelineno-21-14"></a>
</span><span id="__span-21-15"><a id="__codelineno-21-15" name="__codelineno-21-15" href="#__codelineno-21-15"></a><span class="gs">**Environment**</span>
</span><span id="__span-21-16"><a id="__codelineno-21-16" name="__codelineno-21-16" href="#__codelineno-21-16"></a><span class="k">-</span><span class="w"> </span>OS: [e.g. Ubuntu 22.04]
</span><span id="__span-21-17"><a id="__codelineno-21-17" name="__codelineno-21-17" href="#__codelineno-21-17"></a><span class="k">-</span><span class="w"> </span>Docker version: [e.g. 20.10.21]
</span><span id="__span-21-18"><a id="__codelineno-21-18" name="__codelineno-21-18" href="#__codelineno-21-18"></a><span class="k">-</span><span class="w"> </span>Browser: [e.g. Chrome 120]
</span><span id="__span-21-19"><a id="__codelineno-21-19" name="__codelineno-21-19" href="#__codelineno-21-19"></a>
</span><span id="__span-21-20"><a id="__codelineno-21-20" name="__codelineno-21-20" href="#__codelineno-21-20"></a><span class="gs">**Logs**</span>
</span><span id="__span-21-21"><a id="__codelineno-21-21" name="__codelineno-21-21" href="#__codelineno-21-21"></a>Paste relevant logs (sanitize sensitive data).
</span></code></pre></div>
<p><strong>Feature requests:</strong></p>
<div class="language-markdown highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="gs">**Is your feature request related to a problem?**</span>
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a>Description of problem.
</span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a>
</span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a><span class="gs">**Describe the solution you&#39;d like**</span>
</span><span id="__span-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a>Clear description of feature.
</span><span id="__span-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a>
</span><span id="__span-22-7"><a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a><span class="gs">**Describe alternatives you&#39;ve considered**</span>
</span><span id="__span-22-8"><a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a>Other solutions considered.
</span><span id="__span-22-9"><a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a>
</span><span id="__span-22-10"><a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a><span class="gs">**Additional context**</span>
</span><span id="__span-22-11"><a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a>Any other context or screenshots.
</span></code></pre></div>
<hr />
<h3 id="community-support">Community Support<a class="headerlink" href="#community-support" title="Permanent link">&para;</a></h3>
<p><strong>Official channels:</strong></p>
<ul>
<li>GitHub Issues (bugs and features)</li>
<li>GitHub Discussions (questions and ideas)</li>
<li>Documentation (this site)</li>
</ul>
<p><strong>Response time:</strong></p>
<ul>
<li>Bug reports: 1-7 days</li>
<li>Feature requests: Variable (depends on priority)</li>
<li>Questions: 1-3 days</li>
</ul>
<p><strong>Contributing:</strong></p>
<ul>
<li>Pull requests welcome</li>
<li>Follow <a href="../contributing/guidelines.md">Contributing Guide</a></li>
<li>Follow <a href="../../contributing/code-of-conduct/">Code of Conduct</a></li>
</ul>
<hr />
<p><strong>Last Updated:</strong> February 2026
<strong>Version:</strong> V2.0
<strong>Status:</strong> Complete</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../" class="md-footer__link md-footer__link--prev" aria-label="Previous: Troubleshooting Guide">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Troubleshooting Guide
</div>
</div>
</a>
<a href="../common-errors/" class="md-footer__link md-footer__link--next" aria-label="Next: Common Errors">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Common Errors
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div>
</div>
<div class="md-social">
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://listmonk.bnkops.com/subscription/form" target="_blank" rel="noopener" title="Newsletter" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M536.4-26.3c9.8-3.5 20.6-1 28 6.3s9.8 18.2 6.3 28l-178 496.9c-5 13.9-18.1 23.1-32.8 23.1-14.2 0-27-8.6-32.3-21.7l-64.2-158c-4.5-11-2.5-23.6 5.2-32.6l94.5-112.4c5.1-6.1 4.7-15-.9-20.6s-14.6-6-20.6-.9l-112.4 94.3c-9.1 7.6-21.6 9.6-32.6 5.2L38.1 216.8c-13.1-5.3-21.7-18.1-21.7-32.3 0-14.7 9.2-27.8 23.1-32.8z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.expand", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.sections", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
<script src="../../../javascripts/home.js"></script>
<script src="../../../javascripts/github-widget.js"></script>
<script src="../../../javascripts/gitea-widget.js"></script>
<script src="../../../assets/js/env-config.js"></script>
<script src="../../../assets/js/video-player.js"></script>
</body>
</html>