Today was about making shareable personality cards that people actually want to post on Instagram. Not just functional, but beautiful. Pokemon-style collectibles with that premium trading card feel. I built them. They’re gorgeous. They also occasionally misspell words.
And I’m okay with that. For now.
The Vision: Instagram-Worthy Personality Cards
After users finish a story and discover their MBTI personality type, they should get something shareable. A collectible card optimized for Instagram Stories (1080 x 1920 pixels) with that premium Pokemon/Magic: The Gathering aesthetic.
The card structure:
- Header: Story title in one compact line
- Scene Image: The ending scene illustration
- Personality Section: MBTI type badge, title, full description
- Footer: Simple CTA directing to WhatIfClassics.com
First attempt: programmatic generation using PIL (Python Imaging Library). Perfect text accuracy, exact layout control, fast generation. But when I looked at the output… it looked like a programmer made it. Functional. Clean. Boring.
Not something you’d want to share. Not collectible.
The Quality Problem
Here’s the thing about social media: aesthetics matter more than perfect spelling. A beautiful card with a minor typo will get shared. An ugly card with perfect text won’t.
I tried the PIL approach first because it was safe. Guaranteed accuracy. But when I actually looked at those cards, I knew they wouldn’t work. They lacked that premium collectible feel—the decorative borders, the holographic shine effect, the authentic trading card aesthetic.
Instagram users wouldn’t share these. They’d skip right past them.
Enter Gemini: Prioritizing Beauty
So I made a choice: use Google’s Gemini AI image generation model (gemini-3-pro-image-preview) instead. Let AI create cards with authentic Pokemon/MTG aesthetics.
The results were stunning. Ornate borders. Professional typography. Glossy card finish. Holographic badge effects. These looked like real trading cards.
Then I noticed the typos.
“YOUR PERSONALSITY IN THE GREAT GATSBBY”
Not personality. PERSONALSITY. Not Gatsby. GATSBBY.
The Trade-off Decision
I could revert to the PIL generator. Perfect spelling, boring visuals. Or I could stick with Gemini. Beautiful aesthetics, occasional typos.
Here’s what I realized: This is a solvable problem. AI text rendering has issues, yes. But those issues aren’t fatal—they’re challenges to work around.
Options I’m exploring:
- Better prompt engineering: More explicit text instructions
- Post-processing: AI generates the card background, programmatically overlay text
- Hybrid approach: AI for decorative elements, programmatic text rendering
- Manual review: For limited card sets, quality check before deployment
The point is: I’m not giving up on beauty just because text accuracy is hard.
What I Learned Today
Don’t settle for “good enough” when your use case demands better. The PIL cards were technically correct. They solved the problem as specified. But they failed at the actual goal: creating shareable moments.
Sometimes the harder path is the right path.
Yes, AI image generation struggles with text. Yes, it adds complexity. Yes, it costs API credits. But the alternative—programmatic cards that look amateurish—defeats the entire purpose of social sharing.
I’d rather solve the text accuracy problem than ship beautiful-but-unusable cards.
The System That Shipped
Collectible card system is live with Gemini AI generation:
Card Features:
- 1080 x 1920 px Instagram Story format
- Authentic Pokemon/MTG collectible aesthetics
- Targeted generation: 2-4 personality types per ending + generic fallback
- Full bilingual support (English + Korean)
- Average 48-80 cards per story pack
Current Status:
- ✅ Gemini generator working and tested
- ✅ Professional collectible card quality achieved
- ⚠️ Text accuracy challenges identified
- 🔄 Iterating on solutions (prompt refinement, post-processing, hybrid approaches)
Workflow:
# Test single card first
python3 core/generate_personality_cards_gemini.py story.json \
--test-single ending_id:TYPE --language en
# Generate full set
python3 core/generate_personality_cards_gemini.py story.json --language en
What’s Next
I’m not shipping cards with typos to users. But I’m also not settling for ugly cards just because they’re easier.
The next session: explore text correction approaches. Post-processing overlays. Better prompts. Manual review workflows for limited card sets. Find the solution that gets both beauty and accuracy.
Because that’s what social sharing demands: cards so beautiful people want to share them, and text so accurate they’re not embarrassed to.
Sometimes you don’t get to choose between fast, good, and cheap. Sometimes you need all three. That’s when the real problem-solving begins.
Update: Gemini 3 Pro Image Preview
After the initial implementation, I upgraded the entire image generation pipeline to Gemini 3 Pro Image Preview - Google’s latest multimodal model with significantly improved image quality and better text rendering capabilities.
Key Improvements:
- ✅ Better Quality: Premium image generation with enhanced details and consistency
- ✅ Improved Text: More accurate text rendering compared to previous models
- ✅ WebP Output: Automatic PNG → WebP conversion (quality=85) for 95%+ file size reduction
- ✅ Full Pipeline: All images (style guides, characters, scenes, personality cards) now use Gemini 3 Pro
- ✅ Text Generation: Story JSON and translations upgraded to Gemini 3 Pro for better coherence
Performance Impact:
- Image quality: Significantly improved with better prompt adherence
- File sizes: <200KB per card (down from 1-2MB PNG)
- Page load times: Faster delivery with WebP format
- Generation speed: Similar to previous model
The text accuracy challenges mentioned in the original post have largely been addressed by the newer model’s improved text rendering. While not perfect, Gemini 3 Pro Image Preview handles typography and text layout significantly better than earlier versions.
What If Classics is an interactive storytelling platform turning classic literature into choice-driven experiences. Each story takes 3-5 minutes to play but branches into dozens of unique endings. Follow the journey at whatifclassics.com.