A step-by-step guide
After countless conversations, questions, and discussions around how to create ordinals inscriptions —questions like “What’s the best method?”, “How do you do it?”, or even “Where should I start?” — I realized there’s a real need for a clear and practical resource.
Every artist works differently, and there’s no single right way to do things. But sharing tips and ideas can help others find what works best for them.
That’s why I decided to create this guide: “Releasing Your Long-Form Generative Art Collection: Step-by-Step.” It serves as a foundational step-by-step walkthrough since the process is more or less the same for everyone. Along the way, I’ve added my own insights, interesting details, and tips at every step to make it as comprehensive and practical as possible.
This guide is my way of giving back — sharing what I’ve learned in the simplest, clearest way possible. Whether you’re a beginner or more advanced artist with experience on other blockchains, I hope it helps you navigate the process, solve problems, and explore different options.
I’m grateful for the chance to share my experience and hope this guide makes your journey with ordinals easier and more enjoyable.
Ordinals and inscriptions may seem difficult to understand at first glance. But once grasp the idea, you realize it’s just guerrilla coding on some precious satoshis (smallest chunks of Bitcoin).
Let’s go!
DISCLAIMER: This website is a work in progress. As protocols and platforms evolve and new solutions are introduced, things might change. I’ll do my best to keep it up to date, but please always Do Your Own Research, search multiple sources, and probably test.
Table of contents
- Introduction
- Boilerplate
- Coding software
- Minification
- Testing your code on-chain
- Wallet
- Inscribing
- Rare/Exotic/Special Sats
- Parent-Child Provenance
- Setting Up Collection
- Royalties
- Indexing on ME
- FAQ
- Useful links
1. Introduction
I like to think of Ordinals as a clumsy, yet permanent file system with access to blockchain data. If you can run your project on your local server (or even straight from .HTML file) — you should be good to go.
Important part is that inscriptions are sandboxed. It means you can’t fetch any off-chain content — it will be blocked. It’s necessary to inscribe every needed asset or use an already inscribed one (e.g. creative libraries like P5.js or three.js).
NOTE: If you want to reference an on-chain file you link it by src='/content/_inscription_ID'
instead of your regular src='script.js'
or src='image.jpg'
. File type is stored in inscription metadata.
NOTE: For testing you can use src='https://ordinals.com/content/inscriptionID'
.
Before inscribing, remember to remove https://ordinals.com
from the link.
Only '/content/inscriptionID'
should remain!
Example: src='/content/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0'
Collections on Ordinals are a set of individual inscriptions. When we’re talking about long-form generative art collection, we definitely want to use and re-use the same code.
- Full code
First generative collections on Ordinals were the files inscribed individually — they either used inscription ID or a custom seed to differentiate outputs. It means that every inscription carries full code. While it’s still a viable option, it generates high cost of inscribing and bloats the blockchain. Also, there was no way to use large creative libraries, because of inscription size limitation ~370 kB.
- Recursion
Soon after the recursion was introduced, it became possible to reference other on-chain files. Creators would inscribe code as a .JS file and each inscription would be a separate .HTML referencing that code. This solution allows to create not only long-form collections, but also curated outputs. Depending on the code we could assign seed values or even specific features to each inscription individually.
- Delegated inscriptions
Currently, the most affordable and simplest way to create a collection is by the use of delegated inscriptions. Delegates are simply pointers to the original inscription or, in other words, instances of it. While they are treated as separate entities, but they don’t replicate all the data of the original. Because of this feature, it’s the most affordable and simplest way to create a collection. Creator just needs one properly prepared file with the necessary code.
This is the solution Gamma uses on their platform and this is the one we’ll focus on here.
2. Boilerplate
Below you will find a boilerplate HTML file that will help you to start with the project.
It uses P5.js library inscribed by @Lifofifo. There’s a lot of comments that explain snippets.
NOTE: Make sure you read all the comments before deleting them — they’re really helpful!
Fundamental thing about the boilerplate is that it uses
let inscription_id = window.location.pathname.split("/").pop();
to get the unique inscription ID. This hash can be later used as a source for PRNG (PseudoRandom Number Generator) for your project. [source: Ordinals docs]
Download P5.js boilerplate:
Download vanilla JavaScript boilerplate:
Boilerplate and batch inscriptions instructions by Lifofifo:
If you have experience from some Ethereum or Tezos platforms, you’re most likely familiar with ZIP files. Unfortunately, it’s not as easy on Bitcoin. Ordinals use single files with their type stored in metadata. Therefore always inscribe your files with proper extensions: websites with .HTML, and scripts with .JS.
At the moment, there’s no solution to set a thumbnail generation. Your code will be displayed as you designed it. If it’s an animation, it will run forever. I share more details about collection thumbnails in Indexing on ME chapter.
3. Coding software
NOTE: I use Visual Studio Code, which is probably one of the most popular coding software out there. For local server I use Live Server plugin for VSC and Servez for some tasks.
Yet, I know people were good with on-line editors, like P5 Editor or Code Pen.
As this guide does not cover coding itself, I won’t elaborate on the subject.
If you’re an absolute beginner, you’ll find a short list of useful links at the bottom of this page.
4. Minification
As I mentioned before, you need one HTML file.
The smaller the file, the lower the cost of inscribing. It’s actually very similar to Art Blocks. On AB the code was also uploaded on-chain, which was the biggest cost of the release (unless the description was larger!).
I like to use minification in my projects. Right now I even code in certain ways that help to minify better.
There are multiple ways you can minify your code. If you’re a CSS or HTML artist, you definitely want to do your research on the subject or search for such tools online. I’ll focus on JavaScript here.
NOTE: I use JavaScript Minify Tool by DigitalOcean.
If you’re using P5.js or any other library that needs certain function names, I’d suggest checking keep_fnames
setting. It’s also worth testing with toplevel
checked; this setting will shorten your variable names saving a lot of precious blockchain space and inscribing fees.
On the other hand, some artists treat code as a statement and don’t minify it. That’s a completely personal decision and it’s up to you!
NOTE: Finally, there’s also a way to compress your code with Brotli at the Inscribing stage.
5. Testing your code on-chain
Once you have the file, you most likely want to check how it behaves on-chain, on most popular platforms, and maybe even devices. There’s a tool inscribed by @Lifofifo and it simply uses eval
for what you paste. Completely locally, so you don’t share your artwork anywhere.
Links are similar (link to the same inscription), but it’s very important to test it on all sites. If there are any link or recursion issues in your code, it will work on one website, but not the other.
Simply copy and paste your whole code (minified or not) after you open these links.
First inscription 84c6c14df816032d0cd4ade05674bae4c652b98920108149e2129eea644b6fcbi0 — the older one, but works with 99% of the projects:
Second inscription c24b53e7733d72a8662676bd2067fa7e715fa5c2ea614b7727da9787def47aeai0 — the newer version with some bugs fixed
Checklist:
1. Outputs should always be identical when testing with all links for the first inscription — it has to look the same on Ordinals, Ord, Gamma, and Magic Eden.
2. Outputs should be different when testing with first and second inscription — both inscriptions will provide different inscription_ID
for your code, so there should be difference.
To be honest, there’s one more way of testing, but it requires way more technical involvement. So I’m just linking to docs: https://docs.ordinals.com/guides/testing.html
6. Wallet
Once you have the file tested and ready, you need to inscribe it on Bitcoin. And for inscribing you need a wallet for inscription payment and storage.
For beginners I’d suggest Xverse, because it’s the most convenient for creators at this moment. It’s also widely adopted. There are other legendary options like Leather or Unisat that are worth looking into, and at some point you might want (or even need) to check them too.
DOWNLOAD ONLY FROM TRUSTED RESOURCES! I don’t share any links to wallets on purpose.
When you install Xverse, you’ll see 2 addresses. Actually more, but let’s focus on 2 that are needed.
Ordinals are like drawings on Bitcoin.
There’s one address for storing your “liquidity” or “payment” Bitcoin. That address usually start with 3...
(aka Nested SegWit) or bc1q...
(aka Native SegWit). If you wonder which to choose from the two above — go with bc1q...
Native SegWit, because the cost of transaction is lower with that one. It might not matter at the moment, but definitely will one day.
And the other address for storing your Ordinals (Bitcoin “chunks” with inscriptions on them) starts with bc1p...
(aka Taproot).
NOTE: Native SegWit and Taproot addresses look very similar. One begins with bc1q...
and the other one with bc1p...
. p
vs q
— the difference is small, but significant in terms of where your funds and collectibles are.
You’ll need some funds to inscribe on the Bitcoin address. I’ll show the way to get the estimation in the next chapter. It might also be a good idea to get some extra liquidity to mint/inscribe some of your own artworks. Overall, you’re the creator!
Funds from sale will go directly to the payment address, or any other address that you’ll set on Gamma.
7. Inscribing
Here comes the hard and exciting part.
WARNING! This step is highly addictive — many who have inscribed once, couldn’t stop there!
For Gamma Collection or Prints you need an “Original”. That’s the piece you don’t sell, it stays in your wallet. You can auction it later, keep it for special occasion (Sotheby’s or Christie’s one day!) or gift it to someone. No need to rush the decision!
But how to get that Original?
And another important question, how many funds do you need?
The cost of inscription depends on the current blockchain fees and the situation in the the mempool.
NOTE: Observe the mempool daily for a while and try to predict.
There is no good answer, but with time, it’s easier to see patterns. Weekends, Sunday mornings especially, are usually slower and fees are lower.
However fee spikes can happen any time and push your transaction back in the queue.
There are multiple platforms that allow inscribing. I’ll share the most straightforward ones.
- Unisat.io — so far the simplest and most affordable I have found. It’s absolutely the simplest way of inscribing — no exotic sats, no parent-child provenance. Simple inscription with your data stored on the blockchain.
First you need to choose “File” and then choose the file you want to inscribe.
Scroll down and you’ll see the cost estimation.
- OrdinalsBot.com — a very nice one. A bit more expensive, but with some extra features.
It looks very similar, you just need to choose the file to inscribe and you will get the estimation.
- Inscribe.dev — a great tool developed by @Lifofifo. No fees for Wizards of Ord holders and a ton of custom, advanced settings. Absolute gem for Ordinals aficionados!
- Chisel.xyz — a very nice one, with more advanced features like Bring Your Own Sats, Parent-Child provenance, etc.
- Sating.io — a very nice one, with more advanced features like Bring Your Own Sats, Parent-Child provenance, etc.
- Luminex.io — also a good and intuitive solution, yet probably the most expensive of the above. So an honorable mention for fairly affordable way to do re-inscriptions and delegates (for testing).
On the platforms above you can find a Compression
checkbox. It refers to Brotli compression that should be natively supported by ordinal explorers. It reduces the file size (therefore the fees) and requires no additional work.
Examples from OrdinalsBot, Chisel, and Inscribe.dev:
8. Rare/Exotic/Special Sats
You’re still here — congratulations!
The next two chapters will be about some perks of Ordinals protocol. They are considered important, but since you’re the artist, it’s up to you if you want to dive in.
NOTE: When inscribing you can choose — so called — Rare Sats or Rare Satoshis or Special Sats or Exotic Sats…
It all sounds confusing, but the idea is very simple. The same as we have bills or coins with various serial numbers, there are satoshis that have a special place in history or are rarer than other.
Some are based on a rarity system and other were used in some historically important Bitcoin events like buying first Pizza for Bitcoin or sending first TX from Satoshi Nakamoto to Hal Finney. Always worth checking official protocol docs for more info: https://docs.ordinals.com/overview.html#rarity
Less technical resources about special sats:
- https://blog.gamma.io/special-sats-and-ordinals
- https://support.gamma.io/hc/en-us/articles/28511767752851-Minting-on-Special-Sats
- https://magisat.io/blog/rare-sats/
NOTE: You can choose them while inscribing on OrdinalsBot or other platform. It will affect the price of inscription.
Some are quite affordable, costing just a few dollars, while others can significantly impact inscription costs (e.g., Uncommon sats add around $90, and Blacks about $50 on OrdinalsBot).
That’s the feature that will apply to your Original only. It won’t transfer to Prints, Collection Editions, and won’t influence them in any manner.
It’s a collectible thing. Is it valued by collectors? By some — yes, it is.
9. Parent-Child Provenance
The second thing is Parent-Child provenance.
It’s a more complicated thing. I’ll try to be as brief as I can be.
Basically, there are no smart contracts on Bitcoin, so there is nothing that “gathers” all inscriptions in one place.
Parent-Child provenance solves this issue.
You choose one inscription that is going to be the parent for the next inscriptions. This way we can track the provenance.
NOTE: However, there’s only one platform that supports “mint on demand” with P-C provenance and it’s not perfect. Technically, it’s a demanding and not very secure solution, if you care for “mint on demand” mechanics, which in some cases is crucial.
The one thing you can certainly do, is to get your “Original” as a Child of your top Parent.
The structure some artists use is:
Level 0 — artist parent inscription, aka artist’s seal (e.g. avatar)
Level 1 — collection inscription (separate parent for every collection/project)
Level 2 — individual inscriptions of collections
Harvey Rayner explained it really well in his post.
10. Setting Up Collection
Gamma.io
NOTE: Tutorials use the term “editions”, which is typically understood to mean identical copies. However, with the boilerplate code, each edition will be unique.
Official video guide:
https://support.gamma.io/hc/en-us/articles/30072838203539–How-to-launch-an-Editions-Ordinal-collection
Official article:
https://support.gamma.io/hc/en-us/articles/26044941711635-How-to-create-an-Ordinals-Editions-collection-mint
11. Royalties
There are no royalties on Ordinals.
Or at least no way to enforce them. Bitcoin doesn’t support smart contracts, so there is no technical way to enforce split payment.
NOTE: However, you can set royalties percentage on Gamma, and Tip address on ME. Royalties on Gamma are mandatory, while tips on ME depend solely on collector’s good will.
12. Indexing on ME
Once your collection is published, collectors are fighting for whitelists, and you’re bathing in the glory of a well-earned success, there’s one last step.
That is indexing your collection on other platforms. And from my experience — usually the data is fetched from Magic Eden, so one proper indexing fixes them all.
NOTE: Indexing is sometimes also called Listing. However, listing seems more familiar with the act of setting an Ordinal for sale, so let’s call it Indexing here.
Is that step necessary? Absolutely not. Usually every platform that supports the release also allows for secondary market and that is perfectly fine.
NOTE: However, indexing became a bit of a standard to recognize your collectible in wallets, and even communities, like Discord Servers.
You can update your indexed collection in the future with traits, new thumbnails, other details.
For most of these places you will need a JSON with a list of the inscriptions.
How to index your collection on Magic Eden official guide:
https://help.magiceden.io/en/articles/8075661-listing-your-bitcoin-ordinals-collection-with-creator-hub
How to prepare JSON file official guide:
https://help.magiceden.io/en/articles/7957891-listing-your-bitcoin-ordinals-collection-on-magic-eden
Here’s a sample JSON for just 1 inscription:
[
{
"id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0__inscription_ID_of_01",
"meta": {
"name": "My Project #01",
"high_res_img_url": "https://example.com/project_hi_res_01.jpg",
"collection_page_img_url": "https://example.com/project_collection_01.jpg",
"attributes": [
{
"trait_type": "Trait #1 Name",
"value": "Trait #1 Value for Artwork #01"
},{
"trait_type": "Trait #2 Name",
"value": "Trait #2 Value for Artwork #01"
}
]
}
}
]
IMPORTANT: ME automatically generates thumbnails for generative inscriptions. However, with slowly revealing, animated, or hardware heavy artworks they might not be right. Luckily there’s a way to use an off-chain image (just store it somewhere accessible). It improves collector’s experience while browsing hundreds of outputs that, otherwise, would run simultaneously.
Above articles don’t mention the difference between high_res_img_url
and collection_page_img_url
, which is crucial:
high_res_img_url
— provides an off-chain image for both collection and individual inscription pagecollection_page_img_url
— provides an off-chain image only for collection page; when single inscription (detail) page is opened, the original content (script) launches; much better solution for animated and interactive artworks
NOTE: Consider adding your name/handle/nickname to the collection. It helps collectors to see all your collections just by typing that one phrase …by Artist
. Example:
13. FAQ
1. What’s the difference between Gamma Prints and Gamma Collection (using delegates)?
Gamma Prints (available to Gamma Partner Artists only) use iframe
to display your Original inscription. On top of that, there is a JS code to add a number of the particular Print. All Prints are identical (but the number, of course) and because of the nature of iframe
, your code will be even more sandboxed – it won’t react to inscription IDs of new Prints, etc.
Gamma Collection using delegates on the other hand are individual inscriptions, that can be aware of their ID and are displayed as they are. There’s no additional layer of code, no overlay. It’s exactly as you design it.
That’s All Folks!
Thank you for visiting!
Hope you’ve found this guide helpful.
If you have any suggestions about the content,
feel free to DM me on Twitter: https://x.com/PawelDudko
14. Useful links
Generative art resources for beginners:
- absolute legend Daniel Shiffman and Coding Train:
https://www.youtube.com/@TheCodingTrain - Gorilla Sun blog:
https://www.gorillasun.de/articles/ - Art Blocks docs — a list of good practices, heavily tested PRNG algorithms, etc.:
https://help.artblocks.io/Creator-Onboarding-11a72e815f0f407f95061380acabef1f
Other resources:
- Ordinals docs:
https://docs.ordinals.com/ - JavaScript Minify Tool by DigitalOcean:
https://www.digitalocean.com/community/tools/minify - MIT Licence as inscription:
https://ordinals.com/inscription/1d29d38edc8077746d4bbbcffb2eaccc0a4dc125bb35a754b8041f21145571b2i0 - Ordinal Public Goods on GitHub by Jokie88:
https://github.com/jokie88/ordinalpublicgoods?tab=readme-ov-file