suideveloper
Field guide for Sui builders

Ship on Sui.
Skip the guesswork.

Concise guides, working snippets and the right tools for Move contracts and TypeScript dApps on the Sui blockchain.

Why Sui

A chain designed around objects

Sui’s data model lets independent transactions run in parallel, which shapes how you design contracts and apps.

Objects, not accounts
State lives in typed objects with owners. Transactions touching different objects never contend.
Parallel by default
Owned-object transactions skip consensus entirely; Mysticeti handles shared state with sub-second finality.
Programmable transactions
Chain up to 1,024 Move calls in one atomic PTB, composed client-side, with no custom contract needed.
zkLogin
Users sign in with Google or Apple and get a self-custodial address without seed phrases.
Sponsored transactions
Pay gas on behalf of your users so onboarding feels like a normal app.
Move safety
Resources can’t be copied or dropped by accident. Whole classes of exploits disappear at compile time.

Quickstart

From zero to published in four steps

  1. 1

    Install the Sui CLI

    terminal
    brew install sui
  2. 2

    Create an address on testnet

    terminal
    sui client new-env --alias testnet --rpc https://fullnode.testnet.sui.io:443
    sui client switch --env testnet
    sui client new-address ed25519

    Fund it from faucet.sui.io.

  3. 3

    Write and test a Move package

    terminal
    sui move new hello
    cd hello
    sui move test
    sources/counter.move
    module hello::counter;
    
    public struct Counter has key {
        id: UID,
        value: u64,
    }
    
    public fun create(ctx: &mut TxContext) {
        transfer::share_object(Counter {
            id: object::new(ctx),
            value: 0,
        })
    }
    
    public fun increment(c: &mut Counter) {
        c.value = c.value + 1;
    }
  4. 4

    Publish and call it

    terminal
    sui client publish
    app.ts
    import { SuiClient, getFullnodeUrl } from '@mysten/sui/client'
    import { Transaction } from '@mysten/sui/transactions'
    
    const client = new SuiClient({ url: getFullnodeUrl('testnet') })
    
    const tx = new Transaction()
    tx.moveCall({
      target: `${PACKAGE_ID}::counter::increment`,
      arguments: [tx.object(COUNTER_ID)],
    })
    
    await client.signAndExecuteTransaction({ signer, transaction: tx })

The stack

Tools worth knowing

The core pieces of a modern Sui application, from contracts to storage.

Learn

Common questions

More is on the way

Deep dives on Move patterns, PTB recipes and full-stack templates are coming soon.