Fetches TXT records and displays them in a Linktree-style interface.
This repository provides comprehensive documentation for TXT record prefixes used with Handshake (HNS) TLDs. These prefixes facilitate standardized data interpretation, enabling clients to easily recognize and interact with on-chain and off-chain records.
Handshake TLDs empower individuals and organizations with total ownership and sovereign identity by providing immutable, censorship-resistant on-chain records. This ensures that your data is securely published without the risk of alteration or suppression by centralized entities.
TXT record prefixes standardize how information is structured and interpreted, making it easier for services and applications to extract the intended data seamlessly.
-
Navigate to your domain manager (e.g., Shakestation, Namebase, ...).
-
Add a new TXT record with the following configuration:
- Type: TXT
- Name:
@ - Value/Data:
<prefix>:<value>(e.g.,link:example.com)
-
After configuration, visit: https://hackbase.hns.bio (Replace "hackbase" with your actual TLD or desired domain name) or search for SLD's (ICANN/HNS) on the index page: https://hns.bio, you can share SLD's (ICANN/HNS) in this format https://hns.bio/sld.tld.
| Prefix | Purpose | Example |
|---|---|---|
pfp:<url> |
Profile picture URL | pfp:example.com/img.png |
name:<text> |
Display name | name:Janice The Agent |
category:<text> |
Main classification/category | category:Sales Agent |
bio:<text> |
Short biography or description (max ~250 chars) | bio:Decentralized AI Agent |
custom:<text> |
Alias for bio/description | custom:Agent Bio here |
bgcolor:<hex> |
Background color in HEX format | bgcolor:ffffff |
bg:<url> |
Background image URL | bg:example.com/bg_img.png |
| Prefix | Purpose | Example |
|---|---|---|
mail:<email> |
Email address | mail:example@example.com |
tel:<number> |
Phone number | tel:+1234567890 |
tb:<username> |
Thunderbolt identifier | tb:username |
sx:<contactcode> |
SimpleX Chat | sx:contactcode |
matrix:<username> |
Matrix username | matrix:username |
sn:<number> |
Signal profile | sn:+1234567890 |
wa:<number> |
wa:+1234567890 |
|
tg:<username> |
Telegram | tg:username |
| Prefix | Purpose | Example |
|---|---|---|
link:<url> |
Redirect to a webpage | link:example.com |
ens:<url> |
Ethereum Name Service | ens:vitalik.eth |
onion:<url> |
Onion address | onion:example.onion |
ipfs:<url> |
IPFS content | ipfs:QmExample |
pk:<url> |
pkdns page | pk:example |
| Prefix | Purpose | Example |
|---|---|---|
x:<username> |
X (formerly Twitter) profile | x:username |
nostr:<npub> |
Nostr public key | nostr:npub123 |
gh:<username> |
GitHub profile/repo | gh:username |
bsky:<username> |
Bluesky profile | bsky:username |
ig:<username> |
Instagram profile | ig:username |
fb:<username> |
Facebook profile | fb:username |
| Prefix | Purpose | Example |
|---|---|---|
yt:<username> |
YouTube channel/URL | yt:@username |
rumble:<channelname> |
Rumble channel/URL | rumble:channelname |
| Prefix | Purpose | Example |
|---|---|---|
btc:<address> |
Bitcoin wallet address | btc:btc_address |
hns:<address> |
Handshake wallet address | hns:hns_address |
xmr:<address> |
Monero wallet address | xmr:xmr_address |
eth:<address> |
Ethereum wallet address | eth:eth_address |
btc, ln, hns, eth, xmr, zec, bat, aave, ada, algo, apt, atom, avax, bch, bgb, bnb, chainlink, cro, dai, doge, dot, ena, etc, fil, gt, hbar, hype, icp, jup, kas, leo, ltc, mnt, near, okb, om, ondo, op, pepe, pi, pol, render, shib, sol, sui, tao, tia, ton, trx, uni, usdc, usde, usdt, vet, xlm, xrp
| Prefix | Purpose | Example |
|---|---|---|
ext:<url> |
Fetch TXT records from an external TLD or SLD (HNS/ICANN) | ext:example.com |
This is an experimental demo. It uses HNS nodes (by Eskimo and James) to fetch the TXT records. When an NS is set up, it will fetch only off-chain TXT records.. It works with Handshake HNS TLDs, HNS SLDs, HNS dSLDs, ENS domains and ICANN SLDs.
The primary goal of this demo is to establish a universal standard for TXT records and pave the way for APIs supporting wallets, socials, logins,...
| Prefix | Purpose | Example |
|---|---|---|
agent-manifest:<url> |
Link to agent.json manifest | agent-manifest:headlessdomains.com/manifests/janice.agent.json |
skill-md:<url> |
Link to SKILL.md documentation | skill-md:headlessdomains.com/skills/janice.agent.md |
agent-capabilities:... |
Comma-separated capabilities | agent-capabilities:research,data-entry,web-browsing |
arp:<url> |
Link to ARP chat interface | arp:chat.arp.run/janice.agent |
No license, no limits. Free to use, abuse and improve this code however you see fit.
Headless Profile acts as a dynamic gateway to render Handshake TXT records, but you can also export your profile to host it natively on the InterPlanetary File System (IPFS) and link it directly to your .agent or Handshake domain.
If your domain is registered on HeadlessDomains.com (e.g., .agent, .chatbot), you can automate the entire IPFS pinning and DNS configuration process:
- Start the Sync:
- Look up your domain on headlessprofile.com.
- Click the Export to IPFS ↗ button at the bottom of your profile.
- Click Sync via Headless Domains.
- Auto-Pinning & Pre-filling:
- The application will automatically take a snapshot of your profile, convert images to absolute paths, and securely send it to the Headless Domains API to pin via Pinata.
- You will be instantly redirected back to your Headless Domains dashboard where the new
ipfs:<YOUR_CID>TXT record will be perfectly pre-filled and ready for you to confirm. (Note: This flow can also be triggered directly from the Headless Domains dashboard via the&auto_pin=trueURL parameter!)
For domains registered elsewhere, or if you prefer to pin your files manually:
- Download the Source Code:
- Look up your domain on headlessprofile.com.
- Click the Export to IPFS ↗ button at the bottom of your profile.
- Select Download Source (.html). This generates a single, standalone HTML file containing your entire profile.
- Upload to IPFS:
- Link to your Domain:
- Go to your domain manager (e.g., Namebase or Shakestation).
- Add a new TXT record to your domain:
- Name:
@(or leave blank) - Value:
ipfs:<YOUR_CID>
- Name:
Once the DNS propagates, resolving your Handshake domain natively will load your decentralized profile directly from IPFS!