[{"data":1,"prerenderedAt":1534},["ShallowReactive",2],{"navigation":3,"/docs/getting-started/installation":156,"/docs/getting-started/installation-surround":1529},[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":13,"body":158,"description":1523,"extension":1524,"meta":1525,"navigation":1526,"path":14,"seo":1527,"stem":15,"__hash__":1528},"docs/docs/1.getting-started/2.installation.md",{"type":159,"value":160,"toc":1508},"minimark",[161,165,170,203,214,218,251,255,258,267,291,303,593,607,611,1153,1157,1176,1179,1183,1191,1196,1203,1211,1214,1218,1221,1240,1243,1253,1257,1273,1276,1362,1365,1385,1388,1392,1395,1419,1422,1426,1480,1484,1504],[162,163,164],"p",{},"TaskView runs as a set of Docker containers - a database, an API server, a web app, and a one-time migration runner. The whole setup takes about 5 minutes.",[166,167,169],"h2",{"id":168},"prerequisites","Prerequisites",[171,172,173,191],"ul",{},[174,175,176,177,184,185,190],"li",{},"A server or local machine with ",[178,179,183],"a",{"href":180,"rel":181},"https://docs.docker.com/get-docker/",[182],"nofollow","Docker"," and ",[178,186,189],{"href":187,"rel":188},"https://docs.docker.com/compose/install/",[182],"Docker Compose"," installed",[174,192,193,194,198,199,202],{},"Ports ",[195,196,197],"code",{},"8888"," (web) and ",[195,200,201],{},"1725"," (API) available - you can change these in the compose file",[204,205],"iframe",{"width":206,"height":207,"src":208,"title":209,"frameBorder":210,"allow":211,"referrerPolicy":212,"allowFullScreen":213},560,315,"https://www.youtube.com/embed/H00VMafS2qA?si=q4CwxFKgitAytSq4","YouTube video player","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share","strict-origin-when-cross-origin",true,[166,215,217],{"id":216},"step-1-create-a-project-directory","Step 1: Create a project directory",[219,220,225],"pre",{"className":221,"code":222,"language":223,"meta":224,"style":224},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mkdir taskview && cd taskview\n","bash","",[195,226,227],{"__ignoreMap":224},[228,229,232,236,240,244,248],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"sBMFI","mkdir",[228,237,239],{"class":238},"sfazB"," taskview",[228,241,243],{"class":242},"sMK4o"," &&",[228,245,247],{"class":246},"s2Zo4"," cd",[228,249,250],{"class":238}," taskview\n",[166,252,254],{"id":253},"step-2-create-environment-files","Step 2: Create environment files",[162,256,257],{},"You need two env files - one for PostgreSQL, one for the TaskView API.",[162,259,260,266],{},[261,262,263],"strong",{},[195,264,265],{},".env.postgresql"," - database credentials:",[219,268,272],{"className":269,"code":270,"language":271,"meta":224,"style":224},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POSTGRES_USER=taskview_db_user\nPOSTGRES_PASSWORD=your_secure_password\nPOSTGRES_DB=taskviewdb\n","env",[195,273,274,279,285],{"__ignoreMap":224},[228,275,276],{"class":230,"line":231},[228,277,278],{},"POSTGRES_USER=taskview_db_user\n",[228,280,282],{"class":230,"line":281},2,[228,283,284],{},"POSTGRES_PASSWORD=your_secure_password\n",[228,286,288],{"class":230,"line":287},3,[228,289,290],{},"POSTGRES_DB=taskviewdb\n",[162,292,293,298,299,302],{},[261,294,295],{},[195,296,297],{},".env.taskview"," - application config (",[261,300,301],{},"example, do not forget add your data","):",[219,304,306],{"className":269,"code":305,"language":271,"meta":224,"style":224},"DB_HOST=\"db\"\nDB_USER=\"taskview_db_user\"\nDB_PASSWORD=\"your_secure_password\"\nDB_NAME=\"taskviewdb\"\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#!!! ADD YOUR DOMAIN SEPARATED BY \",\"\nCORS_ALLOWED_ORIGINS=\"http://localhost:5173,http://127.0.0.1:5173,http://localhost:3000,http://localhost:8888,http://127.0.0.1:3000,http://127.0.0.1:8888\"\n",[195,307,308,313,318,323,329,335,341,347,353,359,365,371,377,383,389,395,401,407,413,418,424,430,435,441,447,453,459,465,471,477,483,489,495,501,507,513,518,524,530,536,542,547,553,559,565,570,576,581,587],{"__ignoreMap":224},[228,309,310],{"class":230,"line":231},[228,311,312],{},"DB_HOST=\"db\"\n",[228,314,315],{"class":230,"line":281},[228,316,317],{},"DB_USER=\"taskview_db_user\"\n",[228,319,320],{"class":230,"line":287},[228,321,322],{},"DB_PASSWORD=\"your_secure_password\"\n",[228,324,326],{"class":230,"line":325},4,[228,327,328],{},"DB_NAME=\"taskviewdb\"\n",[228,330,332],{"class":230,"line":331},5,[228,333,334],{},"DB_PORT=5432\n",[228,336,338],{"class":230,"line":337},6,[228,339,340],{},"APP_PORT=1401\n",[228,342,344],{"class":230,"line":343},7,[228,345,346],{},"JWT_ALG=\"HS256\"\n",[228,348,350],{"class":230,"line":349},8,[228,351,352],{},"JWT_SIGN=\"secret\"\n",[228,354,356],{"class":230,"line":355},9,[228,357,358],{},"ACCESS_LIFE_TIME=\"3d\"\n",[228,360,362],{"class":230,"line":361},10,[228,363,364],{},"REFRESH_LIFE_TIME=\"9d\"\n",[228,366,368],{"class":230,"line":367},11,[228,369,370],{"emptyLinePlaceholder":213},"\n",[228,372,374],{"class":230,"line":373},12,[228,375,376],{},"SMTP_HOST=smtp\n",[228,378,380],{"class":230,"line":379},13,[228,381,382],{},"SMTP_PORT=587\n",[228,384,386],{"class":230,"line":385},14,[228,387,388],{},"SMTP_USERNAME=\n",[228,390,392],{"class":230,"line":391},15,[228,393,394],{},"SMTP_PASSWORD=\n",[228,396,398],{"class":230,"line":397},16,[228,399,400],{},"SMTP_ENCRYPTION=tls\n",[228,402,404],{"class":230,"line":403},17,[228,405,406],{},"SMTP_FROM_NAME=TaskView\n",[228,408,410],{"class":230,"line":409},18,[228,411,412],{},"SMTP_FROM_EMAIL=\n",[228,414,416],{"class":230,"line":415},19,[228,417,370],{"emptyLinePlaceholder":213},[228,419,421],{"class":230,"line":420},20,[228,422,423],{},"# Your domain \n",[228,425,427],{"class":230,"line":426},21,[228,428,429],{},"APP_URL=\"https://app.taskview.tech\"\n",[228,431,433],{"class":230,"line":432},22,[228,434,370],{"emptyLinePlaceholder":213},[228,436,438],{"class":230,"line":437},23,[228,439,440],{},"GOOGLE_CLIENT_ID=\"\"\n",[228,442,444],{"class":230,"line":443},24,[228,445,446],{},"GOOGLE_CLIENT_SECRET=\"\"\n",[228,448,450],{"class":230,"line":449},25,[228,451,452],{},"#You domain\n",[228,454,456],{"class":230,"line":455},26,[228,457,458],{},"GOOGLE_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/google/callback\"\n",[228,460,462],{"class":230,"line":461},27,[228,463,464],{},"GITHUB_CLIENT_ID=\"\"\n",[228,466,468],{"class":230,"line":467},28,[228,469,470],{},"GITHUB_CLIENT_SECRET=\"\"\n",[228,472,474],{"class":230,"line":473},29,[228,475,476],{},"GITHUB_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/github/callback\"\n",[228,478,480],{"class":230,"line":479},30,[228,481,482],{},"APPLE_CLIENT_ID=\"\"\n",[228,484,486],{"class":230,"line":485},31,[228,487,488],{},"APPLE_TEAM_ID=\"\"\n",[228,490,492],{"class":230,"line":491},32,[228,493,494],{},"APPLE_KEY_ID=\"\"\n",[228,496,498],{"class":230,"line":497},33,[228,499,500],{},"APPLE_KEY_LOCATION=\"/usr/src/app/AuthKey.p8\"\n",[228,502,504],{"class":230,"line":503},34,[228,505,506],{},"# Your domain\n",[228,508,510],{"class":230,"line":509},35,[228,511,512],{},"APPLE_CALLBACK_URL=\"https://api.taskview.tech/module/auth/provider/apple/callback\"\n",[228,514,516],{"class":230,"line":515},36,[228,517,370],{"emptyLinePlaceholder":213},[228,519,521],{"class":230,"line":520},37,[228,522,523],{},"#integrations\n",[228,525,527],{"class":230,"line":526},38,[228,528,529],{},"GITHUB_INTEGRATION_CLIENT_ID=\n",[228,531,533],{"class":230,"line":532},39,[228,534,535],{},"GITHUB_INTEGRATION_CLIENT_SECRET=\n",[228,537,539],{"class":230,"line":538},40,[228,540,541],{},"GITHUB_INTEGRATION_CALLBACK_URL=https://api.taskview.tech/module/integrations/oauth/github/callback\n",[228,543,545],{"class":230,"line":544},41,[228,546,370],{"emptyLinePlaceholder":213},[228,548,550],{"class":230,"line":549},42,[228,551,552],{},"GITLAB_INTEGRATION_CLIENT_ID=\n",[228,554,556],{"class":230,"line":555},43,[228,557,558],{},"GITLAB_INTEGRATION_CLIENT_SECRET=\n",[228,560,562],{"class":230,"line":561},44,[228,563,564],{},"GITLAB_INTEGRATION_CALLBACK_URL=https://api.taskview.tech/module/integrations/oauth/github/callback\n",[228,566,568],{"class":230,"line":567},45,[228,569,370],{"emptyLinePlaceholder":213},[228,571,573],{"class":230,"line":572},46,[228,574,575],{},"ENCRYPTION_KEY=\n",[228,577,579],{"class":230,"line":578},47,[228,580,370],{"emptyLinePlaceholder":213},[228,582,584],{"class":230,"line":583},48,[228,585,586],{},"#!!! ADD YOUR DOMAIN SEPARATED BY \",\"\n",[228,588,590],{"class":230,"line":589},49,[228,591,592],{},"CORS_ALLOWED_ORIGINS=\"http://localhost:5173,http://127.0.0.1:5173,http://localhost:3000,http://localhost:8888,http://127.0.0.1:3000,http://127.0.0.1:8888\"\n",[594,595,597],"callout",{"color":596,"icon":132},"warning",[162,598,599,600,184,603,606],{},"Replace ",[195,601,602],{},"your_secure_password",[195,604,605],{},"JWT_SIGN"," with real secrets. Never use the example values in production.",[166,608,610],{"id":609},"step-3-create-docker-composeyml","Step 3: Create docker-compose.yml",[219,612,616],{"className":613,"code":614,"language":615,"meta":224,"style":224},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","networks:\n  backend:\nservices:\n  db:\n    image: postgres:17\n    restart: unless-stopped\n    env_file:\n      - ./.env.postgresql\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    ports:\n      - \"5433:5432\"\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U taskview_db_user -d taskviewdb\"]\n      interval: 5s\n      timeout: 5s\n      retries: 5\n    networks: [backend]\n  migration:\n    image: gimanhead/taskview-ce-db-migration:latest\n    restart: \"no\"\n    depends_on:\n      db:\n        condition: service_healthy\n    env_file:\n      - ./.env.taskview\n    networks: [backend]\n\n  taskview-api-server:\n    image: gimanhead/taskview-ce-api-server:latest\n    restart: \"unless-stopped\"\n    sysctls:\n      - net.ipv6.conf.all.disable_ipv6=1\n      - net.ipv6.conf.default.disable_ipv6=1\n    ports:\n      - \"1725:1401\"\n    depends_on:\n      db:\n        condition: service_healthy\n      migration:\n        condition: service_completed_successfully\n    env_file:\n      - ./.env.taskview\n    volumes:\n      - ./logs:/usr/src/app/logs\n      #- /local/AuthKey.p8:/usr/src/app/AuthKey.p8\n    networks: [backend]\n\n  taskview-webapp:\n    image: gimanhead/taskview-ce-webapp:latest\n    restart: unless-stopped\n    ports:\n      - \"8888:80\"\n  # Enable for realtime notification read https://taskview.tech/docs/configuration/environment-variables#centrifugo-configuration-file \n  # centrifugo:\n  #   image: centrifugo/centrifugo:v6\n  #   restart: unless-stopped\n  #   command: centrifugo -c config.json\n  #   ports:\n  #     - \"8000:8000\"\n  #   volumes:\n  #     - /path-to/centrifugo/config.json:/centrifugo/config.json\n  #   networks: [backend]\nvolumes:\n  pgdata:\n\n","yaml",[195,617,618,627,634,641,648,659,669,676,684,691,698,705,718,725,756,766,775,786,800,807,816,829,836,843,853,859,866,878,882,889,898,911,918,925,932,938,949,955,961,969,976,985,991,997,1003,1010,1016,1028,1032,1039,1049,1058,1065,1077,1083,1089,1095,1101,1107,1113,1119,1125,1131,1137,1145],{"__ignoreMap":224},[228,619,620,624],{"class":230,"line":231},[228,621,623],{"class":622},"swJcz","networks",[228,625,626],{"class":242},":\n",[228,628,629,632],{"class":230,"line":281},[228,630,631],{"class":622},"  backend",[228,633,626],{"class":242},[228,635,636,639],{"class":230,"line":287},[228,637,638],{"class":622},"services",[228,640,626],{"class":242},[228,642,643,646],{"class":230,"line":325},[228,644,645],{"class":622},"  db",[228,647,626],{"class":242},[228,649,650,653,656],{"class":230,"line":331},[228,651,652],{"class":622},"    image",[228,654,655],{"class":242},":",[228,657,658],{"class":238}," postgres:17\n",[228,660,661,664,666],{"class":230,"line":337},[228,662,663],{"class":622},"    restart",[228,665,655],{"class":242},[228,667,668],{"class":238}," unless-stopped\n",[228,670,671,674],{"class":230,"line":343},[228,672,673],{"class":622},"    env_file",[228,675,626],{"class":242},[228,677,678,681],{"class":230,"line":349},[228,679,680],{"class":242},"      -",[228,682,683],{"class":238}," ./.env.postgresql\n",[228,685,686,689],{"class":230,"line":355},[228,687,688],{"class":622},"    volumes",[228,690,626],{"class":242},[228,692,693,695],{"class":230,"line":361},[228,694,680],{"class":242},[228,696,697],{"class":238}," pgdata:/var/lib/postgresql/data\n",[228,699,700,703],{"class":230,"line":367},[228,701,702],{"class":622},"    ports",[228,704,626],{"class":242},[228,706,707,709,712,715],{"class":230,"line":373},[228,708,680],{"class":242},[228,710,711],{"class":242}," \"",[228,713,714],{"class":238},"5433:5432",[228,716,717],{"class":242},"\"\n",[228,719,720,723],{"class":230,"line":379},[228,721,722],{"class":622},"    healthcheck",[228,724,626],{"class":242},[228,726,727,730,732,735,738,741,743,746,748,751,753],{"class":230,"line":385},[228,728,729],{"class":622},"      test",[228,731,655],{"class":242},[228,733,734],{"class":242}," [",[228,736,737],{"class":242},"\"",[228,739,740],{"class":238},"CMD-SHELL",[228,742,737],{"class":242},[228,744,745],{"class":242},",",[228,747,711],{"class":242},[228,749,750],{"class":238},"pg_isready -U taskview_db_user -d taskviewdb",[228,752,737],{"class":242},[228,754,755],{"class":242},"]\n",[228,757,758,761,763],{"class":230,"line":391},[228,759,760],{"class":622},"      interval",[228,762,655],{"class":242},[228,764,765],{"class":238}," 5s\n",[228,767,768,771,773],{"class":230,"line":397},[228,769,770],{"class":622},"      timeout",[228,772,655],{"class":242},[228,774,765],{"class":238},[228,776,777,780,782],{"class":230,"line":403},[228,778,779],{"class":622},"      retries",[228,781,655],{"class":242},[228,783,785],{"class":784},"sbssI"," 5\n",[228,787,788,791,793,795,798],{"class":230,"line":409},[228,789,790],{"class":622},"    networks",[228,792,655],{"class":242},[228,794,734],{"class":242},[228,796,797],{"class":238},"backend",[228,799,755],{"class":242},[228,801,802,805],{"class":230,"line":415},[228,803,804],{"class":622},"  migration",[228,806,626],{"class":242},[228,808,809,811,813],{"class":230,"line":420},[228,810,652],{"class":622},[228,812,655],{"class":242},[228,814,815],{"class":238}," gimanhead/taskview-ce-db-migration:latest\n",[228,817,818,820,822,824,827],{"class":230,"line":426},[228,819,663],{"class":622},[228,821,655],{"class":242},[228,823,711],{"class":242},[228,825,826],{"class":238},"no",[228,828,717],{"class":242},[228,830,831,834],{"class":230,"line":432},[228,832,833],{"class":622},"    depends_on",[228,835,626],{"class":242},[228,837,838,841],{"class":230,"line":437},[228,839,840],{"class":622},"      db",[228,842,626],{"class":242},[228,844,845,848,850],{"class":230,"line":443},[228,846,847],{"class":622},"        condition",[228,849,655],{"class":242},[228,851,852],{"class":238}," service_healthy\n",[228,854,855,857],{"class":230,"line":449},[228,856,673],{"class":622},[228,858,626],{"class":242},[228,860,861,863],{"class":230,"line":455},[228,862,680],{"class":242},[228,864,865],{"class":238}," ./.env.taskview\n",[228,867,868,870,872,874,876],{"class":230,"line":461},[228,869,790],{"class":622},[228,871,655],{"class":242},[228,873,734],{"class":242},[228,875,797],{"class":238},[228,877,755],{"class":242},[228,879,880],{"class":230,"line":467},[228,881,370],{"emptyLinePlaceholder":213},[228,883,884,887],{"class":230,"line":473},[228,885,886],{"class":622},"  taskview-api-server",[228,888,626],{"class":242},[228,890,891,893,895],{"class":230,"line":479},[228,892,652],{"class":622},[228,894,655],{"class":242},[228,896,897],{"class":238}," gimanhead/taskview-ce-api-server:latest\n",[228,899,900,902,904,906,909],{"class":230,"line":485},[228,901,663],{"class":622},[228,903,655],{"class":242},[228,905,711],{"class":242},[228,907,908],{"class":238},"unless-stopped",[228,910,717],{"class":242},[228,912,913,916],{"class":230,"line":491},[228,914,915],{"class":622},"    sysctls",[228,917,626],{"class":242},[228,919,920,922],{"class":230,"line":497},[228,921,680],{"class":242},[228,923,924],{"class":238}," net.ipv6.conf.all.disable_ipv6=1\n",[228,926,927,929],{"class":230,"line":503},[228,928,680],{"class":242},[228,930,931],{"class":238}," net.ipv6.conf.default.disable_ipv6=1\n",[228,933,934,936],{"class":230,"line":509},[228,935,702],{"class":622},[228,937,626],{"class":242},[228,939,940,942,944,947],{"class":230,"line":515},[228,941,680],{"class":242},[228,943,711],{"class":242},[228,945,946],{"class":238},"1725:1401",[228,948,717],{"class":242},[228,950,951,953],{"class":230,"line":520},[228,952,833],{"class":622},[228,954,626],{"class":242},[228,956,957,959],{"class":230,"line":526},[228,958,840],{"class":622},[228,960,626],{"class":242},[228,962,963,965,967],{"class":230,"line":532},[228,964,847],{"class":622},[228,966,655],{"class":242},[228,968,852],{"class":238},[228,970,971,974],{"class":230,"line":538},[228,972,973],{"class":622},"      migration",[228,975,626],{"class":242},[228,977,978,980,982],{"class":230,"line":544},[228,979,847],{"class":622},[228,981,655],{"class":242},[228,983,984],{"class":238}," service_completed_successfully\n",[228,986,987,989],{"class":230,"line":549},[228,988,673],{"class":622},[228,990,626],{"class":242},[228,992,993,995],{"class":230,"line":555},[228,994,680],{"class":242},[228,996,865],{"class":238},[228,998,999,1001],{"class":230,"line":561},[228,1000,688],{"class":622},[228,1002,626],{"class":242},[228,1004,1005,1007],{"class":230,"line":567},[228,1006,680],{"class":242},[228,1008,1009],{"class":238}," ./logs:/usr/src/app/logs\n",[228,1011,1012],{"class":230,"line":572},[228,1013,1015],{"class":1014},"sHwdD","      #- /local/AuthKey.p8:/usr/src/app/AuthKey.p8\n",[228,1017,1018,1020,1022,1024,1026],{"class":230,"line":578},[228,1019,790],{"class":622},[228,1021,655],{"class":242},[228,1023,734],{"class":242},[228,1025,797],{"class":238},[228,1027,755],{"class":242},[228,1029,1030],{"class":230,"line":583},[228,1031,370],{"emptyLinePlaceholder":213},[228,1033,1034,1037],{"class":230,"line":589},[228,1035,1036],{"class":622},"  taskview-webapp",[228,1038,626],{"class":242},[228,1040,1042,1044,1046],{"class":230,"line":1041},50,[228,1043,652],{"class":622},[228,1045,655],{"class":242},[228,1047,1048],{"class":238}," gimanhead/taskview-ce-webapp:latest\n",[228,1050,1052,1054,1056],{"class":230,"line":1051},51,[228,1053,663],{"class":622},[228,1055,655],{"class":242},[228,1057,668],{"class":238},[228,1059,1061,1063],{"class":230,"line":1060},52,[228,1062,702],{"class":622},[228,1064,626],{"class":242},[228,1066,1068,1070,1072,1075],{"class":230,"line":1067},53,[228,1069,680],{"class":242},[228,1071,711],{"class":242},[228,1073,1074],{"class":238},"8888:80",[228,1076,717],{"class":242},[228,1078,1080],{"class":230,"line":1079},54,[228,1081,1082],{"class":1014},"  # Enable for realtime notification read https://taskview.tech/docs/configuration/environment-variables#centrifugo-configuration-file \n",[228,1084,1086],{"class":230,"line":1085},55,[228,1087,1088],{"class":1014},"  # centrifugo:\n",[228,1090,1092],{"class":230,"line":1091},56,[228,1093,1094],{"class":1014},"  #   image: centrifugo/centrifugo:v6\n",[228,1096,1098],{"class":230,"line":1097},57,[228,1099,1100],{"class":1014},"  #   restart: unless-stopped\n",[228,1102,1104],{"class":230,"line":1103},58,[228,1105,1106],{"class":1014},"  #   command: centrifugo -c config.json\n",[228,1108,1110],{"class":230,"line":1109},59,[228,1111,1112],{"class":1014},"  #   ports:\n",[228,1114,1116],{"class":230,"line":1115},60,[228,1117,1118],{"class":1014},"  #     - \"8000:8000\"\n",[228,1120,1122],{"class":230,"line":1121},61,[228,1123,1124],{"class":1014},"  #   volumes:\n",[228,1126,1128],{"class":230,"line":1127},62,[228,1129,1130],{"class":1014},"  #     - /path-to/centrifugo/config.json:/centrifugo/config.json\n",[228,1132,1134],{"class":230,"line":1133},63,[228,1135,1136],{"class":1014},"  #   networks: [backend]\n",[228,1138,1140,1143],{"class":230,"line":1139},64,[228,1141,1142],{"class":622},"volumes",[228,1144,626],{"class":242},[228,1146,1148,1151],{"class":230,"line":1147},65,[228,1149,1150],{"class":622},"  pgdata",[228,1152,626],{"class":242},[166,1154,1156],{"id":1155},"step-4-start-everything","Step 4: Start everything",[219,1158,1160],{"className":221,"code":1159,"language":223,"meta":224,"style":224},"docker compose up -d\n",[195,1161,1162],{"__ignoreMap":224},[228,1163,1164,1167,1170,1173],{"class":230,"line":231},[228,1165,1166],{"class":234},"docker",[228,1168,1169],{"class":238}," compose",[228,1171,1172],{"class":238}," up",[228,1174,1175],{"class":238}," -d\n",[162,1177,1178],{},"Docker will pull the images, start the database, run migrations, and launch the API and web app.",[166,1180,1182],{"id":1181},"step-5-open-taskview","Step 5: Open TaskView",[162,1184,1185,1186,1190],{},"Go to ",[178,1187,1188],{"href":1188,"rel":1189},"http://localhost:8888",[182]," in your browser. You'll see the login screen.",[1192,1193,1195],"h3",{"id":1194},"configure-the-api-server","Configure the API server",[162,1197,1198,1199,1202],{},"Before logging in, you need to tell the web app where the API server is running. Click the ",[261,1200,1201],{},"server settings"," icon on the login page and add the API server URL:",[219,1204,1209],{"className":1205,"code":1207,"language":1208},[1206],"language-text","http://localhost:1725\n","text",[195,1210,1207],{"__ignoreMap":224},[162,1212,1213],{},"This is the API server that handles authentication, projects, tasks, and all backend operations. The web app (port 8888) serves the frontend, while the API server (port 1725) handles the data.",[1192,1215,1217],{"id":1216},"log-in-with-the-default-user","Log in with the default user",[162,1219,1220],{},"The database migration creates a default user so you can log in right away:",[171,1222,1223,1232],{},[174,1224,1225,1228,1229],{},[261,1226,1227],{},"Login:"," ",[195,1230,1231],{},"user",[174,1233,1234,1228,1237],{},[261,1235,1236],{},"Password:",[195,1238,1239],{},"user1!#Q",[162,1241,1242],{},"Use these credentials to verify that everything is working - check that the UI loads, you can create a project, add tasks, etc.",[594,1244,1247],{"color":1245,"icon":1246},"error","i-lucide-alert-triangle",[162,1248,1249,1252],{},[261,1250,1251],{},"Important:"," The default user is for initial setup only. Once you've confirmed the system works, delete the default user and create your own account with a secure password.",[1192,1254,1256],{"id":1255},"replacing-the-default-user","Replacing the default user",[1258,1259,1260,1263,1266],"ol",{},[174,1261,1262],{},"Log in with the default credentials",[174,1264,1265],{},"Register a new account with your real email and a strong password",[174,1267,1268,1269,1272],{},"Delete the default ",[195,1270,1271],{},"admin"," account",[162,1274,1275],{},"If you prefer to create the first user directly in the database, generate a password hash:",[219,1277,1281],{"className":1278,"code":1279,"language":1280,"meta":224,"style":224},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { hashSync } from 'bcryptjs'\n\nconst passwordHash = hashSync('your-secure-password', 12)\nconsole.log(passwordHash)\n","ts",[195,1282,1283,1311,1315,1348],{"__ignoreMap":224},[228,1284,1285,1289,1292,1296,1299,1302,1305,1308],{"class":230,"line":231},[228,1286,1288],{"class":1287},"s7zQu","import",[228,1290,1291],{"class":242}," {",[228,1293,1295],{"class":1294},"sTEyZ"," hashSync",[228,1297,1298],{"class":242}," }",[228,1300,1301],{"class":1287}," from",[228,1303,1304],{"class":242}," '",[228,1306,1307],{"class":238},"bcryptjs",[228,1309,1310],{"class":242},"'\n",[228,1312,1313],{"class":230,"line":281},[228,1314,370],{"emptyLinePlaceholder":213},[228,1316,1317,1321,1324,1327,1329,1332,1335,1338,1340,1342,1345],{"class":230,"line":287},[228,1318,1320],{"class":1319},"spNyl","const",[228,1322,1323],{"class":1294}," passwordHash ",[228,1325,1326],{"class":242},"=",[228,1328,1295],{"class":246},[228,1330,1331],{"class":1294},"(",[228,1333,1334],{"class":242},"'",[228,1336,1337],{"class":238},"your-secure-password",[228,1339,1334],{"class":242},[228,1341,745],{"class":242},[228,1343,1344],{"class":784}," 12",[228,1346,1347],{"class":1294},")\n",[228,1349,1350,1353,1356,1359],{"class":230,"line":325},[228,1351,1352],{"class":1294},"console",[228,1354,1355],{"class":242},".",[228,1357,1358],{"class":246},"log",[228,1360,1361],{"class":1294},"(passwordHash)\n",[162,1363,1364],{},"Or as a one-liner:",[219,1366,1368],{"className":221,"code":1367,"language":223,"meta":224,"style":224},"node -e \"console.log(require('bcryptjs').hashSync('your-secure-password', 12))\"\n",[195,1369,1370],{"__ignoreMap":224},[228,1371,1372,1375,1378,1380,1383],{"class":230,"line":231},[228,1373,1374],{"class":234},"node",[228,1376,1377],{"class":238}," -e",[228,1379,711],{"class":242},[228,1381,1382],{"class":238},"console.log(require('bcryptjs').hashSync('your-secure-password', 12))",[228,1384,717],{"class":242},[162,1386,1387],{},"Then insert the user into the database with the generated hash.",[166,1389,1391],{"id":1390},"updating","Updating",[162,1393,1394],{},"To update TaskView to a new version:",[219,1396,1398],{"className":221,"code":1397,"language":223,"meta":224,"style":224},"docker compose pull\ndocker compose up -d\n",[195,1399,1400,1409],{"__ignoreMap":224},[228,1401,1402,1404,1406],{"class":230,"line":231},[228,1403,1166],{"class":234},[228,1405,1169],{"class":238},[228,1407,1408],{"class":238}," pull\n",[228,1410,1411,1413,1415,1417],{"class":230,"line":281},[228,1412,1166],{"class":234},[228,1414,1169],{"class":238},[228,1416,1172],{"class":238},[228,1418,1175],{"class":238},[162,1420,1421],{},"The migration container will automatically apply any new database changes on startup.",[166,1423,1425],{"id":1424},"production-tips","Production tips",[171,1427,1428,1434,1449,1459,1468],{},[174,1429,1430,1433],{},[261,1431,1432],{},"Use a reverse proxy"," (Nginx, Caddy, Traefik) to terminate SSL and serve everything over HTTPS",[174,1435,1436,1445,1446,1448],{},[261,1437,1438,1439,184,1442],{},"Update ",[195,1440,1441],{},"APP_URL",[195,1443,1444],{},"API_URL"," in ",[195,1447,297],{}," to match your production domain",[174,1450,1451,1454,1455,1458],{},[261,1452,1453],{},"Back up the database"," - the ",[195,1456,1457],{},"pgdata"," volume contains all your data",[174,1460,1461,1467],{},[261,1462,1463,1464],{},"Set ",[195,1465,1466],{},"restart: unless-stopped"," on all services so they survive server reboots",[174,1469,1470,1473,1474,1476,1477,1479],{},[261,1471,1472],{},"SMTP setup"," - add SMTP variables to ",[195,1475,297],{}," if you want email features (password recovery, invitations). See ",[178,1478,104],{"href":110}," for details.",[166,1481,1483],{"id":1482},"whats-next","What's next",[171,1485,1486,1492,1498],{},[174,1487,1488,1491],{},[178,1489,1490],{"href":30},"Create your first project"," - set up a project with lists and tasks",[174,1493,1494,1497],{},[178,1495,1496],{"href":125},"Invite your team"," - add members and assign roles",[174,1499,1500,1503],{},[178,1501,1502],{"href":90},"Connect GitHub or GitLab"," - sync issues as tasks",[1505,1506,1507],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":224,"searchDepth":281,"depth":281,"links":1509},[1510,1511,1512,1513,1514,1515,1520,1521,1522],{"id":168,"depth":281,"text":169},{"id":216,"depth":281,"text":217},{"id":253,"depth":281,"text":254},{"id":609,"depth":281,"text":610},{"id":1155,"depth":281,"text":1156},{"id":1181,"depth":281,"text":1182,"children":1516},[1517,1518,1519],{"id":1194,"depth":287,"text":1195},{"id":1216,"depth":287,"text":1217},{"id":1255,"depth":287,"text":1256},{"id":1390,"depth":281,"text":1391},{"id":1424,"depth":281,"text":1425},{"id":1482,"depth":281,"text":1483},"Install and deploy TaskView using Docker Compose. Step-by-step setup guide for a self-hosted task management server with PostgreSQL, Node.js API, and Vue web app. Deploy on any server in 5 minutes.","md",{},{"icon":16},{"title":13,"description":1523},"sCkK-IxDOlrnJ4Au8t-J3ZhZPQF9q_4L3OGw2W86moA",[1530,1532],{"title":10,"path":6,"stem":7,"description":1531,"icon":11,"children":-1},"TaskView is an open-source, self-hosted project and task management platform. Features Kanban boards, dependency graphs, team collaboration, RBAC, GitHub/GitLab sync, and full data ownership. Free alternative to other PM for teams who need privacy and control.",{"title":18,"path":19,"stem":20,"description":1533,"icon":21,"children":-1},"Get started with TaskView in 5 minutes - create projects, add task lists, organize work with Kanban boards and dependency graphs. Quick start guide for self-hosted project and task management.",1783289464129]