From b5688eee665cec3d9cd1a779d4cc20752d5691ae Mon Sep 17 00:00:00 2001 From: MrAlders0n Date: Thu, 24 Sep 2026 13:11:40 -0400 Subject: [PATCH] Add unlisted ON/QC region scopes proposal page --- docs/assets/styles/scopes-proposal.css | 762 +++++++++++++++++++++++++ docs/proposals/onqc-scopes.fr.md | 408 +++++++++++++ docs/proposals/onqc-scopes.md | 391 +++++++++++++ 3 files changed, 1561 insertions(+) create mode 100644 docs/assets/styles/scopes-proposal.css create mode 100644 docs/proposals/onqc-scopes.fr.md create mode 100644 docs/proposals/onqc-scopes.md diff --git a/docs/assets/styles/scopes-proposal.css b/docs/assets/styles/scopes-proposal.css new file mode 100644 index 0000000..8775363 --- /dev/null +++ b/docs/assets/styles/scopes-proposal.css @@ -0,0 +1,762 @@ +/* ON/QC region scopes proposal: page-only diagrams and layout. */ + +:root { + --scp-city: #1458b0; + --scp-city-bg: #e8f0fb; + --scp-prov: #146c43; + --scp-prov-bg: #e5f4ec; + --scp-mesh: #6b36a8; + --scp-mesh-bg: #f1e8fb; + --scp-any: #526174; + --scp-any-bg: #eef3f8; + --scp-ok: var(--mc-color-success); + --scp-ok-bg: #e5f4ec; + --scp-drop: var(--mc-color-danger); + --scp-drop-bg: #fdecea; +} + +[data-md-color-scheme="slate"] { + --scp-city: #7db7ff; + --scp-city-bg: rgb(125 183 255 / 14%); + --scp-prov: #78dfa7; + --scp-prov-bg: rgb(120 223 167 / 12%); + --scp-mesh: #c9a4ff; + --scp-mesh-bg: rgb(201 164 255 / 14%); + --scp-any: #b6c0ce; + --scp-any-bg: rgb(182 192 206 / 12%); + --scp-ok: #78dfa7; + --scp-ok-bg: rgb(120 223 167 / 12%); + --scp-drop: #ffaaa3; + --scp-drop-bg: rgb(255 170 163 / 12%); +} + +/* Undo the theme's list indents inside diagrams. */ +[dir] .md-typeset .scp-checks, +[dir] .md-typeset .scp-steps, +[dir] .md-typeset .scp-track, +[dir] .md-typeset .scp-timeline, +[dir] .md-typeset .scp-hero__badges { + margin-right: 0; + margin-left: 0; + padding: 0; + list-style: none; +} + +[dir] .md-typeset .scp-checks > li, +[dir] .md-typeset .scp-steps > li, +[dir] .md-typeset .scp-track > li, +[dir] .md-typeset .scp-timeline > li, +[dir] .md-typeset .scp-hero__badges > li { + margin-right: 0; + margin-left: 0; +} + +/* ---------- Hero ---------- */ + +.scp-hero { + margin: var(--mc-space-4) 0 var(--mc-space-8); + padding: var(--mc-space-6); + border: 1px solid var(--mc-color-border); + border-radius: var(--mc-radius-lg); + background: + linear-gradient(135deg, var(--scp-city-bg), transparent 45%), + linear-gradient(315deg, var(--scp-mesh-bg), transparent 45%), + var(--mc-color-surface); + box-shadow: var(--mc-shadow-1); +} + +.scp-hero > :first-child { margin-top: 0; } +.scp-hero > :last-child { margin-bottom: 0; } + +[dir] .md-typeset .scp-hero__badges { + display: flex; + flex-wrap: wrap; + gap: var(--mc-space-2); + margin: var(--mc-space-4) 0 0; + padding: 0; + list-style: none; +} + +.md-typeset .scp-hero__badges li { + margin: 0; + padding: 0.2rem 0.65rem; + border: 1px solid var(--mc-color-border); + border-radius: 999px; + background: var(--mc-color-surface); + font-size: 0.78rem; + font-weight: 650; +} + +.scp-hero__badges li[data-kind="proposal"] { + border-color: var(--mc-color-warning); + color: var(--mc-color-warning); +} + +/* ---------- Tags ---------- */ + +.md-typeset .scp-tag { + display: inline-block; + padding: 0.05rem 0.5rem; + border: 1px solid currentcolor; + border-radius: 999px; + font-family: var(--mc-font-code); + font-size: 0.85em; + font-weight: 700; + line-height: 1.5; + white-space: nowrap; +} + +.scp-tag[data-level="city"] { color: var(--scp-city); background: var(--scp-city-bg); } +.scp-tag[data-level="prov"] { color: var(--scp-prov); background: var(--scp-prov-bg); } +.scp-tag[data-level="mesh"] { color: var(--scp-mesh); background: var(--scp-mesh-bg); } +.scp-tag[data-level="any"] { color: var(--scp-any); background: var(--scp-any-bg); } +.scp-tag[data-level="bad"] { color: var(--scp-drop); background: var(--scp-drop-bg); } + +/* ---------- Summary cards ---------- */ + +.scp-levels-cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 9rem), 1fr)); + gap: var(--mc-space-4); + margin: var(--mc-space-6) 0; +} + +.scp-level-card { + padding: var(--mc-space-4); + border: 1px solid var(--mc-color-border); + border-top: 0.35rem solid var(--scp-level, var(--mc-color-border)); + border-radius: var(--mc-radius-md); + background: var(--mc-color-surface); +} + +.scp-level-card[data-level="city"] { --scp-level: var(--scp-city); } +.scp-level-card[data-level="prov"] { --scp-level: var(--scp-prov); } +.scp-level-card[data-level="mesh"] { --scp-level: var(--scp-mesh); } + +.md-typeset .scp-level-card h3 { + margin: 0 0 var(--mc-space-2); + color: var(--scp-level); + font-size: 1rem; +} + +.md-typeset .scp-level-card p { + margin: var(--mc-space-2) 0 0; + font-size: 0.9rem; +} + +/* ---------- Figures ---------- */ + +.md-typeset .scp-figure { + display: block; + box-sizing: border-box; + width: 100%; + max-width: none; + container-type: inline-size; + text-align: left; + margin: var(--mc-space-6) 0 var(--mc-space-8); + padding: var(--mc-space-6); + border: 1px solid var(--mc-color-border); + border-radius: var(--mc-radius-lg); + background: var(--mc-color-surface); +} + +.md-typeset .scp-figure figcaption { + max-width: none; + margin: var(--mc-space-4) 0 0; + color: var(--mc-color-text-muted); + font-size: 0.85rem; + font-style: normal; + text-align: left; +} + +.scp-label { + margin: 0 0 var(--mc-space-2); + color: var(--mc-color-text-muted); + font-size: 0.72rem; + font-weight: 760; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +/* ---------- Diagram 1: the filter ---------- */ + +.scp-filter { + display: grid; + grid-template-columns: minmax(12rem, 15rem) minmax(0, 1fr); + gap: var(--mc-space-6); + align-items: center; +} + +[dir] .md-typeset .scp-checks { + display: grid; + gap: var(--mc-space-2); + margin: 0; + padding: 0; + list-style: none; +} + +.md-typeset .scp-checks > li { + display: grid; + grid-template-columns: minmax(0, 1fr) auto minmax(7.5rem, auto); + gap: var(--mc-space-2); + align-items: center; + margin: 0; +} + +.scp-checks__arrow { + color: var(--mc-color-text-muted); + font-weight: 700; +} + +.scp-packet, +.scp-result { + display: flex; + min-height: 2.6rem; + align-items: center; + gap: var(--mc-space-2); + padding: var(--mc-space-2) var(--mc-space-3); + border: 1px solid var(--mc-color-border); + border-radius: var(--mc-radius-md); + background: var(--mc-color-surface-raised); + font-size: 0.85rem; + line-height: 1.3; +} + +.scp-result { + justify-content: center; + font-weight: 700; +} + +.scp-result[data-result="ok"] { + border-color: var(--scp-ok); + background: var(--scp-ok-bg); + color: var(--scp-ok); +} + +.scp-result[data-result="drop"] { + border-color: var(--scp-drop); + background: var(--scp-drop-bg); + color: var(--scp-drop); +} + +.scp-repeater { + padding: var(--mc-space-4); + border: 2px solid var(--mc-color-text); + border-radius: var(--mc-radius-lg); + background: var(--mc-color-surface); + text-align: center; + box-shadow: var(--mc-shadow-2); +} + +.scp-repeater__icon { + display: block; + width: 2.5rem; + height: 2.5rem; + margin: 0 auto var(--mc-space-2); + color: var(--mc-color-text); +} + +.md-typeset .scp-repeater p { + margin: 0 0 var(--mc-space-2); + font-size: 0.85rem; + font-weight: 700; +} + +.scp-repeater__list { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: var(--mc-space-2); +} + +.md-typeset .scp-repeater small { + display: block; + margin-top: var(--mc-space-3); + color: var(--mc-color-text-muted); + font-size: 0.75rem; +} + +@container (max-width: 40rem) { + .scp-filter { + grid-template-columns: minmax(0, 1fr); + } + + .md-typeset .scp-checks > li { + grid-template-columns: minmax(0, 1fr) auto; + } + + .scp-checks__arrow { + display: none; + } + + .scp-result { + min-width: 6.5rem; + } +} + +.scp-rule { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr)); + gap: var(--mc-space-3); + margin-top: var(--mc-space-6); +} + +.scp-rule__item { + padding: var(--mc-space-3) var(--mc-space-4); + border-left: 0.3rem solid var(--scp-rule, var(--mc-color-border)); + border-radius: var(--mc-radius-sm); + background: var(--mc-color-surface-raised); + font-size: 0.85rem; +} + +.scp-rule__item[data-result="ok"] { --scp-rule: var(--scp-ok); } +.scp-rule__item[data-result="drop"] { --scp-rule: var(--scp-drop); } + +/* ---------- Diagram 2: nested levels ---------- */ + +.scp-zone { + padding: var(--mc-space-4); + border: 2px solid var(--scp-zone); + border-radius: var(--mc-radius-lg); + background: var(--scp-zone-bg); +} + +.scp-zone[data-level="mesh"] { --scp-zone: var(--scp-mesh); --scp-zone-bg: var(--scp-mesh-bg); } +.scp-zone[data-level="prov"] { --scp-zone: var(--scp-prov); --scp-zone-bg: var(--mc-color-surface); } + +.scp-zone__title { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: var(--mc-space-2); + margin: 0 0 var(--mc-space-3); + color: var(--scp-zone); + font-size: 0.85rem; + font-weight: 760; +} + +.scp-zone__title span { + color: var(--mc-color-text-muted); + font-weight: 500; +} + +.scp-zone__row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); + gap: var(--mc-space-4); +} + +.scp-cities { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr)); + gap: var(--mc-space-2); +} + +.scp-city { + padding: var(--mc-space-2) var(--mc-space-3); + border: 1px solid var(--scp-city); + border-radius: var(--mc-radius-md); + background: var(--scp-city-bg); +} + +.scp-city strong { + display: block; + color: var(--scp-city); + font-family: var(--mc-font-code); + font-size: 0.95rem; +} + +.scp-city span { + display: block; + color: var(--mc-color-text-muted); + font-size: 0.72rem; + line-height: 1.35; +} + +.scp-city[data-more] { + border-style: dashed; + background: transparent; +} + +.scp-flat { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--mc-space-3); + margin-top: var(--mc-space-6); + padding: var(--mc-space-4); + border: 1px dashed var(--mc-color-border); + border-radius: var(--mc-radius-md); + background: var(--mc-color-surface-raised); + font-size: 0.88rem; +} + +.scp-flat__list { + display: flex; + flex-wrap: wrap; + gap: var(--mc-space-2); +} + +/* ---------- Diagram 3: region def cursor ---------- */ + +.scp-tape { + display: flex; + flex-wrap: wrap; + gap: var(--mc-space-2); + align-items: center; + margin-bottom: var(--mc-space-6); + padding: var(--mc-space-3) var(--mc-space-4); + border-radius: var(--mc-radius-md); + background: #172033; + color: #f3f6fb; + font-family: var(--mc-font-code); + font-size: 0.95rem; +} + +[data-md-color-scheme="slate"] .scp-tape { + background: #0a0f18; +} + +.scp-tape__cmd { + margin-right: var(--mc-space-2); + color: #b6c0ce; +} + +.scp-tape__tok { + padding: 0.1rem 0.45rem; + border-radius: var(--mc-radius-sm); + background: rgb(255 255 255 / 10%); +} + +.scp-tape__tok b { + display: inline-block; + min-width: 1.1rem; + margin-right: 0.35rem; + border-radius: 999px; + background: #ffd166; + color: #172033; + font-size: 0.7rem; + text-align: center; +} + +.scp-tape__tok[data-kind="jump"] { + background: rgb(255 209 102 / 18%); + color: #ffd166; +} + +[dir] .md-typeset .scp-steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 9.5rem), 1fr)); + gap: var(--mc-space-3); + margin: 0; + padding: 0; + list-style: none; + counter-reset: scp-step; +} + +.md-typeset .scp-steps > li { + position: relative; + margin: 0; + padding: 2.3rem var(--mc-space-3) var(--mc-space-3); + border: 1px solid var(--mc-color-border); + border-radius: var(--mc-radius-md); + background: var(--mc-color-surface-raised); + font-size: 0.8rem; + counter-increment: scp-step; +} + +.md-typeset .scp-steps > li::before { + position: absolute; + top: var(--mc-space-2); + left: var(--mc-space-3); + width: 1.3rem; + height: 1.3rem; + border-radius: 999px; + background: #ffd166; + color: #172033; + content: counter(scp-step); + font-size: 0.72rem; + font-weight: 800; + line-height: 1.3rem; + text-align: center; +} + +.scp-steps code { + font-weight: 700; +} + +.scp-tree { + margin: var(--mc-space-2) 0 0; + padding: var(--mc-space-2); + border-radius: var(--mc-radius-sm); + background: var(--mc-color-surface); + font-family: var(--mc-font-code); + font-size: 0.78rem; + line-height: 1.5; + white-space: pre; +} + +.scp-tree mark { + padding: 0 0.15rem; + border-radius: 0.2rem; + background: #ffd166; + color: #172033; +} + +.scp-compare { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr)); + gap: var(--mc-space-4); + margin-top: var(--mc-space-6); +} + +.scp-compare__item { + padding: var(--mc-space-4); + border: 1px solid var(--mc-color-border); + border-top: 0.3rem solid var(--scp-compare, var(--mc-color-border)); + border-radius: var(--mc-radius-md); + background: var(--mc-color-surface-raised); +} + +.scp-compare__item[data-result="ok"] { --scp-compare: var(--scp-ok); } +.scp-compare__item[data-result="meh"] { --scp-compare: var(--mc-color-warning); } + +.md-typeset .scp-compare__item p { + margin: 0 0 var(--mc-space-2); + font-size: 0.85rem; +} + +.md-typeset .scp-compare__item .scp-tree { + background: var(--mc-color-surface); +} + +/* ---------- Diagram 4: DM route ---------- */ + +.scp-route + .scp-route { + margin-top: var(--mc-space-6); +} + +.scp-route__head { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: var(--mc-space-2); + margin-bottom: var(--mc-space-3); + font-size: 0.9rem; + font-weight: 700; +} + +.scp-route__verdict { + margin-left: auto; + padding: 0.1rem 0.6rem; + border-radius: 999px; + font-size: 0.78rem; +} + +.scp-route__verdict[data-result="ok"] { background: var(--scp-ok-bg); color: var(--scp-ok); } +.scp-route__verdict[data-result="drop"] { background: var(--scp-drop-bg); color: var(--scp-drop); } + +[dir] .md-typeset .scp-track { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 0; + align-items: stretch; + margin: 0; + padding: 0; + list-style: none; +} + +.md-typeset .scp-track > li { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + margin: 0; + padding: 0 0.2rem; + text-align: center; +} + +/* connector line between stops */ +.scp-track > li::before { + position: absolute; + top: 1.35rem; + left: -50%; + width: 100%; + height: 0.28rem; + border-radius: 999px; + background: var(--scp-ok); + content: ""; +} + +.scp-track > li:first-child::before { + display: none; +} + +.scp-track > li[data-link="drop"]::before, +.scp-track > li[data-link="none"]::before { + background: repeating-linear-gradient( + 90deg, + var(--mc-color-border) 0 0.4rem, + transparent 0.4rem 0.7rem + ); +} + +.scp-track > li[data-link="drop"]::after { + position: absolute; + z-index: 2; + top: 0.55rem; + left: -0.8rem; + display: grid; + width: 1.6rem; + height: 1.6rem; + place-items: center; + border-radius: 999px; + background: var(--scp-drop); + color: var(--mc-color-surface); + content: "✕"; + font-size: 0.85rem; + font-weight: 800; +} + +.scp-stop { + position: relative; + z-index: 1; + display: grid; + width: 2.7rem; + height: 2.7rem; + place-items: center; + border: 2px solid var(--scp-stop, var(--mc-color-text)); + border-radius: var(--scp-stop-radius, var(--mc-radius-md)); + background: var(--mc-color-surface); + color: var(--scp-stop, var(--mc-color-text)); + font-size: 1.1rem; +} + +.scp-stop svg { + width: 1.35rem; + height: 1.35rem; +} + +.scp-stop[data-kind="phone"] { --scp-stop-radius: 0.8rem; } +.scp-stop[data-kind="repeater"] { --scp-stop-radius: 999px; } +.scp-stop[data-state="dim"] { opacity: 0.45; } + +.md-typeset .scp-track strong { + margin-top: var(--mc-space-2); + font-size: 0.78rem; + line-height: 1.25; +} + +.md-typeset .scp-track small { + margin-top: 0.15rem; + color: var(--mc-color-text-muted); + font-family: var(--mc-font-code); + font-size: 0.66rem; + line-height: 1.3; +} + +@container (max-width: 34.99rem) { + .md-typeset .scp-track strong { font-size: 0.68rem; } + .md-typeset .scp-track small { font-size: 0.58rem; } + .scp-stop { width: 2.2rem; height: 2.2rem; } + .scp-track > li::before { top: 1.1rem; } + .scp-track > li[data-link="drop"]::after { top: 0.35rem; } +} + +.scp-route__note { + margin: var(--mc-space-3) 0 0; + padding: var(--mc-space-2) var(--mc-space-3); + border-radius: var(--mc-radius-sm); + background: var(--mc-color-surface-raised); + font-size: 0.82rem; +} + +/* ---------- Command explanations ---------- */ + +.md-typeset .scp-explain { + display: grid; + grid-template-columns: max-content minmax(0, 1fr); + gap: var(--mc-space-2) var(--mc-space-4); + margin: var(--mc-space-3) 0 var(--mc-space-6); + font-size: 0.88rem; +} + +.md-typeset .scp-explain dt { + font-family: var(--mc-font-code); + font-size: 0.82rem; + font-weight: 700; +} + +.md-typeset .scp-explain dd { + margin: 0; +} + +@media (max-width: 44.99rem) { + .md-typeset .scp-explain { + grid-template-columns: minmax(0, 1fr); + } + + .md-typeset .scp-explain dd { + margin-bottom: var(--mc-space-3); + } +} + +/* ---------- Diagram 5: timeline ---------- */ + +[dir] .md-typeset .scp-timeline { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 9.5rem), 1fr)); + gap: var(--mc-space-4); + margin: var(--mc-space-6) 0; + padding: 0; + list-style: none; +} + +.md-typeset .scp-timeline > li { + position: relative; + margin: 0; + padding: var(--mc-space-6) var(--mc-space-4) var(--mc-space-4); + border: 1px solid var(--mc-color-border); + border-top: 0.35rem solid var(--scp-phase, var(--mc-color-action)); + border-radius: var(--mc-radius-md); + background: var(--mc-color-surface); + font-size: 0.86rem; +} + +.md-typeset .scp-timeline > li::before { + display: block; + margin-bottom: var(--mc-space-1); + color: var(--scp-phase, var(--mc-color-action)); + content: attr(data-phase); + font-size: 0.72rem; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.scp-timeline > li:nth-child(1) { --scp-phase: var(--scp-city); } +.scp-timeline > li:nth-child(2) { --scp-phase: var(--scp-mesh); } +.scp-timeline > li:nth-child(3) { --scp-phase: var(--scp-prov); } + +.md-typeset .scp-timeline h3 { + margin: 0 0 var(--mc-space-2); + font-size: 1rem; +} + +.md-typeset .scp-timeline p, +.md-typeset .scp-timeline ul { + margin: var(--mc-space-2) 0 0; +} + +@media (prefers-reduced-motion: no-preference) { + .scp-track[data-animate] > li:not([data-link="drop"], [data-link="none"])::before { + background-image: linear-gradient(90deg, transparent 0 40%, rgb(255 255 255 / 55%) 50%, transparent 60% 100%); + background-size: 250% 100%; + animation: scp-flow 2.4s linear infinite; + } +} + +@keyframes scp-flow { + from { background-position: 100% 0; } + to { background-position: -150% 0; } +} diff --git a/docs/proposals/onqc-scopes.fr.md b/docs/proposals/onqc-scopes.fr.md new file mode 100644 index 0000000..e8a0856 --- /dev/null +++ b/docs/proposals/onqc-scopes.fr.md @@ -0,0 +1,408 @@ +--- +title: Proposition de portées de région ON/QC +description: Une proposition pour simplifier les portées de région MeshCore en Ontario et au Québec, avec des codes de ville, de province et de réseau. +audience: + - repeater-operator + - companion-user +task: review-onqc-scopes-proposal +scope: experimental +status: experimental +status_notice: false +owner: region-maintainers +last_reviewed: 2026-09-24 +review_by: 2026-12-24 +difficulty: intermediate +estimated_time: 10 minutes +destructive: false +search: + exclude: true +page_styles: + - assets/styles/scopes-proposal.css?v=20260924-1 +--- + +# Proposition de portées de région ON/QC + +
+

Proposition à discuter

+

Les portées de région empêchent les échanges locaux d’inonder tout le réseau. La configuration actuelle est difficile à suivre. Cette proposition la ramène à trois codes faciles à retenir partout en Ontario et au Québec.

+ +
+ +## En bref + +Chaque répéteur porte trois codes. Vous choisissez jusqu’où va un message en +choisissant l’un d’eux. + +
+
+

Ville

+ yow yul yqb +

Votre secteur. Les mêmes codes que MeshMapper.

+
+
+

Province

+ on qc +

Tous les répéteurs de la province.

+
+
+

Réseau

+ onqc +

Tous les répéteurs de l’Ontario et du Québec.

+
+
+ +- **Les répéteurs** portent leur ville, leur province et `onqc`. +- **Les téléphones** utilisent `onqc` par défaut, pour que les messages privés + joignent tout le monde. +- **Les canaux locaux** comme `#public` sont réglés sur votre ville, pour que + les échanges restent locaux. +- **Les messages sans portée** continuent de fonctionner pendant le projet + pilote. + +## Qu’est-ce qu’une portée? + +Une portée est un nom court joint à un message, par exemple `yow`. Les +répéteurs s’en servent pour décider s’ils relaient le message. + +
+Une portée n’est **pas** du chiffrement et **pas** une clôture GPS. Tout le +monde peut lire le nom, et il n’a rien à voir avec l’endroit où vous êtes. C’est +seulement une étiquette qui dit : « les répéteurs qui portent ce nom, relayez +ce message ». +
+ +Votre application transforme le nom en un petit code et le place dans +l’en-tête du message. Chaque répéteur garde une liste des noms qu’il relaie. +Quand un message arrive, le répéteur compare le code à sa liste. + +## Comment un répéteur décide + +Voici un répéteur d’Ottawa configuré selon cette proposition, et ce qu’il fait +avec cinq messages différents. + +
+
+
+ +

Répéteur d’Ottawa

+
+ * + yow + on + onqc +
+ Sa liste de noms à relayer +
+
    +
  • yow Canal d’OttawaRelayé
  • +
  • onqc MP vers QuébecRelayé
  • +
  • aucune Ancienne appli, sans portéeRelayé
  • +
  • yul Canal de MontréalRejeté
  • +
  • qc Canal de tout le QuébecRejeté
  • +
+
+
+
Le nom est sur la liste : il le relaie.
+
Le nom n’est pas sur la liste : il le rejette.
+
Aucune portée : le message compte comme *. Il est relayé seulement si * est permis.
+
Trop de sauts : rejeté dès qu’il dépasse flood.max, peu importe sa portée.
+
+
Le répéteur entend quand même tous les messages. La portée décide seulement s’il les relaie. Votre téléphone reçoit aussi tout ce qui l’atteint.
+
+ +Trois détails piègent souvent : + +- **L’orthographe doit être exacte.** `yow`, `YOW` et `ott` sont trois noms + différents. Un téléphone réglé sur `yow` est ignoré par un répéteur qui ne + porte que `ott`. +- **Seules les diffusions (flood) sont vérifiées.** Dès qu’un message privé a + un chemin connu, il suit ce chemin directement et les portées ne comptent + plus. +- **Il n’y a pas d’héritage.** Porter `on` ne veut pas dire porter `yow`. + Chaque nom doit être sur la liste à part entière. + +## Les trois niveaux + +
+
+

onqc Réseau Tous les répéteurs de l’Ontario et du Québec

+
+
+

on Ontario

+
+
yowOttawa, Lanark, Calabogie, Renfrew, Alfred
+
yyzToronto
+
ygkKingston
+
ykfWaterloo
+
…Autres zones MeshMapper
+
+
+
+

qc Québec

+
+
yulMontréal, Trois-Rivières
+
yqbVille de Québec
+
yowGatineau (partagé avec Ottawa)
+
ytfSaguenay–Lac-Saint-Jean
+
…Autres zones MeshMapper
+
+
+
+
+
+ Ce qu’un répéteur d’Ottawa garde vraiment : + *yowononqc + Une simple liste de noms. Les boîtes ci-dessus servent aux gens, pas au répéteur. +
+
La zone yow traverse la rivière des Outaouais. Les répéteurs de Gatineau utilisent yow pour leur ville et qc pour leur province.
+
+ +### Pourquoi des codes d’aéroport? + +- Ce sont les mêmes codes que MeshMapper utilise déjà, par exemple + `yow.meshmapper.net`. +- Il n’y a ni accent ni majuscule à se tromper. `montréal`, `Montreal` et + `montreal` seraient trois portées différentes. +- Ils sont neutres. Renfrew fait partie de la « zone YOW », pas d’« Ottawa ». + +La première fois, écrivez toujours le code avec son secteur, par exemple +`yow` (secteur Ottawa–Gatineau), pour que les gens l’apprennent. + +## Lire `region def yow|* on|* onqc` + +`region def` construit la liste d’un répéteur en une ligne. La commande garde un +**curseur** qui part du sommet, `*`. Chaque nom est créé sous le curseur, et +`|*` ramène le curseur au sommet. + +
+
+ region def + 1yow + 2|* + 3on + 4|* + 5onqc +
+
    +
  1. Crée yow sous le curseur. Le curseur entre dans yow.
    * +└ yow
  2. +
  3. |* ramène le curseur au sommet.
    * +└ yow
  4. +
  5. Crée on sous le curseur. Le curseur entre dans on.
    * +├ yow +└ on
  6. +
  7. |* ramène encore le curseur au sommet.
    * +├ yow +└ on
  8. +
  9. Crée onqc. Terminé.
    * +├ yow +├ on +└ onqc
  10. +
+
+
+

Avec |* : une liste à plat.

+
* +├ yow +├ on +└ onqc
+
+
+

Sans |* (region def yow on onqc) : chaque nom s’emboîte dans le précédent.

+
* +└ yow + └ on + └ onqc
+
+
+
Les deux versions relaient exactement les mêmes messages, parce que les répéteurs ignorent l’emboîtement. La version à plat est plus facile à lire et à vérifier. Le nom surligné indique la position du curseur.
+
+ +
+`region def` ajoute ou déplace des noms seulement. La commande ne supprime +jamais ceux qui existent déjà. Lancez `region` ensuite pour voir la liste +complète. +
+ +## Configuration du répéteur + +### Réglages standard de MeshCore Canada + +```text +set path.hash.mode 2 +set advert.interval 240 +set flood.advert.interval 47 +set flood.max 16 +``` + +
+
path.hash.mode 2
Utilise des identifiants de répéteur de 3 octets dans les chemins, pour que moins de répéteurs partagent un identifiant.
+
advert.interval 240
Annonce ce répéteur à ses voisins directs toutes les 4 heures.
+
flood.advert.interval 47
Annonce ce répéteur dans tout le réseau toutes les 47 heures.
+
flood.max 16
Aucune diffusion ne fait plus de 16 sauts, avec ou sans portée.
+
+ +### Réglages de région + +Choisissez votre secteur. Lanark, Calabogie, Renfrew et Alfred utilisent la +configuration d’Ottawa. Trois-Rivières utilise celle de Montréal. + +=== "Ottawa" + + ```text + region def yow|* on|* onqc + region allowf * + region default yow + region save + ``` + +=== "Gatineau" + + ```text + region def yow|* qc|* onqc + region allowf * + region default yow + region save + ``` + +=== "Montréal" + + ```text + region def yul|* qc|* onqc + region allowf * + region default yul + region save + ``` + +=== "Ville de Québec" + + ```text + region def yqb|* qc|* onqc + region allowf * + region default yqb + region save + ``` + +
+
region def …
Porter votre ville, votre province et onqc.
+
region allowf *
Relayer aussi les messages sans portée. C’est déjà le réglage par défaut. On le règle quand même pour que vous le voyiez.
+
region default yow
Les annonces de ce répéteur utilisent la portée de votre ville, pour rester locales.
+
region save
Conserve les réglages de région après un redémarrage. Les commandes set s’enregistrent d’elles-mêmes.
+
+ +Pour vérifier, lancez `region`. Vous devriez voir : + +```text +* F + yow F + on F + onqc F +``` + +`F` veut dire « diffusion permise » : le répéteur relaie ce nom. + +Un **répéteur passerelle** qui relie volontairement deux secteurs, par exemple +entre Ottawa et Montréal, peut aussi porter le code de la ville voisine. + +### Permettre ou rejeter : aide-mémoire + +| Commande | Effet | +| --- | --- | +| `region allowf ` | Relayer les messages portant ce nom | +| `region denyf ` | Rejeter les messages portant ce nom. Le répéteur les reçoit quand même. | +| `` | Peut être `*` pour les messages sans portée, ou un code comme `yow` | +| `set flood.max.unscoped ` | Une limite de sauts séparée pour les messages sans portée. Elle compte seulement si elle est plus basse que `flood.max`. `0` a le même effet que `region denyf *`. | +| `region save` | À lancer après chaque `allowf` ou `denyf` | + +## Configuration du téléphone et de l’appareil compagnon + +1. Ouvrez l’application MeshCore, puis **Settings → Experimental Settings → + Default Region Scope**. Ajoutez `onqc` et sélectionnez-le. +2. Ouvrez chaque canal local, comme `#public`. Dans le menu du canal, touchez + **Set Region Scope** et choisissez le code de votre ville, par exemple + `yow`. +3. Pour un canal qui doit aller plus loin, choisissez plutôt `on`, `qc` ou + `onqc`. + +## Pourquoi le téléphone utilise `onqc` par défaut + +On ne peut pas choisir la portée d’un seul message privé. Quand un MP n’a pas +encore de chemin connu, il est diffusé avec votre **portée par défaut**. La +réponse qui indique le chemin à votre téléphone revient avec la portée par +défaut **de votre contact**. + +
+
+
Portée par défaut yowN’arrive jamais
+
    +
  1. Vous, Ottawaenvoie yow
  2. +
  3. Répéteur d’Ottawayow on onqc
  4. +
  5. Répéteur de Montréalyul qc onqc
  6. +
  7. Répéteur de Québecyqb qc onqc
  8. +
  9. Ami, Québecdéfaut yqb
  10. +
+

Le répéteur de Montréal ne porte pas yow, donc le message s’arrête là. Même s’il passait, la réponse de votre ami utiliserait yqb et s’arrêterait au retour.

+
+
+
Portée par défaut onqcLivré
+
    +
  1. Vous, Ottawaenvoie onqc
  2. +
  3. Répéteur d’Ottawayow on onqc
  4. +
  5. Répéteur de Montréalyul qc onqc
  6. +
  7. Répéteur de Québecyqb qc onqc
  8. +
  9. Ami, Québecdéfaut onqc
  10. +
+

Tous les répéteurs portent onqc, dans les deux sens. Une fois le chemin trouvé, les MP suivants passent directement et les portées ne comptent plus.

+
+
Les connexions à un répéteur ou à un serveur de salon fonctionnent de la même façon quand aucun chemin n’est connu.
+
+ +
+**Le piège :** un canal sans portée propre utilise aussi votre portée par +défaut. Avec `onqc` par défaut, un `#public` sans portée joindrait tout +l’Ontario et le Québec. C’est pourquoi l’étape 2 de la configuration du +téléphone règle les canaux locaux sur votre ville. +
+ +## Déploiement + +
    +
  1. Répéteurs

    Les propriétaires ajoutent leurs trois codes et gardent * permis. Rien ne brise pour personne.

  2. +
  3. Téléphones

    Les utilisateurs règlent leur portée par défaut sur onqc et leurs canaux locaux sur leur ville.

  4. +
  5. Bascule

    À une date convenue, les répéteurs lancent set flood.max.unscoped 3. Les messages sans portée restent alors à 3 sauts ou moins, tandis que les messages avec portée atteignent encore 16 sauts.

  6. +
+ +## À savoir + +- **Les annonces des répéteurs restent dans leur ville.** Les utilisateurs de + Montréal ne verront pas les répéteurs d’Ottawa par les annonces diffusées. +- **Les répéteurs qui ont déjà d’anciennes régions**, comme `can`, `on-alg` ou + `ott`, devraient les retirer. Lancez d’abord la nouvelle ligne + `region def`, qui déplace `on` au sommet. Lancez ensuite `region` pour voir + ce qui reste, retirez les anciens noms du bas vers le haut avec + `region remove `, puis terminez avec `region save`. +- **16 sauts doivent suffire.** `flood.max` s’applique aussi à `onqc`. Si le + plus long chemin réel dans le réseau dépasse 16 sauts, les messages qui + traversent le réseau s’arrêteront en chemin. +- **Versions :** `region def` exige le micrologiciel 1.16 ou plus récent sur le + répéteur. La portée par défaut dans l’application exige MeshCore 1.43 ou plus + récent. + +## Prochaines étapes + +- S’entendre sur la liste des codes de ville pour l’Ontario et le Québec. +- Ajouter à meshcore.ca un outil « trouvez votre ville » qui affiche votre code. +- Publier les commandes de nettoyage et de configuration pour chaque ville. +- Ajouter un mode simple Ontario et Québec au + [configurateur de répéteur](../config/index.md). +- Les autres provinces gardent la configuration actuelle jusqu’à ce que le + projet pilote ait fait ses preuves. + +Des idées? Partagez-les sur le +[Discord de MeshCore Canada](https://discord.gg/BESFVMt7yk) ou sur le +[forum](https://forum.meshcore.ca/). diff --git a/docs/proposals/onqc-scopes.md b/docs/proposals/onqc-scopes.md new file mode 100644 index 0000000..462a347 --- /dev/null +++ b/docs/proposals/onqc-scopes.md @@ -0,0 +1,391 @@ +--- +title: ON/QC region scopes proposal +description: A proposal for simpler MeshCore region scopes in Ontario and Québec, with city, province, and mesh-wide codes. +audience: + - repeater-operator + - companion-user +task: review-onqc-scopes-proposal +scope: experimental +status: experimental +status_notice: false +owner: region-maintainers +last_reviewed: 2026-09-24 +review_by: 2026-12-24 +difficulty: intermediate +estimated_time: 10 minutes +destructive: false +search: + exclude: true +page_styles: + - assets/styles/scopes-proposal.css?v=20260924-1 +--- + +# ON/QC region scopes proposal + +
+

Proposal for discussion

+

Region scopes stop local chatter from flooding the whole network. Today's setup is hard to follow, so this proposal cuts it down to three codes that everyone in Ontario and Québec can remember.

+
    +
  • Not adopted yet
  • +
  • Ontario + Québec pilot
  • +
  • Repeater firmware 1.16+
  • +
  • MeshCore app 1.43+
  • +
+
+ +## The short version + +Every repeater carries three codes. You pick how far a message travels by picking one of them. + +
+
+

City

+ yow yul yqb +

Your local area. Same codes as MeshMapper.

+
+
+

Province

+ on qc +

Every repeater in that province.

+
+
+

Mesh

+ onqc +

Every repeater in Ontario and Québec.

+
+
+ +- **Repeaters** carry their city, their province, and `onqc`. +- **Phones** use `onqc` as their default, so direct messages reach anyone. +- **Local channels** such as `#public` are set to your city, so chatter stays local. +- **Messages with no scope** keep working during the pilot. + +## What a scope is + +A scope is a short name attached to a message, such as `yow`. Repeaters use it +to decide whether to pass the message on. + +
+A scope is **not** encryption and **not** a GPS fence. Anyone can read the +name, and it has nothing to do with where you are. It is only a label that +says "repeaters that carry this name, please forward this." +
+ +Your app turns the name into a small code and puts it in the message header. +Every repeater keeps a list of names it will forward. When a message arrives, +the repeater checks the code against its list. + +## How a repeater decides + +Here is an Ottawa repeater under this proposal, and what it does with five +different messages. + +
+
+
+ +

Ottawa repeater

+
+ * + yow + on + onqc +
+ Its list of names to forward +
+
    +
  • yow Ottawa channelForwarded
  • +
  • onqc DM to Québec CityForwarded
  • +
  • none Older app, no scopeForwarded
  • +
  • yul Montréal channelDropped
  • +
  • qc Québec-wide channelDropped
  • +
+
+
+
Name is on the list: forward it.
+
Name is not on the list: drop it.
+
No scope at all: it counts as *. Forward it only if * is allowed.
+
Too many hops: dropped once it passes flood.max, whatever its scope.
+
+
The repeater still hears every message. A scope only decides whether it passes the message on. Your phone also receives everything that reaches it.
+
+ +Three details catch people out: + +- **Spelling must be exact.** `yow`, `YOW` and `ott` are three different + names. A phone set to `yow` is ignored by a repeater that only carries `ott`. +- **Only floods are checked.** Once a direct message has a known path, it goes + straight along that path and scopes no longer matter. +- **There is no inheritance.** Carrying `on` does not mean carrying `yow`. + Each name has to be on the list by itself. + +## The three levels + +
+
+

onqc Mesh Every repeater in Ontario and Québec

+
+
+

on Ontario

+
+
yowOttawa, Lanark, Calabogie, Renfrew, Alfred
+
yyzToronto
+
ygkKingston
+
ykfWaterloo
+
…Other MeshMapper zones
+
+
+
+

qc Québec

+
+
yulMontréal, Trois-Rivières
+
yqbQuébec City
+
yowGatineau (shared with Ottawa)
+
ytfSaguenay–Lac-Saint-Jean
+
…Other MeshMapper zones
+
+
+
+
+
+ What an Ottawa repeater actually stores: + *yowononqc + A flat list of names. The boxes above are for people, not for the repeater. +
+
The yow zone crosses the Ottawa River. Gatineau repeaters use yow for their city and qc for their province.
+
+ +### Why airport codes? + +- They are the same codes MeshMapper already uses, for example + `yow.meshmapper.net`. +- There are no accents or capital letters to get wrong. `montréal`, + `Montreal` and `montreal` would be three different scopes. +- They are neutral. Renfrew is in the "YOW zone", not in "Ottawa". + +Always write the code with its area the first time, for example +`yow` (Ottawa / NCR area), so people learn it. + +## Reading `region def yow|* on|* onqc` + +`region def` builds a repeater's list in one line. It keeps a **cursor** that +starts at the top, `*`. Each name is created under the cursor, and `|*` jumps +the cursor back to the top. + +
+
+ region def + 1yow + 2|* + 3on + 4|* + 5onqc +
+
    +
  1. Create yow under the cursor. The cursor moves into yow.
    * +└ yow
  2. +
  3. |* jumps the cursor back to the top.
    * +└ yow
  4. +
  5. Create on under the cursor. The cursor moves into on.
    * +├ yow +└ on
  6. +
  7. |* jumps back to the top again.
    * +├ yow +└ on
  8. +
  9. Create onqc. Done.
    * +├ yow +├ on +└ onqc
  10. +
+
+
+

With |*: a flat list.

+
* +├ yow +├ on +└ onqc
+
+
+

Without |* (region def yow on onqc): each name nests inside the last.

+
* +└ yow + └ on + └ onqc
+
+
+
Both versions forward exactly the same messages, because repeaters ignore nesting. The flat version is easier to read and check. The highlighted name is where the cursor is.
+
+ +
+`region def` only adds or moves names. It never deletes the ones already +there. Run `region` afterwards to see the full list. +
+ +## Repeater setup + +### Standard MeshCore Canada settings + +```text +set path.hash.mode 2 +set advert.interval 240 +set flood.advert.interval 47 +set flood.max 16 +``` + +
+
path.hash.mode 2
Uses 3-byte repeater IDs in message paths, so fewer repeaters share an ID.
+
advert.interval 240
Announces this repeater to direct neighbours every 4 hours.
+
flood.advert.interval 47
Announces this repeater across the network every 47 hours.
+
flood.max 16
No flood message travels more than 16 hops, scoped or not.
+
+ +### Region settings + +Pick your area. Lanark, Calabogie, Renfrew and Alfred use the Ottawa setup. Trois-Rivières uses the Montréal setup. + +=== "Ottawa" + + ```text + region def yow|* on|* onqc + region allowf * + region default yow + region save + ``` + +=== "Gatineau" + + ```text + region def yow|* qc|* onqc + region allowf * + region default yow + region save + ``` + +=== "Montréal" + + ```text + region def yul|* qc|* onqc + region allowf * + region default yul + region save + ``` + +=== "Québec" + + ```text + region def yqb|* qc|* onqc + region allowf * + region default yqb + region save + ``` + +
+
region def …
Carry your city, your province, and onqc.
+
region allowf *
Also forward messages with no scope. This is already on by default. We set it anyway so you can see it.
+
region default yow
This repeater's own adverts use your city's scope, so they stay local.
+
region save
Keeps the region settings after a reboot. The set commands save by themselves.
+
+ +To check, run `region`. You should see: + +```text +* F + yow F + on F + onqc F +``` + +`F` means "flood allowed": the repeater forwards that name. + +A **bridge repeater** that links two areas on purpose, for example between +Ottawa and Montréal, can also carry the neighbouring city code. + +### Allow or drop, quick reference + +| Command | What it does | +| --- | --- | +| `region allowf ` | Forward messages with that name | +| `region denyf ` | Drop messages with that name. The repeater still receives them itself. | +| `` | Can be `*` for messages with no scope, or a code such as `yow` | +| `set flood.max.unscoped ` | A separate hop limit for messages with no scope. It only matters when it is lower than `flood.max`. `0` has the same effect as `region denyf *`. | +| `region save` | Always run it after `allowf` or `denyf` | + +## Phone and companion setup + +1. Open the MeshCore app, then **Settings → Experimental Settings → Default + Region Scope**. Add `onqc` and select it. +2. Open each local channel, such as `#public`. Use the channel menu, then + **Set Region Scope**, and pick your city code, for example `yow`. +3. For a channel meant to reach further, pick `on`, `qc` or `onqc` instead. + +## Why the phone default is `onqc` + +You cannot pick a scope for a single direct message. When a DM has no known +path yet, it floods using your **default scope**. The reply that tells your +phone the path comes back using **your contact's** default scope. + +
+
+
Phone default yowNever arrives
+
    +
  1. You, Ottawasends yow
  2. +
  3. Ottawa repeateryow on onqc
  4. +
  5. Montréal repeateryul qc onqc
  6. +
  7. Québec repeateryqb qc onqc
  8. +
  9. Friend, Québec Citydefault yqb
  10. +
+

The Montréal repeater does not carry yow, so the message stops there. Even if it got through, your friend's reply would use yqb and stop on the way back.

+
+
+
Phone default onqcDelivered
+
    +
  1. You, Ottawasends onqc
  2. +
  3. Ottawa repeateryow on onqc
  4. +
  5. Montréal repeateryul qc onqc
  6. +
  7. Québec repeateryqb qc onqc
  8. +
  9. Friend, Québec Citydefault onqc
  10. +
+

Every repeater carries onqc, in both directions. Once the path is found, later DMs go direct and scopes no longer matter.

+
+
Logins to a repeater or room server work the same way when no path is known.
+
+ +
+**The catch:** a channel with no scope of its own also uses your default. With +`onqc` as the default, an unscoped `#public` would reach all of Ontario and +Québec. That is why step 2 of the phone setup sets local channels to your city. +
+ +## Rollout + +
    +
  1. Repeaters

    Owners add their three codes and keep * allowed. Nothing breaks for anyone.

  2. +
  3. Phones

    Users set their default to onqc and set local channels to their city.

  4. +
  5. Cutover

    On an agreed date, repeaters run set flood.max.unscoped 3. Messages with no scope then stay within 3 hops, while scoped messages still reach 16.

  6. +
+ +## Things to know + +- **Repeater adverts stay in their city.** Montréal users will not see Ottawa + repeaters through flood adverts. +- **Repeaters that already have older regions** such as `can`, `on-alg` or `ott` + should clear them. Run the new `region def` line first, which moves `on` to + the top. Then run `region` to see what is left, remove the old names from the + bottom up with `region remove `, and finish with `region save`. +- **16 hops has to be enough.** `flood.max` applies to `onqc` too. If the + longest real path across the mesh is longer than 16 hops, cross-mesh + messages will stop part way. +- **Versions:** `region def` needs repeater firmware 1.16 or newer. Default + scope in the app needs MeshCore 1.43 or newer. + +## Next steps + +- Agree on the list of city codes for Ontario and Québec. +- Add a "find your town" lookup to meshcore.ca that shows your code. +- Publish clean-up and setup commands for each city. +- Add a simple Ontario and Québec mode to the [repeater configurator](../config/index.md). +- Other provinces keep the current setup until the pilot has proven itself. + +Have thoughts? Share them on the +[MeshCore Canada Discord](https://discord.gg/BESFVMt7yk) or the +[forum](https://forum.meshcore.ca/).