morseDOCS

Launch a blog in 10 minutes

Zero to a post whose bytes are on Walrus and whose record is on Sui, with nothing but your terminal. About ten minutes, most of it waiting for a faucet.

Runs on testnet
Everything here runs on Sui testnet and Walrus testnet. Testnets reset from time to time, and blobs expire when their storage epochs run out. Testnet tokens have no value. Morse also runs on Walrus Mainnet, where the same steps cost real SUI and WAL, so get them working here first. Do not publish anything you cannot afford to lose.

What you will have

A publication on Sui that you own, one collection called posts, and one post whose body lives on Walrus and whose record lives on Sui. Nothing else: no server, no database, no account with us.

You end up withWhere it livesHow you prove it
A Publication objectSui testnetIts object id, shown by morse publication get
A posts collectionSui testnet, inside the publicationmorse collection list
Entry 0 with one public revisionRecord on Sui, bytes on Walrusmorse entry get 0 and the blob id

Get a wallet and testnet tokens

You need a Sui address with a little SUI for gas and a little WAL for storage. Both are free on testnet and take about two minutes.

StepWhereWhy
Install a walletSlush, Suiet, or any Sui Wallet Standard walletHolds your key and signs
Get testnet SUIfaucet.sui.ioGas for every on-chain action
Swap a little SUI for WALstake-wal.wal.appWalrus storage fees when you publish
Export your private keyWallet settingsA suiprivkey1... string the CLI can import
Use a throwaway key
Create a fresh wallet for Morse testnet. The CLI stores the key in an encrypted keystore under ~/.config/morse/keystores, but a key you only use for testnet is one less thing to worry about.

Install the CLI

bashnode 18+ or bun 1.2+
npm i -g @arcadiasystems/morse-cli
morse --version

If you would rather not install anything, every command below also works as npx @arcadiasystems/morse-cli ....

Point it at testnet and import your key

bash
morse config add testnet --network testnet
morse account import

account import asks for the suiprivkey1... string and a password, both hidden. Check that it took:

bash
morse status
output
profile:     testnet
network:     testnet
account:     0x7be4...11d0
publication: (none)
collection:  (none)

Create the publication

Slugs are globally unique on the network, so add a suffix. The name and slug cannot be changed later, pick ones you like.

bash
morse publication create --name "My Blog" --slug "my-blog-$(date +%s)"
morse collection create posts

Both commands set what they created as your active context, so you do not have to pass -P or -C on every call. Two transactions have been signed with your key: one created the publication and minted your OwnerCap and PublisherCap, the other added the collection.

Write and publish the first post

A post is just a file. Markdown is a good default because every reader can render it.

bash
cat > hello.md <<'EOF'
# Hello from Morse

This post has no backend. Its bytes are on Walrus, its record is on Sui.
EOF
morse entry add hello --file hello.md --epochs 14

--epochs is how long Walrus keeps the blob. The default is 3, which is about three days on testnet. Fourteen is enough for a demo you want to show people next week. The content type is inferred from the file extension.

output
Uploading 93 bytes to Walrus...
Added entry #0 "hello". (tx: D9YfjkA3...9vB)
  network:      testnet
  view: https://aggregator.walrus-testnet.walrus.space/v1/blobs/0iKeiiQ2...m7Xp
Two transactions, one command
entry add uploads the bytes to Walrus and registers the blob, then records the entry on Sui. If the second step fails you will see an error naming the blob that was already uploaded; rerun the command, the blob is not lost.

Read it back

bash
morse entry read 0

The CLI reads the post from the Walrus storage nodes and checks the bytes against the blob id recorded on Sui.

Share the record

This is the part a hosted CMS cannot do. Print the record and hand it to anyone:

bash
morse --json entry get 0 | jq .

The output includes the public head and the revision list, and for each revision the address that wrote it and the Sui object id of its Walrus blob. Paste your publication id (morse status shows it) into suiscan.xyz/testnet and anyone can see who published to it and when, without a Morse account, without trusting you.

You are live
Your publication, collection and first post exist on Sui testnet. Run morse entry list to see them, or go straight to Fix a typo without losing history for the second thing every blog needs.

If something fails

SymptomLikely causeFix
exit 2 and "No account selected" on publication createNo active account, or wrong profilemorse status, then morse account use <address>
Insufficient gas / balanceNo SUI or no WAL on the addressFaucet for SUI, swap for WAL, check the address matches morse status
ESlugAlreadyExistsSomeone used that slugAdd a suffix, the $(date +%s) trick above does this
entry read exits 3 and says no valid blob metadataA bug in the verified read in morse-cli 0.10.1, not a timing issueUpgrade to morse-cli 0.11.0; waiting does not help
entry read exits 5 and says to retry or pass --via-aggregatorThe storage nodes did not return the content; the blob may be healthyRetry, or add --via-aggregator to read through a Walrus aggregator
Post disappeared after a whileBlob epochs expired or testnet resetRepublish with a larger --epochs; the entry record on Sui is unaffected

Next