[{"data":1,"prerenderedAt":882},["ShallowReactive",2],{"docs:/docs/guides/notifications":3},{"id":4,"title":5,"body":6,"description":875,"extension":876,"meta":877,"navigation":68,"path":878,"seo":879,"stem":880,"__hash__":881},"docs/docs/guides/notifications.md","Real-time Notifications",{"type":7,"value":8,"toc":867},"minimark",[9,13,17,22,25,29,495,499,799,803,826,830,844,848,863],[10,11,5],"h1",{"id":12},"real-time-notifications",[14,15,16],"p",{},"Build instant notification systems that reach users in real-time.",[18,19,21],"h2",{"id":20},"overview","Overview",[14,23,24],{},"NoLag makes it easy to deliver notifications instantly to users across all their devices. This guide covers setting up a notification system with user-specific channels.",[18,26,28],{"id":27},"client-setup","Client Setup",[30,31,32,262,362],"code-tabs",{},[33,34,40],"pre",{"className":35,"code":36,"filename":37,"language":38,"meta":39,"style":39},"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\n// Subscribe to user-specific notifications\nconst userRoom = client.setApp('my-app').setRoom(`user-${userId}`)\nuserRoom.subscribe('notifications')\n\n// Handle incoming notifications\nuserRoom.on('notifications', (notification) => {\n  showNotification({\n    title: notification.title,\n    body: notification.body,\n    icon: notification.icon,\n    action: notification.action\n  })\n})\n","TypeScript","typescript","",[41,42,43,63,70,96,111,116,123,162,178,183,189,217,226,232,238,244,250,256],"code",{"__ignoreMap":39},[44,45,48,52,56,59],"span",{"class":46,"line":47},"line",1,[44,49,51],{"class":50},"szBVR","import",[44,53,55],{"class":54},"sVt8B"," { NoLag } ",[44,57,58],{"class":50},"from",[44,60,62],{"class":61},"sZZnC"," '@nolag/js-sdk'\n",[44,64,66],{"class":46,"line":65},2,[44,67,69],{"emptyLinePlaceholder":68},true,"\n",[44,71,73,76,80,83,87,90,93],{"class":46,"line":72},3,[44,74,75],{"class":50},"const",[44,77,79],{"class":78},"sj4cs"," client",[44,81,82],{"class":50}," =",[44,84,86],{"class":85},"sScJk"," NoLag",[44,88,89],{"class":54},"(",[44,91,92],{"class":61},"'your_access_token'",[44,94,95],{"class":54},")\n",[44,97,99,102,105,108],{"class":46,"line":98},4,[44,100,101],{"class":50},"await",[44,103,104],{"class":54}," client.",[44,106,107],{"class":85},"connect",[44,109,110],{"class":54},"()\n",[44,112,114],{"class":46,"line":113},5,[44,115,69],{"emptyLinePlaceholder":68},[44,117,119],{"class":46,"line":118},6,[44,120,122],{"class":121},"sJ8bj","// Subscribe to user-specific notifications\n",[44,124,126,128,131,133,135,138,140,143,146,149,151,154,157,160],{"class":46,"line":125},7,[44,127,75],{"class":50},[44,129,130],{"class":78}," userRoom",[44,132,82],{"class":50},[44,134,104],{"class":54},[44,136,137],{"class":85},"setApp",[44,139,89],{"class":54},[44,141,142],{"class":61},"'my-app'",[44,144,145],{"class":54},").",[44,147,148],{"class":85},"setRoom",[44,150,89],{"class":54},[44,152,153],{"class":61},"`user-${",[44,155,156],{"class":54},"userId",[44,158,159],{"class":61},"}`",[44,161,95],{"class":54},[44,163,165,168,171,173,176],{"class":46,"line":164},8,[44,166,167],{"class":54},"userRoom.",[44,169,170],{"class":85},"subscribe",[44,172,89],{"class":54},[44,174,175],{"class":61},"'notifications'",[44,177,95],{"class":54},[44,179,181],{"class":46,"line":180},9,[44,182,69],{"emptyLinePlaceholder":68},[44,184,186],{"class":46,"line":185},10,[44,187,188],{"class":121},"// Handle incoming notifications\n",[44,190,192,194,197,199,201,204,208,211,214],{"class":46,"line":191},11,[44,193,167],{"class":54},[44,195,196],{"class":85},"on",[44,198,89],{"class":54},[44,200,175],{"class":61},[44,202,203],{"class":54},", (",[44,205,207],{"class":206},"s4XuR","notification",[44,209,210],{"class":54},") ",[44,212,213],{"class":50},"=>",[44,215,216],{"class":54}," {\n",[44,218,220,223],{"class":46,"line":219},12,[44,221,222],{"class":85},"  showNotification",[44,224,225],{"class":54},"({\n",[44,227,229],{"class":46,"line":228},13,[44,230,231],{"class":54},"    title: notification.title,\n",[44,233,235],{"class":46,"line":234},14,[44,236,237],{"class":54},"    body: notification.body,\n",[44,239,241],{"class":46,"line":240},15,[44,242,243],{"class":54},"    icon: notification.icon,\n",[44,245,247],{"class":46,"line":246},16,[44,248,249],{"class":54},"    action: notification.action\n",[44,251,253],{"class":46,"line":252},17,[44,254,255],{"class":54},"  })\n",[44,257,259],{"class":46,"line":258},18,[44,260,261],{"class":54},"})\n",[33,263,268],{"className":264,"code":265,"filename":266,"language":267,"meta":39,"style":39},"language-python shiki shiki-themes github-light github-dark","from nolag import NoLag\n\nclient = NoLag('your_access_token')\nawait client.connect()\n\n# Subscribe to user-specific notifications\nuser_room = client.set_app('my-app').set_room(f'user-{user_id}')\nawait user_room.subscribe('notifications')\n\n# Handle incoming notifications\ndef on_notification(notification, meta):\n    show_notification({\n        'title': notification['title'],\n        'body': notification['body'],\n        'icon': notification['icon'],\n        'action': notification['action']\n    })\n\nuser_room.on('notifications', on_notification)\n","Python","python",[41,269,270,275,279,284,289,293,298,303,308,312,317,322,327,332,337,342,347,352,356],{"__ignoreMap":39},[44,271,272],{"class":46,"line":47},[44,273,274],{},"from nolag import NoLag\n",[44,276,277],{"class":46,"line":65},[44,278,69],{"emptyLinePlaceholder":68},[44,280,281],{"class":46,"line":72},[44,282,283],{},"client = NoLag('your_access_token')\n",[44,285,286],{"class":46,"line":98},[44,287,288],{},"await client.connect()\n",[44,290,291],{"class":46,"line":113},[44,292,69],{"emptyLinePlaceholder":68},[44,294,295],{"class":46,"line":118},[44,296,297],{},"# Subscribe to user-specific notifications\n",[44,299,300],{"class":46,"line":125},[44,301,302],{},"user_room = client.set_app('my-app').set_room(f'user-{user_id}')\n",[44,304,305],{"class":46,"line":164},[44,306,307],{},"await user_room.subscribe('notifications')\n",[44,309,310],{"class":46,"line":180},[44,311,69],{"emptyLinePlaceholder":68},[44,313,314],{"class":46,"line":185},[44,315,316],{},"# Handle incoming notifications\n",[44,318,319],{"class":46,"line":191},[44,320,321],{},"def on_notification(notification, meta):\n",[44,323,324],{"class":46,"line":219},[44,325,326],{},"    show_notification({\n",[44,328,329],{"class":46,"line":228},[44,330,331],{},"        'title': notification['title'],\n",[44,333,334],{"class":46,"line":234},[44,335,336],{},"        'body': notification['body'],\n",[44,338,339],{"class":46,"line":240},[44,340,341],{},"        'icon': notification['icon'],\n",[44,343,344],{"class":46,"line":246},[44,345,346],{},"        'action': notification['action']\n",[44,348,349],{"class":46,"line":252},[44,350,351],{},"    })\n",[44,353,354],{"class":46,"line":258},[44,355,69],{"emptyLinePlaceholder":68},[44,357,359],{"class":46,"line":358},19,[44,360,361],{},"user_room.on('notifications', on_notification)\n",[33,363,368],{"className":364,"code":365,"filename":366,"language":367,"meta":39,"style":39},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport (\n    \"fmt\"\n\n    nolag \"github.com/NoLagApp/go-sdk\"\n)\n\nfunc main() {\n    client := nolag.New(\"your_access_token\")\n    client.Connect()\n\n    // Subscribe to user-specific notifications\n    userRoom := client.SetApp(\"my-app\").SetRoom(fmt.Sprintf(\"user-%s\", userID))\n    // Subscribe with handler\n    userRoom.Subscribe(\"notifications\", func(data any, meta nolag.MessageMeta) {\n        notification, _ := data.(map[string]any)\n        showNotification(Notification{\n            Title:  notification[\"title\"].(string),\n            Body:   notification[\"body\"].(string),\n            Icon:   notification[\"icon\"].(string),\n            Action: notification[\"action\"].(string),\n        })\n    })\n}\n","Go","go",[41,369,370,375,379,384,389,393,398,402,406,411,416,421,425,430,435,440,445,450,455,460,466,472,478,484,489],{"__ignoreMap":39},[44,371,372],{"class":46,"line":47},[44,373,374],{},"package main\n",[44,376,377],{"class":46,"line":65},[44,378,69],{"emptyLinePlaceholder":68},[44,380,381],{"class":46,"line":72},[44,382,383],{},"import (\n",[44,385,386],{"class":46,"line":98},[44,387,388],{},"    \"fmt\"\n",[44,390,391],{"class":46,"line":113},[44,392,69],{"emptyLinePlaceholder":68},[44,394,395],{"class":46,"line":118},[44,396,397],{},"    nolag \"github.com/NoLagApp/go-sdk\"\n",[44,399,400],{"class":46,"line":125},[44,401,95],{},[44,403,404],{"class":46,"line":164},[44,405,69],{"emptyLinePlaceholder":68},[44,407,408],{"class":46,"line":180},[44,409,410],{},"func main() {\n",[44,412,413],{"class":46,"line":185},[44,414,415],{},"    client := nolag.New(\"your_access_token\")\n",[44,417,418],{"class":46,"line":191},[44,419,420],{},"    client.Connect()\n",[44,422,423],{"class":46,"line":219},[44,424,69],{"emptyLinePlaceholder":68},[44,426,427],{"class":46,"line":228},[44,428,429],{},"    // Subscribe to user-specific notifications\n",[44,431,432],{"class":46,"line":234},[44,433,434],{},"    userRoom := client.SetApp(\"my-app\").SetRoom(fmt.Sprintf(\"user-%s\", userID))\n",[44,436,437],{"class":46,"line":240},[44,438,439],{},"    // Subscribe with handler\n",[44,441,442],{"class":46,"line":246},[44,443,444],{},"    userRoom.Subscribe(\"notifications\", func(data any, meta nolag.MessageMeta) {\n",[44,446,447],{"class":46,"line":252},[44,448,449],{},"        notification, _ := data.(map[string]any)\n",[44,451,452],{"class":46,"line":258},[44,453,454],{},"        showNotification(Notification{\n",[44,456,457],{"class":46,"line":358},[44,458,459],{},"            Title:  notification[\"title\"].(string),\n",[44,461,463],{"class":46,"line":462},20,[44,464,465],{},"            Body:   notification[\"body\"].(string),\n",[44,467,469],{"class":46,"line":468},21,[44,470,471],{},"            Icon:   notification[\"icon\"].(string),\n",[44,473,475],{"class":46,"line":474},22,[44,476,477],{},"            Action: notification[\"action\"].(string),\n",[44,479,481],{"class":46,"line":480},23,[44,482,483],{},"        })\n",[44,485,487],{"class":46,"line":486},24,[44,488,351],{},[44,490,492],{"class":46,"line":491},25,[44,493,494],{},"}\n",[18,496,498],{"id":497},"sending-notifications-server","Sending Notifications (Server)",[30,500,501,644,713],{},[33,502,504],{"className":35,"code":503,"filename":37,"language":38,"meta":39,"style":39},"import { NoLag } from '@nolag/js-sdk'\n\n// Server-side: Connect and send notification to a user\nconst client = NoLag('your_server_access_token')\nawait client.connect()\n\nconst userRoom = client.setApp('my-app').setRoom('user-123')\n\nuserRoom.emit('notifications', {\n  title: 'New Message',\n  body: 'You have a new message from Alice',\n  icon: 'message',\n  action: '/messages/456'\n})\n",[41,505,506,516,520,525,542,552,556,583,587,601,612,622,632,640],{"__ignoreMap":39},[44,507,508,510,512,514],{"class":46,"line":47},[44,509,51],{"class":50},[44,511,55],{"class":54},[44,513,58],{"class":50},[44,515,62],{"class":61},[44,517,518],{"class":46,"line":65},[44,519,69],{"emptyLinePlaceholder":68},[44,521,522],{"class":46,"line":72},[44,523,524],{"class":121},"// Server-side: Connect and send notification to a user\n",[44,526,527,529,531,533,535,537,540],{"class":46,"line":98},[44,528,75],{"class":50},[44,530,79],{"class":78},[44,532,82],{"class":50},[44,534,86],{"class":85},[44,536,89],{"class":54},[44,538,539],{"class":61},"'your_server_access_token'",[44,541,95],{"class":54},[44,543,544,546,548,550],{"class":46,"line":113},[44,545,101],{"class":50},[44,547,104],{"class":54},[44,549,107],{"class":85},[44,551,110],{"class":54},[44,553,554],{"class":46,"line":118},[44,555,69],{"emptyLinePlaceholder":68},[44,557,558,560,562,564,566,568,570,572,574,576,578,581],{"class":46,"line":125},[44,559,75],{"class":50},[44,561,130],{"class":78},[44,563,82],{"class":50},[44,565,104],{"class":54},[44,567,137],{"class":85},[44,569,89],{"class":54},[44,571,142],{"class":61},[44,573,145],{"class":54},[44,575,148],{"class":85},[44,577,89],{"class":54},[44,579,580],{"class":61},"'user-123'",[44,582,95],{"class":54},[44,584,585],{"class":46,"line":164},[44,586,69],{"emptyLinePlaceholder":68},[44,588,589,591,594,596,598],{"class":46,"line":180},[44,590,167],{"class":54},[44,592,593],{"class":85},"emit",[44,595,89],{"class":54},[44,597,175],{"class":61},[44,599,600],{"class":54},", {\n",[44,602,603,606,609],{"class":46,"line":185},[44,604,605],{"class":54},"  title: ",[44,607,608],{"class":61},"'New Message'",[44,610,611],{"class":54},",\n",[44,613,614,617,620],{"class":46,"line":191},[44,615,616],{"class":54},"  body: ",[44,618,619],{"class":61},"'You have a new message from Alice'",[44,621,611],{"class":54},[44,623,624,627,630],{"class":46,"line":219},[44,625,626],{"class":54},"  icon: ",[44,628,629],{"class":61},"'message'",[44,631,611],{"class":54},[44,633,634,637],{"class":46,"line":228},[44,635,636],{"class":54},"  action: ",[44,638,639],{"class":61},"'/messages/456'\n",[44,641,642],{"class":46,"line":234},[44,643,261],{"class":54},[33,645,647],{"className":264,"code":646,"filename":266,"language":267,"meta":39,"style":39},"from nolag import NoLag\n\n# Server-side: Connect and send notification to a user\nclient = NoLag('your_server_access_token')\nawait client.connect()\n\nuser_room = client.set_app('my-app').set_room('user-123')\n\nawait user_room.emit('notifications', {\n    'title': 'New Message',\n    'body': 'You have a new message from Alice',\n    'icon': 'message',\n    'action': '/messages/456'\n})\n",[41,648,649,653,657,662,667,671,675,680,684,689,694,699,704,709],{"__ignoreMap":39},[44,650,651],{"class":46,"line":47},[44,652,274],{},[44,654,655],{"class":46,"line":65},[44,656,69],{"emptyLinePlaceholder":68},[44,658,659],{"class":46,"line":72},[44,660,661],{},"# Server-side: Connect and send notification to a user\n",[44,663,664],{"class":46,"line":98},[44,665,666],{},"client = NoLag('your_server_access_token')\n",[44,668,669],{"class":46,"line":113},[44,670,288],{},[44,672,673],{"class":46,"line":118},[44,674,69],{"emptyLinePlaceholder":68},[44,676,677],{"class":46,"line":125},[44,678,679],{},"user_room = client.set_app('my-app').set_room('user-123')\n",[44,681,682],{"class":46,"line":164},[44,683,69],{"emptyLinePlaceholder":68},[44,685,686],{"class":46,"line":180},[44,687,688],{},"await user_room.emit('notifications', {\n",[44,690,691],{"class":46,"line":185},[44,692,693],{},"    'title': 'New Message',\n",[44,695,696],{"class":46,"line":191},[44,697,698],{},"    'body': 'You have a new message from Alice',\n",[44,700,701],{"class":46,"line":219},[44,702,703],{},"    'icon': 'message',\n",[44,705,706],{"class":46,"line":228},[44,707,708],{},"    'action': '/messages/456'\n",[44,710,711],{"class":46,"line":234},[44,712,261],{},[33,714,716],{"className":364,"code":715,"filename":366,"language":367,"meta":39,"style":39},"package main\n\nimport nolag \"github.com/NoLagApp/go-sdk\"\n\nfunc main() {\n    // Server-side: Connect and send notification to a user\n    client := nolag.New(\"your_server_access_token\")\n    client.Connect()\n\n    userRoom := client.SetApp(\"my-app\").SetRoom(\"user-123\")\n\n    userRoom.Emit(\"notifications\", map[string]any{\n        \"title\":  \"New Message\",\n        \"body\":   \"You have a new message from Alice\",\n        \"icon\":   \"message\",\n        \"action\": \"/messages/456\",\n    })\n}\n",[41,717,718,722,726,731,735,739,744,749,753,757,762,766,771,776,781,786,791,795],{"__ignoreMap":39},[44,719,720],{"class":46,"line":47},[44,721,374],{},[44,723,724],{"class":46,"line":65},[44,725,69],{"emptyLinePlaceholder":68},[44,727,728],{"class":46,"line":72},[44,729,730],{},"import nolag \"github.com/NoLagApp/go-sdk\"\n",[44,732,733],{"class":46,"line":98},[44,734,69],{"emptyLinePlaceholder":68},[44,736,737],{"class":46,"line":113},[44,738,410],{},[44,740,741],{"class":46,"line":118},[44,742,743],{},"    // Server-side: Connect and send notification to a user\n",[44,745,746],{"class":46,"line":125},[44,747,748],{},"    client := nolag.New(\"your_server_access_token\")\n",[44,750,751],{"class":46,"line":164},[44,752,420],{},[44,754,755],{"class":46,"line":180},[44,756,69],{"emptyLinePlaceholder":68},[44,758,759],{"class":46,"line":185},[44,760,761],{},"    userRoom := client.SetApp(\"my-app\").SetRoom(\"user-123\")\n",[44,763,764],{"class":46,"line":191},[44,765,69],{"emptyLinePlaceholder":68},[44,767,768],{"class":46,"line":219},[44,769,770],{},"    userRoom.Emit(\"notifications\", map[string]any{\n",[44,772,773],{"class":46,"line":228},[44,774,775],{},"        \"title\":  \"New Message\",\n",[44,777,778],{"class":46,"line":234},[44,779,780],{},"        \"body\":   \"You have a new message from Alice\",\n",[44,782,783],{"class":46,"line":240},[44,784,785],{},"        \"icon\":   \"message\",\n",[44,787,788],{"class":46,"line":246},[44,789,790],{},"        \"action\": \"/messages/456\",\n",[44,792,793],{"class":46,"line":252},[44,794,351],{},[44,796,797],{"class":46,"line":258},[44,798,494],{},[18,800,802],{"id":801},"notification-types","Notification Types",[804,805,806,814,820],"ul",{},[807,808,809,813],"li",{},[810,811,812],"strong",{},"User notifications"," - Personal notifications for a specific user",[807,815,816,819],{},[810,817,818],{},"Broadcast notifications"," - Announcements to all users",[807,821,822,825],{},[810,823,824],{},"Group notifications"," - Messages to specific user groups",[18,827,829],{"id":828},"best-practices","Best Practices",[804,831,832,835,838,841],{},[807,833,834],{},"Use user-specific rooms for private notifications",[807,836,837],{},"Include action URLs for clickable notifications",[807,839,840],{},"Consider notification preferences and quiet hours",[807,842,843],{},"Use per-topic trigger webhooks to also send push notifications for offline users",[18,845,847],{"id":846},"next-steps","Next Steps",[804,849,850,857],{},[807,851,852],{},[853,854,856],"a",{"href":855},"/docs/concepts/webhooks","Webhooks for push notifications",[807,858,859],{},[853,860,862],{"href":861},"/docs/concepts/acl","Access Control",[864,865,866],"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":39,"searchDepth":65,"depth":65,"links":868},[869,870,871,872,873,874],{"id":20,"depth":65,"text":21},{"id":27,"depth":65,"text":28},{"id":497,"depth":65,"text":498},{"id":801,"depth":65,"text":802},{"id":828,"depth":65,"text":829},{"id":846,"depth":65,"text":847},"Build real-time notification systems with NoLag.","md",{},"/docs/guides/notifications",{"title":5,"description":875},"docs/guides/notifications","yxLMhPOdcN6AEJJGxduANLcYfME7FhdlE-xd4UKDLug",1788160343574]