# XMTP Mobile SDKs Living document & meeting notes. ## Overview ### Objectives 1. Unblock native (Android/Kotlin, iOS/Swift) mobile app devs from building with XMTP. - Bunches - http://bunches.xyz/ - Ghost Messenger - https://g.host/ - Dubdubdub - XMTP (1st party) 2. Unblock React Native mobile app devs from building with XMTP. - Phaver - https://phaver.com/ - Showtime - https://www.showtime.xyz/ - FWB - https://www.fwb.help/ 3. Unblock Flutter mobile app devs from building with XMTP. - Orb - https://orb.ac/ - Tribes - https://www.tribes.xyz/ --- ## Android / Kotlin ### _NOT STARTED_ ### Requirements Port `xmtp-js` to `xmtp-kotlin` and demonstrate core functionality in a Kotlin sample app. ### Deadline TBD ### Task overview TBD --- ## iOS / Swift ### Requirements Port `xmtp-js` to `xmtp-swift` and demonstrate core functionality in a Swift sample app. ### Deadline Dec. 13, 2022 ### Task overview - [ ] Create Swift package: `xmtp_proto` - [ ] Add a Swift package generator to https://github.com/xmtp/proto - [ ] Publish to Swift Package Manager - [ ] [**MILESTONE 1**] Create Swift package: `xmtp-swift` - [ ] Set up work repo: https://github.com/xmtp/xmtp-Swift - [ ] Wrap xmtp in a Swift-conventional `xmtp.Client` (like `xmtp-js`) - [ ] Reproduce utility classes/methods - [ ] Conversations - [ ] Content types - [ ] canMessage - [ ] ... - [ ] Publish to Swift Package Manager - [ ] [**MILESTONE 2**] Create sample app: xmtp/example-chat-swift - [ ] Set up work repo: https://github.com/xmtp/example-chat-swift - [ ] Use xmtp-swift to demonstrate SDK (like `example-chat-react`) - [ ] Initialize client - [ ] List messages - [ ] Send messages - [ ] Stream messages --- ## Flutter ### Requirements Port `xmtp-js` to `xmtp-flutter` and demonstrate core functionality in a Flutter sample app. ### Deadline Dec. 13, 2022 ### Task overview - [ ] Setup XMTP as a [verified publisher](https://dart.dev/tools/pub/publishing#verified-publisher) - [ ] Create dart package: `xmtp_proto` - [ ] Add a dart-package generator to https://github.com/xmtp/proto - [ ] Publish to https://pub.dev/packages/xmtp_proto - [ ] [**MILESTONE 1**] Create dart package: `xmtp-flutter` - [ ] Set up work repo: https://github.com/xmtp/xmtp-flutter - [ ] Wrap xmtp in a dart-conventional `xmtp.Client` (like `xmtp-js`) - [ ] Reproduce utility classes/methods - [ ] Conversations - [ ] Content types - [ ] canMessage - [ ] ... - [ ] Publish to https://pub.dev/packages/xmtp - [ ] [**MILESTONE 2**] Create sample app: xmtp/example-chat-flutter - [ ] Set up work repo: https://github.com/xmtp/example-chat-flutter - [ ] Use xmtp-flutter to demonstrate SDK (like `example-chat-react`) - [ ] Initialize client - [ ] List messages - [ ] Send messages - [ ] Stream messages --- ## React Native ### Requirements Make it so that devs can simply use the xmtp-js SDK in React Native without experimental polyfills. Support the following React Native JS environments: - Hermes v0.70 for both iOS and Android - JavaScriptCore for iOS starting with iOS 14 - V8 for Android _Devs can hack in React Native now by using the experimental [webcrypto](https://github.com/PeculiarVentures/webcrypto) polyfill per our [React Native example app](https://github.com/xmtp/example-chat-react-native)._ ### Deadline Dec. 13, 2022 ### Task overview - [ ] Remove the `SubtleCrypto` dependency from `xmtp-js` _OR_ add a Node crypto workaround as proposed in [#157](https://github.com/xmtp/xmtp-js/pull/157) - [ ] Extend the example app to authenticate an account and send a message from that account ### Resources - [XMTP protocol spec](https://github.com/xmtp/proto/pull/14/files) - [JS client interface](https://xmtp.org/docs/client-sdk/javascript/reference/classes/Client) --- ## Open questions ### Authentication and key-management - How are we initializing a client with keys? - Can Orb tell us more about their situation to help answer this? - How would using the secure enclave change the client.create flow? - Do we tell the dev to reach into the enclave or do we do it for them? - If you want to store your own keys, here's the hook - If you want us to do it for you, here's the solution - Do we need to rethink where we keep the keys when we're working with them? - Check with Jazz and Signal approach - Conversation-specific keys and push notifications: how do you go and efficiently find the key to decrypt the push notification message? Need some persistent state so that devs don't have to query hundreds of keys. ### Crypto - Should we use dart's [AES-GCM implementation](https://pub.dev/documentation/cryptography/latest/cryptography/AesGcm-class.html) or something else? - Is it good enough? Is it audited? - Good enough to start. - What will we use for secp256k1 in dart? ### GRPC - Should we use grpc directly instead of going through grpc-gateway like `xmtp-js`? - Yes, but we need to expose the grpc ports in the network. - Need to support native metadata on key authorization. --- ## Meeting notes Add new meeting notes by copying and pasting [this template](#DATE-Meeting-Notes). --- ### 11/28/22 Meeting Notes #### Attendees: - Pat, Nick, Darick, Anoop, Dan, Elise #### Notes: - Dart update: - PR up for adding contact bundles - In progress: Got end-to-end fetching, decrypting & reading for v1 messages. - Structure is cominng in place as we go - Swift update: - PR up for fetching and adding contact bundles - Adding Client now - Close to first end-to-end message & working thru last encryption pieces - React Native update: - We upgraded the example repo to use xmtp-js v7.0 and fully removed our localstorage dependency which unblocks WalletConnect - Showtime also ran into the same localStorage issue & one other crypto library issue. My highest priority is unblocking them - Still have to investigate streaming bug report - Push server update: - SO CLOSE to first working push off of RN! - Sending a "You have mail" push is one bug away - Next up is decrypting keys and showing real messages #### Agenda: - Subscribing & Streaming - Context: https://github.com/xmtp/proto/pull/30 - TL;DR: streamAllMessages is a useful API in web. TBD in mobile, but we should check out the convo in Martin's PR. #### Action items: - Align on expected expectations around streaming by reading thru [Martin's PR](https://github.com/xmtp/proto/pull/30). - Look into [publisher verification](https://dart.dev/tools/pub/publishing#verified-publisher) for XMTP (@elise) ### 11/14/22 Meeting Notes #### Attendees: - Pat, Dan, Elise, Nick, Anoop, Darick, J-Ha, Saul #### Agenda: - React Native auth - Dart update - Swift update - Typedocs #### Notes: - React Native auth - Assuming that wagmi works with WalletConnect and Coinbase Wallet in React Native. Elise to validate this week. - Dart update - Unlisted xmtp_proto package is ready to go. Someone needs to set up XMTP as a publisher. Will need to verify ownership of domain, then we can transfer ownership of the package. - Starting from the opposite end - assume you have a private key. - Auth metadata is required in prod and dev - Swift update - Swift proto package is up and working. Anyone can point at the URL to get access to those types. - Working to get basic hello world with a user contact running by pulling stuff over from JS SDK into an iOS app - Wallet connection flow is working - Do we want Swift stuff on the proto precommit hook? - Dan closed the PR to remove the precommit hook. - We should add Swift stuff at the very least. - Need to figure out a bigger plan for how we version these SDKs at the same time. - Should consolidate into a single Docker image. - Typedocs - Look into Swift DocC - generate docs off of comments - Probably something similar for Dart but need to confirm - Yash starting as DX PM on 12/5 #### Action items: - [ ] Look into [publisher verification](https://dart.dev/tools/pub/publishing#verified-publisher) for XMTP (@elise) --- ### 11/9/22 Meeting Notes #### Attendees: - Dan, Elise, Nick, Anoop, Darick, Saul #### Agenda: - Intro - Project scope - Open questions #### Notes: - AES-256-GCM: Using the built-in dart implenmentation is a good place to start - Also need secp256k1 curve implementation - How do we want to implement key management in a less ephemeral context than the browser? - Philosophy: - give them the right primitives to come to good solutions - keep the structure similar to xmtp-js (Conversations, etc) - Modifying client for key management: should do this the same for RN, etc - Treat the app as a spec for devs - Build SDK then app or build app then SDK - no preference - Visuals - First milestone: no visuals, just minimal viable to exercise SDK - similar to quickstart-react - Stretch milestone: resemble example-chat-react - Workflow - Tag xmtp-mobile team for reviews, tag martin for cryptography-related stuff - Questions for Orb - What wallets do you want to support? - What library are you already using to sign in the Flutter world? - They're definitely already doing this because Lens requires SIWE - What methods would you use to integrate/interact with those wallets? - get address - sign - Could make sense to go to them with a candidate interface - API headers - can use the auth section of xmtp-js to rebuild this - Need to support both v1 and v2 style messages - Conventionally we'd call this xmtp-flutter if it depends on flutter (which we might need to for secure enclave stuff) #### Action items: - [x] Reach out to Orb on expectations around authentication (@saulmc) - [ ] Consult with Jazz on working key management after something to react to (tbd) - [ ] Expose grpc ports in the network (@nick) - [ ] Support native metadata on key authorization (@nick) - [x] Create GitHub team for review tagging (@elise) - [x] Create private repo for the xmtp-flutter SDK and give Dan access (@elise) --- ### DATE Meeting Notes #### Attendees: - ... #### Agenda: - ... #### Notes: - ... #### Action items: - [ ]