How to Make High-Quality MTG Proxies: A Technical Guide
Disclaimer: The following guide is for educational and proxy-use purposes (e.g., Commander playtesting) only. Creating counterfeit cards for sale as genuine is illegal and violates intellectual property laws.
---
1. The Three Pillars of Proxy Creation
Achieving a "high-quality" result—where the card looks and feels authentic inside a sleeve—relies on three variables:
1. Source Data (Image Quality): Digital garbage in, physical garbage out. 2. Substrate (Cardstock): This determines the "snap" and opacity. 3. Output (Print & Finish): Color accuracy and texture application.
2. Technical Specifications for Digital Assets
Before you print, you must understand the math behind the card. A standard MTG card is 63mm x 88mm.
Resolution and DPI
To match the sharpness of a genuine card printed by Cartamundi, you need a specific pixel density.
- Print Standard: 300 DPI (Dots Per Inch).
- Pixel Dimensions: Approximately 874 x 1243 pixels.
- Color Profile: sRGB IEC61966-2.1 (Standard for web images) vs. CMYK (for industrial printing). For home printing, stick to sRGB but ensure your printer manages colors, not the application.
Sourcing Images (The "Scryfall" API)
Manual downloading is inefficient. As a scraping expert, I recommend utilizing the official Scryfall API for bulk fetching.
Python Script: Bulk Image Fetching
Do not scrape HTML pages (which is brittle and slow); use the Bulk Data endpoint.
import requests
import json import os from PIL import Image from io import BytesIO
def fetch_high_res_cards(card_names, output_dir="proxies_raw"): """ Fetches high-resolution art and crop images from Scryfall. """ if not os.path.exists(output_dir): os.makedirs(output_dir)
for name in card_names: # Use the fuzzy search endpoint search_url = f"https://api.scryfall.com/cards/named?fuzzy={name}" response = requests.get(search_url)
if response.status_code != 200: print(f"Failed to find {name}") continue
data = response.json()
# We want the 'large' or 'png' type for best quality try: # Prefer 'border_crop' for full art proxies or 'large' for normal frames image_url = data.get('image_uris', {}).get('large') or \ data.get('card_faces', [{}])[0].get('image_uris', {}).get('large')
if not image_url: image_url = data.get('image_uris', {}).get('png')
print(f"Downloading {name} from {image_url}...") img_response = requests.get(image_url)
# Save to file filename = f"{output_dir}/{name.replace(' ', '_').replace('/', '-')}.png" with open(filename, 'wb') as f: f.write(img_response.content)
except Exception as e: print(f"Error downloading {name}: {e}")
Example Usage
my_decklist = ["Black Lotus", "Animate Wall", "Force of Will"] fetch_high_res_cards(my_decklist)
3. The Substrate: Paper Selection Secrets
This is where 99% of home proxies fail. Standard printer paper is 80 gsm (roughly 20lb). Real MTG cards are roughly 340 gsm (approx 0.012 inches thick).
The "German Black Core" Standard
In the high-quality proxy community, "German Black Core" or "S30" cardstock is the gold standard. It refers to the opacity of the center layer.
| Paper Type | GSM | Opacity | Use Case | | :--- | :--- | :--- | :--- | | MPC (MakePlayingCards) Standard | 310 | High | Acceptable thickness, glossy finish. | German Black Core (Blue Core) | 350 | Very High | Best for "peel and glue" or hot stamping. | | Canon Presentation Paper | 180 | Medium | Good for temporary playtesting (thin). | | Bristol Cardstock | 270 | Medium-High | Readily available at office supply stores. |
DIY Technique: The Double-Facing Method
If you cannot source 350 gsm cardstock, buy 120lb / 160gsm Matte Cover Stock. You will print the front on one sheet and the back on another, then glue them together with 3M Super 77 Spray Adhesive. This mimics the thickness of a real card and provides the opacity required to prevent "see-through" when held up to a light source.
4. Layout and Alignment
Real cards have a border. You must print this border. If you simply blow up the image to fit the paper, you will cut off the text.
The Toolchain
1. Photoshop / GIMP: Manually align images into a 3x3 grid (A4 or Letter size). 2. Tabletop Simulator / Cockatrice: Export deck images as a sheet. 3. Dedicated Tools: Software like *MPC Autofill* allows you to upload your deck list and it automatically fetches the images and arranges them onto a PDF file sized for A4 or Letter paper, accounting for printer margins (non-printable areas).
5. The Printing Process: Inkjet vs. Laser
There is a massive debate here.
* *Fix:* Use a fusing aid or lower the fusing temperature in the printer settings if available.
* *Fix:* Use Micro-porous pigment ink (like Epson DuraBrite) rather than dye-based ink.
Recommendation: For 2025, a color LaserJet is the superior choice for proxies because you can use a generic generic clear spray coating to seal the toner immediately, whereas inkjet needs hours to dry.
6. The Finish: The Roseart Texture
A freshly printed card feels smooth and slippery. A real card has a specific "linen" finish.
The "Blue Matte" Technique
High-end counterfeiters (and advanced proxy makers) use a specific spray finish known as "Blue Matte" or generic "Clear Matte Acrylic Spray".
1. Print your cards. 2. Cut them out with a guillotine cutter (rotary cutters often fray the edges). 3. Apply 2-3 very light coats of Testors Dullcote or Krylon Crystal Clear Matte. 4. This adds a microscopic texture to the card, mimicking the factory finish.
7. Automated Workflows for "Set" Proxies
If you are creating a "Cube" or an entire set, manual cutting is impossible. Use a CNC machine or a Silhouette/Cricut machine.
Python for CNC (G-Code Generation)
If you have a CNC machine, you can generate the path to cut the cards precisely.
Conceptual script to generate G-Code for cutting cards on a 300mm x 200mm sheet
card_width_mm = 63 margin_mm = 5
Starting position
current_x = margin_mm current_y = margin_mm sheet_width = 210 # A4 sheet_height = 297
def generate_gcode(): print("G21 ; Set units to mm") print("G90 ; Absolute positioning") print("G1 Z5 ; Lift tool")
# Grid Logic cols = int((sheet_width - margin_mm) / (card_width_mm + 5)) # 5mm gap rows = int((sheet_height - margin_mm) / (88 + 5)) # 88mm height + gap
for r in range(rows): for c in range(cols): x = margin_mm + c * (card_width_mm + 5) y = margin_mm + r * (88 + 5)
# Cut path (Square) print(f"G0 X{x} Y{y} ; Move to card {r},{c}") print("G1 Z-2 ; Cut depth") print(f"G1 X{x + card_width_mm}") print(f"G1 Y{y + 88}") print(f"G1 X{x}") print(f"G1 Y{y}") print("G1 Z5 ; Retract")
Note: This is a simplified logic script.
Real-world application requires 'offset' compensation for the cutter diameter.
8. Buying High Quality Proxies vs Making Them
If the technical overhead (sourcing cardstock, calibration, cutting) seems too high, the market for "Custom Commander Tokens" has exploded.
Comparison: DIY vs. Professional Printing
| Feature | DIY (Laserjet + Cardstock) | Professional (MPC/PrinterStudio) | | :--- | :--- | :--- | | Texture | Can be controlled via spray | Standard "Magic" Blue Core | | Cost | High (Initial printer cost, low paper cost) | Medium (Fixed cost per card ~$0.15) | | Turnaround | Immediate | 2-3 Weeks shipping from China | | Legality | Personal use gray area | Personal use gray area |
9. Troubleshooting Common Issues
* *Solution:* Set paper size to "Borderless" in printer driver or use "A3" paper to print A4 size images.
* *Solution:* Verify the pixel dimensions of your source files. If the width is under 500px, it's too low res.
* *Solution:* Use a PVA glue stick (Elmer's) applied thinly across the whole surface for a flexible bond, rather than spray adhesive which can bubble.
Conclusion
Making high-quality MTG proxies in 2025 is less about "art" and more about "engineering." It requires sourcing German Black Core cardstock, utilizing the Scryfall API for lossless image retrieval, and finishing with a matte acrylic sealant to simulate the snap and feel of a genuine Cartamundi product. While buying proxies from vendors is convenient, building your own workflow allows for complete customization of playtesting environments and cube drafting.