{"id":64164,"name":"Tree Tracker","description":"Used by people who plant trees so they don't have to manually type coordinates with pictures they took.","url":"https://github.com/protect-earth/tree-tracker-ios","last_synced_at":"2026-05-24T16:01:15.242Z","repository":{"id":37091797,"uuid":"324363060","full_name":"protect-earth/tree-tracker-ios","owner":"protect-earth","description":"App for managing trees.","archived":false,"fork":false,"pushed_at":"2025-07-08T18:13:09.000Z","size":863,"stargazers_count":13,"open_issues_count":7,"forks_count":7,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-29T03:46:27.116Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","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/protect-earth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2020-12-25T12:59:53.000Z","updated_at":"2025-07-06T20:09:59.000Z","dependencies_parsed_at":"2023-09-21T19:31:02.173Z","dependency_job_id":"3dc132e7-a97e-44ce-9b8b-f577ee9eea25","html_url":"https://github.com/protect-earth/tree-tracker-ios","commit_stats":{"total_commits":244,"total_committers":5,"mean_commits":48.8,"dds":0.5040983606557377,"last_synced_commit":"d842dae1750a1ff5ac7451bd2c42958eb17f08f1"},"previous_names":["protect-earth/tree-tracker-ios","protect-earth/treetracker"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/protect-earth/tree-tracker-ios","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/protect-earth","download_url":"https://codeload.github.com/protect-earth/tree-tracker-ios/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32454170,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"}},"owner":{"login":"protect-earth","name":"Protect Earth","uuid":"62665039","kind":"organization","description":"We plant trees and use apps and APIs to track where they're, how they're doing, and integrate with funding partners.","email":"help@protect.earth","website":"https://protect.earth","location":"Corsham, UK","twitter":"ProtectEarthUK","company":null,"icon_url":"https://avatars.githubusercontent.com/u/62665039?v=4","repositories_count":2,"last_synced_at":"2023-03-04T04:54:10.600Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/protect-earth","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-14T09:56:07.874Z","updated_at":"2023-03-04T04:54:10.604Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/protect-earth","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/protect-earth/repositories"},"packages":[],"commits":{"id":1256841,"full_name":"protect-earth/tree-tracker-ios","default_branch":"main","total_commits":246,"total_committers":5,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":49.2,"dds":0.5,"past_year_total_commits":2,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":2.0,"past_year_dds":0.0,"last_synced_at":"2026-05-20T14:04:30.323Z","last_synced_commit":"13a62208c6683d044de51f9807c5329ea45d8f01","created_at":"2023-06-02T15:00:11.259Z","updated_at":"2026-05-20T14:04:27.324Z","committers":[{"name":"Allan Lang","email":"lang.allan@gmail.com","login":"allanlang","count":123},{"name":"Łukasz Mróz","email":"thesunshinejr@gmail.com","login":"sunshinejr","count":112},{"name":"Phil Sturgeon","email":"67381+philsturgeon","login":"philsturgeon","count":7},{"name":"ay8s","email":"contact@andydev.co.uk","login":"ay8s","count":2},{"name":"Allan Lang","email":"allan@MacBookPro-13.local","login":null,"count":2}],"past_year_committers":[{"name":"Allan Lang","email":"lang.allan@gmail.com","login":"allanlang","count":2}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-24T00:00:21.472Z","repositories_count":6240335,"commits_count":883934575,"contributors_count":34906878,"owners_count":1156937,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"protect-earth/tree-tracker-ios","html_url":"https://github.com/protect-earth/tree-tracker-ios","last_synced_at":"2025-09-01T08:04:16.959Z","status":"error","issues_count":9,"pull_requests_count":11,"avg_time_to_close_issue":20672163.714285713,"avg_time_to_close_pull_request":36702.0,"issues_closed_count":7,"pull_requests_closed_count":11,"pull_request_authors_count":1,"issue_authors_count":2,"avg_comments_per_issue":0.6666666666666666,"avg_comments_per_pull_request":0.0,"merged_pull_requests_count":10,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":3,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":24083.0,"past_year_avg_time_to_close_pull_request":51267.5,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":4,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":1.0,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"created_at":"2023-06-02T15:00:24.205Z","updated_at":"2025-09-02T09:49:01.938Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/protect-earth%2Ftree-tracker-ios/issues","issue_labels_count":{"p:medium":1},"pull_request_labels_count":{},"issue_author_associations_count":{"COLLABORATOR":9},"pull_request_author_associations_count":{"COLLABORATOR":12},"issue_authors":{"allanlang":7,"philsturgeon":2},"pull_request_authors":{"allanlang":12},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-24T00:00:44.577Z","repositories_count":14690707,"issues_count":34033269,"pull_requests_count":111475036,"authors_count":11272865,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"COLLABORATOR":3},"past_year_pull_request_author_associations_count":{"COLLABORATOR":6},"past_year_issue_authors":{"allanlang":2,"philsturgeon":1},"past_year_pull_request_authors":{"allanlang":6},"maintainers":[{"login":"allanlang","count":19,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/allanlang"},{"login":"philsturgeon","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/philsturgeon"}],"active_maintainers":[{"login":"allanlang","count":8,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/allanlang"},{"login":"philsturgeon","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/philsturgeon"}]},"events":{"total":{"DeleteEvent":1,"PullRequestEvent":4,"ForkEvent":1,"IssuesEvent":5,"IssueCommentEvent":7,"PushEvent":8,"CreateEvent":2},"last_year":{"DeleteEvent":1,"PullRequestEvent":4,"IssuesEvent":5,"IssueCommentEvent":7,"PushEvent":8,"CreateEvent":2}},"keywords":[],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/build-release.yaml","sha":null,"kind":"manifest","created_at":"2023-02-01T00:00:35.003Z","updated_at":"2023-02-01T00:00:35.003Z","repository_link":"https://github.com/protect-earth/tree-tracker-ios/blob/main/.github/workflows/build-release.yaml","dependencies":[{"id":7283866018,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"swiftpm","filepath":"Tree Tracker.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved","sha":null,"kind":"lockfile","created_at":"2023-02-01T00:00:35.738Z","updated_at":"2023-02-01T00:00:35.738Z","repository_link":"https://github.com/protect-earth/tree-tracker-ios/blob/main/Tree Tracker.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved","dependencies":[{"id":7283868035,"package_name":"github.com/Alamofire/Alamofire","ecosystem":"swiftpm","requirements":"5.5.0","direct":false,"kind":"runtime","optional":false},{"id":7283868036,"package_name":"github.com/mikaoj/BSImagePicker","ecosystem":"swiftpm","requirements":"3.3.1","direct":false,"kind":"runtime","optional":false},{"id":7283868037,"package_name":"github.com/CocoaLumberjack/CocoaLumberjack","ecosystem":"swiftpm","requirements":"3.7.4","direct":false,"kind":"runtime","optional":false},{"id":7283868039,"package_name":"github.com/groue/GRDB.swift","ecosystem":"swiftpm","requirements":"5.17.0","direct":false,"kind":"runtime","optional":false},{"id":7283868041,"package_name":"github.com/kstenerud/KSCrash","ecosystem":"swiftpm","requirements":"1.15.25","direct":false,"kind":"runtime","optional":false},{"id":7283868043,"package_name":"github.com/microsoft/plcrashreporter","ecosystem":"swiftpm","requirements":"1.10.1","direct":false,"kind":"runtime","optional":false},{"id":7283868091,"package_name":"github.com/hmlongco/Resolver","ecosystem":"swiftpm","requirements":"1.5.0","direct":false,"kind":"runtime","optional":false},{"id":7283868094,"package_name":"github.com/rollbar/rollbar-apple","ecosystem":"swiftpm","requirements":"2.3.3","direct":false,"kind":"runtime","optional":false},{"id":7283868096,"package_name":"github.com/apple/swift-log","ecosystem":"swiftpm","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false}]}],"score":4.605170185988091,"created_at":"2023-09-18T12:26:46.156Z","updated_at":"2026-05-24T16:01:15.243Z","avatar_url":"https://github.com/protect-earth.png","language":"Swift","category":"Biosphere","sub_category":"Deforestation and Reforestation","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"#  Tree Tracker\nApp for cataloguing trees planted and allowing the recorded trees to be uploaded via a custom API to a centralised database. Mainly used by people who plant trees so they don't have to manually type coordinates with pictures they took and then try to guess the site/species afterwards.\n\n## Running the app from Xcode with Mock server\n1. Make sure you have downloaded Xcode 13.4+\n2. Open the project in Xcode (you'll notice the dependencies will start to fetch in the background).\n(In the meantime, Xcode will need to fetch dependencies for the project... 😴)\n3. The signing settings for the project are configured for our CICD build pipeline, and will not allow you to build and run the app on your own device. To fix this, simply enable automatic signing in XCode and update the bundle identifier to something unique to you. This will update the .xcodeproj file accordingly. **NOTE** _Changes to signing settings must not be checked in, as these will break the automated builds._\n4. Running the `Tree Tracker` scheme will use the API settings you [configure in your secrets file](#config).\n5. When running on a device, you'll also need to trust the certificate in _Settings -\u003e General -\u003e Profiles_, otherwise you'll see an error after installing the build and before running it.\n\n## Rollbar\nWe use [Rollbar](https://www.rollbar.com) for centralised error tracking, to help us troubleshoot issues with the app during real world usage. \nIf you wish, you can sign up for a free Rollbar account, generate your own API token and provide it through `ROLLBAR_AUTH_TOKEN` to see telemetry in Rollbar during development. This can be useful if you are specifically adding telemetry features, but otherwise is probably more complex than just looking at the logs in XCode console. \n\nIf you choose not to setup Rollbar, simply add a dummy value for `ROLLBAR_AUTH_TOKEN` and any Rollbar calls will silently fail.\n\n## Additional project config {#config}\nNow, to run the project, we'll need to generate the Secrets file. This means you need to first install [`pouch`](https://github.com/sunshinejr/pouch) (the easiest is using `brew install sunshinejr/formulae/pouch`). Now, you need to have these environment variables available. It would be wise to prepare this file once and keep it somewhere obvious but take care not to check it in to Git. You can simply `source` the file whenever you need to regenerate Secrets.\n\n```\nexport AWS_BUCKET_NAME=\nexport AWS_BUCKET_REGION=\nexport AWS_BUCKET_PREFIX=\nexport AWS_ACCESS_KEY=\nexport AWS_SECRET_KEY=\nexport PROTECT_EARTH_API_TOKEN=\"n|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nexport PROTECT_EARTH_API_BASE_URL=\"api.endpoint.com\"\nexport PROTECT_EARTH_ENV_NAME=Development\nexport ROLLBAR_AUTH_TOKEN=yourRollbarToken\n```\n\nIn the root folder, run `pouch`, which should generate a file at `./TreeTracker/Secrets.swift`.\n\nWith all that, you can switch the scheme to `Tree Tracker` and it _should_ run just fine.\n\n## Contributing\nPlease feel free to create issues and PRs for anything, really. However, bear in mind that this app is created for specific audience so PRs with functionality that is out of scope might not be merged (if you feel like the PR you're working on is questionable, please feel free to reach out via Issues).\n\n## License\n[MIT](License.md)\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/64164","html_url":"https://ost.ecosyste.ms/projects/64164"}