Skip to content

Instantly share code, notes, and snippets.

@15august
15august / README.md
Created January 30, 2026 21:13 — forked from seabass011/README.md
iOS Simulator Bridge for AI Agents - gives agents eyes into mobile screens

Simctl Bridge

REST API that wraps xcrun simctl so agents can see iOS Simulator screens and catch visual bugs the DOM tree hides.

Why

Playwright gives agents browser eyes. This gives them mobile eyes.

The agent captures raw framebuffer screenshots from the iOS Simulator, bypassing the DOM entirely. CSS breaks that are invisible in Chrome DevTools become visible.

Executing quote with steps: [
{
"id": "swap",
"action": "Confirm transaction in your wallet",
"description": "Swapping USDC for VIRTUAL",
"kind": "transaction",
"items": [
{
"status": "incomplete",
"data": {
import { createClient, adaptViemWallet, getClient, MAINNET_RELAY_API, configureDynamicChains, AdaptedWallet, Execute, SvmReceipt, TransactionStepItem, convertViemChainToRelayChain, RelayChain, } from '@reservoir0x/relay-sdk';
import { parseUnits, formatUnits, createWalletClient, createPublicClient, http } from 'viem';
import { mainnet, base, arbitrum, optimism, polygon } from 'viem/chains';
import { SmartWalletClientType } from '@privy-io/js-sdk-core/smart-wallets';
// Constants for Base network
const BASE_USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
const BASE_CHAIN_ID = 8453;
const DEFAULT_SLIPPAGE = '100'; // 1%
{"chainId": 8453, "data": "0x3087505600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000988b1766ec2dd121d1e60eb3c0e92f49467e1234000000000000000000000000988b1766ec2dd121d1e60eb3c0e92f49467e12340000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000660000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000000
import { createClient, getClient, MAINNET_RELAY_API, configureDynamicChains, AdaptedWallet, Execute, SvmReceipt, TransactionStepItem, convertViemChainToRelayChain, RelayChain, } from '@reservoir0x/relay-sdk';
import { parseUnits, formatUnits } from 'viem';
import { mainnet, base, arbitrum, optimism, polygon } from 'viem/chains';
// Constants
const SOLANA_USDC_ADDRESS = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
const SOLANA_CHAIN_ID = 792703809;
const DEFAULT_FEE_PAYER = 'a23tFfciWmKgTmLhtTGS1NPg8eqUWmqQNyoUF16UBdF';
const DEFAULT_SPONSOR_ENDPOINT = 'http://localhost:3000/api/solana/sponsor';
const DEFAULT_SLIPPAGE = '100'; // 1%