{"id":81591,"name":"The Climate Laboratory","description":"A hands-on approach to climate physics and climate modeling.","url":"https://github.com/brian-rose/climatelaboratorybook","last_synced_at":"2026-04-05T13:30:28.225Z","repository":{"id":36983782,"uuid":"231609808","full_name":"brian-rose/ClimateLaboratoryBook","owner":"brian-rose","description":"JupyterBook source for The Climate Laboratory ","archived":false,"fork":false,"pushed_at":"2026-02-02T01:09:15.000Z","size":616416,"stargazers_count":129,"open_issues_count":18,"forks_count":54,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-02-02T16:22:07.820Z","etag":null,"topics":["climate","climate-model","jupyter","open-textbooks","python"],"latest_commit_sha":null,"homepage":"https://brian-rose.github.io/ClimateLaboratoryBook","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brian-rose.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"authors.yml","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-01-03T14:58:50.000Z","updated_at":"2026-01-29T03:01:47.000Z","dependencies_parsed_at":"2023-10-11T18:46:38.794Z","dependency_job_id":"4fea0835-52ae-4d79-a9df-76e00aca7720","html_url":"https://github.com/brian-rose/ClimateLaboratoryBook","commit_stats":{"total_commits":243,"total_committers":3,"mean_commits":81.0,"dds":0.1728395061728395,"last_synced_commit":"ca0241626f6fb92ae46cb7a5e4adefc29db77169"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/brian-rose/ClimateLaboratoryBook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brian-rose","download_url":"https://codeload.github.com/brian-rose/ClimateLaboratoryBook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29227376,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-08T09:43:19.170Z","status":"ssl_error","status_checked_at":"2026-02-08T09:42:55.556Z","response_time":57,"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":"brian-rose","name":"Brian Rose","uuid":"9097307","kind":"user","description":"Climate scientist, professor, and practitioner of open-source science. I use mathematical and numerical models to study climatic processes at the global scale.","email":"","website":"http://www.atmos.albany.edu/facstaff/brose/index.html","location":"Albany, NY, USA","twitter":"BrianEJRose","company":"University at Albany","icon_url":"https://avatars.githubusercontent.com/u/9097307?u=d7897a201b9cb8fdc86a8823002405bea3e6e9b5\u0026v=4","repositories_count":107,"last_synced_at":"2024-06-11T15:36:30.949Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/brian-rose","funding_links":[],"total_stars":337,"followers":243,"following":6,"created_at":"2022-11-09T22:07:52.559Z","updated_at":"2024-06-11T15:36:34.465Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brian-rose","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brian-rose/repositories"},"packages":[],"commits":{"id":1318615,"full_name":"brian-rose/ClimateLaboratoryBook","default_branch":"main","total_commits":336,"total_committers":3,"total_bot_commits":56,"total_bot_committers":1,"mean_commits":112.0,"dds":0.17261904761904767,"past_year_total_commits":65,"past_year_total_committers":2,"past_year_total_bot_commits":4,"past_year_total_bot_committers":1,"past_year_mean_commits":32.5,"past_year_dds":0.06153846153846154,"last_synced_at":"2026-02-03T18:44:07.274Z","last_synced_commit":"d15613bba4eda633ed496e92a0d02513702b77f4","created_at":"2023-09-11T14:25:39.561Z","updated_at":"2026-02-03T18:44:07.095Z","committers":[{"name":"Brian Rose","email":"brose@albany.edu","login":"brian-rose","count":278},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":56},{"name":"James Scott-Brown","email":"james@jamesscottbrown.com","login":"jamesscottbrown","count":2}],"past_year_committers":[{"name":"Brian Rose","email":"brose@albany.edu","login":"brian-rose","count":61},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":4}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-02-06T00:02:59.014Z","repositories_count":6167921,"commits_count":929197424,"contributors_count":36099300,"owners_count":1140051,"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":"brian-rose/ClimateLaboratoryBook","html_url":"https://github.com/brian-rose/ClimateLaboratoryBook","last_synced_at":"2025-12-31T15:02:09.739Z","status":"error","issues_count":45,"pull_requests_count":179,"avg_time_to_close_issue":27292179.769230768,"avg_time_to_close_pull_request":592976.4529411765,"issues_closed_count":26,"pull_requests_closed_count":170,"pull_request_authors_count":3,"issue_authors_count":3,"avg_comments_per_issue":1.4666666666666668,"avg_comments_per_pull_request":1.3128491620111733,"merged_pull_requests_count":164,"bot_issues_count":0,"bot_pull_requests_count":68,"past_year_issues_count":13,"past_year_pull_requests_count":53,"past_year_avg_time_to_close_issue":1131558.8,"past_year_avg_time_to_close_pull_request":13810.08510638298,"past_year_issues_closed_count":5,"past_year_pull_requests_closed_count":47,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":0.23076923076923078,"past_year_avg_comments_per_pull_request":1.4905660377358492,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":9,"past_year_merged_pull_requests_count":47,"created_at":"2023-09-11T14:25:58.086Z","updated_at":"2025-12-31T15:02:09.739Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/brian-rose%2FClimateLaboratoryBook/issues","issue_labels_count":{"bug":1},"pull_request_labels_count":{"dependencies":68,"github_actions":6},"issue_author_associations_count":{"OWNER":43,"NONE":2},"pull_request_author_associations_count":{"OWNER":110,"CONTRIBUTOR":68,"NONE":1},"issue_authors":{"brian-rose":43,"fbschmtt":1,"jlpearso":1},"pull_request_authors":{"brian-rose":110,"dependabot[bot]":68,"phaustin":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-02-08T00:00:11.518Z","repositories_count":13148949,"issues_count":35560177,"pull_requests_count":115191793,"authors_count":11149289,"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":{"bug":1},"past_year_pull_request_labels_count":{"dependencies":8,"github_actions":6},"past_year_issue_author_associations_count":{"OWNER":11},"past_year_pull_request_author_associations_count":{"OWNER":39,"CONTRIBUTOR":8},"past_year_issue_authors":{"brian-rose":11},"past_year_pull_request_authors":{"brian-rose":39,"dependabot[bot]":8},"maintainers":[{"login":"brian-rose","count":153,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/brian-rose"}],"active_maintainers":[{"login":"brian-rose","count":50,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/brian-rose"}]},"events":{"total":{"ReleaseEvent":3,"DeleteEvent":18,"PullRequestEvent":48,"ForkEvent":9,"IssuesEvent":17,"WatchEvent":16,"IssueCommentEvent":50,"PushEvent":230,"PullRequestReviewEvent":3,"CreateEvent":30},"last_year":{"ReleaseEvent":3,"DeleteEvent":13,"PullRequestEvent":39,"ForkEvent":7,"IssuesEvent":14,"WatchEvent":11,"IssueCommentEvent":43,"PushEvent":211,"PullRequestReviewEvent":1,"CreateEvent":25}},"keywords":["climate","climate-model","jupyter","open-textbooks","python"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/build-book.yaml","sha":null,"kind":"manifest","created_at":"2023-01-17T11:32:27.494Z","updated_at":"2023-01-17T11:32:27.494Z","repository_link":"https://github.com/brian-rose/ClimateLaboratoryBook/blob/main/.github/workflows/build-book.yaml","dependencies":[{"id":6986115893,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986115897,"package_name":"conda-incubator/setup-miniconda","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6986115900,"package_name":"actions/cache","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986115902,"package_name":"actions/upload-artifact","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/delete_preview.yaml","sha":null,"kind":"manifest","created_at":"2023-01-17T11:32:27.733Z","updated_at":"2023-01-17T11:32:27.733Z","repository_link":"https://github.com/brian-rose/ClimateLaboratoryBook/blob/main/.github/workflows/delete_preview.yaml","dependencies":[{"id":6986117273,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986117274,"package_name":"stefanzweifel/git-auto-commit-action","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/deploy-book.yaml","sha":null,"kind":"manifest","created_at":"2023-01-17T11:32:27.875Z","updated_at":"2023-01-17T11:32:27.875Z","repository_link":"https://github.com/brian-rose/ClimateLaboratoryBook/blob/main/.github/workflows/deploy-book.yaml","dependencies":[{"id":6986118013,"package_name":"styfle/cancel-workflow-action","ecosystem":"actions","requirements":"0.11.0","direct":true,"kind":"composite","optional":false},{"id":6986118014,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986118015,"package_name":"jwalton/gh-find-current-pr","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":6986118016,"package_name":"conda-incubator/setup-miniconda","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6986118017,"package_name":"actions/cache","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986118018,"package_name":"peaceiris/actions-gh-pages","ecosystem":"actions","requirements":"v3.9.1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/deploy-preview.yaml","sha":null,"kind":"manifest","created_at":"2023-01-17T11:32:27.953Z","updated_at":"2023-01-17T11:32:27.953Z","repository_link":"https://github.com/brian-rose/ClimateLaboratoryBook/blob/main/.github/workflows/deploy-preview.yaml","dependencies":[{"id":6986118531,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986118534,"package_name":"actions/github-script","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":6986118536,"package_name":"peter-evans/find-comment","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6986118538,"package_name":"peter-evans/create-or-update-comment","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6986118540,"package_name":"dawidd6/action-download-artifact","ecosystem":"actions","requirements":"v2.24.3","direct":true,"kind":"composite","optional":false},{"id":6986118542,"package_name":"peaceiris/actions-gh-pages","ecosystem":"actions","requirements":"v3.9.1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/link-checker.yaml","sha":null,"kind":"manifest","created_at":"2023-01-17T11:32:28.119Z","updated_at":"2023-01-17T11:32:28.119Z","repository_link":"https://github.com/brian-rose/ClimateLaboratoryBook/blob/main/.github/workflows/link-checker.yaml","dependencies":[{"id":6986121217,"package_name":"styfle/cancel-workflow-action","ecosystem":"actions","requirements":"0.11.0","direct":true,"kind":"composite","optional":false},{"id":6986121219,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6986121220,"package_name":"conda-incubator/setup-miniconda","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6986121221,"package_name":"actions/cache","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"conda","filepath":"environment.yml","sha":null,"kind":"manifest","created_at":"2023-10-11T18:46:38.736Z","updated_at":"2023-10-11T18:46:38.736Z","repository_link":"https://github.com/brian-rose/ClimateLaboratoryBook/blob/main/environment.yml","dependencies":[{"id":14155731201,"package_name":"cartopy","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731202,"package_name":"climlab","ecosystem":"conda","requirements":"\u003e=0.7.11","direct":true,"kind":"runtime","optional":false},{"id":14155731203,"package_name":"ffmpeg","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731204,"package_name":"jupyter","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731205,"package_name":"jupyter-book","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731206,"package_name":"matplotlib","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731207,"package_name":"metpy","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731208,"package_name":"nc-time-axis","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731209,"package_name":"netcdf4","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731210,"package_name":"numba","ecosystem":"conda","requirements":"\u003e=0.43.1","direct":true,"kind":"runtime","optional":false},{"id":14155731211,"package_name":"numpy","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731212,"package_name":"python","ecosystem":"conda","requirements":"3.10.*","direct":true,"kind":"runtime","optional":false},{"id":14155731213,"package_name":"sympy","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false},{"id":14155731214,"package_name":"xarray","ecosystem":"conda","requirements":"","direct":true,"kind":"runtime","optional":false}]}],"score":6.089044875446846,"created_at":"2023-09-20T00:01:00.147Z","updated_at":"2026-04-05T13:30:28.232Z","avatar_url":"https://github.com/brian-rose.png","language":"Jupyter Notebook","category":"Sustainable Development","sub_category":"Education","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# The Climate Laboratory\n\n[![DOI](https://zenodo.org/badge/231609808.svg)](https://zenodo.org/badge/latestdoi/231609808)\n[![Deploy Book](https://github.com/brian-rose/ClimateLaboratoryBook/actions/workflows/deploy-book.yaml/badge.svg)](https://github.com/brian-rose/ClimateLaboratoryBook/actions/workflows/deploy-book.yaml)\n[![Link Checker](https://github.com/brian-rose/ClimateLaboratoryBook/actions/workflows/link-checker.yaml/badge.svg)](https://github.com/brian-rose/ClimateLaboratoryBook/actions/workflows/link-checker.yaml)\n\n***A hands-on approach to climate physics and climate modeling***\n\n**By [Brian E. J. Rose][brian], University at Albany**\n\n## About the book\n\nThis book is powered by [MyST Markdown][mystmd] and [JupyterBook 2][jupyterbook2],\nand aims to be all of the following:\n- **self-reproducing** *(most figures are self-generating in the notebooks)*\n- **free** and **open** *(permissive license, sources and content available through github)*\n- **interactive** *(integration with JupyterHub and Binder allows readers to run and modify code examples)*\n- a **living document** *(content continues to evolve, and collaboration is welcome)*\n\nThe material is mostly based on lecture notes for\n[ENV 415: Climate Laboratory][env415] and [ATM 623: Climate Modeling][atm623]\nat the [University at Albany][ualbany].\n\n[To view the book online, go here][book].\nThe JupyterBook source and all book content (mostly [Jupyter Notebook][notebook] files)\nare all in [this github repository][repo].\n\nMuch of the content is made possible by [climlab][climlab], an open-source\nPython toolkit for interactive, process-oriented climate modeling.\n[Brian Rose][brian] is the principle developer of climlab as well as the author of this book.\n\nThe contents of this book are licensed for free and open consumption under the following license:\n[Creative Commons Attribution 4.0 International (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/)\n\n## How to contribute or modify the book\n\nThe [source repository on github][repo] contains everything you need to build your own local version of the book.\n\nFrom a local clone of the source, set up a self-contained conda environment with\n```\nconda env create --file environment.yml\nconda activate climlab-courseware\n```\nThis environment contains all dependencies for *both* building the book and running all the code in the book.\n\nTo build a local copy of the book, do this from the source root\n```\nmyst start\n```\n\nThen point your web brower to http://localhost:3000 to find the built pages.\n\nNote that building the book creates the web pages from the `*.md` and `*.ipynb` sources, but does ***not*** re-run the notebooks. When building the book, we assume that all notebooks are already up-to-date!\n\nAnyone is welcome to suggest edits or improvements by opening pull requests on the [github repository][repo]. If you are editing any code in a notebook, please make sure you execute the modified notebook cleanly before submitting the PR.\n\n## How is the book published\n\n[The book][book] is just the rendered html that results from running `myst build --html`. A new build is triggered on GitHub Actions whenever the sources are updated on the [github repository][repo], and the successful build is deployed to the `gh-pages` branch of the repo.\n\n\n[brian]: https://www.atmos.albany.edu/facstaff/brose/\n[env415]: https://www.atmos.albany.edu/facstaff/brose/classes/ENV415_Spring2022/\n[atm623]: https://brian-rose.github.io/atm623-spring2025/\n[ualbany]: https://www.albany.edu\n[mystmd]: https://mystmd.org\n[jupyterbook2]: https://next.jupyterbook.org\n[climlab]: https://github.com/climlab/climlab\n[book]: https://brian-rose.github.io/ClimateLaboratoryBook/\n[repo]: https://github.com/brian-rose/ClimateLaboratoryBook\n[notebook]: https://jupyter-notebook.readthedocs.io/en/stable/\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["archiving","optimize","measur","transforms","conversion","observation","generic","projection","compose","animals"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/81591","html_url":"https://ost.ecosyste.ms/projects/81591"}