Learn by making

Tutorial

This tutorial helps you learn the basics of using the platform in practice. For the main ideas behind the platform, see the About section.

Run your first shared connector

Let’s start with a small piece you can make your own. We’ll borrow a shared sequence of numbers, choose values from it, and save that choice as a new draft. By the end of the first four sections, you’ll have a draft you can test and a second version to compare with it. You don’t need to code or have used the platform before.

A connector holds rules for producing numbers and can use other connectors. A World is an application that gives those numbers a creative meaning: notes in a score, colours in a drawing, or moves in a game. We’ll work with the numbers first. Turning them into a complete piece in a World comes later.

Our shared connector is called pitch. It starts with a number and keeps adding 1. You can explore all the illustrations on this page without an account; they’re local examples and don’t save or publish anything. To try the real connector, choose your route below. You can switch routes above each exercise; your choice updates the whole tutorial.

Choose values from shared material

Your new connector can use another connector’s sequence and choose values from it. For example, it could choose the first, third, fifth and seventh values from pitch. Each position has a number called an index, counting from 0. Those positions are indexes 0, 2, 4 and 6. Choosing them doesn’t change the shared pitch connector.

A transformation is a rule that changes a number. For example, add with argument 2 adds 2 at each step. A dimension has its own sequence of transformations. Without a reference, its numbers are output values. When it references another connector, its numbers choose indexes in the referenced sequence: 0, 2, 4, 6 chooses every second position.

Try a different tab or selection below. The moving links show the choice travelling from your rule, through the shared sequence, to the World’s interpretation. Click any control to stop the animation and take a closer look; use Start to resume it.

Sculpt a shared palette

A connector chooses indexes. A shared palette provides values. A World gives them meaning.

Autoplay on

1 · GENERATE INDEXES2 · SELECT FROM A SHARED PALETTEpitch3 · INTERPRET IN A WORLDMusic0123596061626364656667728496SELECTOR CONNECTORStart 60 · add 2index60index62index64index66MIDI PITCH607284960123C4reference → pitchStart 0 · add 1 · excerpt shownIndex 60 → value 60 1 · GENERATE INDEXESSELECTOR CONNECTORStart 60 · add 2index60index62index64index66reference → pitch2 · SELECT FROM A SHARED PALETTEpitch0123596061626364656667728496Start 0 · add 1 · excerpt shownIndex 60 → value 603 · INTERPRET IN A WORLDMusicMIDI PITCH607284960123C4
Index 60 → pitch value 60 → C4

Choosing a tab, variation or index pauses the diagram. pitch is a published connector. Index and value match here because each palette starts at zero and adds one.

An index and its selected value can be different. When pitch starts at 0, index 2 selects value 2. When it starts at 60, index 2 selects value 62. The music illustration above selects indexes starting at 60 from a sequence starting at 0. In our draft below, we’ll reach the same values by starting the referenced sequence at 60 and selecting indexes from 0. The World receives the selected values, whichever route produced them.

Choose where a run begins

Let’s try one change in the real system before looking at the diagram.

Same rule. A different place to begin.

The connector repeats +1, then +3. Choose its first value and where to enter that cycle.

Enter the cycle

Apply one operation per step, then repeat.

These settings are open: the person running the connector can choose them.

Follow this run

Output 0 → 1 → 4 → 5 → 8 → 9

A running instance chooses the starting value and cycle entry at a position in the connector. Fixing that position saves both settings together; a run cannot override them. This is a local illustration.

An open running instance lets the person running the connector choose these settings. A static running instance fixes Start and Shift together for one position in the connector’s tree of references. A run cannot override that fixed pair. In the next exercise, we’ll fix the referenced pitch stream while leaving our new connector’s own settings open.

Make a draft and test your choice

Let’s save your own selection of 60, 62, 64, 66. Your new connector selects indexes 0, 2, 4, 6 from pitch, whose referenced stream starts at 60. The shared rule stays the same; your selecting rule is new.

Your rule → shared pitch → your output
Start 0
add 2
index 0 60
index 2 62
index 4 64
index 6 66
Pitch starts at 60 and adds 1: value = 60 + index. Your selecting rule changes the indexes, so it changes which values you get. This preview runs here in the page.

Saving a draft requires a signing account to identify its creator. Create locally saves an unpublished definition on the platform server. Simulate tests it there. Neither spends a blockchain transaction fee (gas).

Check your draft: keep its saved name and look for 60, 62, 64, 66 in the simulation output, with a path retaining the pitch reference. It is saved and tested, but still unpublished.

If your draft doesn’t give those values
  • 0, 2, 4, 6: the referenced pitch needs Start 60, Shift 0, set to static before saving.
  • The gap is wrong: set add’s argument to 2 on your new root’s D1, rather than on shared pitch.
  • Simulation won’t start: check that creation succeeded. Simulate the saved name; Execute on the Network needs publication.
  • Sign-in expired or failed: unlock MetaMask and sign in again, or refresh your Chain API token. That token lasts five minutes.
  • Pitch or add is missing: refresh the network library, or check the API’s error when reading its definition. Retry later if the service is unavailable.
  • Name reserved: choose a new unique name. Saved definitions cannot be overwritten; correcting an already saved draft also needs a new name.

Try one change

What happens if your selector adds 12 instead of 2? Keep the referenced pitch at Start 60, Shift 0. Predict the four values, then make a second draft with a new name.

Look for 60, 72, 84, 96. Your two selectors now choose different values from the same shared sequence. Keep both names so you can compare their output.

Give your values a place in a World

So far, our connector has had one dimension. You can give a connector several dimensions, each with its own rules and references. This is a multidimensional connector: one definition can supply several properties together. For example, a musical contribution could supply pitch, time, duration and velocity; a painting contribution could supply red, green and blue. The World interprets the values that the connector produces.

From a selection to something you can use One connector. Several dimensions.

Earlier, we chose four values from one dimension. A connector can define several dimensions together and return their streams in one run. In these examples, the first value from each describes the first note or brush mark; the second values describe the next one.

Pitch alone tells us which note. Time, duration and velocity tell us when it starts, how long it lasts and how strongly it is played.

A four-dimensional connector One run → the streams below → the World’s picture
DimensionNote 1Note 2Note 3Note 4
D1 · time0123
D2 · duration1121
D3 · pitch60626466
D4 · velocity809664112
Edit note 1
𝄞C4D4E4♯F♯4Bars show duration · stronger notes look darker Note 1: C4 · beat 0 · 1 beat long · strength 80

The pitch row starts with our earlier 60, 62, 64, 66 selection. Pick a note, then change just its duration. Its pitch stays the same; a different stream changes another property of that same note.

The connector supplies the dimensions. The World gives them meaning.

The connector’s creator defines its dimensions, rules and references. Here, the World reads values at the same position across the returned streams as one object. The score uses beats and MIDI pitch numbers; the painting uses RGB channels from 0 to 255 and fixes the marks’ positions and shapes. A World documents its units, ranges and grouping; it can also combine results from separate connectors when useful.

Each dimension can generate values directly or select them from another connector. Referencing pitch alone supplies only pitch; add dimensions for the other properties. These illustrations are local examples, not saved definitions or network runs. Try the two-dimensional exercise below to build the relationship in the real system.

Put two dimensions in one connector

Let’s keep our earlier pitch selection and add another dimension. In the new connector, D1 selects 60, 62, 64, 66 from pitch. D2 is a scalar dimension: it uses add with argument 1 to produce 0, 1, 2, 3 directly. You’ll save one draft and simulate both dimensions in one run. A World you build could read D2 as start times for the pitches in D1.

Check both output paths: /your_name:0/pitch:0 contains 60, 62, 64, 66, and /your_name:1 contains 0, 1, 2, 3. Replace your_name with your draft’s name. Studio labels dimensions D1 and D2; output paths count them from 0. Adding D2 leaves D1’s selection unchanged.

Why is the fixed running instance still at position 2?

The referenced pitch still uses fixed running instance "2": root 0, selecting D1 at 1, pitch’s scalar dimension at 2. D2 comes after that branch, at position 3, and keeps its default Start 0, Shift 0. These are positions in the reference tree, distinct from the dimension numbers in the output paths.

Before contributing to a World, check its instructions: which properties it reads, what the numbers mean, and how it groups them. Our two-dimensional draft demonstrates how to combine properties; it is not yet a complete contribution for the MIDI World. That World needs streams labelled pitch, time, duration and velocity. D2 here is a scalar of your own connector, so its label is your_name:1, not time:0.

What a compatible format tells you

A scalar stream produces values directly instead of selecting from another connector. A format hash identifies the names and dimensions of the scalar streams at the ends of a connector’s reference tree. A World uses it to recognise a vocabulary.

The format doesn’t validate units, ranges or grouping. The World defines those conventions. Network values are unsigned whole numbers; negative or fractional quantities need an encoding.

A dimension can reference a multidimensional connector too. Its selecting indexes then choose positions across that connector’s output streams. A connector can therefore contain both direct scalar dimensions and references that supply several streams.

Publish when you’re ready to share

This step is optional. Publication gives your saved connector a permanent blockchain address so others can run and reference it. Review its rules and fixed settings first: the published definition cannot be edited.

You’ll need Sepolia test ETH in its owner’s account for gas. Sepolia is Ethereum’s test network. You don’t need mainnet ETH; a Sepolia faucet can supply test funds.

From an idea to the network
  1. Create a draft

    Signed in · no gas

    Compose new operations and reuse existing ones.

  2. Simulate

    No transaction

    Test the draft in the server’s local test environment.

  3. Publish

    Sepolia ETH for gas

    Publish referenced operations first, then their parent.

  4. Execute

    Read only · no gas

    Read published values; a compatible World gives them meaning.

Publication sends a Sepolia transaction. Draft creation, simulation and read-only execution do not send one. After publication, wait for the operation to become available at the execution block.

Publication preserves your definition. It doesn’t add the other streams a World may require.

If you want to build a World of your own

You decide what the numbers become. Let’s start with a small drawing prototype: each selected value sets a circle’s diameter in pixels. Your first draft gives similar sizes; your second spreads them further apart.

A tiny World: one value, one circle
60 px62 px64 px66 px
Here, a value means a diameter in pixels. Choose the other output to see how your selecting rule changes the picture. This is a local illustration of the two expected results.

Choose where your editor will run

A World can include an editor for drawing, composing or arranging movements. A standalone app with the full SDK can create, simulate, publish and execute operations with the appropriate signing setup. A hosted World currently has a smaller set of supported calls. Try the two options below.

The interface is yours to design A World can be a workspace. Let people arrange a movement, shape a scene or compose a score.
Your World editor An application you control
Full SDK Your app makes requests
Shared operations Discover, read and build on the network
Your sign-in and signing flow Sign in to create drafts. Sign a transaction to publish.
  • Create drafts Available
  • Simulate Available
  • Publish Available
  • Execute Available
Standalone app: author and run operations with the full SDK and a signing account.
What changes when you upload a World?

An uploaded World runs in a sandbox: an isolated environment connected through a controlled host bridge. Its runtime SDK supports discovery, reads, simulation and execution. It does not currently expose draft creation or publication. Including the full SDK in the bundle does not bypass that boundary; a publishing editor needs an extended bridge and a trusted signing flow.

Package the interface, interpretation code and manifest using the World-hosting guide. Users can make contributions in Studio or with an agent while the hosted World reads them.

Leave room for the next person: offer a shared source for each property, and explain its units and ranges. That is the palette approach we practised here: a way to design reusable connectors, rather than a separate platform object.

When should a connector be allowed to run?

A condition is a rule that answers yes or no before a connector produces its values. It can be financial, such as requiring a recorded cryptocurrency payment, or non-financial, such as checking whether an algorithmic requirement is met. The connector’s creator chooses the rule and attaches it to their connector.

For a financial example, imagine that public address A must pay public address B before a connector can run. A custom payment contract could forward that payment and keep a receipt. The condition would read that receipt when someone requests a run. Sending the payment and checking it are two separate actions.

Try two kinds of condition

Imagine a maker asks for a payment before their connector can be used. A custom payment contract sends the cryptocurrency from address A to address B and records a receipt.

APublic address A
0.01 ETHNo payment yet
BPublic address B
Example payment receiptpaid = false

You send the payment separately; the condition checks that it was received.

1

Request a run

Someone asks for the connector’s output.

2

Check the condition

paid == true

Read and evaluate. No payment or other state change.

FAIL

Reject execution

This request does not return output.

Preview: the check fails, so this request is rejected.

This illustration changes only this page. It sends no payments or network requests.

Try making the algorithmic check yourself next. We’ll write return args[0] >= args[1];, attach it with [12, 10], and test a connector. A second draft with [8, 10] should be rejected.

What happens when the connector runs?

The runner checks the connector and each connector it references. If a required condition returns false, the whole request fails. If they all pass, the runner evaluates the transformations and returns the requested values. A condition permits a requested run; passing it does not start a run automatically.

A condition receives the arguments stored in the connector’s definition. It is not automatically given the generated numbers or the reader’s wallet address. Our payment example checks a specified A-to-B payment; once it is recorded, that check passes for anyone requesting that connector. Personal access rules need a design that identifies the participant explicitly.

A payment condition needs evidence it can read on chain. A recipient’s balance alone does not prove which address paid it. The payment contract, receipt format and condition must be developed together; this illustration is a possible design. Simulation uses a local Ethereum Virtual Machine whose balances and external contracts can differ from Sepolia. Test a published state-dependent condition at the execution block you intend to use.

Bring information from outside the blockchain

Makers could also develop transactions with blockchain oracles: services that bring external data onto the blockchain. A transaction would store a weather reading, an environmental measurement or a result from a public API. Custom transformations and conditions could then read that data as part of their evaluation.

A World could change its colours with the air quality, or allow an operation only when a recorded temperature reaches a threshold. This requires a suitable oracle integration; Solidity does not fetch an API directly during a run. The maker must decide which source to trust and how fresh its data must be. Learn more about how Ethereum oracles work.

Create your own transformations and conditions

Start by looking for a rule you can reuse. As more transformations, conditions and connectors using them are published, you can build more by combining what is already there. You only need new code when the available elements don’t express your idea.

You can always add a custom rule in Solidity, the language used for these smart contracts. A transformation takes a number and returns another number. A condition takes its fixed arguments and returns true or false. Studio, an agent, the API and the SDK all create the same kinds of elements.

Let’s create a repeating selection and the algorithmic check above. The selection will cycle through indexes 0, 1, 2, 3, 0, 1. Referencing pitch from 60 will give 60, 61, 62, 63, 60, 61. We’ll save and simulate drafts first, without publishing.

Reuse your new rules too. Other connectors can use these elements by name. To make them available on the network, publish the transformation and condition before the connector that references them, following the publication step. Publication is permanent and costs gas.

Practise on Sepolia. What changes on Mainnet?

The platform currently uses Sepolia, an Ethereum test network. Published elements are real smart contracts, but payments and gas use test ETH intended for experimentation. This is where you can try your rules and economic ideas before putting funds with real value at stake.

Today · practise

Sepolia

Chain ID
11155111
Funds
Test ETH from a faucet
Gas and payments
Use test funds
Your elements
Published on Sepolia
Future deployment · real funds

Ethereum Mainnet

Chain ID
1
Funds
ETH with real monetary value
Gas and payments
Spend real funds
Your elements
Need a Mainnet deployment

The ideas stay the same: create rules, combine them in connectors, and let Worlds interpret the results. The chain state changes. Sepolia balances, contracts, payment receipts and oracle data do not automatically move to Mainnet. The platform and its dependencies need production deployments, and contributions need to reference elements on that network.

For this tutorial, keep using Sepolia. Studio’s publication flow and our signing examples expect it. Changing your wallet to Mainnet alone does not migrate the platform. A future Mainnet release will need its own endpoints, contract configuration and migration instructions. See Ethereum’s network guide for the difference between test networks and Mainnet.

How makers shape an economy

A connector’s creator chooses whether to attach a condition. They can share it without a payment requirement, or require a recorded payment before it runs. A World’s creator chooses which connectors and formats the World accepts, and how their values become something you can see, hear or use. Accepting a connector does not change the conditions its creator attached.

The connector creator’s choice Share it openly, or give it a condition.

Explore two ways a connector creator can make the same values available.

Someone requests a run

A person, World or agent

The connector creator sets the rule No condition

Anyone can request its values.

60 62 64 66
A World uses the returned values

Its creator chooses the connectors and formats it supports, and how to show, play or use their values.

Reading or simulating the connector needs no blockchain gas fee. Publishing it requires gas.

This connector has no condition. If it uses another connector, that connector’s conditions still apply.

An economy can grow from these choices across the network. Some makers might offer freely shared materials; others might ask for contributions to their work. Custom payment contracts could divide a payment between collaborators. A connector that references someone else’s connector must still satisfy that connector’s condition. Payment rules do not make public blockchain data private, and payments or royalty splits need their own implementation.

What is free, and what costs gas?

Gas is Ethereum’s fee for processing a blockchain transaction. It is separate from any payment a maker chooses to require. A connector with no financial condition can be free to run even though publishing it cost its maker gas.

Blockchain fees for the workflow in this tutorial
ActionBlockchain gas fee?
Browse definitions and read published elementsNo
Sign in, create local drafts and simulateNo
Execute on the Network through this platform’s read APINo — it reads a recorded block without sending a transaction
Publish a transformation, condition or connectorYes — the publishing account pays gas
Send a payment or update a payment receipt on chainYes — plus the payment amount, if any
Request or record an oracle update on chainYes — the integration may also charge a service fee

A read-only run evaluates transformations and conditions without spending the reader’s ETH. If you build another contract that calls them inside a blockchain transaction, that transaction does use gas. The same distinction applies on Sepolia and Mainnet; the funds used to pay differ. Hosting, external services and an AI agent’s own charges are separate from these blockchain fees. Ethereum’s gas guide explains how transaction fees work.

Help people understand what they’re using: identify which connectors require a payment, which address receives it, and what that payment permits. If you build a World, explain the requirements of the connectors it accepts.