Cardano Token Registry
Complete Guide: Registering a Native Token in the Cardano Token Registry
Last updated: February 2026
Table of Contents
Overview
Official Documentation Links
Prerequisites
Phase 1 - Environment Setup (WSL + Ubuntu)
Phase 2 - Install token-metadata-creator
Phase 3 - Prepare Your Policy Keys
Phase 4 - Prepare Your Logo
Phase 5 - Create the Metadata Entry
Phase 6 - Sign and Finalize
Phase 7 - Verify the JSON
Phase 8 - Submit the Pull Request
Registry Field Reference
Common Mistakes & How to Avoid Them
Best Practices Checklist
Overview
The Cardano Token Registry is an off-chain metadata repository maintained by the Cardano Foundation. It maps native token subjects (policy ID + asset name hex) to human-readable metadata like names, tickers, descriptions, and logos.
Key facts:
Entirely off-chain β no ADA or blockchain transaction required
Metadata is submitted via GitHub Pull Request
Signatures prove policy ownership cryptographically
The process works on Windows via WSL (Windows Subsystem for Linux)
Official Documentation Links
Cardano Token Registry (GitHub)
token-metadata-creator tool
Registry submission guide
CIP-26 (off-chain metadata)
Prerequisites
Before starting, you need:
Policy ID of your native token
Policy signing key (
.skeyfile, used during minting)Policy script file (
.scriptor.json)Asset name in hex (e.g.
fSLVRβ66534c5652)Logo image (see Phase 4 for format requirements)
GitHub account
Windows PC with WSL, or a Linux machine
π‘ Finding your asset name in hex: You can convert ASCII to hex online at https://string-functions.com/string-hex.aspx or in Linux:
echo -n "YOURTOKEN" | xxd -p
π‘ Your subject is always:
{policyID}{assetNameHex}β concatenated with no separator.
Phase 1 - Environment Setup (WSL + Ubuntu)
Skip this phase if you already have Linux.
Install WSL on Windows
Open PowerShell as Administrator and run:
Restart your computer when prompted.
After restart, Ubuntu will open and ask you to create a UNIX user.
β οΈ Your UNIX username must be lowercase. Ubuntu will reject uppercase usernames.
Verify WSL is working
Open the Ubuntu terminal and run:
You should see your lowercase username.
π‘ Accessing Windows files from Ubuntu: Your Windows drives are mounted at
/mnt/c/,/mnt/d/etc. Example:C:\Users\YourUsername\Desktop\β/mnt/c/Users/YourUsername/Desktop/
Phase 2 - Install token-metadata-creator
In your Ubuntu terminal:
If you see the help output, the tool is installed correctly.
Phase 3 - Prepare Your Policy Keys
You need two files in your working directory:
policy.script
Create this file with your policy script. Example for a simple signature policy:
policy.skey
This is your signing key β the private key used to prove ownership of the policy. It should be in the Cardano key envelope format:
π‘ Finding your keyHashes: Go to your NFT Project - click "Project Info" in the side bar - open "Cardano Policy" and press "Export Policy Keys".
β οΈ Security: Never share your
.skeyfile. It proves ownership of your policy and could be used to sign transactions.
Create the policy skripts and copy both files to your working directory:
Phase 4 - Prepare Your Logo
This phase is the most error-prone. Follow carefully.
Requirements
Format
PNG only (not JPEG, WebP, SVG)
Dimensions
Maximum 200Γ200 pixels (recommended)
Base64 size
Must be under 65,536 characters when base64-encoded
Color mode
RGBA recommended (supports transparency)
β οΈ Common mistake: Many token logos exist online as JPEG or WebP. Even if the file is named
.png, it might be a JPEG. Always verify and convert if needed.
Step 1 - Check your image format
Step 2 - Convert and resize to 200Γ200 PNG
Install Pillow if needed:
Run the conversion:
Step 3 - Verify the logo
All checks should pass before proceeding.
π‘ If you exceed 65,536 base64 chars: Try reducing to 150Γ150 or increase PNG compression. The base64 length is roughly 1.37Γ the PNG byte size.
Phase 5 - Create the Metadata Entry
Set your subject as an environment variable (saves typing):
Navigate to your working directory:
Initialize the draft:
This creates a .json.draft file.
Add all metadata fields in one command:
β οΈ Critical field notes:
--logoexpects a PNG file path, not a base64 string. The tool encodes it internally.
--decimalsmust match exactly what was set during minting. Double-check this value!
--tickermaximum 9 characters.
--urlmust be a valid HTTPS URL.
Phase 6 - Sign and Finalize
Sign the entry with your policy signing key:
This adds cryptographic signatures to all attestable fields.
Finalize (produces the final JSON):
This outputs: {SUBJECT}.json
Phase 7 - Verify the JSON
Never skip this step. Run this verification before submitting:
Expected output:
Valid PNG: True
Dimensions: 200x200
Base64 length under 65,536
All fields have 1+ signatures
File size under 370,000 bytes
π‘ Visually inspect the logo too! Decode it and open it:
Phase 8 - Submit the Pull Request
Step 1 - Fork the registry
Go to https://github.com/cardano-foundation/cardano-token-registry and click Fork β Create fork.
Settings:
Owner: your GitHub account
Repository name:
cardano-token-registry(keep default)Copy master branch only: checked
Description: leave empty
Step 2 - Create a GitHub Personal Access Token
Go to https://github.com/settings/tokens β Generate new token (classic)
Settings:
Note:
Cardano Token RegistryExpiration: 30 days (sufficient)
Scope: tick repo only
Click Generate token and copy it immediately β GitHub shows it only once.
Step 3 - Clone your fork
When prompted for password, paste your Personal Access Token (not your GitHub password).
Step 4 - Create a branch, add file, commit, push
Step 5 - Open the Pull Request
Go to the URL shown in the terminal output (or navigate to your fork on GitHub).
PR description template:
Step 6 - Wait for CI and review
After submitting, two automated checks will run:
CI / approve β checks PR format
CI / Validate-Metadata β validates your JSON structure and signatures
Both must pass. The "Merging is blocked" message is normal β a Cardano Foundation maintainer must approve and merge. This typically takes a few days to a week.
Registry Field Reference
subject
β
β
policyID + assetNameHex
name
β
50 chars
Human-readable token name
description
β
500 chars
What the token represents
ticker
Optional
9 chars
Trading ticker symbol
url
Optional
250 chars
Must be HTTPS
logo
Optional
65,536 base64 chars
PNG only, max 200Γ200px
decimals
6 is standard
β
Integer, must match minting
policy
Auto-generated
β
CBOR-encoded policy script
Common Mistakes & How to Avoid Them
Wrong decimals value
Problem: Setting decimals to 0 when the token was minted with 6 decimals (or any other value).
Fix: Always verify your decimals before creating the metadata. Check your minting transaction or NMKR/minting platform settings. Decimals must match exactly what was encoded at mint time.
Logo not a valid PNG
Problem: Logo file is actually a JPEG or WebP even though it has a .png extension. This produces a broken or corrupted logo in the registry.
Fix: Always check the file header bytes. If the first 8 bytes are not 89 50 4E 47 0D 0A 1A 0A, it is not a PNG. Convert explicitly with Pillow as shown in Phase 4.
Logo base64 too large
Problem: A 256Γ256 PNG may exceed the 65,536 base64 character limit.
Fix: Use 200Γ200 maximum. Check the base64 length before proceeding. Reduce to 150Γ150 if still too large.
Logo path vs base64 confusion
Problem: Passing a pre-encoded base64 file to --logo instead of the PNG file path.
Fix: The --logo flag expects a PNG file path. The tool encodes it to base64 internally. Example: --logo logo.png β
not --logo logo.b64 β
WSL username with uppercase
Problem: Trying to create a UNIX user like Flo β Ubuntu rejects it.
Fix: Always use lowercase for UNIX usernames: flo, john, tokenadmin.
Using GitHub password instead of Personal Access Token
Problem: git push fails with authentication error.
Fix: GitHub no longer accepts passwords for CLI operations. Generate a Personal Access Token with repo scope and use that as the password.
Not visually verifying the logo
Problem: The JSON passes all automated checks (valid PNG bytes, correct dimensions) but the actual image is broken or wrong.
Fix: Always decode the base64 logo from your final JSON and visually inspect it before submitting the PR. Open it in an image viewer to confirm it looks correct.
Subject lowercase requirement
Problem: The filename must be {subject}.json where subject is all lowercase hex.
Fix: Policy IDs and asset name hex are always lowercase. The token-metadata-creator tool handles this automatically.
Best Practices Checklist
Before submitting your PR, confirm all of the following:
Metadata correctness:
Subject is correct: policyID + assetNameHex (no separator)
Decimals match exactly what was set at minting time
Description is accurate and informative (max 500 chars)
URL is live and HTTPS
Ticker is correct (max 9 chars)
Logo:
File is a true PNG (verified by header bytes)
Dimensions are 200Γ200 or smaller
Base64 length is under 65,536 characters
Visually inspected and looks correct
RGBA mode for transparency support
Signatures:
Signed with the correct policy.skey
All fields have signatures
Policy field is present
File:
JSON filename matches subject exactly
File is in the
mappings/directoryFile size is under 370KB
JSON is valid (no syntax errors)
GitHub:
Forked from
cardano-foundation/cardano-token-registryPR targets
masterbranchBoth CI checks pass
PR description includes policy ID, ticker, decimals
Cleanup After Submission
Once your PR is submitted, you can safely clean up your local files:
The token-metadata-creator binary remains installed at /usr/local/bin/ β useful if you register more tokens in the future.
Last updated