diff --git a/Makefile b/Makefile
index 0b4e0dd..4120b54 100644
--- a/Makefile
+++ b/Makefile
@@ -34,8 +34,9 @@ DAILY_BUILD := $(shell \
# Version format: YYYY.MMDD.DAILY+BUILD
# DAILY resets each day (for readability), BUILD always increments (for Android)
NEW_VERSION := $(YEAR).$(MMDD).$(DAILY_BUILD)+$(NEW_BUILD_NUMBER)
+NEW_BUILD_NAME := $(shell echo $(NEW_VERSION) | cut -d'+' -f1)
-.PHONY: help version bump build release release-android release-ios clean deps analyze test icon bundle bundle-no-bump
+.PHONY: help version bump make-bump sync-ios-version build release release-android release-ios clean deps analyze test icon bundle bundle-no-bump
help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
@@ -49,8 +50,19 @@ version: ## Show current and next version
bump: ## Bump version in pubspec.yaml
@echo "Bumping version to $(NEW_VERSION)..."
@sed -i '' 's/^version: .*/version: $(NEW_VERSION)/' $(PUBSPEC)
+ @$(MAKE) sync-ios-version BUILD_NAME=$(NEW_BUILD_NAME) BUILD_NUMBER=$(NEW_BUILD_NUMBER)
@echo "Version bumped to $(NEW_VERSION)"
+make-bump: bump ## Alias for bump
+
+sync-ios-version: ## Sync iOS FLUTTER_BUILD_NAME/NUMBER from pubspec or provided BUILD_NAME/BUILD_NUMBER
+ @$(eval IOS_VERSION := $(shell grep '^version:' $(PUBSPEC) | sed 's/version: //'))
+ @$(eval IOS_BUILD_NAME := $(if $(BUILD_NAME),$(BUILD_NAME),$(shell echo $(IOS_VERSION) | cut -d'+' -f1)))
+ @$(eval IOS_BUILD_NUMBER := $(if $(BUILD_NUMBER),$(BUILD_NUMBER),$(shell echo $(IOS_VERSION) | cut -d'+' -f2)))
+ @echo "Syncing iOS version to $(IOS_BUILD_NAME)+$(IOS_BUILD_NUMBER)..."
+ @flutter build ios --config-only --build-name "$(IOS_BUILD_NAME)" --build-number "$(IOS_BUILD_NUMBER)" > /dev/null
+ @echo "iOS version synced"
+
deps: ## Install dependencies
flutter pub get
@@ -115,6 +127,7 @@ release-android: build ## Build APK and create GitHub release (Android only)
release-ios: ## Build iOS and upload to TestFlight
@echo "Building iOS and uploading to TestFlight..."
+ @$(MAKE) sync-ios-version
cd ios && fastlane release
@echo "iOS release uploaded!"
diff --git a/README.md b/README.md
index 6034387..a96e0d0 100644
--- a/README.md
+++ b/README.md
@@ -15,20 +15,25 @@
MeshCore SAR helps teams coordinate in low-connectivity or no-connectivity environments with messaging, voice, images, maps, and live location context in one app.
+It uses the MeshCore protocol over LoRa for long-range, infrastructure-free communication.
## Highlights
-- Fast mesh messaging for direct and group coordination
-- On-demand voice and image transfer optimized for constrained links
-- Offline-first mapping with tactical overlays and SAR markers
-- Live team tracking, trails, and shareable map drawings
+- Rapid mesh chat for both 1:1 and group coordination
+- On-demand voice (Codec2) and image (AVIF) transfer tuned for low-bandwidth links
+- Offline-first mapping with tactical overlays and SAR incident markers
+- Live team location, movement trails, and shareable tactical drawings
## Demo Video
+<<<<<<< Updated upstream
[
](https://youtu.be/rLsKeLJBpFg)
Watch on YouTube: https://youtu.be/rLsKeLJBpFg
+=======
+[Watch the MeshCore SAR demo on YouTube](https://youtu.be/rLsKeLJBpFg)
+>>>>>>> Stashed changes
## Screenshots
@@ -45,8 +50,8 @@ Watch on YouTube: https://youtu.be/rLsKeLJBpFg
| Area | What you get |
|---|---|
| Messaging | Direct and group chat over mesh, with contact/room awareness from live telemetry |
-| Voice | Push-to-talk voice clips, fetched on demand when play is pressed, auto-play on completion |
-| Images | Camera/gallery image sending, auto-compression, tap-to-load receiving, full-screen viewer |
+| Voice | Push-to-talk voice clips (Codec2), fetched on demand when play is pressed, auto-play on completion |
+| Images | Camera/gallery image sending (AVIF), auto-compression, tap-to-load receiving, full-screen viewer |
| Maps | Street/topo/satellite/terrain layers, offline tile downloads, optional MBTiles import |
| SAR Operations | Team markers with freshness indicators, SAR markers for incidents and staging points |
| Tracking | Continuous GPS updates, personal trails, distance/duration trail stats |
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index a317c9c..6e7e37c 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -489,7 +489,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 68;
+ CURRENT_PROJECT_VERSION = 69;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -511,7 +511,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 68;
+ CURRENT_PROJECT_VERSION = 69;
DEVELOPMENT_TEAM = JND55328G8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
@@ -530,7 +530,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 68;
+ CURRENT_PROJECT_VERSION = 69;
DEVELOPMENT_TEAM = JND55328G8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
@@ -547,7 +547,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 68;
+ CURRENT_PROJECT_VERSION = 69;
DEVELOPMENT_TEAM = JND55328G8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
@@ -679,7 +679,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 68;
+ CURRENT_PROJECT_VERSION = 69;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -702,7 +702,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 68;
+ CURRENT_PROJECT_VERSION = 69;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 642a6b2..b5fb1eb 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -43,7 +43,7 @@
CFBundleSignature
????
CFBundleVersion
- 68
+ 69
LSRequiresIPhoneOS
NSBluetoothAlwaysUsageDescription
@@ -68,8 +68,12 @@
MeshCore SAR needs access to the compass to show your heading direction on the map
NSMicrophoneUsageDescription
MeshCore SAR needs microphone access to send voice messages over the mesh radio network during SAR operations
+ NSCameraUsageDescription
+ MeshCore SAR needs camera access to take photos and attach them to SAR messages
NSPhotoLibraryUsageDescription
MeshCore SAR may need access to your photo library to attach images to messages or save map screenshots for documentation during SAR operations
+ NSPhotoLibraryAddUsageDescription
+ MeshCore SAR needs permission to save exported screenshots and SAR documentation images to your photo library
UIApplicationSceneManifest
UIApplicationSupportsMultipleScenes
diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml
index 7717247..7585c57 100644
--- a/ios/fastlane/report.xml
+++ b/ios/fastlane/report.xml
@@ -5,22 +5,22 @@
-
+
-
+
-
+
-
+
diff --git a/pubspec.yaml b/pubspec.yaml
index 8e4da52..a920c7b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
-version: 2026.0302.1+4
+version: 2026.0303.1+5
environment:
sdk: ^3.9.2