{"id":326568,"name":"GeoTessera","description":"A foundation model that can process time-series satellite imagery for applications such as land classification and canopy height prediction.","url":"https://github.com/ucam-eo/geotessera","last_synced_at":"2026-04-17T19:30:42.228Z","repository":{"id":302443248,"uuid":"1012433978","full_name":"ucam-eo/geotessera","owner":"ucam-eo","description":"Python library for the Tessera embeddings","archived":false,"fork":false,"pushed_at":"2026-04-05T11:10:41.000Z","size":70700,"stargazers_count":283,"open_issues_count":22,"forks_count":28,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-05T13:24:22.085Z","etag":null,"topics":["geospatial-data","python-package"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/ucam-eo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2025-07-02T10:24:37.000Z","updated_at":"2026-04-05T11:08:48.000Z","dependencies_parsed_at":"2025-07-24T03:17:46.079Z","dependency_job_id":"e4e8731f-b0e1-41c2-84de-4bb69171715e","html_url":"https://github.com/ucam-eo/geotessera","commit_stats":null,"previous_names":["ucam-eo/geotessera"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/ucam-eo/geotessera","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucam-eo","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31475202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T08:36:52.050Z","status":"ssl_error","status_checked_at":"2026-04-06T08:36:51.267Z","response_time":112,"last_error":"SSL_read: 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"}},"owner":{"login":"ucam-eo","name":"Cambridge Centre for Earth Observation","uuid":"217043827","kind":"organization","description":"Cambridge University and partner organisations are conducting research on the remote sensing of environmental change","email":null,"website":"https://eo.conservation.cam.ac.uk","location":"United Kingdom","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/217043827?v=4","repositories_count":1,"last_synced_at":"2025-06-27T11:47:06.801Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ucam-eo","funding_links":[],"total_stars":6,"followers":0,"following":0,"created_at":"2025-06-27T11:47:06.847Z","updated_at":"2025-06-27T11:47:06.847Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucam-eo","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucam-eo/repositories"},"packages":[{"id":11907323,"name":"geotessera","ecosystem":"pypi","description":"Python library interface to the Tessera geofoundation model embeddings","homepage":"https://github.com/ucam-eo/geotessera","licenses":"MIT License  Copyright 2025-2026 Anil Madhavapeddy \u003canil@recoil.org\u003e Copyright 2025-2026 Frank Feng  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ","normalized_licenses":["Other"],"repository_url":"https://github.com/ucam-eo/geotessera","keywords_array":[],"namespace":null,"versions_count":15,"first_release_published_at":"2025-07-13T14:21:05.000Z","latest_release_published_at":"2026-04-05T11:11:18.000Z","latest_release_number":"0.8.0","last_synced_at":"2026-04-05T13:01:43.365Z","created_at":"2025-07-13T14:45:26.553Z","updated_at":"2026-04-05T13:03:05.381Z","registry_url":"https://pypi.org/project/geotessera/","install_command":"pip install geotessera --index-url https://pypi.org/simple","documentation_url":"https://geotessera.readthedocs.io","metadata":{"funding":null,"documentation":"https://geotessera.readthedocs.io","classifiers":["Development Status :: 3 - Alpha","Environment :: Console","Intended Audience :: Developers","Intended Audience :: Science/Research","License :: OSI Approved :: MIT License","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 3","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Topic :: Scientific/Engineering :: GIS","Topic :: Software Development :: Libraries :: Python Modules"],"normalized_name":"geotessera","project_status":null},"repo_metadata":{"id":302443248,"uuid":"1012433978","full_name":"ucam-eo/geotessera","owner":"ucam-eo","description":"Python library for the Tessera embeddings","archived":false,"fork":false,"pushed_at":"2026-04-04T06:54:05.000Z","size":70693,"stargazers_count":283,"open_issues_count":26,"forks_count":28,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-04T08:28:25.454Z","etag":null,"topics":["geospatial-data","python-package"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/ucam-eo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2025-07-02T10:24:37.000Z","updated_at":"2026-04-04T06:54:10.000Z","dependencies_parsed_at":"2025-07-24T03:17:46.079Z","dependency_job_id":"e4e8731f-b0e1-41c2-84de-4bb69171715e","html_url":"https://github.com/ucam-eo/geotessera","commit_stats":null,"previous_names":["ucam-eo/geotessera"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/ucam-eo/geotessera","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucam-eo","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31436301,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T08:13:15.228Z","status":"ssl_error","status_checked_at":"2026-04-05T08:13:11.839Z","response_time":75,"last_error":"SSL_read: 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"},"owner_record":{"login":"ucam-eo","name":"Cambridge Centre for Earth Observation","uuid":"217043827","kind":"organization","description":"Cambridge University and partner organisations are conducting research on the remote sensing of environmental change","email":null,"website":"https://eo.conservation.cam.ac.uk","location":"United Kingdom","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/217043827?v=4","repositories_count":1,"last_synced_at":"2025-06-27T11:47:06.801Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ucam-eo","funding_links":[],"total_stars":6,"followers":0,"following":0,"created_at":"2025-06-27T11:47:06.847Z","updated_at":"2025-06-27T11:47:06.847Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucam-eo","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ucam-eo/repositories"},"tags":[{"name":"v0.8.0","sha":"5b70f78f4cacf71ee65afa9edb1332e723ccf144","kind":"commit","published_at":"2026-04-05T11:08:38.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.8.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.8.0/manifests"},{"name":"v0.7.5","sha":"22523d043d541b8f5ee826a6c17b4aba06c7250b","kind":"commit","published_at":"2026-02-15T11:44:03.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.7.5","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.7.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.7.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.5/manifests"},{"name":"v0.7.4","sha":"fce5637967dcdae9073073f8e0d37caac5d112c1","kind":"commit","published_at":"2026-01-27T11:45:08.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.7.4","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.7.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.7.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.4/manifests"},{"name":"v0.7.3","sha":"b596baed76fbacddb9b34be99aec46c34c0d91dc","kind":"commit","published_at":"2025-12-17T11:10:44.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.7.3","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.7.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.7.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.3/manifests"},{"name":"v0.7.2","sha":"1e1ef54c635c5c9a198acaf6464c53c208b22635","kind":"commit","published_at":"2025-12-02T20:27:22.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.7.2","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.7.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.7.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.2/manifests"},{"name":"v0.7.1","sha":"df72115eb76310b0e81c74e0850269c069ba002f","kind":"commit","published_at":"2025-11-19T15:30:08.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.7.1","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.7.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.1/manifests"},{"name":"v0.7.0","sha":"2e2b76d45354df9a19390a39a4156bc2d8355b8b","kind":"commit","published_at":"2025-11-11T15:58:59.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.7.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.7.0/manifests"},{"name":"v0.6.0","sha":"f9371f97d6361b3908ea3cd1a1312d8cff8dca92","kind":"commit","published_at":"2025-09-15T10:07:13.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.6.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.6.0/manifests"},{"name":"v0.5.2","sha":"c6141517052354a5deaf68908ed51f50b764c778","kind":"commit","published_at":"2025-09-02T10:01:52.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.5.2","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.5.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.5.2/manifests"},{"name":"v0.5.1","sha":"67c826912c2cc736dfe4e6431107057f52916b06","kind":"commit","published_at":"2025-08-30T17:27:45.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.5.1","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.5.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.5.1/manifests"},{"name":"v0.5.0","sha":"e0fd827f7ed1ee8eae893334ec8d22726c6910b6","kind":"commit","published_at":"2025-08-29T12:02:16.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.5.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.5.0/manifests"},{"name":"v0.4.0","sha":"86424cb37ebb11ed1de191ad241a4217f6174482","kind":"commit","published_at":"2025-08-14T10:21:41.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.4.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.4.0/manifests"},{"name":"v0.3.0","sha":"ff4327654bd0f7e471adb54fcf4b5cd7c559d541","kind":"commit","published_at":"2025-08-13T13:03:13.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.3.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.3.0/manifests"},{"name":"v0.2.0","sha":"bb9f7eb3ba418ad82545ddf3bc04e625f3b7ed2b","kind":"commit","published_at":"2025-07-23T08:39:40.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.2.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.2.0/manifests"},{"name":"v0.1.0","sha":"f1160ae7475abf6c65d617245b00f8da11e92183","kind":"commit","published_at":"2025-07-04T23:24:29.000Z","download_url":"https://codeload.github.com/ucam-eo/geotessera/tar.gz/v0.1.0","html_url":"https://github.com/ucam-eo/geotessera/releases/tag/v0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ucam-eo/geotessera@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/tags/v0.1.0/manifests"}]},"repo_metadata_updated_at":"2026-04-05T13:03:05.381Z","dependent_packages_count":0,"downloads":2177,"downloads_period":"last-month","dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":49.78811636297624,"dependent_packages_count":8.836285143751843,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":29.312200753364042},"purl":"pkg:pypi/geotessera","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/geotessera","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/geotessera","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/geotessera/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-04-05T13:01:10.908Z","issues_count":55,"pull_requests_count":13,"avg_time_to_close_issue":1528739.888888889,"avg_time_to_close_pull_request":595895.3636363636,"issues_closed_count":18,"pull_requests_closed_count":11,"pull_request_authors_count":7,"issue_authors_count":48,"avg_comments_per_issue":1.7272727272727273,"avg_comments_per_pull_request":0.6923076923076923,"merged_pull_requests_count":8,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":55,"past_year_pull_requests_count":13,"past_year_avg_time_to_close_issue":1528739.888888889,"past_year_avg_time_to_close_pull_request":595895.3636363636,"past_year_issues_closed_count":18,"past_year_pull_requests_closed_count":11,"past_year_pull_request_authors_count":7,"past_year_issue_authors_count":48,"past_year_avg_comments_per_issue":1.7272727272727273,"past_year_avg_comments_per_pull_request":0.6923076923076923,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":8,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/issues","maintainers":[],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/geotessera/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/geotessera/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/geotessera/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/geotessera/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/geotessera/codemeta","maintainers":[{"uuid":"avsm","login":"avsm","name":null,"email":null,"url":null,"packages_count":1,"html_url":"https://pypi.org/user/avsm/","role":null,"created_at":"2025-07-13T14:45:28.228Z","updated_at":"2025-07-13T14:45:28.228Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/avsm/packages"},{"uuid":"sadiqj","login":"sadiqj","name":null,"email":null,"url":null,"packages_count":1,"html_url":"https://pypi.org/user/sadiqj/","role":"Owner","created_at":"2025-07-23T13:18:19.782Z","updated_at":"2025-07-23T13:18:19.782Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/sadiqj/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":833440,"maintainers_count":355816,"namespaces_count":0,"keywords_count":270194,"github":"pypi","metadata":{"funded_packages_count":53084},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2026-04-05T05:05:39.368Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}}],"commits":{"id":11149963,"full_name":"ucam-eo/geotessera","default_branch":"master","total_commits":312,"total_committers":14,"total_bot_commits":15,"total_bot_committers":1,"mean_commits":22.285714285714285,"dds":0.20833333333333337,"past_year_total_commits":312,"past_year_total_committers":14,"past_year_total_bot_commits":15,"past_year_total_bot_committers":1,"past_year_mean_commits":22.285714285714285,"past_year_dds":0.20833333333333337,"last_synced_at":"2026-04-05T13:09:54.158Z","last_synced_commit":"5b70f78f4cacf71ee65afa9edb1332e723ccf144","created_at":"2025-09-13T23:56:17.995Z","updated_at":"2026-04-05T13:08:35.262Z","committers":[{"name":"Anil Madhavapeddy","email":"anil@recoil.org","login":"avsm","count":247},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":15},{"name":"frankfeng","email":"frankfeng@daintree","login":null,"count":14},{"name":"Frank Feng","email":"61307655+FrankFeng-23","login":"FrankFeng-23","count":9},{"name":"Robin Young","email":"59581322+rbnyng","login":"rbnyng","count":7},{"name":"Janne Mäyrä","email":"22835847+mayrajeo","login":"mayrajeo","count":4},{"name":"maawoo","email":"marco.wolsza@uni-jena.de","login":"maawoo","count":3},{"name":"Sadiq Jaffer","email":"sadiq@toao.com","login":"sadiqj","count":3},{"name":"Srinivasan Keshav","email":"68230852+sk818","login":"sk818","count":2},{"name":"Olli Niemitalo (HAMK)","email":"Olli.Niemitalo@hamk.fi","login":"olli4","count":2},{"name":"E-Ping Rau","email":"epingchris@gmail.com","login":"epingchris","count":2},{"name":"Nicolas Karasiak","email":"nicolas.karasiak@earthdaily.com","login":null,"count":2},{"name":"GitHub Actions Bot","email":"actions@github.com","login":"actions-user","count":1},{"name":"David Allsopp","email":"david.allsopp@metastack.com","login":"dra27","count":1}],"past_year_committers":[{"name":"Anil Madhavapeddy","email":"anil@recoil.org","login":"avsm","count":247},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":15},{"name":"frankfeng","email":"frankfeng@daintree","login":null,"count":14},{"name":"Frank Feng","email":"61307655+FrankFeng-23","login":"FrankFeng-23","count":9},{"name":"Robin Young","email":"59581322+rbnyng","login":"rbnyng","count":7},{"name":"Janne Mäyrä","email":"22835847+mayrajeo","login":"mayrajeo","count":4},{"name":"maawoo","email":"marco.wolsza@uni-jena.de","login":"maawoo","count":3},{"name":"Sadiq Jaffer","email":"sadiq@toao.com","login":"sadiqj","count":3},{"name":"Srinivasan Keshav","email":"68230852+sk818","login":"sk818","count":2},{"name":"Olli Niemitalo (HAMK)","email":"Olli.Niemitalo@hamk.fi","login":"olli4","count":2},{"name":"E-Ping Rau","email":"epingchris@gmail.com","login":"epingchris","count":2},{"name":"Nicolas Karasiak","email":"nicolas.karasiak@earthdaily.com","login":null,"count":2},{"name":"GitHub Actions Bot","email":"actions@github.com","login":"actions-user","count":1},{"name":"David Allsopp","email":"david.allsopp@metastack.com","login":"dra27","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-06T00:00:08.903Z","repositories_count":6211229,"commits_count":921932100,"contributors_count":35687158,"owners_count":1143388,"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":"ucam-eo/geotessera","html_url":"https://github.com/ucam-eo/geotessera","last_synced_at":"2026-02-05T15:05:32.338Z","status":null,"issues_count":51,"pull_requests_count":9,"avg_time_to_close_issue":395457.0714285714,"avg_time_to_close_pull_request":368024.28571428574,"issues_closed_count":14,"pull_requests_closed_count":7,"pull_request_authors_count":6,"issue_authors_count":45,"avg_comments_per_issue":1.6862745098039216,"avg_comments_per_pull_request":0.6666666666666666,"merged_pull_requests_count":5,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":51,"past_year_pull_requests_count":9,"past_year_avg_time_to_close_issue":395457.0714285714,"past_year_avg_time_to_close_pull_request":368024.28571428574,"past_year_issues_closed_count":14,"past_year_pull_requests_closed_count":7,"past_year_pull_request_authors_count":6,"past_year_issue_authors_count":45,"past_year_avg_comments_per_issue":1.6862745098039216,"past_year_avg_comments_per_pull_request":0.6666666666666666,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":5,"created_at":"2025-08-29T13:01:25.823Z","updated_at":"2026-02-06T09:00:09.757Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ucam-eo%2Fgeotessera/issues","issue_labels_count":{"embedding-request":37,"enhancement":2,"question":1,"bug":1},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":47,"CONTRIBUTOR":4},"pull_request_author_associations_count":{"NONE":5,"CONTRIBUTOR":4},"issue_authors":{"epingchris":3,"JohnKilbride":2,"barbarametzler":2,"ratsakatika":2,"kt-sa7716":2,"rbnyng":1,"rymanmaps":1,"DalelanW":1,"sampathyetiraj-cpu":1,"CBonannella":1,"Dhahi-AL-Shammari":1,"JBehanRio":1,"jfprieur":1,"RossDF":1,"Rudigithub12345":1,"jdoblas":1,"miquel-espinosa":1,"yoshitos":1,"brunosan":1,"ArtificialTruth":1,"tatrung":1,"porchelvan26":1,"lefttooth":1,"AlysY":1,"anjo00004":1,"FrankFeng-23":1,"sola25":1,"zgelam0xb":1,"IPAR99":1,"Paladintao":1,"dongGIS-geo":1,"hzx2470535066-coder":1,"BenoitDesRochers":1,"MarcioDDCF":1,"adamfauzi94":1,"KOTA-SATO7716":1,"ancazugo":1,"aida-mashkouri":1,"frolui-sm":1,"prantoroy":1,"sk818":1,"ptresson":1,"franzschug":1,"Pau1ES":1,"iainrolland":1},"pull_request_authors":{"avsm":4,"sadiqj":1,"epingchris":1,"nkarasiak":1,"olli4":1,"rbnyng":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-02-06T00:00:08.836Z","repositories_count":13110035,"issues_count":35561282,"pull_requests_count":115272608,"authors_count":11147123,"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":{"embedding-request":37,"enhancement":2,"question":1,"bug":1},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":47,"CONTRIBUTOR":4},"past_year_pull_request_author_associations_count":{"NONE":5,"CONTRIBUTOR":4},"past_year_issue_authors":{"epingchris":3,"JohnKilbride":2,"kt-sa7716":2,"barbarametzler":2,"ratsakatika":2,"KOTA-SATO7716":1,"lefttooth":1,"MarcioDDCF":1,"miquel-espinosa":1,"Paladintao":1,"Pau1ES":1,"porchelvan26":1,"prantoroy":1,"ptresson":1,"rbnyng":1,"RossDF":1,"Rudigithub12345":1,"rymanmaps":1,"sampathyetiraj-cpu":1,"sk818":1,"sola25":1,"tatrung":1,"yoshitos":1,"zgelam0xb":1,"adamfauzi94":1,"aida-mashkouri":1,"AlysY":1,"ancazugo":1,"anjo00004":1,"ArtificialTruth":1,"BenoitDesRochers":1,"brunosan":1,"CBonannella":1,"DalelanW":1,"Dhahi-AL-Shammari":1,"dongGIS-geo":1,"FrankFeng-23":1,"franzschug":1,"frolui-sm":1,"hzx2470535066-coder":1,"iainrolland":1,"IPAR99":1,"JBehanRio":1,"jdoblas":1,"jfprieur":1},"past_year_pull_request_authors":{"avsm":4,"olli4":1,"sadiqj":1,"rbnyng":1,"epingchris":1,"nkarasiak":1},"maintainers":[],"active_maintainers":[]},"events":{"total":{"MemberEvent":1,"PullRequestEvent":18,"ForkEvent":12,"IssuesEvent":104,"WatchEvent":96,"IssueCommentEvent":128,"PushEvent":113,"PullRequestReviewEvent":4,"PullRequestReviewCommentEvent":5,"CreateEvent":10},"last_year":{"MemberEvent":1,"PullRequestEvent":18,"ForkEvent":12,"IssuesEvent":104,"WatchEvent":96,"IssueCommentEvent":128,"PushEvent":113,"PullRequestReviewEvent":4,"PullRequestReviewCommentEvent":5,"CreateEvent":10}},"keywords":["geospatial-data","python-package"],"dependencies":[{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2025-07-02T12:40:27.320Z","updated_at":"2025-07-02T12:40:27.320Z","repository_link":"https://github.com/ucam-eo/geotessera/blob/main/pyproject.toml","dependencies":[{"id":23933757018,"package_name":"pooch","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":23933757019,"package_name":"tqdm","ecosystem":"pypi","requirements":"\u003e=4.67.1","direct":true,"kind":"runtime","optional":false},{"id":23933757020,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":23933757021,"package_name":"matplotlib","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/update_map.yml","sha":null,"kind":"manifest","created_at":"2025-07-24T03:17:45.544Z","updated_at":"2025-07-24T03:17:45.544Z","repository_link":"https://github.com/ucam-eo/geotessera/blob/main/.github/workflows/update_map.yml","dependencies":[{"id":24301708533,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":24301708534,"package_name":"astral-sh/setup-uv","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":24301708535,"package_name":"stefanzweifel/git-auto-commit-action","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"uv.lock","sha":null,"kind":"lockfile","created_at":"2025-07-24T03:17:45.608Z","updated_at":"2025-07-24T03:17:45.608Z","repository_link":"https://github.com/ucam-eo/geotessera/blob/main/uv.lock","dependencies":[{"id":24301708536,"package_name":"affine","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":24301708537,"package_name":"alabaster","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708538,"package_name":"attrs","ecosystem":"pypi","requirements":"25.3.0","direct":false,"kind":"runtime","optional":false},{"id":24301708539,"package_name":"babel","ecosystem":"pypi","requirements":"2.17.0","direct":false,"kind":"runtime","optional":false},{"id":24301708540,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.6.15","direct":false,"kind":"runtime","optional":false},{"id":24301708541,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.2","direct":false,"kind":"runtime","optional":false},{"id":24301708542,"package_name":"click","ecosystem":"pypi","requirements":"8.2.1","direct":false,"kind":"runtime","optional":false},{"id":24301708543,"package_name":"click-plugins","ecosystem":"pypi","requirements":"1.1.1.2","direct":false,"kind":"runtime","optional":false},{"id":24301708544,"package_name":"cligj","ecosystem":"pypi","requirements":"0.7.2","direct":false,"kind":"runtime","optional":false},{"id":24301708545,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":24301708546,"package_name":"contourpy","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"runtime","optional":false},{"id":24301708547,"package_name":"cycler","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":24301708548,"package_name":"docutils","ecosystem":"pypi","requirements":"0.21.2","direct":false,"kind":"runtime","optional":false},{"id":24301708549,"package_name":"fonttools","ecosystem":"pypi","requirements":"4.58.5","direct":false,"kind":"runtime","optional":false},{"id":24301708550,"package_name":"geopandas","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":24301708551,"package_name":"geotessera","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":24301708560,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"runtime","optional":false},{"id":24301708561,"package_name":"imagesize","ecosystem":"pypi","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":24301708562,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.6","direct":false,"kind":"runtime","optional":false},{"id":24301708563,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"1.4.8","direct":false,"kind":"runtime","optional":false},{"id":24301708564,"package_name":"markdown-it-py","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708565,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":24301708566,"package_name":"matplotlib","ecosystem":"pypi","requirements":"3.10.3","direct":false,"kind":"runtime","optional":false},{"id":24301708567,"package_name":"mdurl","ecosystem":"pypi","requirements":"0.1.2","direct":false,"kind":"runtime","optional":false},{"id":24301708568,"package_name":"numpy","ecosystem":"pypi","requirements":"2.3.1","direct":false,"kind":"runtime","optional":false},{"id":24301708569,"package_name":"packaging","ecosystem":"pypi","requirements":"25.0","direct":false,"kind":"runtime","optional":false},{"id":24301708570,"package_name":"pandas","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":24301708571,"package_name":"pillow","ecosystem":"pypi","requirements":"11.3.0","direct":false,"kind":"runtime","optional":false},{"id":24301708572,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.3.8","direct":false,"kind":"runtime","optional":false},{"id":24301708573,"package_name":"pooch","ecosystem":"pypi","requirements":"1.8.2","direct":false,"kind":"runtime","optional":false},{"id":24301708574,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.2","direct":false,"kind":"runtime","optional":false},{"id":24301708575,"package_name":"pyogrio","ecosystem":"pypi","requirements":"0.11.0","direct":false,"kind":"runtime","optional":false},{"id":24301708576,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.2.3","direct":false,"kind":"runtime","optional":false},{"id":24301708577,"package_name":"pyproj","ecosystem":"pypi","requirements":"3.7.1","direct":false,"kind":"runtime","optional":false},{"id":24301708578,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":24301708579,"package_name":"pytz","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":24301708580,"package_name":"rasterio","ecosystem":"pypi","requirements":"1.4.3","direct":false,"kind":"runtime","optional":false},{"id":24301708581,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.4","direct":false,"kind":"runtime","optional":false},{"id":24301708582,"package_name":"rich","ecosystem":"pypi","requirements":"14.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708583,"package_name":"roman-numerals-py","ecosystem":"pypi","requirements":"3.1.0","direct":false,"kind":"runtime","optional":false},{"id":24301708584,"package_name":"shapely","ecosystem":"pypi","requirements":"2.1.1","direct":false,"kind":"runtime","optional":false},{"id":24301708585,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":24301708586,"package_name":"snowballstemmer","ecosystem":"pypi","requirements":"3.0.1","direct":false,"kind":"runtime","optional":false},{"id":24301708587,"package_name":"sphinx","ecosystem":"pypi","requirements":"8.2.3","direct":false,"kind":"runtime","optional":false},{"id":24301708588,"package_name":"sphinxcontrib-applehelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708589,"package_name":"sphinxcontrib-devhelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708590,"package_name":"sphinxcontrib-htmlhelp","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":24301708591,"package_name":"sphinxcontrib-jsmath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":24301708592,"package_name":"sphinxcontrib-qthelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708593,"package_name":"sphinxcontrib-serializinghtml","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":24301708594,"package_name":"tqdm","ecosystem":"pypi","requirements":"4.67.1","direct":false,"kind":"runtime","optional":false},{"id":24301708595,"package_name":"tzdata","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":24301708596,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.5.0","direct":false,"kind":"runtime","optional":false}]}],"score":16.04599044116729,"created_at":"2025-10-13T00:29:37.841Z","updated_at":"2026-04-17T19:30:42.234Z","avatar_url":"https://github.com/ucam-eo.png","language":"Python","category":"Natural Resources","sub_category":"Soil and Land","monthly_downloads":2177,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# GeoTessera\n\nPython library for accessing and working with Tessera geospatial foundation model embeddings.\n\n## Overview\n\nGeoTessera provides access to geospatial embeddings from the [Tessera\nfoundation model](https://github.com/ucam-eo/tessera), which processes\nSentinel-1 and Sentinel-2 satellite imagery to generate 128-channel\nrepresentation maps at 10m resolution. These embeddings compress a full year of\ntemporal-spectral features into dense representations optimized for downstream\ngeospatial analysis tasks. Read more details about [the model](https://github.com/ucam-eo/tessera).\n\n![Coverage map](https://github.com/ucam-eo/tessera-coverage-map/blob/main/map.png)\n\n### Request missing embeddings\n\nThis repo provides **precomputed embeddings** for multiple years and regions.\nEmbeddings are generated by **randomly sampling tiles** within each region to ensure broad spatial coverage.\n\nIf some **years (2017–2025) / areas** are still missing for your use case, please submit an **Embedding Request**:\n\n- 👉 **[Open an Embedding Request](../../issues/new?template=embedding-request.yml\u0026labels=embedding-request)**\n- Please include: **your organization, intended use, ROI as a bounding box with four points (lon,lat, 4 decimals), and the year(s)**.\n\nAfter you submit the request, we will **prioritize your ROI** and notify you via a comment in the issue once the embeddings are ready. \n\n### Important Notice ⚠️\nOn 20th August 2025, we updated the data processing pipeline of GeoTessera to resolve the issue of tiling artifacts, as shown below. We have retained the embeddings generated before August 20, as they remain effective for use in small-scale areas. After the 2024 embedding generation is completed, we will reprocess the tiles affected by tiling artifacts. If you observe such artifacts during use and they significantly impact performance, please raise the issue **[here](../../issues/new?template=embedding-request.yml\u0026labels=embedding-request)**, and we will prioritize reprocessing your request.\n\n![Pipeline Change](https://github.com/ucam-eo/geotessera/blob/main/pipeline_change.png)\n\nPlease note that if the artifacts you observe are slanted, this is not a bug in the pipeline but rather a result of the Sentinel-1/2 satellite trajectories. Currently, Tessera cannot completely eliminate such artifacts, as they reflect the inherent characteristics of the raw data. However, we have observed that they have minimal impact on downstream tasks.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Architecture](#architecture)\n- [Quick Start](#quick-start)\n- [Python API](#python-api)\n- [Cloud-Native Zarr Access](#cloud-native-zarr-access)\n- [CLI Reference](#cli-reference)\n- [Complete Workflows](#complete-workflows)\n- [Registry System](#registry-system)\n- [Data Organization](#data-organization)\n- [Contributing](#contributing)\n\n## Installation\n\nRequires Python 3.12 or later.\n\n```bash\npip install geotessera\n```\n\nFor development:\n```bash\ngit clone https://github.com/ucam-eo/geotessera\ncd geotessera\npip install -e .\n```\n\n## Architecture\n\n### Core Concepts\n\nGeoTessera is built around a simple two-step workflow:\n\n1. **Retrieve embeddings**: Fetch raw numpy arrays for a geographic bounding box\n2. **Export to desired format**: Save as raw numpy arrays or convert to georeferenced GeoTIFF files\n\n### Coordinate System and Tile Grid\n\nThe Tessera embeddings use a **0.1-degree grid system**:\n\n- **Tile size**: Each tile covers 0.1° × 0.1° (approximately 11km × 11km at the equator)\n- **Tile naming**: Tiles are named by their **center coordinates** (e.g., `grid_0.15_52.05`)\n- **Tile bounds**: A tile at center (lon, lat) covers:\n  - Longitude: [lon - 0.05°, lon + 0.05°]\n  - Latitude: [lat - 0.05°, lat + 0.05°]\n- **Resolution**: 10m per pixel (variable number of pixels per tile depending on latitude)\n\n### File Structure and Downloads\n\nWhen you request embeddings, GeoTessera downloads files directly via HTTP to temporary locations:\n\n#### Embedding Files (via `fetch_embedding`)\n1. **Quantized embeddings** (`grid_X.XX_Y.YY.npy`):\n   - Shape: `(height, width, 128)`\n   - Data type: int8 (quantized for storage efficiency)\n   - Contains the compressed embedding values\n\n2. **Scale files** (`grid_X.XX_Y.YY_scales.npy`):\n   - Shape: `(height, width)` or `(height, width, 128)`\n   - Data type: float32\n   - Contains scale factors for dequantization\n\n3. **Dequantization**: `final_embedding = quantized_embedding * scales`\n\n4. **Temporary Storage**: Files are downloaded to temp locations and automatically cleaned up after processing\n\n#### Landmask Files (for GeoTIFF export)\nWhen exporting to GeoTIFF, additional landmask files are fetched:\n- **Landmask tiles** (`grid_X.XX_Y.YY.tiff`):\n  - Provide UTM projection information\n  - Define precise geospatial transforms\n  - Contain land/water masks\n  - Also downloaded to temp locations and cleaned up after use\n\n### Data Flow\n\n```\nUser Request (lat/lon bbox)\n    ↓\nParquet Registry Lookup (find available tiles from registry.parquet)\n    ↓\nDirect HTTP Downloads to Temp Files\n    ├── embedding.npy (quantized) → temp file\n    └── embedding_scales.npy → temp file\n    ↓\nDequantization (multiply arrays)\n    ↓\nAutomatic Cleanup (delete temp files)\n    ↓\nOutput Format\n    ├── NumPy arrays → Direct analysis\n    └── GeoTIFF → GIS integration\n```\n\n**Storage Note**: Only the Parquet registry (~few MB) is cached locally. All embedding data is downloaded on-demand to temporary files and immediately cleaned up, resulting in zero persistent storage overhead for tile data.\n\n## Quick Start\n\n### Check Available Data\n\nBefore downloading, check what data is available:\n\n```bash\n# Generate a coverage map showing all available tiles\ngeotessera coverage --output coverage_map.png\n\n# Generate a coverage map for the UK\ngeotessera coverage --country uk\n\n# View coverage for a specific year\ngeotessera coverage --year 2024 --output coverage_2024.png\n\n# Customize the visualization\ngeotessera coverage --year 2024 --tile-color blue --tile-alpha 0.3\n```\n\n### Download Embeddings\n\nDownload embeddings as either numpy arrays or GeoTIFF files:\n\n```bash\n# Download as GeoTIFF (default, with georeferencing)\ngeotessera download \\\n  --bbox \"-0.2,51.4,0.1,51.6\" \\\n  --year 2024 \\\n  --output ./london_tiffs\n\n# Download as raw numpy arrays (with metadata JSON)\ngeotessera download \\\n  --bbox \"-0.2,51.4,0.1,51.6\" \\\n  --format npy \\\n  --year 2024 \\\n  --output ./london_arrays\n\n# Download using a GeoJSON/Shapefile region\ngeotessera download \\\n  --region-file cambridge.geojson \\\n  --format tiff \\\n  --year 2024 \\\n  --output ./cambridge_tiles\n\n# Download specific bands only\ngeotessera download \\\n  --bbox \"-0.2,51.4,0.1,51.6\" \\\n  --bands \"0,1,2\" \\\n  --year 2024 \\\n  --output ./london_rgb\n```\n\n### Create Visualizations\n\nGenerate PCA visualizations and web maps from downloaded GeoTIFFs:\n\n```bash\n# Create a PCA mosaic from downloaded tiles\ngeotessera visualize ./london_tiffs pca_mosaic.tif\n\n# Use histogram equalization for maximum contrast\ngeotessera visualize ./london_tiffs pca_balanced.tif --balance histogram\n\n# Create web tiles and serve interactively\ngeotessera webmap pca_mosaic.tif --serve\n\n# Serve existing web visualizations locally\ngeotessera serve ./london_web --open\n```\n\n## Python API\n\n### Core Methods\n\nThe library provides two main methods for retrieving embeddings:\n\n```python\nfrom geotessera import GeoTessera\n\n# Initialize the client\ngt = GeoTessera()\n\n# Method 1: Fetch a single tile\nembedding, crs, transform = gt.fetch_embedding(lon=0.15, lat=52.05, year=2024)\nprint(f\"Shape: {embedding.shape}\")  # e.g., (1200, 1200, 128)\nprint(f\"CRS: {crs}\")  # Coordinate reference system from landmask\n\n# Method 2: Fetch all tiles in a bounding box\nbbox = (-0.2, 51.4, 0.1, 51.6)  # (min_lon, min_lat, max_lon, max_lat)\ntiles_to_fetch = gt.registry.load_blocks_for_region(bounds=bbox, year=2024)\nembeddings = gt.fetch_embeddings(tiles_to_fetch)\n\nfor year, tile_lon, tile_lat, embedding_array, crs, transform in embeddings:\n    print(f\"Tile ({tile_lat}, {tile_lon}): {embedding_array.shape}\")\n```\n\n### Export Formats\n\n#### Export as GeoTIFF\n\n```python\n# Export embeddings for a region as individual GeoTIFF files\n# Step 1: Get the tiles for the region\nbbox = (-0.2, 51.4, 0.1, 51.6)\ntiles_to_fetch = gt.registry.load_blocks_for_region(bounds=bbox, year=2024)\n\n# Step 2: Export those tiles as GeoTIFFs\nfiles = gt.export_embedding_geotiffs(\n    tiles_to_fetch=tiles_to_fetch,\n    output_dir=\"./output\",\n    bands=None,  # Export all 128 bands (default)\n    compress=\"lzw\"  # Compression method\n)\n\nprint(f\"Created {len(files)} GeoTIFF files\")\n\n# Export specific bands only (e.g., first 3 for RGB visualization)\nfiles = gt.export_embedding_geotiffs(\n    tiles_to_fetch=tiles_to_fetch,\n    output_dir=\"./rgb_output\",\n    bands=[0, 1, 2]  # Only export first 3 bands\n)\n```\n\n#### Work with NumPy Arrays\n\n```python\n# Fetch and process embeddings directly\ntiles_to_fetch = gt.registry.load_blocks_for_region(bounds=bbox, year=2024)\nembeddings = gt.fetch_embeddings(tiles_to_fetch)\n\nfor year, tile_lon, tile_lat, embedding, crs, transform in embeddings:\n    # Compute statistics\n    mean_values = np.mean(embedding, axis=(0, 1))  # Mean per channel\n    std_values = np.std(embedding, axis=(0, 1))    # Std per channel\n\n    # Extract specific pixels\n    center_pixel = embedding[embedding.shape[0]//2, embedding.shape[1]//2, :]\n\n    # Apply custom processing\n    processed = your_analysis_function(embedding)\n```\n\n### Visualization Functions\n\n```python\nfrom geotessera.visualization import (\n    create_rgb_mosaic,\n    visualize_global_coverage\n)\nfrom geotessera.web import (\n    create_coverage_summary_map,\n    geotiff_to_web_tiles\n)\n\n# Create an RGB mosaic from multiple GeoTIFF files\ncreate_rgb_mosaic(\n    geotiff_paths=[\"tile1.tif\", \"tile2.tif\"],\n    output_path=\"mosaic.tif\",\n    bands=(0, 1, 2)  # RGB bands\n)\n\n# Generate web tiles for interactive maps\ngeotiff_to_web_tiles(\n    geotiff_path=\"mosaic.tif\",\n    output_dir=\"./web_tiles\",\n    zoom_levels=(8, 15)\n)\n\n# Create a global coverage visualization\nvisualize_global_coverage(\n    tessera_client=gt,\n    output_path=\"global_coverage.png\",\n    year=2024,  # Or None for all years\n    width_pixels=2000,\n    tile_color=\"red\",\n    tile_alpha=0.6\n)\n```\n\n## Cloud-Native Zarr Access\n\nFor interactive or large-scale analysis without downloading files, use the Zarr store.\nThis streams data directly from the cloud:\n\n```python\nfrom geotessera.store import GeoTesseraZarr\n\ngt = GeoTesseraZarr()\nprint(gt.years)  # [2017, 2018, ..., 2025]\n\n# Sample embeddings at specific points (no download needed)\nX = gt.sample_points([(-2.97, 53.44), (0.15, 52.05)], year=2025)\nprint(f\"Shape: {X.shape}\")  # (2, 128)\n\n# Read a full region as a mosaic\nmosaic, transform, crs = gt.read_region(\n    (-3.0, 53.4, -2.9, 53.5), year=2025,\n)\nprint(f\"Mosaic shape: {mosaic.shape}\")\n\n# Work with individual UTM zones via xarray\nds = gt.open_zone(lon=0.15)\nprint(ds)\n```\n\nThe Zarr store implements the `geoemb:` convention for geospatial embedding data\nand automatically routes queries to the correct UTM zone.\n\n## CLI Reference\n\n### download\n\nDownload embeddings for a region in your preferred format:\n\n```bash\ngeotessera download [OPTIONS]\n\nOptions:\n  -o, --output PATH         Output directory [required]\n  --bbox TEXT              Bounding box: 'lon,lat' (single tile) or 'min_lon,min_lat,max_lon,max_lat'\n  --tile TEXT              Single tile by any point within it: 'lon,lat'\n  --region-file PATH       GeoJSON/Shapefile to define region\n  --country TEXT           Country name (e.g., 'United Kingdom', 'UK', 'GB')\n  -f, --format TEXT        Output format: 'tiff' or 'npy' (default: tiff)\n  --year INT               Year of embeddings (default: 2024)\n  --bands TEXT             Comma-separated band indices (default: all 128)\n  --compress TEXT          Compression for TIFF format (default: lzw)\n  --dry-run                Calculate total download size without downloading\n  --skip-hash              Skip SHA256 hash verification of downloaded files\n  --list-files             List all created files with details\n  -v, --verbose            Verbose output\n```\n\n**Resume behaviour**: Both TIFF and NPY downloads automatically skip files that already exist on disk, so interrupted downloads can be resumed by re-running the same command.\n\nSingle tile examples:\n```bash\n# Download a single tile containing a specific point\ngeotessera download --tile \"0.17,52.23\" --year 2024 -o ./single_tile\n\n# Same result using --bbox with 2 coordinates\ngeotessera download --bbox \"0.17,52.23\" --year 2024 -o ./single_tile\n```\n\nOutput formats:\n- **tiff**: Georeferenced GeoTIFF files with UTM projection\n- **npy**: Raw numpy arrays with metadata.json file\n\n### visualize\n\nCreate PCA visualization from multiband GeoTIFF or NPY format embeddings:\n\n```bash\ngeotessera visualize INPUT_PATH OUTPUT_FILE [OPTIONS]\n\nOptions:\n  --n-components INT       Number of PCA components (default: 3)\n  --crs TEXT               Target CRS for reprojection (default: EPSG:3857)\n  --balance TEXT            RGB balance method: histogram, percentile, or adaptive\n  --percentile-low FLOAT   Lower percentile for percentile balance (default: 2.0)\n  --percentile-high FLOAT  Upper percentile for percentile balance (default: 98.0)\n```\n\n### webmap\n\nCreate web tiles and interactive viewer from a PCA mosaic:\n\n```bash\ngeotessera webmap RGB_MOSAIC [OPTIONS]\n\nOptions:\n  -o, --output PATH        Output directory\n  --min-zoom INT           Min zoom for web tiles (default: 8)\n  --max-zoom INT           Max zoom for web tiles (default: 15)\n  --serve/--no-serve       Start web server immediately\n  -p, --port INT           Port for web server (default: 8000)\n  --region-file PATH       GeoJSON/Shapefile boundary to overlay\n  --force/--no-force       Force regeneration of tiles\n```\n\n### coverage\n\nGenerate a world map showing data availability:\n\n```bash\ngeotessera coverage [OPTIONS]\n\nOptions:\n  -o, --output PATH        Output PNG file (default: tessera_coverage.png)\n  --year INT               Specific year to visualize\n  --bbox TEXT              Bounding box: 'lon,lat' (single tile) or 'min_lon,min_lat,max_lon,max_lat'\n  --tile TEXT              Single tile by any point within it: 'lon,lat'\n  --region-file PATH       GeoJSON/Shapefile to focus on specific region\n  --country TEXT           Country name to focus on (e.g., 'United Kingdom')\n  --tile-color TEXT        Color for tiles (default: red)\n  --tile-alpha FLOAT       Transparency 0-1 (default: 0.6)\n  --tile-size FLOAT        Size multiplier (default: 1.0)\n  --width INT              Output image width in pixels (default: 2000)\n  --no-countries           Don't show country boundaries\n```\n\n### serve\n\nServe web visualizations locally:\n\n```bash\ngeotessera serve DIRECTORY [OPTIONS]\n\nOptions:\n  -p, --port INT           Port number (default: 8000)\n  --open/--no-open         Auto-open browser (default: open)\n  --html TEXT              Specific HTML file to serve\n```\n\n### info\n\nDisplay information about GeoTIFF files or the library:\n\n```bash\ngeotessera info [OPTIONS]\n\nOptions:\n  --tiles PATH             Analyze tile files/directory (GeoTIFF or NPY format)\n  --dataset-version TEXT   Tessera dataset version\n  -v, --verbose            Verbose output\n```\n\n## Registry System\n\n### Overview\n\nGeoTessera uses a Parquet-based registry system to efficiently manage and access the large Tessera dataset:\n\n- **Single Parquet file**: All tile metadata stored in one efficient `registry.parquet` file\n- **Fast queries**: Uses pandas DataFrames for efficient spatial and temporal filtering\n- **Block-based organization**: Internal 5×5 degree geographic blocks for efficient queries\n- **Minimal storage**: Registry file is ~few MB and cached locally\n- **Integrity checking**: SHA256 checksums ensure data integrity during downloads\n  - Embedding files verified using `hash` column\n  - Scales files verified using `scales_hash` column\n  - Landmask files verified using landmasks registry `hash` column\n  - **Enabled by default** for data integrity and security\n  - Can be disabled with `verify_hashes=False`, `--skip-hash` CLI flag, or `GEOTESSERA_SKIP_HASH=1` environment variable\n\n### Registry Sources\n\nThe registry can be loaded from multiple sources (in priority order):\n\n1. **Local file** (via `--registry-path` or `registry_path` parameter)\n2. **Local directory** (via `--registry-dir` or `registry_dir` parameter, looks for `registry.parquet`)\n3. **Remote URL** (via `--registry-url` or `registry_url` parameter)\n4. **Default remote** (from `https://dl2.geotessera.org/{version}/registry.parquet`)\n\n```python\n# Use local registry file\ngt = GeoTessera(registry_path=\"/path/to/registry.parquet\")\n\n# Use local registry directory\ngt = GeoTessera(registry_dir=\"/path/to/registry-dir\")\n\n# Use custom remote registry\ngt = GeoTessera(registry_url=\"https://example.com/registry.parquet\")\n\n# Use default remote registry (downloads and caches automatically)\ngt = GeoTessera()  # Default behavior\n```\n\n### Registry Structure\n\nThe Parquet registry contains columns for:\n- **Coordinates**: `lon`, `lat` (tile center coordinates)\n- **Year**: `year` (data year, 2017-2025)\n- **Hash**: `hash` (SHA256 file integrity checksum), `scales_hash` (for scale files)\n- **Size**: `file_size` (file size in bytes for download planning)\n\n```python\n# Example registry query\nimport pandas as pd\nregistry = pd.read_parquet(\"registry.parquet\")\nprint(registry.head())\n#    lon    lat  year                                hash  ...\n# 0.15  52.05  2024  abc123...\n```\n\n### How Registry Loading Works\n\n1. **Load Parquet registry** → Download and cache registry file (if not local)\n2. **Request tiles for bbox** → Query DataFrame for tiles in region\n3. **Filter by year** → Select tiles matching requested year\n4. **Find available tiles** → Return list of matching tiles\n5. **Direct HTTP download** → Fetch tiles on-demand to temp files with hash verification\n6. **Automatic cleanup** → Delete temp files after processing\n\n## Data Organization\n\n### Tessera Data Structure\n\n```\nRemote Server (https://dl2.geotessera.org)\n├── v1/                              # Dataset version\n│   ├── registry.parquet             # Parquet registry with all metadata\n│   ├── 2024/                        # Year\n│   │   ├── grid_0.15_52.05/         # Tile (named by center coords)\n│   │   │   ├── grid_0.15_52.05.npy              # Quantized embeddings\n│   │   │   └── grid_0.15_52.05_scales.npy       # Scale factors\n│   │   └── ...\n│   └── landmasks/\n│       ├── grid_0.15_52.05.tiff     # Landmask with projection info\n│       └── ...\n```\n\n### Local Cache Structure\n\n```\n~/.cache/geotessera/                 # Default cache location\n└── registry.parquet                  # Cached Parquet registry (~few MB)\n\n# Note: Embedding and landmask tiles are NOT cached persistently.\n# They are downloaded to temporary files and immediately cleaned up after use.\n```\n\n### Coordinate Reference Systems\n\n- **Embeddings**: Stored in simple arrays, referenced by center coordinates\n- **GeoTIFF exports**: Use UTM projection from corresponding landmask tiles\n- **Web visualizations**: Reprojected to Web Mercator (EPSG:3857)\n\n## Cache Configuration\n\nGeoTessera caches only the Parquet registry file (~few MB). Embedding and landmask tiles are downloaded to temporary files and immediately cleaned up after use.\n\n### Python API\n\n```python\nfrom geotessera import GeoTessera\n\n# Use custom cache directory for registry\ngt = GeoTessera(cache_dir=\"/path/to/cache\")\n\n# Use default cache location (recommended)\ngt = GeoTessera()\n```\n\n### CLI\n\n```bash\n# Specify custom cache directory\ngeotessera download --cache-dir /path/to/cache ...\n\n# Use default cache location\ngeotessera download ...\n```\n\n### Default Cache Locations\n\nWhen `cache_dir` is not specified, the registry is cached in platform-appropriate locations:\n- **Linux/macOS**: `$XDG_CACHE_HOME/geotessera` or `~/.cache/geotessera`\n- **Windows**: `%LOCALAPPDATA%/geotessera`\n\n## Hash Verification\n\nGeoTessera verifies SHA256 checksums for all downloaded files (embeddings, scales, and landmasks) by default to ensure data integrity. You can disable this verification if needed:\n\n### Python API\n\n```python\nfrom geotessera import GeoTessera\n\n# Disable hash verification via parameter\ngt = GeoTessera(verify_hashes=False)\n\n# Or use environment variable\nimport os\nos.environ['GEOTESSERA_SKIP_HASH'] = '1'\ngt = GeoTessera()\n```\n\n### CLI\n\n```bash\n# Disable hash verification with flag\ngeotessera download --bbox \"0,52,0.2,52.2\" --year 2024 -o ./data --skip-hash\n\n# Or use environment variable\nGEOTESSERA_SKIP_HASH=1 geotessera download --bbox \"0,52,0.2,52.2\" --year 2024 -o ./data\n```\n\n**Note**: Hash verification is enabled by default for security. Only disable it in trusted environments or for testing purposes.\n\n## Contributing\n\nContributions are welcome! Please see our [Contributing Guide](CONTRIBUTING.md) for details.\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE.md) file for details.\n\n## Citation\n\nIf you use Tessera in your research, please cite the [arXiv paper](https://arxiv.org/abs/2506.20380):\n\n```bibtex\n@misc{feng2025tesseratemporalembeddingssurface,\n      title={TESSERA: Temporal Embeddings of Surface Spectra for Earth Representation and Analysis}, \n      author={Zhengpeng Feng and Clement Atzberger and Sadiq Jaffer and Jovana Knezevic and Silja Sormunen and Robin Young and Madeline C Lisaius and Markus Immitzer and David A. Coomes and Anil Madhavapeddy and Andrew Blake and Srinivasan Keshav},\n      year={2025},\n      eprint={2506.20380},\n      archivePrefix={arXiv},\n      primaryClass={cs.LG},\n      url={https://arxiv.org/abs/2506.20380}, \n}\n```\n\n## Links\n\n- [Tessera Foundation Model](https://github.com/ucam-eo/tessera)\n- [Tessera Interactive Notebook](https://github.com/ucam-eo/tessera-interactive-map)\n- [Tessera Examples](https://github.com/ucam-eo/geotessera-examples)\n- [Documentation](https://geotessera.readthedocs.io/)\n- [PyPI Package](https://pypi.org/project/geotessera/)\n- [Issue Tracker](https://github.com/ucam-eo/geotessera/issues)\n\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=ucam-eo/geotessera\u0026type=Date)](https://www.star-history.com/#ucam-eo/geotessera\u0026Date)\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["standards"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/326568","html_url":"https://ost.ecosyste.ms/projects/326568"}