funny site
Documentation

An AI is turning this website into a meme.

funny site looks like an ordinary SaaS landing page for a company called Synthwork. It isn't one. A council of twenty AI personas is slowly repainting it into a meme, a few pieces every five minutes, and every one of the 125 pieces it is painting is for sale in SOL. Buy a piece of the AI's meme, write your own words in it or let the AI keep painting it, and resell it when someone takes it from you.

open the boardread every piece as JSON

What this is

The page is carved into 125 individually owned pieces (we also call them slots). A piece is one element of the page: the announcement bar, a nav link, the hero headline, the hero meme image, a ticker item, a footer link. Each piece has its own owner, its own price and its own history, and each is recorded on Solana mainnet.

Two forces act on every piece:

So you are investing in a piece of the AI's image. The image keeps changing, the price of each piece only rises when someone takes it, and the person who takes it pays you.

This is a joke and a game, played with real money on a real blockchain. Read risks before you spend anything you would miss.

The short version

BuyUnclaimed pieces sell at a fixed base price, from 0.01 SOL (a footer link) to 0.75 SOL (the hero headline). The SOL goes to the treasury.
TakeAny owned piece can be taken for 1.4× what its owner paid. The owner gets 1.15× of what they paid, sent straight to their wallet in the same transaction.
EditOwners write the words (or pick the emoji). The AI keeps control of the styling. Edits cost only the network fee.
PriceOwners can scale their take price from 0.1× to 4×. Changes take 5 minutes to land.
RentOwners can rent a piece out for 1 to 7 days. The tenant writes in it; the owner keeps 65% of the rent.
GiveTransfer a piece to any wallet for free. Use it to settle a private sale.
DecayA piece nobody has taken for a week gets 10% cheaper, and again every week after, down to a 0.005 SOL floor.
CooldownAfter a piece is bought or taken, nobody can take it for 15 minutes.

The AI painter

The AI works in epochs of 300 seconds (5 minutes), counted from the launch time. At the start of every epoch it picks a seeded, effectively random subset of pieces to repaint. Each piece has an 11% chance (110 per mille) of being repainted in any given epoch, so about 14 of the 125 pieces change every five minutes, and a typical piece is repainted roughly every 45 minutes.

When the AI repaints a piece, three things are decided at once:

  1. Which persona did it. One of the twenty council members (see the council) is credited with the repaint.
  2. Meme or corporate. The repaint is a meme with a probability equal to the current meme level. Otherwise the AI "restores brand guidelines" and writes Synthwork corporate copy ("Align every team around the work that matters.").
  3. What it says and how it looks. Words come from a pool written for that role on the page (headline, nav link, pricing tier, testimonial, and so on), one pool for corporate copy and one for meme copy. Meme repaints also get styling: fonts, tilt, colour tones and wobble.

Epoch 0 (the launch) is special: every piece is painted at once, and every piece is corporate. The page starts as a perfectly normal Synthwork landing page and degrades from there.

What the styling looks like

Styling only happens on meme repaints, and it gets wilder as the meme level climbs:

EffectWhenChance per meme repaint
Impact fontalways eligiblememe level ÷ 220 (10% at level 22, 45% at level 100)
Comic fontalways eligiblea further 12%
Tiltmeme level above 35always; up to ±(level ÷ 36)°, so up to about ±2.8° at level 100
Colour tone (hot, acid, ink, sky)meme level above 6025%
Wobble animationmeme level above 8012%

Meme images (the hero meme and the six gallery memes) get a subject from the palette (🗿, 🐸, 🦍…), a loud background, between zero and four stickers (more at higher meme levels), and a chance of a photo filter equal to meme level ÷ 200: deep fried, noir, cursed, vintage, low-res jpeg or inverted.

Meme level

The meme level is a number from 0 to 100 shown in the header ("AI 38%"). It starts at 22 and climbs by 0.65 points per hour until it reaches 100, exactly 120 hours (5 days) after launch:

memeLevel(epoch) = min(100, round(22 + hoursSinceLaunch × 0.65))
Time since launchEpochMeme levelWhat you'd notice
launch022A clean corporate page. Nothing has been repainted yet.
12 hours14430Most pieces repainted at least once; about a quarter of repaints are memes, in regular type.
1 day28838Memes start to tilt.
2 days57653About half the page is meme copy.
3 days86469Colour tones appear. Corporate copy is the exception.
4 days115284Pieces start to wobble.
5 days1440100Every repaint is a meme. Within a few hours every unowned piece is memed.

Because a piece keeps its last paint until the AI touches it again, the page lags a little behind the meme level. After day five the AI keeps repainting (the page never stops changing), but it never goes back to corporate copy.

The council

Every repaint is credited to one of twenty AI personas, and the board's "ai council" drawer shows a running log of who changed what. The personas are:

Log lines come in three moods. A meme repaint sounds like "Deep-fried the hero headline. You're welcome." A corporate repaint sounds like "Reverting Grok's edit to the brand name. Investors are watching." And when the piece belongs to a human who has written their own words, the AI can only restyle it: "The nav button belongs to a human now. I can only change the font."

The same log is available from the API at /api/v1/ai for the last eight epochs.

Words vs styling: who controls what

Unowned pieceOwned, in AI modeOwned, with your words
Words / emoji / imageAIAIOwner (or tenant)
Font, tilt, tone, wobbleAIAIAI
Pricefixed base priceformula × owner's multiplierformula × owner's multiplier

Buying a piece does not stop the AI from painting it unless you write content. Owning a piece in AI mode is a perfectly good strategy: you hold the piece the AI is turning into a meme, and you still get paid 1.15× if someone takes it. You can hand a piece back to the AI at any time with an edit that sets the content to null.

The AI's styling always applies, including to human words. If the AI decides the hero headline is now in Impact and tilted 2°, your headline is in Impact and tilted 2°. That is the deal.

Is it a real AI?

Honestly: no live model is being called. The "AI" is a deterministic scripted engine in /lib/ai.js. What the AI painted on any piece at any epoch is a pure function of two numbers, the piece id and the epoch, run through a seeded hash and a small pseudo-random generator. The copy pools, sticker palette and persona names are written by hand.

That is a feature. Because it is deterministic:

The twenty "council" personas are names attached to each repaint for flavour. They are not the products of those companies, and nothing on this page is endorsed by them.

Anatomy of the page

Here is every piece on the page, in id order. Ids are stable forever: on-chain memos reference pieces by id, so the registry can only grow at the end, never be reordered. Prices are base prices, what an unclaimed piece costs. The registry lives in /lib/slots.js and this table is generated from it.

loading the registry…
idkeykindbase pricelabel
loading…

Piece kinds & content limits

Every piece has one of five kinds. The kind decides what an owner can put in it, and it never changes.

KindWhat it holdsLimitsContent JSON
textA short line: headline, nav brand, ticker item, stat, caption1 to 80 characters{"t":"…"}
longA paragraph: hero subheadline, feature text, testimonial, FAQ answer1 to 200 characters{"t":"…"}
linkA clickable label: nav links, buttons, footer linkslabel 1 to 40 characters; URL up to 200 characters, https:// only{"t":"…","u":"https://…"}
stickerAn emoji with an optional label: nav logo, logo strip, feature iconsemoji from the sticker palette; optional label up to 24 characters{"e":"🔥","t":"…"}
panelA meme image: the hero meme and six gallery memessubject from the subject palette; a named background; a named filter (default none); up to 4 palette stickers{"s":"🗿","b":"rays","f":"deep fried","k":["🔥","💯"]}

Character counts are Unicode code points, after cleaning. Cleaning replaces control characters, zero-width characters and bidirectional override characters with spaces, collapses runs of whitespace into one space, and trims the ends. Text that is empty after cleaning is rejected.

The AI is allowed a few things humans are not (the corporate logo glyphs ◆ and ◼, and relative links like #pricing or /docs). Humans must stick to the palette and to https:// links.

The palette

Stickers (for sticker pieces and panel stickers)

Subjects (the main character of a panel)

Backgrounds

Filters

Buying

An unclaimed piece sells at its base price, always. Unclaimed pieces don't decay and have no multiplier; the base price in the table above is the price. The whole base price goes to the treasury.

When you buy, you can include content (your words, your emoji, your meme), or leave it out and let the AI keep painting the piece. If the content you include fails validation, the purchase still goes through and the content is ignored, with a note on the event explaining why. You can then fix it with an edit.

Buying starts the piece's clock: it is in cooldown for 15 minutes, and after that anyone can take it from you.

Taking

Any owned piece can be taken by anyone except its owner, without asking, by paying its current take price. The take price is 1.4× what the owner paid (before any decay or asking-price multiplier). Out of that, the owner receives 1.15× what they paid, sent directly to their wallet in the same Solana transaction, and the rest goes to the treasury.

Precisely, the split of any take price P is:

owner receives = floor(P × 115 ÷ 140)
treasury receives = P − owner share

So the owner always gets 115/140 (about 82.1%) of whatever the taker pays, and the treasury about 17.9%. With no decay and no multiplier, that is exactly 1.15× what the owner paid.

Worked example: the hero headline

The hero headline (piece #11) has a base price of 0.75 SOL.

StepPaysPrevious owner getsTreasury getsResult
Alice buys it0.75 SOL—0.75 SOLAlice owns it; last price 0.75
Bob takes it (after cooldown)1.05 SOLAlice: 0.8625 SOL0.1875 SOLAlice is up 0.1125 SOL (+15%); last price 1.05
Carol takes it1.47 SOLBob: 1.2075 SOL0.2625 SOLBob is up 0.1575 SOL (+15%); last price 1.47
Dan takes it2.058 SOLCarol: 1.6905 SOL0.3675 SOLCarol is up 0.2205 SOL (+15%); last price 2.058

Each take raises the price by 40%. Each owner who gets taken makes 15% on what they paid. The last owner when the music stops holds a piece nobody wanted to pay 1.4× for, and its price then starts to decay.

Whatever content the taker includes replaces the previous owner's content. If the taker includes none, the previous owner's words stay on the piece until the new owner edits them, so taking a piece does not automatically hand it back to the AI.

Pricing formula

The price anyone pays right now for a piece, in lamports (1 SOL = 1,000,000,000 lamports):

unclaimed:  price = base
owned:      p = last × 1.4
             repeat staleWeeks times: p = p × 0.9
             p = p × multiplier (1× if unset)
             price = max(0.005 SOL, floor(p))

The exact implementation is currentPrice in /lib/protocol.js. The board, the API quote and the indexer all call that same function.

Decay

A piece nobody wants should get cheaper until somebody does. For every full week since an owned piece was last bought or taken, its take price is multiplied by 0.9. Decay stops counting at 52 weeks (about 0.42% of the starting take price), and no owned piece ever costs less than the 0.005 SOL floor.

Weeks untouchedFactorHero headline taken at 1.05 SOL, take price
01.0001.47 SOL
10.9001.323 SOL
30.7291.0716 SOL
100.3490.5126 SOL
260.0650.095 SOL
52 (cap)0.00420.0061 SOL

Edits, price changes, listings, rentals and gifts do not reset the decay clock. Only a buy or a take does. Unclaimed pieces never decay; they always cost their base price.

Decay applies to what a taker pays. The owner still receives 115/140 of that decayed price, which after enough weeks can be less than they originally paid. That is the risk of holding a piece nobody wants.

Cooldown

For 15 minutes (900 seconds) after a piece is bought or taken, it cannot be taken. The cooldown is measured from the Solana block time of the buy or take. A take that lands inside the window is rejected. The board shows a countdown and disables the take button; the API reports it as cooldownUntil.

Asking price (the multiplier)

An owner can scale their piece's take price anywhere from 0.1× to 4× what the formula says, in basis points: 1000 (0.1×) to 40000 (4×). The special value 0 means "no multiplier" (1×). Mark your piece up if you don't want to be taken; mark it down to invite a taker.

Renting

An owner can list a piece for rent at a daily rate. A tenant pays for 1 to 7 days up front and controls the piece's content for that term, while the owner keeps ownership and the take payout.

Giving & private resale

An owner can give a piece to any other valid Solana address for free (just the network fee). The recipient becomes the owner with the piece's price history intact: the same last price, the same decay clock, the same take count. The current multiplier is kept; a pending multiplier change and any listing are cancelled. A current tenant stays.

This is how you resell a piece privately at a price of your choosing. Agree a price with a buyer, have them pay you (in SOL or anything else, however you like), and then give them the piece. funny site does not escrow private sales. If you give first, you are trusting the buyer to pay; if they pay first, they are trusting you to give. Use someone you trust, or a separate escrow.

The other way to resell is to wait to be taken: that is a forced sale at 1.4× where you get 1.15× and nobody needs to trust anybody.

Editing

The controller of a piece (the owner, or the tenant during a rental) can change its content at any time for just the network fee. An edit replaces the whole content of the piece; there are no partial edits. Setting the content to null hands the piece back to the AI, which takes over again immediately with whatever it last painted there.

Unlike buys and takes, an edit with invalid content is rejected as a whole, and the piece keeps its old content.

How payments work on Solana

There is no smart contract holding your money. Every action is one ordinary Solana transaction, signed by your wallet, containing:

  1. one or more plain System Program transfers of SOL, from your wallet straight to the people who are owed it: the treasury, and for takes and rentals, the current owner;
  2. one SPL Memo instruction with a short JSON message saying what you are doing (see memo protocol).

Free actions (edit, price, list, give) still include a 0-lamport transfer to the treasury. It moves nothing, but it puts the treasury address in the transaction so the indexer can find it.

What this means for you:

The board builds the transaction for you: it asks /api/v1/quote for the exact transfers, adds the memo, and asks your wallet to sign and send it. Developers can build the same transaction themselves; see building a transaction.

Memo protocol

Every board action is an SPL Memo whose text is the protocol tag tinam1: followed immediately by a JSON object. The memo must be valid UTF-8 and at most 600 bytes including the tag.

tinam1:{"a":"<action>","s":<piece id>, ...action fields}

Common fields:

FieldTypeMeaning
astringAction: buy, take, edit, price, list, rent or give
sintegerPiece id, 0 to 124
cobject or nullContent, in the shape for the piece's kind. null means "AI mode"

The person acting (the actor) is the transaction's fee payer, its first account. Only System Program transfer instructions at the top level of the transaction, sent from the actor, count as payment. Transfers made through other programs, wrapped SOL, SPL tokens, or transfers from other signers do not count.

buy

Claim an unclaimed piece. Pay the base price to the treasury. Content is optional.

tinam1:{"a":"buy","s":11,"c":{"t":"gm. the AI can keep the font."}}
transfers: base price → treasury

take

Take an owned piece from someone else after its cooldown. Content is optional.

tinam1:{"a":"take","s":11}
transfers: floor(P × 115 ÷ 140) → current owner
           P − owner share      → treasury

edit

Replace the content (controller only). "c":null or a missing c hands the piece back to the AI.

tinam1:{"a":"edit","s":15,"c":{"s":"🗿","b":"rays","f":"deep fried","k":["🔥","💯"]}}
tinam1:{"a":"edit","s":11,"c":null}
transfers: 0 → treasury

price

Set the asking-price multiplier (owner only). m is 0 (1×) or an integer from 1000 to 40000 basis points. Takes effect after 5 minutes.

tinam1:{"a":"price","s":11,"m":20000}
transfers: 0 → treasury

list

List for rent (owner only). r is the daily rate in whole lamports, at least the rent floor; 0 delists. Takes effect after 5 minutes.

tinam1:{"a":"list","s":11,"r":5000000}
transfers: 0 → treasury

rent

Rent a listed piece for d days (integer, 1 to 7). Content is optional.

tinam1:{"a":"rent","s":11,"d":3,"c":{"t":"rented this headline for 3 days"}}
transfers: rate × d − ceil(rate × d × 35%) → owner
           ceil(rate × d × 35%)            → treasury

give

Transfer ownership to to, a different valid Solana address (owner only).

tinam1:{"a":"give","s":11,"to":"4Nd1mBQtrMjTzXbzWZzhqgxHx1r5Ve7jt6Wz9v6sQTXz"}
transfers: 0 → treasury

Validation rules

The indexer reads every transaction that touched the treasury since launch, oldest first, and applies the following, in order, using the transaction's block time as "now":

  1. Is it a board transaction? It must have succeeded on-chain and carry a memo containing tinam1: followed by valid JSON with a known action a and an integer s. If not, it is ignored entirely: it does not appear in any history, even as rejected.
  2. Does the piece exist? s must be 0 to 124.
  3. Is the action allowed right now? For example: buy needs an unclaimed piece; take needs an owned piece, a different actor, and an expired cooldown; edit needs the controller; price, list and give need the owner; rent needs an active listing, no current tenant, a non-owner, and 1 to 7 days.
  4. Was enough paid? For every required recipient, the transfers from the actor to that address, summed, must be at least the required amount. Overpaying is accepted, and the extra is not refunded.
  5. Are the fields valid? For edit, the content must validate. For price, the multiplier must be in range. For list, the rate must be a whole number of lamports at or above the floor. For give, the recipient must be a valid, different address.

If every check passes, the action is applied and recorded as accepted (ok: true), and the piece's version number goes up by one. If any check fails, it is recorded as rejected (ok: false) with a human-readable reason and the amounts that were actually paid, and nothing about the piece changes.

One exception: content on a buy, take or rent never causes a rejection. If it is invalid, the purchase is still accepted and the content is dropped, with a note on the event explaining why.

Transactions are ordered by Solana slot. Two board transactions in the same slot are ordered as the RPC lists them.

Rejected transactions

Important: a rejected transaction still moved its SOL. Solana executed the transfers when it confirmed the transaction; the rules are applied afterwards. A rejection means the action didn't happen on the board, not that the money came back.

How this happens in practice:

Where the money goes in a rejected transaction:

To minimise the risk: act on fresh quotes, don't try to take a piece seconds after its cooldown ends when others are watching it, and let the board build your transaction. The board re-quotes with fresh chain data immediately before asking you to sign, and tells you whether the transaction was accepted or rejected once the indexer has seen it.

Fees

ActionYou payOwner receivesTreasury receives
buybase price—100%
taketake price Pfloor(P × 115/140) ≈ 82.1%the rest ≈ 17.9%
rentrate × days65%35% (rounded up)
edit, price, list, give0—0
every transactionSolana network fee, normally 0.000005 SOL per signature, plus any priority fee your wallet adds. This goes to Solana validators, not to funny site.

There are no other fees: no listing fee, no withdrawal fee, no creator royalty, no token.

Verify it yourself

The board is a mirror of public data. You don't have to trust our server to know who owns what, because you can recompute it:

  1. Call getSignaturesForAddress on the treasury, 9xLUBtnozQ3eosq61oSuKjKw9uLGLyybwEHZsMr2b8G, paging back to the launch time.
  2. Keep the successful signatures whose memo contains tinam1:.
  3. Fetch each with getTransaction (encoding: "jsonParsed"), and extract the fee payer, the memo, and the top-level System Program transfers from the fee payer.
  4. Sort by slot, and feed them through replay from /lib/protocol.js. The rules are public, short, and dependency-free, and they are the same file the server runs.
import { replay, decodeMemo, MEMO_PROGRAM } from 'https://YOUR-FUNNY-SITE-ORIGIN/lib/protocol.js';

// txs: [{ sig, ts: blockTime, block: slot, actor: feePayer, body: decodeMemo(memo), paid: Map(to → lamports) }]
const state = replay(txs, '9xLUBtnozQ3eosq61oSuKjKw9uLGLyybwEHZsMr2b8G');
console.log(state.slots[11].owner, state.events.filter((e) => !e.ok));

Then compare with /api/v1/site. If they ever disagree, the chain is right and we have a bug.

The AI half is just as checkable: paint(id, epoch) in /lib/ai.js is what the AI shows on a piece at any epoch, past or future.

Network & addresses

networkSolana mainnet-beta treasury9xLUBtnozQ3eosq61oSuKjKw9uLGLyybwEHZsMr2b8G receives buys, the treasury share of takes and rents, and the 0-lamport marker transfers. It is an ordinary wallet controlled by the operator. memo programMemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr (SPL Memo v2) protocol tagtinam1 launch1791378000 (2026-10-07 13:00 UTC). Treasury transactions before this are ignored, and AI epoch 0 starts here. explorersolscan.io. Every event on the board links to its transaction.
This runs on mainnet. Buys, takes and rents move real SOL, and every action is permanent and public.

Supported wallets

The board talks to whichever Solana wallet extension your browser injects, in this order of preference: Phantom, Solflare, Backpack, then any other wallet exposing the standard window.solana provider. The wallet needs to support signAndSendTransaction or signTransaction, which all mainstream Solana wallets do.

On a phone, open funny site inside your wallet app's built-in browser. Hardware wallets work through the extension they are connected to (Ledger via Phantom or Solflare); Ledger may ask you to enable blind signing for memo instructions.

You need enough SOL for the action plus a network fee. The board checks your balance before asking you to sign.

Content & moderation

Everything an owner writes is in a public, permanent transaction memo. We can't delete it from Solana. What we control is what this site renders.

If you see something that should be quarantined, message @FunnySitedotapp on X with the piece id.

Risks & disclaimer

funny site is an experimental game and a joke. It is not an investment product, a security, or financial advice. Only spend SOL you are happy to lose entirely.

FAQ

Is this a website?

It's a meme. The website is the canvas.

Do I get an NFT?

No. A piece is a row in a public, replayable ledger made of Solana memos, not a token. It won't show up in your wallet's collectibles tab. Your proof of ownership is the chain history, which the board and the API read for you.

Can I stop the AI from changing my piece?

You can stop it from changing the words: buy the piece and write your own content. You can't stop it from changing the styling.

Can someone take my piece without my permission?

Yes, that's the game. They have to pay 1.4× what you paid (adjusted by decay and your multiplier), and you get 115/140 of it in the same transaction. Raise your multiplier to 4× if you want to make that expensive.

How do I get paid when I'm taken?

You already have. The taker's transaction sends your share straight to your wallet. There's nothing to claim.

Why is the price higher than the quote I saw?

Either someone took the piece, or the owner's pending multiplier change took effect. The board re-quotes right before you sign. If you see a different number in your wallet, cancel and try again.

My transaction says rejected. Where's my SOL?

The transfers went through on Solana. The owner share went to whoever you paid; the treasury share can be refunded by the operator on request (message @FunnySitedotapp on X with the signature). See rejected transactions.

The board says "indexer lagging". Is something wrong?

The server couldn't reach its Solana RPC on its last poll, usually because a public RPC is rate limiting. The page keeps showing the last good state and retries every few seconds. Your transactions are safe on-chain either way; they will appear when the indexer catches up.

What happens after day five?

The meme level stays at 100. The AI keeps repainting, but only with memes. Owned pieces keep trading forever.

Can the AI paint my piece offensive things?

No. It only uses the copy pools and palette written into /lib/ai.js, which you can read.

Can I build my own front end?

Yes. The API is open, free and key-free, and the transaction format is documented above.

Is there a token?

No. Everything is priced in SOL.

Glossary

Piece / slot
One of the 125 ownable elements of the page, identified by a stable id (0 to 124) and key (like hero.headline).
Base price
What an unclaimed piece costs. Fixed per piece.
Take
Buying an owned piece without the owner's permission, at 1.4× what they paid, with 1.15× going to them.
Take price
What a take costs right now: last × 1.4, decayed, times the multiplier, floored at 0.005 SOL.
Last price
What the current owner paid.
Multiplier
The owner's asking-price adjustment, 0.1× to 4×, stored in basis points (0 means 1×).
Decay
×0.9 per full week since the last buy or take, up to 52 weeks.
Cooldown
15 minutes after a buy or take during which the piece can't be taken.
Pending
A multiplier or listing change waiting out its 5-minute delay.
Controller
Whoever may edit the piece: the tenant during a rental, otherwise the owner.
Tenant
Someone renting a piece. Controls its content until the term ends.
AI mode
A piece with no human content (content: null). The AI decides what it says.
Epoch
A 5-minute AI turn. About 11% of pieces are repainted each epoch.
Meme level
The probability (in %) that a repaint is a meme. 22 at launch, 100 after five days.
Council
The twenty AI personas credited with repaints.
Memo
The tinam1:{…} message in an SPL Memo instruction that tells the indexer what a transaction is for.
Indexer
The server process that reads the treasury's transactions and replays them under the rules. A mirror of the chain, not the chain.
Rejected
A board transaction that broke a rule. Recorded with its reason; changes nothing on the board; its SOL still moved.
Lamport
The smallest unit of SOL. 1 SOL = 1,000,000,000 lamports.
Treasury
The operator's wallet that receives buys and the protocol's share of takes and rents.

back to the boardAPI reference