[{"data":1,"prerenderedAt":1133},["ShallowReactive",2],{"navigation":3,"/docs/integrations/messaging":156,"/docs/integrations/messaging-surround":1128},[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":99,"body":158,"description":1122,"extension":1123,"meta":1124,"navigation":1125,"path":100,"seo":1126,"stem":101,"__hash__":1127},"docs/docs/3.integrations/3.messaging.md",{"type":159,"value":160,"toc":1101},"minimark",[161,165,182,189,194,217,264,267,271,285,287,291,296,336,340,347,371,375,381,391,394,424,433,437,440,489,492,508,526,530,536,541,573,578,610,613,615,619,626,630,735,755,762,766,772,779,783,790,823,828,830,837,930,932,936,988,991,993,997,1035,1037,1041,1055,1068,1078,1087,1097],[162,163,164],"p",{},"TaskView messaging integrations deliver task events to messengers. There are two levels of connection:",[166,167,168,176],"ul",{},[169,170,171,175],"li",{},[172,173,174],"strong",{},"Personal"," — a user links their own account and receives direct messages about their tasks (assigned, deadline, etc.).",[169,177,178,181],{},[172,179,180],{},"Project"," — an admin connects a group/channel, and events for that project are posted to it for the whole team.",[162,183,184,185,188],{},"The bot credentials are configured ",[172,186,187],{},"per instance"," (via environment variables), so the official TaskView SaaS ships an official bot and self-hosted installs supply their own — no code changes, only configuration.",[190,191,193],"h2",{"id":192},"prerequisites","Prerequisites",[166,195,196,208,211],{},[169,197,198,199,202,203,207],{},"TaskView API running and reachable over ",[172,200,201],{},"public HTTPS"," (messengers deliver updates/redirects to your API; ",[204,205,206],"code",{},"localhost"," is not reachable from Telegram/Slack — use your production domain or a tunnel for local testing)",[169,209,210],{},"PostgreSQL database with migrations applied",[169,212,213,216],{},[204,214,215],{},".env.taskview"," file configured",[218,219,220,242],"blockquote",{},[162,221,222,225,226,229,230,233,234,237,238,241],{},[172,223,224],{},"Local testing tunnel:"," prefer ",[204,227,228],{},"cloudflared tunnel --url http://localhost:1401"," — it gives a clean HTTPS URL with no interstitial. ",[204,231,232],{},"ngrok","'s free tier shows a \"You are about to visit…\" warning page that breaks the browser OAuth redirect (you can't inject the ",[204,235,236],{},"ngrok-skip-browser-warning"," header into Slack's redirect); if you must use ngrok free, open the tunnel URL once in your browser and click ",[172,239,240],{},"Visit Site"," first, or upgrade to a paid plan.",[162,243,244,245,248,249,252,253,256,257,260,261,263],{},"For Slack, the API base the ",[172,246,247],{},"frontend"," calls and ",[204,250,251],{},"SLACK_CALLBACK_URL"," must be the ",[172,254,255],{},"same HTTPS origin"," — the anti-CSRF nonce cookie is set on ",[204,258,259],{},"oauth/start"," and read on the callback, so a ",[204,262,206],{}," start + tunnel callback will not work.",[265,266],"hr",{},[190,268,270],{"id":269},"_1-database-migration","1. Database Migration",[162,272,273,274,277,278,277,281,284],{},"The migration creates the required tables (",[204,275,276],{},"tasks.messaging_connections",", ",[204,279,280],{},"tasks.messaging_link_tokens",[204,282,283],{},"tasks.messaging_identity_map",") automatically. The migration container handles this on startup — no manual steps needed.",[265,286],{},[190,288,290],{"id":289},"_2-telegram","2. Telegram",[292,293,295],"h3",{"id":294},"_21-create-a-bot","2.1 Create a bot",[297,298,299,310,317],"ol",{},[169,300,301,302,309],{},"Open ",[303,304,308],"a",{"href":305,"rel":306},"https://t.me/BotFather",[307],"nofollow","@BotFather"," in Telegram",[169,311,312,313,316],{},"Send ",[204,314,315],{},"/newbot"," and follow the prompts",[169,318,319,320,323,324,327,328,331,332,335],{},"Copy the ",[172,321,322],{},"bot token"," (looks like ",[204,325,326],{},"123456789:AA...",") and note the ",[172,329,330],{},"bot username"," (without ",[204,333,334],{},"@",")",[292,337,339],{"id":338},"_22-configure-the-bot-for-group-commands","2.2 Configure the bot for group commands",[162,341,342,343,346],{},"Project connections are completed by typing a command ",[172,344,345],{},"inside a group",", so the bot must be allowed to read group messages:",[297,348,349,363],{},[169,350,351,352,355,356,359,360,335],{},"In @BotFather, send ",[204,353,354],{},"/setprivacy"," → choose your bot → ",[172,357,358],{},"Disable","\n(with privacy enabled, members must instead address the bot explicitly: ",[204,361,362],{},"/connect@your_bot \u003Ctoken>",[169,364,312,365,355,368],{},[204,366,367],{},"/setjoingroups",[172,369,370],{},"Enable",[292,372,374],{"id":373},"_23-environment-variables","2.3 Environment variables",[162,376,377,378,380],{},"Add to ",[204,379,215],{},":",[382,383,388],"pre",{"className":384,"code":386,"language":387},[385],"language-text","TELEGRAM_BOT_TOKEN=123456789:AA-your-bot-token\nTELEGRAM_BOT_USERNAME=your_bot            # without the leading @\nTELEGRAM_WEBHOOK_SECRET=\u003Crandom-secret>   # any long random string\n","text",[204,389,386],{"__ignoreMap":390},"",[162,392,393],{},"Generate a webhook secret:",[382,395,399],{"className":396,"code":397,"language":398,"meta":390,"style":390},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n","bash",[204,400,401],{"__ignoreMap":390},[402,403,406,410,414,418,421],"span",{"class":404,"line":405},"line",1,[402,407,409],{"class":408},"sBMFI","node",[402,411,413],{"class":412},"sfazB"," -e",[402,415,417],{"class":416},"sMK4o"," \"",[402,419,420],{"class":412},"console.log(require('crypto').randomBytes(32).toString('hex'))",[402,422,423],{"class":416},"\"\n",[218,425,426],{},[162,427,428,429,432],{},"The webhook secret is compared (in constant time) against the ",[204,430,431],{},"X-Telegram-Bot-Api-Secret-Token"," header on every inbound update, so only Telegram can reach the endpoint.",[292,434,436],{"id":435},"_24-register-the-webhook-with-telegram","2.4 Register the webhook with Telegram",[162,438,439],{},"Tell Telegram where to deliver updates. Run once (replace the placeholders):",[382,441,443],{"className":396,"code":442,"language":398,"meta":390,"style":390},"curl \"https://api.telegram.org/bot\u003CTELEGRAM_BOT_TOKEN>/setWebhook\" \\\n  -d \"url=https://\u003Cyour-api-domain>/module/messaging/telegram/webhook\" \\\n  -d \"secret_token=\u003CTELEGRAM_WEBHOOK_SECRET>\"\n",[204,444,445,462,477],{"__ignoreMap":390},[402,446,447,450,452,455,458],{"class":404,"line":405},[402,448,449],{"class":408},"curl",[402,451,417],{"class":416},[402,453,454],{"class":412},"https://api.telegram.org/bot\u003CTELEGRAM_BOT_TOKEN>/setWebhook",[402,456,457],{"class":416},"\"",[402,459,461],{"class":460},"sTEyZ"," \\\n",[402,463,465,468,470,473,475],{"class":404,"line":464},2,[402,466,467],{"class":412},"  -d",[402,469,417],{"class":416},[402,471,472],{"class":412},"url=https://\u003Cyour-api-domain>/module/messaging/telegram/webhook",[402,474,457],{"class":416},[402,476,461],{"class":460},[402,478,480,482,484,487],{"class":404,"line":479},3,[402,481,467],{"class":412},[402,483,417],{"class":416},[402,485,486],{"class":412},"secret_token=\u003CTELEGRAM_WEBHOOK_SECRET>",[402,488,423],{"class":416},[162,490,491],{},"Verify it took effect:",[382,493,495],{"className":396,"code":494,"language":398,"meta":390,"style":390},"curl \"https://api.telegram.org/bot\u003CTELEGRAM_BOT_TOKEN>/getWebhookInfo\"\n",[204,496,497],{"__ignoreMap":390},[402,498,499,501,503,506],{"class":404,"line":405},[402,500,449],{"class":408},[402,502,417],{"class":416},[402,504,505],{"class":412},"https://api.telegram.org/bot\u003CTELEGRAM_BOT_TOKEN>/getWebhookInfo",[402,507,423],{"class":416},[162,509,510,513,514,517,518,521,522,525],{},[204,511,512],{},"url"," should point at your ",[204,515,516],{},"/module/messaging/telegram/webhook"," and ",[204,519,520],{},"pending_update_count"," should be ",[204,523,524],{},"0",".",[292,527,529],{"id":528},"_25-usage","2.5 Usage",[162,531,532,533,525],{},"Restart the API after setting the environment variables, then in TaskView open a project → right-click it in the sidebar → ",[172,534,535],{},"\"Messengers\"",[162,537,538],{},[172,539,540],{},"Personal (Direct messages)",[297,542,543,559,570],{},[169,544,545,546,548,549,552,553,552,556],{},"On the ",[172,547,174],{}," tab, click ",[172,550,551],{},"Connect"," → ",[172,554,555],{},"Telegram",[172,557,558],{},"Get link",[169,560,561,562,565,566,569],{},"Click ",[172,563,564],{},"Open in Telegram"," and press ",[172,567,568],{},"Start"," in the bot chat",[169,571,572],{},"Your account is linked — you'll now get DMs about your tasks",[162,574,575],{},[172,576,577],{},"Project (Group channel)",[297,579,580,595,601,607],{},[169,581,545,582,584,585,588,589,552,591,552,593],{},[172,583,180],{}," tab (requires the ",[204,586,587],{},"INTEGRATIONS_CAN_MANAGE"," permission), click ",[172,590,551],{},[172,592,555],{},[172,594,558],{},[169,596,561,597,600],{},[172,598,599],{},"Add bot to group"," and pick the group, or add the bot manually",[169,602,603,604],{},"In that group, send the shown command: ",[204,605,606],{},"/connect \u003Ctoken>",[169,608,609],{},"The group is connected — project events are now posted there",[162,611,612],{},"You can toggle any connection on/off or disconnect it from the same page.",[265,614],{},[190,616,618],{"id":617},"_3-slack","3. Slack",[162,620,621,622,625],{},"Slack uses per-instance OAuth credentials, mirroring the GitHub/GitLab integration model. Requires ",[204,623,624],{},"ENCRYPTION_KEY"," (tokens are stored AES-256-GCM encrypted).",[292,627,629],{"id":628},"_31-create-and-configure-the-slack-app","3.1 Create and configure the Slack app",[297,631,632,650,684,704,718],{},[169,633,634,637,638,552,643,552,646,649],{},[172,635,636],{},"Create the app"," — go to ",[303,639,642],{"href":640,"rel":641},"https://api.slack.com/apps",[307],"api.slack.com/apps",[172,644,645],{},"Create New App",[172,647,648],{},"From scratch",", give it a name and pick your workspace.",[169,651,652,655,656,659,660,662,663,380,666,672,675,676,679,680,683],{},[172,653,654],{},"OAuth & Permissions → Redirect URLs"," — click ",[172,657,658],{},"Add New Redirect URL",", enter exactly your ",[204,661,251],{},", then ",[172,664,665],{},"Save URLs",[382,667,670],{"className":668,"code":669,"language":387},[385],"https://\u003Cyour-api-domain>/module/messaging/slack/oauth/callback\n",[204,671,669],{"__ignoreMap":390},[673,674],"br",{},"Slack requires ",[172,677,678],{},"HTTPS"," — a plain ",[204,681,682],{},"http://localhost"," URL is rejected. Use your production domain or an HTTPS tunnel (see Prerequisites).",[169,685,686,689,690],{},[172,687,688],{},"OAuth & Permissions → Scopes → Bot Token Scopes"," — add:",[166,691,692,698],{},[169,693,694,697],{},[204,695,696],{},"chat:write"," — required for personal direct messages",[169,699,700,701],{},"(only if personal DMs fail to open) ",[204,702,703],{},"im:write",[169,705,706,709,710,713,714,717],{},[172,707,708],{},"Features → Incoming Webhooks → Activate Incoming Webhooks (On)"," — ",[172,711,712],{},"required for the project (channel) flow",". This enables the ",[204,715,716],{},"incoming-webhook"," scope so that, during a project connect, Slack shows a channel picker and returns a webhook URL. Without it, project connections fail.",[169,719,720,723,724,277,727,730,731,734],{},[172,721,722],{},"Basic Information → App Credentials"," — copy ",[172,725,726],{},"Client ID",[172,728,729],{},"Client Secret",", and ",[172,732,733],{},"Signing Secret"," for the environment variables below.",[218,736,737,743],{},[162,738,739,742],{},[172,740,741],{},"You do NOT need"," Slash Commands, Event Subscriptions, or Interactivity — TaskView Slack is outbound-only for now.",[162,744,745,746,749,750,754],{},"If you change scopes after installing, ",[172,747,748],{},"reinstall"," the app (OAuth & Permissions → ",[751,752,753],"em",{},"Reinstall to Workspace",") so the new scopes take effect.",[162,756,757,758,761],{},"By default a Slack app is ",[172,759,760],{},"private to your workspace"," — only you can use it. It becomes available to other workspaces only if you enable Public Distribution (and, for the Marketplace, pass Slack's review). Self-hosted installs keep it private; the official SaaS uses one distributed app.",[292,763,765],{"id":764},"_32-environment-variables","3.2 Environment variables",[382,767,770],{"className":768,"code":769,"language":387},[385],"SLACK_CLIENT_ID=\u003Cyour-client-id>\nSLACK_CLIENT_SECRET=\u003Cyour-client-secret>\nSLACK_CALLBACK_URL=https://\u003Cyour-api-domain>/module/messaging/slack/oauth/callback\nSLACK_SIGNING_SECRET=\u003Cyour-signing-secret>\n",[204,771,769],{"__ignoreMap":390},[218,773,774],{},[162,775,776,778],{},[204,777,251],{}," must exactly match the Redirect URL configured in the Slack app.",[292,780,782],{"id":781},"_33-usage","3.3 Usage",[162,784,785,786,789],{},"Restart the API, then open ",[172,787,788],{},"Messengers"," in a project:",[166,791,792,807],{},[169,793,794,797,798,552,800,552,803,806],{},[172,795,796],{},"Personal:"," Personal tab → ",[172,799,551],{},[172,801,802],{},"Slack",[172,804,805],{},"Continue with Slack"," → authorize. The app then DMs you about your tasks.",[169,808,809,812,813,815,816,552,818,552,820,822],{},[172,810,811],{},"Project:"," Project tab (requires ",[204,814,587],{},") → ",[172,817,551],{},[172,819,802],{},[172,821,805],{}," → pick the channel to post to during install. Project events are posted to that channel via an incoming webhook.",[162,824,825,826,525],{},"The official SaaS ships a distributed Slack app; self-hosted installs create their own app and supply these values. Per-workspace tokens (and the project incoming-webhook URL) are stored encrypted with ",[204,827,624],{},[265,829],{},[190,831,833,834,836],{"id":832},"_4-full-envtaskview-example","4. Full ",[204,835,215],{}," Example",[382,838,842],{"className":839,"code":840,"language":841,"meta":390,"style":390},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# ... existing vars ...\n\n# Telegram messaging integration\nTELEGRAM_BOT_TOKEN=123456789:AA-your-bot-token\nTELEGRAM_BOT_USERNAME=your_bot\nTELEGRAM_WEBHOOK_SECRET=a1b2c3d4e5f6...\n\n# Slack messaging integration\nSLACK_CLIENT_ID=\nSLACK_CLIENT_SECRET=\nSLACK_CALLBACK_URL=https://api.taskview.tech/module/messaging/slack/oauth/callback\nSLACK_SIGNING_SECRET=\n\n# Required for Slack (encrypted token storage), shared with SSO/other integrations\nENCRYPTION_KEY=a1b2c3d4e5f6...  # 64 hex characters\n","env",[204,843,844,849,855,860,866,872,878,883,889,895,901,907,913,918,924],{"__ignoreMap":390},[402,845,846],{"class":404,"line":405},[402,847,848],{},"# ... existing vars ...\n",[402,850,851],{"class":404,"line":464},[402,852,854],{"emptyLinePlaceholder":853},true,"\n",[402,856,857],{"class":404,"line":479},[402,858,859],{},"# Telegram messaging integration\n",[402,861,863],{"class":404,"line":862},4,[402,864,865],{},"TELEGRAM_BOT_TOKEN=123456789:AA-your-bot-token\n",[402,867,869],{"class":404,"line":868},5,[402,870,871],{},"TELEGRAM_BOT_USERNAME=your_bot\n",[402,873,875],{"class":404,"line":874},6,[402,876,877],{},"TELEGRAM_WEBHOOK_SECRET=a1b2c3d4e5f6...\n",[402,879,881],{"class":404,"line":880},7,[402,882,854],{"emptyLinePlaceholder":853},[402,884,886],{"class":404,"line":885},8,[402,887,888],{},"# Slack messaging integration\n",[402,890,892],{"class":404,"line":891},9,[402,893,894],{},"SLACK_CLIENT_ID=\n",[402,896,898],{"class":404,"line":897},10,[402,899,900],{},"SLACK_CLIENT_SECRET=\n",[402,902,904],{"class":404,"line":903},11,[402,905,906],{},"SLACK_CALLBACK_URL=https://api.taskview.tech/module/messaging/slack/oauth/callback\n",[402,908,910],{"class":404,"line":909},12,[402,911,912],{},"SLACK_SIGNING_SECRET=\n",[402,914,916],{"class":404,"line":915},13,[402,917,854],{"emptyLinePlaceholder":853},[402,919,921],{"class":404,"line":920},14,[402,922,923],{},"# Required for Slack (encrypted token storage), shared with SSO/other integrations\n",[402,925,927],{"class":404,"line":926},15,[402,928,929],{},"ENCRYPTION_KEY=a1b2c3d4e5f6...  # 64 hex characters\n",[265,931],{},[190,933,935],{"id":934},"_5-saas-vs-self-hosted","5. SaaS vs Self-Hosted",[937,938,939,954],"table",{},[940,941,942],"thead",{},[943,944,945,948,951],"tr",{},[946,947],"th",{},[946,949,950],{},"Official SaaS",[946,952,953],{},"Self-hosted",[955,956,957,973],"tbody",{},[943,958,959,964,967],{},[960,961,962],"td",{},[172,963,555],{},[960,965,966],{},"One official bot, credentials shipped with the instance",[960,968,969,970],{},"Create your own bot via @BotFather and set ",[204,971,972],{},"TELEGRAM_*",[943,974,975,979,982],{},[960,976,977],{},[172,978,802],{},[960,980,981],{},"One official distributed app",[960,983,984,985],{},"Create your own Slack app and set ",[204,986,987],{},"SLACK_*",[162,989,990],{},"There is no code fork between the two — only the values of the environment variables differ. If the variables are unset, the integration simply does not appear until an admin configures it.",[265,992],{},[190,994,996],{"id":995},"_6-production-notes","6. Production Notes",[166,998,999,1009,1017,1025],{},[169,1000,1001,1004,1005,1008],{},[172,1002,1003],{},"Public HTTPS is mandatory"," for the inbound webhook. Update the ",[204,1006,1007],{},"setWebhook"," URL to your production domain.",[169,1010,1011,1016],{},[172,1012,1013,1014],{},"Re-run ",[204,1015,1007],{}," whenever the API domain changes.",[169,1018,1019,1024],{},[172,1020,1021],{},[204,1022,1023],{},"TELEGRAM_WEBHOOK_SECRET",": store securely, never commit to git.",[169,1026,1027,1030,1031,1034],{},[172,1028,1029],{},"Group privacy",": if ",[204,1032,1033],{},"/connect"," in a group does nothing, the bot's privacy mode is likely still enabled (see step 2.2).",[265,1036],{},[190,1038,1040],{"id":1039},"_7-troubleshooting","7. Troubleshooting",[162,1042,1043,1046,1047,1050,1051,1054],{},[172,1044,1045],{},"The \"Messengers\" page shows a 503 / \"This messenger is not configured on the server\"","\n→ ",[204,1048,1049],{},"TELEGRAM_BOT_TOKEN"," or ",[204,1052,1053],{},"TELEGRAM_BOT_USERNAME"," is missing; the API was not restarted after setting them.",[162,1056,1057,1063,1064,1067],{},[172,1058,1059,1060,1062],{},"Pressing Start / sending ",[204,1061,1033],{}," does nothing","\n→ The webhook is not registered or points at the wrong URL. Check ",[204,1065,1066],{},"getWebhookInfo"," (step 2.4) and confirm the API is reachable over public HTTPS.",[162,1069,1070,1075,1076,525],{},[172,1071,1072,1074],{},[204,1073,606],{}," in a group is ignored","\n→ The bot's privacy mode is enabled. Disable it (step 2.2), or use ",[204,1077,362],{},[162,1079,1080,1083,1084,1086],{},[172,1081,1082],{},"\"Link is invalid or expired\"","\n→ Binding tokens are single-use and expire after 15 minutes. Generate a new one from the ",[172,1085,551],{}," dialog.",[162,1088,1089,1092,1093,1096],{},[172,1090,1091],{},"Notifications don't arrive after connecting","\n→ Confirm the connection is toggled ",[172,1094,1095],{},"on",", and that you are actually assigned to the task. Project posts require an active project connection.",[1098,1099,1100],"style",{},"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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":390,"searchDepth":464,"depth":464,"links":1102},[1103,1104,1105,1112,1117,1119,1120,1121],{"id":192,"depth":464,"text":193},{"id":269,"depth":464,"text":270},{"id":289,"depth":464,"text":290,"children":1106},[1107,1108,1109,1110,1111],{"id":294,"depth":479,"text":295},{"id":338,"depth":479,"text":339},{"id":373,"depth":479,"text":374},{"id":435,"depth":479,"text":436},{"id":528,"depth":479,"text":529},{"id":617,"depth":464,"text":618,"children":1113},[1114,1115,1116],{"id":628,"depth":479,"text":629},{"id":764,"depth":479,"text":765},{"id":781,"depth":479,"text":782},{"id":832,"depth":464,"text":1118},"4. Full .env.taskview Example",{"id":934,"depth":464,"text":935},{"id":995,"depth":464,"text":996},{"id":1039,"depth":464,"text":1040},"Connect Telegram and Slack to TaskView to receive task notifications. Personal direct messages and project-wide group channels, with instance-level bot credentials, OAuth, signed inbound webhooks, and SHA-256 hashed binding tokens.","md",{},{"icon":102},{"title":99,"description":1122},"pGVZuNh_QuWfUDyxWIzQBI6tWOKSo0P1biwEybhOMlM",[1129,1131],{"title":94,"path":95,"stem":96,"description":1130,"icon":97,"children":-1},"Connect AI assistants like Claude Code and Claude Desktop to TaskView via the Model Context Protocol (MCP). Manage projects and tasks with a scoped API token.",{"title":109,"path":110,"stem":111,"description":1132,"icon":112,"children":-1},"Complete reference for TaskView environment variables - database connection, JWT authentication, OAuth providers, SMTP email, GitHub/GitLab integration, encryption, and CORS configuration for your self-hosted Docker deployment.",1782941827613]