Skip to main content

A Git-like CLI tool for PokéPaste team version control

Project description

Gitto

What is Gitto?

Gitto is a Git-like CLI tool for version controlling competitive Pokémon teams using PokéPaste links.

Why use Gitto?

Because teambuilding gets messy, fast.

Gitto helps you organise, version and compare your Pokémon teams, without losing track of changes.

Gitto gives you:

  • Structure: organise teams and their variants efficiently
  • History: track every change you make
  • Clarity: write yourself meaningful messages for every team version
  • Confidence: never lose a good team again

Who is Gitto for?

Gitto is for competitive Pokémon players who frequently iterate and refine their teams, and want an efficient way to track changes and manage different versions.

Especially if your Pokémon Showdown teambuilder looks something like:

Teambuilder chaos

What can I do with Gitto?

  • Track the full history of your team as it evolves
  • Manage multiple variants of a team without messy copies
  • Compare versions to see exactly what changed
  • Revisit or restore any previous version
  • Merge successful variants into your final team

How do I install Gitto?

From PyPI (recommended)

pip install gitto-cli

Using uv

uv tool install gitto-cli

From GitHub

pip install git+https://github.com/SaiNikhilTadepalli/Gitto.git

How do I use Gitto?

After installing, open Gitto from your terminal:

gitto

This starts the interactive CLI (REPL), where you can run all commands.

Gitto uses three simple ideas:

  • A team is your overall project
  • A variant is a different version of that team
  • An update saves a snapshot from a PokéPaste URL

Gitto always shows your current context in the prompt.

When you first open it:

gitto>

Once you switch to a team and variant:

gitto(gen9uu-sun-offense/physical-venusaur)>

This helps you always know:

  • which team you're working on
  • which variant you're editing

Example workflow

⚠️ The PokéPaste links below are for demonstration purposes only.

Imagine you're building a Gen 9 UU sun team:

team create gen9uu-sun-offense
team switch gen9uu-sun-offense

You start with an initial draft:

team update https://pokepast.es/example-sun-draft -m "initial sun draft"

Now, you want to explore two different builds for a Chlorophyll Venusaur:

Variant 1: Special attacker

team variant special-venusaur
team use special-venusaur

team update https://pokepast.es/example-sun-special-venusaur -m "special attacker Venusaur with Growth"

Variant 2: Physical attacker (a gimmick perhaps)

team variant physical-venusaur
team use physical-venusaur

team update https://pokepast.es/example-sun-physical-venusaur -m "physical attacker Venusaur with Swords Dance experiment"

Compare ideas

To compare different variants, you first look at your timeline:

team timeline

This shows a chronological list of updates across all variants for your team, including their hashes.

Example (simplified):

[a1b2c3d] gen9uu-sun-offense/physical-venusaur: <msg>
[d4e5f6g] gen9uu-sun-offense/special-venusaur: <msg>
[h7i8j9k] gen9uu-sun-offense/main: <msg>

You can then compare any two versions using their hashes from the timeline:

team compare a1b2c3d h7i8j9k

This lets you inspect exactly how the two variants differ.

From experimentation to final team

After comparing ideas, you decide to revisit the physical Venusaur variant.

It actually performs better than expected on ladder, so you refine it and commit a final update:

team use physical-venusaur
team update https://pokepast.es/example-sun-physical-final -m "final physical Venusaur version after ladder testing"

You decide this is the version you want to keep.

Merging into your main team

You switch back to your main variant:

team use main

Then combine the successful idea from your physical variant into the main team:

team combine physical-venusaur main

Now, your main team reflects the final tested version.

To inspect the final version of your team:

team view

This prints your current team (from the latest update in the active variant) in PokéPaste format directly in the CLI.

Cleaning up

Since the physical variant is no longer needed, you can choose to remove it:

team discard physical-venusaur

Final state

Your team now looks like:

  • main: final, ladder-tested team
  • special-venusaur: archived experiment (optional to keep or discard)

Everything is:

  • versioned
  • reproducible
  • and fully traceable

Command reference

You can also view all of the following commands any time inside Gitto:

help

Team management

team create <name>       # Create a new Pokémon team
team switch <name>       # Switch to an existing team
team list                # List all teams
team rename <old> <new>  # Rename a team
team delete <name>       # Delete a team

Variant management

team variant <name>  # Create a new experimental variant of your team
team use <name>      # Switch to an existing variant
team discard <name>  # Delete a variant
team variants        # List all variants in the current team    

Updates

team update <url> -m "message"  # Add a new update from a PokéPaste URL
team amend <url> -m "message"   # Overwrite the most recent update with new data

History & status

team status                            # Show current team, variant and latest update
team history                           # Show the history of updates in the current variant
team timeline                          # Show a chronological log of all recent actions
team compare [<ref1> | <ref1> <ref2>]  # Describe the differences between two updates (default: most recent vs previous)
team view [<ref>]                      # View team content for a specific update

Advanced

team combine <source> <target>  # Apply changes from one variant into another (merge)
team tidy                       # Clean up unused data to free up storage space
team stats                      # Show team size and update counts

How does Gitto work (for the nerds)?

Gitto borrows ideas from Git:

  • Content-addressed storage
  • SHA-1 hashing
  • Merkle DAG data structure
  • Lightweight branching via variants

But simplifies things:

  • No staging area
  • No files, just team snapshots
  • Fully local

How do I report a bug?

If you run into a problem, please open an issue on GitHub: https://github.com/SaiNikhilTadepalli/Gitto/issues

When reporting a bug, please include:

  • What you were trying to do
  • The exact command(s) you ran
  • The full error message/output
  • Your environment (OS, Python version)
  • Steps to reproduce the issue

What's next for Gitto?

Gitto v0.1.0 is focused on getting the core version control workflow right. With that foundation in place, there's plenty of room to build on top.

Some planned improvements include:

  • A more polished CLI experience using libraries like rich or textual
  • A tagging system for teams
  • Search functionality across all teams and variants (by Pokémon, tags or keywords)

Have an idea for Gitto?

Gitto needs to keep evolving. Suggestions and feedback from users are very welcome.

If you have an idea for a feature or improvement, please open an issue on GitHub: https://github.com/SaiNikhilTadepalli/Gitto/issues

You can suggest things like:

  • new features
  • usability improvements
  • workflow ideas / examples

If possible, include:

  • what you're trying to achieve
  • why it would be useful
  • how you imagine it working

Why is it called Gitto?

Because it's like Git but for Pokémon. Also, Ditto transforms, just like your teams do.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gitto_cli-0.1.1.tar.gz (482.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gitto_cli-0.1.1-py3-none-any.whl (31.8 kB view details)

Uploaded Python 3

File details

Details for the file gitto_cli-0.1.1.tar.gz.

File metadata

  • Download URL: gitto_cli-0.1.1.tar.gz
  • Upload date:
  • Size: 482.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for gitto_cli-0.1.1.tar.gz
Algorithm Hash digest
SHA256 68178aadb789026d13a5d182815049548f145121853693c5a39b0ed5a60e36dd
MD5 cd0e974cf872e39f90bca597434056fc
BLAKE2b-256 760f289d4a0bf8001bea44b96816918fd38b3a5e6748f2317f5b7da60bf92f91

See more details on using hashes here.

File details

Details for the file gitto_cli-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: gitto_cli-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 31.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for gitto_cli-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 412ec1514b965b27250f40c22ba69afbbb6b53a61a5aefe5263d2a3163f0ee88
MD5 fca11ecb305f59b4e8fd2c283103269a
BLAKE2b-256 b6a6afb3774a32315195660b7c44ae704a73592f4bdd1837cfc513a145566afa

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page