Celebrating a year of Tessera embeddings and releasing GeoTessera 0.10 GeoTessera 0.10.0 and 0.10.1 have been released, moving hosting to the Source Cooperative with CloudFlare edge caching for improved stability and lower latency. The release follows a year of adoption for TESSERA embeddings, with users requesting priority map areas via GitHub and using the embeddings for agriculture, forests, land cover, water, and urban mapping tasks. The Zarr wrapper has been overhauled to allow streaming data over HTTP without downloads. I can't believe it's been a whole year since we released the first GeoTessera library https://anil.recoil.org/notes/geotessera-python to make the TESSERA https://anil.recoil.org/projects/tessera embeddings easier to get your mittens on. Quite a lot of adoption https://scholar.google.com/scholar?cites=8285391513046094203&as sdt=2005&sciodt=0,5&hl=en has happened since I'm going to quickly review a year of embedding requests https://anil.recoil.org/ a-year-of-embedding-requests and the people who filed them, explain the move to the Source Cooperative https://anil.recoil.org/ geotessera-010-and-the-move-to-source-cooperative for our hosting, what the Zarr upgrades https://anil.recoil.org/ zarr-conversions-for-v1-and-v2-beta-access with UTM routing and matryoshka entail, how the CLI https://anil.recoil.org/ the-geotessera-cli works, and show you a guided tour https://anil.recoil.org/ a-quick-guided-tour that builds a land classifier and sonar panel detector. Because we didn't have enough GPUs to pre-generate embeddings for everywhere in the world, we opened up our GitHub repo for people to request priority map areas they needed https://github.com/ucam-eo/geotessera/issues?q=is%3Aissue%20label%3Aembedding-request . This turned out to be a great way for us to meet our users and build community; there have been people from all over the globe https://www.cl.cam.ac.uk/~avsm2/embedding requests map.html getting in touch Geographically, most of the world is covered, and thematically the requests span agriculture, forests, land cover, water and urban mapping. From a machine learning perspective this involves downstream classification, segmentation and regression tasks from the same model embeddings. Here's a sample https://scholar.google.com/scholar?cites=8285391513046094203&as sdt=2005&sciodt=0,5&hl=en of what people are doing: Klemmer et al did a great review https://doi.org/10.1109/mgrs.2026.3710416 of Earth embeddings as a category of their own for those who want to learn more about the field. Thank you to everyone who took the trouble to file a request with us or write a paper about it, and please keep them coming as we roll out Tessera v2 https://anil.recoil.org/papers/2026-tessera-v2 as well this year I've also just released GeoTessera 0.10.0 https://github.com/ucam-eo/geotessera/releases/tag/v0.10.0 with a quick 0.10.1 https://github.com/ucam-eo/geotessera/releases/tag/v0.10.1 followup today after Aneesh Naik https://aneeshnaik.github.io/ , Michael Dales https://mynameismwd.org and Sadiq Jaffer https://toao.com immediately found some rough edges as they ported their code. The main feature is that all our hosting is no longer hammering Cambridge private servers, but now goes through the Source Cooperative https://source.coop and is fronted by CloudFlare edge caching. The source.coop/tessera/tessera https://source.coop/tessera/tessera remote replaces the AWS bucket we temporarily moved to earlier this year https://anil.recoil.org/notes/geotessera-python-0-7 . We desperately need our Cambridge storage capacity back as we develop new models, so the older endpoints will be switched off shortly. For our users, the primary benefit here is stability and lower latency access that's more 'cloud native'. If you've got a lot of resources and are running on AWS or Azure, you'll find you're closer to the Tessera data. On the other hand, when I was in India running the Tessera hackathon with IIT-Delhi https://anil.recoil.org/notes/first-tessera-hackathon at the AI Impact Summit https://anil.recoil.org/notes/india-ai-summit , the performance was abysmal due to the India-Cambridge link being slow. That should now be much improved due to CloudFlare having plenty of edge caching all over the world. If not, let me know The Zarr Tessera wrapper has also had a big overhaul. The key benefit of Zarr is that no downloads are needed as the client can stream data directly over HTTP. Since the v3 layout work https://anil.recoil.org/notes/tessera-zarr-v3-layout and the geo-embeddings convention proposal https://anil.recoil.org/notes/tessera-embeddings-convention earlier this year, our Zarr store has been UTM-native to minimise coordinate skew around the globe. This works via utmNN Zarr sub-groups that contain the tiles for that particular slice of the world. The GeoTesseraZarr zarr wrapper now routes global lon/lats to the right UTM zone subgroup that actually contains the requested point. This is only necessary near the seams of UTM zones where a point might be on either side. The other new preview feature only for v2 embeddings is support for the "Matryoshka embeddings" that we trained that new model https://anil.recoil.org/papers/2026-tessera-v2 with, following on from v1.1 https://anil.recoil.org/notes/tessera-v11-out . The first 4 and the first 16 dimensions of a v2 embedding can be plucked out of the Zarr store independently of the full 128 dimensions, making it much easier to do a quick sample analysis. The 0.10.1 follow-up release was to fix caching in the Zarr. GeoTesseraZarr now accepts a cache dir= argument and calculates a cache key that disambiguates different model versions so they never clash. There are also minor fixes to make it easier to use local filesystems Ceph in our case which really don't like large directory reads. The CLI is also quite handy to interactively do some tasks. uvx geotessera info will tell you which variants are published; and you can also poke at them interactively at tze.geotessera.org https://tze.geotessera.org . Just click on the top right 'model version' button to switch to v2. bash $ uvx geotessera info ╭─────────┬──────────────────────┬────────────────┬─────────────╮ │ Version │ Variant │ Repository dir │ Status │ ├─────────┼──────────────────────┼────────────────┼─────────────┤ │ 1.0 │ vultr default │ v1 │ available │ │ 1.1 │ cambridge default │ v1.1-cam │ available │ │ 1.1 │ dclimate │ - │ coming soon │ │ 2.0 │ 2B-L~beta1 default │ v2-2B-L~beta1 │ available │ │ 2.0 │ 2B-L~beta2 │ v2-2B-L~beta2 │ available │ ╰─────────┴──────────────────────┴────────────────┴─────────────╯ Note that the v2 ones will have very little coverage as we're still exploring different inference strategies. V1.1 is going through a complete global run at the moment by dClimate, so those should be available en mass in September sometime. I've put together a ucam-eo/geotessera-examples https://github.com/ucam-eo/geotessera-examples repository to provide a little teaching tour https://github.com/ucam-eo/geotessera-examples/tree/main/teaching , after Michael Dales https://mynameismwd.org asked for one a while back. The first of these is a land-cover classifier for any point on Earth: uv run 01 classify.py --lon 0.12 --lat 52.20 Cambridge, obviously This shows how to load a few embeddings from the store: gt = GeoTesseraZarr zarr store url "v2" , cache dir="tessera-cache" mosaic, transform, crs = gt.read region west, south, east, north , year After that we use OpenStreetMap libraries to issue an Overpass query and pull some labels for water, woodland, farmland, buildings and roads for that bounding box. After that, rasterio paints these onto an image using the same coordinate transform that the read region call calculates. features = ox.features.features from bbox bbox=bbox, tags=OSM TAGS .to crs crs rasterize g, class id for g in shapes , out=labels, transform=transform Once the labels and embeddings are aligned, we train a k-nearest-neighbours classifier and a logistic regression to assign a label to each pixel in the bounding box: knn = KNeighborsClassifier n neighbors=5 .fit x fit, y fit logreg = LogisticRegression max iter=2000 .fit scaler.transform x fit , y fit The remainder of the guided tour runs the same classifier using the v2 beta model at a depth of 16, as well as the full 128 dimensions, and compares the accuracy for you. For regions too big to hold in memory there is also an iter region function now, which splits the mosaic into row strips while prefetching the next one. There's a solar panel detection https://github.com/ucam-eo/geotessera-examples/tree/main/solarpanel example that pushes that to lots of pixels without materialising all of them at once; Sadiq Jaffer https://toao.com first demoed this in his PROPL talk https://anil.recoil.org/notes/icfp25-propl last year. Once you get into segmentation, check out Sadiq Jaffer https://toao.com writing about the innards of tiny CNNs over Tessera https://toao.com/blog/earth-observation-budget-solar-farms-tiny-model to brew your own variations. All you need is pip install geotessera or uvx geotessera to invoke the CLI. The examples repository https://github.com/ucam-eo/geotessera-examples is a good place to start. The GeoTessera documentation https://geotessera.readthedocs.io covers the full API. Our EEG Zulip https://eeg.zulipchat.com has several public channels to reach out to for more interactive help. For the agentic hackers among you, there's also a Claude Code plugin in the repository now. Just type /plugin in Claude Code and add ucam-eo/geotessera and activate the resulting geotessera plugin to get you going. Here's to another year of geospatial fun Happy birthday Tessera