A Pokemon-themed CLI task manager and wellbeing tracker. Complete tasks to catch Pokemon, build your collection, and track your mental and physical wellbeing.
| Version: 0.4.0 | License: MIT | Python: 3.10+ |
pokedo stats set-class.# Clone the repository
git clone https://github.com/tldrwtf/pokedo.git
cd pokedo
# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install PokeDo
pip install -e .
# 1. Initialize (downloads Pokemon data)
pokedo init --name "YourName" --quick # Quick start with Gen 1 only
# 2. Add your first task
pokedo task add "Complete a task" --difficulty easy
# 3. Complete the task and catch a Pokemon!
pokedo task complete 1
# 4. View your dashboard
pokedo
You can use pd as a shorthand for pokedo once installed.
# Full initialization (all 1025 Pokemon, takes a few minutes first time)
pokedo init --name "Ash"
# Speed up full initialization with parallel requests
pokedo init --name "Ash" --concurrency 20
# Quick start with Gen 1 only (151 Pokemon)
pokedo init --name "Ash" --quick
# Initialize specific generation
pokedo init --name "Ash" --gen 9 # Paldea only
# Add a task
pokedo task add "Complete project report" --category work --difficulty hard --due tomorrow
# List tasks
pokedo task list
pokedo task list --today
pokedo task list --category work
# Complete a task (triggers Pokemon encounter!)
pokedo task complete 1
# Edit/delete tasks
pokedo task edit 1 --priority urgent
pokedo task delete 1
# View your team
pokedo team
pokedo pokemon team
# View all Pokemon
pokedo pokemon box
# View Pokedex
pokedo pokedex
pokedo pokemon pokedex --caught
pokedo pokemon pokedex --gen 3 # Filter by generation
# Preview a Pokemon sprite in the terminal
pokedo sprite pikachu
pokedo pokemon sprite 25
pokedo pokemon sprite charizard --shiny
pokedo sprite eevee --bg '#1e1e2e' # Custom background color
# Manage team
pokedo pokemon set-active 5
pokedo pokemon remove-active 5
# Evolve Pokemon
pokedo pokemon evolve 3
# Nickname
pokedo pokemon nickname 1 "Sparky"
# Release
pokedo pokemon release 10
# Quick commands
pokedo mood 4 --note "Feeling productive"
pokedo exercise cardio --duration 30 --intensity 4
pokedo sleep 7.5 --quality 4
pokedo water --glasses 8
pokedo meditate 15
# Full commands
pokedo wellbeing mood 5
pokedo wellbeing exercise running --duration 45
pokedo wellbeing today
# Dashboard
pokedo
pokedo daily
# Profiles
pokedo init --name "Misty"
pokedo profile set-default Misty
# Profile
pokedo profile
pokedo stats profile
pokedo profile set-default <name-or-id>
# Streaks
pokedo streaks
# Badges
pokedo badges
# Inventory
pokedo stats inventory
# History
pokedo stats history --days 14
Launch the interactive terminal UI for a full-featured graphical experience.
pokedo tui
Dashboard Keybindings:
| Key | Action |
|---|---|
q |
Quit the TUI |
r |
Refresh dashboard |
p |
Switch profiles |
t |
Open task management |
Task Management Screen (press t from dashboard):
The task screen provides full CRUD operations with tabbed filtering:
| Key | Action |
|---|---|
a |
Add new task |
c |
Complete selected task (triggers Pokemon encounter) |
e |
Edit selected task |
d |
Delete selected task (with confirmation) |
r |
Refresh task lists |
Escape |
Return to dashboard |
Completing a task in the TUI triggers the full encounter flow with XP rewards, streak updates, and Pokemon catching, just like the CLI.
Requires a running PokeDo server. See Server Usage below.
# Register an account
pokedo battle register -u myname -p mypass
# Challenge another trainer
pokedo battle challenge opponent_name -u myname -p mypass
# Accept a challenge (as the opponent)
pokedo battle accept <battle-id> -u opponent -p theirpass
# Submit your team
pokedo battle team <battle-id> -u myname -p mypass
# Attack with a move (index 0-3)
pokedo battle move <battle-id> -m 0 -u myname -p mypass
# Switch to a different Pokemon (team slot index)
pokedo battle switch <battle-id> 1 -u myname -p mypass
# Forfeit
pokedo battle forfeit <battle-id> -u myname -p mypass
# Check battle status
pokedo battle status <battle-id> -u myname -p mypass
# View battle history
pokedo battle history -u myname -p mypass
# Global leaderboard (sorted by ELO by default)
pokedo leaderboard show
# Sort by wins
pokedo leaderboard show --sort battle_wins
# Your own profile
pokedo leaderboard me -u myname
PokeDo includes a FastAPI server for multiplayer battles, leaderboard tracking,
and cloud synchronization. The server uses PostgreSQL for persistent state and
the lifespan context manager pattern.
Start with Docker Compose (recommended):
docker-compose up -d
This starts both PostgreSQL and the PokeDo server.
Or run manually:
# Start PostgreSQL separately, then:
uvicorn pokedo.server:app --reload --port 8000
(Ensure you have installed development dependencies: pip install -e ".[dev]")
Environment variables:
| Variable | Default | Description |
|---|---|---|
POKEDO_DATABASE_URL |
postgresql://pokedo:pokedopass@localhost:5432/pokedo |
Postgres connection |
POKEDO_SECRET_KEY |
your-secret-key-keep-it-secret |
JWT signing secret |
POKEDO_SERVER_URL |
http://localhost:8000 |
Server URL for CLI |
Register and battle:
pokedo battle register -u myname -p mypassword
pokedo battle challenge opponent -u myname -p mypassword
See MULTIPLAYER.md for the full battle flow.
When you complete a task, there’s a chance to encounter a Pokemon:
Task categories influence Pokemon type encounter probabilities:
| Category | Boosted Types |
|---|---|
| Work | Steel, Electric, Normal |
| Exercise | Fighting, Fire, Rock |
| Learning | Psychic, Ghost, Dark |
| Personal | Normal, Fairy, Flying |
| Health | Grass, Water, Poison |
| Creative | Fairy, Dragon, Ice |
Wellbeing actions also affect type encounters:
lifespan context manager (not deprecated on_event). Server-authoritative battle resolution with snapshot-based teams.pokedex_seen/pokedex_caught (with first-caught timestamps and shiny flags).This system provides RPG mechanics for training your Pokemon’s stats:
Task Categories influence which stats are trained:
| Task Category | Stat Trained |
|---|---|
| Work | Special Attack |
| Exercise | Attack |
| Learning | Special Defense |
| Health | HP |
| Personal | Defense |
| Creative | Speed |
Task Difficulty determines the EV yield:
| Difficulty | EV Yield |
|---|---|
| Easy | 1 EV |
| Medium | 2 EVs |
| Hard | 4 EVs |
| Epic | 8 EVs |
All data is stored locally in ~/.pokedo/:
pokedo.db: SQLite databasecache/: Cached PokeAPI datacache/sprites/: Downloaded Pokemon spritesThe project includes a FastAPI server (pokedo/server.py) for multiplayer battles, a global leaderboard, and cloud synchronization. The server uses PostgreSQL via SQLModel and JWT-based authentication.
# Install with dev dependencies
pip install -e ".[dev]"
# Run all tests (556 tests)
pytest
# Run tests with coverage
pytest --cov=pokedo
# Run specific test file
pytest tests/test_battle.py
# Run multiplayer tests only
pytest tests/test_moves.py tests/test_battle.py tests/test_server.py -v
For more development information, see:
“Command not found: pokedo”
pip install -e .python -m pokedo instead“Database error” on first run
pokedo init --name "YourName" to initialize the databaseTypeError: cannot use 'pokedo.core.task.Task' as a dict key (unhashable type: 'Task') in TUI
self._task for a domain Task, which conflicts with Textual’s internal Widget._task asyncio lifecycle field._detail_task, _editing_task, and _completed_task.self._task; always use explicit names such as _selected_task or _editing_task.Slow initialization
--quick flag for Gen 1 only (151 Pokemon)--gen N to initialize a specific generation--concurrency N to increase parallel PokeAPI requestsPokemon sprites not displaying
~/.pokedo/cache/sprites/ for cached imagesAPI rate limiting
~/.pokedo/cache/ folder# Remove all PokeDo data (start fresh)
rm -rf ~/.pokedo
# Reinitialize
pokedo init --name "YourName"
Q: Can I play offline? A: Yes, after initial setup. All Pokemon data is cached locally.
Q: How do I backup my progress?
A: Copy the ~/.pokedo/ directory. The pokedo.db file contains all your data.
Q: What happens if I miss a day? A: Your daily streak resets to 0, but your best streak is preserved.
Q: Can I catch legendary Pokemon? A: Yes! Epic and hard tasks have small chances to encounter legendaries. Mythical Pokemon require special tickets earned from long streaks.
Q: How does shiny hunting work? A: Base shiny rate is 1%. Each day of your streak adds 0.5% (up to 10% max).
Q: Can I have multiple profiles?
A: Yes. Each trainer profile is stored in the same local database. The CLI uses the default profile, and the TUI lets you switch profiles (press p) and set a new default.
Q: Does wellbeing tracking affect gameplay? A: Yes! Good sleep improves catch rates, hydration goals boost Water-type encounters, and meditation increases Psychic/Fairy encounters.
Q: How do I battle other players?
A: Start the PokeDo server (see Multiplayer Guide), register an account, and use the pokedo battle commands. Battles are async and turn-based – you and your opponent submit actions independently, and the server resolves each turn.
Q: Do I need a server to play? A: No. All single-player features (tasks, Pokemon, wellbeing) work fully offline with a local SQLite database. The server is only needed for PvP battles and the leaderboard.
Q: What battle formats are available?
A: Three formats: singles_1v1 (1 Pokemon), singles_3v3 (3 Pokemon, one active), and singles_6v6 (full team, one active). Doubles and tournaments are planned for the future.
Q: How does the ELO rating work? A: Starting rating is 1000 with K-factor 32. Winning against higher-rated opponents earns more points. Ranks range from Youngster (below 1100) to Pokemon Master (2100+).
Q: How do I evolve Pokemon?
A: Level up your Pokemon by completing tasks. When evolution requirements are met, use pokedo pokemon evolve <id>.
Q: What is the difference between CLI and TUI?
A: The CLI (Command Line Interface) uses typed commands like pokedo task add. The TUI (Terminal User Interface) launched with pokedo tui provides an interactive graphical experience with keyboard navigation, tabbed views, and real-time updates.
pokedo/
├── cli/ # Command-line interface (tasks, pokemon, battle, leaderboard)
├── core/ # Business logic, models, battle engine, move system
├── data/ # Database, API clients, server models
├── tui/ # Terminal user interface (Textual)
│ ├── app.py # Main TUI application
│ ├── screens/ # Screen classes (tasks, etc.)
│ ├── widgets/ # Reusable UI components
│ └── styles/ # Textual CSS styling
├── server.py # FastAPI server (auth, battles, leaderboard, sync)
└── utils/ # Configuration, helpers, sprite rendering
See ARCHITECTURE.md for detailed documentation.
MIT License - see LICENSE file for details.