{"id":29303520,"url":"https://github.com/scverse/cookiecutter-scverse-presentation","last_synced_at":"2026-02-09T13:32:42.252Z","repository":{"id":255687662,"uuid":"853212872","full_name":"scverse/cookiecutter-scverse-presentation","owner":"scverse","description":"Introduction to our template","archived":false,"fork":false,"pushed_at":"2025-12-22T18:03:18.000Z","size":200576,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-24T06:43:38.640Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://scverse.org/cookiecutter-scverse-presentation/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scverse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-09-06T07:57:00.000Z","updated_at":"2025-12-22T17:52:23.000Z","dependencies_parsed_at":"2024-09-06T18:38:51.740Z","dependency_job_id":"f5a21e51-d3be-45a8-b711-a7093b92ba87","html_url":"https://github.com/scverse/cookiecutter-scverse-presentation","commit_stats":null,"previous_names":["scverse/cookiecutter-scverse-presentation"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/scverse/cookiecutter-scverse-presentation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scverse%2Fcookiecutter-scverse-presentation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scverse%2Fcookiecutter-scverse-presentation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scverse%2Fcookiecutter-scverse-presentation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scverse%2Fcookiecutter-scverse-presentation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scverse","download_url":"https://codeload.github.com/scverse/cookiecutter-scverse-presentation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scverse%2Fcookiecutter-scverse-presentation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29266982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-09T12:53:16.161Z","status":"ssl_error","status_checked_at":"2026-02-09T12:52:30.244Z","response_time":56,"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"}},"keywords":[],"created_at":"2025-07-07T01:08:49.805Z","updated_at":"2026-02-09T13:32:42.236Z","avatar_url":"https://github.com/scverse.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"---\nmarp: true\ntheme: uncover\npaginate: true\n#backgroundColor: #fff\nbackgroundImage: radial-gradient(circle 100vh at bottom 100px right 100px in hsl, var(--color-accent) 0%, transparent 100%)\nstyle: |\n  :root {\n    --color-highlight: #0097a7;\n    --color-accent: rgb(161, 186, 182);\n  }\n  a:any-link {\n    --color-foreground: var(--color-highlight);\n  }\n  .columns {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 1rem;\n  }\n---\n\n\u003c!-- _paginate: skip --\u003e\n\n\u003c!-- Header link: important! --\u003e\n\u003c!-- Follow along if you’re quick, later interactive --\u003e\n\u003c!-- QR URL: https://api.qrserver.com/v1/create-qr-code/?format=svg\u0026data=https://scverse.org/cookiecutter-scverse-presentation/ --\u003e\n\n![bg right:33% vertical 70%](./img/scverse-logo.svg)\n![bg right:33% vertical 60%](./img/qr-pres.svg)\n\n# [scverse® cookiecutter template][template]\n\nFollow along: [scverse.org/\ncookiecutter-scverse-presentation][pres]\n\n[template]: https://cookiecutter-scverse-instance.readthedocs.io/en/latest/template_usage.html\n[pres]: https://scverse.org/cookiecutter-scverse-presentation/\n\n---\n\n## having impact with software\n\n* Publish papers and get citations for academic success\n* High quality software helps a lot with both\n* Be part of the scverse ecosystem: ensure you meet minimum requirements for maximal impact\n  - Get reviewed by [PyOpenSci][]?\n* Workshop goal: path to high quality software dev\n\n[pyopensci]: https://www.pyopensci.org/\n\n---\n\n## scverse ecosystem\n\n* Set of packages built around the scverse core packages\n* Featured on the [scverse ecosystem][] website\n\n![bg right:40% contain](./img/scverse-ecosystem-overview.png)\n\n[scverse ecosystem]: https://scverse.org/packages/#ecosystem\n\n---\n\n### scverse ecosystem requirements\n\n* Metadata: name, description, OSI-approved license, ...\n* Versioned releases installable from PyPI \u0026/or Conda\n* Tests automated via continuous integration (CI)\n* Docs for API and use-cases\n* Scverse datastructures used where appropriate\n\n---\n\n### how to get into the scverse ecosystem\n\nInstructions to add your package are on the [scverse ecosystem repository][]\n\n- Submit existing package, or\n- Easiest way: [scverse cookiecutter template][]\n\n[scverse ecosystem repository]: https://github.com/scverse/ecosystem-packages\n[scverse cookiecutter template]: https://github.com/scverse/cookiecutter-scverse\n\n---\n\n## scverse cookiecutter template\n\n* Project template for scverse packages¹\n* Best practice structure\n* Many features such as continuous integration, documentation setup, …\n* Automatically ticks all scverse ecosystem requirements\n\n¹Much is applicable elsewhere\n\n---\n\n# steps\n\n1. Set up global environment to create project\n2. Create project using [scverse cookiecutter template][]\n3. Set up project specific development environment\n4. Develop your package\n5. Submit to [scverse ecosystem][]\n\n---\n\n## step 1: global environment\n\n* Install using a package manager or installer:\n\n  - [`code`][], [`hatch`][], \u0026 [`git`][]\n  - [`uv`][] or [`pipx`][]\n\n* Install using a package manager, `pipx`, or `uv`:\n\n  - `cruft` \u0026 `pre-commit`\n\n    ```console\n    $ pipx install cruft pre-commit  # or\n    $ uv tool install cruft pre-commit\n    ```\n\n[`code`]: https://code.visualstudio.com/download\n[`hatch`]: https://hatch.pypa.io/latest/install/\n[`git`]: https://github.com/git-guides/install-git\n[`uv`]: https://docs.astral.sh/uv/getting-started/installation/\n[`pipx`]: https://pipx.pypa.io/stable/installation/\n\n---\n\n## step 2: creating the project\n\n```console\n$ cruft create https://github.com/scverse/cookiecutter-scverse\n  project_name (project-name): myproj\n  […]\n$ code myproj\n```\n\n\u003cimg style=\"margin-bottom: -450px\" src=./img/new-proj.png\u003e\n\n---\n\n## step 3: environment management\n\nHatch envs [basic usage][hatch envs]:\n\n```console\n$ hatch run [env:]command [...args] # e.g. `… docs:build -T`\n$ hatch test [...args]\n$ hatch env remove \u003cname\u003e # or `hatch env prune` for all\n$ hatch env find hatch-test\n~/.local/share/hatch/env/virtual/myproj/FsejNibV/hatch-test.py3.12\n[…]\n```\n\nMake sure it exists, then tell VS Code:\n\n\u003ckbd\u003e⌘\u003c/kbd\u003e|\u003ckbd\u003e^\u003c/kbd\u003e+\u003ckbd\u003e⇑\u003c/kbd\u003e+\u003ckbd\u003eP\u003c/kbd\u003e → \u003ckbd\u003ePython: Select Interpreter\u003c/kbd\u003e\n\n[hatch envs]: https://hatch.pypa.io/latest/tutorials/environment/basic-usage/\n\n---\n\n### running tests\n\n```console\n$ hatch test --help\n[…]\nOptions:\n  -r, --randomize\n  -p, --parallel\n  -c, --cover\n  -a, --all\n  -py, --python=X.Y\n  -i, --include=VAR=VAL\n  -x, --exclude=VAR=VAL\n  -s, --show\n…otherwise same as `pytest`\n```\n\n![bg right:40% contain](./img/test-explorer.png)\n\n---\n\n### building docs\n\n```console\n$ hatch run docs:build\n$ hatch run docs:open\n$ hatch run docs:clean\n```\n\nSee \u003csamp\u003epyproject.toml\u003c/samp\u003e:\n\n```toml\n[tools.hatch.envs.docs]\nscripts.build = \"...\"\n...\n```\n\n![bg right:40% contain](./img/docs.png)\n\n---\n\n### formatting and linting\n\nVS Code:\n\n```json\n{\n  \"[python]\": {\n    \"editor.formatOnSave\": true,\n    \"editor.defaultFormatter\": \"charliermarsh.ruff\",\n    \"editor.codeActionsOnSave\": { ... },\n  }, ...\n}\n```\n\nCLI: `pre-commit` (or `hatch run pre-commit`)\n\n\u003c!-- Installing pre-commit globally is preferred --\u003e\n\n```console\n$ pre-commit install # `git commit` hook\n$ pre-commit run --all-files\n```\n\n---\n\n### existing project\n\n\u003c!-- simple: pure-python, one package --\u003e\n\n* Simple project\n\n  1. Instantiate template\n  2. Replace \u003csamp\u003esrc/*\u003c/samp\u003e directory with your package\n  3. Edit `[project]` table in \u003csamp\u003epyproject.toml\u003c/samp\u003e\n\n* Complex project\n\n  1. Step by step PRs: formatter, …\n  2. We can help!\n\n---\n\n\u003c!-- _paginate: false --\u003e\n\u003c!-- _color: var(--color-accent) --\u003e\n\u003c!-- _backgroundColor: black --\u003e\n\n# follow along\n\n---\n\n## step 4: committing code\n\n\u003c!-- No need to do this live, time should be mostly up here --\u003e\n\n- Use PRs, don’t push to `main`\n- Set up [pre-commit.ci][], [codecov.io][] on\n  github.com/\u0026lt;you\u003e/\u0026lt;yourpackage\u003e/settings/installations\n\n![](./img/checks.png)\n\n[pre-commit.ci]: https://pre-commit.ci/\n[codecov.io]: https://codecov.io/\n\n---\n\n### ReadTheDocs\n\n- Set up [readthedocs.org][] and its [PR previews][]:\n\n\u003cimg src=\"./img/rtd-pr-warning.png\" style=\"box-shadow: 0 .2rem .5rem rgba(0,0,0,.1)\"\u003e\n\n[readthedocs.org]: https://docs.readthedocs.io/en/stable/intro/import-guide.html\n[PR previews]: https://docs.readthedocs.io/en/stable/guides/pull-requests.html\n\n---\n\n## step 5: submit to scverse ecosystem\n\n1) Follow the [instructions][scverse ecosystem repository]\n2) Submit a pull request\n3) Maybe get reviewed by [PyOpenSci][]\n\n![bg right:40% contain](./img/scverse-ecosystem-pr.png)\n\n---\n\n\u003c!-- _paginate: false --\u003e\n\u003c!-- _color: var(--color-accent) --\u003e\n\u003c!-- _backgroundColor: black --\u003e\n\n# Thank You!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscverse%2Fcookiecutter-scverse-presentation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscverse%2Fcookiecutter-scverse-presentation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscverse%2Fcookiecutter-scverse-presentation/lists"}