Compare NetrunnerDB decklists against local card collection and generate PDF proxies
Project description
Simulchip - Netrunner Proxy Library
A Python library for comparing NetrunnerDB decklists against your local card collection and generating print-ready PDF proxy sheets for missing cards.
I just started playing Netrunner about a month ago when I purchased a copy of System Gateway and Elevation. I love the game and I quickly realized that if I wanted to play in paper, I'd probably have to play Standard. And if I wanted to play Standard, I would need to proxy quite a bit of cards. Enter Simulchip: an easy way to manage your collection and proxy missing cards.
This work is heavily inspired by some work I did for Marvel Champions to solve a similar problem. I've kept that work private over concerns about Marvel and FFG copyrights. However, with Null Signal Games supporting the game and proxies not only being legal but encouraged, I thought it was time to bring this all together here.
The result is a clean, efficient Python library and CLI tool that does exactly what it says help you print the proxies that you need.
Features
- 🃏 Smart Decklist Input: Accept full NetrunnerDB URLs or deck IDs
- 📦 Interactive Collection Management: Rich terminal interface for managing packs and cards
- 🎨 High-Quality Proxies: Generate PDFs with actual card images from NetrunnerDB
- 🖼️ Alternate Printing Selection: Choose between different card printings interactively
- 📐 Perfect Dimensions: Cards sized exactly to Netrunner specifications (63mm x 88mm)
- ✂️ Cut Guidelines: Dashed lines show exactly where to cut for perfect cards
- 💾 Smart Caching: Downloads card data and images once, reuses for speed and to be as nice as possible to NRDB apis
- 🏷️ Identity-Based Organization: Files organized by identity names for easy browsing
- 🔍 Advanced Filtering: Search and filter collections with real-time updates
- 📊 Batch Processing: Generate proxies for multiple decks at once
- 🐍 Pure Python: Clean library architecture with CLI as a lightweight interface
Installation
Install simulchip from PyPI using pip:
pip install simulchip
After installation, you'll have both the Python library and the simulchip command-line tool available.
Requirements:
- Python 3.10 or higher
- Compatible with Python 3.10, 3.11, 3.12, and 3.13
Quick Start
1. Initialize Your Collection
# Initialize a new collection
simulchip collect init
# Interactively manage packs in your collection
simulchip collect packs
# Interactively manage individual cards
simulchip collect cards
2. Generate Proxy Sheets
# Generate proxies for a deck
simulchip proxy https://netrunnerdb.com/en/decklist/7a9e2d43-bd55-45d0-bd2c-99cad2d17d4c
# Compare a deck against your collection (no PDF generation)
simulchip proxy https://netrunnerdb.com/en/decklist/7a9e2d43-bd55-45d0-bd2c-99cad2d17d4c --compare-only
3. Interactive Management
The collection commands provide rich terminal interfaces with filtering, navigation, and real-time updates:
# Manage packs with filtering and search
simulchip collect packs
# Manage individual cards with detailed controls
simulchip collect cards
# View collection statistics
simulchip collect stats
Command-Line Interface
The simulchip CLI is the primary interface for managing your collection and generating proxy sheets.
Collection Management
# Initialize a new collection (creates ~/.simulchip/collection.toml)
simulchip collect init
# Interactive pack management with filtering and navigation
simulchip collect packs
# Interactive card management with filtering and navigation
simulchip collect cards
# Show collection statistics
simulchip collect stats
# Reset collection data and re-download pack/card information
simulchip collect reset
# Use a custom collection file
simulchip collect init --collection ./my-collection.toml
simulchip collect packs --collection ./my-collection.toml
Proxy Generation
# Generate proxies for a single deck
simulchip proxy https://netrunnerdb.com/en/decklist/7a9e2d43-bd55-45d0-bd2c-99cad2d17d4c
# Generate proxies using deck ID only
simulchip proxy 7a9e2d43-bd55-45d0-bd2c-99cad2d17d4c
# Compare a deck against your collection (no PDF generation)
simulchip proxy DECK_ID --compare-only
# Generate proxies for all cards (not just missing ones)
simulchip proxy DECK_ID --all
# Skip downloading card images for faster generation
simulchip proxy DECK_ID --no-images
# Interactive alternate printing selection
simulchip proxy DECK_ID --alternate-prints
# Custom output path
simulchip proxy DECK_ID --output ./my-proxies/deck.pdf
# Use custom collection file
simulchip proxy DECK_ID --collection ./my-collection.toml
Proxy Output Structure
By default, proxy PDFs are saved to decks/ with the following structure based on identity names:
decks/
├── corporation/
│ └── weyland-consortium-building-a-better-world/
│ └── my-deck-name.pdf
└── runner/
└── zahya-sadeghi-versatile-smuggler/
└── my-runner-deck.pdf
This creates meaningful folder names based on the actual identity cards rather than NetrunnerDB UUIDs.
CLI Configuration
The CLI uses ~/.simulchip/collection.toml as the default collection file. You can override this with the --collection flag on most commands.
Interactive Features
- Rich Terminal Interface: Color-coded tables with dynamic viewport sizing
- Real-time Filtering: Type to filter packs/cards with instant updates
- Keyboard Navigation: Arrow keys, page up/down, vim-style shortcuts
- Batch Operations: Toggle multiple packs/cards at once
- Platform Support: Works on Windows, macOS, and Linux
Python Library
Simulchip also provides a comprehensive Python library for building custom tools and integrations.
Quick Library Example
from simulchip.api.netrunnerdb import NetrunnerDBAPI
from simulchip.collection.operations import get_or_create_manager
from simulchip.comparison import DecklistComparer
from simulchip.pdf.generator import ProxyPDFGenerator
from pathlib import Path
# Initialize components
api = NetrunnerDBAPI()
collection = get_or_create_manager(Path("collection.toml"), api)
# Compare a deck
comparer = DecklistComparer(api, collection)
result = comparer.compare_decklist("7a9e2d43-bd55-45d0-bd2c-99cad2d17d4c")
# Generate proxies
if result.stats.missing_cards > 0:
pdf_gen = ProxyPDFGenerator(api)
proxy_cards = comparer.get_proxy_cards_for_generation(result, all_cards=False)
pdf_gen.generate_proxy_pdf(proxy_cards, Path("proxies.pdf"))
Library Documentation
For detailed library documentation, API reference, and advanced usage:
The library includes modules for:
- API Integration (
simulchip.api) - NetrunnerDB communication - Collection Management (
simulchip.collection) - Local collection handling - Deck Comparison (
simulchip.comparison) - Deck analysis and comparison - PDF Generation (
simulchip.pdf) - Proxy sheet creation - Utilities (
simulchip.filters,simulchip.display, etc.) - Helper functions
Collection File Format
Your collection is stored in a simple TOML file with a new simplified structure:
# Own entire packs (3 copies of each card)
packs = [
"core", # Core Set
"sg", # System Gateway
"elev", # Elevation
"ms", # Midnight Sun
]
# Card differences from pack defaults (optional)
[card_diffs]
"01016" = -1 # Missing 1 copy of Account Siphon (have 2 instead of 3)
"22001" = 1 # Extra promo card (have 1 instead of 0)
"34080" = -3 # Lost all copies to Cupellation!
The new format uses card differences (deltas) instead of absolute quantities, making it easier to track changes from the standard 3-per-pack default.
Architecture
Simulchip follows a clean separation between the library and CLI:
- CLI (
cli/) - Lightweight terminal interface with interactive features - Library (
simulchip/) - Core business logic and utilities
This design ensures the library can be used in any Python application while the CLI provides an excellent user experience for common tasks.
Finding Pack and Card Codes
Pack Codes
# List all available packs
api = NetrunnerDBAPI()
packs = api.get_all_packs()
for pack in sorted(packs, key=lambda p: p.get("date_release", ""), reverse=True):
print(f"{pack['code']}: {pack['name']}")
Common pack codes:
core- Core Setsg- System Gatewayelev- Elevationms- Midnight Sunsu21- System Update 2021
Card Codes
Card codes follow the format: PPNNN where:
PP= Pack number (01 = Core Set, 30 = System Gateway, etc.)NNN= Card number within pack
Examples: 01001 (Noise), 30010 (Zahya), 33004 (Steelskin Scarring)
PDF Features
- Exact Card Size: 63mm × 88mm (official Netrunner dimensions)
- 3×3 Grid Layout: 9 cards per page, optimized for letter paper
- Cut Guidelines: Dashed lines show exactly where to cut
- Real Card Images: Downloads actual artwork from NetrunnerDB
- Smart Fallback: Text placeholders for cards without images
- High Quality: Vector graphics for clean printing
Development
Development Installation
For development work, clone the repository and install in editable mode:
git clone https://github.com/dfiru/simulchip.git
cd simulchip
pip install -e ".[dev]"
This installs all development dependencies including testing, linting, and documentation tools.
Dependencies
requests- HTTP requests to NetrunnerDB APIreportlab- PDF generationPillow- Image processingtoml- TOML file supporttyper- CLI frameworkrich- Terminal UIrich-pixels- Terminal image rendering
Documentation
- API Documentation: https://dfiru.github.io/simulchip/
- Contributing Guide: CONTRIBUTING.md
- Code of Conduct: CODE_OF_CONDUCT.md
Contributing
We welcome contributions! Please see CONTRIBUTING.md for detailed guidelines on how to contribute to this project.
License
MIT License - see LICENSE file for details.
Acknowledgments
- Card data and images from NetrunnerDB
- Inspired by the Netrunner community's need for accessible proxy printing
- Built with love for the best card game ever made ❤️
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file simulchip-0.2.tar.gz.
File metadata
- Download URL: simulchip-0.2.tar.gz
- Upload date:
- Size: 83.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf305ac41f3291e62df9eaf17acff22d9cb7f38b53b59cee70bce0e42bdd0259
|
|
| MD5 |
2a355dff212419f7c2562a726e6e8433
|
|
| BLAKE2b-256 |
fa56444a70ce50ab4a14fb788ea516fe813e32239e95daff115ea170c7cf6fa9
|
Provenance
The following attestation bundles were made for simulchip-0.2.tar.gz:
Publisher:
publish.yml on dfiru/simulchip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
simulchip-0.2.tar.gz -
Subject digest:
bf305ac41f3291e62df9eaf17acff22d9cb7f38b53b59cee70bce0e42bdd0259 - Sigstore transparency entry: 294728791
- Sigstore integration time:
-
Permalink:
dfiru/simulchip@2343ea37a7515b384241913fbff46562d62ca968 -
Branch / Tag:
refs/tags/0.2.0 - Owner: https://github.com/dfiru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2343ea37a7515b384241913fbff46562d62ca968 -
Trigger Event:
push
-
Statement type:
File details
Details for the file simulchip-0.2-py3-none-any.whl.
File metadata
- Download URL: simulchip-0.2-py3-none-any.whl
- Upload date:
- Size: 65.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c58bd379ebb87adf30d030bc4fe9af72a11daf1f2142b3bf4b71ef53a401a32
|
|
| MD5 |
814e58b00b4c5f111b2ade9e7536d762
|
|
| BLAKE2b-256 |
3698f9c7b73f62e07670987e836c3489609f41affa123dbeae6c9679529f7089
|
Provenance
The following attestation bundles were made for simulchip-0.2-py3-none-any.whl:
Publisher:
publish.yml on dfiru/simulchip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
simulchip-0.2-py3-none-any.whl -
Subject digest:
1c58bd379ebb87adf30d030bc4fe9af72a11daf1f2142b3bf4b71ef53a401a32 - Sigstore transparency entry: 294728798
- Sigstore integration time:
-
Permalink:
dfiru/simulchip@2343ea37a7515b384241913fbff46562d62ca968 -
Branch / Tag:
refs/tags/0.2.0 - Owner: https://github.com/dfiru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2343ea37a7515b384241913fbff46562d62ca968 -
Trigger Event:
push
-
Statement type: