Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3cd34f3
fix: improve lxmf startup and peer counts
epicexcelsior May 3, 2026
c45a0f6
merge upstream/v3 (PR #27 + Android FGS + 1.0.1)
epicexcelsior May 6, 2026
fb01711
feat(wallet): add real spl sends
epicexcelsior May 7, 2026
66647e7
feat(settings): gate wallet recovery key
epicexcelsior May 7, 2026
5ad45aa
chore(wallet): clarify transfer comments
epicexcelsior May 7, 2026
3436f98
chore(expo): align sdk validation
epicexcelsior May 7, 2026
687daac
fix(wallet): resolve spl activity counterparties
epicexcelsior May 7, 2026
dfe274b
feat(receive): encode solana pay qr
epicexcelsior May 7, 2026
15442c8
feat(send): remember recent recipients
epicexcelsior May 7, 2026
0cc283e
feat(onboarding): add first-run tutorial
epicexcelsior May 7, 2026
6f155fa
feat(settings): manage address book
epicexcelsior May 7, 2026
25ba066
feat(onboarding): clarify empty states
epicexcelsior May 7, 2026
371cde0
chore(test): add tier0 validation script
epicexcelsior May 7, 2026
55519f4
chore(lint): clear existing warnings
epicexcelsior May 7, 2026
d691b53
chore(test): cover tier0 service helpers
epicexcelsior May 7, 2026
7e903aa
fix(runtime): load solana polyfills before route modules
epicexcelsior May 7, 2026
cb09e81
fix(security): keep recovery modal inside secure window
epicexcelsior May 7, 2026
02ec179
fix(android): declare and centralize ble permissions
epicexcelsior May 7, 2026
4db735d
fix(settings): harden recovery key display
epicexcelsior May 7, 2026
c2f6d18
chore(test): verify tier0 config gates
epicexcelsior May 7, 2026
65288a1
fix(send): parse sol amounts exactly
epicexcelsior May 7, 2026
544b99d
refactor(send): centralize devnet explorer links
epicexcelsior May 7, 2026
5e0e9b2
fix(tier0): log wallet export and label stealth preview
epicexcelsior May 7, 2026
1fdf353
fix(wallet): recreate incomplete local wallet
epicexcelsior May 7, 2026
398793b
fix(send): surface wallet transfer failures
epicexcelsior May 7, 2026
84b36ad
chore(tier0): add send log capture helper
epicexcelsior May 7, 2026
fa78c4e
fix(errors): preserve Error.cause through safeStringify
epicexcelsior May 7, 2026
f0a7202
chore(tier0): extract wallet denial classifier and expand service tests
epicexcelsior May 7, 2026
b462a7e
fix(wallet): write marker last so partial creates self-recover
epicexcelsior May 7, 2026
80a01ca
feat(wallet): filter token-2022 mints from send picker
epicexcelsior May 7, 2026
fbdee4c
fix(wallet): hide non-SOL token entries from send picker pending root…
epicexcelsior May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions mobile_app/.env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Optional local Reticulum/LXMF TCP bridge. Use a real LAN IP for a physical
# phone. `localhost` and placeholder hosts are ignored to avoid retry storms.
EXPO_PUBLIC_LOCAL_LXMF_HOST=192.168.x.x
EXPO_PUBLIC_LOCAL_LXMF_PORT=4243
EXPO_PUBLIC_LXMF_LOG_LEVEL=1
# Copy to `.env` (gitignored) and fill in before running.
# All values with EXPO_PUBLIC_ prefix are inlined at build time — never put
# secrets here that you wouldn't ship in a public bundle.
Expand Down
24 changes: 21 additions & 3 deletions mobile_app/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,31 @@
"NSCameraUsageDescription": "This app requires camera access to scan QR codes for connecting with peers and sharing content.",
"NSPhotoLibraryUsageDescription": "Allow anonmesh to access your photo library to send images in encrypted chats.",
"NSFaceIDUsageDescription": "This app uses Face ID to securely authenticate you when accessing sensitive features or information within the app.",
"UIBackgroundModes": ["bluetooth-central", "bluetooth-peripheral", "fetch", "processing"],
"BGTaskSchedulerPermittedIdentifiers": ["magicred1.anonmesh.app.background-processing"]
"UIBackgroundModes": [
"bluetooth-central",
"bluetooth-peripheral",
"fetch",
"processing"
],
"BGTaskSchedulerPermittedIdentifiers": [
"magicred1.anonmesh.app.background-processing"
]
},
"entitlements": {
"aps-environment": "production"
}
},
"android": {
"package": "magicred1.anonmesh.app",
"permissions": [
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT",
"android.permission.BLUETOOTH_ADVERTISE",
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION"
],
"adaptiveIcon": {
"backgroundColor": "#0E0E12",
"foregroundImage": "./assets/images/favicon.png"
Expand Down Expand Up @@ -79,6 +95,7 @@
],
"expo-secure-store",
"expo-local-authentication",
"./plugins/withDisableAndroidContentCapture",
[
"expo-notifications",
{
Expand All @@ -87,7 +104,8 @@
}
],
"@magicred-1/react-native-lxmf",
"./plugins/withAndroidForegroundService"
"./plugins/withAndroidForegroundService",
"expo-web-browser"
],
"experiments": {
"typedRoutes": true,
Expand Down
13 changes: 10 additions & 3 deletions mobile_app/app/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ const E = StyleSheet.create({
text: { flex: 1, fontSize: 12, lineHeight: 17 },
});

function NotificationBridge({ onInApp }: { readonly onInApp: (n: NotificationPayload) => void }) {
const [notifsEnabled] = useNotificationEnabled();
useMessageNotifications(onInApp, notifsEnabled);
usePeerCountNotification(notifsEnabled);
return null;
}

function AppShell() {
const router = useRouter();
const { colors } = useTheme();
Expand All @@ -77,17 +84,16 @@ function AppShell() {
}, []);

useBackgroundService();
const [notifsEnabled] = useNotificationEnabled();
useMessageNotifications(handleInApp, notifsEnabled);
usePeerCountNotification(notifsEnabled);

return (
<View style={[R.appRoot, { backgroundColor: colors.background }]}>
<NavThemeProvider value={DarkTheme}>
<Stack initialRouteName="index" screenOptions={{ headerShown: false, contentStyle: { backgroundColor: 'transparent' } }}>
<Stack.Screen name="index" />
<Stack.Screen name="onboarding" />
<Stack.Screen name="tutorial" options={{ gestureEnabled: false }} />
<Stack.Screen name="(tabs)" options={{ gestureEnabled: false }} />
<Stack.Screen name="contacts" options={{ presentation: 'modal', animation: 'slide_from_bottom' }} />
<Stack.Screen name="receive" options={{ presentation: 'modal', animation: 'slide_from_bottom' }} />
<Stack.Screen name="send/recipient" />
<Stack.Screen name="send/amount" />
Expand All @@ -98,6 +104,7 @@ function AppShell() {
</NavThemeProvider>

<LxmfErrorBanner />
<NotificationBridge onInApp={handleInApp} />

<InAppNotificationBanner
notification={activeNotif}
Expand Down
Loading