[{"data":1,"prerenderedAt":699},["ShallowReactive",2],{"navigation":3,"/docs/features/notifications":156,"/docs/features/notifications-surround":694},[4,23,83,103,118,133,141],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"What is TaskView","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/docs/getting-started/installation","docs/1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick Start","/docs/getting-started/usage","docs/1.getting-started/3.usage","i-lucide-rocket",false,{"title":24,"icon":22,"path":25,"stem":26,"children":27,"page":22},"Features","/docs/features","docs/2.features",[28,33,38,43,48,53,58,63,68,73,78],{"title":29,"path":30,"stem":31,"icon":32},"Projects and Lists","/docs/features/projects-and-lists","docs/2.features/1.projects-and-lists","i-lucide-folder",{"title":34,"path":35,"stem":36,"icon":37},"Organizations","/docs/features/organizations","docs/2.features/10.organizations","i-lucide-building-2",{"title":39,"path":40,"stem":41,"icon":42},"SSO (Single Sign-On)","/docs/features/sso","docs/2.features/11.sso","i-lucide-shield-check",{"title":44,"path":45,"stem":46,"icon":47},"Tasks","/docs/features/tasks","docs/2.features/2.tasks","i-lucide-check-square",{"title":49,"path":50,"stem":51,"icon":52},"Kanban Board","/docs/features/kanban","docs/2.features/3.kanban","i-lucide-columns-3",{"title":54,"path":55,"stem":56,"icon":57},"Dependency Graph","/docs/features/graph","docs/2.features/4.graph","i-lucide-git-branch",{"title":59,"path":60,"stem":61,"icon":62},"Dashboard","/docs/features/dashboard","docs/2.features/5.dashboard","i-lucide-layout-dashboard",{"title":64,"path":65,"stem":66,"icon":67},"Notifications","/docs/features/notifications","docs/2.features/6.notifications","i-lucide-bell",{"title":69,"path":70,"stem":71,"icon":72},"Webhooks","/docs/features/webhooks","docs/2.features/7.webhooks","i-lucide-webhook",{"title":74,"path":75,"stem":76,"icon":77},"API Tokens","/docs/features/api-tokens","docs/2.features/8.api-tokens","i-lucide-key-round",{"title":79,"path":80,"stem":81,"icon":82},"Sessions & Devices","/docs/features/sessions","docs/2.features/9.sessions","i-lucide-monitor-smartphone",{"title":84,"icon":22,"path":85,"stem":86,"children":87,"page":22},"Integrations","/docs/integrations","docs/3.integrations",[88,93,98],{"title":89,"path":90,"stem":91,"icon":92},"GitHub & GitLab Setup","/docs/integrations/setup","docs/3.integrations/1.setup","i-lucide-git-pull-request",{"title":94,"path":95,"stem":96,"icon":97},"MCP Server","/docs/integrations/mcp","docs/3.integrations/2.mcp","i-lucide-bot",{"title":99,"path":100,"stem":101,"icon":102},"Telegram & Slack Setup","/docs/integrations/messaging","docs/3.integrations/3.messaging","i-lucide-send",{"title":104,"icon":22,"path":105,"stem":106,"children":107,"page":22},"Configuration","/docs/configuration","docs/4.configuration",[108,113],{"title":109,"path":110,"stem":111,"icon":112},"Environment Variables","/docs/configuration/environment-variables","docs/4.configuration/1.environment-variables","i-lucide-settings",{"title":114,"path":115,"stem":116,"icon":117},"Authentication","/docs/configuration/authentication","docs/4.configuration/2.authentication","i-lucide-lock",{"title":119,"icon":22,"path":120,"stem":121,"children":122,"page":22},"Collaboration","/docs/collaboration","docs/5.collaboration",[123,128],{"title":124,"path":125,"stem":126,"icon":127},"Team Members","/docs/collaboration/members","docs/5.collaboration/1.members","i-lucide-users",{"title":129,"path":130,"stem":131,"icon":132},"Roles and Permissions","/docs/collaboration/roles-and-permissions","docs/5.collaboration/2.roles-and-permissions","i-lucide-shield",{"title":134,"path":135,"stem":136,"children":137,"icon":22},"FAQ","/docs/faq","docs/6.faq/1.index",[138],{"title":139,"path":135,"stem":136,"icon":140},"Frequently Asked Questions","i-lucide-circle-help",{"title":142,"icon":22,"path":143,"stem":144,"children":145,"page":22},"Guides","/docs/guides","docs/7.guides",[146,151],{"title":147,"path":148,"stem":149,"icon":150},"Deploy TaskView on a VPS with Nginx","/docs/guides/deploy-vps-nginx","docs/7.guides/1.deploy-vps-nginx","i-lucide-server",{"title":152,"path":153,"stem":154,"icon":155},"TaskView for Freelancers","/docs/guides/taskview-for-freelancers","docs/7.guides/2.taskview-for-freelancers","i-lucide-briefcase",{"id":157,"title":64,"body":158,"description":688,"extension":689,"meta":690,"navigation":691,"path":65,"seo":692,"stem":66,"__hash__":693},"docs/docs/2.features/6.notifications.md",{"type":159,"value":160,"toc":673},"minimark",[161,165,170,271,275,278,336,339,343,350,357,362,365,381,384,388,396,399,462,465,469,501,505,508,525,528,531,539,543],[162,163,164],"p",{},"TaskView notifies you when things happen in your projects. Notifications are delivered through multiple channels and can be customized per user.",[166,167,169],"h2",{"id":168},"notification-types","Notification types",[171,172,173,192],"table",{},[174,175,176],"thead",{},[177,178,179,183,186,189],"tr",{},[180,181,182],"th",{},"Type",[180,184,185],{},"When it fires",[180,187,188],{},"Delivery",[180,190,191],{},"Status",[193,194,195,213,228,243,257],"tbody",{},[177,196,197,204,207,210],{},[198,199,200],"td",{},[201,202,203],"strong",{},"Deadline",[198,205,206],{},"When a task deadline is reached",[198,208,209],{},"Scheduled via background job (pgboss). If the deadline is already past when set, fires immediately.",[198,211,212],{},"Available",[177,214,215,220,223,226],{},[198,216,217],{},[201,218,219],{},"Assignment",[198,221,222],{},"When you are assigned to a task",[198,224,225],{},"Immediate",[198,227,212],{},[177,229,230,235,238,240],{},[198,231,232],{},[201,233,234],{},"Mention",[198,236,237],{},"When someone mentions you",[198,239,225],{},[198,241,242],{},"Planned",[177,244,245,250,253,255],{},[198,246,247],{},[201,248,249],{},"Comment",[198,251,252],{},"When someone comments on your task",[198,254,225],{},[198,256,242],{},[177,258,259,264,267,269],{},[198,260,261],{},[201,262,263],{},"Status change",[198,265,266],{},"When a task status changes",[198,268,225],{},[198,270,242],{},[166,272,274],{"id":273},"delivery-channels","Delivery channels",[162,276,277],{},"Notifications can be sent through two channels (with email planned for the future):",[171,279,280,293],{},[174,281,282],{},[177,283,284,287,290],{},[180,285,286],{},"Channel",[180,288,289],{},"Description",[180,291,292],{},"Required configuration",[193,294,295,311],{},[177,296,297,302,305],{},[198,298,299],{},[201,300,301],{},"Push",[198,303,304],{},"Native push notifications on iOS/Android via Firebase Cloud Messaging",[198,306,307],{},[308,309,310],"code",{},"FIREBASE_CREDENTIALS_PATH",[177,312,313,318,321],{},[198,314,315],{},[201,316,317],{},"In-app (WebSocket)",[198,319,320],{},"Real-time delivery to the browser via Centrifugo",[198,322,323,326,327,326,330,326,333],{},[308,324,325],{},"CENTRIFUGO_API_URL",", ",[308,328,329],{},"CENTRIFUGO_API_KEY",[308,331,332],{},"CENTRIFUGO_TOKEN_SECRET",[308,334,335],{},"CENTRIFUGO_PUBLIC_URL",[162,337,338],{},"Both channels are optional. If Firebase is not configured, push notifications are silently skipped. If Centrifugo is not configured, in-app real-time delivery is skipped. Notifications are always saved to the database regardless of channel availability.",[166,340,342],{"id":341},"user-preferences","User preferences",[162,344,345,346,349],{},"Each user can control which notifications they receive and through which channels. Settings are available in ",[201,347,348],{},"Account Settings > Notification Settings",".",[162,351,352,353,356],{},"Preferences follow an ",[201,354,355],{},"opt-out model",": everything is enabled by default. Users explicitly disable what they do not want.",[358,359,361],"h3",{"id":360},"global-and-per-project-settings","Global and per-project settings",[162,363,364],{},"Preferences support two levels:",[366,367,368,375],"ul",{},[369,370,371,374],"li",{},[201,372,373],{},"Global"," applies to all projects",[369,376,377,380],{},[201,378,379],{},"Project overrides"," apply to a specific project and are merged on top of global settings",[162,382,383],{},"For example, a user can enable push for all deadline notifications globally, but disable push for deadlines in a specific project.",[358,385,387],{"id":386},"deadline-intervals-planned","Deadline intervals (planned)",[389,390,393],"callout",{"color":391,"icon":392},"warning","i-lucide-construction",[162,394,395],{},"Deadline intervals are defined in the preferences structure but not yet active. Currently, deadline notifications fire once at the moment of the deadline. Multiple interval support is planned for a future release.",[162,397,398],{},"The preferences structure supports the following intervals (minutes before the deadline):",[171,400,401,410],{},[174,402,403],{},[177,404,405,408],{},[180,406,407],{},"Interval",[180,409,289],{},[193,411,412,422,432,442,452],{},[177,413,414,419],{},[198,415,416],{},[308,417,418],{},"0",[198,420,421],{},"At the moment of the deadline",[177,423,424,429],{},[198,425,426],{},[308,427,428],{},"15",[198,430,431],{},"15 minutes before",[177,433,434,439],{},[198,435,436],{},[308,437,438],{},"30",[198,440,441],{},"30 minutes before",[177,443,444,449],{},[198,445,446],{},[308,447,448],{},"60",[198,450,451],{},"1 hour before",[177,453,454,459],{},[198,455,456],{},[308,457,458],{},"1440",[198,460,461],{},"1 day before",[162,463,464],{},"Each interval can be independently enabled or disabled.",[166,466,468],{"id":467},"how-it-works","How it works",[470,471,472,475,481,488,495],"ol",{},[369,473,474],{},"An event occurs (task created, deadline changed, assignees changed, etc.)",[369,476,477,480],{},[201,478,479],{},"NotificationDispatcher"," listens to the event bus and determines the notification type, recipients, and whether to send immediately or schedule a background job",[369,482,483,484,487],{},"For deadlines, ",[201,485,486],{},"DeadlineScheduler"," creates a pgboss job that fires at the right time",[369,489,490,491,494],{},"When it is time to deliver, ",[201,492,493],{},"NotificationService"," checks the user's preferences, saves the notification to the database, and sends it through enabled channels only",[369,496,497,500],{},[201,498,499],{},"Providers"," (FCMProvider, CentrifugoProvider) handle the actual delivery",[166,502,504],{"id":503},"viewing-notifications","Viewing notifications",[162,506,507],{},"Click the bell icon in the sidebar to open the notification panel. From there you can:",[366,509,510,513,516,519,522],{},[369,511,512],{},"See all your notifications with type icons and timestamps",[369,514,515],{},"Click a notification to navigate to the related task",[369,517,518],{},"Mark individual notifications as read",[369,520,521],{},"Mark all notifications as read",[369,523,524],{},"Load older notifications via pagination",[162,526,527],{},"Notifications older than 1 day are automatically cleaned up by a daily background job.",[166,529,104],{"id":530},"configuration",[162,532,533,534,538],{},"See ",[535,536,109],"a",{"href":537},"/docs/configuration/environment-variables#notifications"," for the full list of notification-related variables.",[166,540,542],{"id":541},"api-endpoints","API endpoints",[171,544,545,557],{},[174,546,547],{},[177,548,549,552,555],{},[180,550,551],{},"Method",[180,553,554],{},"Path",[180,556,289],{},[193,558,559,574,589,602,616,630,644,659],{},[177,560,561,566,571],{},[198,562,563],{},[308,564,565],{},"GET",[198,567,568],{},[308,569,570],{},"/module/notifications",[198,572,573],{},"Fetch notifications (cursor pagination)",[177,575,576,581,586],{},[198,577,578],{},[308,579,580],{},"PATCH",[198,582,583],{},[308,584,585],{},"/module/notifications/read",[198,587,588],{},"Mark a notification as read",[177,590,591,595,600],{},[198,592,593],{},[308,594,580],{},[198,596,597],{},[308,598,599],{},"/module/notifications/read-all",[198,601,521],{},[177,603,604,608,613],{},[198,605,606],{},[308,607,565],{},[198,609,610],{},[308,611,612],{},"/module/notifications/preferences",[198,614,615],{},"Get user notification preferences",[177,617,618,623,627],{},[198,619,620],{},[308,621,622],{},"PUT",[198,624,625],{},[308,626,612],{},[198,628,629],{},"Save user notification preferences",[177,631,632,636,641],{},[198,633,634],{},[308,635,565],{},[198,637,638],{},[308,639,640],{},"/module/notifications/connection-token",[198,642,643],{},"Get WebSocket connection token",[177,645,646,651,656],{},[198,647,648],{},[308,649,650],{},"POST",[198,652,653],{},[308,654,655],{},"/module/notifications/device/register",[198,657,658],{},"Register a device for push notifications",[177,660,661,665,670],{},[198,662,663],{},[308,664,650],{},[198,666,667],{},[308,668,669],{},"/module/notifications/device/unregister",[198,671,672],{},"Unregister a device",{"title":674,"searchDepth":675,"depth":675,"links":676},"",2,[677,678,679,684,685,686,687],{"id":168,"depth":675,"text":169},{"id":273,"depth":675,"text":274},{"id":341,"depth":675,"text":342,"children":680},[681,683],{"id":360,"depth":682,"text":361},3,{"id":386,"depth":682,"text":387},{"id":467,"depth":675,"text":468},{"id":503,"depth":675,"text":504},{"id":530,"depth":675,"text":104},{"id":541,"depth":675,"text":542},"Real-time and push notifications in TaskView - deadline alerts, assignment notifications, per-user preferences, and multi-channel delivery via WebSocket and Firebase Cloud Messaging.","md",{},{"icon":67},{"title":64,"description":688},"HkWHLWPTieI6Jaktoe59ScgaODs6jILdnZFvbUDInAI",[695,697],{"title":59,"path":60,"stem":61,"description":696,"icon":62,"children":-1},"TaskView dashboard - smart widgets for today's tasks, upcoming deadlines, recent activity, completed work, and daily planning overview across all your projects.",{"title":69,"path":70,"stem":71,"description":698,"icon":72,"children":-1},"Configure webhooks in TaskView to receive real-time HTTP notifications when tasks are created, updated, deleted, or reassigned. Includes HMAC-SHA256 signature verification, automatic retries, and delivery history.",1783289464129]