[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-rivet-rivetkit-client-swiftui":3,"mdc-1yacol-key":38,"related-org-rivet-rivetkit-client-swiftui":2700,"related-repo-rivet-rivetkit-client-swiftui":2906},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":33,"sourceUrl":36,"mdContent":37},"rivetkit-client-swiftui","build SwiftUI apps with RivetKit","RivetKit SwiftUI client guidance. Use for SwiftUI apps that connect to Rivet Actors with RivetKitSwiftUI, @Actor, rivetKit view modifiers, and SwiftUI bindings.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"rivet","Rivet","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Frivet.png","rivet-dev",[13,17,18,21,24],{"name":14,"slug":15,"type":16},"SwiftUI","swiftui","tag",{"name":9,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"iOS","ios",{"name":22,"slug":23,"type":16},"Mobile","mobile",{"name":25,"slug":26,"type":16},"Frontend","frontend",17,"https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Fskills","2026-07-24T05:38:57.108226",null,7,[],{"repoUrl":28,"stars":27,"forks":31,"topics":34,"description":35},[],"Generated skill files for Rivet AI integrations","https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Fskills\u002Ftree\u002FHEAD\u002Frivetkit-client-swiftui","---\nname: \"rivetkit-client-swiftui\"\ndescription: \"RivetKit SwiftUI client guidance. Use for SwiftUI apps that connect to Rivet Actors with RivetKitSwiftUI, @Actor, rivetKit view modifiers, and SwiftUI bindings.\"\n---\n\n# RivetKit SwiftUI Client\n\nUse this skill when building SwiftUI apps that connect to Rivet Actors with `RivetKitSwiftUI`.\n\n## Version\n\nRivetKit version: 2.3.7\n\n## Error Handling Policy\n\n- Prefer fail-fast behavior by default.\n- Avoid broad `do\u002Fcatch` unless absolutely needed.\n- If a catch block is used, handle the error explicitly, at minimum by logging it.\n\n## Install\n\nAdd the Swift package dependency and import `RivetKitSwiftUI`:\n\n```swift\n\u002F\u002F Package.swift\ndependencies: [\n    .package(url: \"https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Frivetkit-swift\", from: \"2.0.0\")\n]\n\ntargets: [\n    .target(\n        name: \"MyApp\",\n        dependencies: [\n            .product(name: \"RivetKitSwiftUI\", package: \"rivetkit-swift\")\n        ]\n    )\n]\n```\n\n`RivetKitSwiftUI` re-exports `RivetKitClient` and `SwiftUI`, so a single import covers both.\n\n## Minimal Client\n\n```swift HelloWorldApp.swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\n@main\nstruct HelloWorldApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .rivetKit(endpoint: \"https:\u002F\u002Fmy-namespace:pk_...@api.rivet.dev\")\n        }\n    }\n}\n```\n\n```swift ContentView.swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct ContentView: View {\n    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n    @State private var count = 0\n\n    var body: some View {\n        VStack(spacing: 16) {\n            Text(\"\\(count)\")\n                .font(.system(size: 64, weight: .bold, design: .rounded))\n\n            Button(\"Increment\") {\n                counter.send(\"increment\", 1)\n            }\n            .disabled(!counter.isConnected)\n        }\n        .task {\n            count = (try? await counter.action(\"getCount\")) ?? 0\n        }\n        .onActorEvent(counter, \"newCount\") { (newCount: Int) in\n            count = newCount\n        }\n    }\n}\n```\n\n## Actor Options\n\nThe `@Actor` property wrapper always uses get-or-create semantics and accepts:\n\n- `name` (required)\n- `key` as `String` or `[String]` (required)\n- `params` (optional connection parameters)\n- `createWithInput` (optional creation input)\n- `createInRegion` (optional creation hint)\n- `enabled` (toggle connection lifecycle)\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct ConnParams: Encodable {\n    let authToken: String\n}\n\nstruct ChatView: View {\n    @Actor(\n        \"chatRoom\",\n        key: [\"general\"],\n        params: ConnParams(authToken: \"jwt-token\"),\n        enabled: true\n    ) private var chat\n\n    var body: some View {\n        Text(\"Chat: \\(chat.connStatus.rawValue)\")\n    }\n}\n```\n\n## Actions\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct CounterView: View {\n    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n    @State private var count = 0\n    @State private var name = \"\"\n\n    var body: some View {\n        VStack {\n            Text(\"Count: \\(count)\")\n            Text(\"Name: \\(name)\")\n\n            Button(\"Fetch\") {\n                Task {\n                    count = try await counter.action(\"getCount\")\n                    name = try await counter.action(\"rename\", \"new-name\")\n                }\n            }\n\n            Button(\"Increment\") {\n                counter.send(\"increment\", 1)\n            }\n        }\n    }\n}\n```\n\n## Subscribing to Events\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct GameView: View {\n    @Actor(\"game\", key: [\"game-1\"]) private var game\n    @State private var count = 0\n    @State private var isGameOver = false\n\n    var body: some View {\n        VStack {\n            Text(\"Count: \\(count)\")\n            if isGameOver {\n                Text(\"Game Over!\")\n            }\n        }\n        .onActorEvent(game, \"newCount\") { (newCount: Int) in\n            count = newCount\n        }\n        .onActorEvent(game, \"gameOver\") {\n            isGameOver = true\n        }\n    }\n}\n```\n\n## Async Event Streams\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct ChatView: View {\n    @Actor(\"chatRoom\", key: [\"general\"]) private var chat\n    @State private var messages: [String] = []\n\n    var body: some View {\n        List(messages, id: \\.self) { message in\n            Text(message)\n        }\n        .task {\n            for await message in chat.events(\"message\", as: String.self) {\n                messages.append(message)\n            }\n        }\n    }\n}\n```\n\n## Connection Status\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct StatusView: View {\n    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n    @State private var count = 0\n\n    var body: some View {\n        VStack {\n            Text(\"Status: \\(counter.connStatus.rawValue)\")\n\n            if counter.connStatus == .connected {\n                Text(\"Connected!\")\n                    .foregroundStyle(.green)\n            }\n\n            Button(\"Fetch via Handle\") {\n                Task {\n                    if let handle = counter.handle {\n                        count = try await handle.action(\"getCount\", as: Int.self)\n                    }\n                }\n            }\n            .disabled(!counter.isConnected)\n        }\n    }\n}\n```\n\n## Error Handling\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct UserView: View {\n    @Actor(\"user\", key: [\"user-123\"]) private var user\n    @State private var errorMessage: String?\n    @State private var username = \"\"\n\n    var body: some View {\n        VStack {\n            TextField(\"Username\", text: $username)\n\n            Button(\"Update Username\") {\n                Task {\n                    do {\n                        let _: String = try await user.action(\"updateUsername\", username)\n                    } catch let error as ActorError {\n                        errorMessage = \"\\(error.code): \\(String(describing: error.metadata))\"\n                    }\n                }\n            }\n\n            if let errorMessage {\n                Text(errorMessage)\n                    .foregroundStyle(.red)\n            }\n        }\n        .onActorError(user) { error in\n            errorMessage = \"\\(error.group).\\(error.code): \\(error.message)\"\n        }\n    }\n}\n```\n\n## Concepts\n\n### Keys\n\nKeys uniquely identify actor instances. Use compound keys (arrays) for hierarchical addressing:\n\n```swift\nimport RivetKitSwiftUI\nimport SwiftUI\n\nstruct OrgChatView: View {\n    @Actor(\"chatRoom\", key: [\"org-acme\", \"general\"]) private var room\n\n    var body: some View {\n        Text(\"Room: \\(room.connStatus.rawValue)\")\n    }\n}\n```\n\nDon't build keys with string interpolation like `\"org:\\(userId)\"` when `userId` contains user data. Use arrays instead to prevent key injection attacks.\n\n### Environment Configuration\n\nCall `.rivetKit(endpoint:)` or `.rivetKit(client:)` once at the root of your view tree:\n\n```swift\n\u002F\u002F With endpoint string (recommended for most apps)\n@main\nstruct MyApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .rivetKit(endpoint: \"https:\u002F\u002Fmy-namespace:pk_...@api.rivet.dev\")\n        }\n    }\n}\n\n\u002F\u002F With custom client (for advanced configuration)\n@main\nstruct MyApp: App {\n    private let client = RivetKitClient(\n        config: try! ClientConfig(endpoint: \"https:\u002F\u002Fapi.rivet.dev\", token: \"pk_...\")\n    )\n\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .rivetKit(client: client)\n        }\n    }\n}\n```\n\nWhen using `.rivetKit(endpoint:)`, the client is created once and cached per endpoint. When using `.rivetKit(client:)`, store the client as a property on `App` (not inside `body`) since SwiftUI can call `body` multiple times.\n\n### Environment Variables\n\n`ClientConfig` reads optional values from environment variables:\n\n- `RIVET_NAMESPACE` - Namespace (can also be in endpoint URL)\n- `RIVET_TOKEN` - Authentication token (can also be in endpoint URL)\n- `RIVET_RUNNER` - Runner name (defaults to `\"default\"`)\n\nThe endpoint is always required. There is no default endpoint.\n\n### Endpoint Format\n\nEndpoints support URL auth syntax:\n\n```\nhttps:\u002F\u002Fnamespace:token@api.rivet.dev\n```\n\nYou can also pass the endpoint without auth and provide `RIVET_NAMESPACE` and `RIVET_TOKEN` separately. For serverless deployments, set the endpoint to your app's `\u002Fapi\u002Frivet` URL. See [Endpoints](\u002Fdocs\u002Fgeneral\u002Fendpoints#url-auth-syntax) for details.\n\n## API Reference\n\n### Property Wrapper\n- `@Actor(name, key:, params:, createWithInput:, createInRegion:, enabled:)` - SwiftUI property wrapper for actor connections\n\n### View Modifiers\n- `.rivetKit(endpoint:)` - Configure client with an endpoint URL (creates cached client)\n- `.rivetKit(client:)` - Configure client with a custom instance\n- `.onActorEvent(actor, event) { ... }` - Subscribe to actor events (supports 0–5 typed args)\n- `.onActorError(actor) { error in ... }` - Handle actor errors\n\n### ActorObservable\n- `actor.action(name, args..., as:)` - Async action call\n- `actor.send(name, args...)` - Fire-and-forget action\n- `actor.events(name, as:)` - AsyncStream of typed events\n- `actor.connStatus` - Current connection status\n- `actor.isConnected` - Whether connected\n- `actor.handle` - Underlying `ActorHandle` (optional)\n- `actor.connection` - Underlying `ActorConnection` (optional)\n- `actor.error` - Most recent error (optional)\n\n### Types\n- `ActorConnStatus` - Connection status enum (`.idle`, `.connecting`, `.connected`, `.disconnected`, `.disposed`)\n- `ActorError` - Typed actor errors with `group`, `code`, `message`, `metadata`\n\n## Need More Than the Client?\n\nIf you need more about Rivet Actors, registries, or server-side RivetKit, add the main skill:\n\n```bash\nnpx skills add rivet-dev\u002Fskills\n```\n\nThen use the `rivetkit` skill for backend guidance.\n\n",{"data":39,"body":40},{"name":4,"description":6},{"type":41,"children":42},"root",[43,52,67,74,79,85,113,119,131,260,285,291,394,603,609,622,706,856,862,1062,1068,1244,1250,1389,1395,1601,1607,1858,1864,1871,1876,1956,1977,1983,2003,2191,2233,2239,2250,2294,2299,2305,2310,2320,2355,2361,2367,2381,2387,2432,2438,2543,2549,2636,2642,2647,2681,2694],{"type":44,"tag":45,"props":46,"children":48},"element","h1",{"id":47},"rivetkit-swiftui-client",[49],{"type":50,"value":51},"text","RivetKit SwiftUI Client",{"type":44,"tag":53,"props":54,"children":55},"p",{},[56,58,65],{"type":50,"value":57},"Use this skill when building SwiftUI apps that connect to Rivet Actors with ",{"type":44,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":50,"value":64},"RivetKitSwiftUI",{"type":50,"value":66},".",{"type":44,"tag":68,"props":69,"children":71},"h2",{"id":70},"version",[72],{"type":50,"value":73},"Version",{"type":44,"tag":53,"props":75,"children":76},{},[77],{"type":50,"value":78},"RivetKit version: 2.3.7",{"type":44,"tag":68,"props":80,"children":82},{"id":81},"error-handling-policy",[83],{"type":50,"value":84},"Error Handling Policy",{"type":44,"tag":86,"props":87,"children":88},"ul",{},[89,95,108],{"type":44,"tag":90,"props":91,"children":92},"li",{},[93],{"type":50,"value":94},"Prefer fail-fast behavior by default.",{"type":44,"tag":90,"props":96,"children":97},{},[98,100,106],{"type":50,"value":99},"Avoid broad ",{"type":44,"tag":59,"props":101,"children":103},{"className":102},[],[104],{"type":50,"value":105},"do\u002Fcatch",{"type":50,"value":107}," unless absolutely needed.",{"type":44,"tag":90,"props":109,"children":110},{},[111],{"type":50,"value":112},"If a catch block is used, handle the error explicitly, at minimum by logging it.",{"type":44,"tag":68,"props":114,"children":116},{"id":115},"install",[117],{"type":50,"value":118},"Install",{"type":44,"tag":53,"props":120,"children":121},{},[122,124,129],{"type":50,"value":123},"Add the Swift package dependency and import ",{"type":44,"tag":59,"props":125,"children":127},{"className":126},[],[128],{"type":50,"value":64},{"type":50,"value":130},":",{"type":44,"tag":132,"props":133,"children":138},"pre",{"className":134,"code":135,"language":136,"meta":137,"style":137},"language-swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Package.swift\ndependencies: [\n    .package(url: \"https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Frivetkit-swift\", from: \"2.0.0\")\n]\n\ntargets: [\n    .target(\n        name: \"MyApp\",\n        dependencies: [\n            .product(name: \"RivetKitSwiftUI\", package: \"rivetkit-swift\")\n        ]\n    )\n]\n","swift","",[139],{"type":44,"tag":59,"props":140,"children":141},{"__ignoreMap":137},[142,153,162,171,180,190,199,207,216,225,234,243,252],{"type":44,"tag":143,"props":144,"children":147},"span",{"class":145,"line":146},"line",1,[148],{"type":44,"tag":143,"props":149,"children":150},{},[151],{"type":50,"value":152},"\u002F\u002F Package.swift\n",{"type":44,"tag":143,"props":154,"children":156},{"class":145,"line":155},2,[157],{"type":44,"tag":143,"props":158,"children":159},{},[160],{"type":50,"value":161},"dependencies: [\n",{"type":44,"tag":143,"props":163,"children":165},{"class":145,"line":164},3,[166],{"type":44,"tag":143,"props":167,"children":168},{},[169],{"type":50,"value":170},"    .package(url: \"https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Frivetkit-swift\", from: \"2.0.0\")\n",{"type":44,"tag":143,"props":172,"children":174},{"class":145,"line":173},4,[175],{"type":44,"tag":143,"props":176,"children":177},{},[178],{"type":50,"value":179},"]\n",{"type":44,"tag":143,"props":181,"children":183},{"class":145,"line":182},5,[184],{"type":44,"tag":143,"props":185,"children":187},{"emptyLinePlaceholder":186},true,[188],{"type":50,"value":189},"\n",{"type":44,"tag":143,"props":191,"children":193},{"class":145,"line":192},6,[194],{"type":44,"tag":143,"props":195,"children":196},{},[197],{"type":50,"value":198},"targets: [\n",{"type":44,"tag":143,"props":200,"children":201},{"class":145,"line":31},[202],{"type":44,"tag":143,"props":203,"children":204},{},[205],{"type":50,"value":206},"    .target(\n",{"type":44,"tag":143,"props":208,"children":210},{"class":145,"line":209},8,[211],{"type":44,"tag":143,"props":212,"children":213},{},[214],{"type":50,"value":215},"        name: \"MyApp\",\n",{"type":44,"tag":143,"props":217,"children":219},{"class":145,"line":218},9,[220],{"type":44,"tag":143,"props":221,"children":222},{},[223],{"type":50,"value":224},"        dependencies: [\n",{"type":44,"tag":143,"props":226,"children":228},{"class":145,"line":227},10,[229],{"type":44,"tag":143,"props":230,"children":231},{},[232],{"type":50,"value":233},"            .product(name: \"RivetKitSwiftUI\", package: \"rivetkit-swift\")\n",{"type":44,"tag":143,"props":235,"children":237},{"class":145,"line":236},11,[238],{"type":44,"tag":143,"props":239,"children":240},{},[241],{"type":50,"value":242},"        ]\n",{"type":44,"tag":143,"props":244,"children":246},{"class":145,"line":245},12,[247],{"type":44,"tag":143,"props":248,"children":249},{},[250],{"type":50,"value":251},"    )\n",{"type":44,"tag":143,"props":253,"children":255},{"class":145,"line":254},13,[256],{"type":44,"tag":143,"props":257,"children":258},{},[259],{"type":50,"value":179},{"type":44,"tag":53,"props":261,"children":262},{},[263,268,270,276,278,283],{"type":44,"tag":59,"props":264,"children":266},{"className":265},[],[267],{"type":50,"value":64},{"type":50,"value":269}," re-exports ",{"type":44,"tag":59,"props":271,"children":273},{"className":272},[],[274],{"type":50,"value":275},"RivetKitClient",{"type":50,"value":277}," and ",{"type":44,"tag":59,"props":279,"children":281},{"className":280},[],[282],{"type":50,"value":14},{"type":50,"value":284},", so a single import covers both.",{"type":44,"tag":68,"props":286,"children":288},{"id":287},"minimal-client",[289],{"type":50,"value":290},"Minimal Client",{"type":44,"tag":132,"props":292,"children":295},{"className":134,"code":293,"language":136,"meta":294,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\n@main\nstruct HelloWorldApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .rivetKit(endpoint: \"https:\u002F\u002Fmy-namespace:pk_...@api.rivet.dev\")\n        }\n    }\n}\n","HelloWorldApp.swift",[296],{"type":44,"tag":59,"props":297,"children":298},{"__ignoreMap":137},[299,307,315,322,330,338,346,354,362,370,378,386],{"type":44,"tag":143,"props":300,"children":301},{"class":145,"line":146},[302],{"type":44,"tag":143,"props":303,"children":304},{},[305],{"type":50,"value":306},"import RivetKitSwiftUI\n",{"type":44,"tag":143,"props":308,"children":309},{"class":145,"line":155},[310],{"type":44,"tag":143,"props":311,"children":312},{},[313],{"type":50,"value":314},"import SwiftUI\n",{"type":44,"tag":143,"props":316,"children":317},{"class":145,"line":164},[318],{"type":44,"tag":143,"props":319,"children":320},{"emptyLinePlaceholder":186},[321],{"type":50,"value":189},{"type":44,"tag":143,"props":323,"children":324},{"class":145,"line":173},[325],{"type":44,"tag":143,"props":326,"children":327},{},[328],{"type":50,"value":329},"@main\n",{"type":44,"tag":143,"props":331,"children":332},{"class":145,"line":182},[333],{"type":44,"tag":143,"props":334,"children":335},{},[336],{"type":50,"value":337},"struct HelloWorldApp: App {\n",{"type":44,"tag":143,"props":339,"children":340},{"class":145,"line":192},[341],{"type":44,"tag":143,"props":342,"children":343},{},[344],{"type":50,"value":345},"    var body: some Scene {\n",{"type":44,"tag":143,"props":347,"children":348},{"class":145,"line":31},[349],{"type":44,"tag":143,"props":350,"children":351},{},[352],{"type":50,"value":353},"        WindowGroup {\n",{"type":44,"tag":143,"props":355,"children":356},{"class":145,"line":209},[357],{"type":44,"tag":143,"props":358,"children":359},{},[360],{"type":50,"value":361},"            ContentView()\n",{"type":44,"tag":143,"props":363,"children":364},{"class":145,"line":218},[365],{"type":44,"tag":143,"props":366,"children":367},{},[368],{"type":50,"value":369},"                .rivetKit(endpoint: \"https:\u002F\u002Fmy-namespace:pk_...@api.rivet.dev\")\n",{"type":44,"tag":143,"props":371,"children":372},{"class":145,"line":227},[373],{"type":44,"tag":143,"props":374,"children":375},{},[376],{"type":50,"value":377},"        }\n",{"type":44,"tag":143,"props":379,"children":380},{"class":145,"line":236},[381],{"type":44,"tag":143,"props":382,"children":383},{},[384],{"type":50,"value":385},"    }\n",{"type":44,"tag":143,"props":387,"children":388},{"class":145,"line":245},[389],{"type":44,"tag":143,"props":390,"children":391},{},[392],{"type":50,"value":393},"}\n",{"type":44,"tag":132,"props":395,"children":398},{"className":134,"code":396,"language":136,"meta":397,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct ContentView: View {\n    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n    @State private var count = 0\n\n    var body: some View {\n        VStack(spacing: 16) {\n            Text(\"\\(count)\")\n                .font(.system(size: 64, weight: .bold, design: .rounded))\n\n            Button(\"Increment\") {\n                counter.send(\"increment\", 1)\n            }\n            .disabled(!counter.isConnected)\n        }\n        .task {\n            count = (try? await counter.action(\"getCount\")) ?? 0\n        }\n        .onActorEvent(counter, \"newCount\") { (newCount: Int) in\n            count = newCount\n        }\n    }\n}\n","ContentView.swift",[399],{"type":44,"tag":59,"props":400,"children":401},{"__ignoreMap":137},[402,409,416,423,431,439,447,454,462,470,478,486,493,501,510,519,528,535,544,553,561,570,579,587,595],{"type":44,"tag":143,"props":403,"children":404},{"class":145,"line":146},[405],{"type":44,"tag":143,"props":406,"children":407},{},[408],{"type":50,"value":306},{"type":44,"tag":143,"props":410,"children":411},{"class":145,"line":155},[412],{"type":44,"tag":143,"props":413,"children":414},{},[415],{"type":50,"value":314},{"type":44,"tag":143,"props":417,"children":418},{"class":145,"line":164},[419],{"type":44,"tag":143,"props":420,"children":421},{"emptyLinePlaceholder":186},[422],{"type":50,"value":189},{"type":44,"tag":143,"props":424,"children":425},{"class":145,"line":173},[426],{"type":44,"tag":143,"props":427,"children":428},{},[429],{"type":50,"value":430},"struct ContentView: View {\n",{"type":44,"tag":143,"props":432,"children":433},{"class":145,"line":182},[434],{"type":44,"tag":143,"props":435,"children":436},{},[437],{"type":50,"value":438},"    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n",{"type":44,"tag":143,"props":440,"children":441},{"class":145,"line":192},[442],{"type":44,"tag":143,"props":443,"children":444},{},[445],{"type":50,"value":446},"    @State private var count = 0\n",{"type":44,"tag":143,"props":448,"children":449},{"class":145,"line":31},[450],{"type":44,"tag":143,"props":451,"children":452},{"emptyLinePlaceholder":186},[453],{"type":50,"value":189},{"type":44,"tag":143,"props":455,"children":456},{"class":145,"line":209},[457],{"type":44,"tag":143,"props":458,"children":459},{},[460],{"type":50,"value":461},"    var body: some View {\n",{"type":44,"tag":143,"props":463,"children":464},{"class":145,"line":218},[465],{"type":44,"tag":143,"props":466,"children":467},{},[468],{"type":50,"value":469},"        VStack(spacing: 16) {\n",{"type":44,"tag":143,"props":471,"children":472},{"class":145,"line":227},[473],{"type":44,"tag":143,"props":474,"children":475},{},[476],{"type":50,"value":477},"            Text(\"\\(count)\")\n",{"type":44,"tag":143,"props":479,"children":480},{"class":145,"line":236},[481],{"type":44,"tag":143,"props":482,"children":483},{},[484],{"type":50,"value":485},"                .font(.system(size: 64, weight: .bold, design: .rounded))\n",{"type":44,"tag":143,"props":487,"children":488},{"class":145,"line":245},[489],{"type":44,"tag":143,"props":490,"children":491},{"emptyLinePlaceholder":186},[492],{"type":50,"value":189},{"type":44,"tag":143,"props":494,"children":495},{"class":145,"line":254},[496],{"type":44,"tag":143,"props":497,"children":498},{},[499],{"type":50,"value":500},"            Button(\"Increment\") {\n",{"type":44,"tag":143,"props":502,"children":504},{"class":145,"line":503},14,[505],{"type":44,"tag":143,"props":506,"children":507},{},[508],{"type":50,"value":509},"                counter.send(\"increment\", 1)\n",{"type":44,"tag":143,"props":511,"children":513},{"class":145,"line":512},15,[514],{"type":44,"tag":143,"props":515,"children":516},{},[517],{"type":50,"value":518},"            }\n",{"type":44,"tag":143,"props":520,"children":522},{"class":145,"line":521},16,[523],{"type":44,"tag":143,"props":524,"children":525},{},[526],{"type":50,"value":527},"            .disabled(!counter.isConnected)\n",{"type":44,"tag":143,"props":529,"children":530},{"class":145,"line":27},[531],{"type":44,"tag":143,"props":532,"children":533},{},[534],{"type":50,"value":377},{"type":44,"tag":143,"props":536,"children":538},{"class":145,"line":537},18,[539],{"type":44,"tag":143,"props":540,"children":541},{},[542],{"type":50,"value":543},"        .task {\n",{"type":44,"tag":143,"props":545,"children":547},{"class":145,"line":546},19,[548],{"type":44,"tag":143,"props":549,"children":550},{},[551],{"type":50,"value":552},"            count = (try? await counter.action(\"getCount\")) ?? 0\n",{"type":44,"tag":143,"props":554,"children":556},{"class":145,"line":555},20,[557],{"type":44,"tag":143,"props":558,"children":559},{},[560],{"type":50,"value":377},{"type":44,"tag":143,"props":562,"children":564},{"class":145,"line":563},21,[565],{"type":44,"tag":143,"props":566,"children":567},{},[568],{"type":50,"value":569},"        .onActorEvent(counter, \"newCount\") { (newCount: Int) in\n",{"type":44,"tag":143,"props":571,"children":573},{"class":145,"line":572},22,[574],{"type":44,"tag":143,"props":575,"children":576},{},[577],{"type":50,"value":578},"            count = newCount\n",{"type":44,"tag":143,"props":580,"children":582},{"class":145,"line":581},23,[583],{"type":44,"tag":143,"props":584,"children":585},{},[586],{"type":50,"value":377},{"type":44,"tag":143,"props":588,"children":590},{"class":145,"line":589},24,[591],{"type":44,"tag":143,"props":592,"children":593},{},[594],{"type":50,"value":385},{"type":44,"tag":143,"props":596,"children":598},{"class":145,"line":597},25,[599],{"type":44,"tag":143,"props":600,"children":601},{},[602],{"type":50,"value":393},{"type":44,"tag":68,"props":604,"children":606},{"id":605},"actor-options",[607],{"type":50,"value":608},"Actor Options",{"type":44,"tag":53,"props":610,"children":611},{},[612,614,620],{"type":50,"value":613},"The ",{"type":44,"tag":59,"props":615,"children":617},{"className":616},[],[618],{"type":50,"value":619},"@Actor",{"type":50,"value":621}," property wrapper always uses get-or-create semantics and accepts:",{"type":44,"tag":86,"props":623,"children":624},{},[625,636,662,673,684,695],{"type":44,"tag":90,"props":626,"children":627},{},[628,634],{"type":44,"tag":59,"props":629,"children":631},{"className":630},[],[632],{"type":50,"value":633},"name",{"type":50,"value":635}," (required)",{"type":44,"tag":90,"props":637,"children":638},{},[639,645,647,653,655,661],{"type":44,"tag":59,"props":640,"children":642},{"className":641},[],[643],{"type":50,"value":644},"key",{"type":50,"value":646}," as ",{"type":44,"tag":59,"props":648,"children":650},{"className":649},[],[651],{"type":50,"value":652},"String",{"type":50,"value":654}," or ",{"type":44,"tag":59,"props":656,"children":658},{"className":657},[],[659],{"type":50,"value":660},"[String]",{"type":50,"value":635},{"type":44,"tag":90,"props":663,"children":664},{},[665,671],{"type":44,"tag":59,"props":666,"children":668},{"className":667},[],[669],{"type":50,"value":670},"params",{"type":50,"value":672}," (optional connection parameters)",{"type":44,"tag":90,"props":674,"children":675},{},[676,682],{"type":44,"tag":59,"props":677,"children":679},{"className":678},[],[680],{"type":50,"value":681},"createWithInput",{"type":50,"value":683}," (optional creation input)",{"type":44,"tag":90,"props":685,"children":686},{},[687,693],{"type":44,"tag":59,"props":688,"children":690},{"className":689},[],[691],{"type":50,"value":692},"createInRegion",{"type":50,"value":694}," (optional creation hint)",{"type":44,"tag":90,"props":696,"children":697},{},[698,704],{"type":44,"tag":59,"props":699,"children":701},{"className":700},[],[702],{"type":50,"value":703},"enabled",{"type":50,"value":705}," (toggle connection lifecycle)",{"type":44,"tag":132,"props":707,"children":709},{"className":134,"code":708,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct ConnParams: Encodable {\n    let authToken: String\n}\n\nstruct ChatView: View {\n    @Actor(\n        \"chatRoom\",\n        key: [\"general\"],\n        params: ConnParams(authToken: \"jwt-token\"),\n        enabled: true\n    ) private var chat\n\n    var body: some View {\n        Text(\"Chat: \\(chat.connStatus.rawValue)\")\n    }\n}\n",[710],{"type":44,"tag":59,"props":711,"children":712},{"__ignoreMap":137},[713,720,727,734,742,750,757,764,772,780,788,796,804,812,820,827,834,842,849],{"type":44,"tag":143,"props":714,"children":715},{"class":145,"line":146},[716],{"type":44,"tag":143,"props":717,"children":718},{},[719],{"type":50,"value":306},{"type":44,"tag":143,"props":721,"children":722},{"class":145,"line":155},[723],{"type":44,"tag":143,"props":724,"children":725},{},[726],{"type":50,"value":314},{"type":44,"tag":143,"props":728,"children":729},{"class":145,"line":164},[730],{"type":44,"tag":143,"props":731,"children":732},{"emptyLinePlaceholder":186},[733],{"type":50,"value":189},{"type":44,"tag":143,"props":735,"children":736},{"class":145,"line":173},[737],{"type":44,"tag":143,"props":738,"children":739},{},[740],{"type":50,"value":741},"struct ConnParams: Encodable {\n",{"type":44,"tag":143,"props":743,"children":744},{"class":145,"line":182},[745],{"type":44,"tag":143,"props":746,"children":747},{},[748],{"type":50,"value":749},"    let authToken: String\n",{"type":44,"tag":143,"props":751,"children":752},{"class":145,"line":192},[753],{"type":44,"tag":143,"props":754,"children":755},{},[756],{"type":50,"value":393},{"type":44,"tag":143,"props":758,"children":759},{"class":145,"line":31},[760],{"type":44,"tag":143,"props":761,"children":762},{"emptyLinePlaceholder":186},[763],{"type":50,"value":189},{"type":44,"tag":143,"props":765,"children":766},{"class":145,"line":209},[767],{"type":44,"tag":143,"props":768,"children":769},{},[770],{"type":50,"value":771},"struct ChatView: View {\n",{"type":44,"tag":143,"props":773,"children":774},{"class":145,"line":218},[775],{"type":44,"tag":143,"props":776,"children":777},{},[778],{"type":50,"value":779},"    @Actor(\n",{"type":44,"tag":143,"props":781,"children":782},{"class":145,"line":227},[783],{"type":44,"tag":143,"props":784,"children":785},{},[786],{"type":50,"value":787},"        \"chatRoom\",\n",{"type":44,"tag":143,"props":789,"children":790},{"class":145,"line":236},[791],{"type":44,"tag":143,"props":792,"children":793},{},[794],{"type":50,"value":795},"        key: [\"general\"],\n",{"type":44,"tag":143,"props":797,"children":798},{"class":145,"line":245},[799],{"type":44,"tag":143,"props":800,"children":801},{},[802],{"type":50,"value":803},"        params: ConnParams(authToken: \"jwt-token\"),\n",{"type":44,"tag":143,"props":805,"children":806},{"class":145,"line":254},[807],{"type":44,"tag":143,"props":808,"children":809},{},[810],{"type":50,"value":811},"        enabled: true\n",{"type":44,"tag":143,"props":813,"children":814},{"class":145,"line":503},[815],{"type":44,"tag":143,"props":816,"children":817},{},[818],{"type":50,"value":819},"    ) private var chat\n",{"type":44,"tag":143,"props":821,"children":822},{"class":145,"line":512},[823],{"type":44,"tag":143,"props":824,"children":825},{"emptyLinePlaceholder":186},[826],{"type":50,"value":189},{"type":44,"tag":143,"props":828,"children":829},{"class":145,"line":521},[830],{"type":44,"tag":143,"props":831,"children":832},{},[833],{"type":50,"value":461},{"type":44,"tag":143,"props":835,"children":836},{"class":145,"line":27},[837],{"type":44,"tag":143,"props":838,"children":839},{},[840],{"type":50,"value":841},"        Text(\"Chat: \\(chat.connStatus.rawValue)\")\n",{"type":44,"tag":143,"props":843,"children":844},{"class":145,"line":537},[845],{"type":44,"tag":143,"props":846,"children":847},{},[848],{"type":50,"value":385},{"type":44,"tag":143,"props":850,"children":851},{"class":145,"line":546},[852],{"type":44,"tag":143,"props":853,"children":854},{},[855],{"type":50,"value":393},{"type":44,"tag":68,"props":857,"children":859},{"id":858},"actions",[860],{"type":50,"value":861},"Actions",{"type":44,"tag":132,"props":863,"children":865},{"className":134,"code":864,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct CounterView: View {\n    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n    @State private var count = 0\n    @State private var name = \"\"\n\n    var body: some View {\n        VStack {\n            Text(\"Count: \\(count)\")\n            Text(\"Name: \\(name)\")\n\n            Button(\"Fetch\") {\n                Task {\n                    count = try await counter.action(\"getCount\")\n                    name = try await counter.action(\"rename\", \"new-name\")\n                }\n            }\n\n            Button(\"Increment\") {\n                counter.send(\"increment\", 1)\n            }\n        }\n    }\n}\n",[866],{"type":44,"tag":59,"props":867,"children":868},{"__ignoreMap":137},[869,876,883,890,898,905,912,920,927,934,942,950,958,965,973,981,989,997,1005,1012,1019,1026,1033,1040,1047,1054],{"type":44,"tag":143,"props":870,"children":871},{"class":145,"line":146},[872],{"type":44,"tag":143,"props":873,"children":874},{},[875],{"type":50,"value":306},{"type":44,"tag":143,"props":877,"children":878},{"class":145,"line":155},[879],{"type":44,"tag":143,"props":880,"children":881},{},[882],{"type":50,"value":314},{"type":44,"tag":143,"props":884,"children":885},{"class":145,"line":164},[886],{"type":44,"tag":143,"props":887,"children":888},{"emptyLinePlaceholder":186},[889],{"type":50,"value":189},{"type":44,"tag":143,"props":891,"children":892},{"class":145,"line":173},[893],{"type":44,"tag":143,"props":894,"children":895},{},[896],{"type":50,"value":897},"struct CounterView: View {\n",{"type":44,"tag":143,"props":899,"children":900},{"class":145,"line":182},[901],{"type":44,"tag":143,"props":902,"children":903},{},[904],{"type":50,"value":438},{"type":44,"tag":143,"props":906,"children":907},{"class":145,"line":192},[908],{"type":44,"tag":143,"props":909,"children":910},{},[911],{"type":50,"value":446},{"type":44,"tag":143,"props":913,"children":914},{"class":145,"line":31},[915],{"type":44,"tag":143,"props":916,"children":917},{},[918],{"type":50,"value":919},"    @State private var name = \"\"\n",{"type":44,"tag":143,"props":921,"children":922},{"class":145,"line":209},[923],{"type":44,"tag":143,"props":924,"children":925},{"emptyLinePlaceholder":186},[926],{"type":50,"value":189},{"type":44,"tag":143,"props":928,"children":929},{"class":145,"line":218},[930],{"type":44,"tag":143,"props":931,"children":932},{},[933],{"type":50,"value":461},{"type":44,"tag":143,"props":935,"children":936},{"class":145,"line":227},[937],{"type":44,"tag":143,"props":938,"children":939},{},[940],{"type":50,"value":941},"        VStack {\n",{"type":44,"tag":143,"props":943,"children":944},{"class":145,"line":236},[945],{"type":44,"tag":143,"props":946,"children":947},{},[948],{"type":50,"value":949},"            Text(\"Count: \\(count)\")\n",{"type":44,"tag":143,"props":951,"children":952},{"class":145,"line":245},[953],{"type":44,"tag":143,"props":954,"children":955},{},[956],{"type":50,"value":957},"            Text(\"Name: \\(name)\")\n",{"type":44,"tag":143,"props":959,"children":960},{"class":145,"line":254},[961],{"type":44,"tag":143,"props":962,"children":963},{"emptyLinePlaceholder":186},[964],{"type":50,"value":189},{"type":44,"tag":143,"props":966,"children":967},{"class":145,"line":503},[968],{"type":44,"tag":143,"props":969,"children":970},{},[971],{"type":50,"value":972},"            Button(\"Fetch\") {\n",{"type":44,"tag":143,"props":974,"children":975},{"class":145,"line":512},[976],{"type":44,"tag":143,"props":977,"children":978},{},[979],{"type":50,"value":980},"                Task {\n",{"type":44,"tag":143,"props":982,"children":983},{"class":145,"line":521},[984],{"type":44,"tag":143,"props":985,"children":986},{},[987],{"type":50,"value":988},"                    count = try await counter.action(\"getCount\")\n",{"type":44,"tag":143,"props":990,"children":991},{"class":145,"line":27},[992],{"type":44,"tag":143,"props":993,"children":994},{},[995],{"type":50,"value":996},"                    name = try await counter.action(\"rename\", \"new-name\")\n",{"type":44,"tag":143,"props":998,"children":999},{"class":145,"line":537},[1000],{"type":44,"tag":143,"props":1001,"children":1002},{},[1003],{"type":50,"value":1004},"                }\n",{"type":44,"tag":143,"props":1006,"children":1007},{"class":145,"line":546},[1008],{"type":44,"tag":143,"props":1009,"children":1010},{},[1011],{"type":50,"value":518},{"type":44,"tag":143,"props":1013,"children":1014},{"class":145,"line":555},[1015],{"type":44,"tag":143,"props":1016,"children":1017},{"emptyLinePlaceholder":186},[1018],{"type":50,"value":189},{"type":44,"tag":143,"props":1020,"children":1021},{"class":145,"line":563},[1022],{"type":44,"tag":143,"props":1023,"children":1024},{},[1025],{"type":50,"value":500},{"type":44,"tag":143,"props":1027,"children":1028},{"class":145,"line":572},[1029],{"type":44,"tag":143,"props":1030,"children":1031},{},[1032],{"type":50,"value":509},{"type":44,"tag":143,"props":1034,"children":1035},{"class":145,"line":581},[1036],{"type":44,"tag":143,"props":1037,"children":1038},{},[1039],{"type":50,"value":518},{"type":44,"tag":143,"props":1041,"children":1042},{"class":145,"line":589},[1043],{"type":44,"tag":143,"props":1044,"children":1045},{},[1046],{"type":50,"value":377},{"type":44,"tag":143,"props":1048,"children":1049},{"class":145,"line":597},[1050],{"type":44,"tag":143,"props":1051,"children":1052},{},[1053],{"type":50,"value":385},{"type":44,"tag":143,"props":1055,"children":1057},{"class":145,"line":1056},26,[1058],{"type":44,"tag":143,"props":1059,"children":1060},{},[1061],{"type":50,"value":393},{"type":44,"tag":68,"props":1063,"children":1065},{"id":1064},"subscribing-to-events",[1066],{"type":50,"value":1067},"Subscribing to Events",{"type":44,"tag":132,"props":1069,"children":1071},{"className":134,"code":1070,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct GameView: View {\n    @Actor(\"game\", key: [\"game-1\"]) private var game\n    @State private var count = 0\n    @State private var isGameOver = false\n\n    var body: some View {\n        VStack {\n            Text(\"Count: \\(count)\")\n            if isGameOver {\n                Text(\"Game Over!\")\n            }\n        }\n        .onActorEvent(game, \"newCount\") { (newCount: Int) in\n            count = newCount\n        }\n        .onActorEvent(game, \"gameOver\") {\n            isGameOver = true\n        }\n    }\n}\n",[1072],{"type":44,"tag":59,"props":1073,"children":1074},{"__ignoreMap":137},[1075,1082,1089,1096,1104,1112,1119,1127,1134,1141,1148,1155,1163,1171,1178,1185,1193,1200,1207,1215,1223,1230,1237],{"type":44,"tag":143,"props":1076,"children":1077},{"class":145,"line":146},[1078],{"type":44,"tag":143,"props":1079,"children":1080},{},[1081],{"type":50,"value":306},{"type":44,"tag":143,"props":1083,"children":1084},{"class":145,"line":155},[1085],{"type":44,"tag":143,"props":1086,"children":1087},{},[1088],{"type":50,"value":314},{"type":44,"tag":143,"props":1090,"children":1091},{"class":145,"line":164},[1092],{"type":44,"tag":143,"props":1093,"children":1094},{"emptyLinePlaceholder":186},[1095],{"type":50,"value":189},{"type":44,"tag":143,"props":1097,"children":1098},{"class":145,"line":173},[1099],{"type":44,"tag":143,"props":1100,"children":1101},{},[1102],{"type":50,"value":1103},"struct GameView: View {\n",{"type":44,"tag":143,"props":1105,"children":1106},{"class":145,"line":182},[1107],{"type":44,"tag":143,"props":1108,"children":1109},{},[1110],{"type":50,"value":1111},"    @Actor(\"game\", key: [\"game-1\"]) private var game\n",{"type":44,"tag":143,"props":1113,"children":1114},{"class":145,"line":192},[1115],{"type":44,"tag":143,"props":1116,"children":1117},{},[1118],{"type":50,"value":446},{"type":44,"tag":143,"props":1120,"children":1121},{"class":145,"line":31},[1122],{"type":44,"tag":143,"props":1123,"children":1124},{},[1125],{"type":50,"value":1126},"    @State private var isGameOver = false\n",{"type":44,"tag":143,"props":1128,"children":1129},{"class":145,"line":209},[1130],{"type":44,"tag":143,"props":1131,"children":1132},{"emptyLinePlaceholder":186},[1133],{"type":50,"value":189},{"type":44,"tag":143,"props":1135,"children":1136},{"class":145,"line":218},[1137],{"type":44,"tag":143,"props":1138,"children":1139},{},[1140],{"type":50,"value":461},{"type":44,"tag":143,"props":1142,"children":1143},{"class":145,"line":227},[1144],{"type":44,"tag":143,"props":1145,"children":1146},{},[1147],{"type":50,"value":941},{"type":44,"tag":143,"props":1149,"children":1150},{"class":145,"line":236},[1151],{"type":44,"tag":143,"props":1152,"children":1153},{},[1154],{"type":50,"value":949},{"type":44,"tag":143,"props":1156,"children":1157},{"class":145,"line":245},[1158],{"type":44,"tag":143,"props":1159,"children":1160},{},[1161],{"type":50,"value":1162},"            if isGameOver {\n",{"type":44,"tag":143,"props":1164,"children":1165},{"class":145,"line":254},[1166],{"type":44,"tag":143,"props":1167,"children":1168},{},[1169],{"type":50,"value":1170},"                Text(\"Game Over!\")\n",{"type":44,"tag":143,"props":1172,"children":1173},{"class":145,"line":503},[1174],{"type":44,"tag":143,"props":1175,"children":1176},{},[1177],{"type":50,"value":518},{"type":44,"tag":143,"props":1179,"children":1180},{"class":145,"line":512},[1181],{"type":44,"tag":143,"props":1182,"children":1183},{},[1184],{"type":50,"value":377},{"type":44,"tag":143,"props":1186,"children":1187},{"class":145,"line":521},[1188],{"type":44,"tag":143,"props":1189,"children":1190},{},[1191],{"type":50,"value":1192},"        .onActorEvent(game, \"newCount\") { (newCount: Int) in\n",{"type":44,"tag":143,"props":1194,"children":1195},{"class":145,"line":27},[1196],{"type":44,"tag":143,"props":1197,"children":1198},{},[1199],{"type":50,"value":578},{"type":44,"tag":143,"props":1201,"children":1202},{"class":145,"line":537},[1203],{"type":44,"tag":143,"props":1204,"children":1205},{},[1206],{"type":50,"value":377},{"type":44,"tag":143,"props":1208,"children":1209},{"class":145,"line":546},[1210],{"type":44,"tag":143,"props":1211,"children":1212},{},[1213],{"type":50,"value":1214},"        .onActorEvent(game, \"gameOver\") {\n",{"type":44,"tag":143,"props":1216,"children":1217},{"class":145,"line":555},[1218],{"type":44,"tag":143,"props":1219,"children":1220},{},[1221],{"type":50,"value":1222},"            isGameOver = true\n",{"type":44,"tag":143,"props":1224,"children":1225},{"class":145,"line":563},[1226],{"type":44,"tag":143,"props":1227,"children":1228},{},[1229],{"type":50,"value":377},{"type":44,"tag":143,"props":1231,"children":1232},{"class":145,"line":572},[1233],{"type":44,"tag":143,"props":1234,"children":1235},{},[1236],{"type":50,"value":385},{"type":44,"tag":143,"props":1238,"children":1239},{"class":145,"line":581},[1240],{"type":44,"tag":143,"props":1241,"children":1242},{},[1243],{"type":50,"value":393},{"type":44,"tag":68,"props":1245,"children":1247},{"id":1246},"async-event-streams",[1248],{"type":50,"value":1249},"Async Event Streams",{"type":44,"tag":132,"props":1251,"children":1253},{"className":134,"code":1252,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct ChatView: View {\n    @Actor(\"chatRoom\", key: [\"general\"]) private var chat\n    @State private var messages: [String] = []\n\n    var body: some View {\n        List(messages, id: \\.self) { message in\n            Text(message)\n        }\n        .task {\n            for await message in chat.events(\"message\", as: String.self) {\n                messages.append(message)\n            }\n        }\n    }\n}\n",[1254],{"type":44,"tag":59,"props":1255,"children":1256},{"__ignoreMap":137},[1257,1264,1271,1278,1285,1293,1301,1308,1315,1323,1331,1338,1345,1353,1361,1368,1375,1382],{"type":44,"tag":143,"props":1258,"children":1259},{"class":145,"line":146},[1260],{"type":44,"tag":143,"props":1261,"children":1262},{},[1263],{"type":50,"value":306},{"type":44,"tag":143,"props":1265,"children":1266},{"class":145,"line":155},[1267],{"type":44,"tag":143,"props":1268,"children":1269},{},[1270],{"type":50,"value":314},{"type":44,"tag":143,"props":1272,"children":1273},{"class":145,"line":164},[1274],{"type":44,"tag":143,"props":1275,"children":1276},{"emptyLinePlaceholder":186},[1277],{"type":50,"value":189},{"type":44,"tag":143,"props":1279,"children":1280},{"class":145,"line":173},[1281],{"type":44,"tag":143,"props":1282,"children":1283},{},[1284],{"type":50,"value":771},{"type":44,"tag":143,"props":1286,"children":1287},{"class":145,"line":182},[1288],{"type":44,"tag":143,"props":1289,"children":1290},{},[1291],{"type":50,"value":1292},"    @Actor(\"chatRoom\", key: [\"general\"]) private var chat\n",{"type":44,"tag":143,"props":1294,"children":1295},{"class":145,"line":192},[1296],{"type":44,"tag":143,"props":1297,"children":1298},{},[1299],{"type":50,"value":1300},"    @State private var messages: [String] = []\n",{"type":44,"tag":143,"props":1302,"children":1303},{"class":145,"line":31},[1304],{"type":44,"tag":143,"props":1305,"children":1306},{"emptyLinePlaceholder":186},[1307],{"type":50,"value":189},{"type":44,"tag":143,"props":1309,"children":1310},{"class":145,"line":209},[1311],{"type":44,"tag":143,"props":1312,"children":1313},{},[1314],{"type":50,"value":461},{"type":44,"tag":143,"props":1316,"children":1317},{"class":145,"line":218},[1318],{"type":44,"tag":143,"props":1319,"children":1320},{},[1321],{"type":50,"value":1322},"        List(messages, id: \\.self) { message in\n",{"type":44,"tag":143,"props":1324,"children":1325},{"class":145,"line":227},[1326],{"type":44,"tag":143,"props":1327,"children":1328},{},[1329],{"type":50,"value":1330},"            Text(message)\n",{"type":44,"tag":143,"props":1332,"children":1333},{"class":145,"line":236},[1334],{"type":44,"tag":143,"props":1335,"children":1336},{},[1337],{"type":50,"value":377},{"type":44,"tag":143,"props":1339,"children":1340},{"class":145,"line":245},[1341],{"type":44,"tag":143,"props":1342,"children":1343},{},[1344],{"type":50,"value":543},{"type":44,"tag":143,"props":1346,"children":1347},{"class":145,"line":254},[1348],{"type":44,"tag":143,"props":1349,"children":1350},{},[1351],{"type":50,"value":1352},"            for await message in chat.events(\"message\", as: String.self) {\n",{"type":44,"tag":143,"props":1354,"children":1355},{"class":145,"line":503},[1356],{"type":44,"tag":143,"props":1357,"children":1358},{},[1359],{"type":50,"value":1360},"                messages.append(message)\n",{"type":44,"tag":143,"props":1362,"children":1363},{"class":145,"line":512},[1364],{"type":44,"tag":143,"props":1365,"children":1366},{},[1367],{"type":50,"value":518},{"type":44,"tag":143,"props":1369,"children":1370},{"class":145,"line":521},[1371],{"type":44,"tag":143,"props":1372,"children":1373},{},[1374],{"type":50,"value":377},{"type":44,"tag":143,"props":1376,"children":1377},{"class":145,"line":27},[1378],{"type":44,"tag":143,"props":1379,"children":1380},{},[1381],{"type":50,"value":385},{"type":44,"tag":143,"props":1383,"children":1384},{"class":145,"line":537},[1385],{"type":44,"tag":143,"props":1386,"children":1387},{},[1388],{"type":50,"value":393},{"type":44,"tag":68,"props":1390,"children":1392},{"id":1391},"connection-status",[1393],{"type":50,"value":1394},"Connection Status",{"type":44,"tag":132,"props":1396,"children":1398},{"className":134,"code":1397,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct StatusView: View {\n    @Actor(\"counter\", key: [\"my-counter\"]) private var counter\n    @State private var count = 0\n\n    var body: some View {\n        VStack {\n            Text(\"Status: \\(counter.connStatus.rawValue)\")\n\n            if counter.connStatus == .connected {\n                Text(\"Connected!\")\n                    .foregroundStyle(.green)\n            }\n\n            Button(\"Fetch via Handle\") {\n                Task {\n                    if let handle = counter.handle {\n                        count = try await handle.action(\"getCount\", as: Int.self)\n                    }\n                }\n            }\n            .disabled(!counter.isConnected)\n        }\n    }\n}\n",[1399],{"type":44,"tag":59,"props":1400,"children":1401},{"__ignoreMap":137},[1402,1409,1416,1423,1431,1438,1445,1452,1459,1466,1474,1481,1489,1497,1505,1512,1519,1527,1534,1542,1550,1558,1565,1572,1579,1586,1593],{"type":44,"tag":143,"props":1403,"children":1404},{"class":145,"line":146},[1405],{"type":44,"tag":143,"props":1406,"children":1407},{},[1408],{"type":50,"value":306},{"type":44,"tag":143,"props":1410,"children":1411},{"class":145,"line":155},[1412],{"type":44,"tag":143,"props":1413,"children":1414},{},[1415],{"type":50,"value":314},{"type":44,"tag":143,"props":1417,"children":1418},{"class":145,"line":164},[1419],{"type":44,"tag":143,"props":1420,"children":1421},{"emptyLinePlaceholder":186},[1422],{"type":50,"value":189},{"type":44,"tag":143,"props":1424,"children":1425},{"class":145,"line":173},[1426],{"type":44,"tag":143,"props":1427,"children":1428},{},[1429],{"type":50,"value":1430},"struct StatusView: View {\n",{"type":44,"tag":143,"props":1432,"children":1433},{"class":145,"line":182},[1434],{"type":44,"tag":143,"props":1435,"children":1436},{},[1437],{"type":50,"value":438},{"type":44,"tag":143,"props":1439,"children":1440},{"class":145,"line":192},[1441],{"type":44,"tag":143,"props":1442,"children":1443},{},[1444],{"type":50,"value":446},{"type":44,"tag":143,"props":1446,"children":1447},{"class":145,"line":31},[1448],{"type":44,"tag":143,"props":1449,"children":1450},{"emptyLinePlaceholder":186},[1451],{"type":50,"value":189},{"type":44,"tag":143,"props":1453,"children":1454},{"class":145,"line":209},[1455],{"type":44,"tag":143,"props":1456,"children":1457},{},[1458],{"type":50,"value":461},{"type":44,"tag":143,"props":1460,"children":1461},{"class":145,"line":218},[1462],{"type":44,"tag":143,"props":1463,"children":1464},{},[1465],{"type":50,"value":941},{"type":44,"tag":143,"props":1467,"children":1468},{"class":145,"line":227},[1469],{"type":44,"tag":143,"props":1470,"children":1471},{},[1472],{"type":50,"value":1473},"            Text(\"Status: \\(counter.connStatus.rawValue)\")\n",{"type":44,"tag":143,"props":1475,"children":1476},{"class":145,"line":236},[1477],{"type":44,"tag":143,"props":1478,"children":1479},{"emptyLinePlaceholder":186},[1480],{"type":50,"value":189},{"type":44,"tag":143,"props":1482,"children":1483},{"class":145,"line":245},[1484],{"type":44,"tag":143,"props":1485,"children":1486},{},[1487],{"type":50,"value":1488},"            if counter.connStatus == .connected {\n",{"type":44,"tag":143,"props":1490,"children":1491},{"class":145,"line":254},[1492],{"type":44,"tag":143,"props":1493,"children":1494},{},[1495],{"type":50,"value":1496},"                Text(\"Connected!\")\n",{"type":44,"tag":143,"props":1498,"children":1499},{"class":145,"line":503},[1500],{"type":44,"tag":143,"props":1501,"children":1502},{},[1503],{"type":50,"value":1504},"                    .foregroundStyle(.green)\n",{"type":44,"tag":143,"props":1506,"children":1507},{"class":145,"line":512},[1508],{"type":44,"tag":143,"props":1509,"children":1510},{},[1511],{"type":50,"value":518},{"type":44,"tag":143,"props":1513,"children":1514},{"class":145,"line":521},[1515],{"type":44,"tag":143,"props":1516,"children":1517},{"emptyLinePlaceholder":186},[1518],{"type":50,"value":189},{"type":44,"tag":143,"props":1520,"children":1521},{"class":145,"line":27},[1522],{"type":44,"tag":143,"props":1523,"children":1524},{},[1525],{"type":50,"value":1526},"            Button(\"Fetch via Handle\") {\n",{"type":44,"tag":143,"props":1528,"children":1529},{"class":145,"line":537},[1530],{"type":44,"tag":143,"props":1531,"children":1532},{},[1533],{"type":50,"value":980},{"type":44,"tag":143,"props":1535,"children":1536},{"class":145,"line":546},[1537],{"type":44,"tag":143,"props":1538,"children":1539},{},[1540],{"type":50,"value":1541},"                    if let handle = counter.handle {\n",{"type":44,"tag":143,"props":1543,"children":1544},{"class":145,"line":555},[1545],{"type":44,"tag":143,"props":1546,"children":1547},{},[1548],{"type":50,"value":1549},"                        count = try await handle.action(\"getCount\", as: Int.self)\n",{"type":44,"tag":143,"props":1551,"children":1552},{"class":145,"line":563},[1553],{"type":44,"tag":143,"props":1554,"children":1555},{},[1556],{"type":50,"value":1557},"                    }\n",{"type":44,"tag":143,"props":1559,"children":1560},{"class":145,"line":572},[1561],{"type":44,"tag":143,"props":1562,"children":1563},{},[1564],{"type":50,"value":1004},{"type":44,"tag":143,"props":1566,"children":1567},{"class":145,"line":581},[1568],{"type":44,"tag":143,"props":1569,"children":1570},{},[1571],{"type":50,"value":518},{"type":44,"tag":143,"props":1573,"children":1574},{"class":145,"line":589},[1575],{"type":44,"tag":143,"props":1576,"children":1577},{},[1578],{"type":50,"value":527},{"type":44,"tag":143,"props":1580,"children":1581},{"class":145,"line":597},[1582],{"type":44,"tag":143,"props":1583,"children":1584},{},[1585],{"type":50,"value":377},{"type":44,"tag":143,"props":1587,"children":1588},{"class":145,"line":1056},[1589],{"type":44,"tag":143,"props":1590,"children":1591},{},[1592],{"type":50,"value":385},{"type":44,"tag":143,"props":1594,"children":1596},{"class":145,"line":1595},27,[1597],{"type":44,"tag":143,"props":1598,"children":1599},{},[1600],{"type":50,"value":393},{"type":44,"tag":68,"props":1602,"children":1604},{"id":1603},"error-handling",[1605],{"type":50,"value":1606},"Error Handling",{"type":44,"tag":132,"props":1608,"children":1610},{"className":134,"code":1609,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct UserView: View {\n    @Actor(\"user\", key: [\"user-123\"]) private var user\n    @State private var errorMessage: String?\n    @State private var username = \"\"\n\n    var body: some View {\n        VStack {\n            TextField(\"Username\", text: $username)\n\n            Button(\"Update Username\") {\n                Task {\n                    do {\n                        let _: String = try await user.action(\"updateUsername\", username)\n                    } catch let error as ActorError {\n                        errorMessage = \"\\(error.code): \\(String(describing: error.metadata))\"\n                    }\n                }\n            }\n\n            if let errorMessage {\n                Text(errorMessage)\n                    .foregroundStyle(.red)\n            }\n        }\n        .onActorError(user) { error in\n            errorMessage = \"\\(error.group).\\(error.code): \\(error.message)\"\n        }\n    }\n}\n",[1611],{"type":44,"tag":59,"props":1612,"children":1613},{"__ignoreMap":137},[1614,1621,1628,1635,1643,1651,1659,1667,1674,1681,1688,1696,1703,1711,1718,1726,1734,1742,1750,1757,1764,1771,1778,1786,1794,1802,1809,1816,1825,1834,1842,1850],{"type":44,"tag":143,"props":1615,"children":1616},{"class":145,"line":146},[1617],{"type":44,"tag":143,"props":1618,"children":1619},{},[1620],{"type":50,"value":306},{"type":44,"tag":143,"props":1622,"children":1623},{"class":145,"line":155},[1624],{"type":44,"tag":143,"props":1625,"children":1626},{},[1627],{"type":50,"value":314},{"type":44,"tag":143,"props":1629,"children":1630},{"class":145,"line":164},[1631],{"type":44,"tag":143,"props":1632,"children":1633},{"emptyLinePlaceholder":186},[1634],{"type":50,"value":189},{"type":44,"tag":143,"props":1636,"children":1637},{"class":145,"line":173},[1638],{"type":44,"tag":143,"props":1639,"children":1640},{},[1641],{"type":50,"value":1642},"struct UserView: View {\n",{"type":44,"tag":143,"props":1644,"children":1645},{"class":145,"line":182},[1646],{"type":44,"tag":143,"props":1647,"children":1648},{},[1649],{"type":50,"value":1650},"    @Actor(\"user\", key: [\"user-123\"]) private var user\n",{"type":44,"tag":143,"props":1652,"children":1653},{"class":145,"line":192},[1654],{"type":44,"tag":143,"props":1655,"children":1656},{},[1657],{"type":50,"value":1658},"    @State private var errorMessage: String?\n",{"type":44,"tag":143,"props":1660,"children":1661},{"class":145,"line":31},[1662],{"type":44,"tag":143,"props":1663,"children":1664},{},[1665],{"type":50,"value":1666},"    @State private var username = \"\"\n",{"type":44,"tag":143,"props":1668,"children":1669},{"class":145,"line":209},[1670],{"type":44,"tag":143,"props":1671,"children":1672},{"emptyLinePlaceholder":186},[1673],{"type":50,"value":189},{"type":44,"tag":143,"props":1675,"children":1676},{"class":145,"line":218},[1677],{"type":44,"tag":143,"props":1678,"children":1679},{},[1680],{"type":50,"value":461},{"type":44,"tag":143,"props":1682,"children":1683},{"class":145,"line":227},[1684],{"type":44,"tag":143,"props":1685,"children":1686},{},[1687],{"type":50,"value":941},{"type":44,"tag":143,"props":1689,"children":1690},{"class":145,"line":236},[1691],{"type":44,"tag":143,"props":1692,"children":1693},{},[1694],{"type":50,"value":1695},"            TextField(\"Username\", text: $username)\n",{"type":44,"tag":143,"props":1697,"children":1698},{"class":145,"line":245},[1699],{"type":44,"tag":143,"props":1700,"children":1701},{"emptyLinePlaceholder":186},[1702],{"type":50,"value":189},{"type":44,"tag":143,"props":1704,"children":1705},{"class":145,"line":254},[1706],{"type":44,"tag":143,"props":1707,"children":1708},{},[1709],{"type":50,"value":1710},"            Button(\"Update Username\") {\n",{"type":44,"tag":143,"props":1712,"children":1713},{"class":145,"line":503},[1714],{"type":44,"tag":143,"props":1715,"children":1716},{},[1717],{"type":50,"value":980},{"type":44,"tag":143,"props":1719,"children":1720},{"class":145,"line":512},[1721],{"type":44,"tag":143,"props":1722,"children":1723},{},[1724],{"type":50,"value":1725},"                    do {\n",{"type":44,"tag":143,"props":1727,"children":1728},{"class":145,"line":521},[1729],{"type":44,"tag":143,"props":1730,"children":1731},{},[1732],{"type":50,"value":1733},"                        let _: String = try await user.action(\"updateUsername\", username)\n",{"type":44,"tag":143,"props":1735,"children":1736},{"class":145,"line":27},[1737],{"type":44,"tag":143,"props":1738,"children":1739},{},[1740],{"type":50,"value":1741},"                    } catch let error as ActorError {\n",{"type":44,"tag":143,"props":1743,"children":1744},{"class":145,"line":537},[1745],{"type":44,"tag":143,"props":1746,"children":1747},{},[1748],{"type":50,"value":1749},"                        errorMessage = \"\\(error.code): \\(String(describing: error.metadata))\"\n",{"type":44,"tag":143,"props":1751,"children":1752},{"class":145,"line":546},[1753],{"type":44,"tag":143,"props":1754,"children":1755},{},[1756],{"type":50,"value":1557},{"type":44,"tag":143,"props":1758,"children":1759},{"class":145,"line":555},[1760],{"type":44,"tag":143,"props":1761,"children":1762},{},[1763],{"type":50,"value":1004},{"type":44,"tag":143,"props":1765,"children":1766},{"class":145,"line":563},[1767],{"type":44,"tag":143,"props":1768,"children":1769},{},[1770],{"type":50,"value":518},{"type":44,"tag":143,"props":1772,"children":1773},{"class":145,"line":572},[1774],{"type":44,"tag":143,"props":1775,"children":1776},{"emptyLinePlaceholder":186},[1777],{"type":50,"value":189},{"type":44,"tag":143,"props":1779,"children":1780},{"class":145,"line":581},[1781],{"type":44,"tag":143,"props":1782,"children":1783},{},[1784],{"type":50,"value":1785},"            if let errorMessage {\n",{"type":44,"tag":143,"props":1787,"children":1788},{"class":145,"line":589},[1789],{"type":44,"tag":143,"props":1790,"children":1791},{},[1792],{"type":50,"value":1793},"                Text(errorMessage)\n",{"type":44,"tag":143,"props":1795,"children":1796},{"class":145,"line":597},[1797],{"type":44,"tag":143,"props":1798,"children":1799},{},[1800],{"type":50,"value":1801},"                    .foregroundStyle(.red)\n",{"type":44,"tag":143,"props":1803,"children":1804},{"class":145,"line":1056},[1805],{"type":44,"tag":143,"props":1806,"children":1807},{},[1808],{"type":50,"value":518},{"type":44,"tag":143,"props":1810,"children":1811},{"class":145,"line":1595},[1812],{"type":44,"tag":143,"props":1813,"children":1814},{},[1815],{"type":50,"value":377},{"type":44,"tag":143,"props":1817,"children":1819},{"class":145,"line":1818},28,[1820],{"type":44,"tag":143,"props":1821,"children":1822},{},[1823],{"type":50,"value":1824},"        .onActorError(user) { error in\n",{"type":44,"tag":143,"props":1826,"children":1828},{"class":145,"line":1827},29,[1829],{"type":44,"tag":143,"props":1830,"children":1831},{},[1832],{"type":50,"value":1833},"            errorMessage = \"\\(error.group).\\(error.code): \\(error.message)\"\n",{"type":44,"tag":143,"props":1835,"children":1837},{"class":145,"line":1836},30,[1838],{"type":44,"tag":143,"props":1839,"children":1840},{},[1841],{"type":50,"value":377},{"type":44,"tag":143,"props":1843,"children":1845},{"class":145,"line":1844},31,[1846],{"type":44,"tag":143,"props":1847,"children":1848},{},[1849],{"type":50,"value":385},{"type":44,"tag":143,"props":1851,"children":1853},{"class":145,"line":1852},32,[1854],{"type":44,"tag":143,"props":1855,"children":1856},{},[1857],{"type":50,"value":393},{"type":44,"tag":68,"props":1859,"children":1861},{"id":1860},"concepts",[1862],{"type":50,"value":1863},"Concepts",{"type":44,"tag":1865,"props":1866,"children":1868},"h3",{"id":1867},"keys",[1869],{"type":50,"value":1870},"Keys",{"type":44,"tag":53,"props":1872,"children":1873},{},[1874],{"type":50,"value":1875},"Keys uniquely identify actor instances. Use compound keys (arrays) for hierarchical addressing:",{"type":44,"tag":132,"props":1877,"children":1879},{"className":134,"code":1878,"language":136,"meta":137,"style":137},"import RivetKitSwiftUI\nimport SwiftUI\n\nstruct OrgChatView: View {\n    @Actor(\"chatRoom\", key: [\"org-acme\", \"general\"]) private var room\n\n    var body: some View {\n        Text(\"Room: \\(room.connStatus.rawValue)\")\n    }\n}\n",[1880],{"type":44,"tag":59,"props":1881,"children":1882},{"__ignoreMap":137},[1883,1890,1897,1904,1912,1920,1927,1934,1942,1949],{"type":44,"tag":143,"props":1884,"children":1885},{"class":145,"line":146},[1886],{"type":44,"tag":143,"props":1887,"children":1888},{},[1889],{"type":50,"value":306},{"type":44,"tag":143,"props":1891,"children":1892},{"class":145,"line":155},[1893],{"type":44,"tag":143,"props":1894,"children":1895},{},[1896],{"type":50,"value":314},{"type":44,"tag":143,"props":1898,"children":1899},{"class":145,"line":164},[1900],{"type":44,"tag":143,"props":1901,"children":1902},{"emptyLinePlaceholder":186},[1903],{"type":50,"value":189},{"type":44,"tag":143,"props":1905,"children":1906},{"class":145,"line":173},[1907],{"type":44,"tag":143,"props":1908,"children":1909},{},[1910],{"type":50,"value":1911},"struct OrgChatView: View {\n",{"type":44,"tag":143,"props":1913,"children":1914},{"class":145,"line":182},[1915],{"type":44,"tag":143,"props":1916,"children":1917},{},[1918],{"type":50,"value":1919},"    @Actor(\"chatRoom\", key: [\"org-acme\", \"general\"]) private var room\n",{"type":44,"tag":143,"props":1921,"children":1922},{"class":145,"line":192},[1923],{"type":44,"tag":143,"props":1924,"children":1925},{"emptyLinePlaceholder":186},[1926],{"type":50,"value":189},{"type":44,"tag":143,"props":1928,"children":1929},{"class":145,"line":31},[1930],{"type":44,"tag":143,"props":1931,"children":1932},{},[1933],{"type":50,"value":461},{"type":44,"tag":143,"props":1935,"children":1936},{"class":145,"line":209},[1937],{"type":44,"tag":143,"props":1938,"children":1939},{},[1940],{"type":50,"value":1941},"        Text(\"Room: \\(room.connStatus.rawValue)\")\n",{"type":44,"tag":143,"props":1943,"children":1944},{"class":145,"line":218},[1945],{"type":44,"tag":143,"props":1946,"children":1947},{},[1948],{"type":50,"value":385},{"type":44,"tag":143,"props":1950,"children":1951},{"class":145,"line":227},[1952],{"type":44,"tag":143,"props":1953,"children":1954},{},[1955],{"type":50,"value":393},{"type":44,"tag":53,"props":1957,"children":1958},{},[1959,1961,1967,1969,1975],{"type":50,"value":1960},"Don't build keys with string interpolation like ",{"type":44,"tag":59,"props":1962,"children":1964},{"className":1963},[],[1965],{"type":50,"value":1966},"\"org:\\(userId)\"",{"type":50,"value":1968}," when ",{"type":44,"tag":59,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":50,"value":1974},"userId",{"type":50,"value":1976}," contains user data. Use arrays instead to prevent key injection attacks.",{"type":44,"tag":1865,"props":1978,"children":1980},{"id":1979},"environment-configuration",[1981],{"type":50,"value":1982},"Environment Configuration",{"type":44,"tag":53,"props":1984,"children":1985},{},[1986,1988,1994,1995,2001],{"type":50,"value":1987},"Call ",{"type":44,"tag":59,"props":1989,"children":1991},{"className":1990},[],[1992],{"type":50,"value":1993},".rivetKit(endpoint:)",{"type":50,"value":654},{"type":44,"tag":59,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":50,"value":2000},".rivetKit(client:)",{"type":50,"value":2002}," once at the root of your view tree:",{"type":44,"tag":132,"props":2004,"children":2006},{"className":134,"code":2005,"language":136,"meta":137,"style":137},"\u002F\u002F With endpoint string (recommended for most apps)\n@main\nstruct MyApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .rivetKit(endpoint: \"https:\u002F\u002Fmy-namespace:pk_...@api.rivet.dev\")\n        }\n    }\n}\n\n\u002F\u002F With custom client (for advanced configuration)\n@main\nstruct MyApp: App {\n    private let client = RivetKitClient(\n        config: try! ClientConfig(endpoint: \"https:\u002F\u002Fapi.rivet.dev\", token: \"pk_...\")\n    )\n\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .rivetKit(client: client)\n        }\n    }\n}\n",[2007],{"type":44,"tag":59,"props":2008,"children":2009},{"__ignoreMap":137},[2010,2018,2025,2033,2040,2047,2054,2061,2068,2075,2082,2089,2097,2104,2111,2119,2127,2134,2141,2148,2155,2162,2170,2177,2184],{"type":44,"tag":143,"props":2011,"children":2012},{"class":145,"line":146},[2013],{"type":44,"tag":143,"props":2014,"children":2015},{},[2016],{"type":50,"value":2017},"\u002F\u002F With endpoint string (recommended for most apps)\n",{"type":44,"tag":143,"props":2019,"children":2020},{"class":145,"line":155},[2021],{"type":44,"tag":143,"props":2022,"children":2023},{},[2024],{"type":50,"value":329},{"type":44,"tag":143,"props":2026,"children":2027},{"class":145,"line":164},[2028],{"type":44,"tag":143,"props":2029,"children":2030},{},[2031],{"type":50,"value":2032},"struct MyApp: App {\n",{"type":44,"tag":143,"props":2034,"children":2035},{"class":145,"line":173},[2036],{"type":44,"tag":143,"props":2037,"children":2038},{},[2039],{"type":50,"value":345},{"type":44,"tag":143,"props":2041,"children":2042},{"class":145,"line":182},[2043],{"type":44,"tag":143,"props":2044,"children":2045},{},[2046],{"type":50,"value":353},{"type":44,"tag":143,"props":2048,"children":2049},{"class":145,"line":192},[2050],{"type":44,"tag":143,"props":2051,"children":2052},{},[2053],{"type":50,"value":361},{"type":44,"tag":143,"props":2055,"children":2056},{"class":145,"line":31},[2057],{"type":44,"tag":143,"props":2058,"children":2059},{},[2060],{"type":50,"value":369},{"type":44,"tag":143,"props":2062,"children":2063},{"class":145,"line":209},[2064],{"type":44,"tag":143,"props":2065,"children":2066},{},[2067],{"type":50,"value":377},{"type":44,"tag":143,"props":2069,"children":2070},{"class":145,"line":218},[2071],{"type":44,"tag":143,"props":2072,"children":2073},{},[2074],{"type":50,"value":385},{"type":44,"tag":143,"props":2076,"children":2077},{"class":145,"line":227},[2078],{"type":44,"tag":143,"props":2079,"children":2080},{},[2081],{"type":50,"value":393},{"type":44,"tag":143,"props":2083,"children":2084},{"class":145,"line":236},[2085],{"type":44,"tag":143,"props":2086,"children":2087},{"emptyLinePlaceholder":186},[2088],{"type":50,"value":189},{"type":44,"tag":143,"props":2090,"children":2091},{"class":145,"line":245},[2092],{"type":44,"tag":143,"props":2093,"children":2094},{},[2095],{"type":50,"value":2096},"\u002F\u002F With custom client (for advanced configuration)\n",{"type":44,"tag":143,"props":2098,"children":2099},{"class":145,"line":254},[2100],{"type":44,"tag":143,"props":2101,"children":2102},{},[2103],{"type":50,"value":329},{"type":44,"tag":143,"props":2105,"children":2106},{"class":145,"line":503},[2107],{"type":44,"tag":143,"props":2108,"children":2109},{},[2110],{"type":50,"value":2032},{"type":44,"tag":143,"props":2112,"children":2113},{"class":145,"line":512},[2114],{"type":44,"tag":143,"props":2115,"children":2116},{},[2117],{"type":50,"value":2118},"    private let client = RivetKitClient(\n",{"type":44,"tag":143,"props":2120,"children":2121},{"class":145,"line":521},[2122],{"type":44,"tag":143,"props":2123,"children":2124},{},[2125],{"type":50,"value":2126},"        config: try! ClientConfig(endpoint: \"https:\u002F\u002Fapi.rivet.dev\", token: \"pk_...\")\n",{"type":44,"tag":143,"props":2128,"children":2129},{"class":145,"line":27},[2130],{"type":44,"tag":143,"props":2131,"children":2132},{},[2133],{"type":50,"value":251},{"type":44,"tag":143,"props":2135,"children":2136},{"class":145,"line":537},[2137],{"type":44,"tag":143,"props":2138,"children":2139},{"emptyLinePlaceholder":186},[2140],{"type":50,"value":189},{"type":44,"tag":143,"props":2142,"children":2143},{"class":145,"line":546},[2144],{"type":44,"tag":143,"props":2145,"children":2146},{},[2147],{"type":50,"value":345},{"type":44,"tag":143,"props":2149,"children":2150},{"class":145,"line":555},[2151],{"type":44,"tag":143,"props":2152,"children":2153},{},[2154],{"type":50,"value":353},{"type":44,"tag":143,"props":2156,"children":2157},{"class":145,"line":563},[2158],{"type":44,"tag":143,"props":2159,"children":2160},{},[2161],{"type":50,"value":361},{"type":44,"tag":143,"props":2163,"children":2164},{"class":145,"line":572},[2165],{"type":44,"tag":143,"props":2166,"children":2167},{},[2168],{"type":50,"value":2169},"                .rivetKit(client: client)\n",{"type":44,"tag":143,"props":2171,"children":2172},{"class":145,"line":581},[2173],{"type":44,"tag":143,"props":2174,"children":2175},{},[2176],{"type":50,"value":377},{"type":44,"tag":143,"props":2178,"children":2179},{"class":145,"line":589},[2180],{"type":44,"tag":143,"props":2181,"children":2182},{},[2183],{"type":50,"value":385},{"type":44,"tag":143,"props":2185,"children":2186},{"class":145,"line":597},[2187],{"type":44,"tag":143,"props":2188,"children":2189},{},[2190],{"type":50,"value":393},{"type":44,"tag":53,"props":2192,"children":2193},{},[2194,2196,2201,2203,2208,2210,2216,2218,2224,2226,2231],{"type":50,"value":2195},"When using ",{"type":44,"tag":59,"props":2197,"children":2199},{"className":2198},[],[2200],{"type":50,"value":1993},{"type":50,"value":2202},", the client is created once and cached per endpoint. When using ",{"type":44,"tag":59,"props":2204,"children":2206},{"className":2205},[],[2207],{"type":50,"value":2000},{"type":50,"value":2209},", store the client as a property on ",{"type":44,"tag":59,"props":2211,"children":2213},{"className":2212},[],[2214],{"type":50,"value":2215},"App",{"type":50,"value":2217}," (not inside ",{"type":44,"tag":59,"props":2219,"children":2221},{"className":2220},[],[2222],{"type":50,"value":2223},"body",{"type":50,"value":2225},") since SwiftUI can call ",{"type":44,"tag":59,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":50,"value":2223},{"type":50,"value":2232}," multiple times.",{"type":44,"tag":1865,"props":2234,"children":2236},{"id":2235},"environment-variables",[2237],{"type":50,"value":2238},"Environment Variables",{"type":44,"tag":53,"props":2240,"children":2241},{},[2242,2248],{"type":44,"tag":59,"props":2243,"children":2245},{"className":2244},[],[2246],{"type":50,"value":2247},"ClientConfig",{"type":50,"value":2249}," reads optional values from environment variables:",{"type":44,"tag":86,"props":2251,"children":2252},{},[2253,2264,2275],{"type":44,"tag":90,"props":2254,"children":2255},{},[2256,2262],{"type":44,"tag":59,"props":2257,"children":2259},{"className":2258},[],[2260],{"type":50,"value":2261},"RIVET_NAMESPACE",{"type":50,"value":2263}," - Namespace (can also be in endpoint URL)",{"type":44,"tag":90,"props":2265,"children":2266},{},[2267,2273],{"type":44,"tag":59,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":50,"value":2272},"RIVET_TOKEN",{"type":50,"value":2274}," - Authentication token (can also be in endpoint URL)",{"type":44,"tag":90,"props":2276,"children":2277},{},[2278,2284,2286,2292],{"type":44,"tag":59,"props":2279,"children":2281},{"className":2280},[],[2282],{"type":50,"value":2283},"RIVET_RUNNER",{"type":50,"value":2285}," - Runner name (defaults to ",{"type":44,"tag":59,"props":2287,"children":2289},{"className":2288},[],[2290],{"type":50,"value":2291},"\"default\"",{"type":50,"value":2293},")",{"type":44,"tag":53,"props":2295,"children":2296},{},[2297],{"type":50,"value":2298},"The endpoint is always required. There is no default endpoint.",{"type":44,"tag":1865,"props":2300,"children":2302},{"id":2301},"endpoint-format",[2303],{"type":50,"value":2304},"Endpoint Format",{"type":44,"tag":53,"props":2306,"children":2307},{},[2308],{"type":50,"value":2309},"Endpoints support URL auth syntax:",{"type":44,"tag":132,"props":2311,"children":2315},{"className":2312,"code":2314,"language":50},[2313],"language-text","https:\u002F\u002Fnamespace:token@api.rivet.dev\n",[2316],{"type":44,"tag":59,"props":2317,"children":2318},{"__ignoreMap":137},[2319],{"type":50,"value":2314},{"type":44,"tag":53,"props":2321,"children":2322},{},[2323,2325,2330,2331,2336,2338,2344,2346,2353],{"type":50,"value":2324},"You can also pass the endpoint without auth and provide ",{"type":44,"tag":59,"props":2326,"children":2328},{"className":2327},[],[2329],{"type":50,"value":2261},{"type":50,"value":277},{"type":44,"tag":59,"props":2332,"children":2334},{"className":2333},[],[2335],{"type":50,"value":2272},{"type":50,"value":2337}," separately. For serverless deployments, set the endpoint to your app's ",{"type":44,"tag":59,"props":2339,"children":2341},{"className":2340},[],[2342],{"type":50,"value":2343},"\u002Fapi\u002Frivet",{"type":50,"value":2345}," URL. See ",{"type":44,"tag":2347,"props":2348,"children":2350},"a",{"href":2349},"\u002Fdocs\u002Fgeneral\u002Fendpoints#url-auth-syntax",[2351],{"type":50,"value":2352},"Endpoints",{"type":50,"value":2354}," for details.",{"type":44,"tag":68,"props":2356,"children":2358},{"id":2357},"api-reference",[2359],{"type":50,"value":2360},"API Reference",{"type":44,"tag":1865,"props":2362,"children":2364},{"id":2363},"property-wrapper",[2365],{"type":50,"value":2366},"Property Wrapper",{"type":44,"tag":86,"props":2368,"children":2369},{},[2370],{"type":44,"tag":90,"props":2371,"children":2372},{},[2373,2379],{"type":44,"tag":59,"props":2374,"children":2376},{"className":2375},[],[2377],{"type":50,"value":2378},"@Actor(name, key:, params:, createWithInput:, createInRegion:, enabled:)",{"type":50,"value":2380}," - SwiftUI property wrapper for actor connections",{"type":44,"tag":1865,"props":2382,"children":2384},{"id":2383},"view-modifiers",[2385],{"type":50,"value":2386},"View Modifiers",{"type":44,"tag":86,"props":2388,"children":2389},{},[2390,2400,2410,2421],{"type":44,"tag":90,"props":2391,"children":2392},{},[2393,2398],{"type":44,"tag":59,"props":2394,"children":2396},{"className":2395},[],[2397],{"type":50,"value":1993},{"type":50,"value":2399}," - Configure client with an endpoint URL (creates cached client)",{"type":44,"tag":90,"props":2401,"children":2402},{},[2403,2408],{"type":44,"tag":59,"props":2404,"children":2406},{"className":2405},[],[2407],{"type":50,"value":2000},{"type":50,"value":2409}," - Configure client with a custom instance",{"type":44,"tag":90,"props":2411,"children":2412},{},[2413,2419],{"type":44,"tag":59,"props":2414,"children":2416},{"className":2415},[],[2417],{"type":50,"value":2418},".onActorEvent(actor, event) { ... }",{"type":50,"value":2420}," - Subscribe to actor events (supports 0–5 typed args)",{"type":44,"tag":90,"props":2422,"children":2423},{},[2424,2430],{"type":44,"tag":59,"props":2425,"children":2427},{"className":2426},[],[2428],{"type":50,"value":2429},".onActorError(actor) { error in ... }",{"type":50,"value":2431}," - Handle actor errors",{"type":44,"tag":1865,"props":2433,"children":2435},{"id":2434},"actorobservable",[2436],{"type":50,"value":2437},"ActorObservable",{"type":44,"tag":86,"props":2439,"children":2440},{},[2441,2452,2463,2474,2485,2496,2515,2532],{"type":44,"tag":90,"props":2442,"children":2443},{},[2444,2450],{"type":44,"tag":59,"props":2445,"children":2447},{"className":2446},[],[2448],{"type":50,"value":2449},"actor.action(name, args..., as:)",{"type":50,"value":2451}," - Async action call",{"type":44,"tag":90,"props":2453,"children":2454},{},[2455,2461],{"type":44,"tag":59,"props":2456,"children":2458},{"className":2457},[],[2459],{"type":50,"value":2460},"actor.send(name, args...)",{"type":50,"value":2462}," - Fire-and-forget action",{"type":44,"tag":90,"props":2464,"children":2465},{},[2466,2472],{"type":44,"tag":59,"props":2467,"children":2469},{"className":2468},[],[2470],{"type":50,"value":2471},"actor.events(name, as:)",{"type":50,"value":2473}," - AsyncStream of typed events",{"type":44,"tag":90,"props":2475,"children":2476},{},[2477,2483],{"type":44,"tag":59,"props":2478,"children":2480},{"className":2479},[],[2481],{"type":50,"value":2482},"actor.connStatus",{"type":50,"value":2484}," - Current connection status",{"type":44,"tag":90,"props":2486,"children":2487},{},[2488,2494],{"type":44,"tag":59,"props":2489,"children":2491},{"className":2490},[],[2492],{"type":50,"value":2493},"actor.isConnected",{"type":50,"value":2495}," - Whether connected",{"type":44,"tag":90,"props":2497,"children":2498},{},[2499,2505,2507,2513],{"type":44,"tag":59,"props":2500,"children":2502},{"className":2501},[],[2503],{"type":50,"value":2504},"actor.handle",{"type":50,"value":2506}," - Underlying ",{"type":44,"tag":59,"props":2508,"children":2510},{"className":2509},[],[2511],{"type":50,"value":2512},"ActorHandle",{"type":50,"value":2514}," (optional)",{"type":44,"tag":90,"props":2516,"children":2517},{},[2518,2524,2525,2531],{"type":44,"tag":59,"props":2519,"children":2521},{"className":2520},[],[2522],{"type":50,"value":2523},"actor.connection",{"type":50,"value":2506},{"type":44,"tag":59,"props":2526,"children":2528},{"className":2527},[],[2529],{"type":50,"value":2530},"ActorConnection",{"type":50,"value":2514},{"type":44,"tag":90,"props":2533,"children":2534},{},[2535,2541],{"type":44,"tag":59,"props":2536,"children":2538},{"className":2537},[],[2539],{"type":50,"value":2540},"actor.error",{"type":50,"value":2542}," - Most recent error (optional)",{"type":44,"tag":1865,"props":2544,"children":2546},{"id":2545},"types",[2547],{"type":50,"value":2548},"Types",{"type":44,"tag":86,"props":2550,"children":2551},{},[2552,2599],{"type":44,"tag":90,"props":2553,"children":2554},{},[2555,2561,2563,2569,2571,2577,2578,2584,2585,2591,2592,2598],{"type":44,"tag":59,"props":2556,"children":2558},{"className":2557},[],[2559],{"type":50,"value":2560},"ActorConnStatus",{"type":50,"value":2562}," - Connection status enum (",{"type":44,"tag":59,"props":2564,"children":2566},{"className":2565},[],[2567],{"type":50,"value":2568},".idle",{"type":50,"value":2570},", ",{"type":44,"tag":59,"props":2572,"children":2574},{"className":2573},[],[2575],{"type":50,"value":2576},".connecting",{"type":50,"value":2570},{"type":44,"tag":59,"props":2579,"children":2581},{"className":2580},[],[2582],{"type":50,"value":2583},".connected",{"type":50,"value":2570},{"type":44,"tag":59,"props":2586,"children":2588},{"className":2587},[],[2589],{"type":50,"value":2590},".disconnected",{"type":50,"value":2570},{"type":44,"tag":59,"props":2593,"children":2595},{"className":2594},[],[2596],{"type":50,"value":2597},".disposed",{"type":50,"value":2293},{"type":44,"tag":90,"props":2600,"children":2601},{},[2602,2608,2610,2616,2617,2622,2623,2629,2630],{"type":44,"tag":59,"props":2603,"children":2605},{"className":2604},[],[2606],{"type":50,"value":2607},"ActorError",{"type":50,"value":2609}," - Typed actor errors with ",{"type":44,"tag":59,"props":2611,"children":2613},{"className":2612},[],[2614],{"type":50,"value":2615},"group",{"type":50,"value":2570},{"type":44,"tag":59,"props":2618,"children":2620},{"className":2619},[],[2621],{"type":50,"value":59},{"type":50,"value":2570},{"type":44,"tag":59,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":50,"value":2628},"message",{"type":50,"value":2570},{"type":44,"tag":59,"props":2631,"children":2633},{"className":2632},[],[2634],{"type":50,"value":2635},"metadata",{"type":44,"tag":68,"props":2637,"children":2639},{"id":2638},"need-more-than-the-client",[2640],{"type":50,"value":2641},"Need More Than the Client?",{"type":44,"tag":53,"props":2643,"children":2644},{},[2645],{"type":50,"value":2646},"If you need more about Rivet Actors, registries, or server-side RivetKit, add the main skill:",{"type":44,"tag":132,"props":2648,"children":2652},{"className":2649,"code":2650,"language":2651,"meta":137,"style":137},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx skills add rivet-dev\u002Fskills\n","bash",[2653],{"type":44,"tag":59,"props":2654,"children":2655},{"__ignoreMap":137},[2656],{"type":44,"tag":143,"props":2657,"children":2658},{"class":145,"line":146},[2659,2665,2671,2676],{"type":44,"tag":143,"props":2660,"children":2662},{"style":2661},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2663],{"type":50,"value":2664},"npx",{"type":44,"tag":143,"props":2666,"children":2668},{"style":2667},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2669],{"type":50,"value":2670}," skills",{"type":44,"tag":143,"props":2672,"children":2673},{"style":2667},[2674],{"type":50,"value":2675}," add",{"type":44,"tag":143,"props":2677,"children":2678},{"style":2667},[2679],{"type":50,"value":2680}," rivet-dev\u002Fskills\n",{"type":44,"tag":53,"props":2682,"children":2683},{},[2684,2686,2692],{"type":50,"value":2685},"Then use the ",{"type":44,"tag":59,"props":2687,"children":2689},{"className":2688},[],[2690],{"type":50,"value":2691},"rivetkit",{"type":50,"value":2693}," skill for backend guidance.",{"type":44,"tag":2695,"props":2696,"children":2697},"style",{},[2698],{"type":50,"value":2699},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2701,"total":27},[2702,2725,2743,2762,2778,2794,2809,2827,2845,2860,2876,2892],{"slug":2703,"name":2703,"fn":2704,"description":2705,"org":2706,"tags":2707,"stars":27,"repoUrl":28,"updatedAt":2724},"ai-agent","build AI agent backends with Rivet","Build an AI agent backend with persistent memory: one Rivet Actor per conversation, queued message handling, and streaming LLM responses as realtime events.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2708,2711,2714,2717,2720,2723],{"name":2709,"slug":2710,"type":16},"Agents","agents",{"name":2712,"slug":2713,"type":16},"Backend","backend",{"name":2715,"slug":2716,"type":16},"LLM","llm",{"name":2718,"slug":2719,"type":16},"Memory","memory",{"name":2721,"slug":2722,"type":16},"Real-time","real-time",{"name":9,"slug":8,"type":16},"2026-07-21T05:37:45.411803",{"slug":2726,"name":2726,"fn":2727,"description":2728,"org":2729,"tags":2730,"stars":27,"repoUrl":28,"updatedAt":2742},"ai-agent-workspace","create persistent workspaces for AI agents","Give every AI agent its own computer: a persistent workspace with a filesystem, processes, shells, networking, and agent sessions on a lightweight in-process OS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2731,2732,2735,2738,2739],{"name":2709,"slug":2710,"type":16},{"name":2733,"slug":2734,"type":16},"File Storage","file-storage",{"name":2736,"slug":2737,"type":16},"Infrastructure","infrastructure",{"name":9,"slug":8,"type":16},{"name":2740,"slug":2741,"type":16},"Sandboxing","sandboxing","2026-06-14T08:06:57.274844",{"slug":2744,"name":2744,"fn":2745,"description":2746,"org":2747,"tags":2748,"stars":27,"repoUrl":28,"updatedAt":2761},"chat-room","build realtime chat rooms with Rivet","Build a realtime chat room backend with Rivet Actors: one actor per room, SQLite-backed message history, and WebSocket broadcast to every connected client.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2749,2750,2753,2754,2755,2758],{"name":2712,"slug":2713,"type":16},{"name":2751,"slug":2752,"type":16},"Messaging","messaging",{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},{"name":2756,"slug":2757,"type":16},"SQL","sql",{"name":2759,"slug":2760,"type":16},"WebSockets","websockets","2026-07-21T05:37:48.403494",{"slug":2763,"name":2763,"fn":2764,"description":2765,"org":2766,"tags":2767,"stars":27,"repoUrl":28,"updatedAt":2777},"collaborative-text-editor","build collaborative text editors with Rivet","Build a collaborative text editor backend with Yjs CRDTs and Rivet Actors: per-document actors relay sync and awareness updates and persist snapshots.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2768,2769,2772,2775,2776],{"name":2712,"slug":2713,"type":16},{"name":2770,"slug":2771,"type":16},"Collaboration","collaboration",{"name":2773,"slug":2774,"type":16},"Documents","documents",{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},"2026-07-21T05:37:49.412829",{"slug":2779,"name":2779,"fn":2780,"description":2781,"org":2782,"tags":2783,"stars":27,"repoUrl":28,"updatedAt":2793},"cron-jobs","schedule durable cron jobs with Rivet","Patterns for durable one-shot, calendar, and fixed-interval work on Rivet Actors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2784,2787,2788,2789,2790],{"name":2785,"slug":2786,"type":16},"Automation","automation",{"name":2712,"slug":2713,"type":16},{"name":2736,"slug":2737,"type":16},{"name":9,"slug":8,"type":16},{"name":2791,"slug":2792,"type":16},"Scheduling","scheduling","2026-07-21T05:37:43.395911",{"slug":2795,"name":2795,"fn":2796,"description":2797,"org":2798,"tags":2799,"stars":27,"repoUrl":28,"updatedAt":2808},"live-cursors","implement live cursors and multiplayer presence","Live cursors and multiplayer presence with Rivet Actors: per-connection cursor state, realtime updates over events or raw WebSockets, and throttling.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2800,2801,2802,2803,2804,2807],{"name":2770,"slug":2771,"type":16},{"name":25,"slug":26,"type":16},{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},{"name":2805,"slug":2806,"type":16},"UX Design","ux-design",{"name":2759,"slug":2760,"type":16},"2026-07-21T05:37:47.391088",{"slug":2810,"name":2810,"fn":2811,"description":2812,"org":2813,"tags":2814,"stars":27,"repoUrl":28,"updatedAt":2826},"multiplayer-game","build multiplayer games with Rivet","Pragmatic patterns for building multiplayer games: matchmaking, tick loops, realtime state, interest management, and validation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2815,2818,2821,2824,2825],{"name":2816,"slug":2817,"type":16},"Architecture","architecture",{"name":2819,"slug":2820,"type":16},"Engineering","engineering",{"name":2822,"slug":2823,"type":16},"Game Development","game-development",{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},"2026-07-21T05:37:44.627991",{"slug":2828,"name":2828,"fn":2829,"description":2830,"org":2831,"tags":2832,"stars":27,"repoUrl":28,"updatedAt":2844},"per-tenant-database","implement multi-tenant data isolation with Rivet","Multi-tenant data isolation with one Rivet Actor per tenant: the actor key is the tenant id, so each tenant gets its own isolated dataset and migrations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2833,2834,2837,2840,2843],{"name":2816,"slug":2817,"type":16},{"name":2835,"slug":2836,"type":16},"Database","database",{"name":2838,"slug":2839,"type":16},"Migration","migration",{"name":2841,"slug":2842,"type":16},"Multi-Tenant","multi-tenant",{"name":9,"slug":8,"type":16},"2026-07-21T05:37:46.414425",{"slug":2691,"name":2691,"fn":2846,"description":2847,"org":2848,"tags":2849,"stars":27,"repoUrl":28,"updatedAt":2859},"build and debug Rivet Actors","RivetKit backend and Rivet Actor runtime guidance. Use for building, modifying, debugging, or testing Rivet Actors, registries, serverless\u002Frunner modes, deployment, or actor-based workflows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2850,2851,2852,2855,2858],{"name":2709,"slug":2710,"type":16},{"name":2712,"slug":2713,"type":16},{"name":2853,"slug":2854,"type":16},"Debugging","debugging",{"name":2856,"slug":2857,"type":16},"Deployment","deployment",{"name":9,"slug":8,"type":16},"2026-07-24T05:38:58.10133",{"slug":2861,"name":2861,"fn":2862,"description":2863,"org":2864,"tags":2865,"stars":27,"repoUrl":28,"updatedAt":2875},"rivetkit-client-javascript","use RivetKit JavaScript client","RivetKit JavaScript client guidance. Use for browser, Node.js, or Bun clients that connect to Rivet Actors with rivetkit\u002Fclient, create clients, call actions, or manage connections.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2866,2867,2868,2871,2872],{"name":2712,"slug":2713,"type":16},{"name":25,"slug":26,"type":16},{"name":2869,"slug":2870,"type":16},"JavaScript","javascript",{"name":9,"slug":8,"type":16},{"name":2873,"slug":2874,"type":16},"SDK","sdk","2026-07-30T05:31:37.725576",{"slug":2877,"name":2877,"fn":2878,"description":2879,"org":2880,"tags":2881,"stars":27,"repoUrl":28,"updatedAt":2891},"rivetkit-client-react","use RivetKit React client","RivetKit React client guidance. Use for React apps that connect to Rivet Actors with @rivetkit\u002Freact, create hooks with createRivetKit, or manage realtime state with useActor.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2882,2883,2886,2887,2888],{"name":25,"slug":26,"type":16},{"name":2884,"slug":2885,"type":16},"React","react",{"name":9,"slug":8,"type":16},{"name":2873,"slug":2874,"type":16},{"name":2889,"slug":2890,"type":16},"State Management","state-management","2026-07-30T05:31:36.618873",{"slug":2893,"name":2893,"fn":2894,"description":2895,"org":2896,"tags":2897,"stars":27,"repoUrl":28,"updatedAt":2905},"rivetkit-client-rust","build RivetKit Rust clients","RivetKit Rust client guidance. Use for Rust clients and backends that connect to Rivet Actors with rivetkit::client, create typed actor handles, call actions, or manage connections.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2898,2901,2902],{"name":2899,"slug":2900,"type":16},"API Development","api-development",{"name":2712,"slug":2713,"type":16},{"name":2903,"slug":2904,"type":16},"Rust","rust","2026-07-24T05:39:02.105888",{"items":2907,"total":521},[2908,2917,2925,2934,2942,2950,2959],{"slug":2703,"name":2703,"fn":2704,"description":2705,"org":2909,"tags":2910,"stars":27,"repoUrl":28,"updatedAt":2724},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2911,2912,2913,2914,2915,2916],{"name":2709,"slug":2710,"type":16},{"name":2712,"slug":2713,"type":16},{"name":2715,"slug":2716,"type":16},{"name":2718,"slug":2719,"type":16},{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},{"slug":2726,"name":2726,"fn":2727,"description":2728,"org":2918,"tags":2919,"stars":27,"repoUrl":28,"updatedAt":2742},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2920,2921,2922,2923,2924],{"name":2709,"slug":2710,"type":16},{"name":2733,"slug":2734,"type":16},{"name":2736,"slug":2737,"type":16},{"name":9,"slug":8,"type":16},{"name":2740,"slug":2741,"type":16},{"slug":2744,"name":2744,"fn":2745,"description":2746,"org":2926,"tags":2927,"stars":27,"repoUrl":28,"updatedAt":2761},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2928,2929,2930,2931,2932,2933],{"name":2712,"slug":2713,"type":16},{"name":2751,"slug":2752,"type":16},{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},{"name":2756,"slug":2757,"type":16},{"name":2759,"slug":2760,"type":16},{"slug":2763,"name":2763,"fn":2764,"description":2765,"org":2935,"tags":2936,"stars":27,"repoUrl":28,"updatedAt":2777},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2937,2938,2939,2940,2941],{"name":2712,"slug":2713,"type":16},{"name":2770,"slug":2771,"type":16},{"name":2773,"slug":2774,"type":16},{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},{"slug":2779,"name":2779,"fn":2780,"description":2781,"org":2943,"tags":2944,"stars":27,"repoUrl":28,"updatedAt":2793},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2945,2946,2947,2948,2949],{"name":2785,"slug":2786,"type":16},{"name":2712,"slug":2713,"type":16},{"name":2736,"slug":2737,"type":16},{"name":9,"slug":8,"type":16},{"name":2791,"slug":2792,"type":16},{"slug":2795,"name":2795,"fn":2796,"description":2797,"org":2951,"tags":2952,"stars":27,"repoUrl":28,"updatedAt":2808},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2953,2954,2955,2956,2957,2958],{"name":2770,"slug":2771,"type":16},{"name":25,"slug":26,"type":16},{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16},{"name":2805,"slug":2806,"type":16},{"name":2759,"slug":2760,"type":16},{"slug":2810,"name":2810,"fn":2811,"description":2812,"org":2960,"tags":2961,"stars":27,"repoUrl":28,"updatedAt":2826},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2962,2963,2964,2965,2966],{"name":2816,"slug":2817,"type":16},{"name":2819,"slug":2820,"type":16},{"name":2822,"slug":2823,"type":16},{"name":2721,"slug":2722,"type":16},{"name":9,"slug":8,"type":16}]