mirror of
https://git.quad4.io/RNS-Things/MeshChatX.git
synced 2026-04-26 13:07:55 +00:00
docs(README): update
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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 から ローカル LLM(Qwen 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) を参照してください。
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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,再到本地 LLM(Qwen 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)。
|
||||
|
||||
Reference in New Issue
Block a user