{"id":25629405,"url":"https://github.com/pebble-dev/mobile-app","last_synced_at":"2026-02-19T15:07:25.323Z","repository":{"id":38081572,"uuid":"295813856","full_name":"pebble-dev/mobile-app","owner":"pebble-dev","description":"Cobble: Rebble device companion app for iOS and Android","archived":false,"fork":false,"pushed_at":"2025-03-23T16:07:38.000Z","size":3979,"stargazers_count":562,"open_issues_count":79,"forks_count":45,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-03-23T17:20:55.487Z","etag":null,"topics":["android","cobble","hacktoberfest","ios","pebble"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pebble-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2020-09-15T18:20:26.000Z","updated_at":"2025-03-23T16:07:42.000Z","dependencies_parsed_at":"2024-06-19T06:01:02.434Z","dependency_job_id":"6e7d315b-8898-491e-9df5-e64101562b72","html_url":"https://github.com/pebble-dev/mobile-app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pebble-dev/mobile-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pebble-dev%2Fmobile-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pebble-dev%2Fmobile-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pebble-dev%2Fmobile-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pebble-dev%2Fmobile-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pebble-dev","download_url":"https://codeload.github.com/pebble-dev/mobile-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pebble-dev%2Fmobile-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29619287,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"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":["android","cobble","hacktoberfest","ios","pebble"],"created_at":"2025-02-22T19:17:19.325Z","updated_at":"2026-02-19T15:07:25.317Z","avatar_url":"https://github.com/pebble-dev.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"# Rebble app\n\nA multi platform watch companion app for Pebble/RebbleOS devices\n\n# Development\n\n## Building the app\n1. Checkout this repo\n2. Pull the submodules\n```bash\ngit submodule update --init --recursive\n```\n3. [Generate new Github token with `read:packages` permission](https://github.com/settings/tokens). This is required to fetch libpebblecommons from Github packages repository.\n4. Create `local.properties` file in `android` folder. Write following to the file:\n\n    ```\n    GITHUB_ACTOR=\u003cYOUR GITHUB USERNAME\u003e\n    GITHUB_TOKEN=\u003cGENERATED TOKEN\u003e\n    ```\n5. Install flutter on your machine. To make builds reproducible, we use exact flutter version in pubspec.yml. Thus we recommend you use [FVM](https://fvm.app/documentation/getting-started/installation) to install flutter. After you install FVM, just run `fvm install` command in the\n project folder and you will automatically get the required flutter version. \n6. [Setup flutter in the IDE of your choice](https://flutter.dev/docs/get-started/editor). Be sure to also configure it with [FVM Flutter path](https://fvm.app/docs/getting_started/configuration#ide).\n7. Open this repo in the IDE set up in step 5\n\nIf you do not have an IDE, from step 5, you'll instead:\n\n1. `fvm flutter pub get`\n2. Launch an emulator: `fvm flutter emulators --launch Pixel_2_API_30`\n3. `fvm flutter run`\n\n### Host-specific instructions: Ubuntu and similar\n\nTo install FVM on Ubuntu, try something like:\n\n1. `sudo snap install flutter --classic`\n2. `flutter`\n3. `flutter config --no-analytics # if you want`\n4. `dart --disable-analytics # if you want`\n5. `dart pub global activate fvm`\n6. `export PATH=\"$PATH\":\"$HOME/.pub-cache/bin\"`\n\nIf you don't have Android Studio installed, and you want an emulator, do:\n\n1. `sudo snap install android-studio --classic` (hey, what's 900MB between friends?)\n2. Launch `android-studio`.  Update everything in sight (hey, what's 400MB between friends?)\n3. `sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils` (hey, what's 140MB between friends?)\n4. Hit 'More actions...', then 'AVD Manager'.  Then 'Create Virtual Device'. \nThen choose a device (I chose Pixel 2), then download R (hey, what's 620MB\nbetween friends?), then hit finish.\n\n## Building the app for iOS\niOS requires CocoaPods to be installed. To install CocoaPods, run the following commands:\n\n```\nbrew install ruby\nsudo gem install cocoapods\n```\n\nAfter installing CocoaPods, you should build the app using `fvm flutter build ios`, which will also run `pod install` for you ready for building the app in Xcode.\n\n## Building mappings\n\nTo build all the mappings in this project (such as entity \u003c\u003e map mapping for SQL), you have to\nrun the following command:\n\n`fvm flutter pub run build_runner build --delete-conflicting-outputs`\n\n## Building pigeons\n\nType safe communication between Flutter and native code is performed \nusing [Pigeon](https://pub.dev/packages/pigeon). To add new communication interfaces, edit\n[pigeons/pigeons.dart](pigeons/pigeons.dart) file and then re-compile interface\nwith the following command:\n\n```\nfvm flutter pub run pigeon \\\n  --input pigeons/pigeons.dart \\\n  --dart_out lib/infrastructure/pigeons/pigeons.g.dart \\\n  --java_out ./android/app/src/main/kotlin/io/rebble/cobble/pigeons/Pigeons.java \\\n  --java_package \"io.rebble.cobble.pigeons\" \\\n  --objc_header_out ./ios/Runner/Pigeon/Pigeons.h \\\n  --objc_source_out ./ios/Runner/Pigeon/Pigeons.m\n```\n\n# Architecture\n\nSee [Wiki](https://github.com/pebble-dev/mobile-app/wiki) for more info on app architecture.\n\n## Using Cobble theming\n\nApp's components are styled through modified Material theme, in theory you should never specify\ncustom styles in your own component. If you have to, try to use colors that are defined in \n`ThemeData` (accessed by `WithCobbleTheme(context).theme`) or alternatively in \n`CobbleSchemeData` (`WithCobbleTheme(context).scheme`). Scheme is collection of colors, \ncreated by designer while the theme is higher-level grouping of these colours to provide meaningful \nbase styles for components. If you start using Material component which isn't styled properly, \ntake a look at Material theme and see if you can set styles there before setting styles directly on\ncomponent. There is limited set of text types, as defined by designer, if you need different text \nstyle, extends these types with `.copyWith` instead of creating your own.\n\n## Using Navigator\n\nWe are using iOS-style tabbed navigation, where each tab has its own stack of screens. In practice\nthis means there might be multiple stacks (1 main stack and one each for tab) but only 1 stack is\nactive. In order to push page on an active stack import `CobbleNavigator` extension and then call\n`context.push(SomeScreen())`. `SomeScreen` widget should also implement interface `CobbleScreen` and\nuse `CobbleScaffold.page` or `CobbleScaffold.tab`, which takes care of title and back button in \nnavigation bar.\n\n## Custom Cobble components\n\nA lot of components were refactored in custom Widgets, like CobbleCard, CobbleTile, CobbleButton, etc.\nand these components should serve you as building blocks upon which to build your UI. They are \nshowcased in WidgetLibrary screen and in golden (aka snapshot) tests. All golden images (how widgets \nshould look) are included in /test/components/goldens.\n\n## Using localization\n\nTo use localized string, add it to all `.json` files in `/lang`, start build_runner to generate \nlocalized models (see [Building mappings](#building-mappings) above) and then use it as \n`tr.canBeNested.yourKey`. Generator also supports named  and positional parameters:  \n`\"key\": \"fixed value, named parameter -\u003e {named}, positional parameter -\u003e {}` and generates \nfunction instead of string. Use this function similar to string:  \n`tr.canBeNested.yourKey('positional', named: 'named param')`.\n\nApp's localization is stored in /lang directory, one `.json` file for one language. Structure of \nthese `.json` files is then converted to localized model with a help of `ModelGenerator`. Model\nis in turn used to load and parse correct `.json` file at app's startup. Refer to \n[build.yaml](build.yaml) and [CobbleLocalizationDelegate](lib/localization/localization_delegate.dart)\nfor more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpebble-dev%2Fmobile-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpebble-dev%2Fmobile-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpebble-dev%2Fmobile-app/lists"}