Learn How To Create & Launch Your Own AI-Generated Collection
It’s not going to be a standard tutorial. I should call it a “journey” as it is a process of discovery, trial & error, and not just a summary of the final result.
If you need a simple copy&paste solution – it will be accessible to the CryptoPensioner NFT holders.
The Idea
How It All Started
I want to create an original NFT collection that would become CryptoPensioner’s first utility project and a key to everything I have planned. Most NFT projects care very little about the creative part and focus on promising amazing futures that they most likely never deliver.
The primary purpose of this collection is to provide access to a gated community and all my crazy projects, growth tactics, templates, and more. However, I also aim to focus on the artistic aspect and create an appealing visual experience. While I’ve come across AI-generated NFTs, they often lack the distinctive element that makes NFT minting enjoyable: unique and identifiable traits.
Here’re my initial criteria:
I know my way around Photoshop, but I’m not a graphic designer and I don’t want to get anyone else involved in this (yet!) so the only reasonable choice is to use one of the AI image-generation tools. My first thought was StableDiffusion with custom API and functionality for the community to include custom prompts when minting, but my black hat mind gave me 100 reasons why this is a bad idea. My second choice was MidJourney so that’s what I’m going to use.
There are some great blockchains that come packed full of tools and programming solutions, but I’m lazy and I don’t have time to learn another ecosystem or programming language. I was wondering about building it on Solana (I have high hopes for the Rust language), but my choice is going to affect all my future projects so something using the Solidity language makes more sense.
Polygon ticks all the boxes: it has low fees, it uses Solidity, it’s a stable project with multiple big players involved, and an expanding ecosystem with some futures I’m going to need very soon 😉
Getting Creative With MidJourney
Generating Images By Hand
My plan is simple: I’m going to play around with prompts until I find something I like and then tweak it, and add some elements for rarity.
Following every other NFT collection out there – I thought I needed a cartoon-style image of something with only small elements changing. It sounded simple but turned out to be a nightmare… AI generators are not intelligent and are not as good as ChatGPT at understanding complex sentences. There’s too much randomness (or not enough when you use seed phrases). I can’t simply generate a character and say “Add a yellow t-shirt without changing anything else”. It’s not able to do that yet.
Or let’s make it more accurate: it is able to do that, but you need to spend some time trying and generating it over and over again until you get the effect you need. It’s definitely doable, but I need a fast and repetitive solution. I’m willing to get my hands dirty, but as a growth hacker – I just can’t accept doing repetitive things by hand.
Here are my initial attempts at creating a “crypto pensioner”:




As you can see, this was not usable.
I have tried different graphic styles and experimented with the prompts until I came up with this:




It’s much more consistent, has a cool look and a semi-unique feel to it. But the “ape” angle was beaten to death in NFT space already. I needed something worthy of the “CryptoPensioner” name!
I went a completely different direction and tried a photorealistic approach with… PENSIONERS!




I was pretty sure I had something here, but the whole “crypto” thing turned out to be a total wild card. I’ve tried every possible combination to get MidJourney to include a Bitcoin logo as a pin on their clothes, or a coin in their hand, or even just something crypto-related in the background. It only worked sporadically, and if I kept going at this rate, it would take an eternity to do it for every single image.
I have decided to drop the “crypto angle” and focus on a specific style instead. Eventually, I got something consistent that I liked:

Yes, I know. The size and style of the circles are not consistent, but that’s not the point here. The art style is consistent enough to be recognizable and it’s completely different from all other collections, plus the most important part – I like it 😉
I have a “style”, now I need to come up with some variations to make it interesting: gender, age, race. I can also include accessories like a hat, jewelry, or tattoos. Face expressions, haircut, clothing style, etc. With some clever prompting, it may actually work!
I decided to add animals, monsters, robots, and aliens to the mix. Just to show you how much effort went into tweaking those prompts – I ended up generating over 2,500 images to get the results I want.
Let’s Automate MidJourney
How I Generated 10k+ Unique Images Using Python and MidJourney & Turned Them Into Mint Ready NFT Collection
My first thought was to generate images by hand, download them all directly from MidJourney’s account, and create a metadata file using Excel formulas. As you probably guessed – that didn’t work very well…
MidJourney has limits… There’s an option to download images in bulk from your MJ account, but you need to lazy-load them first (scroll down while new images load) and MJ crashes at 1,751. It seems like a high number, but not when you need 10k+. MJ’s backend stops loading new images, you get an error, the page reloads automatically and you can start scrolling from the beginning again. MidJourney doesn’t have any API so the choices are:
– work through batches (under 1,751…) of images, download, remove, repeat OR
– download them directly from Discord
I quickly came to the conclusion that there was no way in hell I’m going to get anywhere doing this by hand.
Here’s what I need:
- Prompting
- Generate prompts with features based on specific probabilities in a consistent way.
- Save each feature in some easy-to-use format and use it as a base for NFT metadata files
- Use generated prompts to create images with MidJourney (and match it to specific metadata)
- Downloading
- Wait for the image to finish generating
- Save the upscaled image
- Cut the image into 4 parts and save it as separate files (no need to upscale each version separately, you can generate a high-res preview and cut it into 4 separate images)
- Prepare NFTs
- Rename the image files and create NFT-ready metadata files
- Upload to IPFS
- Create Polygon smart contract & run it on testnet
- Go live on Mainnet
- Start the official mint
- Utility
Let’s start with prompt generation. The main “category” I’m going to start with is “Being”. Here are the probabilities I’m going to use for the Prompt Generator:
- Human (60%)
- Animal (20%)
- Monster (10%)
- Alien (5%)
- Robot (5%)

Prompt Generation
To create my generator, I’m going to use Python programming language. I don’t know it, but together with Google and ChatGPT, I think I can manage to get some simple tasks done.
First, we need a way to store all features to use them in the generator:
feature = {
"name": '',
"description": '',
"image": '',
"external_url": '',
"Being": '',
"Race": '',
"Ethnicity": '',
"Species": '',
"Gender": '',
"Mood": '',
"Expression": '',
"Type": '',
"Age": '',
"Beard": '',
"Hair": '',
"Style": '',
"Glasses": '',
"Tattoos": '',
"Jewelry": '',
"Earrings": '',
"Hat": '',
"Status": ''
}
You can use whatever you want here, just make sure you have “name”, “description” and “image”. Those are mandatory fields for metadata files and you will need to add them anyway.
Next, I need a function for updating those features:
# Update feature - short and sweet ;)
def update_feature(name, value):
feature[name] = value
I want my generator to not only create a whole prompt but to follow my probability settings for each feature. To achieve this, I’m going to use “weights” from a built-in library, called “random”.
import random
# Feature: Being
being_choice = random.choices(['Human', 'Animal', 'Monster', 'Alien', 'Robot'], weights=[0.6, 0.2, 0.1, 0.05, 0.05])[0]
update_feature("Being", being_choice)
Weights work as percentages. The sum of all weights (in a given random.choices() function) should always add up to 1.0. When you create your own features, make sure to have a weight assigned to every string. Weird things will happen if you mess this up.
Disclaimer: for those of you who are perpetually offended – there are no hidden motives here and no *ist or *phobic agenda. I picked a bunch of random features. That’s it. If it makes you feel a certain way – get some help.
- Humans
- White
- Polish
- German
- Russian
- French
- Italian
- Spanish
- Swedish
- Dutch
- Scottish
- Hungarian
- Black
- American
- Zulu
- Maasai
- Hadzabe
- Dogon
- Yoruba
- Asian
- Chinese
- Japanese
- Korean
- Thai
- Indian
- Filipino
- Mongol
- Arab
- Indigenous
- Maori
- Aboriginal
- Navajo
- Cherokee
- Apache
- Lakota
- White
- Animals
- Gorilla
- Raccoon
- Lion
- Chimp
- Elephant
- Cat
- Dog
- Dolphin
- Unicorn
- Monsters
- Zombie
- Vampire
- Werewolf
- Demon
- Ghost
- Mummy
- Dragon
- Aliens
- Gray
- Reptilian
- Nordic
- Martian
- Xenomorph
- Zeta Reticulan
- Robots
- Android
- Cyborg
- Industrial
- Service
- Mecha
- Battle