Merge pull request 'Improve outreach information' (#3) from jared/web:feature/why-run-node into staging
All checks were successful
Deploy Pages / deploy (push) Successful in 36s
All checks were successful
Deploy Pages / deploy (push) Successful in 36s
Reviewed-on: https://git.ctmesh.org/ctmesh/web/pulls/3
This commit is contained in:
@ -12,9 +12,16 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- run: mkdir /tmp/deploy
|
- run: mkdir /tmp/deploy
|
||||||
- run: rsync -ua --exclude=".*" . /tmp/deploy
|
- run: rsync -ua --exclude=".*" . /tmp/deploy
|
||||||
|
- name: Set deploy branch
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.ref_name }}" = "master" ]; then
|
||||||
|
echo "DEPLOY_BRANCH=main" >> "$GITHUB_ENV"
|
||||||
|
else
|
||||||
|
echo "DEPLOY_BRANCH=${{ github.ref_name }}" >> "$GITHUB_ENV"
|
||||||
|
fi
|
||||||
- name: Build & Deploy Worker
|
- name: Build & Deploy Worker
|
||||||
uses: cloudflare/wrangler-action@v3
|
uses: cloudflare/wrangler-action@v3
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CF_API_TOKEN }}
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
command: pages deploy /tmp/deploy --project-name=ctmesh-org --branch=${{ github.ref_name }}
|
command: pages deploy /tmp/deploy --project-name=ctmesh-org --branch=${{ env.DEPLOY_BRANCH }}
|
||||||
|
|||||||
14
index.html
14
index.html
@ -165,6 +165,11 @@
|
|||||||
background-color: #2B3A4E;
|
background-color: #2B3A4E;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
.btn-learn,
|
||||||
|
.btn-learn:visited {
|
||||||
|
background-color: #FFB347;
|
||||||
|
color: #1F2230;
|
||||||
|
}
|
||||||
.btn-meshcore img {
|
.btn-meshcore img {
|
||||||
filter: brightness(0) invert(1);
|
filter: brightness(0) invert(1);
|
||||||
}
|
}
|
||||||
@ -319,13 +324,20 @@
|
|||||||
<div class="btn-groups">
|
<div class="btn-groups">
|
||||||
<div class="section">
|
<div class="section">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<a href="/discord" target="_blank" class="btn btn-discord">
|
<a href="https://ctmesh.org/discord" target="_blank" class="btn btn-discord">
|
||||||
<img src="discord.svg" alt="Discord" />
|
<img src="discord.svg" alt="Discord" />
|
||||||
<div class="btn-text">
|
<div class="btn-text">
|
||||||
Join our Discord
|
Join our Discord
|
||||||
<small>Chat with the community</small>
|
<small>Chat with the community</small>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="why-run-a-node.html" class="btn btn-learn">
|
||||||
|
<img src="info.svg" alt="Learn about mesh networking" />
|
||||||
|
<div class="btn-text">
|
||||||
|
Why Mesh Matters
|
||||||
|
<small>Learn about the mesh!</small>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section">
|
<div class="section">
|
||||||
|
|||||||
294
why-run-a-node.html
Normal file
294
why-run-a-node.html
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
||||||
|
<title>Why Run a Mesh Node? | CT Mesh</title>
|
||||||
|
<meta name="description" content="Learn how running a local MeshCore node helps your community with off-grid communication, emergency resilience, and private encrypted messaging.">
|
||||||
|
<link rel="shortcut icon" type="image/x-icon" href="favicon.png?3">
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png?3">
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
background: url('background.svg') no-repeat center center fixed;
|
||||||
|
background-size: cover;
|
||||||
|
background-color: #EBEBEB;
|
||||||
|
color: #2C2D3C;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 2em 0;
|
||||||
|
}
|
||||||
|
a,
|
||||||
|
a:visited {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(87, 87, 87, 0.4);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.content-box {
|
||||||
|
background-color: #EBEBEB;
|
||||||
|
border-radius: 30px;
|
||||||
|
padding: 2.5em 3em;
|
||||||
|
margin: 1em;
|
||||||
|
max-width: 820px;
|
||||||
|
width: 90%;
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin-top: 2em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
font-size: 28px;
|
||||||
|
}
|
||||||
|
.page-title {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
margin-top: 1.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
margin-top: 1.25em;
|
||||||
|
margin-bottom: 0.4em;
|
||||||
|
font-size: 17px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.subtitle {
|
||||||
|
margin-top: -0.25em;
|
||||||
|
font-size: 1.05em;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #1F2230;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin: 0.5em 0;
|
||||||
|
line-height: 1.45;
|
||||||
|
}
|
||||||
|
ul {
|
||||||
|
margin: 0.5em 0 0.5em 1.25em;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.note {
|
||||||
|
background: #F5F5F5;
|
||||||
|
border-left: 4px solid #67EA94;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 0.75em 1em;
|
||||||
|
margin: 0.75em 0 0.5em;
|
||||||
|
font-size: 0.95em;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 8px;
|
||||||
|
background-color: #67EA94;
|
||||||
|
color: #000000;
|
||||||
|
border: none;
|
||||||
|
padding: 0.75em 1.5em;
|
||||||
|
border-radius: 999px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 15px;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-top: 0.75em;
|
||||||
|
}
|
||||||
|
.btn-secondary,
|
||||||
|
.btn-secondary:visited {
|
||||||
|
background-color: #2B3A4E;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.page-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5em;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
}
|
||||||
|
.page-header img {
|
||||||
|
width: 44px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
.page-header span {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 19px;
|
||||||
|
color: #2C2D3C;
|
||||||
|
}
|
||||||
|
.button-row {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.75em;
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
.back-link {
|
||||||
|
margin-top: 1.5em;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.back-link::before {
|
||||||
|
content: "";
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 2.5L3.5 6L8 9.5'/%3E%3C/svg%3E") no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
opacity: 0.4;
|
||||||
|
filter: invert(1);
|
||||||
|
}
|
||||||
|
a[target="_blank"]::after {
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
vertical-align: middle;
|
||||||
|
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5L8.5 3.5M5 3.5h3.5V7'/%3E%3C/svg%3E") no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
|
opacity: 0.4;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
.btn[target="_blank"]::after,
|
||||||
|
.site-footer a::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.site-footer {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 2em;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
color: #2C2D3C;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
.site-footer a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.site-footer a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
@media (max-width: 800px) {
|
||||||
|
body {
|
||||||
|
padding-top: calc(env(safe-area-inset-top, 1em));
|
||||||
|
}
|
||||||
|
.content-box {
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.content-box {
|
||||||
|
padding: 1.5em;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<div class="content-box">
|
||||||
|
<a href="index.html" class="page-header">
|
||||||
|
<img src="logo_sm.png" alt="CT Mesh" />
|
||||||
|
<span>CT Mesh</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<h1 class="page-title">Why Run a Mesh Node?</h1>
|
||||||
|
<p class="subtitle">Learn about the mesh!</p>
|
||||||
|
<p>A local node is more than a gadget. It strengthens community communication by adding coverage, redundancy, and local routing for everyone nearby.</p>
|
||||||
|
|
||||||
|
<h2>How the Public Benefits</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Resilient network without internet or cellular dependency:</strong> Nodes route locally by radio and create alternate paths, so communication can continue even when phone or ISP backbones are unavailable.</li>
|
||||||
|
<li><strong>Emergency communication:</strong> During outages or disasters, local radio links can keep basic coordination available.</li>
|
||||||
|
<li><strong>Flexible encrypted communications:</strong> Mesh platforms support public channels for open community traffic, private encrypted channels for groups, and private encrypted direct messages between individuals.</li>
|
||||||
|
<li><strong>Accessible mobile apps:</strong> Both iPhone and Android users can manage nodes and messaging from their phones, using Bluetooth to communicate with the radios.</li>
|
||||||
|
<li><strong>Affordable hardware:</strong> Many compatible devices are commonly available for under $100.</li>
|
||||||
|
<li><strong>No operator license required (USA):</strong> On 915 MHz ISM, operation under 1W does not require an amateur radio license, and this is typically plenty of power for local mesh use.</li>
|
||||||
|
<li><strong>Easy onboarding:</strong> Pairing a node, loading channels, and joining local community resources is straightforward for new users.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Solar and Off-Grid Operation</h2>
|
||||||
|
<p>Many fixed mesh repeater nodes can run from small solar systems and batteries, with no grid connection required. That means:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Improved resilience</strong> because communication infrastructure can remain active during grid disruptions</li>
|
||||||
|
<li><strong>Install options beyond existing infrastructure</strong>, including remote locations with clear line-of-sight and reliable sun exposure</li>
|
||||||
|
<li><strong>No additional household electric cost</strong> for grid power at the node site</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Why Ham Radio Operators Often Love Mesh</h2>
|
||||||
|
<ul>
|
||||||
|
<li>It combines RF experimentation, antenna work, and practical local service.</li>
|
||||||
|
<li>It rewards good station design: Elevation, feedline quality, power planning, and interference control.</li>
|
||||||
|
<li>It offers an always-on local network that can complement other emergency and community communication practices.</li>
|
||||||
|
<li>These communities represent some of the largest mesh networks in the world: Over 21,000 MeshCore nodes globally (including about 14,000 repeaters) and over 32,000 Meshtastic nodes worldwide, with adoption levels comparable to APRS and major amateur IP mesh networks in Europe.</li>
|
||||||
|
</ul>
|
||||||
|
<h1>Getting Involved</h1>
|
||||||
|
<p>Most users only need a companion/client device. If you want to expand mesh coverage in your area, build a repeater/router node. In MeshCore, a <strong>repeater</strong> is a fixed station that stays in place to relay traffic for the mesh, while a <strong>companion</strong> is a personal device that travels with you for day-to-day messaging. Meshtastic follows a similar pattern with <strong>routers</strong> (fixed relay-focused nodes) and <strong>clients</strong> (user-focused mobile/personal nodes). Contact us on Discord if you want help building or operating a repeater.</p>
|
||||||
|
|
||||||
|
<h2>Recommended Hardware</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Heltec LoRa 32 V4</strong> - popular low-cost option and a common first node. Typical price: <strong>$25-$35</strong>.</li>
|
||||||
|
<li><strong>LILYGO T-Echo</strong> - portable handheld form factor with an integrated display and battery support. Typical price: <strong>$40-$80</strong> depending on configuration.</li>
|
||||||
|
<li><strong>RAK4631 Development Board</strong> - a common choice for reliable fixed installations with low-power operation and flexible deployment options. Typical combined core + base price: <strong>$30-$45</strong>.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Typical Installation Locations</h2>
|
||||||
|
<p>Fixed nodes in strong locations often improve neighborhood coverage for many nearby users, not just the node owner, and even modest elevation can make a big difference. For example, an upstairs attic-window repeater can significantly improve in-home and neighborhood reception, and a few extra feet of height can meaningfully improve overall mesh performance.</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Indoor locations:</strong> Attic or top-floor window positions with clear line-of-sight.</li>
|
||||||
|
<li><strong>Outdoor home locations:</strong> Rooftop mast or chimney mount, balcony rail, garage or shed roof, fences, trees, and old over-the-air TV antenna roof mounts.</li>
|
||||||
|
<li><strong>Hosted or remote sites:</strong> Hilltop, tower, or shared hosted locations with sun exposure for solar operation, including off-grid sites with no utility infrastructure.</li>
|
||||||
|
<li><strong>Mobile deployments:</strong> Vehicle-based nodes for mapping and temporary event coverage.</li>
|
||||||
|
</ul>
|
||||||
|
<div class="note"><strong>Safety Note:</strong> Use a spotter when working on a ladder or on a roof.</div>
|
||||||
|
|
||||||
|
<h2>Meshtastic vs MeshCore in CT Mesh</h2>
|
||||||
|
<p>Both platforms are still useful, and many members experiment with both. In the CT Mesh fixed-node community, Meshtastic has gradually been replaced in many deployments by MeshCore as operators have seen stronger day-to-day reliability and broader platform functionality from current MeshCore firmware.</p>
|
||||||
|
<p>If you are starting fresh and your goal is reliable fixed-node service, MeshCore is often the first recommendation from local operators.</p>
|
||||||
|
|
||||||
|
<h1>Learn More</h1>
|
||||||
|
<p>Start with our local guides, then review official project docs and community channels to choose the right platform for your goals.</p>
|
||||||
|
<div class="button-row">
|
||||||
|
<a class="btn" href="meshcore-resources.html">MeshCore Guides & Tools</a>
|
||||||
|
<a class="btn" href="meshtastic-resources.html">Meshtastic Guides & Tools</a>
|
||||||
|
<a class="btn btn-secondary" href="https://ctmesh.org/discord" target="_blank">Join CT Mesh Discord</a>
|
||||||
|
<a class="btn btn-secondary" href="https://meshcore.co.uk/" target="_blank">Official MeshCore Site</a>
|
||||||
|
<a class="btn btn-secondary" href="https://meshtastic.org/" target="_blank">Official Meshtastic Site</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a class="btn btn-secondary back-link" href="index.html">Back to CT Mesh</a>
|
||||||
|
|
||||||
|
<footer class="site-footer">
|
||||||
|
<p><a href="https://ctmesh.org/">CT Mesh</a> is a volunteer-run user group for mesh technology enthusiasts in Connecticut.</p>
|
||||||
|
<p><a href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank" rel="noopener">Content licensed CC BY-SA 4.0</a></p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user