$SCRIBEBuy Solscan
MAINNET · TX V1
scribe.

READ IT YOURSELF

The bytes are account state.

Every image, GIF, sound, video, 3D model and website on Scribe lives inside the token's Token-2022 mint account, in the Token Metadata extension's additional metadata. Scribe only reads it back. So can you, with any RPC, any explorer that shows Token-2022 extensions, or the Solana CLI.

Where to look

On Solscan open the mint, then Token Extensions, then Token Metadata: the additional metadata list is the inscription. With an RPC, call getAccountInfo on the mint and parse the metadata extension, or let a library do it (see the script). A field that fits one transaction is stored whole as a data URI. A bigger one is split into numbered pieces, key.0 … key.n-1, with a manifest under key such as chunked:text/html+gzip;n=5 that gives the type and the count.

Image
image is a data URI (data:image/webp;base64,…). Paste the whole value into a browser address bar and the picture shows. If the creator chose a normal image instead, image_url holds a link and nothing else is carved in.
GIF
A small GIF is the image field itself. A bigger one is animation.0 …: join the pieces in order, base64-decode, save as .gif.
Sound
sound is a data:audio/mpeg URI you can paste into an address bar, or sound.0 … pieces to join and save as .mp3.
Video
video.0 … joined, base64-decoded and saved as .webm. VP9 with Opus sound: Chrome, Edge and Firefox play it from a file. The first frame is the image poster.
3D model
model.0 … joined and base64-decoded, then gunzipped when the manifest says +gzip. Save as .vox (MagicaVoxel), .glb or .obj (Blender, any glTF viewer).
Website or game
site.0 … joined, base64-decoded, gunzipped, saved as .html and opened. It runs from a local file. A page marked as a game carries a game field.

One script for any field

Node 20 or newer with @solana/web3.js and @solana/spl-token installed. Save as read.mjs, then for example node read.mjs GEjbUiakaKUyQpxPBawWYuHsJwumrUtr9Z8tVum1CdgJ site barren.html, or … video clip.webm, … sound clip.mp3, … model coin.vox, … image art.webp.

import { Connection, PublicKey } from "@solana/web3.js";
import { getTokenMetadata, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token";
import { gunzipSync } from "node:zlib";
import { writeFileSync } from "node:fs";

const [mint, key, out] = process.argv.slice(2); // node read.mjs <mint> site page.html
const md = await getTokenMetadata(new Connection("https://api.mainnet-beta.solana.com"), new PublicKey(mint), "confirmed", TOKEN_2022_PROGRAM_ID);
const f = Object.fromEntries(md.additionalMetadata);
let mime, bytes;
if (f[key].startsWith("data:")) { mime = f[key].slice(5, f[key].indexOf(";")); bytes = Buffer.from(f[key].slice(f[key].indexOf(",") + 1), "base64"); }
else { const n = Number(/n=(\d+)/.exec(f[key])[1]); mime = /^chunked:([^;]+)/.exec(f[key])[1]; bytes = Buffer.from(Array.from({ length: n }, (_, i) => f[key + "." + i]).join(""), "base64"); }
if (mime.endsWith("+gzip")) bytes = gunzipSync(bytes);
writeFileSync(out, bytes);
console.log(out, bytes.length, "bytes", mime);

Example: talking to Barren without Scribe

Barren ($BARREN) does not live on a website. Its page is inside the mint account, split across the fields site.0 to site.4. Read mint GEjbUiakaKUyQpxPBawWYuHsJwumrUtr9Z8tVum1CdgJ from any RPC, join the five pieces in order, base64-decode, gunzip, save as .html and open it. Type into the box. Same bytes, no server. The only thing that goes quiet offline is the live market-stats line.

Barren's tablet