
Croquis (クロッキー)
Draw a 3 minute sticker on your phone inside LINE and gift it to a friend as a one-of-one NFT.
Demo
About
Croquis (クロッキー, Japanese for a quick sketch) is a daily drawing app that runs inside LINE, the messaging app most people in Japan already use. You get one blank canvas and a 5-minute timer. The clock starts on your first stroke and pauses if you leave the app. When time runs out, or you choose to finish early, the drawing is sealed. It's die-cut from your own strokes into a glossy sticker and becomes a one-of-one that can never be changed. It records who drew it, how long they spent and when. Stickers go on your sticker board, like stickers on the back of a laptop. The main thing to do with them is give them away. You can hand someone a physical drawing, but a digital one can be copied endlessly, so giving it means nothing. With Croquis, a gift actually leaves your board and moves to your friend's. You pick one friend in LINE's own friend picker. They get a gift message in your 1:1 chat with a frosted gift bag and an "Open your gift" button. They sign in with LINE, pull the tab on the bag, and the sticker is theirs. They don't need to already have the app or know anything about crypto. After receiving a sticker, you can send the artist gratitude through a combo mini-game inspired by Death Stranding's likes. Tap, stroke or shake a heart to build hits while a bar drains faster and faster, and the effects get more over the top as the combo grows. Gratitude is a public score on each person's stat board and the Explore leaderboards, and it can never be bought or sold. If the original artist is neither the giver nor the receiver, they still get 20% of the gratitude when their sticker is passed on. Every sticker has a transfer trail showing each time it was given and the gratitude it earned. Everyone gets 3 free daily tickets to draw. Extra tickets are sold in packs, priced in yen and paid in JPYC, a yen stablecoin. The whole design assumes artists who are suspicious of crypto. There are no wallets, seed phrases, gas prompts or "NFT" labels anywhere in the UI. Each person's handle is secretly an ENS name, each sticker is an ERC-721, and each gift goes through an onchain escrow, but it all feels like sending a sticker in LINE. The app is fully bilingual in Japanese and English.
How it's made
Frontend: Vite, React 19 and TypeScript, running as a LIFF app (LINE Front-end Framework) inside LINE's browser on iPhone. The drawing canvas, die-cut sealing, the live resin/foil sticker look and the gratitude mini-game are all custom, with no drawing library. Sealing runs in a Web Worker: it traces the outline of your strokes, cuts the sticker shape out with a border and renders five images, including a timelapse. The mini-game reads taps, stroke passes and DeviceMotion shakes. Every string is in a typed Japanese/English catalog. Backend: A Hono REST API on Node 24, with Drizzle ORM on SQLite, deployed behind the LIFF endpoint. A typed client is generated from the routes, so the frontend and API can't drift apart. Identity and invisible wallets (Privy + LINE): We wrote a small auth server that checks the LINE ID token from LIFF with LINE, then issues a short-lived JWT for Privy Custom Auth (P-256, with a JWKS endpoint). That means signing in with LINE silently creates a Privy embedded wallet and a Safe smart account for each person, with no extra step. Gas is sponsored through a paymaster, so an artist with 0 ETH can still give stickers. Stickers onchain (Ethereum Sepolia): Written in Solidity with Foundry. StickerNFT is an ERC-721 whose original artist, content hash and metadata can't change after sealing. At seal time, a backend sealer key mints the NFT to the artist's smart account. The API waits for the receipt and checks the mint's Transfer event before telling the UI the seal worked, and a retry picks up an existing mint instead of minting twice. Typed ABIs are generated with wagmi CLI, and viem is used everywhere. Gift escrow: Giving sends the sticker straight into StickerGiftEscrow using ERC-721 safeTransferFrom receiver data (gift ID, claim hash, expiry), so the recipient doesn't need an account yet. A one-time gift claim token sits only in the LINE message link; our database and the contract keep only its hash. When the friend signs in with LINE, the API finds their smart account, signs a claim authorization bound to that recipient, contract, chain and deadline, and submits the claim. The sender can take a gift back while it's still waiting, and anyone can return an expired gift to its sender. ENS (ENSv2): Each person's handle is <name>.croquis.eth, permanent and non-transferable, with its own registry and resolver on ENSv2 (vendored at the commit deployed to Sepolia). Each sealed sticker gets its own name, <number>.<artist>.croquis.eth, which follows whoever currently holds the NFT. A waiting gift gets a temporary g-<id>.gifts.croquis.eth name that goes away when the gift is received or returned. A custom CroquisResolver answers sticker and gift names directly from the NFT and escrow contracts, and everything else through CCIP-Read from a signed gateway on our API. Our Forge tests build a local copy of ENS from ENSv2's own contracts. Ticket shop (JPYC on Sui): Reserve tickets are paid in JPYC on Sui from the person's Privy Sui wallet, using @mysten/sui. The API reads the payment contract's PaymentReceived events over Sui gRPC and checks the payer, amount and reference before handing out tickets. From the ticket shop, a person can open their ENS name and see their purchase history, read from Sui GraphQL and linked to Suiscan. So one person's identity covers two chains.