From b301c8cde248ddd80da5f1d2bd2342d2b68bd882 Mon Sep 17 00:00:00 2001 From: mategogiberidze Date: Thu, 22 Oct 2026 00:22:32 +0400 Subject: [PATCH 1/3] Add a GitHub Pages project site One static page in site/ for app users: what MeshAnd does, features (chat and phone GPS marked as next version), who it's for, what you need, the install steps including the OsmAnd Plugins allow step, and links to the guides, releases and licence. Uses the Summit logo and pine/ember colours, follows the system light/dark setting, and works at phone width. The download button reads releases/latest from the GitHub API and falls back to the release page. pages.yml deploys site/ on pushes to main that touch it, separate from ci.yml and release.yml. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/pages.yml | 40 +++ AGENTS.md | 3 + README.md | 1 + site/index.html | 588 ++++++++++++++++++++++++++++++++++++ 4 files changed, 632 insertions(+) create mode 100644 .github/workflows/pages.yml create mode 100644 site/index.html diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..4a0d7ab --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,40 @@ +name: Pages + +# Publishes the static project site in site/ to GitHub Pages. +# Needs Settings → Pages → Source: GitHub Actions. + +on: + push: + branches: [main] + paths: + - site/** + - .github/workflows/pages.yml + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + deploy: + runs-on: ubuntu-latest + timeout-minutes: 10 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v7 + + - uses: actions/configure-pages@v6 + + - uses: actions/upload-pages-artifact@v5 + with: + path: site + + - id: deployment + uses: actions/deploy-pages@v5 diff --git a/AGENTS.md b/AGENTS.md index 439ec99..c822084 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,6 +82,9 @@ adb logcat -s MeshAnd MeshAnd/SDK - **CI:** `.github/workflows/ci.yml` runs tests, lint and a debug build on pushes to `main` and on PRs. - **Release notes:** `CHANGELOG.md`, one `## ` section per release, written for app users. The release workflow publishes that section (plus a download line and a compare link) as the GitHub Release text, and fails if it's missing. **Add the section before tagging.** - **Releases:** `.github/workflows/release.yml` runs on a `v*` tag. It requires the tag to equal `versionName`, signs using the secrets `MESHAND_KEYSTORE_BASE64` and `MESHAND_KEYSTORE_PASSWORD`, and publishes `MeshAnd-.apk` to GitHub Releases. +- **Website:** `site/index.html` is the project site, one static page with no build step. `.github/workflows/pages.yml` publishes `site/` to GitHub Pages (https://mategogiberidze.github.io/MeshAnd/) on pushes to `main` that touch `site/`, or by hand (Run workflow). The repo's Settings → Pages → Source must be **GitHub Actions**. + - It links to the guides on GitHub instead of copying them. The download button asks the GitHub API for `releases/latest`, so it needs no change per release. + - Features not yet in a release carry a "Next version" badge (currently Chat and Phone GPS). **When releasing, remove those badges and the note below the feature list.** Keep the text in step with `README.md` and `CHANGELOG.md`. ## Architecture (`app/src/main/java/com/meshand/app/`) - `MeshAndApp.kt`: the `Application` class. Owns `AppGraph` (settings, client, repository, OsmAnd bridge) for the whole process, wired by hand. diff --git a/README.md b/README.md index 8eef63c..797311b 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ ![Android 7+](https://img.shields.io/badge/Android-7%2B-3DDC84?logo=android&logoColor=white) **[Download the APK](https://github.com/mategogiberidze/MeshAnd/releases/latest)** · +[Website](https://mategogiberidze.github.io/MeshAnd/) · [Set up your radios](docs/radio-setup.md) · [What's new](CHANGELOG.md) · [Ask a question](https://github.com/mategogiberidze/MeshAnd/discussions) · diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..ed73fb9 --- /dev/null +++ b/site/index.html @@ -0,0 +1,588 @@ + + + + + +MeshAnd: your Meshtastic team on the OsmAnd map + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Your Meshtastic team, live on the OsmAnd map.

+

MeshAnd is a free Android app that connects to your own Meshtastic radio over + Bluetooth and puts everyone in your mesh on the map you already navigate with. + No internet. No mobile coverage. No extra map app to juggle.

+ +

Latest release on GitHub · What's new

+
    +
  • Android 7.0 or newer
  • +
  • A Meshtastic radio
  • +
  • OsmAnd, free or Pro
  • +
  • Free and open source
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + Nino + Luka + Ana + Giorgi + + + + Meshtastic team + + Nino320 m + Ana850 m + Luka1.4 km + + + + +
+
+ +
+
+

How it works

+

From radio to map, without the internet

+

Meshtastic radios are cheap, run for days on a battery and pass GPS positions and + messages to each other over long-range LoRa radio, kilometres apart, where phones have no + signal. MeshAnd brings those positions into OsmAnd, where your offline maps, tracks and + navigation already live.

+
    +
  1. +
    +

    Radios talk over LoRa

    +

    Each person carries a Meshtastic radio with GPS. The radios share positions over a + private channel, hopping through each other to reach further.

    +
  2. +
  3. +
    +

    MeshAnd listens over Bluetooth

    +

    MeshAnd connects to your own radio, picks up everyone it hears, and keeps the link alive + in your pocket with the screen off.

    +
  4. +
  5. +
    +

    OsmAnd shows the team

    +

    Every teammate appears on the OsmAnd map as a coloured point that moves as their radio + reports in. You keep using OsmAnd as usual.

    +
  6. +
+
+
+ +
+
+

Features

+

Everything happens on the map you already use

+
+
+
+

Team on the map

+

Every teammate is a coloured point on the OsmAnd map that moves as their radio reports + in. Each person keeps the same colour everywhere.

+
+
+
+

Team list inside OsmAnd

+

A map widget and a menu item list everyone nearest first, with distance. One tap shows + them on the map or starts navigation to them.

+
+
+
+

Trails

+

Tap a teammate on the map and choose Trail to see where they've been over the + last 30 minutes to 6 hours, drawn in their colour, with a marker where it started.

+
+
+
+

Shared pins

+

Tap a place in OsmAnd, then Share → MeshAnd pin. Your team gets a notification + and a pin on their map, sent as a tiny text message: meshand: 41.75002,44.77124.

+
+
+
+

Chat Next version

+

Every channel on your radio has its own conversation, and direct messages to one person + get theirs. You see when a message was delivered or relayed, and get a notification for + new ones.

+
+
+
+

Phone GPS for your radio Next version

+

If your radio's GPS is stuck indoors, in a car or broken, MeshAnd can give it your + phone's location. The radio shares it with the team on its usual schedule. Off until you + switch it on.

+
+
+
+

Is the GPS working?

+

See when your radio last got a new GPS position and how many satellites it sees. + Teammates whose radio keeps re-sending an old position are flagged "GPS not updating".

+
+
+
+

Quiet-teammate alerts

+

Choose who to watch, and get a notification if someone hasn't been heard for + 15 minutes to 2 hours.

+
+
+
    +
  • Stays connected in your pocket. Works with the screen off, reconnects by + itself and remembers your radio.
  • +
  • Remembers trails and pins across restarts, with one button to clear them.
  • +
  • Only shows people heard in the last 24 hours, so old nodes don't clutter + the map.
  • +
  • Light or dark theme, or follow the phone.
  • +
  • Mostly just listens. It transmits only what you choose to send, and never + changes your radio's settings.
  • +
  • No account, no server. Its only internet use is checking GitHub for a new + version, and you can switch that off.
  • +
+

Chat and phone GPS are finished and being field-tested. They'll arrive in the + next release; the current download doesn't have them yet.

+
+
+ +
+
+
+

Who it's for

+

Small groups heading out of coverage

+
    +
  • Hikers, cyclists and + riders who go where phones lose signal and want to know where everyone is.
  • +
  • Teams with Meshtastic + radios who'd rather not keep switching between a map app and a radio app.
  • +
  • OsmAnd users who + already navigate with its offline maps, contour lines and tracks.
  • +
  • Not for + iPhone. Only OsmAnd for Android lets other apps draw on its map. iPhone teammates + can use the Meshtastic iOS app; their radios still show up in MeshAnd.
  • +
+
+
+

What you need

+

Three things

+
+
+
+

An Android phone

+

Android 7.0 or newer. Tested on Android 7 and Android 16.

+
+
+
+

A Meshtastic radio with GPS, per person

+

Built and tested with the LILYGO T-Beam Supreme. Other Meshtastic radios + with Bluetooth and GPS should work too, including ones you build yourself.

+
+
+
+

OsmAnd

+

The free version from Google Play is enough. OsmAnd Pro works the same way.

+
+
+
+
+
+ +
+
+

Install

+

Up and running in five steps

+
    +
  1. +

    Set up the radios

    +

    With the official Meshtastic app: region, a private team channel, role Client, + and faster position updates. The defaults send a position only about once an hour, so + read the radio setup guide + for what to change and why.

    +
  2. +
  3. +

    Install MeshAnd

    +

    Download the APK from the latest release + and open it on the phone. Android will ask you to allow installing apps from that source.

    +
  4. +
  5. +

    Connect to your radio

    +

    Open MeshAnd, grant the Bluetooth permission, scan, and tap your radio. On the first + connection, type the 6-digit PIN shown on the radio's screen.

    +
  6. +
  7. +

    Allow MeshAnd in OsmAnd

    +

    Turn on Show on OsmAnd in MeshAnd. The first time, OsmAnd blocks new apps until + you allow them:

    +

    OsmAnd→Menu→Plugins→MeshAnd: on

    +
  8. +
  9. +

    Use OsmAnd as usual

    +

    Your team appears on the map. If the "Meshtastic team" widget doesn't show, enable it + under OsmAnd → Menu → Configure screen.

    +
  10. +
+

From then on, MeshAnd reconnects to your radio by itself. When you open it, + it tells you about new versions; install the new APK over the old one and your radio and + settings are kept. Every release is signed with the same key and comes with a + .sha256 file. Prefer automatic updates? Add the GitHub repository to + Obtainium.

+
+
+ +
+
+

Good to know

+

Before your first trip

+
+

Positions are only as fresh as the radios send them

+

A private channel and the position settings in the radio guide make a huge difference. + With them, a walking teammate updates about every minute.

+

One phone per radio

+

A radio talks to only one app over Bluetooth at a time. Disconnect the Meshtastic app + before connecting MeshAnd.

+

Battery savers

+

Some phones stop apps in the background. If the link drops with the screen off, exempt + MeshAnd from battery optimisation.

+

A hobby project

+

MeshAnd was written entirely by an AI (Claude Code), steered by a person who tested it + on real radios and phones. It works for us; read the code before trusting it with + anything important.

+
+
+
+ +
+ +
+
+ +
+
+ MeshAnd +

Free software under the GNU GPL v3.0. + Built on Meshtastic and its + Kotlin SDK, and + OsmAnd.

+

MeshAnd is an independent project, not affiliated with or endorsed by Meshtastic or OsmAnd. + Meshtastic® is a registered trademark of Meshtastic LLC.

+
+
+ + + + From f2d86639ea4b38b5bd78fed42019422ed79b17eb Mon Sep 17 00:00:00 2001 From: mategogiberidze Date: Thu, 22 Oct 2026 00:31:54 +0400 Subject: [PATCH 2/3] Publish the docs/ guides and changelog on the site with MkDocs site/build.sh renders docs/*.md and CHANGELOG.md with MkDocs Material under /docs/ (pine/ember theme, light/dark switch, search) and puts the landing page at the root. The Markdown files stay the only source; the Pages workflow now also runs when docs/ or CHANGELOG.md change. mkdocs and mkdocs-material are pinned (mkdocs stays below 2.0). Co-Authored-By: Claude Opus 5.5 --- .github/workflows/pages.yml | 18 ++++++++- AGENTS.md | 10 +++-- site/build.sh | 22 +++++++++++ site/guides/assets/extra.css | 33 ++++++++++++++++ site/guides/assets/logo.svg | 1 + site/guides/index.md | 39 +++++++++++++++++++ site/index.html | 13 ++++--- site/mkdocs.yml | 75 ++++++++++++++++++++++++++++++++++++ site/requirements.txt | 2 + 9 files changed, 202 insertions(+), 11 deletions(-) create mode 100755 site/build.sh create mode 100644 site/guides/assets/extra.css create mode 100644 site/guides/assets/logo.svg create mode 100644 site/guides/index.md create mode 100644 site/mkdocs.yml create mode 100644 site/requirements.txt diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 4a0d7ab..2a7327c 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,6 +1,7 @@ name: Pages -# Publishes the static project site in site/ to GitHub Pages. +# Publishes the project site to GitHub Pages: the landing page (site/index.html) at the root +# and the guides (docs/*.md, CHANGELOG.md) under /docs/, built by site/build.sh with MkDocs. # Needs Settings → Pages → Source: GitHub Actions. on: @@ -8,6 +9,8 @@ on: branches: [main] paths: - site/** + - docs/** + - CHANGELOG.md - .github/workflows/pages.yml workflow_dispatch: @@ -30,11 +33,22 @@ jobs: steps: - uses: actions/checkout@v7 + - uses: actions/setup-python@v7 + with: + python-version: "3.13" + cache: pip + cache-dependency-path: site/requirements.txt + + - name: Build the site + run: | + pip install -r site/requirements.txt + ./site/build.sh + - uses: actions/configure-pages@v6 - uses: actions/upload-pages-artifact@v5 with: - path: site + path: build/site - id: deployment uses: actions/deploy-pages@v5 diff --git a/AGENTS.md b/AGENTS.md index c822084..fbe4fe0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,9 +82,13 @@ adb logcat -s MeshAnd MeshAnd/SDK - **CI:** `.github/workflows/ci.yml` runs tests, lint and a debug build on pushes to `main` and on PRs. - **Release notes:** `CHANGELOG.md`, one `## ` section per release, written for app users. The release workflow publishes that section (plus a download line and a compare link) as the GitHub Release text, and fails if it's missing. **Add the section before tagging.** - **Releases:** `.github/workflows/release.yml` runs on a `v*` tag. It requires the tag to equal `versionName`, signs using the secrets `MESHAND_KEYSTORE_BASE64` and `MESHAND_KEYSTORE_PASSWORD`, and publishes `MeshAnd-.apk` to GitHub Releases. -- **Website:** `site/index.html` is the project site, one static page with no build step. `.github/workflows/pages.yml` publishes `site/` to GitHub Pages (https://mategogiberidze.github.io/MeshAnd/) on pushes to `main` that touch `site/`, or by hand (Run workflow). The repo's Settings → Pages → Source must be **GitHub Actions**. - - It links to the guides on GitHub instead of copying them. The download button asks the GitHub API for `releases/latest`, so it needs no change per release. - - Features not yet in a release carry a "Next version" badge (currently Chat and Phone GPS). **When releasing, remove those badges and the note below the feature list.** Keep the text in step with `README.md` and `CHANGELOG.md`. +- **Website:** the project site at https://mategogiberidze.github.io/MeshAnd/, published by `.github/workflows/pages.yml` on pushes to `main` that touch `site/`, `docs/` or `CHANGELOG.md`, or by hand (Run workflow). The repo's Settings → Pages → Source must be **GitHub Actions**. + - `/` is `site/index.html`, one hand-written static page. `/docs/` holds the guides: `site/build.sh` copies `docs/*.md`, `CHANGELOG.md` (as `changelog.md`) and `site/guides/` (overview page, logo, CSS) into `build/site-docs/` and renders them with MkDocs Material (`site/mkdocs.yml`, versions pinned in `site/requirements.txt`, `--strict`). The `.md` files stay the only source; don't copy guide text into `site/`. + - Material for MkDocs is in maintenance mode and incompatible with MkDocs 2.0, so keep `mkdocs` pinned below 2.0. + - Preview: `pip install -r site/requirements.txt && ./site/build.sh`, then `python3 -m http.server -d build/site`. + - A link between guides on GitHub (`../CHANGELOG.md`) is rewritten by `build.sh`; a new kind of cross-folder link needs the same, or `--strict` fails. + - The download button asks the GitHub API for `releases/latest`, so it needs no change per release. + - Features not yet in a release carry a "Next version" badge on the landing page (currently Chat and Phone GPS). **When releasing, remove those badges and the note below the feature list.** Keep the text in step with `README.md` and `CHANGELOG.md`. ## Architecture (`app/src/main/java/com/meshand/app/`) - `MeshAndApp.kt`: the `Application` class. Owns `AppGraph` (settings, client, repository, OsmAnd bridge) for the whole process, wired by hand. diff --git a/site/build.sh b/site/build.sh new file mode 100755 index 0000000..40a7898 --- /dev/null +++ b/site/build.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Builds the GitHub Pages site into build/site: +# / the landing page (site/index.html) +# /docs/ the guides: docs/*.md and CHANGELOG.md rendered by MkDocs Material (site/mkdocs.yml) +# Needs the packages in site/requirements.txt. Used by .github/workflows/pages.yml. +set -euo pipefail +cd "$(dirname "$0")/.." + +rm -rf build/site build/site-docs +mkdir -p build/site build/site-docs + +# The guides' sources: our overview page and assets, the docs, and the changelog. +cp -R site/guides/. build/site-docs/ +cp docs/*.md build/site-docs/ +cp CHANGELOG.md build/site-docs/changelog.md +# On GitHub, docs/ links to the changelog one folder up; on the site it sits next to them. +sed -i.bak 's#](\.\./CHANGELOG\.md)#](changelog.md)#g' build/site-docs/*.md +rm build/site-docs/*.bak + +# mkdocs is pinned below 2.0 in requirements.txt, so Material's MkDocs 2.0 warning doesn't apply. +NO_MKDOCS_2_WARNING=true mkdocs build --strict --config-file site/mkdocs.yml --site-dir "$PWD/build/site/docs" +cp site/index.html build/site/ diff --git a/site/guides/assets/extra.css b/site/guides/assets/extra.css new file mode 100644 index 0000000..e02a6a8 --- /dev/null +++ b/site/guides/assets/extra.css @@ -0,0 +1,33 @@ +/* MeshAnd colours (the Summit logo's pine and ember) on top of Material. */ +:root, [data-md-color-scheme="default"] { + --md-primary-fg-color: #1F5A47; + --md-primary-fg-color--light: #2E7A61; + --md-primary-fg-color--dark: #143A2E; + --md-primary-bg-color: #FFFFFF; + --md-accent-fg-color: #D9643A; + --md-typeset-a-color: #1F5A47; + --md-default-bg-color: #F6F7F4; + --md-footer-bg-color: #1F5A47; + --md-footer-bg-color--dark: #143A2E; +} +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #133A2E; + --md-primary-fg-color--light: #1F5A47; + --md-primary-fg-color--dark: #0B2E23; + --md-primary-bg-color: #F2F4F3; + --md-accent-fg-color: #F28A62; + --md-typeset-a-color: #8ED1B5; + --md-default-bg-color: #0E1412; + --md-default-fg-color--lightest: #27332E; + --md-code-bg-color: #151D1A; + --md-footer-bg-color: #133A2E; + --md-footer-bg-color--dark: #0B2E23; +} + +.md-header__button.md-logo img { height: 1.6rem; border-radius: .35rem; } +.md-typeset h1, .md-typeset h2 { font-weight: 800; letter-spacing: -.02em; } +.md-typeset h1 { color: var(--md-default-fg-color); } + +/* Overview page cards */ +.md-typeset .grid.cards > ul > li { border-radius: .8rem; } +.md-typeset .grid.cards > ul > li:hover { border-color: var(--md-typeset-a-color); } diff --git a/site/guides/assets/logo.svg b/site/guides/assets/logo.svg new file mode 100644 index 0000000..f02ad8a --- /dev/null +++ b/site/guides/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/site/guides/index.md b/site/guides/index.md new file mode 100644 index 0000000..8e78bec --- /dev/null +++ b/site/guides/index.md @@ -0,0 +1,39 @@ +# MeshAnd guides + +MeshAnd connects to your Meshtastic radio over Bluetooth and shows everyone in your mesh on the +OsmAnd map. These guides help you set up the radios, see what changed in each version, and build +the app yourself. New here? Start on the [MeshAnd website](https://mategogiberidze.github.io/MeshAnd/) +for what the app does and how to install it. + +
+ +- :material-radio-handheld: **[Radio setup](radio-setup.md)** + + --- + + Channel, role and position settings for a moving team. Read this before your first trip: + the defaults send a position only about once an hour. + +- :material-new-box: **[What's new](changelog.md)** + + --- + + What changed in each version, including what's coming in the next one. + +- :material-code-tags: **[Developing](development.md)** + + --- + + Building MeshAnd yourself, how the code is organised, logs and the release process. + +- :material-download: **[Download](https://github.com/mategogiberidze/MeshAnd/releases/latest)** + + --- + + The latest release as a ready-to-install APK, on GitHub. + +
+ +Questions or trip reports? Join the +[Discussions](https://github.com/mategogiberidze/MeshAnd/discussions). Something broken? +[Open an issue](https://github.com/mategogiberidze/MeshAnd/issues/new/choose). diff --git a/site/index.html b/site/index.html index ed73fb9..8c51f7c 100644 --- a/site/index.html +++ b/site/index.html @@ -249,7 +249,7 @@ @@ -268,7 +268,7 @@

Your Meshtastic team, live on the OsmAnd map.

Download the APK How to install -

Latest release on GitHub · What's new

+

Latest release on GitHub · What's new

  • Android 7.0 or newer
  • A Meshtastic radio
  • @@ -477,7 +477,7 @@

    Up and running in five steps

    Set up the radios

    With the official Meshtastic app: region, a private team channel, role Client, and faster position updates. The defaults send a position only about once an hour, so - read the radio setup guide + read the radio setup guide for what to change and why.

  • @@ -537,11 +537,12 @@

    Before your first trip

    Guides and source

    Learn more