docs(README): update

This commit is contained in:
Ivan
2026-04-25 17:39:13 -05:00
parent 75bd553ed6
commit 01106903cf
6 changed files with 355 additions and 213 deletions

View File

@@ -9,9 +9,11 @@ This project is independent from the original Reticulum MeshChat project and is
- Website: [meshchatx.com](https://meshchatx.com)
- Source: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Official GitHub Mirror: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Releases: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
- Releases: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Changelog: [`CHANGELOG.md`](CHANGELOG.md)
- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Important Changes from Reticulum MeshChat

View File

@@ -8,14 +8,16 @@ Dieses Projekt ist unabhaengig vom originalen Reticulum MeshChat und steht in ke
- Website: [meshchatx.com](https://meshchatx.com)
- Quellcode: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Offizieller Spiegel: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) derzeit auch fuer Windows- und macOS-Builds genutzt.
- Releases: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
- Offizielles GitHub-Mirror: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Releases: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Aenderungsprotokoll: [`CHANGELOG.md`](../CHANGELOG.md)
- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Wichtige Aenderungen gegenueber Reticulum MeshChat
- Verwendet LXST
- Verwendet LXST fuer Anrufe
- Peewee-ORM durch direktes SQL ersetzt
- Axios durch natives `fetch` ersetzt
- Electron 41.x (mit Node-24-Laufzeit)
@@ -27,7 +29,7 @@ Dieses Projekt ist unabhaengig vom originalen Reticulum MeshChat und steht in ke
> MeshChatX garantiert keine Datenkompatibilitaet mit aelteren Reticulum-MeshChat-Versionen. Erstellen Sie vor Migration oder Tests eine Datensicherung.
> [!WARNING]
> Aeltere Systeme werden noch nicht vollstaendig unterstuetzt. Aktuelle Mindestanforderungen: Python `>=3.11` und Node `>=24` (Electron 41 entspricht Node 24; `engines` in `package.json` und CI folgen derselben Vorgabe).
> Aeltere Systeme werden noch nicht unterstuetzt. Aktuelle Basis: Python `>=3.11` und Node `>=24` (Electron 41 entspricht Node 24; `engines` in `package.json` und CI folgen derselben Linie).
## Voraussetzungen
@@ -53,15 +55,15 @@ Waehlen Sie die Methode passend zu Umgebung und Paketierung.
| Python Wheel (`.whl`) | Ja | Jede Python-unterstuetzte Architektur | Headless/Webserver ohne Node-Build |
| Linux AppImage | Ja | `x64`, `arm64` | Portabler Desktop-Einsatz |
| Debian-Paket (`.deb`) | Ja | `x64`, `arm64` | Debian/Ubuntu-Installation |
| RPM-Paket (`.rpm`) | Ja | CI-abhaengig | Fedora/RHEL/openSUSE |
| RPM-Paket (`.rpm`) | Ja | Vom CI-Runner abhaengig (Veroeffentlichung) | Fedora/RHEL/openSUSE |
| Aus Quellcode | Lokal gebaut | Host-Architektur | Entwicklung und individuelle Builds |
Hinweise:
- Der Release-Workflow baut explizit Linux `x64` und `arm64` AppImage + DEB.
- RPM wird ebenfalls versucht und bei Erfolg hochgeladen.
- GitHub Actions baut getaggte Releases: Windows und macOS in `.github/workflows/build-release.yml`, Linux Wheel/AppImage/deb/rpm in `.github/workflows/build-linux-release.yml` und das Container-Image in `.github/workflows/docker.yml`.
- Linux `x64` und `arm64` AppImage + DEB werden auf GitHub gebaut; RPM wird versucht und hochgeladen, wenn es erzeugt wird.
## Schnellstart: Docker
## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ Hinweise:
docker compose up -d
```
Entsprechend ohne Compose (gleiche Port-Bindung und Config-Volume):
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
Alternativ kann das Image `quad4io/meshchatx:latest` (Docker Hub) verwendet werden.
Sie koennen `quad4io/meshchatx:latest` statt des GHCR-Images verwenden, wenn Sie Docker Hub bevorzugen.
Standard-Compose-Datei:
@@ -160,7 +160,7 @@ Hinweise zu den Installationsbefehlen:
- `pnpm install --frozen-lockfile` verweigert Aenderungen an `pnpm-lock.yaml` und schlaegt fehl, wenn die Lockdatei nicht zu `package.json` passt. Damit wird verhindert, dass eine unerwartete Upstream-Version still eingespielt wird.
- `verify-store-integrity=true` ist auch in der projektweiten `.npmrc` gesetzt; die explizite `pnpm config set`-Zeile haertet zusaetzlich die Benutzerkonfiguration.
- Lifecycle-Skripte (`preinstall`/`postinstall`) sind in pnpm v10+ standardmaessig blockiert. Nur die unter `pnpm.onlyBuiltDependencies` in `package.json` aufgefuehrten Pakete duerfen Installationsskripte ausfuehren (aktuell `electron`, `electron-winstaller`, `esbuild`, `protobufjs`).
- Lifecycle-Skripte (`preinstall`/`postinstall`) sind in pnpm v10+ standardmaessig blockiert. Nur die unter `pnpm.onlyBuiltDependencies` in `package.json` aufgefuehrten Pakete duerfen Installationsskripte ausfuehren (aktuell `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` schlaegt frueh fehl, wenn `poetry.lock` nicht mit `pyproject.toml` synchron ist; `poetry install` aufloest danach nur aus der Lockdatei.
- Fuer eine strikte Lockfile-Installation (ohne implizite Lock-Aktualisierung) Poetry mit `pip install "poetry==2.3.4"` pinnen, passend zur CI-Version.
@@ -172,7 +172,7 @@ Um das native `meshchatx`-Programm (Alias: `meshchat`) mit zusaetzlicher Dateisy
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
Dieselbe Seite erscheint in der in-app-**Dokumentation** (MeshChatX-Docs), wenn sie aus den gebuendelten oder synchronisierten `meshchatx-docs`-Dateien ausgeliefert wird.
Dieselbe Seite erscheint in der in-app-Liste **Dokumentation** (MeshChatX-Dokumentation), wenn sie aus den gebuendelten oder synchronisierten `meshchatx-docs`-Dateien ausgeliefert wird.
## Linux-Desktop: Emoji-Schriften
@@ -214,6 +214,32 @@ Oder ueber Task:
task dist:fe:rpm
```
## Container-Build (Wheel, AppImage, deb, rpm)
`Dockerfile.build` fuehrt die gleichen Schritte wie die CI aus (Poetry, pnpm, `task`, APT-Paketabhaengigkeiten). Ausgelegt auf **linux/amd64** (NodeSource amd64, Task amd64). Standardziel ist alles; per Build-Arg ueberschreibbar.
Werte fuer `MESHCHATX_BUILD_TARGETS`: `all` (Standard), `wheel` oder `electron` (AppImage + deb fuer x64 und arm64, RPM best-effort, kein wheel).
Build:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
Nur Wheel:
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
`/artifacts` aus dem fertigen Image auf den Host kopieren:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## Architekturunterstuetzung
- Docker-Image: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (Build-Skripte vorhanden)
- macOS: Build-Skripte vorhanden (`arm64`, `universal`) fuer lokale Build-Umgebungen
- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, plus universal
- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), plus universal
## Android
@@ -235,23 +261,26 @@ Vom Repository-Root:
# 1) Chaquopy-Wheels gemaess android/app/build.gradle bauen
bash scripts/build-android-wheels-local.sh
# 2) Universal-APKs bauen (ein Debug- und ein Release-APK; siehe android/README.md)
# 2) Universal-APK bauen (ein Debug + ein Release pro Lauf; siehe android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
Es gibt nur eine Android-Variante (keine `slim`-/`full`-Flavors). Gradle synchronisiert den gesamten `meshchatx/`-Baum nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Packaging:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`).
**Eine** Android-Variante. Gradle synchronisiert den gesamten `meshchatx/`-Ordner nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Verpackung:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`).
Mit **`-PmeshchatxAbiPackaging=universal`** (Standard):
Bei **`-PmeshchatxAbiPackaging=universal`** (Standard) liefert jeder Buildtyp ein APK mit allen gewaehlten ABIs:
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
Bei **`-PmeshchatxAbiPackaging=split`** und mehr als einem ABI in `-PmeshchatxAbis` koennen pro-ABI-APKs entstehen, wie in [`android/README.md`](../android/README.md) beschrieben.
Hinweise:
- Release-Ausgaben sind standardmaessig unsigniert (`scripts/sign-android-apks.sh`).
- ABI: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`; Packaging: `-PmeshchatxAbiPackaging` oder `MESHCHATX_ABI_PACKAGING`.
- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), wird dieses Rad beim Bundling bevorzugt. Details in [`android/README.md`](../android/README.md).
- Release-Builds sind standardmaessig unsigniert, bis die Signatur konfiguriert ist (`scripts/sign-android-apks.sh`).
- Android richtet sich nach den in `android/app/build.gradle` gelisteten ABIs (einschliesslich `armeabi-v7a`, falls aktiviert). Das Bauen von Radern fuer `armeabi-v7a` erfordert ein Android-SDK in `ANDROID_HOME` (siehe `android/README.md`).
- ABI-Liste: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`. Verpackung: `-PmeshchatxAbiPackaging=universal|split` oder `MESHCHATX_ABI_PACKAGING`.
- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), bevorzugt die Aktualisierung des Offline-Repositorys dieses Wheel gegueber PyPI. In der CI wird das Wheel vor dem Android-Gradle-Schritt gebaut.
Weitere Dokumentation:
@@ -270,7 +299,7 @@ Weitere Dokumentation:
| `--headless` | `MESHCHAT_HEADLESS` | `false` | Browser nicht automatisch oeffnen |
| `--auth` | `MESHCHAT_AUTH` | `false` | Basis-Authentifizierung aktivieren |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Datenverzeichnis |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Frontend-Verzeichnis (fuer Installationen ohne gebundelte Assets) |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Frontend-Verzeichnis (fuer Quell-Installationen ohne gebundelte Assets) |
## Branches
@@ -305,51 +334,50 @@ task build:all
Aktuelle Version in diesem Repository: `4.6.0`.
- `package.json` ist die Quelle fuer die JavaScript/Electron-Version.
- `meshchatx/src/version.py` wird aus `package.json` synchronisiert mit:
```bash
pnpm run version:sync
```
Fuer konsistente Releases die Versionsfelder dort abgleichen, wo noetig (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`).
- Fuer Release-Bumps bearbeiten Sie **nur** `version` in **`package.json`**.
- **`pnpm run version:sync`** (wird auch zu Beginn von **`pnpm run build`** ausgefuehrt) verbreitet diese Version in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (Produktzeile), **README** / **lang/README.*** (Zeilen mit aktueller Version), **`docs/meshchatx_on_raspberry_pi.md`** (pipx-Beispiel) und Hilfsfelder in **`packaging/arch/PKGBUILD`**.
- **`meshchatx.__version__`** wird aus **`meshchatx/src/version.py`** gelesen, ohne `meshchatx.src` zu importieren, damit ein normales `import meshchatx` leicht bleibt.
- **Changelog**-Eintrage bleiben beim Release manuell.
## Sicherheit
- [`SECURITY.md`](../SECURITY.md)
- Integrierte Integritaetspruefungen und HTTPS/WSS-Standardeinstellungen in der App
- CI- und Release-Workflows in `.github/workflows/`; auf Gitea nur `.gitea/workflows/github-release-sync.yml` für GitHub-Release-Sync (siehe `SECURITY.md`)
- [`LEGAL.md`](../LEGAL.md)
- Eingebaute Integritaetspruefungen und HTTPS/WSS-Standardwerte in der App-Laufzeit.
- CI- und Release-Builds in GitHub Actions.
## Sprache hinzufuegen
Die Locale-Erkennung erfolgt automatisch. Legen Sie eine neue Datei unter `meshchatx/src/frontend/locales/` an (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und einem obersten Feld `_languageName` fuer die Anzeige in der Sprachauswahl. Sie koennen `en.json` kopieren und alles von Hand uebersetzen; **maschinelle Erzeugung ist optional** und nie verpflichtend.
Arbeitsablauf des Autors: ArgosTranslate, dann lokales LLM (Qwen 3 + Gemma 4).
**Korrekturen und menschliche Uebersetzungen sind willkommen.** Verbesserungen an bestehenden Locale-Dateien oder vollstaendig manuell uebersetzte Dateien koennen Sie per Pull Request oder Issue im [Quellcode-Repository](https://git.quad4.io/RNS-Things/MeshChatX) oder beim [GitHub-Spiegel](https://github.com/Quad4-Software/MeshChatX) einreichen.
Korrekturen von der Community sind willkommen — per LXMF oder wo Sie erreichbar sind.
**Optional: Argos-Translate-Bootstrap** -- Wenn Sie einen maschinellen Erstentwurf aus `en.json` wollen, koennen Sie `scripts/argos_translate.py` nutzen. Es kuemmert sich um Formatierung und schuetzt Interpolationsvariablen (wie `{count}`) vor versehentlichen Aenderungen.
Die Locale-Erkennung erfolgt automatisch. Fuegen Sie Dateien unter `meshchatx/src/frontend/locales/` hinzu (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und oberstes `_languageName` fuer die Sprachauswahl. Sie koennen `en.json` kopieren und alles manuell uebersetzen; **maschinenunterstuetzte Erzeugung (optional)** ist niemals erforderlich.
**Optional: Argos-Translate-Start** — fuer einen Entwurf aus `en.json` koennen Sie `scripts/argos_translate.py` nutzen; es behandelt Formatierung, farbige Ausgabe und schuetzt z. B. `{count}`.
```bash
# Installieren Sie argostranslate, falls noch nicht geschehen
pip install argostranslate
# argostranslate ggf. installieren
pipx install argostranslate
# Fuehren Sie das Uebersetzungsskript aus
# Uebersetzungsskript ausfuehren
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Ihr Sprachname"
```
Nach einem maschinellen Entwurf sollten ein LLM oder ein Mensch Grammatik, Kontext und Ton pruefen (z. B. formell vs. informell).
Nach jeder maschinellen Runde Grammatik, Kontext und Ton (formell vs. informell) mit LLM oder Mensch pruefen.
Schluesselparitaet pruefen: `pnpm test -- tests/frontend/i18n.test.js --run`
`pnpm test -- tests/frontend/i18n.test.js --run` prueft die Schluesselparitaet mit `en.json`.
Keine weiteren Code-Aenderungen noetig. App, Sprachwahl und Tests lesen Locales zur Build-Zeit aus `meshchatx/src/frontend/locales/`.
## Mitwirkende
- [Liam Cottle](https://github.com/liamcottle) - Originales Reticulum MeshChat
- [RFnexus](https://github.com/RFnexus) - Micron-Parser (JavaScript)
- [RFnexus](https://github.com/RFnexus) - micron-Parser (JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Lizenz
Die projekt-eigenen Anteile stehen unter 0BSD.
Urspruengliche Upstream-Anteile von MeshChat bleiben unter MIT.
Urspruengliche Upstream-Anteile von Reticulum MeshChat bleiben unter MIT.
Vollstaendiger Text und Hinweise in [`../LICENSE`](../LICENSE).

View File

@@ -8,14 +8,16 @@ Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e
- Sito web: [meshchatx.com](https://meshchatx.com)
- Codice sorgente: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Mirror ufficiale: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — usato anche per le build Windows e macOS al momento.
- Release: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
- Mirror ufficiale su GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Release: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Changelog: [`CHANGELOG.md`](../CHANGELOG.md)
- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Modifiche importanti rispetto a Reticulum MeshChat
- Usa LXST
- Usa LXST per le chiamate
- Peewee ORM sostituito con SQL diretto
- Axios sostituito con `fetch` nativo
- Electron 41.x (runtime Node 24 incluso)
@@ -27,7 +29,7 @@ Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e
> MeshChatX non garantisce la compatibilita dei dati con le versioni precedenti di Reticulum MeshChat. Eseguire un backup prima della migrazione o dei test.
> [!WARNING]
> I sistemi legacy non sono ancora completamente supportati. Requisiti minimi attuali: Python `>=3.11` e Node `>=24` (Electron 41 allinea a Node 24; `engines` in `package.json` e la CI seguono la stessa linea).
> I sistemi legacy non sono ancora supportati. Base attuale: Python `>=3.11` e Node `>=24` (Electron 41 allineato a Node 24; `engines` in `package.json` e la CI seguono la stessa linea).
## Requisiti
@@ -53,15 +55,15 @@ Scegli il metodo in base all'ambiente e al formato del pacchetto.
| Python wheel (`.whl`) | Si | Qualsiasi architettura supportata da Python | Installazione headless/web-server senza build Node |
| Linux AppImage | Si | `x64`, `arm64` | Uso desktop portatile |
| Pacchetto Debian (`.deb`) | Si | `x64`, `arm64` | Installazione Debian/Ubuntu |
| Pacchetto RPM (`.rpm`) | Si | Dipende dal CI | Fedora/RHEL/openSUSE |
| Pacchetto RPM (`.rpm`) | Si | Dipende dal runner CI per l'artefatto pubblicato | Fedora/RHEL/openSUSE |
| Da sorgente | Compilato localmente | Architettura host | Sviluppo e build personalizzati |
Note:
- Il workflow di release compila esplicitamente Linux `x64` e `arm64` AppImage + DEB.
- RPM viene anche tentato e caricato quando prodotto con successo.
- GitHub Actions compila le release con tag: Windows e macOS tramite `.github/workflows/build-release.yml`, Linux wheel/AppImage/deb/rpm tramite `.github/workflows/build-linux-release.yml`, e l'immagine container tramite `.github/workflows/docker.yml`.
- Per Linux, `x64` e `arm64` AppImage + DEB sono compilate su GitHub; il RPM e tentato e viene caricato quando l'artefatto e prodotto.
## Avvio rapido: Docker
## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ Note:
docker compose up -d
```
Equivalente senza Compose (stessa porta e volume di configurazione):
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
Puoi usare l'immagine `quad4io/meshchatx:latest` (Docker Hub) al posto di GHCR.
Al posto dell'immagine GHCR puoi usare `quad4io/meshchatx:latest` se preferisci Docker Hub.
Il file compose predefinito mappa:
@@ -160,7 +160,7 @@ Note sui comandi di installazione:
- `pnpm install --frozen-lockfile` rifiuta di aggiornare `pnpm-lock.yaml` e fallisce se il lockfile non corrisponde a `package.json`. Cosi' si evita che una versione upstream inattesa venga installata silenziosamente.
- `verify-store-integrity=true` e' impostato anche nel `.npmrc` del progetto; la riga esplicita `pnpm config set` rafforza inoltre la configurazione utente.
- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`, `protobufjs`).
- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` fallisce subito se `poetry.lock` non e' allineato con `pyproject.toml`; `poetry install` risolve poi solo dal lockfile.
- Per un'installazione Poetry strettamente basata sul lockfile (senza refresh implicito), fissa Poetry con `pip install "poetry==2.3.4"`, in linea con la CI.
@@ -172,7 +172,7 @@ Per eseguire il binario nativo `meshchatx` (alias: `meshchat`) con isolamento ag
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
La stessa pagina compare nell'elenco **Documentazione** in-app (documentazione MeshChatX) quando viene servita dai file `meshchatx-docs` inclusi o sincronizzati.
La stessa pagina compare nell'elenco **Documentazione** (documentazione MeshChatX) in-app quando viene servita dai file `meshchatx-docs` in bundle o sincronizzati.
## Desktop Linux: font emoji
@@ -214,6 +214,32 @@ Oppure tramite Task:
task dist:fe:rpm
```
## Build container (wheel, AppImage, deb, rpm)
`Dockerfile.build` esegue le stesse fasi usate in CI (Poetry, pnpm, `task`, dipendenze APT). Orientato a **linux/amd64** (tarball NodeSource amd64, Task amd64). Il target predefinito e completo; si puo sovrascrivere con un build-arg.
Valori per `MESHCHATX_BUILD_TARGETS`: `all` (default), `wheel` o `electron` (AppImage + deb per x64 e arm64, RPM se possibile, senza wheel).
Build:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
Solo wheel:
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
Copiare `/artifacts` dall'immagine finita all'host:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## Supporto architetture
- Immagine Docker: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (script di build disponibili)
- macOS: script di build disponibili (`arm64`, `universal`) per ambienti di build locali
- Android: APK nativi — `arm64-v8a`, `x86_64`, universale
- Android: APK nativi — `arm64-v8a`, `x86_64`, `armeabi-v7a` (ARM a 32 bit), piu universale
## Android
@@ -235,23 +261,26 @@ Dalla root del repository:
# 1) Build delle wheel Chaquopy usate da android/app/build.gradle
bash scripts/build-android-wheels-local.sh
# 2) Build APK universali (un debug e una release; vedi android/README.md)
# 2) Build APK universal (un debug + una release per esecuzione; vedi android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
Esiste una sola variante Android (niente flavor `slim` / `full`). Gradle sincronizza l'intero albero `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Imballaggio ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`).
**Una** sola variante Android. Gradle sincronizza l'intera directory `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Packaging ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`).
Con **`-PmeshchatxAbiPackaging=universal`** (predefinito):
Con **`-PmeshchatxAbiPackaging=universal`** (predefinito) ogni tipo di build e un APK con tutti gli ABI scelti:
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
Con **`-PmeshchatxAbiPackaging=split`** e piu di un ABI in `-PmeshchatxAbis`, Gradle puo emettere APK per ABI come documentato in [`android/README.md`](../android/README.md).
Note:
- Le release sono non firmate di default (`scripts/sign-android-apks.sh`).
- ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`; imballaggio: `-PmeshchatxAbiPackaging` o `MESHCHATX_ABI_PACKAGING`.
- Se nella root del repo esiste `dist/reticulum_meshchatx-*.whl` (es. dopo `python -m build --wheel -o dist .`), quella wheel ha priorita nel bundle. Dettagli in [`android/README.md`](../android/README.md).
- Gli output di release non sono firmati finche non configuri la firma (`scripts/sign-android-apks.sh`).
- Android punta agli ABI elencati in `android/app/build.gradle` (incluso `armeabi-v7a` se abilitato). Le wheel per `armeabi-v7a` richiedono Android SDK su `ANDROID_HOME` (vedi `android/README.md`).
- Selezione ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`. Packaging: `-PmeshchatxAbiPackaging=universal|split` o `MESHCHATX_ABI_PACKAGING`.
- Se esiste in root `dist/reticulum_meshchatx-*.whl` (es. da `python -m build --wheel -o dist .`), l'aggiornamento del repository in bundle preferisce quella wheel rispetto a PyPI. In CI la wheel viene costruita prima del passo Gradle Android.
Documentazione aggiuntiva:
@@ -270,7 +299,7 @@ Documentazione aggiuntiva:
| `--headless` | `MESHCHAT_HEADLESS` | `false` | Non aprire il browser automaticamente |
| `--auth` | `MESHCHAT_AUTH` | `false` | Attiva autenticazione base |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Directory dei dati |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundle | Directory dei file frontend (per installazioni senza asset inclusi) |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Directory dei file frontend (necessaria per installazioni da sorgente senza asset in bundle) |
## Branch
@@ -301,55 +330,54 @@ Scorciatoie `Makefile`:
| `make test` | Test frontend e backend |
| `make clean` | Rimuove artefatti di build e node_modules |
## Versioning
## Versionamento
Versione attuale nel repository: `4.6.0`.
- La fonte della versione JavaScript/Electron e `package.json`.
- `meshchatx/src/version.py` e sincronizzato da `package.json` con:
```bash
pnpm run version:sync
```
Per release coerenti, allineare i campi di versione dove richiesto (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`).
- L'unico valore che modifichi per un bump di release e **`version` in `package.json`**.
- Esegui **`pnpm run version:sync`** (all'inizio anche di **`pnpm run build`**) per propagare in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (riga prodotto), **README** / **lang/README.\*** (righe "versione attuale"), **esempio pipx in `docs/meshchatx_on_raspberry_pi.md`**, e aiuti in **`packaging/arch/PKGBUILD`**.
- **`meshchatx.__version__`** si legge da **`meshchatx/src/version.py`** senza importare **`meshchatx.src`**, cosi un semplice `import meshchatx` resta leggero.
- Le voci del **changelog** restano manuali quando tagghi una release.
## Sicurezza
- [`SECURITY.md`](../SECURITY.md)
- Controlli di integrita integrati e HTTPS/WSS predefiniti nell'app
- CI e release in `.github/workflows/`; su Gitea solo `.gitea/workflows/github-release-sync.yml` per il sync delle release su GitHub (vedi `SECURITY.md`)
- [`LEGAL.md`](../LEGAL.md)
- Controlli di integrita integrati e valori predefiniti HTTPS/WSS nel runtime dell'app.
- Build CI e release su GitHub Actions.
## Aggiungere una lingua
Il rilevamento della lingua locale è automatico. Aggiungi un nuovo file in `meshchatx/src/frontend/locales/` (ad esempio `xx.json`) con le stesse chiavi di `en.json` e un campo in cima `_languageName` per l'etichetta nel selettore lingue. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione automatica è opzionale** e non è mai obbligatoria.
Flusso dell'autore: ArgosTranslate, poi LLM locale (Qwen 3 + Gemma 4).
**Correzioni e traduzioni umane sono benvenute.** Miglioramenti a un file esistente o un file interamente tradotto a mano possono essere inviati con una pull request o una segnalazione sul [repository sorgente](https://git.quad4.io/RNS-Things/MeshChatX) o sul [mirror GitHub](https://github.com/Quad4-Software/MeshChatX).
Poi si accettano volentieri fix dalla community (LXMF o come mi contattate).
**Opzionale: bozza con Argos Translate** -- Se vuoi una prima bozza generata da `en.json`, puoi usare `scripts/argos_translate.py`. Gestisce la formattazione e aiuta a proteggere le variabili di interpolazione (come `{count}`).
Il rilevamento locale e automatico. Aggiungi un file in `meshchatx/src/frontend/locales/` (es. `xx.json`) con le stesse chiavi di `en.json` e un `_languageName` in cima per l'etichetta nel selettore. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione assistita da machine e opzionale** e non e mai obbligatoria.
**Opzionale: avvio con Argos Translate** -- per una bozza partendo da `en.json` puoi usare `scripts/argos_translate.py` (formattazione, output a colori, variabili di interpolazione come `{count}`).
```bash
# Installa argostranslate se non l'hai già fatto
pip install argostranslate
# Installa argostranslate se non l'hai gia
pipx install argostranslate
# Esegui lo script di traduzione
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Nome della tua lingua"
```
Dopo una passata automatica, fai verificare grammatica, contesto e tono a un LLM o a un revisore umano (es. formale vs informale).
Dopo qualsiasi passaggio automatico, un LLM o un revisore umano controlli grammatica, contesto e tono (es. formale vs informale).
Verifica la parità delle chiavi con: `pnpm test -- tests/frontend/i18n.test.js --run`
Esegui `pnpm test -- tests/frontend/i18n.test.js --run` per verificare la parita delle chiavi con `en.json`.
Non sono necessarie altre modifiche al codice. L'app, il selettore della lingua e i test scoprono le lingue dalla cartella `meshchatx/src/frontend/locales/` durante la compilazione.
## Crediti
- [Liam Cottle](https://github.com/liamcottle) - Reticulum MeshChat originale
- [RFnexus](https://github.com/RFnexus) - Parser Micron (JavaScript)
- [RFnexus](https://github.com/RFnexus) - parser micron (JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Licenza
Le parti di proprieta del progetto sono rilasciate sotto 0BSD.
Le parti originali upstream derivate da MeshChat restano sotto MIT.
Le parti originali upstream da Reticulum MeshChat restano sotto MIT.
Per testo completo e note, vedi [`../LICENSE`](../LICENSE).

View File

@@ -8,14 +8,16 @@ Liam Cottle 氏による Reticulum MeshChat を大幅に改修・機能拡張し
- ウェブサイト: [meshchatx.com](https://meshchatx.com)
- ソースコード: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- 公式ミラー: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — 現時点では Windows / macOS ビルドにも使用。
- リリース: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
- 公式 GitHub ミラー: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- リリース: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- 変更履歴: [`CHANGELOG.md`](../CHANGELOG.md)
- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Reticulum MeshChat からの主な変更
- LXST を使用
- 通話に LXST を使用
- Peewee ORM を生 SQL に置き換え
- Axios をネイティブ `fetch` に置き換え
- Electron 41.x同梱 Node 24 ランタイム)
@@ -27,7 +29,7 @@ Liam Cottle 氏による Reticulum MeshChat を大幅に改修・機能拡張し
> MeshChatX は旧バージョンの Reticulum MeshChat とのデータ互換性を保証しません。マイグレーションやテスト前にデータをバックアップしてください。
> [!WARNING]
> レガシーシステムはまだ完全にはサポートされていません。現在の最低要件: Python `>=3.11`Node `>=24`Electron 41 は Node 24 `package.json` の `engines` と CI 同じ基準)。
> レガシーシステムはまだサポートされません。現在の基準は Python `>=3.11`Node `>=24`Electron 41 は Node 24 に揃う`package.json` の `engines` と CI 同じライン)。
## 必要条件
@@ -53,15 +55,15 @@ task build:all
| Python wheel (`.whl`) | はい | Python がサポートする全アーキテクチャ | Node ビルド不要のヘッドレス/Web サーバー |
| Linux AppImage | はい | `x64`, `arm64` | ポータブルデスクトップ |
| Debian パッケージ (`.deb`) | はい | `x64`, `arm64` | Debian/Ubuntu |
| RPM パッケージ (`.rpm`) | はい | CI 依存 | Fedora/RHEL/openSUSE |
| RPM パッケージ (`.rpm`) | はい | 公開用 CI ランナーに依存 | Fedora/RHEL/openSUSE |
| ソースから | ローカルビルド | ホストアーキテクチャ | 開発・カスタムビルド |
備考:
- リリースワークフローは Linux `x64` および `arm64` の AppImage + DEB を明示的にビルドします
- RPM も試行され、成功時にアップロードされます。
- GitHub Actions はタグ付きリリースをビルドします: Windows / macOS は `.github/workflows/build-release.yml`、Linux wheel / AppImage / deb / rpm は `.github/workflows/build-linux-release.yml`、コンテナイメージは `.github/workflows/docker.yml`
- Linux `x64` および `arm64` の AppImage + DEB は GitHub でビルド。RPM も試行し、成果物があればアップロードます。
## クイックスタート: Docker
## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ task build:all
docker compose up -d
```
Compose を使わない場合の同等例(同じポート割り当てと設定ボリューム):
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
イメージは Docker Hub の `quad4io/meshchatx:latest` に置き換え可能です。
GHCR の代わりに Docker Hub の `quad4io/meshchatx:latest` を使えます。
デフォルトの compose ファイル:
@@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- `pnpm install --frozen-lockfile``pnpm-lock.yaml` の更新を拒否し、ロックファイルが `package.json` と一致しない場合は失敗します。これにより、想定外の上流バージョンが暗黙的にインストールされるのを防げます。
- `verify-store-integrity=true` はプロジェクトの `.npmrc` にも設定されています。上記の `pnpm config set` の行はユーザー設定側も明示的に固めるためのものです。
- pnpm v10 以降、ライフサイクルスクリプト (`preinstall`/`postinstall`) はデフォルトでブロックされます。インストールスクリプトを実行できるのは `package.json``pnpm.onlyBuiltDependencies` に列挙されたパッケージ (現在 `electron``electron-winstaller``esbuild``protobufjs`) だけです。
- pnpm v10 以降、ライフサイクルスクリプト (`preinstall`/`postinstall`) はデフォルトでブロックされます。インストールスクリプトを実行できるのは `package.json``pnpm.onlyBuiltDependencies` に列挙されたパッケージ現在 `electron``electron-winstaller``esbuild`だけです。
- `poetry check --lock``poetry.lock``pyproject.toml` が同期していない場合に即時失敗します。その後の `poetry install` はロックファイルからのみ解決します。
- 厳密にロックファイルだけで Poetry をインストールしたい場合は、CI と揃えるために `pip install "poetry==2.3.4"` で Poetry バージョンを固定してください。
@@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
同梱または同期された `meshchatx-docs` から配信される場合、アプリ内 **ドキュメント**MeshChatX ドキュメント)一覧にも同じページが表示されます。
同梱または同期された `meshchatx-docs` から配信る場合、同じページがアプリ内 **ドキュメント** 一覧MeshChatX ドキュメント)にも表示されます。
## Linux デスクトップ: 絵文字フォント
@@ -214,6 +214,32 @@ Task 経由:
task dist:fe:rpm
```
## コンテナビルドwheel、AppImage、deb、rpm
`Dockerfile.build` は CI と同じ手順Poetry、pnpm、`task`、APT 依存)を実行します。**linux/amd64** 向けNodeSource の amd64 tarball、Task の amd64 バイナリ。デフォルトは全ターゲット。build-arg で上書き可能。
`MESHCHATX_BUILD_TARGETS` の値: `all`(既定)、`wheel`、または `electron`x64 / arm64 の AppImage + deb、RPM はベストエフォート、wheel なし)。
ビルド:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
wheel のみ:
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
完成したイメージから `/artifacts` をホストにコピー:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## アーキテクチャサポート
- Docker イメージ: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64`(ビルドスクリプトあり)
- macOS: ローカルビルド向けにビルドスクリプトあり(`arm64`, `universal`
- Android: ネイティブ APK — ABI `arm64-v8a``x86_64`、および universal
- Android: ネイティブ APK — ABI `arm64-v8a``x86_64``armeabi-v7a`32-bit ARMおよび universal
## Android
@@ -235,23 +261,26 @@ MeshChatX はネイティブ Android APK のビルドに対応しています(
# 1) android/app/build.gradle で使う Chaquopy 用ホイールをビルド
bash scripts/build-android-wheels-local.sh
# 2) 汎用 APK をビルドdebug release 1 android/README.md 参照)
# 2) universal APK をビルド(1 回の実行で debug 1 本 + release 1 android/README.md 参照)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
Android は単一バリアント`slim` / `full` フレーバーなし)。Gradle が `meshchatx/` 全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split``android/app/build.gradle`)。
**単一**の Android バリアント。Gradle が `meshchatx/` ツリー全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split``android/app/build.gradle`)。
**`-PmeshchatxAbiPackaging=universal`**(既定)のとき:
**`-PmeshchatxAbiPackaging=universal`**(既定)では、各ビルド種別は選択した全 ABI を含む 1 つの APK です:
- デバッグ: `android/app/build/outputs/apk/debug/app-debug.apk`
- リリース: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
**`-PmeshchatxAbiPackaging=split`** かつ `-PmeshchatxAbis` に ABI が複数ある場合、ABI 別 APK になることがあります([`android/README.md`](../android/README.md) 参照)。
備考:
- リリース既定で未署名(`scripts/sign-android-apks.sh`)。
- ABI は `-PmeshchatxAbis` または `MESHCHATX_ABIS`、パッケージングは `-PmeshchatxAbiPackaging` または `MESHCHATX_ABI_PACKAGING`
- リポジトリルートに `dist/reticulum_meshchatx-*.whl` がある場合(例: `python -m build --wheel -o dist .` の後)、バンドルではそれが優先されます。詳細は [`android/README.md`](../android/README.md)
- リリース成果物は、署名を設定するまで既定で未署名(`scripts/sign-android-apks.sh`)。
- 対象 ABI は `android/app/build.gradle` の一覧(`armeabi-v7a` 有効時を含む)。`armeabi-v7a` 用ホイールのビルドには `ANDROID_HOME` の Android SDK が必要(`android/README.md` 参照)
- ABI 上書き: `-PmeshchatxAbis` または `MESHCHATX_ABIS`。パッケージング: `-PmeshchatxAbiPackaging=universal|split` または `MESHCHATX_ABI_PACKAGING`
- リポジトリルートに `dist/reticulum_meshchatx-*.whl` があると(例: `python -m build --wheel -o dist .`)、同梱リポジトリの更新で PyPI よりその MeshChatX ホイールを優先。CI では Android Gradle の前にそのホイールをビルドします。
追加ドキュメント:
@@ -270,7 +299,7 @@ Android は単一バリアント(`slim` / `full` フレーバーなし。Gr
| `--headless` | `MESHCHAT_HEADLESS` | `false` | ブラウザを自動で開かない |
| `--auth` | `MESHCHAT_AUTH` | `false` | 基本認証を有効化 |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | データディレクトリ |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自動/同梱 | フロントエンドファイルディレクトリ(同梱資産のないインストール向け) |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自動/同梱 | フロントエンドディレクトリ(同梱資産なしのソースインストールで必要) |
## ブランチ
@@ -305,51 +334,50 @@ task build:all
このリポジトリの現在のバージョンは `4.6.0` です。
- JavaScript / Electron のバージョンソースは `package.json`
- `meshchatx/src/version.py` は次で `package.json` と同期します:
```bash
pnpm run version:sync
```
リリースの一貫性のため、必要に応じて (`package.json``pyproject.toml``meshchatx/__init__.py`) のバージョンを揃えてください。
- リリースのバージョン上げは **`package.json``version` のみ**編集します
- **`pnpm run version:sync`****`pnpm run build`** 開始時にも実行)で、**`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(製品行)、**README** / **lang/README.***(現在のバージョン行)、**`docs/meshchatx_on_raspberry_pi.md`** の pipx 例、**`packaging/arch/PKGBUILD`** の補助フィールドに反映します
- **`meshchatx.__version__`** は **`meshchatx/src/version.py`** から読み、**`meshchatx.src`** をインポートしないため、単なる `import meshchatx` は軽量のままです。
- **Changelog** のエントリはリリース時に手作業のままです。
## セキュリティ
- [`SECURITY.md`](../SECURITY.md)
- アプリ実行時の組み込み整合性チェックとデフォルトの HTTPS/WSS
- CI とリリースは `.github/workflows/`。Gitea では GitHub リリース同期用に `.gitea/workflows/github-release-sync.yml` のみ(`SECURITY.md` を参照)
- [`LEGAL.md`](../LEGAL.md)
- アプリランタイムの組み込み整合性チェックと既定の HTTPS/WSS。
- GitHub Actions での CI およびリリースビルド。
## 言語の追加
ロケールの検出は自動で行われます。`meshchatx/src/frontend/locales/` に新しい JSON例: `xx.json`)を追加し、`en.json` と同じキーに加え、言語選択に表示する名前を `_languageName` で指定します。`en.json` をコピーしてすべて手翻訳しても構いません。**機械翻訳による生成は任意**で、必須ではありません
作業手順: ArgosTranslate から ローカル LLMQwen 3 + Gemma 4
**修正や人間による翻訳の提供を歓迎します。** 既存ロケールの改善や完全な手翻訳ファイルは、[ソースリポジトリ](https://git.quad4.io/RNS-Things/MeshChatX)または [GitHub ミラー](https://github.com/Quad4-Software/MeshChatX) にプルリクエストまたは issue で送ってください
そのあと、LXMF 等で修正を歓迎します
**任意: Argos Translate による下書き** -- `en.json` から機械翻訳のたたき台が欲しい場合は `scripts/argos_translate.py` を使えます。フォーマット処理や補間変数(`{count}` など)の保護に役立ちます
ロケールの検出は自動です。`meshchatx/src/frontend/locales/` に新しいファイル(例: `xx.json`)を追加し、`en.json` と同じキーに加え、セレクタ表示用の `_languageName` を最上位に置きます。`en.json` をコピーし手作業で訳すこともできます。**機械補助は任意**で、求められません
**任意: Argos Translate で土台** -- `en.json` から下書きするには `scripts/argos_translate.py`(整形・カラー出力、 `{count}` 等の保護)を使えます。
```bash
# argostranslate をまだインストールしていない場合はインストールします
pip install argostranslate
# 必要なら argostranslate を導入
pipx install argostranslate
# 翻訳スクリプトを実行します
# 翻訳スクリプトを実行
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "言語名"
```
機械下書きのあとは、LLM または人間が文法・文脈・トーン(フォーマルカジュアルなど)を確認するとよいでしょう
機械下書きのあと、文法・文脈・トーンは LLM か人が確認(フォーマル/カジュアル等)
`pnpm test -- tests/frontend/i18n.test.js --run` を実行して、`en.json` とのキー一致を確認します
`pnpm test -- tests/frontend/i18n.test.js --run` `en.json` とのキー一致を検証
その他のコードの変更は必要ありません。アプリ、言語セレクター、およびテストは、ビルド時に `meshchatx/src/frontend/locales/` ディレクトリからロケールを検出します。
## クレジット
- [Liam Cottle](https://github.com/liamcottle) - オリジナル Reticulum MeshChat
- [RFnexus](https://github.com/RFnexus) - Micron パーサーJavaScript
- [RFnexus](https://github.com/RFnexus) - micron パーサーJavaScript
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## ライセンス
プロジェクト独自の部分は 0BSD です。
MeshChat 由来の元の上流部分は MIT のままです。
Reticulum MeshChat 由来の元の上流部分は MIT のままです。
全文と通知は [`../LICENSE`](../LICENSE) を参照してください。

View File

@@ -8,14 +8,16 @@
- Сайт: [meshchatx.com](https://meshchatx.com)
- Исходный код: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Официальное зеркало: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — пока также используется для сборок Windows и macOS.
- Релизы: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
- Официальное зеркало на GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Релизы: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Журнал изменений: [`CHANGELOG.md`](../CHANGELOG.md)
- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Важные отличия от Reticulum MeshChat
- Используется LXST
- Для вызовов используется LXST
- Peewee ORM заменён на прямой SQL
- Axios заменён на нативный `fetch`
- Electron 41.x (встроенная среда Node 24)
@@ -27,7 +29,7 @@
> MeshChatX не гарантирует совместимость данных со старыми версиями Reticulum MeshChat. Сделайте резервную копию перед миграцией или тестированием.
> [!WARNING]
> Устаревшие системы пока не полностью поддерживаются. Текущие требования: Python `>=3.11` и Node `>=24` (Electron 41 соответствует Node 24; поле `engines` в `package.json` и CI на той же линии).
> Устаревшие системы пока не поддерживаются. Текущий базис: Python `>=3.11` и Node `>=24` (Electron 41 выровнен с Node 24; поле `engines` в `package.json` и CI на той же линии).
## Требования
@@ -53,15 +55,15 @@ task build:all
| Python wheel (`.whl`) | Да | Любая архитектура, поддерживаемая Python | Безголовый/веб-сервер без сборки Node |
| Linux AppImage | Да | `x64`, `arm64` | Портативное использование на ПК |
| Debian-пакет (`.deb`) | Да | `x64`, `arm64` | Установка на Debian/Ubuntu |
| RPM-пакет (`.rpm`) | Да | Зависит от CI | Fedora/RHEL/openSUSE |
| RPM-пакет (`.rpm`) | Да | Зависит от раннера CI для публикуемого артефакта | Fedora/RHEL/openSUSE |
| Из исходников | Собирается локально | Архитектура хоста | Разработка и кастомные сборки |
Примечания:
- Релизный workflow явно собирает Linux `x64` и `arm64` AppImage + DEB.
- RPM также собирается при попытке и загружается при успехе.
- GitHub Actions собирает помеченные тегом релизы: Windows и macOS в `.github/workflows/build-release.yml`, Linux wheel/AppImage/deb/rpm в `.github/workflows/build-linux-release.yml`, образ контейнера в `.github/workflows/docker.yml`.
- AppImage + DEB для Linux `x64` и `arm64` собираются на GitHub; RPM собирается по возможности и выкладывается, если шаг дал артефакт.
## Быстрый старт: Docker
## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ task build:all
docker compose up -d
```
То же самое без Compose (тот же порт и том конфигурации):
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
Вместо образа можно указать `quad4io/meshchatx:latest` (Docker Hub).
Вместо образа GHCR можно указать `quad4io/meshchatx:latest`, если предпочитаете Docker Hub.
Compose-файл по умолчанию:
@@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- `pnpm install --frozen-lockfile` запрещает обновление `pnpm-lock.yaml` и завершится с ошибкой, если lock-файл не соответствует `package.json`. Это исключает скрытую установку неожиданной upstream-версии.
- `verify-store-integrity=true` уже задан в `.npmrc` проекта; явный `pnpm config set` дополнительно ужесточает пользовательскую конфигурацию.
- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v10+. Скрипты установки могут запускать только пакеты из `pnpm.onlyBuiltDependencies` в `package.json` (сейчас это `electron`, `electron-winstaller`, `esbuild`, `protobufjs`).
- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v10+. Скрипты установки могут запускать только пакеты из `pnpm.onlyBuiltDependencies` в `package.json` (сейчас `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` сразу падает, если `poetry.lock` не синхронизирован с `pyproject.toml`; затем `poetry install` ставит зависимости только из lock-файла.
- Для строгой установки Poetry только из lock-файла зафиксируйте версию Poetry через `pip install "poetry==2.3.4"`, как это делает CI.
@@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
Та же страница отображается во встроенной **Документации** (документация MeshChatX), когда она отдаётся из `meshchatx-docs`.
Та же страница отображается в списке **Документация** (документация MeshChatX) в приложении, если файлы отдаются из встроенных или синхронизированных `meshchatx-docs`.
## Linux на ПК: шрифты эмодзи
@@ -214,6 +214,32 @@ pnpm run dist:rpm
task dist:fe:rpm
```
## Сборка в контейнере (wheel, AppImage, deb, rpm)
`Dockerfile.build` выполняет те же шаги, что и CI (Poetry, pnpm, `task`, пакетные зависимости APT). Ориентирован на **linux/amd64** (NodeSource amd64, Task amd64). Цель по умолчанию — всё; её можно переопределить build-arg.
Для `MESHCHATX_BUILD_TARGETS` доступны: `all` (по умолчанию), `wheel` или `electron` (AppImage + deb для x64 и arm64, RPM по возможности, без wheel).
Сборка:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
Только wheel:
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
Скопируйте `/artifacts` из готового образа на хост:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## Поддержка архитектур
- Образ Docker: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (скрипты сборки есть)
- macOS: скрипты сборки (`arm64`, `universal`) для локальных сред
- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, плюс universal
- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), плюс universal
## Android
@@ -235,23 +261,26 @@ MeshChatX поддерживает нативные Android APK (не тольк
# 1) Собрать колёса Chaquopy для android/app/build.gradle
bash scripts/build-android-wheels-local.sh
# 2) Собрать универсальные APK (debug и release; см. android/README.md)
# 2) Собрать universal APK (один debug + один release за прогон; см. android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
Одна вариант-сборка Android (без flavor `slim` / `full`). Gradle синхронизирует весь `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **ABI-упаковка:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`).
**Один** вариант Android. Gradle синхронизирует весь каталог `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **Упаковка ABI:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`).
При **`-PmeshchatxAbiPackaging=universal`** (по умолчанию):
С **`-PmeshchatxAbiPackaging=universal`** (по умолчанию) у каждого типа сборки один APK со всеми выбранными ABI:
- Отладка: `android/app/build/outputs/apk/debug/app-debug.apk`
- Релиз: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
С **`-PmeshchatxAbiPackaging=split`** и более чем одним ABI в `-PmeshchatxAbis` Gradle может выдавать отдельные APK по ABI, как в [`android/README.md`](../android/README.md).
Примечания:
- Релизы по умолчанию не подписаны (`scripts/sign-android-apks.sh`).
- ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`; упаковка: `-PmeshchatxAbiPackaging` или `MESHCHATX_ABI_PACKAGING`.
- Если в корне репозитория есть `dist/reticulum_meshchatx-*.whl` (например после `python -m build --wheel -o dist .`), оно предпочитается при бандле. Подробнее в [`android/README.md`](../android/README.md).
- Релизы по умолчанию не подписаны, пока не настроена подпись (`scripts/sign-android-apks.sh`).
- Android ориентируется на ABI из `android/app/build.gradle` (в т.ч. `armeabi-v7a`, если включён). Сборка колёс для `armeabi-v7a` требует Android SDK в `ANDROID_HOME` (см. `android/README.md`).
- Список ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`. Упаковка: `-PmeshchatxAbiPackaging=universal|split` или `MESHCHATX_ABI_PACKAGING`.
- Если в корне репо есть `dist/reticulum_meshchatx-*.whl` (например из `python -m build --wheel -o dist .`), обновление встроенного репозитория предпочитает эту wheel пакету MeshChatX с PyPI. В CI wheel собирается до шага Android Gradle.
Дополнительная документация:
@@ -305,51 +334,50 @@ task build:all
Текущая версия в репозитории: `4.6.0`.
- Источник версии JS/Electron — `package.json`.
- `meshchatx/src/version.py` синхронизируется из `package.json`:
```bash
pnpm run version:sync
```
Для согласованных релизов выравнивайте поля версий где нужно (`package.json`, `pyproject.toml`, `meshchatx/__init__.py`).
- Редактируйте для релизного бампа **только** поле `version` в **`package.json`**.
- Команда **`pnpm run version:sync`** (также в начале **`pnpm run build`**) распространяет эту версию в **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (строка продукта), **README** / **lang/README.\*** (строки «текущая версия»), **`docs/meshchatx_on_raspberry_pi.md`** (пример pipx) и вспомогательные поля **`packaging/arch/PKGBUILD`**.
- **`meshchatx.__version__`** читается из **`meshchatx/src/version.py`** без импорта **`meshchatx.src`**, поэтому обычный `import meshchatx` остаётся лёгким.
- Записи **changelog** по-прежнему вносятся вручную при релизе.
## Безопасность
- [`SECURITY.md`](../SECURITY.md)
- Встроенные проверки целостности и HTTPS/WSS по умолчанию в приложении
- CI и релизы в `.github/workflows/`; на Gitea только `.gitea/workflows/github-release-sync.yml` для выгрузки релизов на GitHub (см. `SECURITY.md`)
- [`LEGAL.md`](../LEGAL.md)
- Встроенные проверки целостности и значения по умолчанию HTTPS/WSS в рантайме приложения.
- Сборка CI и релизы на GitHub Actions.
## Добавление языка
Обнаружение локали происходит автоматически. Добавьте новый файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что и в `en.json`, и полем `_languageName` в начале для подписи в селекторе языка. Можно скопировать `en.json` и перевести всё вручную; **автоматическая генерация (Argos и т. п.) необязательна** и не требуется.
Авторский рабочий процесс: ArgosTranslate, затем локальная LLM (Qwen 3 + Gemma 4).
**Исправления и переводы от людей приветствуются.** Улучшения существующих файлов локали или полностью ручной перевод можно прислать через pull request или issue в [исходном репозитории](https://git.quad4.io/RNS-Things/MeshChatX) или на [зеркале GitHub](https://github.com/Quad4-Software/MeshChatX).
Затем правки и улучшения от сообщества приветствуются — через LXMF или любой доступный канал.
**По желанию: черновик через Argos Translate** -- если нужен машинный первый проход из `en.json`, можно использовать `scripts/argos_translate.py`. Он обрабатывает форматирование и помогает защитить переменные интерполяции (например `{count}`).
Обнаружение локали автоматическое. Добавьте файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что в `en.json`, и строку верхнего уровня `_languageName` для подписи в селекторе. Можно скопировать `en.json` и перевести вручную; **машинная генерация (в т. ч. Argos) необязательна** и никогда не требуется.
**По желанию: старт с Argos Translate** — для чернового перевода из `en.json` можно вызвать `scripts/argos_translate.py` (форматирование, цветной вывод, защита плейсхолдеров вроде `{count}`).
```bash
# Установите argostranslate, если вы еще этого не сделали
pip install argostranslate
# Установите argostranslate при необходимости
pipx install argostranslate
# Запустите скрипт перевода
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название вашего языка"
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название языка"
```
После машинного черновика имеет смысл проверить грамматику, контекст и тон с помощью LLM или человека (формальный или неформальный стиль).
После любой машинной прогонки пусть LLM или человек проверяет грамматику, контекст и тон (например формальный/неформальный стиль).
Проверьте совпадение ключей с помощью: `pnpm test -- tests/frontend/i18n.test.js --run`
`pnpm test -- tests/frontend/i18n.test.js --run` — проверка равенства ключей с `en.json`.
Никаких других изменений в коде не требуется. Приложение, селектор языка и тесты обнаруживают локали из каталога `meshchatx/src/frontend/locales/` во время сборки.
## Авторы
- [Liam Cottle](https://github.com/liamcottle) — оригинальный Reticulum MeshChat
- [RFnexus](https://github.com/RFnexus) — парсер Micron (JavaScript)
- [RFnexus](https://github.com/RFnexus) — парсер micron (JavaScript)
- [markqvist](https://github.com/markqvist) — Reticulum, LXMF, LXST
## Лицензия
Собственные части проекта лицензированы по 0BSD.
Оригинальные upstream-части, унаследованные от MeshChat, остаются под MIT.
Оригинальные upstream-части из Reticulum MeshChat остаются под MIT.
Полный текст и уведомления см. в [`../LICENSE`](../LICENSE).

View File

@@ -8,14 +8,16 @@ Liam Cottle 开发的 Reticulum MeshChat 的一个功能丰富的深度修改分
- 网站: [meshchatx.com](https://meshchatx.com)
- 源码: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- 官方镜像: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX) — 目前亦用于 Windows 与 macOS 构建。
- 发行版: [git.quad4.io/RNS-Things/MeshChatX/releases](https://git.quad4.io/RNS-Things/MeshChatX/releases)
- 官方 GitHub 镜像: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- 发行版: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- 变更日志: [`CHANGELOG.md`](../CHANGELOG.md)
- TODO: [Boards](https://git.quad4.io/RNS-Things/MeshChatX/projects)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## 与 Reticulum MeshChat 的重要差异
- 使用 LXST
- 通话使用 LXST
- 以原生 SQL 替代 Peewee ORM
- 以原生 `fetch` 替代 Axios
- 使用 Electron 41.x内置 Node 24 运行时)
@@ -27,7 +29,7 @@ Liam Cottle 开发的 Reticulum MeshChat 的一个功能丰富的深度修改分
> MeshChatX 不保证与旧版 Reticulum MeshChat 的数据兼容。迁移或测试前请备份数据。
> [!WARNING]
> 旧系统尚未完全支持。当前最低要求:Python `>=3.11`Node `>=24`Electron 41 与 Node 24 一致;`package.json` 的 `engines` 与 CI 同一基线)。
> 旧系统尚支持。当前基线为 Python `>=3.11`Node `>=24`Electron 41 与 Node 24 一致;`package.json` 的 `engines` 与 CI 同一基线)。
## 系统要求
@@ -53,15 +55,15 @@ task build:all
| Python wheel (`.whl`) | 是 | 任何 Python 支持的架构 | 无需 Node 构建的无头/Web 服务器安装 |
| Linux AppImage | 是 | `x64`, `arm64` | 便携式桌面使用 |
| Debian 包 (`.deb`) | 是 | `x64`, `arm64` | Debian/Ubuntu 安装 |
| RPM 包 (`.rpm`) | 是 | 取决于 CI | Fedora/RHEL/openSUSE |
| RPM 包 (`.rpm`) | 是 | 取决于发布所用 CI 运行环境 | Fedora/RHEL/openSUSE |
| 从源码 | 本地构建 | 主机架构 | 开发与自定义构建 |
说明:
- 发布工作流明确构建 Linux `x64``arm64` 的 AppImage + DEB
- RPM 会尝试构建,成功时上传。
- GitHub Actions 构建带标签的发行版Windows 与 macOS 见 `.github/workflows/build-release.yml`Linux wheel/AppImage/deb/rpm 见 `.github/workflows/build-linux-release.yml`,容器镜像见 `.github/workflows/docker.yml`
- Linux `x64``arm64` 的 AppImage + DEB 在 GitHub 上构建;RPM 会尝试构建,产出则上传。
## 快速开始: Docker
## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
@@ -70,8 +72,6 @@ task build:all
docker compose up -d
```
不使用 Compose 时的等效命令(相同的端口绑定与配置卷):
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
@@ -81,7 +81,7 @@ docker run -d --name reticulum-meshchatx \
ghcr.io/quad4-software/meshchatx:latest
```
镜像也可换为 Docker Hub `quad4io/meshchatx:latest`
若倾向 Docker Hub,可将镜像换为 `quad4io/meshchatx:latest`
默认 compose 文件映射:
@@ -160,7 +160,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- `pnpm install --frozen-lockfile` 禁止更新 `pnpm-lock.yaml`,若 lockfile 与 `package.json` 不一致则直接失败。这能阻止意外的上游版本被静默安装。
- `verify-store-integrity=true` 已在项目的 `.npmrc` 中设置;显式的 `pnpm config set` 行同时加固用户级配置。
- pnpm v10+ 默认禁用所有生命周期脚本(`preinstall`/`postinstall`)。仅 `package.json``pnpm.onlyBuiltDependencies` 列出的包允许执行安装脚本(当前为 `electron``electron-winstaller``esbuild``protobufjs`)。
- pnpm v10+ 默认禁用所有生命周期脚本(`preinstall`/`postinstall`)。仅 `package.json``pnpm.onlyBuiltDependencies` 列出的包允许执行安装脚本(当前为 `electron``electron-winstaller``esbuild`)。
- `poetry check --lock` 会在 `poetry.lock``pyproject.toml` 不同步时立即失败;随后的 `poetry install` 只会从 lock 文件解析依赖。
- 若需严格按 lock 文件安装 Poetry 依赖(不进行隐式刷新),用 `pip install "poetry==2.3.4"` 固定 Poetry 版本,与 CI 保持一致。
@@ -172,7 +172,7 @@ poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
在提供已捆绑或已同步的 `meshchatx-docs` 时,应用内 **文档**MeshChatX 文档)列表亦会显示同一页面。
已捆绑或已同步的 `meshchatx-docs` 文件提供服务时,应用内 **文档** 列表MeshChatX 文档)亦会显示同一页面。
## Linux 桌面:绘文字字体
@@ -214,6 +214,32 @@ pnpm run dist:rpm
task dist:fe:rpm
```
## 容器构建wheel、AppImage、deb、rpm
`Dockerfile.build` 执行与 CI 相同的步骤Poetry、pnpm、`task`、APT 等)。面向 **linux/amd64**NodeSource amd64 压缩包、Task amd64 二进制)。默认目标为全部;可用 build 参数覆盖。
`MESHCHATX_BUILD_TARGETS` 可选:`all`(默认)、`wheel``electron`x64 与 arm64 的 AppImage + deb、尽力构建 RPM、不含 wheel
构建:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
仅 wheel
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
将完成镜像中的 `/artifacts` 拷到本机:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## 架构支持
- Docker 镜像: `amd64`, `arm64`
@@ -221,7 +247,7 @@ task dist:fe:rpm
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64`(提供构建脚本)
- macOS: 提供构建脚本(`arm64``universal`),适用于本地构建环境
- Android: 原生 APK — ABI `arm64-v8a``x86_64` universal
- Android: 原生 APK — ABI `arm64-v8a``x86_64``armeabi-v7a`32 位 ARM以及 universal
## Android
@@ -235,23 +261,26 @@ MeshChatX 支持构建原生 Android APK不仅限于 Termux
# 1) 构建 android/app/build.gradle 所需的 Chaquopy 轮子
bash scripts/build-android-wheels-local.sh
# 2) 构建通用 APK一次 debug + 一 release见 android/README.md
# 2) 构建 universal APK每次运行各一 debug + 一 release见 android/README.md
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
仅一种 Android 变体(无 `slim` / `full` flavor。Gradle 将完整 `meshchatx/` 同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。
**单一** Android 变体。Gradle 将完整 `meshchatx/` 同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。
**`-PmeshchatxAbiPackaging=universal`**(默认)
**`-PmeshchatxAbiPackaging=universal`**(默认)下,每种构建类型各一个包含所有已选 ABI 的 APK
- 调试:`android/app/build/outputs/apk/debug/app-debug.apk`
- 发布:`android/app/build/outputs/apk/release/app-release-unsigned.apk`
**`-PmeshchatxAbiPackaging=split`** 且 `-PmeshchatxAbis` 含多个 ABI 时Gradle 可能按 ABI 分别产出 APK见 [`android/README.md`](../android/README.md)。
说明:
- 发布构建默认未签名(`scripts/sign-android-apks.sh`)。
- ABI`-PmeshchatxAbis``MESHCHATX_ABIS`;打包:`-PmeshchatxAbiPackaging``MESHCHATX_ABI_PACKAGING`
- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .` 后),捆绑时优先使用该 wheel。详见 [`android/README.md`](../android/README.md)
- 发布产物默认未签名,除非配置签名`scripts/sign-android-apks.sh`)。
- Android 目标 ABI 以 `android/app/build.gradle` 为准(含启用时的 `armeabi-v7a`)。为 `armeabi-v7a` 构建 wheel 需本机 `ANDROID_HOME` 上有 Android SDK`android/README.md`
- 覆盖 ABI`-PmeshchatxAbis``MESHCHATX_ABIS`。打包:`-PmeshchatxAbiPackaging=universal|split``MESHCHATX_ABI_PACKAGING`
- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .`),刷新内置仓库时优先于 PyPI 使用该 MeshChatX wheel。CI 在 Android Gradle 步骤前会构建该 wheel。
更多文档:
@@ -270,7 +299,7 @@ cd android
| `--headless` | `MESHCHAT_HEADLESS` | `false` | 不自动打开浏览器 |
| `--auth` | `MESHCHAT_AUTH` | `false` | 启用基本认证 |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | 数据目录 |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自动/捆绑 | 前端文件目录(捆绑资源安装时需要) |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | 自动/捆绑 | 前端文件目录(源码安装且未捆绑资源时需要) |
## 分支
@@ -301,55 +330,54 @@ task build:all
| `make test` | 运行前端与后端测试 |
| `make clean` | 移除构建产物与 node_modules |
## 版本
## 版本管理
本仓库当前版本: `4.6.0`
- JavaScript/Electron 版本以 `package.json` 为准
- `meshchatx/src/version.py` 通过以下命令与 `package.json` 同步:
```bash
pnpm run version:sync
```
发布时请保持相关字段一致(`package.json``pyproject.toml``meshchatx/__init__.py`)。
- 发布版本号**只**改 **`package.json` `version`**
- 运行 **`pnpm run version:sync`**(在 **`pnpm run build`** 开头也会执行)可将该版本同步到 **`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(产品行)、**README** / **lang/README.\*** 中的“当前版本”行、**`docs/meshchatx_on_raspberry_pi.md`** 的 pipx 示例,以及 **`packaging/arch/PKGBUILD`** 的辅助字段。
- **`meshchatx.__version__`** 从 **`meshchatx/src/version.py`** 读取且不导入 **`meshchatx.src`**,因此普通 `import meshchatx` 仍很轻量。
- **变更日志**在发版时仍由人工维护。
## 安全
- [`SECURITY.md`](../SECURITY.md)
- 应用内置完整性检查与默认 HTTPS/WSS
- CI 与发版在 `.github/workflows/`Gitea 仅保留 `.gitea/workflows/github-release-sync.yml` 用于同步 GitHub Release`SECURITY.md`
- [`LEGAL.md`](../LEGAL.md)
- 应用运行时内置完整性检查与默认 HTTPS/WSS。
- CI 与发行构建在 GitHub Actions。
## 添加语言
语言检测是自动的。在 `meshchatx/src/frontend/locales/` 下新增 JSON 文件(例如 `xx.json`),键与 `en.json` 一致,并在顶层设置 `_languageName` 作为语言选择器中的显示名称。可以复制 `en.json` 后完全人工翻译;**使用 Argos 等机器辅助生成是可选的**,并非必需
作者流程ArgosTranslate再到本地 LLMQwen 3 + Gemma 4
**欢迎提交纠错与人工翻译。** 若修正现有语言文件或提交完整人工翻译,请通过合并请求或议题提交至[项目源码仓库](https://git.quad4.io/RNS-Things/MeshChatX)或 [GitHub 镜像](https://github.com/Quad4-Software/MeshChatX)
之后欢迎通过 LXMF 或其他方式提交修正
**可选Argos Translate 初稿** -- 若需要从 `en.json` 生成机器翻译初稿,可使用 `scripts/argos_translate.py`。它会处理格式并有助于保护插值变量(如 `{count}`
语言环境为自动发现。在 `meshchatx/src/frontend/locales/` 添加新文件(如 `xx.json`),键与 `en.json` 相同,并设顶层 `_languageName` 作为选择器标签。可复制 `en.json` 全手工翻译;**机器辅助生成(可选)**从不要求
**可选Argos Translate 起步** -- 若需从 `en.json` 生成初稿,可使用 `scripts/argos_translate.py`(处理格式、彩色输出,并保护如 `{count}` 的插值变量)。
```bash
# 如果尚未安装,请安装 argostranslate
pip install argostranslate
# 若尚未安装 argostranslate
pipx install argostranslate
# 运行翻译脚本
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "您的语言名称"
```
机器初稿之后,建议由 LLM 或人工审校语法、语境与语气(如正式非正式)。
任何机器辅助之后,请用 LLM 或人工核对语法、语境与语气(如正式/非正式)。
运行 `pnpm test -- tests/frontend/i18n.test.js --run``en.json` 的键一致
运行 `pnpm test -- tests/frontend/i18n.test.js --run` 验与 `en.json` 的键一致。
不需要其他代码更改。应用程序、语言选择器和测试在构建时从 `meshchatx/src/frontend/locales/` 目录发现所有语言环境。
## 致谢
- [Liam Cottle](https://github.com/liamcottle) - 原始 Reticulum MeshChat
- [RFnexus](https://github.com/RFnexus) - Micron 解析器JavaScript
- [RFnexus](https://github.com/RFnexus) - micron 解析器JavaScript
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## 许可证
项目自有部分采用 0BSD 许可。
源自 MeshChat 的原始上游部分继续采用 MIT 许可。
源自 Reticulum MeshChat 的原始上游部分继续采用 MIT 许可。
完整文本与声明请见 [`../LICENSE`](../LICENSE)。