{"id":37231275,"url":"https://github.com/gkoh/furble","last_synced_at":"2026-04-03T03:08:17.825Z","repository":{"id":37816623,"uuid":"295602252","full_name":"gkoh/furble","owner":"gkoh","description":"A bluetooth wireless remote shutter release for Fujifilm X/GFX, Canon EOS, Nikon and Sony cameras.","archived":false,"fork":false,"pushed_at":"2026-02-19T05:55:57.000Z","size":6110,"stargazers_count":151,"open_issues_count":15,"forks_count":25,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-02-19T11:46:36.462Z","etag":null,"topics":["ble","bluetooth","bluetooth-low-energy","camera","canon","esp32","fujifilm","m5stack","nikon","shutter-release","sony"],"latest_commit_sha":null,"homepage":"https://web-installer.furble.net","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gkoh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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},"funding":{"github":"gkoh"}},"created_at":"2020-09-15T03:17:20.000Z","updated_at":"2026-02-19T05:56:00.000Z","dependencies_parsed_at":"2026-01-06T22:01:36.743Z","dependency_job_id":null,"html_url":"https://github.com/gkoh/furble","commit_stats":null,"previous_names":[],"tags_count":113,"template":false,"template_full_name":null,"purl":"pkg:github/gkoh/furble","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkoh%2Ffurble","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkoh%2Ffurble/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkoh%2Ffurble/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkoh%2Ffurble/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gkoh","download_url":"https://codeload.github.com/gkoh/furble/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkoh%2Ffurble/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31330418,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T02:17:30.558Z","status":"ssl_error","status_checked_at":"2026-04-03T02:17:30.071Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ble","bluetooth","bluetooth-low-energy","camera","canon","esp32","fujifilm","m5stack","nikon","shutter-release","sony"],"created_at":"2026-01-15T03:42:41.004Z","updated_at":"2026-04-03T03:08:17.808Z","avatar_url":"https://github.com/gkoh.png","language":"C","funding_links":["https://github.com/sponsors/gkoh"],"categories":[],"sub_categories":[],"readme":"# furble - ***F***lexible ***U***nified ***R***emote ***B***luetooth ***L***ow ***E***nergy\n\n![PlatformIO CI](https://github.com/gkoh/furble/workflows/PlatformIO%20CI/badge.svg)\n\nA Bluetooth wireless remote shutter release originally targeted at Fujifilm mirrorless\ncameras. furble now supports:\n- Fujifilm\n- Canon\n- Nikon\n- Sony\n\nThe remote uses the camera's native Bluetooth Low Energy interface thus additional\nadapters are not required.\n\nfurble is developed on ESP32 devices as a PlatformIO project.\n\n## M5StickC Plus2 (Dark theme)\n\n![furble - Dark - M5StickC Plus2](https://github.com/user-attachments/assets/9888e348-1476-4d5e-bd47-3c03b87f062a)\n\n## M5Core2 (Default theme)\n\n![furble - Default - M5Core2](https://github.com/user-attachments/assets/0e60cff4-fc1b-4345-b0fc-5d85be0a705d)\n\n## Supported Cameras\n\nThe following devices have been tested and confirmed to work:\n- Fujifilm\n   - Fujifilm GFX100 II ([@matthudsonau](https://github.com/matthudsonau))\n   - Fujifilm GFX100RF ([@GFXUser101](https://github.com/GFXUser101))\n   - Fujifilm GFX100S ([@adrianuseless](https://github.com/adrianuseless))\n   - Fujifilm GFX100S II ([@GFXUser101](https://github.com/GFXUser101))\n   - Fujifilm GFX50S II ([@TomaszLojewski](https://github.com/TomaszLojewski))\n   - Fujifilm X-E4 ([@Rediwed](https://github.com/Rediwed))\n   - Fujifilm X-E5 ([@daniel-ch73](https://github.com/daniel-ch73))\n   - Fujifilm X-H1\n   - Fujifilm X-H2S ([@val123456](https://github.com/val123456))\n   - Fujifilm X-S10 ([@dimitrij2k](https://github.com/dimitrij2k))\n   - Fujifilm X-S20 ([@kelvincabaldo07](https://github.com/kelvincabaldo07))\n   - Fujifilm X-T200 ([@Cronkan](https://github.com/Cronkan))\n   - Fujifilm X-T3 ([@ubuntuproductions](https://github.com/ubuntuproductions))\n   - Fujifilm X-T30\n   - Fujifilm X-T4 ([@TomaszLojewski](https://github.com/TomaszLojewski))\n   - Fujifilm X-T5 ([@stulevine](https://github.com/stulevine))\n   - Fujifilm X100V\n- Canon\n   - Canon EOS M6 ([@tardisx](https://github.com/tardisx))\n   - Canon EOS R6 Mark II ([@hijae](https://github.com/hijae))\n   - Canon EOS RP ([@wolcano](https://github.com/wolcano))\n   - Canon PowerShot G9 X Mark II ([@Mich2e](https://github.com/Mich2e))\n- Nikon\n   - Nikon COOLPIX B600\n   - Nikon Z6 III ([@herrfrei](https://github.com/herrfrei))\n- Sony\n   - Sony ZV-1F\n\n## Table of Features\n\n| Camera             | Scanning | Pairing | Shutter Release | Focus   | GPS     |\n| :---:              | :---:    | :---:   | :---:           | :---:   | :---:   |\n| Fujifilm X \u0026 GFX   | ✔️        | ✔️       | ✔️               | ✔️[^1]   | ✔️       |\n| Canon EOS (Remote) | ✔️        | ✔️       | ✔️               | ✔️       | :x:[^2] |\n| Canon EOS (Smart)  | ✔️        | ✔️       | ✔️               | :x:[^2] | ✔️       |\n| Nikon (Remote)     | ✔️        | ✔️       | ✔️               | :x:[^2] | :x:[^2] |\n| Nikon (Smart)      | ✔️        | :x:     | :x:             | :x:     | :x:     |\n| Sony ZV            | ✔️        | ✔️       | ✔️               | ✔️       | ✔️       |\n\n[^1]: see [#99](https://github.com/gkoh/furble/discussions/99)\n[^2]: Non-existent\n\n## Supported Controllers\n\nInitially targeted at the M5StickC, the following controllers from [M5Stack](https://m5stack.com/) are supported:\n* M5StickC (EOL)\n* M5StickC Plus\n* M5StickC Plus2\n* M5Core Basic\n* M5Core2\n\n## Installation\n\n### Easy Install\n\nThe simplest way to get started is with the web installer.\nFollow the instructions on the wiki: [Easy Web Install](https://github.com/gkoh/furble/wiki/Easy-Web-Install)\n\n### PlatformIO\n\nPlatformIO does everything assuming things are installed and connected properly.\nIn most cases it should be:\n- clone the repository\n- plug in the M5StickC\n    - `platformio run -e m5stick-c -t upload`\n- OR plug in M5StickC Plus/Plus2\n    - `platformio run -e m5stick-c-plus -t upload`\n- OR plug in the M5Stack Core2\n    - `platformio run -e m5stack-core2 -t upload`\n\nMore details are on the wiki: [PlatformIO](https://github.com/gkoh/furble/wiki/Linux-Command-Line-(For-Developers))\n\n## Usage\n\nThe top level menu has the following entries:\n- `Connect`\n- `Scan`\n- `Delete`\n- `Settings`\n- `Off`\n\nOn first use, put the target camera into pairing mode, then hit `Scan`. If the\ncamera advertises a known, matching signature, it should appear in the list.\nYou can then connect to the target camera, which, if successful, will save the\nentry and show the remote menu.\n\n`furble` will identify as `furble-xxxx` where `xxxx` is a consistent identifier enabling one to differentiate mutiple controllers.\n\nUpon subsequent use it should be enough to hit `Connect`, selecting the\npreviously paired device and leading to the remote menu.\n\nFrom the remote menu you may choose to disconnect, control the shutter or activate the intervalometer.\n\nMore details are on the wiki: [Usage Guide](https://github.com/gkoh/furble/wiki/Usage-Guide)\n\n### GPS Location Tagging\n\nFor Fujifilm \u0026 Sony cameras, location tagging is supported with the M5Stack GPS unit:\n- [GPS/BDS Unit v1.1 (AT6668)](https://shop.m5stack.com/products/gps-bds-unit-v1-1-at6668)\n\nThe previous unit is now EOL:\n- [Mini GPS/BDS Unit](https://shop.m5stack.com/products/mini-gps-bds-unit)\n\nGPS support can be enabled in `furble` in `Settings-\u003eGPS`, the camera must also be configured to request location data.\n\nThe default baud rate for the GPS unit is 9600.\nThe new v1.1 unit runs at a higher baud rate and must be configured under\n`Settings-\u003eGPS-\u003eGPS baud 115200` for correct operation.\n\n### Intervalometer/Timer\n\nThe intervalometer can be configured via three settings in `Settings-\u003eIntervalometer`:\n- Count (number of images to take)\n- Delay (time between images)\n- Shutter (time to keep shutter open)\n\nCount can be configured up to 999 or infinite.\nDelay and shutter time can be figured with custom or preset values from 0 to 999 in milliseconds, seconds or minutes.\n\n### Shutter Lock\n\nWhen in `Shutter` remote control, holding focus (button B) then release (button A) will engage shutter lock, holding the shutter open until a button is pressed.\n\n### Themes\n\nA few basic themes are included, to change:\n* `Settings-\u003eThemes-\u003e\u003cdesired theme\u003e`\n   * hit 'Restart' to save and restart for the theme to take effect\n   * better dynamic theme change support is improving in upstream LVGL\n\n## Motivation\n\nI found current smartphone apps for basic wireless remote shutter control to be\ngenerally terrible.\nResearch revealed the main alternative was attaching a dongle to the camera, of\nwhich there were many options varying in price and quality.\nI really just wanted the [Canon\nBR-E1](https://www.eos-magazine.com/articles/remotes/br-e1-canon-bluetooth-remote.html),\nbut for my camera.\n\n### Possibly Supported Cameras\n\n#### Fujifilm\n\nGiven reports from the community and access to additional cameras, it\nseems many (all?) Fujifilm cameras use the same Bluetooth protocol.\nReports of further confirmed working Fujifilm cameras are welcome.\n\n#### Canon\n\nWith access to a Canon EOS M6, I was able to implement support for it. Other\nCanon cameras might work, but I suspect the shutter control protocol will be\ndifferent.\n@wolcano kindly implemented initial support for the Canon EOS RP.\n@hijae kindly helped with better Canon EOS R support.\n\n#### Nikon\n\nNikon cameras that support the remote wireless controller (ML-L7) should work,\nuse the \"Connection to remote\" menu option.\nThis has been tested on a Nikon COOLPIX B600. Unfortunately, the remote wireless\nmode has no support for GPS or focus functions, thus only shutter release works.\nNote that other Nikon cameras will appear in the scan, but will not pair\n(further support is under investigation).\n@herrfrei kindly assisted with Z6 III support.\n\n#### Sony\n\nSony cameras appear to use a reasonably uniform and robust bluetooth control\nprotocol. Most modern Sony cameras should be supported. Testing was performed\non Sony ZV-1F.\n\nTo pair with a Sony camera (some models may have different menu options, the\nfollowing matches the ZV-1F):\n- set 'Bluetooth Rmt Ctrl' to 'On'\n- set 'Bluetooth Function' 'On'\n- under Bluetooth, start 'Pairing'\n- start 'Scan' with `furble'\n   - due to an oddity with the Bluetooth library, if `furble` 'Scan' is started\n     first, the Sony camera may not appear\n\n#### Protocol Reverse Engineering\n\nAndroid supports snooping bluetooth traffic so it was trivial to grab a HCI log\nto see what the manufacturer supplied camera app was doing.\n\nFor all supported cameras, a snoop log of:\n- scanning\n- pairing\n- re-pairing\n- shutter release\n\nwas analysed with Wireshark.\n\nIt was then an experiment in reducing the interaction to the bare minimum just\nto trigger the shutter release.\n\n### Supporting More Cameras\n\nThe best way is to repeat the previous steps, analyse the bluetooth HCI snoop\nlog with Wireshark, implement, then test against the actual device.\n\n## Background Story\n\n### Requirements\n\n#### Hardware\n\nI wanted a complete solution out of the box to have:\n- bluetooth low energy\n- physical button\n- visual indicator (LED or display)\n- battery\n- case\n- low cost\n\nMy search concluded with the [M5StickC](https://m5stack.com/products/stick-c)\nfrom [M5Stack](https://m5stack.com).\nThe M5StickC and M5StickC Plus have since been EOL and replaced with the [M5StickC Plus2](https://shop.m5stack.com/products/m5stickc-plus2-esp32-mini-iot-development-kit).\n\nThe M5StickC is an ESP32 based mini-IoT development kit which covered all of the\nrequirements (and more). At time of writing, M5Stack sell the M5StickC for\nUS$9.95.\nThe M5StickC Plus(2) sells for US$19.95.\n\n#### Software\n\nThe project is built with [PlatformIO](https://platformio.org) and depends on\nthe following libraries:\n- [esp-nimble-cpp](https://github.com/h2zero/esp-nimble-cpp)\n- [LVGL](https://github.com/lvgl/lvgl)\n- [M5Unified](https://github.com/m5stack/M5Unified)\n- [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus)\n\n# Known Issues\n\n- depending on your perspective, battery life is anywhere from reasonable to bad\n   - with an active BLE connection and power management, the ESP32 consumes around 30mA\n      - an M5StickC Plus2 would last around 6 hours\n      - an M5StickC Plus would last around 4 hours\n      - an old M5StickC would last around 3 hours\n   - if battery life is crucial, and form factor is not, consider an M5Stack Core with the 1500mAh module\n      - this might last 50 hours\n\n# Things To Do\n\n- Support more camera makes and models\n   - Get access to and support the following:\n     - Nikon Z\n     - Others?\n\n# Links\n\nInspiration, references and related information for this project came from the following projects/posts:\n- Canon\n   - https://iandouglasscott.com/2017/09/04/reverse-engineering-the-canon-t7i-s-bluetooth-work-in-progress/\n   - https://github.com/ArthurFDLR/BR-M5\n   - https://github.com/RReverser/eos-remote-web\n- Fujifilm\n  - https://github.com/hkr/fuji-cam-wifi-tool\n  - https://github.com/petabyt/fudge\n- Sony\n   - https://gethypoxic.com/blogs/technical/sony-camera-ble-control-protocol-di-remote-control\n   - https://gregleeds.com/reverse-engineering-sony-camera-bluetooth\n   - https://github.com/Staacks/alpharemote\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgkoh%2Ffurble","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgkoh%2Ffurble","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgkoh%2Ffurble/lists"}