Cutting-edge, opinionated, and ambitious project builder for power users and researchers.
Warning
Not yet ready for production and template may fail to work between versions.
Gatlen's Opinionated Template
(Logo = CookieCutter + Gatlen's Stylistic Motif - The Troublesome Goose)
GOTem is forked from (and synced with) CookieCutter Data Science (CCDS) V2, one of the most popular, flexible, and well maintained Python templates out there. GOTem extends CCDS with carefully selected defaults, dependency stack, customizations, additional features (that I maybe should have spent time contributing to the original project), and contemporary best practices. Ready for not just data science but also general Python development, research projects, and academic work.
- π Modern Tooling & Living Template β Start with built-in support for UV, Ruff, FastAPI, Pydantic, Typer, Loguru, and Polars so you can tackle cutting-edge Python immediately. Template updates as environment changes.
- π Instant Git & CI/CD β Enjoy automatic repo creation, branch protections, and preconfigured GitHub Actions that streamline your workflow from day one.
- π€ Small-Scale to Scalable β Ideal for solo projects or small teams, yet robust enough to expand right along with your growth.
- πββοΈ Start Fast, Stay Strong β Encourages consistent structure, high-quality code, and minimal friction throughout your project's entire lifecycle.
- π Full-Stack + Rare Boilerplates β Covers standard DevOps, IDE configs, and publishing steps, plus extra setups for LaTeX assignments, web apps, CLI tools, and moreβperfect for anyone seeking a "one-stop" solution.
CCDS is white bread: simple, familiar, unoffensive, and waiting for your choice of toppings. GOTem is the expert-crafted and opinionated "everything burger," fully loaded from the start for any task you want to do (so long as you want to do it in a specific way). Some of the selections might be an acquired taste and users are encouraged to leave them off as they start and perhaps not all will appreciate my tastes even with time, but it is the setup I find delicious.
| β Use GOTem ifβ¦ | β Might Not Be for You ifβ¦ |
|---|---|
| π You Want the "Everything Burger" - You're cool with an opinionated, "fully loaded" setup, even if you don't use all the bells and whistles up front. - You love having modern defaults (FastAPI, Polars, Loguru). at the ready for any case life throws at you from school work to research to websites |
π£οΈ You're a Minimalist - You prefer the bare bones or "default" approach. - GOTem's many integrations and new libraries feel too "extra" or opinionated for you, adding more complexity than you want. When you really just want to "get the task done". |
| π You're a Learner / Explorer - You like experimenting with cutting-edge tools (Polars, Typer, etc.) even if they're not as common. - "Modern Over Ubiquitous" libraries excite you. |
π°οΈ You're a Legacy Lover - Tried-and-true frameworks (e.g., Django, Pandas, standard logging) give you comfort. - You'd rather stick to old favorites than wrestle with fresh tech that might be less documented. |
| οΏ½οΏ½βπ» You're a Hacker / Tinkerer - You want code that's as sexy and elegant as it is functional. - You love tinkering, customizing, and "pretty colors" that keep the ADHD brain wrinkled. |
π You're a Micro-Optimizer - You need to dissect every configuration before even starting. - GOTem's "Aspirational Over Practical" angle might make you wary of unproven or cutting-edge setups. |
| β‘ You're a Perfection & Performance Seeker - You enjoy pushing Python's boundaries in speed, design, and maintainability. - You're always looking for the best solution, not just quick patches. |
ποΈ You Need Old-School Stability - You want a large, established user base and predictable release cycles. - You get uneasy about lesser-known or younger libraries that might break your production environment. |
| πββοΈ You're a Quick-Start Enthusiast - You want a template that practically configures itself so you can jump in. - You like having robust CI/CD, Git setup, and docs all done for you. |
πΆββοΈ You Prefer Slow, Manual Setups - You don't mind spending time creating everything from scratch for each new project. - Doing things the classic or "official" way is more comfortable than using "opinionated" shortcuts. |
If the right-hand column describes you better, CookieCutter Data Science (CCDS) or another minimal template might be a better fit.
View the full documentation here β‘οΈ
β‘οΈ With UV (Recommended)
uv tool install gatlens-opinionated-template
# From the parent directory where you want your project
uvx --from gatlens-opinionated-template gotemπ¦ With Pipx
pipx install gatlens-opinionated-template
# From the parent directory where you want your project
gotemπ With Pip
pip install gatlens-opinionated-template
# From the parent directory where you want your project
gotemNote: If using GitHub, you will verst have to run gh auth login
The directory structure of your new project will look something like this (depending on the settings that you choose):
π .
βββ βοΈ .cursorrules <- LLM instructions for Cursor IDE
βββ π» .devcontainer <- Devcontainer config
βββ βοΈ .gitattributes <- GIT-LFS Setup Configuration
βββ π§βπ» .github
β βββ β‘οΈ actions
β β βββ π setup-python-env <- Automated python setup w/ uv
β βββ π‘ ISSUE_TEMPLATE <- Templates for Raising Issues on GH
β βββ π‘ pull_request_template.md <- Template for making GitHub PR
β βββ β‘οΈ workflows
β βββ π main.yml <- Automated cross-platform testing w/ uv, precommit, deptry,
β βββ π on-release-main.yml <- Automated mkdocs updates
βββ π» .vscode <- Preconfigured extensions, debug profiles, workspaces, and tasks for VSCode/Cursor powerusers
β βββ π launch.json
β βββ βοΈ settings.json
β βββ π tasks.json
β βββ βοΈ '{{ cookiecutter.repo_name }}.code-workspace'
βββ π data
β βββ π external <- Data from third party sources
β βββ π interim <- Intermediate data that has been transformed
β βββ π processed <- The final, canonical data sets for modeling
β βββ π raw <- The original, immutable data dump
βββ π³ docker <- Docker configuration for reproducability
βββ π docs <- Project documentation (using mkdocs)
βββ π©ββοΈ LICENSE <- Open-source license if one is chosen
βββ π logs <- Preconfigured logging directory for
βββ π·ββοΈ Makefile <- Makefile with convenience commands (PyPi publishing, formatting, testing, and more)
βββ π Taskfile.yml <- Modern alternative to Makefile w/ same functionality
βββ π notebooks <- Jupyter notebooks
β βββ π 01_name_example.ipynb
β βββ π° README.md
βββ ποΈ out
β βββ π features <- Extracted Features
β βββ π models <- Trained and serialized models
β βββ π reports <- Generated analysis
β βββ π figures <- Generated graphics and figures
βββ βοΈ pyproject.toml <- Project configuration file w/ carefully selected dependency stacks
βββ π° README.md <- The top-level README
βββ π secrets <- Ignored project-level secrets directory to keep API keys and SSH keys safe and separate from your system (no setting up a new SSH-key in ~/.ssh for every project)
β βββ βοΈ schema <- Clearly outline expected variables
β βββ βοΈ example.env
β βββ π ssh
β βββ βοΈ example.config.ssh
β βββ π example.something.key
β βββ π example.something.pub
βββ π° '{{ cookiecutter.module_name }}' <- Easily publishable source code
βββ βοΈ config.py <- Store useful variables and configuration (Preset)
βββ π dataset.py <- Scripts to download or generate data
βββ π features.py <- Code to create features for modeling
βββ π modeling
β βββ π __init__.py
β βββ π predict.py <- Code to run model inference with trained models
β βββ π train.py <- Code to train models
βββ π plots.py <- Code to create visualizations
If you plan major changes, consider upstreaming them to CookieCutter Data Science (CCDS). For minor fixes or adjustments to GOTem, submit an issue or pull request here. See CONTRIBUTING.md for more details.
Some users have experienced an issue with Git LFS being improperly configured. I'm currently working to get this resolved. It's reported that the following may fix the problem:
- Clone the package manually
git clone <this-repo> - Set up git lfs, skipping smudge
git lfs install --skip-smudgeas suggested here - Install the package with
pip install .