agentleFS
zjs81zjs81/meshcore-open/CLAUDE.md

meshcore-open

CLAUDE.md658 starsChanged 7 days agoMITView on GitHub

MeshCore Open is a Flutter client for MeshCore radios over BLE, USB serial, or TCP. It supports direct/channel messaging, communities, region-scoped floods, channel image messages, maps, repeater administration, and optional on-device translation. Read AGENTS.md for repository rules and CONTRIBUTING.md for contribution workflow. Target dev and discuss changes before submitting a PR. Use Flutter and Dart on PATH (or your SDK’s absolute path): The versioned web build uses dart run build_pipe:build (also bun run build). pubspec.yaml pins an exact Flutter release…

  • In this repositoryOne other file it gives its agents.

The file

We split this CLAUDE.md into the rules it gives an agent

4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Read AGENTS.md for repository rules and CONTRIBUTING.md for contribution workflow.

    line 5
  2. Distinctive:

    Use Flutter and Dart on PATH (or your SDK’s absolute path):

    line 9
  3. Very specific:

    Use context.l10n (from lib/l10n/l10n.dart) for all user-facing strings.

    line 58
  4. Distinctive:

    Use the feature index, regions, image messages, message filter, and routing reference.

    line 72

≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
CLAUDE.md

MeshCore Open — development guide

MeshCore Open is a Flutter client for MeshCore radios over BLE, USB serial, or TCP. It supports direct/channel messaging, communities, region-scoped floods, channel image messages, maps, repeater administration, and optional on-device translation.

Read AGENTS.md for repository rules and CONTRIBUTING.md for contribution workflow. Target dev and discuss changes before submitting a PR.

Commands

Use Flutter and Dart on PATH (or your SDK’s absolute path):

flutter pub get
flutter run
dart format --output=none --set-exit-if-changed .
flutter analyze --fatal-infos --fatal-warnings
flutter test
flutter build apk --release
flutter build ios --release
flutter build web --release
flutter build linux --release
MESHCORE_BUILD_APPIMAGE=0 flutter build linux --release
bash scripts/appimage/test_packaging.sh

The versioned web build uses dart run build_pipe:build (also bun run build). pubspec.yaml pins an exact Flutter release (environment.flutter); flutter pub get refuses other versions and every CI job reads it via flutter-version-file. Linux packaging uses the matching pin in scripts/appimage-tools.json, and CI fails if the two differ. The Nix shell does not provide Flutter; use the pinned SDK on PATH. Read pubspec.yaml for current app version and dependencies rather than copying them into this guide.

Linux Release installs generate architecture-matched AppImages using linuxdeploy/GTK and appimagetool: x86_64 on x64 and AArch64 on ARM64. Tools and runtime download automatically with pinned SHA-256 checksums. MESHCORE_BUILD_APPIMAGE=0 skips packaging at install time, without a CMake cache reset. Debug/Profile are unchanged. Nix-linked x64 bundles and hosts with glibc newer than the pinned baseline trigger an isolated Ubuntu rebuild through an available Podman/Docker engine. Rootless Podman uses --userns=keep-id for host-owned bind mounts; see Linux AppImage for prerequisites, cache/offline behavior and limitations. Preserve binary/data/lib adjacency and nested native assets when changing packaging.

For Linux, use nix develop; see Linux with Nix for the pinned SDK, native build checks, cache troubleshooting, and Sysprof host prerequisites.

Architecture and important files

AreaSource
Entry point, providers, themes and localelib/main.dart
Shared BLE/TCP/USB state and frame dispatchlib/connector/meshcore_connector.dart
Protocol constants and builderslib/connector/meshcore_protocol.dart
NUS UUIDs; reference device name prefixeslib/connector/meshcore_uuids.dart
Serial marker/length framinglib/services/usb_serial_frame_codec.dart
ACK tracking and retry schedulinglib/services/message_retry_service.dart
Route scoring/historylib/services/path_history_service.dart
Preferences and JSON storeslib/storage/
Region list and channel/default assignmentslib/storage/region_store.dart, lib/storage/channel_region_store.dart
Message filter (rules, duplicate/spam checks, on-device classifier)lib/services/message_filter/, lib/models/message_filter.dart, lib/storage/message_filter_store.dart, lib/screens/message_filter_settings_screen.dart, lib/screens/filtered_messages_screen.dart
Translation models/inferencelib/services/translation_service.dart
Image models/inference and GRP_DATA chunkslib/services/image_codec_service.dart, lib/services/image_chunk_transport.dart
Image reassembly and file persistencelib/services/received_image_store.dart, lib/services/received_image_blob_store_io.dart
Material themeslib/theme/mesh_theme.dart
Screens and reusable UIlib/screens/, lib/widgets/
Localizationlib/l10n/ (19 locales)

Provider/ChangeNotifier drives UI state. main.dart wires MeshTheme.light() and MeshTheme.dark() and uses the saved theme preference. Its MultiProvider exposes MeshCoreConnector, MessageRetryService, PathHistoryService, AppSettingsService, BleDebugLogService, AppDebugLogService, ChatTextScaleService, TranslationService, UiViewStateService, StorageService (plain Provider), MapTileCacheService, TimeoutPredictionService, ImageCodecService, ReceivedImageStore, and MessageFilterService; screens read them with Consumer<T>, context.watch<T>(), or context.read<T>().

Most JSON stores scope keys by the first 10 hex chars of the connected device's public key, so per-radio data stays isolated; some preferences, including the saved region-name list, are global. Model bundles, received images, and caches use files.

Localization

Use context.l10n (from lib/l10n/l10n.dart) for all user-facing strings. lib/l10n/app_en.arb is the template; add new keys there first. Keys missing from other locales are written to untranslated.json (configured in l10n.yaml). Contact-type names live in lib/l10n/contact_localization.dart.

Transport and platform notes

BLE scans by NUS service UUID, not advertised-name prefix. USB uses [marker][length uint16 LE][payload], not COBS. TCP uses the same packet framing. See the protocol reference.

Web supports USB via Web Serial in Chrome only, over a secure origin. BLE is not available in the browser (the scanner shows a snackbar instead of scanning), and TCP is not supported on web (tcp_transport_service_web.dart always throws). Translation and image inference have no web backend.

Transport entry points on MeshCoreConnector: connectTcp(host:, port:), connectUsb(portName:, baudRate: 115200), and listUsbPorts(). On Linux, lib/services/linux_ble_pairing_service.dart falls back to bluetoothctl when BlueZ pairing prompts fail.

Android builds currently include ARM64 only and use Java 17. iOS targets 16.4. Read platform build files for current constraints; hardware testing remains necessary for transport changes.

Documentation

Use the feature index, regions, image messages, message filter, and routing reference. Keep protocol details in the canonical reference rather than maintaining competing command tables.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.