{"id":49832897,"url":"https://github.com/anonmesh/mobile_app","last_synced_at":"2026-05-30T12:00:28.390Z","repository":{"id":320027898,"uuid":"1059682222","full_name":"anonmesh/mobile_app","owner":"anonmesh","description":"Offline-first Solana wallet and encrypted mesh messenger. over BLE · LoRa · TCP. No internet. No SIM. Powered by Arcium + Reticulum.","archived":false,"fork":false,"pushed_at":"2026-05-25T01:16:05.000Z","size":119688,"stargazers_count":17,"open_issues_count":2,"forks_count":6,"subscribers_count":0,"default_branch":"v3","last_synced_at":"2026-05-25T03:20:28.911Z","etag":null,"topics":["arcium","ble","bluetooth","p2p","privacy","reticulum","reticulum-lora-heltec-sx1262","reticulum-rs","solana","zk"],"latest_commit_sha":null,"homepage":"https://anonme.sh/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anonmesh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-18T19:35:13.000Z","updated_at":"2026-05-21T14:25:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"2809b3f5-304f-44ae-8207-b942de0f986f","html_url":"https://github.com/anonmesh/mobile_app","commit_stats":null,"previous_names":["magicred-1/anon0mesh","anon0mesh/anon0mesh","anonmesh/mobile_app"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/anonmesh/mobile_app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anonmesh%2Fmobile_app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anonmesh%2Fmobile_app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anonmesh%2Fmobile_app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anonmesh%2Fmobile_app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anonmesh","download_url":"https://codeload.github.com/anonmesh/mobile_app/tar.gz/refs/heads/v3","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anonmesh%2Fmobile_app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33691312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arcium","ble","bluetooth","p2p","privacy","reticulum","reticulum-lora-heltec-sx1262","reticulum-rs","solana","zk"],"created_at":"2026-05-13T22:00:27.287Z","updated_at":"2026-05-30T12:00:28.383Z","avatar_url":"https://github.com/anonmesh.png","language":"TypeScript","funding_links":[],"categories":["Messangers and Browsers"],"sub_categories":[],"readme":"![anonmesh](mobile_app/assets/banner/anonmesh_banner.jpeg)\n\n# anonmesh\n\n**No centralized servers. No accounts. No surveillance. No bullshit.**\n\nEncrypted mesh messaging and Solana payments for Android and iOS that works on a mountaintop, in the middle of the ocean, in a blackout, or anywhere the internet doesn't reach. If two devices can find each other over *anything* — Bluetooth, LoRa radio, LAN, the internet — they can talk. No carrier required. No cloud account. Community-run public TCP relays are pre-configured for bootstrap and can be removed in settings.\n\nYou own the keys. You own your share of the network. Nobody can take it from you.\n\n---\n\n## Why\n\nEvery messaging app you use today is a surveillance platform with a chat UI bolted on. Signal requires a phone number. WhatsApp is Meta. Telegram stores your messages on their servers. Even \"decentralized\" apps route through centralized relays, CDNs, or DNS.\n\nanonmesh routes through whatever's available — peer-to-peer first, beacon-relays only when no direct path exists. It uses [Reticulum](https://reticulum.network), a cryptographic transport network that works over whatever physical medium is available, and [LXMF](https://github.com/markqvist/LXMF) for message delivery. There is no account creation. There is no central server to subpoena. There is no company to comply with a warrant. Your identity is a keypair that lives only on your device.\n\n---\n\n## Messaging\n\n### Direct Messages\n\nScan a QR code or paste an LXMF hash. That's it. The message is encrypted end-to-end with X25519 + AES-128 + HMAC per the [Reticulum spec](https://reticulum.network/manual/understanding.html) before it leaves your device. If the peer is offline, the message queues locally and delivers the moment a path opens, over any interface, across any number of hops.\n\n- No phone number. No username. No account.\n- Peer status (online / offline, hop count, interface) live in the thread header\n- Images and media over all transports\n- Delivery states: queued → sent → delivered\n\n### Channels\n\nEncrypted multicast groups with a shared AES-128 key. No server coordinates membership. No admin can ban you. Any peer with the address and key is in, period.\n\n**Create** · Open drawer → CHANNELS → CREATE → name it → done. Share the QR or `addr:key` pair.\n\n**Join** · Open drawer → CHANNELS → JOIN → scan QR or paste address + key manually.\n\n**Leave** · Swipe left on the channel row → LEAVE.\n\n**Share** · Tap ↗ in the channel thread header → QR code + copyable address and key.\n\n---\n\n## Mesh Networking\n\nThe Nodes tab is a live radar of every peer your device can reach. Laid out by hop count, color-coded by transport, pan/pinch to explore. Tap any node for interface, hops, and latency. Fullscreen mode for the full picture.\n\n**Transports — if the signal can carry bits, Reticulum will use it:**\n\n- **LoRa via RNode** — kilometers of range with no infrastructure whatsoever. Pair your RNode over BLE directly in the app.\n- **Bluetooth Low Energy** — direct device-to-device, no WiFi needed\n- **TCP/IP** — LAN, internet, or any IP network as a backbone\n\nNodes relay messages forward. The more people run anonmesh, the stronger and wider the network gets. You are the infrastructure.\n\n---\n\n## Solana Wallet\n\nNon-custodial. Keys never leave the device.\n\n**On Solana Mobile (Seeker / Saga):** Mobile Wallet Adapter keeps keys in the device's hardware secure element. anonmesh never sees your private key.\n\n**On everything else:** keypair generated and encrypted locally on first launch. Exportable. Never transmitted.\n\n- SOL balance with live USD value\n- All SPL token accounts, at a glance (Token program; Token-2022 not yet supported)\n- Send SOL or SPL tokens to any Solana address; sending to a mesh peer handle is a roadmap item\n- Receive via QR\n- On-chain activity history\n- Swap, yield, and confidential offline transfers (coming soon — roadmap previews are labeled in-app)\n\nNo analytics. No telemetry. RPC calls are limited to reading the chain and submitting transactions, and the endpoint is yours to configure. On mesh-RPC mode, requests are proxied through a beacon-relay (a future release will encrypt the JSON-RPC payload end-to-end to the relay).\n\n---\n\n## Identity \u0026 Privacy\n\n- Keypair generated locally on first launch. Stored in the platform's hardware-backed keystore where available (iOS Keychain / Android Keystore with StrongBox or TEE); on older Android devices, expo-secure-store falls back to EncryptedSharedPreferences. Never uploaded anywhere.\n- No sign-up flow. No email. No phone number. No verification.\n- Display name exists only on your device — but if you choose to announce, your display name and (optional) beacon-mode tag travel in plaintext in the announce's `appData`. Direct-message contents and group payloads stay encrypted.\n- Message contents are encrypted; routing metadata (the address hash, hop count, transport interface, and the appData above) is visible to nodes that forward your traffic.\n- Lose the device, restore from your key export. No account recovery email. No support ticket. Sovereign.\n\n---\n\n## What's labeled \"PREVIEW\"\n\nIf you see a `PREVIEW · coming soon` pill or tap a CTA that surfaces a brief \"not yet wired\" hint, that surface is roadmap chrome — the UI exists, the wiring doesn't. We label them in-app instead of removing them so the design language stays consistent between this release and the one that lights them up. Every preview-labelled surface in the current build:\n\n| Surface | Where | \"Coming soon\" because |\n|---|---|---|\n| Cellular fallback | Settings → Network → \"cellular fallback\" | No consumer reads this preference yet; `useNetworkMode` only switches by reachability. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+wire+cellular+fallback+toggle\u0026labels=preview%2Croadmap)) |\n| Pair hardware: Configure / Update FW | Settings → Hardware radio (when paired) | RNode pairing surfaces a transport, but no configure / firmware-update flows are implemented. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+RNode+configure+%2B+firmware+update\u0026labels=preview%2Croadmap)) |\n| Copy address (inline) | Direct message · \"address shared\" bubble | Inline copy icon doesn't yet call Clipboard. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+wire+inline+address+copy+in+ShareAddressBubble\u0026labels=preview%2Croadmap)) |\n| Send to this address | Direct message · \"address shared\" bubble | One-tap \"send to\" doesn't yet route into the Send flow with the address prefilled. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+wire+send-to-address+CTA+in+ShareAddressBubble\u0026labels=preview%2Croadmap)) |\n| Share `\u003casset\u003e` address | Direct message · \"address request\" bubble | Reply CTA doesn't yet attach the user's wallet address to a `share-address` bubble. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+wire+share-address+reply+CTA\u0026labels=preview%2Croadmap)) |\n| Pay privately / Decline | Direct message · \"payment request\" bubble | Inline pay flow and decline-receipt are roadmap. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+wire+pay-privately+%2B+decline+on+payment+requests\u0026labels=preview%2Croadmap)) |\n| Pending cosigns | Nodes screen | Multi-sig cosign queue is roadmap; no signing path is wired. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+wire+multi-sig+cosign+queue\u0026labels=preview%2Croadmap)) |\n| Stealth transfer | Send → Review | Stealth-transfer path is a preview tile; the actual send uses the standard transfer path. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+ship+stealth+transfer+path\u0026labels=preview%2Croadmap)) |\n| Token-2022 sends | Send → Token Picker / Review | Token-2022 mints are explicitly rejected by `assertSendableSplProgram`. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+support+Token-2022+sends\u0026labels=preview%2Croadmap)) |\n| Swap · Yield · Confidential offline | Wallet tabs (Swap, Yield) | Not exported from `components/wallet/index.ts`; visible only in dev-routes. ([file an issue](https://github.com/anonmesh/mobile_app/issues/new?title=Preview%3A+ship+Swap+%2F+Yield+%2F+confidential+offline+wallet+tabs\u0026labels=preview%2Croadmap)) |\n\nIf a preview surface is gone in a later release, it's either because the feature shipped (good) or because we removed the affordance entirely (also good — better than a dead button).\n\n---\n\n## Installation\n\n```bash\ncd mobile_app\nnpm install\nnpx expo run:android   # or run:ios\n```\n\nRequires: Node 20+, Android Studio / Xcode, Expo CLI.\n\nThe native LXMF bridge (`@magicred-1/react-native-lxmf`) ships a prebuilt Rust library for both platforms. No extra native setup.\n\n```bash\nnpx expo start --dev-client   # dev client mode\n```\n\n---\n\n## Architecture\n\n```\nmobile_app/\n  app/(tabs)/          # Messages, Nodes, Wallet, Settings\n  components/\n    messages/          # Composer, PeersDrawer, channel modals, QR scanner\n    nodes/             # MeshMap topology canvas (pan/pinch/fullscreen)\n    settings/          # RNode pairing, identity QR export\n  context/\n    LxmfContext.tsx    # Reticulum/LXMF bridge — peers, groups, send, identity\n    WalletContext.tsx  # Solana — MWA / local keypair, connect/disconnect\n  src/storage/         # SecureStore wrappers for identity + group registry\n```\n\nLXMF bridge is a React Native module backed by Rust. Groups and identity persist in SecureStore and re-register with the Rust layer on every node start.\n\n---\n\n## Compatibility\n\nanonmesh speaks standard LXMF. It works with [Sideband](https://github.com/markqvist/sideband), [Nomad Network](https://github.com/markqvist/nomadnet), and any other LXMF-compatible client on the Reticulum network. Platform doesn't matter. Protocol does.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanonmesh%2Fmobile_app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanonmesh%2Fmobile_app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanonmesh%2Fmobile_app/lists"}