Introduction

Overview

IRD is the markup language used to customize a profile page on iridescent.lol. It replaces the older custom HTML/CSS feature.

An IRD source file is a sequence of directives and elements. The browser parses it on every page load and renders the result as plain React components. There is no JavaScript execution, no raw HTML output, and no CSS parsing.

When to use IRD

  • Adding extra cards, headings, links, or images to your profile.
  • Replacing the default profile layout entirely with a custom one.
  • Hiding specific built-in pieces (music plate, badges, etc.).

When not to use IRD

  • Changing your accent color, particles, or avatar — those live in the regular editor tabs.
  • Embedding third-party widgets (YouTube, Spotify, etc.) — not supported in v1.
Note
Open the IRD tab in the profile editor at iridescent.lol/edit to write and preview IRD with live diagnostics.
Introduction

Getting started

Write your first IRD program in under a minute.

  1. Sign in at iridescent.lol and open the editor.
  2. Click the IRD tab.
  3. Turn the IRD enabled switch on.
  4. Paste the snippet below into the source box.
  5. Click Save. View your page at iridescent.lol/<username>.

Minimal example

@theme dark
@accent #9D4CDD

card padding=lg radius=20 {
  heading "hello" level=1 color=accent
  text "this is my page" color=#cccccc
}

Live preview

The right-hand pane of the editor renders your IRD as you type. Parse errors appear in a panel beneath the source box with line and column numbers.

Migrating from custom HTML/CSS

If you previously had custom HTML or CSS, it is no longer rendered. Open the IRD tab and click Clear legacy HTML/CSS after porting your changes.

Introduction

Syntax

An IRD file contains three kinds of statements: directives, elements, and blocks.

Directives

Top-level configuration. Always begin with @.

@theme dark
@accent #9D4CDD
@hide music badges

Elements

Leaf nodes that render content. The general shape is:

tag "label" -> https://url attr=value attr=value

The label and URL are optional. Attributes are name=value pairs.

text "hi" size=lg color=#fff
link "github" -> https://github.com
image -> https://example.com/a.png width=300

Blocks

Containers that hold other statements. Open with { and close with }.

card padding=md {
  text "inside the card"
  stack direction=row gap=sm {
    badge "a"
    badge "b"
  }
}

Comments

Lines starting with # or // are ignored.

# this is a comment
// so is this
Note
A # followed by valid hex digits is a color, not a comment. #a78bfa stays a color; #hello starts a comment.
Reference

Directives

Page-level settings. Place them at the top of your IRD source.

DirectiveArgumentsDescription
@themedark · lightDefault color scheme.
@accent#hexBrand color. Use color=accent on any element to reference it.
@fontfont nameBody font for IRD content. See value types for the allowed list.
@bg#hex or https URLBackground color or image for the page.
@hidetarget listHide built-in profile pieces. See hiding defaults.
@cursordefault · pointer · noneCursor style for the page.
@maxwidth200–1600Max content width in pixels.
@alignleft · center · rightDefault text alignment.

Example

@theme dark
@accent #9D4CDD
@font Syne
@maxwidth 800
@align center
@hide profile-card music
Reference

Elements

Leaf nodes that render content.

text

A paragraph of text. Accepts a single label.

AttributeValues
sizexs · sm · md · lg · xl · 2xl · 3xl
color#hex · accent
weightlight · normal · medium · semibold · bold · black
alignleft · center · right
italictrue · false
opacity0–100
text "hello there"
text "big & bold" size=2xl weight=bold

heading

Display heading at level 1, 2, or 3.

AttributeValues
level1 · 2 · 3
color#hex · accent
alignleft · center · right
sizeoverride default size
heading "about" level=2

link

Inline anchor. Always opens in a new tab with rel="noopener noreferrer nofollow".

AttributeValues
-> urlhttps URL (required)
color#hex · accent
underlinetrue · false
sizexs–3xl
link "github" -> https://github.com

image

An image. HTTPS only. Images load with referrerpolicy="no-referrer".

AttributeValues
-> urlhttps URL
width16–1200 (px)
height16–1200 (px)
radius0–64
alt"caption"
image -> https://cdn.example.com/a.png width=300 radius=12

button

Pill-shaped call to action. The URL is optional.

AttributeValues
-> urlhttps URL (optional)
variantsolid · outline · ghost
color#hex · accent
sizesm · md · lg
button "subscribe" -> https://youtube.com color=accent

badge

Small pill label.

badge "open to work" color=#10B981

divider

Horizontal rule.

divider color=#ffffff22 thickness=1

quote

Blockquote with a left border in the accent color.

quote "a line worth pulling out" color=accent

spacer

Vertical gap.

spacer size=lg
Reference

Blocks

Containers that hold other statements. Maximum nesting depth is 8.

card

A bordered panel with padding. Supports an optional label.

AttributeValues
paddingnone · xs · sm · md · lg · xl
radius0–48
bg#rrggbbaa
border#hex
shadownone · sm · md · lg · glow
opacity0–100
alignleft · center · right
card padding=lg radius=20 shadow=glow {
  heading "hi"
  text "inside"
}

stack

Flex row or column.

AttributeValues
directionrow · col
gapnone · xs · sm · md · lg · xl
justifystart · center · end · between · around
itemsstart · center · end · stretch
wraptrue · false
stack direction=row gap=md justify=center {
  badge "a"
  badge "b"
}

grid

CSS grid with equal-width columns.

AttributeValues
cols1–6
gapnone · xs · sm · md · lg · xl
grid cols=3 gap=md {
  card { text "a" }
  card { text "b" }
  card { text "c" }
}

section

Full-width content band.

section padding=xl {
  heading "manifesto" level=2
}
Reference

Animations

Add animate=name to any element or block. Optionally pair with delay=ms (0–4000).

NameBehaviour
noneDisable animation.
fade-inSoft opacity ramp on mount.
slide-upRises into place from below.
slide-downDrops in from above.
slide-leftEnters from the right.
slide-rightEnters from the left.
pulseSubtle scale loop.
floatUp-and-down bob.
glowOpacity breath.
shakePeriodic shake.
spin-slowContinuous slow rotation.

Stagger example

stack gap=sm {
  text "one"   animate=slide-up delay=0
  text "two"   animate=slide-up delay=120
  text "three" animate=slide-up delay=240
}
Reference

Value types

Every attribute accepts one of a small set of value shapes. Invalid values are silently ignored.

Strings

Wrapped in double or single quotes. Supports \n, \t, \\, and escaped quotes. Hard cap of 1000 characters per string.

"double quotes"
'single quotes'

Numbers

Plain integers or decimals. Each attribute has a bounded range; out-of-range values fall back to a default.

Colors

Hex only: #rgb, #rrggbb, or #rrggbbaa. Named colors like red are rejected.

URLs

Must start with https://. Other schemes (http, data, javascript) are rejected at the lexer.

Idents

Bare words like dark, md, row. Each attribute has its own whitelist of valid idents.

Allowed fonts

One of: Space Grotesk, Syne, DM Sans, Fira Code, Outfit, Inter, Poppins, Montserrat, Roboto Mono, Bebas Neue, Playfair Display, Lora, JetBrains Mono, Quicksand, Caveat.

Guides

Hiding default UI

Use the @hide directive to suppress built-in profile pieces and replace them with your own IRD.

TargetHides
profile-cardThe entire default profile card.
avatarThe avatar circle.
nameThe display name and username row.
bioThe bio text under the name.
badgesThe badges row.
linksThe links list.
musicThe audio player plate.
followThe follow button in the top bar.
enter-gateThe click-to-enter splash.
backgroundParticles, image, or video background.

Example: replace the card entirely

@hide profile-card

card padding=xl radius=24 align=center {
  heading "my custom page" level=1
  text "100% IRD" color=#aaa
}

Combining multiple targets

@hide music badges follow
Guides

Recipes

Copy-paste starting points for common layouts.

Linktree-style stack

@hide profile-card
@accent #EC4899

card padding=lg radius=24 align=center {
  heading "@you" level=1
  spacer size=sm
  stack gap=sm {
    button "twitter" -> https://twitter.com variant=outline color=accent
    button "youtube" -> https://youtube.com variant=outline color=accent
    button "spotify" -> https://spotify.com variant=outline color=accent
  }
}

Two-column grid

@maxwidth 900

grid cols=2 gap=md {
  card padding=md animate=fade-in {
    heading "first" level=3
    text "description" size=sm
  }
  card padding=md animate=fade-in delay=200 {
    heading "second" level=3
    text "description" size=sm
  }
}

Hide just the music plate

@hide music
Guides

Errors and limits

The parser reports errors with line and column numbers in the editor's diagnostics panel.

Hard limits

LimitValue
Source size16 KB
Total statements500
Nesting depth8
String length1000 chars
URL length2048 chars

Common errors

  • Unterminated string literal — a quoted string was not closed on the same line.
  • Unknown tag 'X' — the element or block name is not in the IRD vocabulary.
  • Unknown directive '@X' — directive name is not one of the supported ones.
  • Missing '}' for block 'X' — a block was opened but never closed.
  • Nesting too deep (>8) — flatten your structure.
  • Expected value for 'name=' — an attribute was declared with no value.