[{"data":1,"prerenderedAt":1053},["ShallowReactive",2],{"docs:/docs/guides/chat-app":3},{"id":4,"title":5,"body":6,"description":1046,"extension":1047,"meta":1048,"navigation":84,"path":1049,"seo":1050,"stem":1051,"__hash__":1052},"docs/docs/guides/chat-app.md","Building a Chat App",{"type":7,"value":8,"toc":1039},"minimark",[9,13,17,22,25,41,45,602,606,609,979,983,992,1012,1016,1035],[10,11,5],"h1",{"id":12},"building-a-chat-app",[14,15,16],"p",{},"Learn how to build a real-time chat application with NoLag, including messaging, presence tracking, and typing indicators.",[18,19,21],"h2",{"id":20},"overview","Overview",[14,23,24],{},"In this guide, you'll learn how to:",[26,27,28,32,35,38],"ul",{},[29,30,31],"li",{},"Set up real-time messaging between users",[29,33,34],{},"Show who's online with presence tracking",[29,36,37],{},"Implement typing indicators",[29,39,40],{},"Handle message history with hydration webhooks",[18,42,44],{"id":43},"basic-setup","Basic Setup",[46,47,48,338,455],"code-tabs",{},[49,50,56],"pre",{"className":51,"code":52,"filename":53,"language":54,"meta":55,"style":55},"language-typescript shiki shiki-themes github-light github-dark","import { NoLag } from '@nolag/js-sdk'\n\nconst client = NoLag('your_access_token')\nawait client.connect()\n\nconst chatRoom = client.setApp('chat-app').setRoom('general')\n\n// Subscribe to messages\nchatRoom.subscribe('messages')\n\n// Listen for new messages\nchatRoom.on('messages', (message, meta) => {\n  displayMessage(message)\n})\n\n// Send a message\nfunction sendMessage(text: string) {\n  chatRoom.emit('messages', {\n    text,\n    sender: currentUser.name,\n    timestamp: Date.now()\n  })\n}\n","TypeScript","typescript","",[57,58,59,79,86,112,127,132,165,170,177,193,198,204,238,247,253,258,264,287,303,309,315,326,332],"code",{"__ignoreMap":55},[60,61,64,68,72,75],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"szBVR","import",[60,69,71],{"class":70},"sVt8B"," { NoLag } ",[60,73,74],{"class":66},"from",[60,76,78],{"class":77},"sZZnC"," '@nolag/js-sdk'\n",[60,80,82],{"class":62,"line":81},2,[60,83,85],{"emptyLinePlaceholder":84},true,"\n",[60,87,89,92,96,99,103,106,109],{"class":62,"line":88},3,[60,90,91],{"class":66},"const",[60,93,95],{"class":94},"sj4cs"," client",[60,97,98],{"class":66}," =",[60,100,102],{"class":101},"sScJk"," NoLag",[60,104,105],{"class":70},"(",[60,107,108],{"class":77},"'your_access_token'",[60,110,111],{"class":70},")\n",[60,113,115,118,121,124],{"class":62,"line":114},4,[60,116,117],{"class":66},"await",[60,119,120],{"class":70}," client.",[60,122,123],{"class":101},"connect",[60,125,126],{"class":70},"()\n",[60,128,130],{"class":62,"line":129},5,[60,131,85],{"emptyLinePlaceholder":84},[60,133,135,137,140,142,144,147,149,152,155,158,160,163],{"class":62,"line":134},6,[60,136,91],{"class":66},[60,138,139],{"class":94}," chatRoom",[60,141,98],{"class":66},[60,143,120],{"class":70},[60,145,146],{"class":101},"setApp",[60,148,105],{"class":70},[60,150,151],{"class":77},"'chat-app'",[60,153,154],{"class":70},").",[60,156,157],{"class":101},"setRoom",[60,159,105],{"class":70},[60,161,162],{"class":77},"'general'",[60,164,111],{"class":70},[60,166,168],{"class":62,"line":167},7,[60,169,85],{"emptyLinePlaceholder":84},[60,171,173],{"class":62,"line":172},8,[60,174,176],{"class":175},"sJ8bj","// Subscribe to messages\n",[60,178,180,183,186,188,191],{"class":62,"line":179},9,[60,181,182],{"class":70},"chatRoom.",[60,184,185],{"class":101},"subscribe",[60,187,105],{"class":70},[60,189,190],{"class":77},"'messages'",[60,192,111],{"class":70},[60,194,196],{"class":62,"line":195},10,[60,197,85],{"emptyLinePlaceholder":84},[60,199,201],{"class":62,"line":200},11,[60,202,203],{"class":175},"// Listen for new messages\n",[60,205,207,209,212,214,216,219,223,226,229,232,235],{"class":62,"line":206},12,[60,208,182],{"class":70},[60,210,211],{"class":101},"on",[60,213,105],{"class":70},[60,215,190],{"class":77},[60,217,218],{"class":70},", (",[60,220,222],{"class":221},"s4XuR","message",[60,224,225],{"class":70},", ",[60,227,228],{"class":221},"meta",[60,230,231],{"class":70},") ",[60,233,234],{"class":66},"=>",[60,236,237],{"class":70}," {\n",[60,239,241,244],{"class":62,"line":240},13,[60,242,243],{"class":101},"  displayMessage",[60,245,246],{"class":70},"(message)\n",[60,248,250],{"class":62,"line":249},14,[60,251,252],{"class":70},"})\n",[60,254,256],{"class":62,"line":255},15,[60,257,85],{"emptyLinePlaceholder":84},[60,259,261],{"class":62,"line":260},16,[60,262,263],{"class":175},"// Send a message\n",[60,265,267,270,273,275,278,281,284],{"class":62,"line":266},17,[60,268,269],{"class":66},"function",[60,271,272],{"class":101}," sendMessage",[60,274,105],{"class":70},[60,276,277],{"class":221},"text",[60,279,280],{"class":66},":",[60,282,283],{"class":94}," string",[60,285,286],{"class":70},") {\n",[60,288,290,293,296,298,300],{"class":62,"line":289},18,[60,291,292],{"class":70},"  chatRoom.",[60,294,295],{"class":101},"emit",[60,297,105],{"class":70},[60,299,190],{"class":77},[60,301,302],{"class":70},", {\n",[60,304,306],{"class":62,"line":305},19,[60,307,308],{"class":70},"    text,\n",[60,310,312],{"class":62,"line":311},20,[60,313,314],{"class":70},"    sender: currentUser.name,\n",[60,316,318,321,324],{"class":62,"line":317},21,[60,319,320],{"class":70},"    timestamp: Date.",[60,322,323],{"class":101},"now",[60,325,126],{"class":70},[60,327,329],{"class":62,"line":328},22,[60,330,331],{"class":70},"  })\n",[60,333,335],{"class":62,"line":334},23,[60,336,337],{"class":70},"}\n",[49,339,344],{"className":340,"code":341,"filename":342,"language":343,"meta":55,"style":55},"language-python shiki shiki-themes github-light github-dark","from nolag import NoLag\n\nclient = NoLag('your_access_token')\nawait client.connect()\n\nchat_room = client.set_app('chat-app').set_room('general')\n\n# Subscribe to messages\nawait chat_room.subscribe('messages')\n\n# Listen for new messages\ndef on_message(message, meta):\n    display_message(message)\n\nchat_room.on('messages', on_message)\n\n# Send a message\nasync def send_message(text: str):\n    await chat_room.emit('messages', {\n        'text': text,\n        'sender': current_user.name,\n        'timestamp': time.time()\n    })\n","Python","python",[57,345,346,351,355,360,365,369,374,378,383,388,392,397,402,407,411,416,420,425,430,435,440,445,450],{"__ignoreMap":55},[60,347,348],{"class":62,"line":63},[60,349,350],{},"from nolag import NoLag\n",[60,352,353],{"class":62,"line":81},[60,354,85],{"emptyLinePlaceholder":84},[60,356,357],{"class":62,"line":88},[60,358,359],{},"client = NoLag('your_access_token')\n",[60,361,362],{"class":62,"line":114},[60,363,364],{},"await client.connect()\n",[60,366,367],{"class":62,"line":129},[60,368,85],{"emptyLinePlaceholder":84},[60,370,371],{"class":62,"line":134},[60,372,373],{},"chat_room = client.set_app('chat-app').set_room('general')\n",[60,375,376],{"class":62,"line":167},[60,377,85],{"emptyLinePlaceholder":84},[60,379,380],{"class":62,"line":172},[60,381,382],{},"# Subscribe to messages\n",[60,384,385],{"class":62,"line":179},[60,386,387],{},"await chat_room.subscribe('messages')\n",[60,389,390],{"class":62,"line":195},[60,391,85],{"emptyLinePlaceholder":84},[60,393,394],{"class":62,"line":200},[60,395,396],{},"# Listen for new messages\n",[60,398,399],{"class":62,"line":206},[60,400,401],{},"def on_message(message, meta):\n",[60,403,404],{"class":62,"line":240},[60,405,406],{},"    display_message(message)\n",[60,408,409],{"class":62,"line":249},[60,410,85],{"emptyLinePlaceholder":84},[60,412,413],{"class":62,"line":255},[60,414,415],{},"chat_room.on('messages', on_message)\n",[60,417,418],{"class":62,"line":260},[60,419,85],{"emptyLinePlaceholder":84},[60,421,422],{"class":62,"line":266},[60,423,424],{},"# Send a message\n",[60,426,427],{"class":62,"line":289},[60,428,429],{},"async def send_message(text: str):\n",[60,431,432],{"class":62,"line":305},[60,433,434],{},"    await chat_room.emit('messages', {\n",[60,436,437],{"class":62,"line":311},[60,438,439],{},"        'text': text,\n",[60,441,442],{"class":62,"line":317},[60,443,444],{},"        'sender': current_user.name,\n",[60,446,447],{"class":62,"line":328},[60,448,449],{},"        'timestamp': time.time()\n",[60,451,452],{"class":62,"line":334},[60,453,454],{},"    })\n",[49,456,461],{"className":457,"code":458,"filename":459,"language":460,"meta":55,"style":55},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport (\n    \"fmt\"\n    \"time\"\n\n    nolag \"github.com/NoLagApp/go-sdk\"\n)\n\nfunc main() {\n    client := nolag.New(\"your_access_token\")\n    client.Connect()\n\n    chatRoom := client.SetApp(\"chat-app\").SetRoom(\"general\")\n\n    // Subscribe to messages with handler\n    chatRoom.Subscribe(\"messages\", func(data any, meta nolag.MessageMeta) {\n        displayMessage(data)\n    })\n}\n\n// Send a message\nfunc sendMessage(text string) {\n    chatRoom.Emit(\"messages\", map[string]any{\n        \"text\":      text,\n        \"sender\":    currentUser.Name,\n        \"timestamp\": time.Now().Unix(),\n    })\n}\n","Go","go",[57,462,463,468,472,477,482,487,491,496,500,504,509,514,519,523,528,532,537,542,547,551,555,559,563,568,574,580,586,592,597],{"__ignoreMap":55},[60,464,465],{"class":62,"line":63},[60,466,467],{},"package main\n",[60,469,470],{"class":62,"line":81},[60,471,85],{"emptyLinePlaceholder":84},[60,473,474],{"class":62,"line":88},[60,475,476],{},"import (\n",[60,478,479],{"class":62,"line":114},[60,480,481],{},"    \"fmt\"\n",[60,483,484],{"class":62,"line":129},[60,485,486],{},"    \"time\"\n",[60,488,489],{"class":62,"line":134},[60,490,85],{"emptyLinePlaceholder":84},[60,492,493],{"class":62,"line":167},[60,494,495],{},"    nolag \"github.com/NoLagApp/go-sdk\"\n",[60,497,498],{"class":62,"line":172},[60,499,111],{},[60,501,502],{"class":62,"line":179},[60,503,85],{"emptyLinePlaceholder":84},[60,505,506],{"class":62,"line":195},[60,507,508],{},"func main() {\n",[60,510,511],{"class":62,"line":200},[60,512,513],{},"    client := nolag.New(\"your_access_token\")\n",[60,515,516],{"class":62,"line":206},[60,517,518],{},"    client.Connect()\n",[60,520,521],{"class":62,"line":240},[60,522,85],{"emptyLinePlaceholder":84},[60,524,525],{"class":62,"line":249},[60,526,527],{},"    chatRoom := client.SetApp(\"chat-app\").SetRoom(\"general\")\n",[60,529,530],{"class":62,"line":255},[60,531,85],{"emptyLinePlaceholder":84},[60,533,534],{"class":62,"line":260},[60,535,536],{},"    // Subscribe to messages with handler\n",[60,538,539],{"class":62,"line":266},[60,540,541],{},"    chatRoom.Subscribe(\"messages\", func(data any, meta nolag.MessageMeta) {\n",[60,543,544],{"class":62,"line":289},[60,545,546],{},"        displayMessage(data)\n",[60,548,549],{"class":62,"line":305},[60,550,454],{},[60,552,553],{"class":62,"line":311},[60,554,337],{},[60,556,557],{"class":62,"line":317},[60,558,85],{"emptyLinePlaceholder":84},[60,560,561],{"class":62,"line":328},[60,562,263],{},[60,564,565],{"class":62,"line":334},[60,566,567],{},"func sendMessage(text string) {\n",[60,569,571],{"class":62,"line":570},24,[60,572,573],{},"    chatRoom.Emit(\"messages\", map[string]any{\n",[60,575,577],{"class":62,"line":576},25,[60,578,579],{},"        \"text\":      text,\n",[60,581,583],{"class":62,"line":582},26,[60,584,585],{},"        \"sender\":    currentUser.Name,\n",[60,587,589],{"class":62,"line":588},27,[60,590,591],{},"        \"timestamp\": time.Now().Unix(),\n",[60,593,595],{"class":62,"line":594},28,[60,596,454],{},[60,598,600],{"class":62,"line":599},29,[60,601,337],{},[18,603,605],{"id":604},"adding-presence","Adding Presence",[14,607,608],{},"Show who's currently in the chat room:",[46,610,611,813,918],{},[49,612,614],{"className":51,"code":613,"filename":53,"language":54,"meta":55,"style":55},"// Set your presence (project-level) after connecting\nclient.setPresence({\n  username: currentUser.name,\n  status: 'online',\n  avatar: currentUser.avatar\n})\n\n// Handle presence events on the client\nclient.on('presence:join', (actor) => {\n  addUserToList(actor.presence)\n  showNotification(`${actor.presence.username} joined`)\n})\n\nclient.on('presence:leave', (actor) => {\n  removeUserFromList(actor.actorTokenId)\n  showNotification(`${actor.presence.username} left`)\n})\n\n// Get list of online users\nconst onlineUsers = client.getPresence()\n",[57,615,616,621,632,637,648,653,657,661,666,688,696,724,728,732,753,761,784,788,792,797],{"__ignoreMap":55},[60,617,618],{"class":62,"line":63},[60,619,620],{"class":175},"// Set your presence (project-level) after connecting\n",[60,622,623,626,629],{"class":62,"line":81},[60,624,625],{"class":70},"client.",[60,627,628],{"class":101},"setPresence",[60,630,631],{"class":70},"({\n",[60,633,634],{"class":62,"line":88},[60,635,636],{"class":70},"  username: currentUser.name,\n",[60,638,639,642,645],{"class":62,"line":114},[60,640,641],{"class":70},"  status: ",[60,643,644],{"class":77},"'online'",[60,646,647],{"class":70},",\n",[60,649,650],{"class":62,"line":129},[60,651,652],{"class":70},"  avatar: currentUser.avatar\n",[60,654,655],{"class":62,"line":134},[60,656,252],{"class":70},[60,658,659],{"class":62,"line":167},[60,660,85],{"emptyLinePlaceholder":84},[60,662,663],{"class":62,"line":172},[60,664,665],{"class":175},"// Handle presence events on the client\n",[60,667,668,670,672,674,677,679,682,684,686],{"class":62,"line":179},[60,669,625],{"class":70},[60,671,211],{"class":101},[60,673,105],{"class":70},[60,675,676],{"class":77},"'presence:join'",[60,678,218],{"class":70},[60,680,681],{"class":221},"actor",[60,683,231],{"class":70},[60,685,234],{"class":66},[60,687,237],{"class":70},[60,689,690,693],{"class":62,"line":195},[60,691,692],{"class":101},"  addUserToList",[60,694,695],{"class":70},"(actor.presence)\n",[60,697,698,701,703,706,708,711,714,716,719,722],{"class":62,"line":200},[60,699,700],{"class":101},"  showNotification",[60,702,105],{"class":70},[60,704,705],{"class":77},"`${",[60,707,681],{"class":70},[60,709,710],{"class":77},".",[60,712,713],{"class":70},"presence",[60,715,710],{"class":77},[60,717,718],{"class":70},"username",[60,720,721],{"class":77},"} joined`",[60,723,111],{"class":70},[60,725,726],{"class":62,"line":206},[60,727,252],{"class":70},[60,729,730],{"class":62,"line":240},[60,731,85],{"emptyLinePlaceholder":84},[60,733,734,736,738,740,743,745,747,749,751],{"class":62,"line":249},[60,735,625],{"class":70},[60,737,211],{"class":101},[60,739,105],{"class":70},[60,741,742],{"class":77},"'presence:leave'",[60,744,218],{"class":70},[60,746,681],{"class":221},[60,748,231],{"class":70},[60,750,234],{"class":66},[60,752,237],{"class":70},[60,754,755,758],{"class":62,"line":255},[60,756,757],{"class":101},"  removeUserFromList",[60,759,760],{"class":70},"(actor.actorTokenId)\n",[60,762,763,765,767,769,771,773,775,777,779,782],{"class":62,"line":260},[60,764,700],{"class":101},[60,766,105],{"class":70},[60,768,705],{"class":77},[60,770,681],{"class":70},[60,772,710],{"class":77},[60,774,713],{"class":70},[60,776,710],{"class":77},[60,778,718],{"class":70},[60,780,781],{"class":77},"} left`",[60,783,111],{"class":70},[60,785,786],{"class":62,"line":266},[60,787,252],{"class":70},[60,789,790],{"class":62,"line":289},[60,791,85],{"emptyLinePlaceholder":84},[60,793,794],{"class":62,"line":305},[60,795,796],{"class":175},"// Get list of online users\n",[60,798,799,801,804,806,808,811],{"class":62,"line":311},[60,800,91],{"class":66},[60,802,803],{"class":94}," onlineUsers",[60,805,98],{"class":66},[60,807,120],{"class":70},[60,809,810],{"class":101},"getPresence",[60,812,126],{"class":70},[49,814,816],{"className":340,"code":815,"filename":342,"language":343,"meta":55,"style":55},"# Set your presence (project-level) after connecting\nawait client.set_presence({\n    'username': current_user.name,\n    'status': 'online',\n    'avatar': current_user.avatar\n})\n\n# Handle presence events on the client\ndef on_join(actor):\n    add_user_to_list(actor.presence)\n    show_notification(f\"{actor.presence['username']} joined\")\n\ndef on_leave(actor):\n    remove_user_from_list(actor.actor_token_id)\n    show_notification(f\"{actor.presence['username']} left\")\n\nclient.on('presence:join', on_join)\nclient.on('presence:leave', on_leave)\n\n# Get list of online users\nonline_users = client.get_all_presence()\n",[57,817,818,823,828,833,838,843,847,851,856,861,866,871,875,880,885,890,894,899,904,908,913],{"__ignoreMap":55},[60,819,820],{"class":62,"line":63},[60,821,822],{},"# Set your presence (project-level) after connecting\n",[60,824,825],{"class":62,"line":81},[60,826,827],{},"await client.set_presence({\n",[60,829,830],{"class":62,"line":88},[60,831,832],{},"    'username': current_user.name,\n",[60,834,835],{"class":62,"line":114},[60,836,837],{},"    'status': 'online',\n",[60,839,840],{"class":62,"line":129},[60,841,842],{},"    'avatar': current_user.avatar\n",[60,844,845],{"class":62,"line":134},[60,846,252],{},[60,848,849],{"class":62,"line":167},[60,850,85],{"emptyLinePlaceholder":84},[60,852,853],{"class":62,"line":172},[60,854,855],{},"# Handle presence events on the client\n",[60,857,858],{"class":62,"line":179},[60,859,860],{},"def on_join(actor):\n",[60,862,863],{"class":62,"line":195},[60,864,865],{},"    add_user_to_list(actor.presence)\n",[60,867,868],{"class":62,"line":200},[60,869,870],{},"    show_notification(f\"{actor.presence['username']} joined\")\n",[60,872,873],{"class":62,"line":206},[60,874,85],{"emptyLinePlaceholder":84},[60,876,877],{"class":62,"line":240},[60,878,879],{},"def on_leave(actor):\n",[60,881,882],{"class":62,"line":249},[60,883,884],{},"    remove_user_from_list(actor.actor_token_id)\n",[60,886,887],{"class":62,"line":255},[60,888,889],{},"    show_notification(f\"{actor.presence['username']} left\")\n",[60,891,892],{"class":62,"line":260},[60,893,85],{"emptyLinePlaceholder":84},[60,895,896],{"class":62,"line":266},[60,897,898],{},"client.on('presence:join', on_join)\n",[60,900,901],{"class":62,"line":289},[60,902,903],{},"client.on('presence:leave', on_leave)\n",[60,905,906],{"class":62,"line":305},[60,907,85],{"emptyLinePlaceholder":84},[60,909,910],{"class":62,"line":311},[60,911,912],{},"# Get list of online users\n",[60,914,915],{"class":62,"line":317},[60,916,917],{},"online_users = client.get_all_presence()\n",[49,919,921],{"className":457,"code":920,"filename":459,"language":460,"meta":55,"style":55},"// Set your presence (project-level) after connecting\nclient.SetPresence(map[string]any{\n    \"username\": currentUser.Name,\n    \"status\":   \"online\",\n    \"avatar\":   currentUser.Avatar,\n})\n\n// Listen for presence events\nclient.On(\"presence\", func(args ...any) {\n    data, _ := args[1].(map[string]any)\n    fmt.Printf(\"Presence event: %v\\n\", data)\n})\n",[57,922,923,927,932,937,942,947,951,955,960,965,970,975],{"__ignoreMap":55},[60,924,925],{"class":62,"line":63},[60,926,620],{},[60,928,929],{"class":62,"line":81},[60,930,931],{},"client.SetPresence(map[string]any{\n",[60,933,934],{"class":62,"line":88},[60,935,936],{},"    \"username\": currentUser.Name,\n",[60,938,939],{"class":62,"line":114},[60,940,941],{},"    \"status\":   \"online\",\n",[60,943,944],{"class":62,"line":129},[60,945,946],{},"    \"avatar\":   currentUser.Avatar,\n",[60,948,949],{"class":62,"line":134},[60,950,252],{},[60,952,953],{"class":62,"line":167},[60,954,85],{"emptyLinePlaceholder":84},[60,956,957],{"class":62,"line":172},[60,958,959],{},"// Listen for presence events\n",[60,961,962],{"class":62,"line":179},[60,963,964],{},"client.On(\"presence\", func(args ...any) {\n",[60,966,967],{"class":62,"line":195},[60,968,969],{},"    data, _ := args[1].(map[string]any)\n",[60,971,972],{"class":62,"line":200},[60,973,974],{},"    fmt.Printf(\"Presence event: %v\\n\", data)\n",[60,976,977],{"class":62,"line":206},[60,978,252],{},[18,980,982],{"id":981},"message-history","Message History",[14,984,985,986,991],{},"Use ",[987,988,990],"a",{"href":989},"/docs/concepts/webhooks","per-topic webhooks"," to load message history when users join:",[993,994,995,1002,1009],"ol",{},[29,996,997,998,1001],{},"Configure an On Subscribe webhook for the ",[57,999,1000],{},"messages"," topic in your app's topic settings",[29,1003,1004,1005,1008],{},"Your server returns recent messages when called (payload includes ",[57,1006,1007],{},"scope"," for tenant isolation)",[29,1010,1011],{},"Messages are delivered to the client on subscribe",[18,1013,1015],{"id":1014},"next-steps","Next Steps",[26,1017,1018,1024,1029],{},[29,1019,1020],{},[987,1021,1023],{"href":1022},"/docs/concepts/presence","Presence Tracking",[29,1025,1026],{},[987,1027,1028],{"href":989},"Webhooks",[29,1030,1031],{},[987,1032,1034],{"href":1033},"/docs/concepts/qos","Quality of Service",[1036,1037,1038],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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);}",{"title":55,"searchDepth":81,"depth":81,"links":1040},[1041,1042,1043,1044,1045],{"id":20,"depth":81,"text":21},{"id":43,"depth":81,"text":44},{"id":604,"depth":81,"text":605},{"id":981,"depth":81,"text":982},{"id":1014,"depth":81,"text":1015},"Step-by-step guide to building a real-time chat application with NoLag.","md",{},"/docs/guides/chat-app",{"title":5,"description":1046},"docs/guides/chat-app","seiK53XzSFX24WWim-G59XJ56qENC3QMHNKvGrtikh8",1788160343415]