[{"data":1,"prerenderedAt":1984},["ShallowReactive",2],{"navigation":3,"/docs/configuration/environment-variables":156,"/docs/configuration/environment-variables-surround":1979},[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":109,"body":158,"description":1973,"extension":1974,"meta":1975,"navigation":1976,"path":110,"seo":1977,"stem":111,"__hash__":1978},"docs/docs/4.configuration/1.environment-variables.md",{"type":159,"value":160,"toc":1956},"minimark",[161,170,175,178,284,288,345,348,438,448,452,455,583,587,590,620,623,652,658,668,675,679,685,777,781,784,873,877,882,1059,1062,1065,1070,1073,1159,1163,1166,1199,1203,1210,1500,1530,1534,1537,1583,1590,1597,1601,1607,1952],[162,163,164,165,169],"p",{},"TaskView is configured through environment variables set in the ",[166,167,168],"code",{},".env.taskview"," file (or passed directly to the Docker container). This page documents every available variable.",[171,172,174],"h2",{"id":173},"database","Database",[162,176,177],{},"These must match your PostgreSQL setup.",[179,180,181,200],"table",{},[182,183,184],"thead",{},[185,186,187,191,194,197],"tr",{},[188,189,190],"th",{},"Variable",[188,192,193],{},"Required",[188,195,196],{},"Default",[188,198,199],{},"Description",[201,202,203,224,238,252,266],"tbody",{},[185,204,205,211,214,217],{},[206,207,208],"td",{},[166,209,210],{},"DB_HOST",[206,212,213],{},"Yes",[206,215,216],{},"-",[206,218,219,220,223],{},"Database hostname. Use ",[166,221,222],{},"db"," when running in Docker Compose.",[185,225,226,231,233,235],{},[206,227,228],{},[166,229,230],{},"DB_USER",[206,232,213],{},[206,234,216],{},[206,236,237],{},"Database username",[185,239,240,245,247,249],{},[206,241,242],{},[166,243,244],{},"DB_PASSWORD",[206,246,213],{},[206,248,216],{},[206,250,251],{},"Database password",[185,253,254,259,261,263],{},[206,255,256],{},[166,257,258],{},"DB_NAME",[206,260,213],{},[206,262,216],{},[206,264,265],{},"Database name",[185,267,268,273,276,281],{},[206,269,270],{},[166,271,272],{},"DB_PORT",[206,274,275],{},"No",[206,277,278],{},[166,279,280],{},"5432",[206,282,283],{},"Database port",[171,285,287],{"id":286},"application","Application",[179,289,290,302],{},[182,291,292],{},[185,293,294,296,298,300],{},[188,295,190],{},[188,297,193],{},[188,299,196],{},[188,301,199],{},[201,303,304,321],{},[185,305,306,311,313,318],{},[206,307,308],{},[166,309,310],{},"APP_PORT",[206,312,275],{},[206,314,315],{},[166,316,317],{},"1401",[206,319,320],{},"Port the API server listens on",[185,322,323,328,330,338],{},[206,324,325],{},[166,326,327],{},"APP_URL",[206,329,213],{},[206,331,332],{},[333,334,335],"a",{"href":335,"rel":336},"https://app.taskview.tech",[337],"nofollow",[206,339,340,341,344],{},"Full URL of the web app (e.g. ",[166,342,343],{},"https://tasks.company.com","). Used for OAuth redirects and email links.",[171,346,114],{"id":347},"authentication",[179,349,350,362],{},[182,351,352],{},[185,353,354,356,358,360],{},[188,355,190],{},[188,357,193],{},[188,359,196],{},[188,361,199],{},[201,363,364,378,404,421],{},[185,365,366,371,373,375],{},[206,367,368],{},[166,369,370],{},"JWT_SIGN",[206,372,213],{},[206,374,216],{},[206,376,377],{},"Secret key for signing JWT tokens. Use a long random string.",[185,379,380,385,387,392],{},[206,381,382],{},[166,383,384],{},"ACCESS_LIFE_TIME",[206,386,275],{},[206,388,389],{},[166,390,391],{},"1d",[206,393,394,395,398,399,398,401],{},"How long access tokens are valid. Examples: ",[166,396,397],{},"1h",", ",[166,400,391],{},[166,402,403],{},"7d",[185,405,406,411,413,418],{},[206,407,408],{},[166,409,410],{},"REFRESH_LIFE_TIME",[206,412,275],{},[206,414,415],{},[166,416,417],{},"2d",[206,419,420],{},"How long refresh tokens are valid",[185,422,423,428,430,435],{},[206,424,425],{},[166,426,427],{},"JWT_ALG",[206,429,275],{},[206,431,432],{},[166,433,434],{},"HS256",[206,436,437],{},"JWT signing algorithm",[439,440,442],"callout",{"color":441,"icon":132},"warning",[162,443,444,445],{},"Generate a strong JWT secret: ",[166,446,447],{},"node -e \"console.log(require('crypto').randomBytes(64).toString('hex'))\"",[171,449,451],{"id":450},"smtp-email","SMTP (Email)",[162,453,454],{},"Required for password recovery, email confirmation, and invitation notifications. Without SMTP, these features won't work, but everything else functions normally.",[179,456,457,469],{},[182,458,459],{},[185,460,461,463,465,467],{},[188,462,190],{},[188,464,193],{},[188,466,196],{},[188,468,199],{},[201,470,471,485,502,516,530,552,569],{},[185,472,473,478,480,482],{},[206,474,475],{},[166,476,477],{},"SMTP_HOST",[206,479,275],{},[206,481,216],{},[206,483,484],{},"SMTP server hostname",[185,486,487,492,494,499],{},[206,488,489],{},[166,490,491],{},"SMTP_PORT",[206,493,275],{},[206,495,496],{},[166,497,498],{},"465",[206,500,501],{},"SMTP port",[185,503,504,509,511,513],{},[206,505,506],{},[166,507,508],{},"SMTP_USERNAME",[206,510,275],{},[206,512,216],{},[206,514,515],{},"SMTP login",[185,517,518,523,525,527],{},[206,519,520],{},[166,521,522],{},"SMTP_PASSWORD",[206,524,275],{},[206,526,216],{},[206,528,529],{},"SMTP password",[185,531,532,537,539,544],{},[206,533,534],{},[166,535,536],{},"SMTP_ENCRYPTION",[206,538,275],{},[206,540,541],{},[166,542,543],{},"ssl",[206,545,546,548,549],{},[166,547,543],{}," or ",[166,550,551],{},"tls",[185,553,554,559,561,566],{},[206,555,556],{},[166,557,558],{},"SMTP_FROM_NAME",[206,560,275],{},[206,562,563],{},[166,564,565],{},"TaskView",[206,567,568],{},"Sender name in emails",[185,570,571,576,578,580],{},[206,572,573],{},[166,574,575],{},"SMTP_FROM_EMAIL",[206,577,275],{},[206,579,216],{},[206,581,582],{},"Sender email address",[171,584,586],{"id":585},"encryption","Encryption",[162,588,589],{},"Required for SSO (SAML/OIDC) and GitHub/GitLab integrations. Secrets are encrypted at rest using AES-256-GCM.",[179,591,592,604],{},[182,593,594],{},[185,595,596,598,600,602],{},[188,597,190],{},[188,599,193],{},[188,601,196],{},[188,603,199],{},[201,605,606],{},[185,607,608,613,615,617],{},[206,609,610],{},[166,611,612],{},"ENCRYPTION_KEY",[206,614,213],{},[206,616,216],{},[206,618,619],{},"32-byte hex string (64 characters). Required for SSO and integrations.",[162,621,622],{},"Generate a key:",[624,625,630],"pre",{"className":626,"code":627,"language":628,"meta":629,"style":629},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","openssl rand -hex 32\n","bash","",[166,631,632],{"__ignoreMap":629},[633,634,637,641,645,648],"span",{"class":635,"line":636},"line",1,[633,638,640],{"class":639},"sBMFI","openssl",[633,642,644],{"class":643},"sfazB"," rand",[633,646,647],{"class":643}," -hex",[633,649,651],{"class":650},"sbssI"," 32\n",[162,653,654],{},[655,656,657],"strong",{},"What is encrypted:",[659,660,661,665],"ul",{},[662,663,664],"li",{},"SSO: SAML certificates, SAML signing keys, OIDC client secrets",[662,666,667],{},"Integrations: GitHub/GitLab OAuth tokens, webhook secrets",[439,669,672],{"color":670,"icon":671},"error","i-lucide-alert-triangle",[162,673,674],{},"If you change or lose the encryption key, all stored SSO configurations and integration tokens become unreadable. You'll need to reconfigure SSO providers and reconnect GitHub/GitLab integrations.",[171,676,678],{"id":677},"github-integration","GitHub Integration",[162,680,681,682,684],{},"For connecting GitHub repositories. See ",[333,683,89],{"href":90}," for a step-by-step guide.",[179,686,687,699],{},[182,688,689],{},[185,690,691,693,695,697],{},[188,692,190],{},[188,694,193],{},[188,696,196],{},[188,698,199],{},[201,700,701,715,729,743,760],{},[185,702,703,708,710,712],{},[206,704,705],{},[166,706,707],{},"GITHUB_INTEGRATION_CLIENT_ID",[206,709,275],{},[206,711,216],{},[206,713,714],{},"OAuth App client ID",[185,716,717,722,724,726],{},[206,718,719],{},[166,720,721],{},"GITHUB_INTEGRATION_CLIENT_SECRET",[206,723,275],{},[206,725,216],{},[206,727,728],{},"OAuth App client secret",[185,730,731,736,738,740],{},[206,732,733],{},[166,734,735],{},"GITHUB_INTEGRATION_CALLBACK_URL",[206,737,275],{},[206,739,216],{},[206,741,742],{},"OAuth callback URL",[185,744,745,750,752,757],{},[206,746,747],{},[166,748,749],{},"GITHUB_BASE_URL",[206,751,275],{},[206,753,754],{},[166,755,756],{},"https://github.com",[206,758,759],{},"Override for GitHub Enterprise",[185,761,762,767,769,774],{},[206,763,764],{},[166,765,766],{},"GITHUB_API_URL",[206,768,275],{},[206,770,771],{},[166,772,773],{},"https://api.github.com",[206,775,776],{},"Override for GitHub Enterprise API",[171,778,780],{"id":779},"gitlab-integration","GitLab Integration",[162,782,783],{},"For connecting GitLab repositories.",[179,785,786,798],{},[182,787,788],{},[185,789,790,792,794,796],{},[188,791,190],{},[188,793,193],{},[188,795,196],{},[188,797,199],{},[201,799,800,813,826,839,856],{},[185,801,802,807,809,811],{},[206,803,804],{},[166,805,806],{},"GITLAB_INTEGRATION_CLIENT_ID",[206,808,275],{},[206,810,216],{},[206,812,714],{},[185,814,815,820,822,824],{},[206,816,817],{},[166,818,819],{},"GITLAB_INTEGRATION_CLIENT_SECRET",[206,821,275],{},[206,823,216],{},[206,825,728],{},[185,827,828,833,835,837],{},[206,829,830],{},[166,831,832],{},"GITLAB_INTEGRATION_CALLBACK_URL",[206,834,275],{},[206,836,216],{},[206,838,742],{},[185,840,841,846,848,853],{},[206,842,843],{},[166,844,845],{},"GITLAB_BASE_URL",[206,847,275],{},[206,849,850],{},[166,851,852],{},"https://gitlab.com",[206,854,855],{},"Override for self-hosted GitLab",[185,857,858,863,865,870],{},[206,859,860],{},[166,861,862],{},"GITLAB_API_URL",[206,864,275],{},[206,866,867],{},[166,868,869],{},"https://gitlab.com/api/v4",[206,871,872],{},"Override for self-hosted GitLab API",[171,874,876],{"id":875},"messaging-integrations-telegram-slack","Messaging Integrations (Telegram / Slack)",[162,878,879,880,684],{},"For delivering task notifications to messengers. See ",[333,881,99],{"href":100},[179,883,884,896],{},[182,885,886],{},[185,887,888,890,892,894],{},[188,889,190],{},[188,891,193],{},[188,893,196],{},[188,895,199],{},[201,897,898,912,930,948,962,976,990,1008,1025,1042],{},[185,899,900,905,907,909],{},[206,901,902],{},[166,903,904],{},"TELEGRAM_BOT_TOKEN",[206,906,275],{},[206,908,216],{},[206,910,911],{},"Bot token from @BotFather",[185,913,914,919,921,923],{},[206,915,916],{},[166,917,918],{},"TELEGRAM_BOT_USERNAME",[206,920,275],{},[206,922,216],{},[206,924,925,926,929],{},"Bot username without ",[166,927,928],{},"@"," (used to build deep-links)",[185,931,932,937,939,941],{},[206,933,934],{},[166,935,936],{},"TELEGRAM_WEBHOOK_SECRET",[206,938,275],{},[206,940,216],{},[206,942,943,944,947],{},"Secret verified against Telegram's ",[166,945,946],{},"X-Telegram-Bot-Api-Secret-Token"," header on inbound updates",[185,949,950,955,957,959],{},[206,951,952],{},[166,953,954],{},"SLACK_CLIENT_ID",[206,956,275],{},[206,958,216],{},[206,960,961],{},"Slack app client ID",[185,963,964,969,971,973],{},[206,965,966],{},[166,967,968],{},"SLACK_CLIENT_SECRET",[206,970,275],{},[206,972,216],{},[206,974,975],{},"Slack app client secret",[185,977,978,983,985,987],{},[206,979,980],{},[166,981,982],{},"SLACK_CALLBACK_URL",[206,984,275],{},[206,986,216],{},[206,988,989],{},"OAuth callback URL (must match the Slack app redirect URL)",[185,991,992,997,999,1001],{},[206,993,994],{},[166,995,996],{},"SLACK_SIGNING_SECRET",[206,998,275],{},[206,1000,216],{},[206,1002,1003,1004,1007],{},"Slack request signing secret — verifies inbound slash commands / interactivity (",[166,1005,1006],{},"/task",", Done/Assign buttons)",[185,1009,1010,1015,1017,1022],{},[206,1011,1012],{},[166,1013,1014],{},"SLACK_API_BASE_URL",[206,1016,275],{},[206,1018,1019],{},[166,1020,1021],{},"https://slack.com/api",[206,1023,1024],{},"Override the Slack Web API base (testing / enterprise proxy)",[185,1026,1027,1032,1034,1039],{},[206,1028,1029],{},[166,1030,1031],{},"SLACK_AUTHORIZE_URL",[206,1033,275],{},[206,1035,1036],{},[166,1037,1038],{},"https://slack.com/oauth/v2/authorize",[206,1040,1041],{},"Override the Slack OAuth authorize URL",[185,1043,1044,1049,1051,1056],{},[206,1045,1046],{},[166,1047,1048],{},"SLACK_WEBHOOK_PREFIX",[206,1050,275],{},[206,1052,1053],{},[166,1054,1055],{},"https://hooks.slack.com/",[206,1057,1058],{},"Override the incoming-webhook URL prefix (used to detect legacy webhook connections)",[171,1060,64],{"id":1061},"notifications",[162,1063,1064],{},"Optional configuration for real-time and push notification delivery.",[1066,1067,1069],"h3",{"id":1068},"centrifugo-real-time-websocket-notifications","Centrifugo (real-time WebSocket notifications)",[162,1071,1072],{},"Required for in-app real-time notification delivery. Without Centrifugo, notifications are still saved to the database but will not appear instantly in the browser. Users will see them on the next page load.",[179,1074,1075,1087],{},[182,1076,1077],{},[185,1078,1079,1081,1083,1085],{},[188,1080,190],{},[188,1082,193],{},[188,1084,196],{},[188,1086,199],{},[201,1088,1089,1107,1125,1142],{},[185,1090,1091,1096,1098,1100],{},[206,1092,1093],{},[166,1094,1095],{},"CENTRIFUGO_API_URL",[206,1097,275],{},[206,1099,216],{},[206,1101,1102,1103,1106],{},"Internal Centrifugo API URL (e.g. ",[166,1104,1105],{},"http://centrifugo:8000",")",[185,1108,1109,1114,1116,1118],{},[206,1110,1111],{},[166,1112,1113],{},"CENTRIFUGO_API_KEY",[206,1115,275],{},[206,1117,216],{},[206,1119,1120,1121,1124],{},"Centrifugo API key for server-to-server communication. Must match ",[166,1122,1123],{},"http_api.key"," in Centrifugo config.",[185,1126,1127,1132,1134,1136],{},[206,1128,1129],{},[166,1130,1131],{},"CENTRIFUGO_TOKEN_SECRET",[206,1133,275],{},[206,1135,216],{},[206,1137,1138,1139,1124],{},"Secret for generating client connection tokens (HMAC). Must match ",[166,1140,1141],{},"client.token.hmac_secret_key",[185,1143,1144,1149,1151,1153],{},[206,1145,1146],{},[166,1147,1148],{},"CENTRIFUGO_PUBLIC_URL",[206,1150,275],{},[206,1152,216],{},[206,1154,1155,1156,1106],{},"Full WebSocket URL for browser clients (e.g. ",[166,1157,1158],{},"wss://api.example.com/centrifugo/connection/websocket",[1066,1160,1162],{"id":1161},"firebase-cloud-messaging-mobile-push-notifications","Firebase Cloud Messaging (mobile push notifications)",[162,1164,1165],{},"Required for native push notifications on iOS and Android. Without Firebase, push notifications are silently skipped.",[179,1167,1168,1180],{},[182,1169,1170],{},[185,1171,1172,1174,1176,1178],{},[188,1173,190],{},[188,1175,193],{},[188,1177,196],{},[188,1179,199],{},[201,1181,1182],{},[185,1183,1184,1189,1191,1193],{},[206,1185,1186],{},[166,1187,1188],{},"FIREBASE_CREDENTIALS_PATH",[206,1190,275],{},[206,1192,216],{},[206,1194,1195,1196,1106],{},"Path to Firebase service account JSON file (e.g. ",[166,1197,1198],{},"./firebase-credentials.json",[1066,1200,1202],{"id":1201},"centrifugo-configuration-file","Centrifugo configuration file",[162,1204,1205,1206,1209],{},"Centrifugo v6 uses a nested JSON config. Create ",[166,1207,1208],{},"centrifugo/config.json",":",[624,1211,1215],{"className":1212,"code":1213,"language":1214,"meta":629,"style":629},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"client\": {\n    \"allowed_origins\": [\"https://app.example.com\"],\n    \"token\": {\n      \"hmac_secret_key\": \"your_centrifugo_token_secret\"\n    }\n  },\n  \"channel\": {\n    \"namespaces\": [\n      {\n        \"name\": \"personal\",\n        \"presence\": false,\n        \"join_leave\": false,\n        \"history_size\": 0,\n        \"history_ttl\": \"0s\"\n      }\n    ]\n  },\n  \"http_api\": {\n    \"key\": \"your_centrifugo_api_key\"\n  }\n}\n","json",[166,1216,1217,1223,1241,1267,1281,1303,1309,1315,1329,1344,1350,1373,1388,1402,1419,1438,1444,1450,1455,1469,1488,1494],{"__ignoreMap":629},[633,1218,1219],{"class":635,"line":636},[633,1220,1222],{"class":1221},"sMK4o","{\n",[633,1224,1226,1229,1233,1236,1238],{"class":635,"line":1225},2,[633,1227,1228],{"class":1221},"  \"",[633,1230,1232],{"class":1231},"spNyl","client",[633,1234,1235],{"class":1221},"\"",[633,1237,1209],{"class":1221},[633,1239,1240],{"class":1221}," {\n",[633,1242,1244,1247,1250,1252,1254,1257,1259,1262,1264],{"class":635,"line":1243},3,[633,1245,1246],{"class":1221},"    \"",[633,1248,1249],{"class":639},"allowed_origins",[633,1251,1235],{"class":1221},[633,1253,1209],{"class":1221},[633,1255,1256],{"class":1221}," [",[633,1258,1235],{"class":1221},[633,1260,1261],{"class":643},"https://app.example.com",[633,1263,1235],{"class":1221},[633,1265,1266],{"class":1221},"],\n",[633,1268,1270,1272,1275,1277,1279],{"class":635,"line":1269},4,[633,1271,1246],{"class":1221},[633,1273,1274],{"class":639},"token",[633,1276,1235],{"class":1221},[633,1278,1209],{"class":1221},[633,1280,1240],{"class":1221},[633,1282,1284,1287,1290,1292,1294,1297,1300],{"class":635,"line":1283},5,[633,1285,1286],{"class":1221},"      \"",[633,1288,1289],{"class":650},"hmac_secret_key",[633,1291,1235],{"class":1221},[633,1293,1209],{"class":1221},[633,1295,1296],{"class":1221}," \"",[633,1298,1299],{"class":643},"your_centrifugo_token_secret",[633,1301,1302],{"class":1221},"\"\n",[633,1304,1306],{"class":635,"line":1305},6,[633,1307,1308],{"class":1221},"    }\n",[633,1310,1312],{"class":635,"line":1311},7,[633,1313,1314],{"class":1221},"  },\n",[633,1316,1318,1320,1323,1325,1327],{"class":635,"line":1317},8,[633,1319,1228],{"class":1221},[633,1321,1322],{"class":1231},"channel",[633,1324,1235],{"class":1221},[633,1326,1209],{"class":1221},[633,1328,1240],{"class":1221},[633,1330,1332,1334,1337,1339,1341],{"class":635,"line":1331},9,[633,1333,1246],{"class":1221},[633,1335,1336],{"class":639},"namespaces",[633,1338,1235],{"class":1221},[633,1340,1209],{"class":1221},[633,1342,1343],{"class":1221}," [\n",[633,1345,1347],{"class":635,"line":1346},10,[633,1348,1349],{"class":1221},"      {\n",[633,1351,1353,1356,1359,1361,1363,1365,1368,1370],{"class":635,"line":1352},11,[633,1354,1355],{"class":1221},"        \"",[633,1357,1358],{"class":650},"name",[633,1360,1235],{"class":1221},[633,1362,1209],{"class":1221},[633,1364,1296],{"class":1221},[633,1366,1367],{"class":643},"personal",[633,1369,1235],{"class":1221},[633,1371,1372],{"class":1221},",\n",[633,1374,1376,1378,1381,1383,1385],{"class":635,"line":1375},12,[633,1377,1355],{"class":1221},[633,1379,1380],{"class":650},"presence",[633,1382,1235],{"class":1221},[633,1384,1209],{"class":1221},[633,1386,1387],{"class":1221}," false,\n",[633,1389,1391,1393,1396,1398,1400],{"class":635,"line":1390},13,[633,1392,1355],{"class":1221},[633,1394,1395],{"class":650},"join_leave",[633,1397,1235],{"class":1221},[633,1399,1209],{"class":1221},[633,1401,1387],{"class":1221},[633,1403,1405,1407,1410,1412,1414,1417],{"class":635,"line":1404},14,[633,1406,1355],{"class":1221},[633,1408,1409],{"class":650},"history_size",[633,1411,1235],{"class":1221},[633,1413,1209],{"class":1221},[633,1415,1416],{"class":650}," 0",[633,1418,1372],{"class":1221},[633,1420,1422,1424,1427,1429,1431,1433,1436],{"class":635,"line":1421},15,[633,1423,1355],{"class":1221},[633,1425,1426],{"class":650},"history_ttl",[633,1428,1235],{"class":1221},[633,1430,1209],{"class":1221},[633,1432,1296],{"class":1221},[633,1434,1435],{"class":643},"0s",[633,1437,1302],{"class":1221},[633,1439,1441],{"class":635,"line":1440},16,[633,1442,1443],{"class":1221},"      }\n",[633,1445,1447],{"class":635,"line":1446},17,[633,1448,1449],{"class":1221},"    ]\n",[633,1451,1453],{"class":635,"line":1452},18,[633,1454,1314],{"class":1221},[633,1456,1458,1460,1463,1465,1467],{"class":635,"line":1457},19,[633,1459,1228],{"class":1221},[633,1461,1462],{"class":1231},"http_api",[633,1464,1235],{"class":1221},[633,1466,1209],{"class":1221},[633,1468,1240],{"class":1221},[633,1470,1472,1474,1477,1479,1481,1483,1486],{"class":635,"line":1471},20,[633,1473,1246],{"class":1221},[633,1475,1476],{"class":639},"key",[633,1478,1235],{"class":1221},[633,1480,1209],{"class":1221},[633,1482,1296],{"class":1221},[633,1484,1485],{"class":643},"your_centrifugo_api_key",[633,1487,1302],{"class":1221},[633,1489,1491],{"class":635,"line":1490},21,[633,1492,1493],{"class":1221},"  }\n",[633,1495,1497],{"class":635,"line":1496},22,[633,1498,1499],{"class":1221},"}\n",[659,1501,1502,1512,1520],{},[662,1503,1504,1506,1507,1509,1510],{},[166,1505,1123],{}," must match ",[166,1508,1113],{}," in ",[166,1511,168],{},[662,1513,1514,1506,1516,1509,1518],{},[166,1515,1141],{},[166,1517,1131],{},[166,1519,168],{},[662,1521,1522,1525,1526,1529],{},[166,1523,1524],{},"client.allowed_origins"," should list your frontend domain(s). Use ",[166,1527,1528],{},"[\"*\"]"," only for development.",[1066,1531,1533],{"id":1532},"nginx-websocket-proxy","Nginx WebSocket proxy",[162,1535,1536],{},"To serve Centrifugo through your existing HTTPS domain, add to your nginx server block:",[624,1538,1542],{"className":1539,"code":1540,"language":1541,"meta":629,"style":629},"language-nginx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","location /centrifugo/ {\n    proxy_pass http://localhost:8000/;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n}\n","nginx",[166,1543,1544,1549,1554,1559,1564,1569,1574,1579],{"__ignoreMap":629},[633,1545,1546],{"class":635,"line":636},[633,1547,1548],{},"location /centrifugo/ {\n",[633,1550,1551],{"class":635,"line":1225},[633,1552,1553],{},"    proxy_pass http://localhost:8000/;\n",[633,1555,1556],{"class":635,"line":1243},[633,1557,1558],{},"    proxy_http_version 1.1;\n",[633,1560,1561],{"class":635,"line":1269},[633,1562,1563],{},"    proxy_set_header Upgrade $http_upgrade;\n",[633,1565,1566],{"class":635,"line":1283},[633,1567,1568],{},"    proxy_set_header Connection \"upgrade\";\n",[633,1570,1571],{"class":635,"line":1305},[633,1572,1573],{},"    proxy_set_header Host $host;\n",[633,1575,1576],{"class":635,"line":1311},[633,1577,1578],{},"    proxy_set_header X-Real-IP $remote_addr;\n",[633,1580,1581],{"class":635,"line":1317},[633,1582,1499],{},[162,1584,1585,1586,1589],{},"Then set ",[166,1587,1588],{},"CENTRIFUGO_PUBLIC_URL=wss://api.example.com/centrifugo/connection/websocket",".",[439,1591,1594],{"color":1592,"icon":1593},"info","i-lucide-info",[162,1595,1596],{},"Both Centrifugo and Firebase are optional. If not configured, their respective channels are skipped. Notifications are always persisted to the database.",[171,1598,1600],{"id":1599},"full-example","Full example",[162,1602,1603,1604,1606],{},"Here's a complete ",[166,1605,168],{}," file for a production deployment:",[624,1608,1612],{"className":1609,"code":1610,"language":1611,"meta":629,"style":629},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","DB_HOST=\"db\"\nDB_USER=\"taskview_db_user\"\nDB_PASSWORD=\"password\"\nDB_NAME=\"taskview\"\nDB_PORT=5432\nAPP_PORT=1401\nJWT_ALG=\"HS256\"\nJWT_SIGN=\"secret\"\nACCESS_LIFE_TIME=\"3d\"\nREFRESH_LIFE_TIME=\"9d\"\n\nSMTP_HOST=smtp\nSMTP_PORT=587\nSMTP_USERNAME=\nSMTP_PASSWORD=\nSMTP_ENCRYPTION=tls\nSMTP_FROM_NAME=TaskView\nSMTP_FROM_EMAIL=\n\n# Your domain \nAPP_URL=\"https://app.taskview.tech\"\n\nGOOGLE_CLIENT_ID=\"\"\nGOOGLE_CLIENT_SECRET=\"\"\n#You domain\nGOOGLE_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/google/callback\"\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\nGITHUB_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/github/callback\"\nAPPLE_CLIENT_ID=\"\"\nAPPLE_TEAM_ID=\"\"\nAPPLE_KEY_ID=\"\"\nAPPLE_KEY_LOCATION=\"/usr/src/app/AuthKey.p8\"\n# Your domain\nAPPLE_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/apple/callback\"\n\n#integrations\nGITHUB_INTEGRATION_CLIENT_ID=\nGITHUB_INTEGRATION_CLIENT_SECRET=\nGITHUB_INTEGRATION_CALLBACK_URL=https://api.taskview.tech/module/integrations/oauth/github/callback\n\nGITLAB_INTEGRATION_CLIENT_ID=\nGITLAB_INTEGRATION_CLIENT_SECRET=\nGITLAB_INTEGRATION_CALLBACK_URL=https://api.taskview.tech/module/integrations/oauth/github/callback\n\nENCRYPTION_KEY=\n\n# Messaging integrations\nTELEGRAM_BOT_TOKEN=\nTELEGRAM_BOT_USERNAME=\nTELEGRAM_WEBHOOK_SECRET=\n# SLACK_CLIENT_ID=\n# SLACK_CLIENT_SECRET=\n# SLACK_SIGNING_SECRET=\n\n# Notifications (optional)\n# FIREBASE_CREDENTIALS_PATH=./firebase-credentials.json\n# CENTRIFUGO_API_URL=http://centrifugo:8000\n# CENTRIFUGO_API_KEY=your_centrifugo_api_key\n# CENTRIFUGO_TOKEN_SECRET=your_centrifugo_token_secret\n# CENTRIFUGO_PUBLIC_URL=wss://api.example.com/centrifugo/connection/websocket\n","env",[166,1613,1614,1619,1624,1629,1634,1639,1644,1649,1654,1659,1664,1670,1675,1680,1685,1690,1695,1700,1705,1709,1714,1719,1723,1729,1735,1741,1747,1753,1759,1765,1771,1777,1783,1789,1795,1801,1806,1812,1818,1824,1830,1835,1841,1847,1853,1858,1864,1869,1875,1881,1887,1893,1899,1905,1911,1916,1922,1928,1934,1940,1946],{"__ignoreMap":629},[633,1615,1616],{"class":635,"line":636},[633,1617,1618],{},"DB_HOST=\"db\"\n",[633,1620,1621],{"class":635,"line":1225},[633,1622,1623],{},"DB_USER=\"taskview_db_user\"\n",[633,1625,1626],{"class":635,"line":1243},[633,1627,1628],{},"DB_PASSWORD=\"password\"\n",[633,1630,1631],{"class":635,"line":1269},[633,1632,1633],{},"DB_NAME=\"taskview\"\n",[633,1635,1636],{"class":635,"line":1283},[633,1637,1638],{},"DB_PORT=5432\n",[633,1640,1641],{"class":635,"line":1305},[633,1642,1643],{},"APP_PORT=1401\n",[633,1645,1646],{"class":635,"line":1311},[633,1647,1648],{},"JWT_ALG=\"HS256\"\n",[633,1650,1651],{"class":635,"line":1317},[633,1652,1653],{},"JWT_SIGN=\"secret\"\n",[633,1655,1656],{"class":635,"line":1331},[633,1657,1658],{},"ACCESS_LIFE_TIME=\"3d\"\n",[633,1660,1661],{"class":635,"line":1346},[633,1662,1663],{},"REFRESH_LIFE_TIME=\"9d\"\n",[633,1665,1666],{"class":635,"line":1352},[633,1667,1669],{"emptyLinePlaceholder":1668},true,"\n",[633,1671,1672],{"class":635,"line":1375},[633,1673,1674],{},"SMTP_HOST=smtp\n",[633,1676,1677],{"class":635,"line":1390},[633,1678,1679],{},"SMTP_PORT=587\n",[633,1681,1682],{"class":635,"line":1404},[633,1683,1684],{},"SMTP_USERNAME=\n",[633,1686,1687],{"class":635,"line":1421},[633,1688,1689],{},"SMTP_PASSWORD=\n",[633,1691,1692],{"class":635,"line":1440},[633,1693,1694],{},"SMTP_ENCRYPTION=tls\n",[633,1696,1697],{"class":635,"line":1446},[633,1698,1699],{},"SMTP_FROM_NAME=TaskView\n",[633,1701,1702],{"class":635,"line":1452},[633,1703,1704],{},"SMTP_FROM_EMAIL=\n",[633,1706,1707],{"class":635,"line":1457},[633,1708,1669],{"emptyLinePlaceholder":1668},[633,1710,1711],{"class":635,"line":1471},[633,1712,1713],{},"# Your domain \n",[633,1715,1716],{"class":635,"line":1490},[633,1717,1718],{},"APP_URL=\"https://app.taskview.tech\"\n",[633,1720,1721],{"class":635,"line":1496},[633,1722,1669],{"emptyLinePlaceholder":1668},[633,1724,1726],{"class":635,"line":1725},23,[633,1727,1728],{},"GOOGLE_CLIENT_ID=\"\"\n",[633,1730,1732],{"class":635,"line":1731},24,[633,1733,1734],{},"GOOGLE_CLIENT_SECRET=\"\"\n",[633,1736,1738],{"class":635,"line":1737},25,[633,1739,1740],{},"#You domain\n",[633,1742,1744],{"class":635,"line":1743},26,[633,1745,1746],{},"GOOGLE_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/google/callback\"\n",[633,1748,1750],{"class":635,"line":1749},27,[633,1751,1752],{},"GITHUB_CLIENT_ID=\"\"\n",[633,1754,1756],{"class":635,"line":1755},28,[633,1757,1758],{},"GITHUB_CLIENT_SECRET=\"\"\n",[633,1760,1762],{"class":635,"line":1761},29,[633,1763,1764],{},"GITHUB_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/github/callback\"\n",[633,1766,1768],{"class":635,"line":1767},30,[633,1769,1770],{},"APPLE_CLIENT_ID=\"\"\n",[633,1772,1774],{"class":635,"line":1773},31,[633,1775,1776],{},"APPLE_TEAM_ID=\"\"\n",[633,1778,1780],{"class":635,"line":1779},32,[633,1781,1782],{},"APPLE_KEY_ID=\"\"\n",[633,1784,1786],{"class":635,"line":1785},33,[633,1787,1788],{},"APPLE_KEY_LOCATION=\"/usr/src/app/AuthKey.p8\"\n",[633,1790,1792],{"class":635,"line":1791},34,[633,1793,1794],{},"# Your domain\n",[633,1796,1798],{"class":635,"line":1797},35,[633,1799,1800],{},"APPLE_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/apple/callback\"\n",[633,1802,1804],{"class":635,"line":1803},36,[633,1805,1669],{"emptyLinePlaceholder":1668},[633,1807,1809],{"class":635,"line":1808},37,[633,1810,1811],{},"#integrations\n",[633,1813,1815],{"class":635,"line":1814},38,[633,1816,1817],{},"GITHUB_INTEGRATION_CLIENT_ID=\n",[633,1819,1821],{"class":635,"line":1820},39,[633,1822,1823],{},"GITHUB_INTEGRATION_CLIENT_SECRET=\n",[633,1825,1827],{"class":635,"line":1826},40,[633,1828,1829],{},"GITHUB_INTEGRATION_CALLBACK_URL=https://api.taskview.tech/module/integrations/oauth/github/callback\n",[633,1831,1833],{"class":635,"line":1832},41,[633,1834,1669],{"emptyLinePlaceholder":1668},[633,1836,1838],{"class":635,"line":1837},42,[633,1839,1840],{},"GITLAB_INTEGRATION_CLIENT_ID=\n",[633,1842,1844],{"class":635,"line":1843},43,[633,1845,1846],{},"GITLAB_INTEGRATION_CLIENT_SECRET=\n",[633,1848,1850],{"class":635,"line":1849},44,[633,1851,1852],{},"GITLAB_INTEGRATION_CALLBACK_URL=https://api.taskview.tech/module/integrations/oauth/github/callback\n",[633,1854,1856],{"class":635,"line":1855},45,[633,1857,1669],{"emptyLinePlaceholder":1668},[633,1859,1861],{"class":635,"line":1860},46,[633,1862,1863],{},"ENCRYPTION_KEY=\n",[633,1865,1867],{"class":635,"line":1866},47,[633,1868,1669],{"emptyLinePlaceholder":1668},[633,1870,1872],{"class":635,"line":1871},48,[633,1873,1874],{},"# Messaging integrations\n",[633,1876,1878],{"class":635,"line":1877},49,[633,1879,1880],{},"TELEGRAM_BOT_TOKEN=\n",[633,1882,1884],{"class":635,"line":1883},50,[633,1885,1886],{},"TELEGRAM_BOT_USERNAME=\n",[633,1888,1890],{"class":635,"line":1889},51,[633,1891,1892],{},"TELEGRAM_WEBHOOK_SECRET=\n",[633,1894,1896],{"class":635,"line":1895},52,[633,1897,1898],{},"# SLACK_CLIENT_ID=\n",[633,1900,1902],{"class":635,"line":1901},53,[633,1903,1904],{},"# SLACK_CLIENT_SECRET=\n",[633,1906,1908],{"class":635,"line":1907},54,[633,1909,1910],{},"# SLACK_SIGNING_SECRET=\n",[633,1912,1914],{"class":635,"line":1913},55,[633,1915,1669],{"emptyLinePlaceholder":1668},[633,1917,1919],{"class":635,"line":1918},56,[633,1920,1921],{},"# Notifications (optional)\n",[633,1923,1925],{"class":635,"line":1924},57,[633,1926,1927],{},"# FIREBASE_CREDENTIALS_PATH=./firebase-credentials.json\n",[633,1929,1931],{"class":635,"line":1930},58,[633,1932,1933],{},"# CENTRIFUGO_API_URL=http://centrifugo:8000\n",[633,1935,1937],{"class":635,"line":1936},59,[633,1938,1939],{},"# CENTRIFUGO_API_KEY=your_centrifugo_api_key\n",[633,1941,1943],{"class":635,"line":1942},60,[633,1944,1945],{},"# CENTRIFUGO_TOKEN_SECRET=your_centrifugo_token_secret\n",[633,1947,1949],{"class":635,"line":1948},61,[633,1950,1951],{},"# CENTRIFUGO_PUBLIC_URL=wss://api.example.com/centrifugo/connection/websocket\n",[1953,1954,1955],"style",{},"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":629,"searchDepth":1225,"depth":1225,"links":1957},[1958,1959,1960,1961,1962,1963,1964,1965,1966,1972],{"id":173,"depth":1225,"text":174},{"id":286,"depth":1225,"text":287},{"id":347,"depth":1225,"text":114},{"id":450,"depth":1225,"text":451},{"id":585,"depth":1225,"text":586},{"id":677,"depth":1225,"text":678},{"id":779,"depth":1225,"text":780},{"id":875,"depth":1225,"text":876},{"id":1061,"depth":1225,"text":64,"children":1967},[1968,1969,1970,1971],{"id":1068,"depth":1243,"text":1069},{"id":1161,"depth":1243,"text":1162},{"id":1201,"depth":1243,"text":1202},{"id":1532,"depth":1243,"text":1533},{"id":1599,"depth":1225,"text":1600},"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.","md",{},{"icon":112},{"title":109,"description":1973},"yKwKHJmcV_jthoWWZOjTpLI8igAKUBY0bgvpEps3vxY",[1980,1982],{"title":99,"path":100,"stem":101,"description":1981,"icon":102,"children":-1},"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.",{"title":114,"path":115,"stem":116,"description":1983,"icon":117,"children":-1},"Configure authentication in TaskView - email/password, email/code, OAuth with GitHub, Google, and Apple Sign In. JWT session management, password recovery, and account deletion for your self-hosted instance.",1783289464129]