OpenMTP | Android File Transfer for macOS
- Author: Ganesh Rathinavel
- License: MIT
- System Requirements: macOS 11.0 (Big Sur) or higher
- Website URL: https://openmtp.ganeshrvel.com
- Repo URL: https://github.com/ganeshrvel/openmtp
- Contacts: [email protected]
Introduction
Advanced Android File Transfer Application for macOS.
Transferring files between macOS and Android or any other MTP devices has always been a nightmare. There are a few File Transfer MTP apps which are available online but most of them are either too expensive or come with bad UI/UX. The official "Android File Transfer" app for macOS from Google comes with bugs, innumerable limitations, some of which include - not being able to transfer files larger than 4GB, frequent disconnections, unable to rename the folders or files on the android/MTP devices. Most of the other apps available online uses either WiFi or ADB protocol to transfer the files, which is an extremely time-consuming process.
Countless searches to find an app to solve these problems and failing to find one made me restless. So, I took the leap and decided to create an app for us that could help us have a smooth and hassle-free file transfer process from macOS to Android/MTP devices. Created with the objective of giving back to the community, we can all use this app for free in this lifetime.
Features
- Safe, Transparent and Open-Source
- Plug and Play via USB. No hassles, easy and instant connection.
- Select between Internal Memory and SD Card
- Transfer multiple files which are larger than 4GB
- Dark mode
- Drag-and-drop support
- Split pane views for both Local Computer and Android device
- Choose between Grid and List view.
- Use Keyboard Shortcuts to navigate through your files.
- No collection of personally identifiable information.
Kalam Kernel
OpenMTP 3.0 features a new MTP kernel and it was written from the scratch. It promises a file copy speed of 30 to 40 MB/s on low and mid range devices and 100 to 120 MB/s on higher end devices. The all new and powerful MTP kernel is named after Dr. A. P. J. Abdul Kalam
Do checkout the Go package which I've written to build Kalam Kernel: github.com/ganeshrvel/go-mtpx. Feel free to raise PRs.
System Requirements and Support
- To support macOS version below Big Sur the Kalam kernel needs to be compiled on an older macOS machine everytime there is an update, which is practically very difficult
- Only the latest 3 versions of macOS will receive the
Kalam
Kernel updates, which includes new device supports, fixes, stability improvements. macOS Big Sur (11.0) or above will receive the above said updates - We have now officially retired the support for
Kalam
Kernel on macOS 10.13 (OS X El High Sierra) and lower. Only the "Legacy" MTP mode will continue working on these outdated machines. - We will continue releasing the updates for both
Intel
andARM64
machines
Installation
- Download the Mac Apple Silicon version
- Download the Mac Intel Silicon version
- Using Homebrew Cask
# newer versions:
brew install openmtp --cask
# older versions:
brew cask install openmtp
- Find the latest dmg file from GitHub Releases
Screengrabs
Keyboard Shortcuts
Command | Keyboard Shortcut |
---|---|
Delete | backspace |
New Folder | command (⌘)+n |
Copy | command (⌘)+c |
Copy to Queue | command (⌘)+shift+c |
Paste | command (⌘)+v |
Refresh | command (⌘) +r |
Folder Up | command (⌘)+b |
Select All | command (⌘)+a |
Rename | command (⌘)+d |
Switch Tab | command(⌘)+1 |
Open | enter |
Navigate Left | left |
Navigate Right | right |
Navigate Up | up |
Navigate Down | down |
Select Multiple Items Forward (in Grid View) | shift+left |
Select Multiple Items Backward (in Grid View) | shift+right |
Select Multiple Items Forward (in List View) | shift+up |
Select Multiple Items Backward (in List View) | shift+down |
Select Multiple Items (with mouse) | command (⌘)+click or shift+click |
Building from Source
Requirements: Node.js v10, Git and Yarn package manager
Clone
$ git clone https://github.com/ganeshrvel/openmtp.git
$ cd openmtp
# install yarn
npm install -g yarn
# install sentry cli
npm -g i @sentry/cli
$ yarn
Run
A fresh clone might throw undefined state error. Run the following commands once to fix the issue.
# For Mac and Linux
$ UPGRADE_EXTENSIONS=1 npm run dev
# For Windows
$ set UPGRADE_EXTENSIONS=1 && npm run dev
# Development
$ yarn dev
# Pre-production
$ yarn start
Debugging a Packaged app
# On terminal run
$ "/path/to/OpenMTP.app/Contents/MacOS/OpenMTP" --remote-debugging-port=6363
- Open a Chromium browser
- Input "about://inpsect" into the URL bar
- Add a new connection
localhost:6363
- Inpect OpenMTP @ port
6363
Publishing using CI/CD:
- CodeMagic.io
- Create a new App (Choose others -> Enter Electron)
- Environment variables:
APPLEID
:<Apple developer account username>
APPLE_APP_SPECIFIC_PASSWORD
:<App-Specific Password>
- Log into your Apple Account
- Goto Sign-In and Security > App-Specific Passwords
- Click on Generate Password..., enter a password label and click Create
- Copy the displayed app-specific-password
SENTRY_URL
:https://sentry.io/
SENTRY_ORG
:<Sentry Organization Name>
SENTRY_PROJECT
:<Sentry Project>
SENTRY_TOKEN_ID
:<Sentry Auth Token>
- Find it from here: Auth Tokens
- Scopes:
event:admin, event:read, member:read, org:read, project:read, project:releases, team:read
GITHUB_TOKEN
:Personal access token
- Find it from here: Personal access tokens
- Scopes:
admin:gpg_key, admin:public_key, repo, user, workflow
CSC_LINK
:- Keychain ->
Default Keychains
menu in the left -> Login -> My Certificates - Search for
Developer ID Application
in the top search bar- If there are no results for the
Developer ID Application
, for the organization, create one from here: Apple Developer Certificates - Follow these steps to get the Apple Developer certificated installed in the local machine Obtaining-an-Apple-Developer-ID-Certificate-for-macOS-Provisioning
- If there are no results for the
- Search for
Developer ID Application
in the top search bar - Expand
Developer ID Application: <User Name> (XXXYYYZZZ)
- See if the private key's name matches this:
Mac Developer ID Application: <User Name>
- Else rename the private key as (right click -> get info)
Mac Developer ID Application: <User Name>
- Close the window
- Else rename the private key as (right click -> get info)
- Right Click on the private key ->
Mac Developer ID Application: <User Name>
- Export
Mac Developer ID Application: <User Name>
- File name:
CERTIFICATE_PRIVATE_KEY.p12
- Enter Password. This is the
CSC_KEY_PASSWORD
, note this down - Run (this step doesnt work if you are using fig or ohmyzsh, use raw terminal):
base64 -i CERTIFICATE_PRIVATE_KEY.p12 -o CERTIFICATE_PRIVATE_KEY.txt
- Copy the whole content of the file
CERTIFICATE_PRIVATE_KEY.txt
- Paste the content as the value for the field
CSC_LINK
- Keychain ->
CSC_KEY_PASSWORD
is the password from the above stepCODEMAGIC_AUTH_TOKEN_ID
:<CodeMagic API Token>
- Find it from here: Sidebar -> Teams -> Personal Account -> Integrations -> Codemagic API
CODEMAGIC_INTEL_X64_WORKFLOW_ID_PROD
:<Prod codeMagic workflow id>
- Find the relevant workflow id from
codemagic.yaml
, (mostlymacos-intel-x64-build-prod
)
- Find the relevant workflow id from
CODEMAGIC_INTEL_X64_WORKFLOW_ID_DEV
:<Dev codeMagic workflow id>
- Find the relevant workflow id from
codemagic.yaml
, (mostlymacos-intel-x64-build-dev
)
- Find the relevant workflow id from
PUBLISH_PROD_REPOSITORY
:<Repository to publish the production app>
PUBLISH_DEV_REPOSITORY
:<Repository to publish the dev app>
CODEMAGIC_PUBLISH_PROJECT_ID
:<Codemagic intel project id>
PUBLISH_EMAIL
:Email address to receive the updates on publish
- References:
Packaging (locally) and Publishing
Setup the code signing to build, package (locally) and publish the app.
App Notarization for macOS (skip this section for non macOS builds)
- Rename sample.env file as .env
- To update
APPLEID
andAPPLE_APP_SPECIFIC_PASSWORD
in .env file - Log into your Apple Account
- Goto Sign-In and Security > App-Specific Passwords
- Click on Generate Password..., enter a password label and click Create
- Copy the displayed app-specific-password
- Run
security add-generic-password -a "<apple-developer-account-username>" -w <app-specific-password> -s "APPLE_APP_SPECIFIC_PASSWORD"
- Log into your Apple App Store Connect Account and accept the presented terms and conditions
- The statuses shall turn Active
Sentry
- Auth Tokens Settings page: https://sentry.io/settings/account/api/auth-tokens/
npm install -g @sentry/wizard
sentry-wizard --integration electron
# Upload Debug Information
# Everytime the electron.js version is upgraded run:
node sentry-symbols.js
sentry-cli login
Packaging Instructions: https://www.electron.build/code-signing
$ export GH_TOKEN="<github token>"
# For local platform
$ yarn package
# For multiple platforms
$ yarn package-all
Technical Features
- Built using Electron v17 and React v18
- Loadables, Dynamic Reducer Injection, Selectors for code splitting and performance optimization
- Hot module reload (HMR) for instant feedback
- Inbuilt error logging and profile/settings management
- Industry standard state management
- JSS, SASS/SCSS styling
- Port assigned: 4642
Configurations
- config/env/env.dev.js and config/env/env.prod.js contain the PORT number of the app.
- config/dev-app-update.yml file holds the GitHub repo variables required by electron-updater.
- config/google-analytics-key.js file contains the Google Analytics Tracking ID.
- package.json build.publish object holds the values for publishing the packaged application.
- app/constants folder contains all the constants required by the app.
Debugging
Debugging Guide
electron-react-boilerplate/electron-react-boilerplate#400
Dispatching redux actions from the main process
electron-react-boilerplate/electron-react-boilerplate#118
electron-react-boilerplate/electron-react-boilerplate#108
VM112:2 Uncaught TypeError: Cannot read property 'state' of undefined error
# For Mac and Linux
$ UPGRADE_EXTENSIONS=1 npm run dev
# For Windows
$ set UPGRADE_EXTENSIONS=1 && npm run dev
Troubleshooting
Your device is not recognized
Speech framework is not compatible with macOS < 10.15
node-mac-permissions throws - On macOS <= 10.14.x (mojave) the
yarn install
will throw a npm-rebuild error - To "test" or "debug" the app on macOS mojave:
- remove the
node-mac-permissions
dependency frompackage.json
- Add the ignorePlugin line to
default.plugins
in the filewebpack/config.base.js
new webpack.IgnorePlugin({ resourceRegExp: /^(node-mac-permissions)$/u }),
- WARNING: DO NOT commit these changes to the upstream!!
- remove the
- The
NODE_MAC_PERMISSIONS_MIN_OS
constant defines the minimum os version that is required to show the macos usage access permission popup - For distribution make sure to build the app on a machine which is at least 10.15 (Catalina)
- Raise an issue if your device is undetected: https://github.com/ganeshrvel/openmtp/issues/new?template=contribute.md
The app goes blank while trying to connect a Samsung device
- Uninstall Samsung SmartSwitch, if installed: https://farazfazli.medium.com/how-i-reverse-engineered-keis-and-sidesync-and-fixed-mtp-8949acbb1c29, #212.
Notarizing Electron apps throws - “You must first sign the relevant contracts online. (1048)” error
More repos
- npm: electron-root-path
- Electron React Redux Advanced Boilerplate
- Tutorial Series by Ganesh Rathinavel
Credits
-
A special thanks to CodeMagic and Kevin Suhajda for sponsoring their CI/CD VMs, thus making the app releases more streamlined and much easier now. 🎊🎊 Do checkout their products section for more.
-
Special shoutout to @CodyJung for adding the Fujifilm and Garmin devices support. 🔥🔥
-
Thanks to Ms Ayushi Bothra for contributing to the documentation and pages.
-
App logo was contributed by Shubhendu Mitra. Make sure to check out more of his works on Behance.
-
Thanks to Vladimir Menshakov for android-file-transfer-linux (the MTP legacy Kernel)
-
Shoutout to @yennsarah, @h0tk3y, @riginoommen, @AjithKumarvm, @kiranshaji555, Dick Cowan, Kjell Dankert, Thorolf E.R. Weißhuhn and to all other community members who helped me test the application.
-
This app was built upon https://github.com/ganeshrvel/electron-react-redux-advanced-boilerplate which is a heavily modified fork of https://github.com/electron-react-boilerplate/electron-react-boilerplate.
-
The icons used in the app were made by flaticon, good-ware and kiranshastry which is licensed under CC 3.0 BY.
-
The "no image found" icon was made by Phonlaphat Thongsriphong.
Contribute
If you are interested in fixing issues and contributing directly to the code base, please see the guidelines.
Support OpenMTP
Help me keep the app FREE and open for all.
- Donate Via PayPal: paypal.me/ganeshrvel
- Buy Me A Coffee (UPI, PayPal, Credit/Debit Cards, Internet Banking): buymeacoffee.com/ganeshrvel
Contacts
Please feel free to contact me at [email protected]
License
OpenMTP | Android File Transfer for macOS is released under MIT License.
Copyright © 2018-Present Ganesh Rathinavel