Web Tiles vs Open Graph Protocol
The Open Graph Protocol (OGP) is the current industry standard for link previews. Web Tiles offer a fundamentally different model — interactive, verifiable micro-apps vs static image cards. Here's how they compare:
| Aspect | Open Graph Protocol | Web Tiles (DASL) |
|---|---|---|
| Dimensions | 1200×630px, 1.91:1 ratio — universal standard | No standard dimensions. Each tile defines its own sizing. |
| File Format | JPG or PNG only | Any web content (HTML/CSS/JS). No format constraints. |
| File Size | Under 1MB (ideally 200–500KB) | No size limits specified. Can bundle megabytes of resources. |
| Preview Image | One og:image — simple, universal | Icons/screenshots arrays optional. No standard "card image." |
| Response Time | <3 seconds expected | 4–6 network hops to render. No latency guidance. |
| Authentication | Must be publicly crawlable. No verification. | Public via PDS. Content-addressed — cryptographically verified. |
| Fallback | Graceful — worst case, a plain link | Host page's OGP tags serve as fallback for legacy clients. |
Where Web Tiles Excel
🎮 Interactive
Tiles run HTML/CSS/JS — forms, animations, games. OGP is a static image.
🔐 Verifiable
Content-addressed via CIDs. Tamper-proof, no CDN dependency. OGP images can change at any time.
🧩 Composable
Tiles can communicate with each other. Multiple tiles can be assembled into complex UIs.
🛡️ Privacy-First
No network access after load. No tracking pixels, no data exfiltration by design.
📐 Tile Interface Guidelines
Sizing
The DASL Tiles Lexicon defines an optional sizing object with width and height integers (pixels). No minimum, maximum, or aspect ratio is enforced by the spec.
"sizing": {
"type": "object",
"properties": {
"width": { "type": "integer", "minimum": 1 },
"height": { "type": "integer", "minimum": 1 }
},
"required": ["width", "height"]
}
Recommended Card Layout
For maximum compatibility with existing link preview infrastructure, TIG recommends tile devs to adopt the industry standard that emerged from platforms. The full tile card consists of two parts: the tile content (interactive viewport) and the tile info (name + description rendered by the consuming app).
HTML / CSS / JS viewport
{ "width": 1200, "height": 630 }tile.url — display shows domain onlytile.nameSame convention as og:titletile.descriptionSame convention as og:descriptiontile.urlSame convention as og:url — consuming apps display domain onlytile.iconsArray of icon sourcestile.sizing{ "width": 1200, "height": 630 } for TIG compliancetile.tigtrue — signals TIG card rendering support (see below)tile.background_colorLight mode background colortile.background_color_darkDark mode background colortile.name: "Wikipedia, the free encyclopedia"
tile.description: "Wikipedia is a free online encyclopedia, created and
edited by volunteers around the world."
tile.url: "https://www.wikipedia.org/"
These fields follow the same conventions as Open Graph Protocol metadata. Consuming apps render name and description in the info area below the tile content, with url displayed as domain-only.
prefers-color-scheme CSS media query inside tile HTML<meta name="color-scheme" content="light dark">background_color (light) + background_color_dark (dark)color-scheme: dark on the iframe to override OS preferenceTiles SHOULD support both light and dark variants via @media (prefers-color-scheme: dark). The light variant is the default. The tile's <meta name="color-scheme" content="light dark"> tag signals theme awareness to the browser. Rendering clients that use a manual theme toggle can set color-scheme on the iframe element to cascade into the tile's media query.
tile.tig: true in the tile recordtile.sizing at the tile's native dimensions (e.g. 1200×1200)tile.sizing: { "width": 1200, "height": 1200 }
tile.tig: true
tile.name: "My Bookshelf"
tile.description: "Books I've been reading lately."
tile.url: "https://example.com/books"
Tile HTML uses CSS to adapt:
@media (max-height: 700px) {
/* Compact card layout for TIG consumers */
}
Tiles with native sizing of 1200×630 are implicitly TIG-compliant — the tig field is not needed. For tiles with other dimensions (e.g. 1200×1200 widgets, portrait tiles, square profile cards), setting tig: true tells consuming apps that the tile HTML is designed to also render correctly at 1200×630. The publishing app (e.g. Linkname) renders the tile at its native size, while TIG-aware consumers (e.g. DASLint, feed readers, chat apps) render it as a standard link card preview.
Dark/Light Theme Awareness on the Web
Most modern websites implement dark and light themes using CSS custom properties (variables) toggled by a class or data attribute on the root element — for example, <html class="dark"> or <html data-theme="light">. The operating system's color preference is exposed to CSS via the prefers-color-scheme media query, part of the W3C's CSS Media Queries Level 5 specification. Pages declare their supported schemes with <meta name="color-scheme" content="light dark">, which tells the browser to adjust default UA styles (scrollbars, form controls, default backgrounds) accordingly.
For embedded content like Web Tiles rendered in iframes, theme inheritance is more complex. The CSS specification states that setting the color-scheme property on an iframe element should cascade into the embedded document's prefers-color-scheme evaluation. However, in practice this does not work reliably across all browsers — particularly in sandboxed srcdoc iframes where the document has an opaque origin. Rendering clients that implement a manual theme toggle should not rely solely on CSS property inheritance. Instead, the recommended approach is to rewrite the tile's HTML directly — either by replacing inline style values or by injecting unconditional dark/light CSS rules before setting srcdoc. Tiles that use @media (prefers-color-scheme: dark) will respond correctly to the user's OS-level preference without any client-side intervention.
Image: aspectRatio: 1200 / 630 (CARD_ASPECT_RATIO) Title: text_md (16px), font_semi_bold, numberOfLines: 3 Description: text_sm (14px), numberOfLines: 2 (with thumb) Divider: 1px border between description and domain Domain: text_xs (12px), Globe icon + toNiceDomain(uri) Padding: px_md (12px) horizontal, pt_sm/pb_sm (8px) vertical Gap: 3px between title/description
These dimensions follow the conventions established by Bluesky, Facebook, LinkedIn, Slack, and Discord for link preview cards. The tile content area maps directly to the OGP image dimensions (confirmed as CARD_ASPECT_RATIO = 1200/630 in Bluesky's open-source codebase). The info area follows the text rendering pattern used by Bluesky's ExternalEmbed component — the reference implementation for ATProto link cards.
Tile authors may use other dimensions for specific use cases (e.g. portrait tiles for games, square tiles for profile cards), but 1200×630 should be treated as the default when no specific layout is required.