Sheikh M Sahil23 downloadsCatch a Gen 1 Pokémon each time a task closes. Needs TaskNotes and Sheiko Task Lifecycle.
An Obsidian plugin that turns finishing tasks into catching Pokémon. Close tasks in TaskNotes and catch a random Gen 1 Pokémon every 4–7 closes; the more you close in a day, the better your odds. Pick a partner, level it up from your work, evolve it, and fill your Pokedex.
Unofficial fan project. Not affiliated with, endorsed by, or sponsored by Nintendo, Game Freak, Creatures Inc. or The Pokémon Company. Pokémon and Pokémon names are trademarks of their respective owners. This repository contains no Pokémon artwork. By default every Pokémon is drawn as a coloured placeholder badge. Sprites are optional: you download them yourself from the plugin's settings (see Sprites).
New here? The user guide walks through what you'll see, with screenshots: your first catch, the Pokedex, a Pokémon's details, the status bar, evolution and sprites.
Not in the Obsidian community directory. Install by hand, using one of these two routes.
Open the latest release and download main.js, manifest.json and styles.css.
Create the folder <your vault>/.obsidian/plugins/sheiko-pokedex/ and put the 3 files in it.
In Obsidian, go to Settings → Community plugins, refresh the list, and enable Sheiko Pokedex.

Every Pokémon shows as a coloured placeholder badge until you choose to download sprites in the plugin's settings. See Sprites. Releases never contain sprites; the release workflow fails if one ever would.
You need Node.js.
git clone https://github.com/Ashura-Sheikh/Sheiko-pokedex-plugin.git
cd Sheiko-pokedex-plugin
npm install
npm run build
Then copy main.js, manifest.json and styles.css into <your vault>/.obsidian/plugins/sheiko-pokedex/ and enable the plugin as in option 1.
If your vault is in git, add .obsidian/plugins/sheiko-pokedex/ to its .gitignore. That keeps your catch data out of your vault's history. Downloaded sprites have their own .gitignore as well.
A close is detected. A task's status changes from open to a completed status (as defined in TaskNotes' own settings) while Obsidian is running. Tasks that were already done when the Pokedex started never count, so rewards start from install. To know which tasks were already done, the plugin goes through your vault's Markdown files once at startup and reads each one's frontmatter from Obsidian's cache, keeping only the task notes and their status. That's the "vault enumeration" the Community directory's scan reports. It needs every file because TaskNotes can mark a note as a task anywhere in the vault. Nothing is written or sent anywhere.
The plugin reads after Sheiko has finished. It waits 2 seconds (Sheiko waits 0.6 s) and then reads the task's frontmatter. It never writes to your notes. All Pokedex state is kept in the plugin's own data.json.
Some closes count for nothing:
closeReason: superseded or parkedEach counted close moves you toward the next catch.
Each close gets a score: priority points (high 3, medium 2, normal 1, other 0) + 2 if it closed within its SLA target.
dateCreated to completedDate.completedDate has a date but no time and it's today's date (TaskNotes' default when Sheiko isn't writing), the moment the close was seen is used instead.When the target is reached, the catch score sets the rarity odds.
| Score | Common | Uncommon | Rare | Legendary |
|---|---|---|---|---|
| 0 | 70 | 25 | 5 | 0 |
| 1 | 62 | 28 | 9 | 1 |
| 2 | 52 | 32 | 14 | 2 |
| 3 | 42 | 35 | 20 | 3 |
| 4 | 32 | 37 | 26 | 5 |
| 5 | 22 | 38 | 32 | 8 |
| 6 | 16 | 37 | 37 | 10 |
| 7 | 12 | 35 | 41 | 12 |
| 8 | 8 | 32 | 45 | 15 |
Species: the contexts of every close in the batch narrow which types can appear. The mapping is editable in the plugin's settings. If no species in the drawn tier matches, any species in that tier can appear.
Draws are seeded, so the logic is repeatable and testable. The hidden target is seeded from the install time and the catch number.
Task size (worked time) doesn't affect rarity. It scales your partner's XP (below).
Partner card: the partner gets a large card at the top of the Pokedex view: a 2× sprite, level and XP bar, its current moves, its next move and what it evolves into (level, stone or fully evolved).
Partner: choose one caught Pokémon as your partner, from the Pokedex view (Choose partner, or click a Pokémon and pick Make partner) or with the Choose partner command.
Status bar: shows the partner and its level, e.g. "Charmeleon Lv 17".
XP: every counted close gives the partner XP:
timeWorkingMinutes when present, otherwise dateCreated → closeLevels: every caught Pokémon starts at level 5 and keeps its own level and XP, so swapping partners loses nothing. Going from level L to L+1 takes 10 × L XP, up to level 100.
Evolution by level: when the partner reaches its evolution level, the Evolution scene starts: "What? CHARMELEON is evolving!" on an original green screen. Press B (or Stop, or close the window) to stop it. Stop it and you're asked again at the next level.
The evolution scene follows Pokémon Red/Blue's own timing (from the pret/pokered disassembly):
Stones: 1 in 25 catches (about one every 8 days at 3 catches a day) also finds a stone matching the caught Pokémon's type:
| Caught type | Stone |
|---|---|
| Fire | Fire Stone |
| Water, Ice | Water Stone |
| Electric | Thunder Stone |
| Grass, Bug | Leaf Stone |
| Fairy, Normal, Poison | Moon Stone |
| Psychic, Fighting, Rock, Ground, Ghost | Trade Stone |
| anything else | a random one |
The primary type is checked first, then the second.
Using a stone: click the Pokémon in the Pokedex and choose the stone. The Trade Stone stands in for Gen 1's trade evolutions (Kadabra, Machoke, Graveler, Haunter). Eevee's form depends on the stone (Water, Thunder or Fire).
Moves: each Pokémon uses its original Red/Blue level-up moves.
Starter pack (once per install): a one-time boost, in Settings → Sheiko Pokedex → Starter pack or as commands:
You're asked to confirm before anything is used. Once a part is used it's gone for this install: updates, reloads and setting changes never refill it. Commands for used-up parts disappear from the command list.
This repository and its releases never contain Pokémon artwork, and tests enforce it:
docs/images/.main.js contains image data.The user guide's screenshots in docs/images/ show placeholder badges only. Until you download sprites, every Pokémon is a coloured placeholder badge.
To see the classic 96×96 pixel sprites, go to Settings → Sheiko Pokedex → Sprites and press Download sprites.
raw.githubusercontent.com, for the default sprites in PokeAPI's sprite repository (sprites/pokemon/1.png to 151.png). It takes about half a minute.<your vault>/.obsidian/plugins/sheiko-pokedex/sprites/ (001.png to 151.png), with a .gitignore that ignores the whole folder. They're checked again each time Obsidian loads them.src/data/gen1.ts is generated from PokeAPI's CSV data by scripts/build_gen1_data.py. It holds names, types, capture rates, evolution links (with each stone) and Red/Blue level-up moves (989 after removing repeats). No images.
To regenerate (needs pokemon_species, pokemon_species_names, pokemon_types, types, pokemon_evolution, items, pokemon_moves, move_names and moves CSVs):
python3 -I scripts/build_gen1_data.py <folder with the CSV files>
See CONTRIBUTING.md for how to report bugs and open pull requests. Best effort. Report issues on GitHub. No response-time guarantee. Developed against TaskNotes 4.13.8 and Sheiko Task Lifecycle 0.2.2.
npm install
npm run build # type-check + bundle to main.js (the release build)
npm run dev # development build, rebuilds on change; includes the test tools below
npm test # Node's built-in test runner, obsidian mocked; no network, no real images
npm run lint
Test tools (development builds only): a npm run dev build adds a Test tools setting with unlimited commands: give the partner 500 XP, give one of each stone, and add any Pokémon. Release builds (npm run build, which the release workflow uses) don't contain them, and a test builds the release bundle and checks.
CI: .github/workflows/ci.yml runs build, lint and test on Node 20, 22 and 24 for every pull request into main and every push to main.
Releases: pushing a version tag (e.g. 1.0.1) runs .github/workflows/release.yml. It checks the tag matches manifest.json, builds and tests, fails if main.js contains any image data, and creates a draft release titled v<tag> with the 3 files. Runs for the same tag queue one at a time, and no second draft is made if a release for the tag already exists. Build provenance is added once the repo is public. Each release's notes are on its GitHub release page.
If you open the repo folder itself as an Obsidian test vault, its .obsidian/, TaskNotes/ and screenshot folders are git-ignored.
src/rarity.ts. They aren't read from your vault.data.json, alongside your Pokedex. A fresh data.json starts with a full pack, and with an empty Pokedex.app.plugins.enabledPlugins, which isn't part of the documented API.src/data/gen1.ts, and therefore main.js, contains data generated from PokeAPI's CSV files. PokeAPI's licence is reproduced below, as its second condition asks. The same notice sits at the end of every built main.js, so it reaches people who install from a release too.
Copyright (c) © 2013–2023 Paul Hallett and PokéAPI contributors (https://github.com/PokeAPI/pokeapi#contributing). Pokémon and Pokémon character names are trademarks of Nintendo.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of PokéAPI nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.