[{"data":1,"prerenderedAt":6967},["ShallowReactive",2],{"post-\u002Fblog\u002F2024\u002Fdocker-change-maximum-upload-size-on-wordpress":3,"blog-posts":174},{"id":4,"title":5,"author":6,"body":7,"description":13,"draft":162,"extension":163,"featured":162,"meta":164,"navigation":165,"ogImage":166,"path":167,"pubDatetime":168,"seo":169,"stem":170,"tags":171,"__hash__":173},"blog\u002Fblog\u002F2024\u002Fdocker-change-maximum-upload-size-on-wordpress.md","Docker: Change Maximum Upload Size on Wordpress","Arizmuajianisan",{"type":8,"value":9,"toc":157},"minimark",[10,14,19,22,25,30,38,41,77,83,89,92,112,115,119,122,144,147,153],[11,12,13],"p",{},"The easiest way to change the limit upload size on WordPress that runs on Docker",[15,16,18],"h1",{"id":17},"story-behind","Story Behind",[11,20,21],{},"At my other site, I need to upload the 3D asset that will be used to explain our development. But I had a problem when I uploaded it into WordPress! It said my file exceeded the limit for upload size.",[11,23,24],{},"I found the easiest way (my thought) to change the maximum upload size.",[26,27,29],"h2",{"id":28},"if-you-persist-the-wordpress-volume","If you persist the WordPress volume",[11,31,32,33,37],{},"You only need to change the ",[34,35,36],"code",{},".htaccess"," file to add some lines of code.",[11,39,40],{},"Run this syntax:",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","sed -i '\u002F^# END WordPress.*\u002Fi php_value upload_max_filesize 256M\\nphp_value post_max_size 256M' .htaccess\n","bash","",[34,49,50],{"__ignoreMap":47},[51,52,55,59,63,67,71,74],"span",{"class":53,"line":54},"line",1,[51,56,58],{"class":57},"sbgvK","sed",[51,60,62],{"class":61},"stzsN"," -i",[51,64,66],{"class":65},"sjJ54"," '",[51,68,70],{"class":69},"s_sjI","\u002F^# END WordPress.*\u002Fi php_value upload_max_filesize 256M\\nphp_value post_max_size 256M",[51,72,73],{"class":65},"'",[51,75,76],{"class":69}," .htaccess\n",[11,78,79,80,82],{},"This will add that change to the very end of the ",[34,81,36],{}," file, but beware of changing the number. Do not use the maximum number; just make sure the number is enough for your needs.",[11,84,85,86,88],{},"After you finish the upload, I prefer to revert the change to ",[34,87,36],{}," for the sake of security.",[11,90,91],{},"To revert the change:",[42,93,95],{"className":44,"code":94,"language":46,"meta":47,"style":47},"sed -i '\u002Fphp_value\u002Fd' .htaccess\n",[34,96,97],{"__ignoreMap":47},[51,98,99,101,103,105,108,110],{"class":53,"line":54},[51,100,58],{"class":57},[51,102,62],{"class":61},[51,104,66],{"class":65},[51,106,107],{"class":69},"\u002Fphp_value\u002Fd",[51,109,73],{"class":65},[51,111,76],{"class":69},[11,113,114],{},"This will remove all the changes that we did before.",[26,116,118],{"id":117},"if-you-dont-persist-the-wordpress-volume","If you don't persist the WordPress volume",[11,120,121],{},"First, you need to enter the WordPress container.",[42,123,125],{"className":44,"code":124,"language":46,"meta":47,"style":47},"docker exec -it your-wordpress-name-container bash\n",[34,126,127],{"__ignoreMap":47},[51,128,129,132,135,138,141],{"class":53,"line":54},[51,130,131],{"class":57},"docker",[51,133,134],{"class":69}," exec",[51,136,137],{"class":61}," -it",[51,139,140],{"class":69}," your-wordpress-name-container",[51,142,143],{"class":69}," bash\n",[11,145,146],{},"After this, the rest step is the same.",[11,148,149,150,152],{},"You need to change the ",[34,151,36],{},", as you can see above.",[154,155,156],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}",{"title":47,"searchDepth":158,"depth":158,"links":159},2,[160,161],{"id":28,"depth":158,"text":29},{"id":117,"depth":158,"text":118},false,"md",{},true,null,"\u002Fblog\u002F2024\u002Fdocker-change-maximum-upload-size-on-wordpress","2024-11-07",{"title":5,"description":13},"blog\u002F2024\u002Fdocker-change-maximum-upload-size-on-wordpress",[131,172],"wordpress","j1hgFD5tpk3uDFCuBQkJllaKZZOB9lVcMoyF_oqpr1o",[175,883,1993,3985,4101,4178,4555,4616,4785,5155,5414,5998,6585,6687],{"id":176,"title":177,"author":178,"body":179,"description":870,"draft":162,"extension":163,"featured":162,"meta":871,"navigation":165,"ogImage":166,"path":872,"pubDatetime":873,"seo":874,"stem":875,"tags":876,"__hash__":882},"blog\u002Fblog\u002F2026\u002Fstandard-deployment-with-traefik.md","Standard Deployment Architecture with Cloudflare Tunnel and Traefik","arizmuajianisan",{"type":8,"value":180,"toc":858},[181,184,188,191,194,198,201,207,241,245,248,576,580,585,588,594,767,774,778,781,788,791,795,802,805,811,817,821,838,842,849,852,855],[11,182,183],{},"This standard deployment architecture uses Cloudflare Zero Trust Tunnel as the secure public entry point, Traefik as the global reverse proxy, and Docker Compose for app stacks. It keeps server inbound ports closed, enables dynamic service discovery, and supports monorepo or separate repo setups.",[26,185,187],{"id":186},"request-flow","Request Flow",[11,189,190],{},"When a user visits an app like gatepass.arzlabserver.my.id, Cloudflare receives the request and forwards it via the tunnel to the cloudflared connector on your server. The connector routes it to traefik:80 on the shared Docker network, where Traefik uses Docker labels and host\u002Fpath rules to direct it to the right container.",[11,192,193],{},"This flow ensures no direct server exposure.",[26,195,197],{"id":196},"environment-model","Environment Model",[11,199,200],{},"Deploy one shared proxy stack per environment—separate servers for staging and production, each with its own Cloudflare tunnel, Traefik container, and proxy_network. This isolation makes deployments predictable and secure.",[11,202,203],{},[204,205,206],"strong",{},"Naming Conventions:",[208,209,210,217,223,229,235],"ul",{},[211,212,213,214],"li",{},"Production: ",[34,215,216],{},"app.arzlabserver.my.id",[211,218,219,220],{},"Staging: ",[34,221,222],{},"app-stg.arzlabserver.my.id",[211,224,225,226],{},"Docker network: ",[34,227,228],{},"proxy_network",[211,230,231,232],{},"Proxy container: ",[34,233,234],{},"traefik",[211,236,237,238],{},"Tunnel container: ",[34,239,240],{},"cloudflared",[26,242,244],{"id":243},"global-setup-steps","Global Setup Steps",[11,246,247],{},"Start with these core components on every server.",[249,250,251,262,373,569],"ol",{},[211,252,253,254],{},"Create the shared network:",[42,255,260],{"className":256,"code":258,"language":259},[257],"language-text","docker network create proxy_network\n","text",[34,261,258],{"__ignoreMap":47},[211,263,264,265],{},"Run Cloudflare Tunnel:",[42,266,268],{"className":44,"code":267,"language":46,"meta":47,"style":47},"docker run -d \\\n  --name cloudflared \\\n  --network proxy_network \\\n  --restart unless-stopped \\\n  cloudflare\u002Fcloudflared:latest \\\n  tunnel --no-autoupdate run --token \u003CYOUR_TUNNEL_TOKEN>\n``` [hub.docker](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fzenkiet\u002Ftraefik-tunnel-expose)\n\n",[34,269,270,284,294,305,316,324,352],{"__ignoreMap":47},[51,271,272,274,277,280],{"class":53,"line":54},[51,273,131],{"class":57},[51,275,276],{"class":69}," run",[51,278,279],{"class":61}," -d",[51,281,283],{"class":282},"s_hVV"," \\\n",[51,285,286,289,292],{"class":53,"line":158},[51,287,288],{"class":61},"  --name",[51,290,291],{"class":69}," cloudflared",[51,293,283],{"class":282},[51,295,297,300,303],{"class":53,"line":296},3,[51,298,299],{"class":61},"  --network",[51,301,302],{"class":69}," proxy_network",[51,304,283],{"class":282},[51,306,308,311,314],{"class":53,"line":307},4,[51,309,310],{"class":61},"  --restart",[51,312,313],{"class":69}," unless-stopped",[51,315,283],{"class":282},[51,317,319,322],{"class":53,"line":318},5,[51,320,321],{"class":69},"  cloudflare\u002Fcloudflared:latest",[51,323,283],{"class":282},[51,325,327,330,333,335,338,342,345,349],{"class":53,"line":326},6,[51,328,329],{"class":69},"  tunnel",[51,331,332],{"class":61}," --no-autoupdate",[51,334,276],{"class":69},[51,336,337],{"class":61}," --token",[51,339,341],{"class":340},"smGrS"," \u003C",[51,343,344],{"class":69},"YOUR_TUNNEL_TOKE",[51,346,348],{"class":347},"su5hD","N",[51,350,351],{"class":340},">\n",[51,353,355,358,361,364,367,370],{"class":53,"line":354},7,[51,356,357],{"class":65},"```",[51,359,360],{"class":65}," [",[51,362,363],{"class":69},"hub.docker",[51,365,366],{"class":65},"](",[51,368,369],{"class":57},"https:\u002F\u002Fhub.docker.com\u002Fr\u002Fzenkiet\u002Ftraefik-tunnel-expose",[51,371,372],{"class":65},")\n",[211,374,375,376,379,380,562,565,566],{},"Deploy Traefik via ",[34,377,378],{},"~\u002Ftraefik\u002Fdocker-compose.yml",":",[42,381,385],{"className":382,"code":383,"language":384,"meta":47,"style":47},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","name: global-proxy\nservices:\n  traefik:\n    image: traefik:latest\n    container_name: traefik\n    restart: unless-stopped\n    command:\n      - \"--api.insecure=false\"\n      - \"--providers.docker=true\"\n      - \"--providers.docker.exposedbydefault=false\"\n      - \"--entrypoints.web.address=:80\"\n    volumes:\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro\n    networks:\n      - proxy_network\nnetworks:\n  proxy_network:\n    external: true\n","yaml",[34,386,387,399,407,414,424,434,444,451,466,478,490,502,510,518,526,534,542,550],{"__ignoreMap":47},[51,388,389,393,396],{"class":53,"line":54},[51,390,392],{"class":391},"sQzsp","name",[51,394,379],{"class":395},"sP7_E",[51,397,398],{"class":69}," global-proxy\n",[51,400,401,404],{"class":53,"line":158},[51,402,403],{"class":391},"services",[51,405,406],{"class":395},":\n",[51,408,409,412],{"class":53,"line":296},[51,410,411],{"class":391},"  traefik",[51,413,406],{"class":395},[51,415,416,419,421],{"class":53,"line":307},[51,417,418],{"class":391},"    image",[51,420,379],{"class":395},[51,422,423],{"class":69}," traefik:latest\n",[51,425,426,429,431],{"class":53,"line":318},[51,427,428],{"class":391},"    container_name",[51,430,379],{"class":395},[51,432,433],{"class":69}," traefik\n",[51,435,436,439,441],{"class":53,"line":326},[51,437,438],{"class":391},"    restart",[51,440,379],{"class":395},[51,442,443],{"class":69}," unless-stopped\n",[51,445,446,449],{"class":53,"line":354},[51,447,448],{"class":391},"    command",[51,450,406],{"class":395},[51,452,454,457,460,463],{"class":53,"line":453},8,[51,455,456],{"class":395},"      -",[51,458,459],{"class":65}," \"",[51,461,462],{"class":69},"--api.insecure=false",[51,464,465],{"class":65},"\"\n",[51,467,469,471,473,476],{"class":53,"line":468},9,[51,470,456],{"class":395},[51,472,459],{"class":65},[51,474,475],{"class":69},"--providers.docker=true",[51,477,465],{"class":65},[51,479,481,483,485,488],{"class":53,"line":480},10,[51,482,456],{"class":395},[51,484,459],{"class":65},[51,486,487],{"class":69},"--providers.docker.exposedbydefault=false",[51,489,465],{"class":65},[51,491,493,495,497,500],{"class":53,"line":492},11,[51,494,456],{"class":395},[51,496,459],{"class":65},[51,498,499],{"class":69},"--entrypoints.web.address=:80",[51,501,465],{"class":65},[51,503,505,508],{"class":53,"line":504},12,[51,506,507],{"class":391},"    volumes",[51,509,406],{"class":395},[51,511,513,515],{"class":53,"line":512},13,[51,514,456],{"class":395},[51,516,517],{"class":69}," \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro\n",[51,519,521,524],{"class":53,"line":520},14,[51,522,523],{"class":391},"    networks",[51,525,406],{"class":395},[51,527,529,531],{"class":53,"line":528},15,[51,530,456],{"class":395},[51,532,533],{"class":69}," proxy_network\n",[51,535,537,540],{"class":53,"line":536},16,[51,538,539],{"class":391},"networks",[51,541,406],{"class":395},[51,543,545,548],{"class":53,"line":544},17,[51,546,547],{"class":391},"  proxy_network",[51,549,406],{"class":395},[51,551,553,556,558],{"class":53,"line":552},18,[51,554,555],{"class":391},"    external",[51,557,379],{"class":395},[51,559,561],{"class":560},"syTEX"," true\n",[563,564],"br",{},"Run: ",[34,567,568],{},"cd ~\u002Ftraefik && docker compose up -d",[211,570,571,572,575],{},"In Cloudflare Zero Trust, set public hostnames to ",[34,573,574],{},"http:\u002F\u002Ftraefik:80"," (not server IP).",[26,577,579],{"id":578},"app-deployment-patterns","App Deployment Patterns",[581,582,584],"h3",{"id":583},"pattern-a-single-container-app","Pattern A: Single Container App",[11,586,587],{},"Ideal for tools like Metabase—Traefik routes directly.",[11,589,590,591,379],{},"Example ",[34,592,593],{},"docker-compose.yml",[42,595,597],{"className":382,"code":596,"language":384,"meta":47,"style":47},"name: metabase\nservices:\n  metabase:\n    image: metabase\u002Fmetabase:latest\n    container_name: metabase\n    restart: unless-stopped\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.docker.network=proxy_network\"\n      - \"traefik.http.routers.metabase.rule=Host(`test-meta.arzlabserver.my.id`)\"\n      - \"traefik.http.routers.metabase.entrypoints=web\"\n      - \"traefik.http.services.metabase.loadbalancer.server.port=3000\"\n    volumes:\n      - metabase_data:\u002Fmetabase-data\n    networks:\n      - proxy_network\nvolumes: metabase_data:\nnetworks:\n  proxy_network:\n    external: true\n",[34,598,599,608,614,621,630,638,646,653,664,675,686,697,708,714,721,727,733,745,751,758],{"__ignoreMap":47},[51,600,601,603,605],{"class":53,"line":54},[51,602,392],{"class":391},[51,604,379],{"class":395},[51,606,607],{"class":69}," metabase\n",[51,609,610,612],{"class":53,"line":158},[51,611,403],{"class":391},[51,613,406],{"class":395},[51,615,616,619],{"class":53,"line":296},[51,617,618],{"class":391},"  metabase",[51,620,406],{"class":395},[51,622,623,625,627],{"class":53,"line":307},[51,624,418],{"class":391},[51,626,379],{"class":395},[51,628,629],{"class":69}," metabase\u002Fmetabase:latest\n",[51,631,632,634,636],{"class":53,"line":318},[51,633,428],{"class":391},[51,635,379],{"class":395},[51,637,607],{"class":69},[51,639,640,642,644],{"class":53,"line":326},[51,641,438],{"class":391},[51,643,379],{"class":395},[51,645,443],{"class":69},[51,647,648,651],{"class":53,"line":354},[51,649,650],{"class":391},"    labels",[51,652,406],{"class":395},[51,654,655,657,659,662],{"class":53,"line":453},[51,656,456],{"class":395},[51,658,459],{"class":65},[51,660,661],{"class":69},"traefik.enable=true",[51,663,465],{"class":65},[51,665,666,668,670,673],{"class":53,"line":468},[51,667,456],{"class":395},[51,669,459],{"class":65},[51,671,672],{"class":69},"traefik.docker.network=proxy_network",[51,674,465],{"class":65},[51,676,677,679,681,684],{"class":53,"line":480},[51,678,456],{"class":395},[51,680,459],{"class":65},[51,682,683],{"class":69},"traefik.http.routers.metabase.rule=Host(`test-meta.arzlabserver.my.id`)",[51,685,465],{"class":65},[51,687,688,690,692,695],{"class":53,"line":492},[51,689,456],{"class":395},[51,691,459],{"class":65},[51,693,694],{"class":69},"traefik.http.routers.metabase.entrypoints=web",[51,696,465],{"class":65},[51,698,699,701,703,706],{"class":53,"line":504},[51,700,456],{"class":395},[51,702,459],{"class":65},[51,704,705],{"class":69},"traefik.http.services.metabase.loadbalancer.server.port=3000",[51,707,465],{"class":65},[51,709,710,712],{"class":53,"line":512},[51,711,507],{"class":391},[51,713,406],{"class":395},[51,715,716,718],{"class":53,"line":520},[51,717,456],{"class":395},[51,719,720],{"class":69}," metabase_data:\u002Fmetabase-data\n",[51,722,723,725],{"class":53,"line":528},[51,724,523],{"class":391},[51,726,406],{"class":395},[51,728,729,731],{"class":53,"line":536},[51,730,456],{"class":395},[51,732,533],{"class":69},[51,734,735,738,740,743],{"class":53,"line":544},[51,736,737],{"class":391},"volumes",[51,739,379],{"class":395},[51,741,742],{"class":391}," metabase_data",[51,744,406],{"class":395},[51,746,747,749],{"class":53,"line":552},[51,748,539],{"class":391},[51,750,406],{"class":395},[51,752,754,756],{"class":53,"line":753},19,[51,755,547],{"class":391},[51,757,406],{"class":395},[51,759,761,763,765],{"class":53,"line":760},20,[51,762,555],{"class":391},[51,764,379],{"class":395},[51,766,561],{"class":560},[11,768,769,770,773],{},"Key: Match ",[34,771,772],{},"loadbalancer.server.port"," to app's internal port; no host port publishing.",[581,775,777],{"id":776},"pattern-b-monorepo-with-internal-nginx","Pattern B: Monorepo with Internal Nginx",[11,779,780],{},"For single-repo frontend\u002Fbackend, use app Nginx for \u002Fapi vs \u002F routing; Traefik handles hostname.",[11,782,783,784,787],{},"Nginx ",[34,785,786],{},"nginx.conf"," proxies \u002Fapi\u002F to backend:5000 and \u002F to frontend:3000.",[11,789,790],{},"Traefik labels on Nginx container point to its port 80.",[581,792,794],{"id":793},"separate-repositories","Separate Repositories",[11,796,797,798,801],{},"Frontend: Host rule for main domain.\nBackend: Host + PathPrefix(",[34,799,800],{},"\u002Fapi","); add StripPrefix middleware if backend expects clean paths.",[11,803,804],{},"Example backend labels:",[42,806,809],{"className":807,"code":808,"language":259},[257],"- \"traefik.http.routers.myapp-back.rule=Host(`app.arzlabserver.my.id`) && PathPrefix(`\u002Fapi`)\"\n- \"traefik.http.routers.myapp-back.middlewares=myapp-strip-api\"\n- \"traefik.http.middlewares.myapp-strip-api.stripprefix.prefixes=\u002Fapi\"\n",[34,810,808],{"__ignoreMap":47},[11,812,813,814,816],{},"Both join ",[34,815,228],{},".",[26,818,820],{"id":819},"deployment-checklist-and-standards","Deployment Checklist and Standards",[208,822,823,829,832],{},[211,824,825,826,828],{},"Create ",[34,827,228],{},", run cloudflared\u002FTraefik, configure Cloudflare hostnames.",[211,830,831],{},"Connect apps to network, add unique Traefik labels with internal ports.",[211,833,834,835,837],{},"Rules: Unique names, specify ",[34,836,672],{}," for multi-net containers, distinct staging\u002Fprod hosts, no host ports.",[26,839,841],{"id":840},"troubleshooting-tips","Troubleshooting Tips",[11,843,844,845,848],{},"Hostname resolves but app fails? Check Cloudflare points to ",[34,846,847],{},"traefik:80",". Bad gateway? Verify internal port and network label.",[11,850,851],{},"Use monorepo+Nginx for self-contained apps; separate repos for independent cycles under one domain.",[11,853,854],{},"Ready to deploy? Follow the checklist for your first zero-trust stack.",[154,856,857],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":47,"searchDepth":158,"depth":158,"links":859},[860,861,862,863,868,869],{"id":186,"depth":158,"text":187},{"id":196,"depth":158,"text":197},{"id":243,"depth":158,"text":244},{"id":578,"depth":158,"text":579,"children":864},[865,866,867],{"id":583,"depth":296,"text":584},{"id":776,"depth":296,"text":777},{"id":793,"depth":296,"text":794},{"id":819,"depth":158,"text":820},{"id":840,"depth":158,"text":841},"Learn the standard deployment architecture using Cloudflare Zero Trust Tunnel, Traefik reverse proxy, and Docker Compose for secure, zero-port apps.",{},"\u002Fblog\u002F2026\u002Fstandard-deployment-with-traefik","2026-04-21",{"title":177,"description":870},"blog\u002F2026\u002Fstandard-deployment-with-traefik",[877,878,879,880,881],"Docker","Traefik","Cloudflare Tunnel","Reverse Proxy","Deployment","Ys8gfq5PsoNxL7NUFnFJ5gc5R1ws5FhqGv3cJAMWkj8",{"id":884,"title":885,"author":178,"body":886,"description":1981,"draft":162,"extension":163,"featured":165,"meta":1982,"navigation":165,"ogImage":166,"path":1983,"pubDatetime":1984,"seo":1985,"stem":1986,"tags":1987,"__hash__":1992},"blog\u002Fblog\u002F2026\u002Fterminal-shortcut-windows.md","Create Custom Shortcuts in Windows Terminal",{"type":8,"value":887,"toc":1971},[888,892,896,899,902,905,909,912,922,1247,1253,1316,1323,1327,1330,1333,1359,1362,1386,1397,1401,1408,1414,1438,1444,1468,1472,1491,1496,1502,1507,1513,1516,1769,1773,1776,1782,1797,1803,1818,1822,1825,1834,1837,1954,1961,1965,1968],[15,889,891],{"id":890},"creating-custom-shortcuts-in-windows-terminal","Creating Custom Shortcuts in Windows Terminal",[26,893,895],{"id":894},"introduction","Introduction",[11,897,898],{},"As a developer, you likely rely on keyboard navigation for efficiency. Minimizing mouse usage streamlines your workflow by keeping your hands on the keys.",[11,900,901],{},"I use Windows Terminal daily to execute commands, but long or repetitive ones—like SSH connections or Docker stack management—can slow me down. To address this, I've created custom shortcuts (aliases and batch scripts) that drastically improve my productivity.",[11,903,904],{},"These shortcuts handle SSH access, Docker operations, system controls, file listings, and Git commands. Below, I'll walk you through each one.",[26,906,908],{"id":907},"ssh-shortcuts","SSH Shortcuts",[11,910,911],{},"Managing multiple VMs requires remembering usernames, IPs, and ports—tedious and error-prone. A simple batch script solves this.",[11,913,825,914,917,918,921],{},[34,915,916],{},"connect-ssh.bat"," in a directory like ",[34,919,920],{},"D:\\bin\\"," and add:",[42,923,925],{"className":44,"code":924,"language":46,"meta":47,"style":47},"@echo off\nsetlocal\n\n:: Define servers here\nif \"%1\"==\"\" goto usage\n\nif \"%1\"==\"vm1\" set SSH_CMD=ssh raspi01@192.168.147.91\nif \"%1\"==\"vm2\" set SSH_CMD=ssh -p 224 dev@localhost\nif \"%1\"==\"vm3\" set SSH_CMD=ssh -i C:\\\\Users\\\\Ariz.Muajianisan\\\\.ssh\\\\arizmuajianisan arizmuajianisan@34.61.28.179\n\n:: Add more servers as needed\n\n:: Run SSH command if defined\nif defined SSH_CMD (\n    %SSH_CMD%\n) else (\n    echo Unknown server: %1\n    goto usage\n)\n\nexit \u002Fb\n\n:usage\necho Usage: %0 [server-name]\necho Available servers:\necho   vm1\necho   vm2\necho   vm3\nexit \u002Fb\n",[34,926,927,935,940,945,960,981,985,1005,1030,1073,1077,1095,1099,1118,1131,1136,1141,1155,1162,1166,1170,1179,1184,1190,1205,1216,1224,1232,1240],{"__ignoreMap":47},[51,928,929,932],{"class":53,"line":54},[51,930,931],{"class":57},"@echo",[51,933,934],{"class":69}," off\n",[51,936,937],{"class":53,"line":158},[51,938,939],{"class":57},"setlocal\n",[51,941,942],{"class":53,"line":296},[51,943,944],{"emptyLinePlaceholder":165},"\n",[51,946,947,951,954,957],{"class":53,"line":307},[51,948,950],{"class":949},"sptTA","::",[51,952,953],{"class":69}," Define",[51,955,956],{"class":69}," servers",[51,958,959],{"class":69}," here\n",[51,961,962,966,969,972,975,978],{"class":53,"line":318},[51,963,965],{"class":964},"sVHd0","if",[51,967,968],{"class":57}," \"%1\"",[51,970,971],{"class":69},"==",[51,973,974],{"class":57},"\"\"",[51,976,977],{"class":69}," goto",[51,979,980],{"class":69}," usage\n",[51,982,983],{"class":53,"line":326},[51,984,944],{"emptyLinePlaceholder":165},[51,986,987,989,991,993,996,999,1002],{"class":53,"line":354},[51,988,965],{"class":964},[51,990,968],{"class":57},[51,992,971],{"class":69},[51,994,995],{"class":57},"\"vm1\"",[51,997,998],{"class":69}," set",[51,1000,1001],{"class":69}," SSH_CMD=ssh",[51,1003,1004],{"class":69}," raspi01@192.168.147.91\n",[51,1006,1007,1009,1011,1013,1016,1018,1020,1023,1027],{"class":53,"line":453},[51,1008,965],{"class":964},[51,1010,968],{"class":57},[51,1012,971],{"class":69},[51,1014,1015],{"class":57},"\"vm2\"",[51,1017,998],{"class":69},[51,1019,1001],{"class":69},[51,1021,1022],{"class":61}," -p",[51,1024,1026],{"class":1025},"srdBf"," 224",[51,1028,1029],{"class":69}," dev@localhost\n",[51,1031,1032,1034,1036,1038,1041,1043,1045,1047,1050,1053,1056,1058,1061,1063,1066,1068,1070],{"class":53,"line":468},[51,1033,965],{"class":964},[51,1035,968],{"class":57},[51,1037,971],{"class":69},[51,1039,1040],{"class":57},"\"vm3\"",[51,1042,998],{"class":69},[51,1044,1001],{"class":69},[51,1046,62],{"class":61},[51,1048,1049],{"class":69}," C:",[51,1051,1052],{"class":282},"\\\\",[51,1054,1055],{"class":69},"Users",[51,1057,1052],{"class":282},[51,1059,1060],{"class":69},"Ariz.Muajianisan",[51,1062,1052],{"class":282},[51,1064,1065],{"class":69},".ssh",[51,1067,1052],{"class":282},[51,1069,178],{"class":69},[51,1071,1072],{"class":69}," arizmuajianisan@34.61.28.179\n",[51,1074,1075],{"class":53,"line":480},[51,1076,944],{"emptyLinePlaceholder":165},[51,1078,1079,1081,1084,1087,1089,1092],{"class":53,"line":492},[51,1080,950],{"class":949},[51,1082,1083],{"class":69}," Add",[51,1085,1086],{"class":69}," more",[51,1088,956],{"class":69},[51,1090,1091],{"class":69}," as",[51,1093,1094],{"class":69}," needed\n",[51,1096,1097],{"class":53,"line":504},[51,1098,944],{"emptyLinePlaceholder":165},[51,1100,1101,1103,1106,1109,1112,1115],{"class":53,"line":512},[51,1102,950],{"class":949},[51,1104,1105],{"class":69}," Run",[51,1107,1108],{"class":69}," SSH",[51,1110,1111],{"class":69}," command",[51,1113,1114],{"class":69}," if",[51,1116,1117],{"class":69}," defined\n",[51,1119,1120,1122,1125,1128],{"class":53,"line":520},[51,1121,965],{"class":964},[51,1123,1124],{"class":57}," defined",[51,1126,1127],{"class":69}," SSH_CMD",[51,1129,1130],{"class":347}," (\n",[51,1132,1133],{"class":53,"line":528},[51,1134,1135],{"class":57},"    %SSH_CMD%\n",[51,1137,1138],{"class":53,"line":536},[51,1139,1140],{"class":347},") else (\n",[51,1142,1143,1146,1149,1152],{"class":53,"line":544},[51,1144,1145],{"class":949},"    echo",[51,1147,1148],{"class":69}," Unknown",[51,1150,1151],{"class":69}," server:",[51,1153,1154],{"class":69}," %1\n",[51,1156,1157,1160],{"class":53,"line":552},[51,1158,1159],{"class":57},"    goto",[51,1161,980],{"class":69},[51,1163,1164],{"class":53,"line":753},[51,1165,372],{"class":347},[51,1167,1168],{"class":53,"line":760},[51,1169,944],{"emptyLinePlaceholder":165},[51,1171,1173,1176],{"class":53,"line":1172},21,[51,1174,1175],{"class":949},"exit",[51,1177,1178],{"class":69}," \u002Fb\n",[51,1180,1182],{"class":53,"line":1181},22,[51,1183,944],{"emptyLinePlaceholder":165},[51,1185,1187],{"class":53,"line":1186},23,[51,1188,1189],{"class":57},":usage\n",[51,1191,1193,1196,1199,1202],{"class":53,"line":1192},24,[51,1194,1195],{"class":949},"echo",[51,1197,1198],{"class":69}," Usage:",[51,1200,1201],{"class":69}," %0",[51,1203,1204],{"class":347}," [server-name]\n",[51,1206,1208,1210,1213],{"class":53,"line":1207},25,[51,1209,1195],{"class":949},[51,1211,1212],{"class":69}," Available",[51,1214,1215],{"class":69}," servers:\n",[51,1217,1219,1221],{"class":53,"line":1218},26,[51,1220,1195],{"class":949},[51,1222,1223],{"class":69},"   vm1\n",[51,1225,1227,1229],{"class":53,"line":1226},27,[51,1228,1195],{"class":949},[51,1230,1231],{"class":69},"   vm2\n",[51,1233,1235,1237],{"class":53,"line":1234},28,[51,1236,1195],{"class":949},[51,1238,1239],{"class":69},"   vm3\n",[51,1241,1243,1245],{"class":53,"line":1242},29,[51,1244,1175],{"class":949},[51,1246,1178],{"class":69},[11,1248,1249,1250],{},"Then add this to the ",[34,1251,1252],{},"$PROFILE",[42,1254,1256],{"className":44,"code":1255,"language":46,"meta":47,"style":47},"# SSH\n\nfunction sshConnect {\n    param ([string]$vm)\n    & \"D:\\bin\\ssh-connect.bat\" $vm\n}\nSet-Alias shc sshConnect\n",[34,1257,1258,1264,1268,1281,1289,1300,1305],{"__ignoreMap":47},[51,1259,1260],{"class":53,"line":54},[51,1261,1263],{"class":1262},"sutJx","# SSH\n",[51,1265,1266],{"class":53,"line":158},[51,1267,944],{"emptyLinePlaceholder":165},[51,1269,1270,1274,1278],{"class":53,"line":296},[51,1271,1273],{"class":1272},"sbsja","function",[51,1275,1277],{"class":1276},"sGLFI"," sshConnect",[51,1279,1280],{"class":395}," {\n",[51,1282,1283,1286],{"class":53,"line":307},[51,1284,1285],{"class":57},"    param",[51,1287,1288],{"class":347}," ([string]$vm)\n",[51,1290,1291,1294,1297],{"class":53,"line":318},[51,1292,1293],{"class":395},"    &",[51,1295,1296],{"class":57}," \"D:\\bin\\ssh-connect.bat\"",[51,1298,1299],{"class":347}," $vm\n",[51,1301,1302],{"class":53,"line":326},[51,1303,1304],{"class":395},"}\n",[51,1306,1307,1310,1313],{"class":53,"line":354},[51,1308,1309],{"class":57},"Set-Alias",[51,1311,1312],{"class":69}," shc",[51,1314,1315],{"class":69}," sshConnect\n",[11,1317,1318,1319,1322],{},"Now, connect with a single alias: ",[34,1320,1321],{},"shc vm1",". No more memorizing credentials—just intuitive server names.",[26,1324,1326],{"id":1325},"docker-management","Docker Management",[11,1328,1329],{},"I've defined two PowerShell aliases for Docker Compose stacks.",[11,1331,1332],{},"For starting in detached mode:",[42,1334,1338],{"className":1335,"code":1336,"language":1337,"meta":47,"style":47},"language-powershell shiki shiki-themes material-theme-lighter github-light github-dark","function dockerComposeUpDetach {\n    docker compose up -d\n}\nSet-Alias dup dockerComposeUpDetach\n","powershell",[34,1339,1340,1345,1350,1354],{"__ignoreMap":47},[51,1341,1342],{"class":53,"line":54},[51,1343,1344],{},"function dockerComposeUpDetach {\n",[51,1346,1347],{"class":53,"line":158},[51,1348,1349],{},"    docker compose up -d\n",[51,1351,1352],{"class":53,"line":296},[51,1353,1304],{},[51,1355,1356],{"class":53,"line":307},[51,1357,1358],{},"Set-Alias dup dockerComposeUpDetach\n",[11,1360,1361],{},"For stopping (with optional volume removal):",[42,1363,1365],{"className":1335,"code":1364,"language":1337,"meta":47,"style":47},"function dockerComposeDownRemVolume {\n    docker compose down @args\n}\nSet-Alias ddown dockerComposeDownRemVolume\n",[34,1366,1367,1372,1377,1381],{"__ignoreMap":47},[51,1368,1369],{"class":53,"line":54},[51,1370,1371],{},"function dockerComposeDownRemVolume {\n",[51,1373,1374],{"class":53,"line":158},[51,1375,1376],{},"    docker compose down @args\n",[51,1378,1379],{"class":53,"line":296},[51,1380,1304],{},[51,1382,1383],{"class":53,"line":307},[51,1384,1385],{},"Set-Alias ddown dockerComposeDownRemVolume\n",[11,1387,1388,1389,1392,1393,1396],{},"Run ",[34,1390,1391],{},"dup"," to start, or ",[34,1394,1395],{},"ddown -v"," to stop and remove volumes. Simple and flexible.",[26,1398,1400],{"id":1399},"system-operations","System Operations",[11,1402,1403,1404,1407],{},"Built-in commands like ",[34,1405,1406],{},"shutdown"," work, but they're verbose. My aliases make them snappier.",[11,1409,1410,1411],{},"Instant shutdown: ",[34,1412,1413],{},"mati",[42,1415,1417],{"className":1335,"code":1416,"language":1337,"meta":47,"style":47},"function fastShutdown {\n    shutdown \u002Fs \u002Ff \u002Ft 1\n}\nSet-Alias mati fastShutdown\n",[34,1418,1419,1424,1429,1433],{"__ignoreMap":47},[51,1420,1421],{"class":53,"line":54},[51,1422,1423],{},"function fastShutdown {\n",[51,1425,1426],{"class":53,"line":158},[51,1427,1428],{},"    shutdown \u002Fs \u002Ff \u002Ft 1\n",[51,1430,1431],{"class":53,"line":296},[51,1432,1304],{},[51,1434,1435],{"class":53,"line":307},[51,1436,1437],{},"Set-Alias mati fastShutdown\n",[11,1439,1440,1441],{},"Quick restart: ",[34,1442,1443],{},"restart",[42,1445,1447],{"className":1335,"code":1446,"language":1337,"meta":47,"style":47},"function fastRestart {\n    shutdown \u002Fr \u002Ff \u002Ft 1\n}\nSet-Alias restart fastRestart\n",[34,1448,1449,1454,1459,1463],{"__ignoreMap":47},[51,1450,1451],{"class":53,"line":54},[51,1452,1453],{},"function fastRestart {\n",[51,1455,1456],{"class":53,"line":158},[51,1457,1458],{},"    shutdown \u002Fr \u002Ff \u002Ft 1\n",[51,1460,1461],{"class":53,"line":296},[51,1462,1304],{},[51,1464,1465],{"class":53,"line":307},[51,1466,1467],{},"Set-Alias restart fastRestart\n",[26,1469,1471],{"id":1470},"enhanced-file-listings","Enhanced File Listings",[11,1473,1474,1475,1478,1479,1482,1483,1486,1487,1490],{},"PowerShell's ",[34,1476,1477],{},"ls"," lacks human-readable sizes by default. My ",[34,1480,1481],{},"lsh"," (list with sizes) and ",[34,1484,1485],{},"lshd"," (directories only) fix that, with optional sorting (",[34,1488,1489],{},"-s",").",[11,1492,590,1493,1495],{},[34,1494,1481],{}," output:",[42,1497,1500],{"className":1498,"code":1499,"language":259},[257],"Name                 Size      Mode  LastWriteTime\n----                 ----      ----  -------------\n.astro               -         d---- 2\u002F26\u002F2026 12:31:46 AM\n.github              -         d---- 11\u002F22\u002F2025 4:04:00 AM\n...\npackage-lock.json    381.30 KB -a--- 12\u002F9\u002F2025 3:40:28 PM\n",[34,1501,1499],{"__ignoreMap":47},[11,1503,1504,1506],{},[34,1505,1485],{}," shows directory sizes:",[42,1508,1511],{"className":1509,"code":1510,"language":259},[257],"Name         Size\n----         ----\nnode_modules 844.18 MB\ndist         6.51 MB\n...\n",[34,1512,1510],{"__ignoreMap":47},[11,1514,1515],{},"Full functions (add to your profile):",[42,1517,1519],{"className":1335,"code":1518,"language":1337,"meta":47,"style":47},"function lsh {\n    param([switch]$d, [switch]$s)\n    $items = Get-ChildItem\n    if ($s) {\n        $items = $items | Sort-Object @{\n            Expression = {\n                if ($_.PSIsContainer -and $d) {\n                    (Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum\n                } else {\n                    $_.Length\n                }\n            }\n        } -Descending\n    }\n    $items | Select-Object Name, @{\n        Name = \"Size\"; Expression = {\n            if ($_.PSIsContainer) {\n                if ($d) {\n                    $size = (Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum\n                    if ($size -ge 1GB) { \"{0:N2} GB\" -f ($size \u002F 1GB) }\n                    elseif ($size -ge 1MB) { \"{0:N2} MB\" -f ($size \u002F 1MB) }\n                    elseif ($size -ge 1KB) { \"{0:N2} KB\" -f ($size \u002F 1KB) }\n                    else { \"$size B\" }\n                } else { \"-\" }\n            } else {\n                $len = $_.Length\n                if ($len -ge 1GB) { \"{0:N2} GB\" -f ($len \u002F 1GB) }\n                elseif ($len -ge 1MB) { \"{0:N2} MB\" -f ($len \u002F 1MB) }\n                elseif ($len -ge 1KB) { \"{0:N2} KB\" -f ($len \u002F 1KB) }\n                else { \"$len B\" }\n            }\n        }\n    }, Mode, LastWriteTime\n}\n\nfunction lshd {\n    Get-ChildItem -Directory | ForEach-Object {\n        $size = (Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum\n        [PSCustomObject]@{\n            Name = $_.Name\n            Size = if ($size -ge 1GB) { \"{0:N2} GB\" -f ($size \u002F 1GB) }\n                   elseif ($size -ge 1MB) { \"{0:N2} MB\" -f ($size \u002F 1MB) }\n                   elseif ($size -ge 1KB) { \"{0:N2} KB\" -f ($size \u002F 1KB) }\n                   else { \"$size B\" }\n        }\n    } | Sort-Object { [double]($_.Size -replace '[^0-9.]') } -Descending\n}\n",[34,1520,1521,1526,1531,1536,1541,1546,1551,1556,1561,1566,1571,1576,1581,1586,1591,1596,1601,1606,1611,1616,1621,1626,1631,1636,1641,1646,1651,1656,1661,1666,1672,1677,1683,1689,1694,1699,1705,1711,1717,1723,1729,1735,1741,1747,1753,1758,1764],{"__ignoreMap":47},[51,1522,1523],{"class":53,"line":54},[51,1524,1525],{},"function lsh {\n",[51,1527,1528],{"class":53,"line":158},[51,1529,1530],{},"    param([switch]$d, [switch]$s)\n",[51,1532,1533],{"class":53,"line":296},[51,1534,1535],{},"    $items = Get-ChildItem\n",[51,1537,1538],{"class":53,"line":307},[51,1539,1540],{},"    if ($s) {\n",[51,1542,1543],{"class":53,"line":318},[51,1544,1545],{},"        $items = $items | Sort-Object @{\n",[51,1547,1548],{"class":53,"line":326},[51,1549,1550],{},"            Expression = {\n",[51,1552,1553],{"class":53,"line":354},[51,1554,1555],{},"                if ($_.PSIsContainer -and $d) {\n",[51,1557,1558],{"class":53,"line":453},[51,1559,1560],{},"                    (Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum\n",[51,1562,1563],{"class":53,"line":468},[51,1564,1565],{},"                } else {\n",[51,1567,1568],{"class":53,"line":480},[51,1569,1570],{},"                    $_.Length\n",[51,1572,1573],{"class":53,"line":492},[51,1574,1575],{},"                }\n",[51,1577,1578],{"class":53,"line":504},[51,1579,1580],{},"            }\n",[51,1582,1583],{"class":53,"line":512},[51,1584,1585],{},"        } -Descending\n",[51,1587,1588],{"class":53,"line":520},[51,1589,1590],{},"    }\n",[51,1592,1593],{"class":53,"line":528},[51,1594,1595],{},"    $items | Select-Object Name, @{\n",[51,1597,1598],{"class":53,"line":536},[51,1599,1600],{},"        Name = \"Size\"; Expression = {\n",[51,1602,1603],{"class":53,"line":544},[51,1604,1605],{},"            if ($_.PSIsContainer) {\n",[51,1607,1608],{"class":53,"line":552},[51,1609,1610],{},"                if ($d) {\n",[51,1612,1613],{"class":53,"line":753},[51,1614,1615],{},"                    $size = (Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum\n",[51,1617,1618],{"class":53,"line":760},[51,1619,1620],{},"                    if ($size -ge 1GB) { \"{0:N2} GB\" -f ($size \u002F 1GB) }\n",[51,1622,1623],{"class":53,"line":1172},[51,1624,1625],{},"                    elseif ($size -ge 1MB) { \"{0:N2} MB\" -f ($size \u002F 1MB) }\n",[51,1627,1628],{"class":53,"line":1181},[51,1629,1630],{},"                    elseif ($size -ge 1KB) { \"{0:N2} KB\" -f ($size \u002F 1KB) }\n",[51,1632,1633],{"class":53,"line":1186},[51,1634,1635],{},"                    else { \"$size B\" }\n",[51,1637,1638],{"class":53,"line":1192},[51,1639,1640],{},"                } else { \"-\" }\n",[51,1642,1643],{"class":53,"line":1207},[51,1644,1645],{},"            } else {\n",[51,1647,1648],{"class":53,"line":1218},[51,1649,1650],{},"                $len = $_.Length\n",[51,1652,1653],{"class":53,"line":1226},[51,1654,1655],{},"                if ($len -ge 1GB) { \"{0:N2} GB\" -f ($len \u002F 1GB) }\n",[51,1657,1658],{"class":53,"line":1234},[51,1659,1660],{},"                elseif ($len -ge 1MB) { \"{0:N2} MB\" -f ($len \u002F 1MB) }\n",[51,1662,1663],{"class":53,"line":1242},[51,1664,1665],{},"                elseif ($len -ge 1KB) { \"{0:N2} KB\" -f ($len \u002F 1KB) }\n",[51,1667,1669],{"class":53,"line":1668},30,[51,1670,1671],{},"                else { \"$len B\" }\n",[51,1673,1675],{"class":53,"line":1674},31,[51,1676,1580],{},[51,1678,1680],{"class":53,"line":1679},32,[51,1681,1682],{},"        }\n",[51,1684,1686],{"class":53,"line":1685},33,[51,1687,1688],{},"    }, Mode, LastWriteTime\n",[51,1690,1692],{"class":53,"line":1691},34,[51,1693,1304],{},[51,1695,1697],{"class":53,"line":1696},35,[51,1698,944],{"emptyLinePlaceholder":165},[51,1700,1702],{"class":53,"line":1701},36,[51,1703,1704],{},"function lshd {\n",[51,1706,1708],{"class":53,"line":1707},37,[51,1709,1710],{},"    Get-ChildItem -Directory | ForEach-Object {\n",[51,1712,1714],{"class":53,"line":1713},38,[51,1715,1716],{},"        $size = (Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum\n",[51,1718,1720],{"class":53,"line":1719},39,[51,1721,1722],{},"        [PSCustomObject]@{\n",[51,1724,1726],{"class":53,"line":1725},40,[51,1727,1728],{},"            Name = $_.Name\n",[51,1730,1732],{"class":53,"line":1731},41,[51,1733,1734],{},"            Size = if ($size -ge 1GB) { \"{0:N2} GB\" -f ($size \u002F 1GB) }\n",[51,1736,1738],{"class":53,"line":1737},42,[51,1739,1740],{},"                   elseif ($size -ge 1MB) { \"{0:N2} MB\" -f ($size \u002F 1MB) }\n",[51,1742,1744],{"class":53,"line":1743},43,[51,1745,1746],{},"                   elseif ($size -ge 1KB) { \"{0:N2} KB\" -f ($size \u002F 1KB) }\n",[51,1748,1750],{"class":53,"line":1749},44,[51,1751,1752],{},"                   else { \"$size B\" }\n",[51,1754,1756],{"class":53,"line":1755},45,[51,1757,1682],{},[51,1759,1761],{"class":53,"line":1760},46,[51,1762,1763],{},"    } | Sort-Object { [double]($_.Size -replace '[^0-9.]') } -Descending\n",[51,1765,1767],{"class":53,"line":1766},47,[51,1768,1304],{},[26,1770,1772],{"id":1771},"git-shortcuts","Git Shortcuts",[11,1774,1775],{},"Frequent Git commands deserve aliases too.",[11,1777,1778,1781],{},[34,1779,1780],{},"stats"," for status:",[42,1783,1785],{"className":1335,"code":1784,"language":1337,"meta":47,"style":47},"function GitStatus { git status }\nSet-Alias stats GitStatus\n",[34,1786,1787,1792],{"__ignoreMap":47},[51,1788,1789],{"class":53,"line":54},[51,1790,1791],{},"function GitStatus { git status }\n",[51,1793,1794],{"class":53,"line":158},[51,1795,1796],{},"Set-Alias stats GitStatus\n",[11,1798,1799,1802],{},[34,1800,1801],{},"commit"," for commits:",[42,1804,1806],{"className":1335,"code":1805,"language":1337,"meta":47,"style":47},"function GitCommit { git commit }\nSet-Alias commit GitCommit\n",[34,1807,1808,1813],{"__ignoreMap":47},[51,1809,1810],{"class":53,"line":54},[51,1811,1812],{},"function GitCommit { git commit }\n",[51,1814,1815],{"class":53,"line":158},[51,1816,1817],{},"Set-Alias commit GitCommit\n",[26,1819,1821],{"id":1820},"complete-setup","Complete Setup",[11,1823,1824],{},"Add all aliases to your PowerShell profile for persistence. Edit it with:",[42,1826,1828],{"className":1335,"code":1827,"language":1337,"meta":47,"style":47},"nano $PROFILE\n",[34,1829,1830],{"__ignoreMap":47},[51,1831,1832],{"class":53,"line":54},[51,1833,1827],{},[11,1835,1836],{},"Paste this complete script:",[42,1838,1840],{"className":1335,"code":1839,"language":1337,"meta":47,"style":47},"# Custom Listing Functions (lsh \u002F lshd)\nfunction lsh { ... }  # (Insert full lsh function from above)\nfunction lshd { ... } # (Insert full lshd function from above)\n\n# SSH\nfunction sshConnect { param ([string]$vm); & \"D:\\\\bin\\\\ssh-connect.bat\" $vm }\nSet-Alias shc sshConnect\n\n# Docker\nfunction dockerComposeUpDetach { docker compose up -d }\nSet-Alias dup dockerComposeUpDetach\nfunction dockerComposeDownRemVolume { docker compose down @args }\nSet-Alias ddown dockerComposeDownRemVolume\n\n# OS\nfunction fastShutdown { shutdown \u002Fs \u002Ff \u002Ft 1 }\nSet-Alias mati fastShutdown\nfunction fastRestart { shutdown \u002Fr \u002Ff \u002Ft 1 }\nSet-Alias restart fastRestart\n\n# Git\nfunction GitStatus { git status }\nSet-Alias stats GitStatus\nfunction GitCommit { git commit }\nSet-Alias commit GitCommit\n",[34,1841,1842,1847,1852,1857,1861,1865,1870,1875,1879,1884,1889,1893,1898,1902,1906,1911,1916,1920,1925,1929,1933,1938,1942,1946,1950],{"__ignoreMap":47},[51,1843,1844],{"class":53,"line":54},[51,1845,1846],{},"# Custom Listing Functions (lsh \u002F lshd)\n",[51,1848,1849],{"class":53,"line":158},[51,1850,1851],{},"function lsh { ... }  # (Insert full lsh function from above)\n",[51,1853,1854],{"class":53,"line":296},[51,1855,1856],{},"function lshd { ... } # (Insert full lshd function from above)\n",[51,1858,1859],{"class":53,"line":307},[51,1860,944],{"emptyLinePlaceholder":165},[51,1862,1863],{"class":53,"line":318},[51,1864,1263],{},[51,1866,1867],{"class":53,"line":326},[51,1868,1869],{},"function sshConnect { param ([string]$vm); & \"D:\\\\bin\\\\ssh-connect.bat\" $vm }\n",[51,1871,1872],{"class":53,"line":354},[51,1873,1874],{},"Set-Alias shc sshConnect\n",[51,1876,1877],{"class":53,"line":453},[51,1878,944],{"emptyLinePlaceholder":165},[51,1880,1881],{"class":53,"line":468},[51,1882,1883],{},"# Docker\n",[51,1885,1886],{"class":53,"line":480},[51,1887,1888],{},"function dockerComposeUpDetach { docker compose up -d }\n",[51,1890,1891],{"class":53,"line":492},[51,1892,1358],{},[51,1894,1895],{"class":53,"line":504},[51,1896,1897],{},"function dockerComposeDownRemVolume { docker compose down @args }\n",[51,1899,1900],{"class":53,"line":512},[51,1901,1385],{},[51,1903,1904],{"class":53,"line":520},[51,1905,944],{"emptyLinePlaceholder":165},[51,1907,1908],{"class":53,"line":528},[51,1909,1910],{},"# OS\n",[51,1912,1913],{"class":53,"line":536},[51,1914,1915],{},"function fastShutdown { shutdown \u002Fs \u002Ff \u002Ft 1 }\n",[51,1917,1918],{"class":53,"line":544},[51,1919,1437],{},[51,1921,1922],{"class":53,"line":552},[51,1923,1924],{},"function fastRestart { shutdown \u002Fr \u002Ff \u002Ft 1 }\n",[51,1926,1927],{"class":53,"line":753},[51,1928,1467],{},[51,1930,1931],{"class":53,"line":760},[51,1932,944],{"emptyLinePlaceholder":165},[51,1934,1935],{"class":53,"line":1172},[51,1936,1937],{},"# Git\n",[51,1939,1940],{"class":53,"line":1181},[51,1941,1791],{},[51,1943,1944],{"class":53,"line":1186},[51,1945,1796],{},[51,1947,1948],{"class":53,"line":1192},[51,1949,1812],{},[51,1951,1952],{"class":53,"line":1207},[51,1953,1817],{},[11,1955,1956,1957,1960],{},"Reload with ",[34,1958,1959],{},". $PROFILE",". You're set!",[26,1962,1964],{"id":1963},"final-notes","Final Notes",[11,1966,1967],{},"These shortcuts are tailored for Windows PowerShell in Terminal. Adapt for Linux\u002FmacOS (e.g., Bash aliases or Zsh). Test thoroughly, especially SSH and shutdown commands.",[154,1969,1970],{},"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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":47,"searchDepth":158,"depth":158,"links":1972},[1973,1974,1975,1976,1977,1978,1979,1980],{"id":894,"depth":158,"text":895},{"id":907,"depth":158,"text":908},{"id":1325,"depth":158,"text":1326},{"id":1399,"depth":158,"text":1400},{"id":1470,"depth":158,"text":1471},{"id":1771,"depth":158,"text":1772},{"id":1820,"depth":158,"text":1821},{"id":1963,"depth":158,"text":1964},"Step-by-step guide to creating custom shortcuts in Windows Terminal for faster workflows",{},"\u002Fblog\u002F2026\u002Fterminal-shortcut-windows","2026-04-06",{"title":885,"description":1981},"blog\u002F2026\u002Fterminal-shortcut-windows",[1988,1989,1337,1990,1991],"terminal","windows","productivity","shortcuts","eD186X_-LB27FcobkZuOsd8jJ3BDFjF0__DlkgMWSsM",{"id":1994,"title":1995,"author":178,"body":1996,"description":3973,"draft":162,"extension":163,"featured":162,"meta":3974,"navigation":165,"ogImage":166,"path":3975,"pubDatetime":3976,"seo":3977,"stem":3978,"tags":3979,"__hash__":3984},"blog\u002Fblog\u002F2026\u002Finstall-nullclaw-ubuntu.md","How to Install and Configure Nullclaw on Ubuntu",{"type":8,"value":1997,"toc":3918},[1998,2000,2006,2009,2013,2016,2033,2037,2040,2110,2114,2117,2147,2151,2154,2234,2244,2248,2251,2255,2258,2365,2368,2374,2378,2381,2401,2404,2408,2411,2423,2427,2430,2468,2472,2475,2495,2501,2505,2508,2523,2526,2532,2536,2539,2559,2563,2566,2626,2630,2633,2648,2651,2655,2671,2675,2688,2692,2720,2724,2727,2752,2758,2762,2765,2778,2781,2785,2871,2875,2995,2999,3002,3006,3018,3021,3025,3037,3041,3053,3057,3061,3072,3076,3100,3104,3107,3160,3164,3168,3174,3180,3196,3199,3212,3216,3221,3226,3240,3243,3260,3264,3269,3274,3289,3293,3298,3303,3317,3321,3326,3333,3362,3365,3369,3373,3379,3486,3490,3493,3595,3599,3602,3668,3672,3675,3754,3758,3761,3834,3838,3841,3875,3879,3902,3906,3909,3912,3915],[26,1999,895],{"id":894},[11,2001,2002,2005],{},[204,2003,2004],{},"Nullclaw"," is a powerful AI assistant that runs locally on your machine, giving you control over your data while providing intelligent automation and conversation capabilities. Unlike cloud-only assistants, Nullclaw operates from your own workspace, integrates with messaging platforms like Telegram, and can execute system tasks.",[11,2007,2008],{},"After struggling with the official documentation and finding scattered information online, I've compiled this comprehensive guide to help you install and configure Nullclaw on Ubuntu Linux from scratch.",[26,2010,2012],{"id":2011},"prerequisites","Prerequisites",[11,2014,2015],{},"Before we begin, ensure you have:",[208,2017,2018,2021,2024,2027,2030],{},[211,2019,2020],{},"Ubuntu 20.04 or later (tested on Ubuntu 24.04)",[211,2022,2023],{},"A stable internet connection",[211,2025,2026],{},"Sudo\u002Fadministrator access",[211,2028,2029],{},"About 500MB free disk space",[211,2031,2032],{},"Basic familiarity with the terminal",[26,2034,2036],{"id":2035},"system-specifications","System Specifications",[11,2038,2039],{},"This tutorial was tested on the following setup:",[2041,2042,2043,2056],"table",{},[2044,2045,2046],"thead",{},[2047,2048,2049,2053],"tr",{},[2050,2051,2052],"th",{},"Component",[2050,2054,2055],{},"Specification",[2057,2058,2059,2070,2080,2090,2100],"tbody",{},[2047,2060,2061,2067],{},[2062,2063,2064],"td",{},[204,2065,2066],{},"OS",[2062,2068,2069],{},"Ubuntu 24.04 LTS",[2047,2071,2072,2077],{},[2062,2073,2074],{},[204,2075,2076],{},"Kernel",[2062,2078,2079],{},"6.17.0-14-generic",[2047,2081,2082,2087],{},[2062,2083,2084],{},[204,2085,2086],{},"Architecture",[2062,2088,2089],{},"x86_64 (64-bit)",[2047,2091,2092,2097],{},[2062,2093,2094],{},[204,2095,2096],{},"Zig Version",[2062,2098,2099],{},"0.15.2",[2047,2101,2102,2107],{},[2062,2103,2104],{},[204,2105,2106],{},"Disk Space",[2062,2108,2109],{},"25GB (recommended minimum)",[26,2111,2113],{"id":2112},"step-1-update-your-system","Step 1: Update Your System",[11,2115,2116],{},"Start by updating your system packages to ensure you have the latest security patches and dependencies:",[42,2118,2120],{"className":44,"code":2119,"language":46,"meta":47,"style":47},"sudo apt update && sudo apt upgrade -y\n",[34,2121,2122],{"__ignoreMap":47},[51,2123,2124,2127,2130,2133,2136,2139,2141,2144],{"class":53,"line":54},[51,2125,2126],{"class":57},"sudo",[51,2128,2129],{"class":69}," apt",[51,2131,2132],{"class":69}," update",[51,2134,2135],{"class":395}," &&",[51,2137,2138],{"class":57}," sudo",[51,2140,2129],{"class":69},[51,2142,2143],{"class":69}," upgrade",[51,2145,2146],{"class":61}," -y\n",[26,2148,2150],{"id":2149},"step-2-install-essential-dependencies","Step 2: Install Essential Dependencies",[11,2152,2153],{},"Nullclaw requires several development tools and libraries. Install them all at once:",[42,2155,2157],{"className":44,"code":2156,"language":46,"meta":47,"style":47},"sudo apt install -y \\\n    curl \\\n    wget \\\n    git \\\n    build-essential \\\n    ca-certificates \\\n    gnupg \\\n    lsb-release \\\n    unzip \\\n    libsqlite3-dev\n",[34,2158,2159,2173,2180,2187,2194,2201,2208,2215,2222,2229],{"__ignoreMap":47},[51,2160,2161,2163,2165,2168,2171],{"class":53,"line":54},[51,2162,2126],{"class":57},[51,2164,2129],{"class":69},[51,2166,2167],{"class":69}," install",[51,2169,2170],{"class":61}," -y",[51,2172,283],{"class":282},[51,2174,2175,2178],{"class":53,"line":158},[51,2176,2177],{"class":69},"    curl",[51,2179,283],{"class":282},[51,2181,2182,2185],{"class":53,"line":296},[51,2183,2184],{"class":69},"    wget",[51,2186,283],{"class":282},[51,2188,2189,2192],{"class":53,"line":307},[51,2190,2191],{"class":69},"    git",[51,2193,283],{"class":282},[51,2195,2196,2199],{"class":53,"line":318},[51,2197,2198],{"class":69},"    build-essential",[51,2200,283],{"class":282},[51,2202,2203,2206],{"class":53,"line":326},[51,2204,2205],{"class":69},"    ca-certificates",[51,2207,283],{"class":282},[51,2209,2210,2213],{"class":53,"line":354},[51,2211,2212],{"class":69},"    gnupg",[51,2214,283],{"class":282},[51,2216,2217,2220],{"class":53,"line":453},[51,2218,2219],{"class":69},"    lsb-release",[51,2221,283],{"class":282},[51,2223,2224,2227],{"class":53,"line":468},[51,2225,2226],{"class":69},"    unzip",[51,2228,283],{"class":282},[51,2230,2231],{"class":53,"line":480},[51,2232,2233],{"class":69},"    libsqlite3-dev\n",[11,2235,2236,2239,2240,2243],{},[204,2237,2238],{},"Note:"," The ",[34,2241,2242],{},"libsqlite3-dev"," package is crucial for Nullclaw's memory functionality. Without it, the build process will fail.",[26,2245,2247],{"id":2246},"step-3-install-zig-programming-language","Step 3: Install Zig Programming Language",[11,2249,2250],{},"Nullclaw is written in Zig, so we need to install the Zig compiler first.",[581,2252,2254],{"id":2253},"option-a-install-from-official-releases-recommended","Option A: Install from Official Releases (Recommended)",[11,2256,2257],{},"Download and install Zig version 0.15.2:",[42,2259,2261],{"className":44,"code":2260,"language":46,"meta":47,"style":47},"# Download Zig 0.15.2 for Linux x86_64\ncurl https:\u002F\u002Fziglang.org\u002Fdownload\u002F0.15.2\u002Fzig-linux-x86_64-0.15.2.tar.xz -o zig.tar.xz\n\n# Extract the archive\ntar -xf zig.tar.xz\n\n# Move to system directory\nsudo mv zig-linux-x86_64-0.15.2\u002F \u002Fusr\u002Flocal\u002Fzig\n\n# Create symbolic link for easy access\nsudo ln -s \u002Fusr\u002Flocal\u002Fzig\u002Fzig \u002Fusr\u002Flocal\u002Fbin\u002Fzig\n\n# Verify installation\nzig version\n",[34,2262,2263,2268,2282,2286,2291,2301,2305,2310,2323,2327,2332,2348,2352,2357],{"__ignoreMap":47},[51,2264,2265],{"class":53,"line":54},[51,2266,2267],{"class":1262},"# Download Zig 0.15.2 for Linux x86_64\n",[51,2269,2270,2273,2276,2279],{"class":53,"line":158},[51,2271,2272],{"class":57},"curl",[51,2274,2275],{"class":69}," https:\u002F\u002Fziglang.org\u002Fdownload\u002F0.15.2\u002Fzig-linux-x86_64-0.15.2.tar.xz",[51,2277,2278],{"class":61}," -o",[51,2280,2281],{"class":69}," zig.tar.xz\n",[51,2283,2284],{"class":53,"line":296},[51,2285,944],{"emptyLinePlaceholder":165},[51,2287,2288],{"class":53,"line":307},[51,2289,2290],{"class":1262},"# Extract the archive\n",[51,2292,2293,2296,2299],{"class":53,"line":318},[51,2294,2295],{"class":57},"tar",[51,2297,2298],{"class":61}," -xf",[51,2300,2281],{"class":69},[51,2302,2303],{"class":53,"line":326},[51,2304,944],{"emptyLinePlaceholder":165},[51,2306,2307],{"class":53,"line":354},[51,2308,2309],{"class":1262},"# Move to system directory\n",[51,2311,2312,2314,2317,2320],{"class":53,"line":453},[51,2313,2126],{"class":57},[51,2315,2316],{"class":69}," mv",[51,2318,2319],{"class":69}," zig-linux-x86_64-0.15.2\u002F",[51,2321,2322],{"class":69}," \u002Fusr\u002Flocal\u002Fzig\n",[51,2324,2325],{"class":53,"line":468},[51,2326,944],{"emptyLinePlaceholder":165},[51,2328,2329],{"class":53,"line":480},[51,2330,2331],{"class":1262},"# Create symbolic link for easy access\n",[51,2333,2334,2336,2339,2342,2345],{"class":53,"line":492},[51,2335,2126],{"class":57},[51,2337,2338],{"class":69}," ln",[51,2340,2341],{"class":61}," -s",[51,2343,2344],{"class":69}," \u002Fusr\u002Flocal\u002Fzig\u002Fzig",[51,2346,2347],{"class":69}," \u002Fusr\u002Flocal\u002Fbin\u002Fzig\n",[51,2349,2350],{"class":53,"line":504},[51,2351,944],{"emptyLinePlaceholder":165},[51,2353,2354],{"class":53,"line":512},[51,2355,2356],{"class":1262},"# Verify installation\n",[51,2358,2359,2362],{"class":53,"line":520},[51,2360,2361],{"class":57},"zig",[51,2363,2364],{"class":69}," version\n",[11,2366,2367],{},"You should see output like:",[42,2369,2372],{"className":2370,"code":2371,"language":259},[257],"0.15.2\n",[34,2373,2371],{"__ignoreMap":47},[581,2375,2377],{"id":2376},"option-b-install-via-snap-alternative","Option B: Install via Snap (Alternative)",[11,2379,2380],{},"If you prefer using Snap:",[42,2382,2384],{"className":44,"code":2383,"language":46,"meta":47,"style":47},"sudo snap install zig --classic\n",[34,2385,2386],{"__ignoreMap":47},[51,2387,2388,2390,2393,2395,2398],{"class":53,"line":54},[51,2389,2126],{"class":57},[51,2391,2392],{"class":69}," snap",[51,2394,2167],{"class":69},[51,2396,2397],{"class":69}," zig",[51,2399,2400],{"class":61}," --classic\n",[11,2402,2403],{},"However, note that Snap version may differ from the official releases, which could cause compatibility issues.",[581,2405,2407],{"id":2406},"clean-up","Clean Up",[11,2409,2410],{},"Remove the downloaded archive to save space:",[42,2412,2414],{"className":44,"code":2413,"language":46,"meta":47,"style":47},"rm zig.tar.xz\n",[34,2415,2416],{"__ignoreMap":47},[51,2417,2418,2421],{"class":53,"line":54},[51,2419,2420],{"class":57},"rm",[51,2422,2281],{"class":69},[26,2424,2426],{"id":2425},"step-4-clone-nullclaw-repository","Step 4: Clone Nullclaw Repository",[11,2428,2429],{},"Now let's get the Nullclaw source code:",[42,2431,2433],{"className":44,"code":2432,"language":46,"meta":47,"style":47},"# Clone the repository\ngit clone https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw.git\n\n# Enter the directory\ncd nullclaw\n",[34,2434,2435,2440,2451,2455,2460],{"__ignoreMap":47},[51,2436,2437],{"class":53,"line":54},[51,2438,2439],{"class":1262},"# Clone the repository\n",[51,2441,2442,2445,2448],{"class":53,"line":158},[51,2443,2444],{"class":57},"git",[51,2446,2447],{"class":69}," clone",[51,2449,2450],{"class":69}," https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw.git\n",[51,2452,2453],{"class":53,"line":296},[51,2454,944],{"emptyLinePlaceholder":165},[51,2456,2457],{"class":53,"line":307},[51,2458,2459],{"class":1262},"# Enter the directory\n",[51,2461,2462,2465],{"class":53,"line":318},[51,2463,2464],{"class":949},"cd",[51,2466,2467],{"class":69}," nullclaw\n",[26,2469,2471],{"id":2470},"step-5-build-nullclaw","Step 5: Build Nullclaw",[11,2473,2474],{},"Compile Nullclaw with optimized settings for production use:",[42,2476,2478],{"className":44,"code":2477,"language":46,"meta":47,"style":47},"# Build with release optimization (smaller binary)\nzig build -Doptimize=ReleaseSmall\n",[34,2479,2480,2485],{"__ignoreMap":47},[51,2481,2482],{"class":53,"line":54},[51,2483,2484],{"class":1262},"# Build with release optimization (smaller binary)\n",[51,2486,2487,2489,2492],{"class":53,"line":158},[51,2488,2361],{"class":57},[51,2490,2491],{"class":69}," build",[51,2493,2494],{"class":61}," -Doptimize=ReleaseSmall\n",[11,2496,2497,2498,816],{},"This process may take a few minutes. The compiled binary will be created in ",[34,2499,2500],{},"zig-out\u002Fbin\u002Fnullclaw",[581,2502,2504],{"id":2503},"verify-the-build","Verify the Build",[11,2506,2507],{},"Check the compiled binary:",[42,2509,2511],{"className":44,"code":2510,"language":46,"meta":47,"style":47},"ls -lh zig-out\u002Fbin\u002Fnullclaw\n",[34,2512,2513],{"__ignoreMap":47},[51,2514,2515,2517,2520],{"class":53,"line":54},[51,2516,1477],{"class":57},[51,2518,2519],{"class":61}," -lh",[51,2521,2522],{"class":69}," zig-out\u002Fbin\u002Fnullclaw\n",[11,2524,2525],{},"You should see something like:",[42,2527,2530],{"className":2528,"code":2529,"language":259},[257],"-rwxr-xr-x 1 user user 3.1M Mar  4 06:06 zig-out\u002Fbin\u002Fnullclaw\n",[34,2531,2529],{"__ignoreMap":47},[581,2533,2535],{"id":2534},"optional-run-tests","Optional: Run Tests",[11,2537,2538],{},"To ensure everything is working correctly, you can run the test suite:",[42,2540,2542],{"className":44,"code":2541,"language":46,"meta":47,"style":47},"zig build test --summary all\n",[34,2543,2544],{"__ignoreMap":47},[51,2545,2546,2548,2550,2553,2556],{"class":53,"line":54},[51,2547,2361],{"class":57},[51,2549,2491],{"class":69},[51,2551,2552],{"class":69}," test",[51,2554,2555],{"class":61}," --summary",[51,2557,2558],{"class":69}," all\n",[26,2560,2562],{"id":2561},"step-6-install-nullclaw-system-wide","Step 6: Install Nullclaw System-wide",[11,2564,2565],{},"Move the compiled binary to a system directory for easy access:",[42,2567,2569],{"className":44,"code":2568,"language":46,"meta":47,"style":47},"# Copy binary to \u002Fusr\u002Flocal\u002Fbin\nsudo cp zig-out\u002Fbin\u002Fnullclaw \u002Fusr\u002Flocal\u002Fbin\u002Fnullclaw\n\n# Make it executable (if not already)\nsudo chmod +x \u002Fusr\u002Flocal\u002Fbin\u002Fnullclaw\n\n# Verify installation\nnullclaw --version\n",[34,2570,2571,2576,2589,2593,2598,2610,2614,2618],{"__ignoreMap":47},[51,2572,2573],{"class":53,"line":54},[51,2574,2575],{"class":1262},"# Copy binary to \u002Fusr\u002Flocal\u002Fbin\n",[51,2577,2578,2580,2583,2586],{"class":53,"line":158},[51,2579,2126],{"class":57},[51,2581,2582],{"class":69}," cp",[51,2584,2585],{"class":69}," zig-out\u002Fbin\u002Fnullclaw",[51,2587,2588],{"class":69}," \u002Fusr\u002Flocal\u002Fbin\u002Fnullclaw\n",[51,2590,2591],{"class":53,"line":296},[51,2592,944],{"emptyLinePlaceholder":165},[51,2594,2595],{"class":53,"line":307},[51,2596,2597],{"class":1262},"# Make it executable (if not already)\n",[51,2599,2600,2602,2605,2608],{"class":53,"line":318},[51,2601,2126],{"class":57},[51,2603,2604],{"class":69}," chmod",[51,2606,2607],{"class":69}," +x",[51,2609,2588],{"class":69},[51,2611,2612],{"class":53,"line":326},[51,2613,944],{"emptyLinePlaceholder":165},[51,2615,2616],{"class":53,"line":354},[51,2617,2356],{"class":1262},[51,2619,2620,2623],{"class":53,"line":453},[51,2621,2622],{"class":57},"nullclaw",[51,2624,2625],{"class":61}," --version\n",[26,2627,2629],{"id":2628},"step-7-initialize-nullclaw-configuration","Step 7: Initialize Nullclaw Configuration",[11,2631,2632],{},"Now let's set up Nullclaw with the interactive onboarding process:",[42,2634,2636],{"className":44,"code":2635,"language":46,"meta":47,"style":47},"nullclaw onboard --interactive\n",[34,2637,2638],{"__ignoreMap":47},[51,2639,2640,2642,2645],{"class":53,"line":54},[51,2641,2622],{"class":57},[51,2643,2644],{"class":69}," onboard",[51,2646,2647],{"class":61}," --interactive\n",[11,2649,2650],{},"The onboarding wizard will ask you several questions:",[581,2652,2654],{"id":2653},"workspace-setup","Workspace Setup",[249,2656,2657],{},[211,2658,2659,2662,2663,372,2666],{},[204,2660,2661],{},"Workspace Directory:"," Press Enter to accept the default (",[34,2664,2665],{},"~\u002F.nullclaw\u002Fworkspace",[208,2667,2668],{},[211,2669,2670],{},"This is where Nullclaw will store your files and projects",[581,2672,2674],{"id":2673},"llm-provider-configuration","LLM Provider Configuration",[249,2676,2677],{"start":158},[211,2678,2679,2682,2683],{},[204,2680,2681],{},"AI Provider:"," Select your preferred LLM provider\nn - Common options: OpenAI, Anthropic, Z.ai, etc.\n",[208,2684,2685],{},[211,2686,2687],{},"You'll need to provide your API key",[581,2689,2691],{"id":2690},"channel-configuration","Channel Configuration",[249,2693,2694],{"start":296},[211,2695,2696,2699,2700],{},[204,2697,2698],{},"Messaging Channels:"," Configure how you want to interact with Nullclaw\n",[208,2701,2702,2708,2714],{},[211,2703,2704,2707],{},[204,2705,2706],{},"Telegram:"," Most popular choice for mobile access",[211,2709,2710,2713],{},[204,2711,2712],{},"Discord:"," For server\u002Fcommunity integration",[211,2715,2716,2719],{},[204,2717,2718],{},"CLI:"," For local terminal interaction",[581,2721,2723],{"id":2722},"example-telegram-bot-setup","Example: Telegram Bot Setup",[11,2725,2726],{},"If you choose Telegram, you'll need:",[249,2728,2729,2740,2743],{},[211,2730,2731,2732,2739],{},"Create a bot via ",[2733,2734,2738],"a",{"href":2735,"rel":2736},"https:\u002F\u002Ft.me\u002FBotFather",[2737],"nofollow","@BotFather"," on Telegram",[211,2741,2742],{},"Copy the bot token",[211,2744,2745,2746,2751],{},"Provide your Telegram user ID (get it from ",[2733,2747,2750],{"href":2748,"rel":2749},"https:\u002F\u002Ft.me\u002Fuserinfobot",[2737],"@userinfobot",")",[11,2753,2754,2755,816],{},"The configuration will be saved in ",[34,2756,2757],{},"~\u002F.nullclaw\u002Fconfig.json",[26,2759,2761],{"id":2760},"step-8-verify-configuration","Step 8: Verify Configuration",[11,2763,2764],{},"Check your configuration file:",[42,2766,2768],{"className":44,"code":2767,"language":46,"meta":47,"style":47},"cat ~\u002F.nullclaw\u002Fconfig.json\n",[34,2769,2770],{"__ignoreMap":47},[51,2771,2772,2775],{"class":53,"line":54},[51,2773,2774],{"class":57},"cat",[51,2776,2777],{"class":69}," ~\u002F.nullclaw\u002Fconfig.json\n",[11,2779,2780],{},"Key sections to verify:",[581,2782,2784],{"id":2783},"models-section","Models Section",[42,2786,2790],{"className":2787,"code":2788,"language":2789,"meta":47,"style":47},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","\"models\": {\n  \"providers\": {\n    \"z.ai\": {\n      \"api_key\": \"your-api-key-here\"\n    }\n  }\n}\n","json",[34,2791,2792,2808,2824,2839,2858,2862,2867],{"__ignoreMap":47},[51,2793,2794,2797,2800,2802,2805],{"class":53,"line":54},[51,2795,2796],{"class":65},"\"",[51,2798,2799],{"class":69},"models",[51,2801,2796],{"class":65},[51,2803,2804],{"class":347},": ",[51,2806,2807],{"class":395},"{\n",[51,2809,2810,2814,2818,2820,2822],{"class":53,"line":158},[51,2811,2813],{"class":2812},"s39Yj","  \"",[51,2815,2817],{"class":2816},"sseR_","providers",[51,2819,2796],{"class":2812},[51,2821,379],{"class":395},[51,2823,1280],{"class":395},[51,2825,2826,2829,2833,2835,2837],{"class":53,"line":296},[51,2827,2828],{"class":2812},"    \"",[51,2830,2832],{"class":2831},"sZMiF","z.ai",[51,2834,2796],{"class":2812},[51,2836,379],{"class":395},[51,2838,1280],{"class":395},[51,2840,2841,2844,2847,2849,2851,2853,2856],{"class":53,"line":307},[51,2842,2843],{"class":2812},"      \"",[51,2845,2846],{"class":1025},"api_key",[51,2848,2796],{"class":2812},[51,2850,379],{"class":395},[51,2852,459],{"class":65},[51,2854,2855],{"class":69},"your-api-key-here",[51,2857,465],{"class":65},[51,2859,2860],{"class":53,"line":318},[51,2861,1590],{"class":395},[51,2863,2864],{"class":53,"line":326},[51,2865,2866],{"class":395},"  }\n",[51,2868,2869],{"class":53,"line":354},[51,2870,1304],{"class":395},[581,2872,2874],{"id":2873},"channels-section-telegram-example","Channels Section (Telegram Example)",[42,2876,2878],{"className":2787,"code":2877,"language":2789,"meta":47,"style":47},"\"channels\": {\n  \"telegram\": {\n    \"accounts\": {\n      \"default\": {\n        \"bot_token\": \"your-bot-token\",\n        \"allow_from\": [\"your-telegram-user-id\"]\n      }\n    }\n  }\n}\n",[34,2879,2880,2893,2906,2919,2932,2955,2978,2983,2987,2991],{"__ignoreMap":47},[51,2881,2882,2884,2887,2889,2891],{"class":53,"line":54},[51,2883,2796],{"class":65},[51,2885,2886],{"class":69},"channels",[51,2888,2796],{"class":65},[51,2890,2804],{"class":347},[51,2892,2807],{"class":395},[51,2894,2895,2897,2900,2902,2904],{"class":53,"line":158},[51,2896,2813],{"class":2812},[51,2898,2899],{"class":2816},"telegram",[51,2901,2796],{"class":2812},[51,2903,379],{"class":395},[51,2905,1280],{"class":395},[51,2907,2908,2910,2913,2915,2917],{"class":53,"line":296},[51,2909,2828],{"class":2812},[51,2911,2912],{"class":2831},"accounts",[51,2914,2796],{"class":2812},[51,2916,379],{"class":395},[51,2918,1280],{"class":395},[51,2920,2921,2923,2926,2928,2930],{"class":53,"line":307},[51,2922,2843],{"class":2812},[51,2924,2925],{"class":1025},"default",[51,2927,2796],{"class":2812},[51,2929,379],{"class":395},[51,2931,1280],{"class":395},[51,2933,2934,2937,2941,2943,2945,2947,2950,2952],{"class":53,"line":318},[51,2935,2936],{"class":2812},"        \"",[51,2938,2940],{"class":2939},"swQdS","bot_token",[51,2942,2796],{"class":2812},[51,2944,379],{"class":395},[51,2946,459],{"class":65},[51,2948,2949],{"class":69},"your-bot-token",[51,2951,2796],{"class":65},[51,2953,2954],{"class":395},",\n",[51,2956,2957,2959,2962,2964,2966,2968,2970,2973,2975],{"class":53,"line":326},[51,2958,2936],{"class":2812},[51,2960,2961],{"class":2939},"allow_from",[51,2963,2796],{"class":2812},[51,2965,379],{"class":395},[51,2967,360],{"class":395},[51,2969,2796],{"class":65},[51,2971,2972],{"class":69},"your-telegram-user-id",[51,2974,2796],{"class":65},[51,2976,2977],{"class":395},"]\n",[51,2979,2980],{"class":53,"line":354},[51,2981,2982],{"class":395},"      }\n",[51,2984,2985],{"class":53,"line":453},[51,2986,1590],{"class":395},[51,2988,2989],{"class":53,"line":468},[51,2990,2866],{"class":395},[51,2992,2993],{"class":53,"line":480},[51,2994,1304],{"class":395},[26,2996,2998],{"id":2997},"step-9-start-nullclaw","Step 9: Start Nullclaw",[11,3000,3001],{},"You can now start Nullclaw in different ways:",[581,3003,3005],{"id":3004},"as-a-background-service-recommended","As a Background Service (Recommended)",[42,3007,3009],{"className":44,"code":3008,"language":46,"meta":47,"style":47},"nullclaw daemon\n",[34,3010,3011],{"__ignoreMap":47},[51,3012,3013,3015],{"class":53,"line":54},[51,3014,2622],{"class":57},[51,3016,3017],{"class":69}," daemon\n",[11,3019,3020],{},"This will start Nullclaw in the background and keep it running.",[581,3022,3024],{"id":3023},"foreground-mode-for-debugging","Foreground Mode (for debugging)",[42,3026,3028],{"className":44,"code":3027,"language":46,"meta":47,"style":47},"nullclaw run\n",[34,3029,3030],{"__ignoreMap":47},[51,3031,3032,3034],{"class":53,"line":54},[51,3033,2622],{"class":57},[51,3035,3036],{"class":69}," run\n",[581,3038,3040],{"id":3039},"using-cli","Using CLI",[42,3042,3044],{"className":44,"code":3043,"language":46,"meta":47,"style":47},"nullclaw chat\n",[34,3045,3046],{"__ignoreMap":47},[51,3047,3048,3050],{"class":53,"line":54},[51,3049,2622],{"class":57},[51,3051,3052],{"class":69}," chat\n",[26,3054,3056],{"id":3055},"step-10-test-your-setup","Step 10: Test Your Setup",[581,3058,3060],{"id":3059},"test-via-telegram","Test via Telegram",[249,3062,3063,3066,3069],{},[211,3064,3065],{},"Open your Telegram bot",[211,3067,3068],{},"Send a message like \"Hello\" or \"What can you do?\"",[211,3070,3071],{},"You should receive a response from Nullclaw",[581,3073,3075],{"id":3074},"test-via-cli","Test via CLI",[42,3077,3079],{"className":44,"code":3078,"language":46,"meta":47,"style":47},"echo \"Hello Nullclaw\" | nullclaw chat\n",[34,3080,3081],{"__ignoreMap":47},[51,3082,3083,3085,3087,3090,3092,3095,3098],{"class":53,"line":54},[51,3084,1195],{"class":949},[51,3086,459],{"class":65},[51,3088,3089],{"class":69},"Hello Nullclaw",[51,3091,2796],{"class":65},[51,3093,3094],{"class":340}," |",[51,3096,3097],{"class":57}," nullclaw",[51,3099,3052],{"class":69},[26,3101,3103],{"id":3102},"configuration-files-overview","Configuration Files Overview",[11,3105,3106],{},"After installation, Nullclaw creates several important files:",[2041,3108,3109,3119],{},[2044,3110,3111],{},[2047,3112,3113,3116],{},[2050,3114,3115],{},"File",[2050,3117,3118],{},"Purpose",[2057,3120,3121,3130,3140,3150],{},[2047,3122,3123,3127],{},[2062,3124,3125],{},[34,3126,2757],{},[2062,3128,3129],{},"Main configuration file",[2047,3131,3132,3137],{},[2062,3133,3134],{},[34,3135,3136],{},"~\u002F.nullclaw\u002Fdaemon_state.json",[2062,3138,3139],{},"Daemon runtime state",[2047,3141,3142,3147],{},[2062,3143,3144],{},[34,3145,3146],{},"~\u002F.nullclaw\u002Fworkspace\u002F",[2062,3148,3149],{},"Your workspace for files and projects",[2047,3151,3152,3157],{},[2062,3153,3154],{},[34,3155,3156],{},"~\u002F.nullclaw\u002Fstate\u002F",[2062,3158,3159],{},"Internal state management",[26,3161,3163],{"id":3162},"common-issues-and-solutions","Common Issues and Solutions",[581,3165,3167],{"id":3166},"issue-1-build-fails-with-sqlite-error","Issue 1: Build Fails with SQLite Error",[11,3169,3170,3173],{},[204,3171,3172],{},"Problem:"," Build fails complaining about missing SQLite libraries.",[11,3175,3176,3179],{},[204,3177,3178],{},"Solution:"," Install SQLite development headers:",[42,3181,3183],{"className":44,"code":3182,"language":46,"meta":47,"style":47},"sudo apt install libsqlite3-dev\n",[34,3184,3185],{"__ignoreMap":47},[51,3186,3187,3189,3191,3193],{"class":53,"line":54},[51,3188,2126],{"class":57},[51,3190,2129],{"class":69},[51,3192,2167],{"class":69},[51,3194,3195],{"class":69}," libsqlite3-dev\n",[11,3197,3198],{},"Then rebuild:",[42,3200,3202],{"className":44,"code":3201,"language":46,"meta":47,"style":47},"zig build -Doptimize=ReleaseSmall\n",[34,3203,3204],{"__ignoreMap":47},[51,3205,3206,3208,3210],{"class":53,"line":54},[51,3207,2361],{"class":57},[51,3209,2491],{"class":69},[51,3211,2494],{"class":61},[581,3213,3215],{"id":3214},"issue-2-zig-command-not-found","Issue 2: Zig Command Not Found",[11,3217,3218,3220],{},[204,3219,3172],{}," After installing Zig, the command is not recognized.",[11,3222,3223,3225],{},[204,3224,3178],{}," Verify the symbolic link:",[42,3227,3229],{"className":44,"code":3228,"language":46,"meta":47,"style":47},"ls -la \u002Fusr\u002Flocal\u002Fbin\u002Fzig\n",[34,3230,3231],{"__ignoreMap":47},[51,3232,3233,3235,3238],{"class":53,"line":54},[51,3234,1477],{"class":57},[51,3236,3237],{"class":61}," -la",[51,3239,2347],{"class":69},[11,3241,3242],{},"If it doesn't exist, recreate it:",[42,3244,3246],{"className":44,"code":3245,"language":46,"meta":47,"style":47},"sudo ln -s \u002Fusr\u002Flocal\u002Fzig\u002Fzig \u002Fusr\u002Flocal\u002Fbin\u002Fzig\n",[34,3247,3248],{"__ignoreMap":47},[51,3249,3250,3252,3254,3256,3258],{"class":53,"line":54},[51,3251,2126],{"class":57},[51,3253,2338],{"class":69},[51,3255,2341],{"class":61},[51,3257,2344],{"class":69},[51,3259,2347],{"class":69},[581,3261,3263],{"id":3262},"issue-3-permission-denied-when-running","Issue 3: Permission Denied When Running",[11,3265,3266,3268],{},[204,3267,3172],{}," Can't execute nullclaw binary.",[11,3270,3271,3273],{},[204,3272,3178],{}," Make it executable:",[42,3275,3277],{"className":44,"code":3276,"language":46,"meta":47,"style":47},"sudo chmod +x \u002Fusr\u002Flocal\u002Fbin\u002Fnullclaw\n",[34,3278,3279],{"__ignoreMap":47},[51,3280,3281,3283,3285,3287],{"class":53,"line":54},[51,3282,2126],{"class":57},[51,3284,2604],{"class":69},[51,3286,2607],{"class":69},[51,3288,2588],{"class":69},[581,3290,3292],{"id":3291},"issue-4-telegram-bot-not-responding","Issue 4: Telegram Bot Not Responding",[11,3294,3295,3297],{},[204,3296,3172],{}," Telegram bot receives messages but doesn't respond.",[11,3299,3300,3302],{},[204,3301,3178],{}," Check that:",[249,3304,3305,3311,3314],{},[211,3306,3307,3308,3310],{},"Your Telegram user ID is correctly added to ",[34,3309,2961],{}," in config",[211,3312,3313],{},"The bot token is correct and hasn't been regenerated",[211,3315,3316],{},"The Nullclaw daemon is running",[581,3318,3320],{"id":3319},"issue-5-api-key-errors","Issue 5: API Key Errors",[11,3322,3323,3325],{},[204,3324,3172],{}," Nullclaw complains about invalid API keys.",[11,3327,3328,3330,3331,379],{},[204,3329,3178],{}," Verify your API key in ",[34,3332,2757],{},[42,3334,3336],{"className":44,"code":3335,"language":46,"meta":47,"style":47},"cat ~\u002F.nullclaw\u002Fconfig.json | grep -A 5 \"api_key\"\n",[34,3337,3338],{"__ignoreMap":47},[51,3339,3340,3342,3345,3347,3350,3353,3356,3358,3360],{"class":53,"line":54},[51,3341,2774],{"class":57},[51,3343,3344],{"class":69}," ~\u002F.nullclaw\u002Fconfig.json",[51,3346,3094],{"class":340},[51,3348,3349],{"class":57}," grep",[51,3351,3352],{"class":61}," -A",[51,3354,3355],{"class":1025}," 5",[51,3357,459],{"class":65},[51,3359,2846],{"class":69},[51,3361,465],{"class":65},[11,3363,3364],{},"Make sure there are no extra spaces or quotes around the key.",[26,3366,3368],{"id":3367},"advanced-configuration","Advanced Configuration",[581,3370,3372],{"id":3371},"enabling-memory-features","Enabling Memory Features",[11,3374,3375,3376,379],{},"Nullclaw has powerful memory capabilities. Configure them in ",[34,3377,3378],{},"config.json",[42,3380,3382],{"className":2787,"code":3381,"language":2789,"meta":47,"style":47},"\"memory\": {\n  \"profile\": \"custom\",\n  \"backend\": \"memory\",\n  \"auto_save\": true,\n  \"search\": {\n    \"enabled\": true\n  }\n}\n",[34,3383,3384,3397,3417,3436,3452,3465,3478,3482],{"__ignoreMap":47},[51,3385,3386,3388,3391,3393,3395],{"class":53,"line":54},[51,3387,2796],{"class":65},[51,3389,3390],{"class":69},"memory",[51,3392,2796],{"class":65},[51,3394,2804],{"class":347},[51,3396,2807],{"class":395},[51,3398,3399,3401,3404,3406,3408,3410,3413,3415],{"class":53,"line":158},[51,3400,2813],{"class":2812},[51,3402,3403],{"class":2816},"profile",[51,3405,2796],{"class":2812},[51,3407,379],{"class":395},[51,3409,459],{"class":65},[51,3411,3412],{"class":69},"custom",[51,3414,2796],{"class":65},[51,3416,2954],{"class":395},[51,3418,3419,3421,3424,3426,3428,3430,3432,3434],{"class":53,"line":296},[51,3420,2813],{"class":2812},[51,3422,3423],{"class":2816},"backend",[51,3425,2796],{"class":2812},[51,3427,379],{"class":395},[51,3429,459],{"class":65},[51,3431,3390],{"class":69},[51,3433,2796],{"class":65},[51,3435,2954],{"class":395},[51,3437,3438,3440,3443,3445,3447,3450],{"class":53,"line":307},[51,3439,2813],{"class":2812},[51,3441,3442],{"class":2816},"auto_save",[51,3444,2796],{"class":2812},[51,3446,379],{"class":395},[51,3448,3449],{"class":2812}," true",[51,3451,2954],{"class":395},[51,3453,3454,3456,3459,3461,3463],{"class":53,"line":318},[51,3455,2813],{"class":2812},[51,3457,3458],{"class":2816},"search",[51,3460,2796],{"class":2812},[51,3462,379],{"class":395},[51,3464,1280],{"class":395},[51,3466,3467,3469,3472,3474,3476],{"class":53,"line":326},[51,3468,2828],{"class":2812},[51,3470,3471],{"class":2831},"enabled",[51,3473,2796],{"class":2812},[51,3475,379],{"class":395},[51,3477,561],{"class":2812},[51,3479,3480],{"class":53,"line":354},[51,3481,2866],{"class":395},[51,3483,3484],{"class":53,"line":453},[51,3485,1304],{"class":395},[581,3487,3489],{"id":3488},"setting-up-autonomy-levels","Setting Up Autonomy Levels",[11,3491,3492],{},"Control how much autonomy Nullclaw has:",[42,3494,3496],{"className":2787,"code":3495,"language":2789,"meta":47,"style":47},"\"autonomy\": {\n  \"level\": \"full\",\n  \"workspace_only\": true,\n  \"max_actions_per_hour\": 50,\n  \"require_approval_for_medium_risk\": false,\n  \"block_high_risk_commands\": true\n}\n",[34,3497,3498,3511,3531,3546,3562,3578,3591],{"__ignoreMap":47},[51,3499,3500,3502,3505,3507,3509],{"class":53,"line":54},[51,3501,2796],{"class":65},[51,3503,3504],{"class":69},"autonomy",[51,3506,2796],{"class":65},[51,3508,2804],{"class":347},[51,3510,2807],{"class":395},[51,3512,3513,3515,3518,3520,3522,3524,3527,3529],{"class":53,"line":158},[51,3514,2813],{"class":2812},[51,3516,3517],{"class":2816},"level",[51,3519,2796],{"class":2812},[51,3521,379],{"class":395},[51,3523,459],{"class":65},[51,3525,3526],{"class":69},"full",[51,3528,2796],{"class":65},[51,3530,2954],{"class":395},[51,3532,3533,3535,3538,3540,3542,3544],{"class":53,"line":296},[51,3534,2813],{"class":2812},[51,3536,3537],{"class":2816},"workspace_only",[51,3539,2796],{"class":2812},[51,3541,379],{"class":395},[51,3543,3449],{"class":2812},[51,3545,2954],{"class":395},[51,3547,3548,3550,3553,3555,3557,3560],{"class":53,"line":307},[51,3549,2813],{"class":2812},[51,3551,3552],{"class":2816},"max_actions_per_hour",[51,3554,2796],{"class":2812},[51,3556,379],{"class":395},[51,3558,3559],{"class":1025}," 50",[51,3561,2954],{"class":395},[51,3563,3564,3566,3569,3571,3573,3576],{"class":53,"line":318},[51,3565,2813],{"class":2812},[51,3567,3568],{"class":2816},"require_approval_for_medium_risk",[51,3570,2796],{"class":2812},[51,3572,379],{"class":395},[51,3574,3575],{"class":2812}," false",[51,3577,2954],{"class":395},[51,3579,3580,3582,3585,3587,3589],{"class":53,"line":326},[51,3581,2813],{"class":2812},[51,3583,3584],{"class":2816},"block_high_risk_commands",[51,3586,2796],{"class":2812},[51,3588,379],{"class":395},[51,3590,561],{"class":2812},[51,3592,3593],{"class":53,"line":354},[51,3594,1304],{"class":395},[581,3596,3598],{"id":3597},"configuring-schedulers","Configuring Schedulers",[11,3600,3601],{},"Enable task scheduling:",[42,3603,3605],{"className":2787,"code":3604,"language":2789,"meta":47,"style":47},"\"scheduler\": {\n  \"enabled\": true,\n  \"max_tasks\": 64,\n  \"max_concurrent\": 4\n}\n",[34,3606,3607,3620,3634,3650,3664],{"__ignoreMap":47},[51,3608,3609,3611,3614,3616,3618],{"class":53,"line":54},[51,3610,2796],{"class":65},[51,3612,3613],{"class":69},"scheduler",[51,3615,2796],{"class":65},[51,3617,2804],{"class":347},[51,3619,2807],{"class":395},[51,3621,3622,3624,3626,3628,3630,3632],{"class":53,"line":158},[51,3623,2813],{"class":2812},[51,3625,3471],{"class":2816},[51,3627,2796],{"class":2812},[51,3629,379],{"class":395},[51,3631,3449],{"class":2812},[51,3633,2954],{"class":395},[51,3635,3636,3638,3641,3643,3645,3648],{"class":53,"line":296},[51,3637,2813],{"class":2812},[51,3639,3640],{"class":2816},"max_tasks",[51,3642,2796],{"class":2812},[51,3644,379],{"class":395},[51,3646,3647],{"class":1025}," 64",[51,3649,2954],{"class":395},[51,3651,3652,3654,3657,3659,3661],{"class":53,"line":307},[51,3653,2813],{"class":2812},[51,3655,3656],{"class":2816},"max_concurrent",[51,3658,2796],{"class":2812},[51,3660,379],{"class":395},[51,3662,3663],{"class":1025}," 4\n",[51,3665,3666],{"class":53,"line":318},[51,3667,1304],{"class":395},[26,3669,3671],{"id":3670},"updating-nullclaw","Updating Nullclaw",[11,3673,3674],{},"To update to the latest version:",[42,3676,3678],{"className":44,"code":3677,"language":46,"meta":47,"style":47},"# Pull latest changes\ncd ~\u002Fnullclaw\ngit pull\n\n# Rebuild\nzig build -Doptimize=ReleaseSmall\n\n# Reinstall\nsudo cp zig-out\u002Fbin\u002Fnullclaw \u002Fusr\u002Flocal\u002Fbin\u002Fnullclaw\n\n# Restart daemon\nnullclaw daemon restart\n",[34,3679,3680,3685,3692,3699,3703,3708,3716,3720,3725,3735,3739,3744],{"__ignoreMap":47},[51,3681,3682],{"class":53,"line":54},[51,3683,3684],{"class":1262},"# Pull latest changes\n",[51,3686,3687,3689],{"class":53,"line":158},[51,3688,2464],{"class":949},[51,3690,3691],{"class":69}," ~\u002Fnullclaw\n",[51,3693,3694,3696],{"class":53,"line":296},[51,3695,2444],{"class":57},[51,3697,3698],{"class":69}," pull\n",[51,3700,3701],{"class":53,"line":307},[51,3702,944],{"emptyLinePlaceholder":165},[51,3704,3705],{"class":53,"line":318},[51,3706,3707],{"class":1262},"# Rebuild\n",[51,3709,3710,3712,3714],{"class":53,"line":326},[51,3711,2361],{"class":57},[51,3713,2491],{"class":69},[51,3715,2494],{"class":61},[51,3717,3718],{"class":53,"line":354},[51,3719,944],{"emptyLinePlaceholder":165},[51,3721,3722],{"class":53,"line":453},[51,3723,3724],{"class":1262},"# Reinstall\n",[51,3726,3727,3729,3731,3733],{"class":53,"line":468},[51,3728,2126],{"class":57},[51,3730,2582],{"class":69},[51,3732,2585],{"class":69},[51,3734,2588],{"class":69},[51,3736,3737],{"class":53,"line":480},[51,3738,944],{"emptyLinePlaceholder":165},[51,3740,3741],{"class":53,"line":492},[51,3742,3743],{"class":1262},"# Restart daemon\n",[51,3745,3746,3748,3751],{"class":53,"line":504},[51,3747,2622],{"class":57},[51,3749,3750],{"class":69}," daemon",[51,3752,3753],{"class":69}," restart\n",[26,3755,3757],{"id":3756},"uninstalling-nullclaw","Uninstalling Nullclaw",[11,3759,3760],{},"If you need to remove Nullclaw completely:",[42,3762,3764],{"className":44,"code":3763,"language":46,"meta":47,"style":47},"# Stop daemon\nnullclaw daemon stop\n\n# Remove binary\nsudo rm \u002Fusr\u002Flocal\u002Fbin\u002Fnullclaw\n\n# Remove configuration and data (careful!)\nrm -rf ~\u002F.nullclaw\n\n# Remove source code\nrm -rf ~\u002Fnullclaw\n",[34,3765,3766,3771,3780,3784,3789,3798,3802,3807,3817,3821,3826],{"__ignoreMap":47},[51,3767,3768],{"class":53,"line":54},[51,3769,3770],{"class":1262},"# Stop daemon\n",[51,3772,3773,3775,3777],{"class":53,"line":158},[51,3774,2622],{"class":57},[51,3776,3750],{"class":69},[51,3778,3779],{"class":69}," stop\n",[51,3781,3782],{"class":53,"line":296},[51,3783,944],{"emptyLinePlaceholder":165},[51,3785,3786],{"class":53,"line":307},[51,3787,3788],{"class":1262},"# Remove binary\n",[51,3790,3791,3793,3796],{"class":53,"line":318},[51,3792,2126],{"class":57},[51,3794,3795],{"class":69}," rm",[51,3797,2588],{"class":69},[51,3799,3800],{"class":53,"line":326},[51,3801,944],{"emptyLinePlaceholder":165},[51,3803,3804],{"class":53,"line":354},[51,3805,3806],{"class":1262},"# Remove configuration and data (careful!)\n",[51,3808,3809,3811,3814],{"class":53,"line":453},[51,3810,2420],{"class":57},[51,3812,3813],{"class":61}," -rf",[51,3815,3816],{"class":69}," ~\u002F.nullclaw\n",[51,3818,3819],{"class":53,"line":468},[51,3820,944],{"emptyLinePlaceholder":165},[51,3822,3823],{"class":53,"line":480},[51,3824,3825],{"class":1262},"# Remove source code\n",[51,3827,3828,3830,3832],{"class":53,"line":492},[51,3829,2420],{"class":57},[51,3831,3813],{"class":61},[51,3833,3691],{"class":69},[26,3835,3837],{"id":3836},"next-steps","Next Steps",[11,3839,3840],{},"Now that Nullclaw is installed and running, here are some things to explore:",[249,3842,3843,3851,3857,3863,3869],{},[211,3844,3845,3848,3849],{},[204,3846,3847],{},"Workspace Management:"," Create projects and organize files in ",[34,3850,2665],{},[211,3852,3853,3856],{},[204,3854,3855],{},"Skills:"," Install additional skills for extended functionality",[211,3858,3859,3862],{},[204,3860,3861],{},"Memory:"," Configure long-term memory for better context retention",[211,3864,3865,3868],{},[204,3866,3867],{},"Automation:"," Set up scheduled tasks and cron jobs",[211,3870,3871,3874],{},[204,3872,3873],{},"Channels:"," Add more messaging platforms (Discord, Slack, etc.)",[26,3876,3878],{"id":3877},"resources","Resources",[208,3880,3881,3888,3895],{},[211,3882,3883],{},[2733,3884,3887],{"href":3885,"rel":3886},"https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw",[2737],"Nullclaw GitHub Repository",[211,3889,3890],{},[2733,3891,3894],{"href":3892,"rel":3893},"https:\u002F\u002Fziglang.org\u002F",[2737],"Zig Programming Language",[211,3896,3897],{},[2733,3898,3901],{"href":3899,"rel":3900},"https:\u002F\u002Fcore.telegram.org\u002Fbots\u002Fapi",[2737],"Telegram Bot API",[26,3903,3905],{"id":3904},"conclusion","Conclusion",[11,3907,3908],{},"Installing Nullclaw on Ubuntu might seem complex at first, but once you understand the components—Zig, build process, and configuration—it becomes straightforward. The key is to ensure all dependencies are installed before building and to carefully configure your messaging channels.",[11,3910,3911],{},"With Nullclaw running locally, you have a powerful AI assistant that respects your privacy and integrates seamlessly with your workflow. Happy automating!",[3913,3914],"hr",{},[154,3916,3917],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":47,"searchDepth":158,"depth":158,"links":3919},[3920,3921,3922,3923,3924,3925,3930,3931,3935,3936,3942,3946,3951,3955,3956,3963,3968,3969,3970,3971,3972],{"id":894,"depth":158,"text":895},{"id":2011,"depth":158,"text":2012},{"id":2035,"depth":158,"text":2036},{"id":2112,"depth":158,"text":2113},{"id":2149,"depth":158,"text":2150},{"id":2246,"depth":158,"text":2247,"children":3926},[3927,3928,3929],{"id":2253,"depth":296,"text":2254},{"id":2376,"depth":296,"text":2377},{"id":2406,"depth":296,"text":2407},{"id":2425,"depth":158,"text":2426},{"id":2470,"depth":158,"text":2471,"children":3932},[3933,3934],{"id":2503,"depth":296,"text":2504},{"id":2534,"depth":296,"text":2535},{"id":2561,"depth":158,"text":2562},{"id":2628,"depth":158,"text":2629,"children":3937},[3938,3939,3940,3941],{"id":2653,"depth":296,"text":2654},{"id":2673,"depth":296,"text":2674},{"id":2690,"depth":296,"text":2691},{"id":2722,"depth":296,"text":2723},{"id":2760,"depth":158,"text":2761,"children":3943},[3944,3945],{"id":2783,"depth":296,"text":2784},{"id":2873,"depth":296,"text":2874},{"id":2997,"depth":158,"text":2998,"children":3947},[3948,3949,3950],{"id":3004,"depth":296,"text":3005},{"id":3023,"depth":296,"text":3024},{"id":3039,"depth":296,"text":3040},{"id":3055,"depth":158,"text":3056,"children":3952},[3953,3954],{"id":3059,"depth":296,"text":3060},{"id":3074,"depth":296,"text":3075},{"id":3102,"depth":158,"text":3103},{"id":3162,"depth":158,"text":3163,"children":3957},[3958,3959,3960,3961,3962],{"id":3166,"depth":296,"text":3167},{"id":3214,"depth":296,"text":3215},{"id":3262,"depth":296,"text":3263},{"id":3291,"depth":296,"text":3292},{"id":3319,"depth":296,"text":3320},{"id":3367,"depth":158,"text":3368,"children":3964},[3965,3966,3967],{"id":3371,"depth":296,"text":3372},{"id":3488,"depth":296,"text":3489},{"id":3597,"depth":296,"text":3598},{"id":3670,"depth":158,"text":3671},{"id":3756,"depth":158,"text":3757},{"id":3836,"depth":158,"text":3837},{"id":3877,"depth":158,"text":3878},{"id":3904,"depth":158,"text":3905},"A comprehensive step-by-step tutorial to install and configure Nullclaw AI assistant on Ubuntu Linux, including Zig setup, dependencies, and Telegram integration.",{},"\u002Fblog\u002F2026\u002Finstall-nullclaw-ubuntu","2026-03-04",{"title":1995,"description":3973},"blog\u002F2026\u002Finstall-nullclaw-ubuntu",[3980,3981,3982,2622,3983],"tutorial","linux","ai","ubuntu","gjV90_3-T5kduUzDQml0qbUbfCm9IgjMUf77WVE0jcI",{"id":3986,"title":3987,"author":178,"body":3988,"description":4090,"draft":162,"extension":163,"featured":165,"meta":4091,"navigation":165,"ogImage":166,"path":4092,"pubDatetime":4093,"seo":4094,"stem":4095,"tags":4096,"__hash__":4100},"blog\u002Fblog\u002F2026\u002Fclean-your-downloads-folder.md","Clean Your Downloads Folder!",{"type":8,"value":3989,"toc":4084},[3990,3994,3997,4000,4008,4012,4015,4018,4022,4025,4041,4044,4058,4065,4069,4072,4074,4081],[15,3991,3993],{"id":3992},"the-issue","The Issue",[11,3995,3996],{},"Actually, this is kind of embarrassing. Everytime I download something, it just goes to my Downloads folder. After a while, it just gets too big and I end up deleting files that I might need later. It's a real mess. Hard to find files when you need them.",[11,3998,3999],{},"So, I decided to write a python script to clean my downloads folder. At first, it just works for my personal use, but then I think why not share it with the world?",[11,4001,4002,4003],{},"You can find it ",[2733,4004,4007],{"href":4005,"rel":4006},"https:\u002F\u002Farizmuajianisan.github.io\u002Fpikapika\u002F",[2737],"here",[26,4009,4011],{"id":4010},"what-is-pikapika","What is Pikapika?",[11,4013,4014],{},"“Pika Pika (ピカピカ)” is an onomatopoeia in Japanese, meaning “shiny” or “sparkly”. This project is mainly used to clean your folders of clutter and manage them efficiently. It automatically files items into category folders (Images, Documents, Archives, Installers, etc.) and optionally quarantines junk files such as partial downloads.",[11,4016,4017],{},"It works on Windows and Linux (macOS is not tested yet).",[26,4019,4021],{"id":4020},"how-to-use","How to Use",[11,4023,4024],{},"It's quite simple, just run this:",[42,4026,4028],{"className":44,"code":4027,"language":46,"meta":47,"style":47},"uvx pikapika-organizer --dry-run\n",[34,4029,4030],{"__ignoreMap":47},[51,4031,4032,4035,4038],{"class":53,"line":54},[51,4033,4034],{"class":57},"uvx",[51,4036,4037],{"class":69}," pikapika-organizer",[51,4039,4040],{"class":61}," --dry-run\n",[11,4042,4043],{},"This will tell you what files will be moved, without actually moving them. You can check what the others functions do by running:",[42,4045,4047],{"className":44,"code":4046,"language":46,"meta":47,"style":47},"uvx pikapika-organizer --help\n",[34,4048,4049],{"__ignoreMap":47},[51,4050,4051,4053,4055],{"class":53,"line":54},[51,4052,4034],{"class":57},[51,4054,4037],{"class":69},[51,4056,4057],{"class":61}," --help\n",[11,4059,4060,4061,4064],{},"I recommend you to run with ",[34,4062,4063],{},"--dry-run"," option first to see what it will do.",[26,4066,4068],{"id":4067},"experience","Experience",[11,4070,4071],{},"Beside developing this tool, I also learn a lot when I deploy it to pypi. And this is my first apps that I deploy to pypi.\nBefore this, I see others have a interesting tools, and now I make one too.",[26,4073,3905],{"id":3904},[11,4075,4076,4077],{},"More detail you can check the repository ",[2733,4078,4007],{"href":4079,"rel":4080},"https:\u002F\u002Fgithub.com\u002Farizmuajianisan\u002Fpikapika",[2737],[154,4082,4083],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}",{"title":47,"searchDepth":158,"depth":158,"links":4085},[4086,4087,4088,4089],{"id":4010,"depth":158,"text":4011},{"id":4020,"depth":158,"text":4021},{"id":4067,"depth":158,"text":4068},{"id":3904,"depth":158,"text":3905},"A python script for cleaning your downloads folder",{},"\u002Fblog\u002F2026\u002Fclean-your-downloads-folder","2026-02-26",{"title":3987,"description":4090},"blog\u002F2026\u002Fclean-your-downloads-folder",[4097,4098,4099],"python","downloads","organization","6cyQrUlhqlE1-kPMLv91zAIZPvdl-h8m7P0HLuDIlu8",{"id":4102,"title":4103,"author":178,"body":4104,"description":4167,"draft":162,"extension":163,"featured":162,"meta":4168,"navigation":165,"ogImage":166,"path":4169,"pubDatetime":4170,"seo":4171,"stem":4172,"tags":4173,"__hash__":4177},"blog\u002Fblog\u002F2026\u002Ftool-for-managing-my-team.md","Leantime: Tool for Managing My Team",{"type":8,"value":4105,"toc":4162},[4106,4110,4113,4116,4119,4122,4125,4129,4132,4136,4144,4152,4156,4159],[15,4107,4109],{"id":4108},"how-i-used-to-manage-my-team","How I Used to Manage My Team",[11,4111,4112],{},"My company used to be pretty old-school. Managers or team leaders would hand out tasks and track everything in Excel. Yep, Excel. We’d stash the files on an internal network drive, and everyone had to go in and check them manually.",[11,4114,4115],{},"The big issue? Managers rarely had a clear picture of what was going on because the info was scattered. The team had to dig into the file themselves, and managers were always bugging people for status updates.",[11,4117,4118],{},"I really needed a tool that would let me see project progress in real-time and make assigning tasks a breeze.",[11,4120,4121],{},"I also wanted one single spot for all our project info—stuff like standard docs, code documentation, and whatever else we needed.",[11,4123,4124],{},"I used to use Notion, so why didn’t we just go with that? Honestly, I wanted something simpler. Heavy hitters like Notion, Slack, and Jira just felt like overkill for what we actually needed. Plus, I wanted to keep costs down. Since I already have a solid infrastructure in place, going the self-hosted route felt like a no-brainer.",[26,4126,4128],{"id":4127},"enter-leantime","Enter Leantime",[11,4130,4131],{},"After digging around a bit, I stumbled across Leantime. It’s an open-source, self-hosted project management tool that you can toss right onto your local server. It packs some really solid features, too—like task management, full project tracking, and even a kanban board.",[26,4133,4135],{"id":4134},"setting-it-up","Setting It Up",[11,4137,4138,4139],{},"I went with Docker to get Leantime up and running, and I’m going to show you how I did it. First off, make sure you’ve got Docker and Docker Compose installed. If you don’t, grab them here: ",[2733,4140,4143],{"href":4141,"rel":4142},"https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F",[2737],"Docker Installation",[11,4145,4146,4147],{},"Once that’s sorted, just follow the official docs to get it installed: ",[2733,4148,4151],{"href":4149,"rel":4150},"https:\u002F\u002Fdocs.leantime.io\u002Finstallation\u002Fdocker",[2737],"Leantime Installation",[26,4153,4155],{"id":4154},"the-verdict","The Verdict",[11,4157,4158],{},"Since we started using Leantime, tracking progress and handing out tasks has been ridiculously easy. It’s been a massive help for me because I can finally keep an eye on what everyone is up to without being annoying. And honestly? It’s boosted team morale. There’s something super satisfying about actually seeing your progress move forward on a board.",[11,4160,4161],{},"If you’re a manager or team lead, I highly recommend checking this tool out.",{"title":47,"searchDepth":158,"depth":158,"links":4163},[4164,4165,4166],{"id":4127,"depth":158,"text":4128},{"id":4134,"depth":158,"text":4135},{"id":4154,"depth":158,"text":4155},"Self-hosted project management tool for managing my team",{},"\u002Fblog\u002F2026\u002Ftool-for-managing-my-team","2026-02-25",{"title":4103,"description":4167},"blog\u002F2026\u002Ftool-for-managing-my-team",[4174,131,4175,4176],"leantime","project-management","self-hosted","x2bzukQVGSBPVF8EXY9VdfQ9NLeZl1lukd_47lsvj9Y",{"id":4179,"title":4180,"author":178,"body":4181,"description":4546,"draft":162,"extension":163,"featured":165,"meta":4547,"navigation":165,"ogImage":166,"path":4548,"pubDatetime":4549,"seo":4550,"stem":4551,"tags":4552,"__hash__":4554},"blog\u002Fblog\u002F2025\u002Ffix-grub-error-dual-boot-windows-ubuntu.md","How to Fix GRUB Error on a Dual Boot Windows and Ubuntu Laptop",{"type":8,"value":4182,"toc":4535},[4183,4187,4190,4197,4211,4214,4221,4224,4232,4235,4241,4244,4248,4254,4265,4268,4282,4286,4289,4298,4301,4307,4310,4314,4317,4329,4332,4346,4349,4359,4366,4370,4373,4394,4400,4404,4407,4420,4423,4432,4435,4441,4448,4490,4493,4501,4504,4508,4514,4527,4530,4532],[26,4184,4186],{"id":4185},"how-i-fixed-a-grub-error-on-my-dual-boot-laptop","How I Fixed a GRUB Error on My Dual Boot Laptop",[11,4188,4189],{},"Recently, my old laptop with dual boot Windows and Ubuntu suddenly refused to start normally. Instead of showing the usual boot menu, it dropped me straight into a GRUB terminal prompt.",[11,4191,4192,4193,4196],{},"If you are seeing only a ",[34,4194,4195],{},"grub>"," prompt when you power on your machine, this post walks through how to:",[208,4198,4199,4202,4205],{},[211,4200,4201],{},"Find your Windows or Ubuntu partition from the GRUB terminal",[211,4203,4204],{},"Manually boot into Windows using GRUB",[211,4206,4207,4208],{},"Make Windows the default bootloader again using ",[34,4209,4210],{},"bcdedit",[11,4212,4213],{},"This approach is especially useful if you have a dual boot setup and the GRUB bootloader is broken or misconfigured.",[11,4215,4216],{},[4217,4218],"img",{"alt":4219,"src":4220},"Grub Error","\u002Fimages\u002Fgrub-error.jpg",[11,4222,4223],{},"This laptop has two operating systems installed:",[208,4225,4226,4229],{},[211,4227,4228],{},"Windows on the first drive\u002Fpartition (think of it as drive C:)",[211,4230,4231],{},"Ubuntu on the second drive\u002Fpartition (think of it as drive D:)",[11,4233,4234],{},"No matter how the boot order was changed in BIOS\u002FUEFI, the machine would always show only the GRUB terminal:",[42,4236,4239],{"className":4237,"code":4238,"language":259,"meta":47},[257],"grub>\n",[34,4240,4238],{"__ignoreMap":47},[11,4242,4243],{},"If the boot order was switched to the drive containing Windows, the Windows boot menu would appear. But on normal startup, it always landed on the GRUB prompt. That meant GRUB itself was broken or pointing to the wrong target.",[26,4245,4247],{"id":4246},"understanding-the-grub-error","Understanding the GRUB Error",[11,4249,4250,4251,4253],{},"If you only see the ",[34,4252,4195],{}," prompt (and not the usual GRUB menu), it typically means:",[208,4255,4256,4259,4262],{},[211,4257,4258],{},"The GRUB configuration is corrupted or missing",[211,4260,4261],{},"GRUB cannot find its configuration file",[211,4263,4264],{},"The bootloader is installed, but it does not know where your OS is",[11,4266,4267],{},"The good news is: from this GRUB terminal, you can still:",[208,4269,4270,4273,4276,4279],{},[211,4271,4272],{},"Inspect available drives and partitions",[211,4274,4275],{},"Locate the EFI files for Windows or Ubuntu",[211,4277,4278],{},"Manually boot into Windows",[211,4280,4281],{},"Then repair or change the default bootloader from inside Windows",[26,4283,4285],{"id":4284},"step-1-list-drives-and-partitions-in-grub","Step 1: List Drives and Partitions in GRUB",[11,4287,4288],{},"From the GRUB prompt, first list all available drives and partitions:",[42,4290,4292],{"className":44,"code":4291,"language":46,"meta":47,"style":47},"ls\n",[34,4293,4294],{"__ignoreMap":47},[51,4295,4296],{"class":53,"line":54},[51,4297,4291],{"class":57},[11,4299,4300],{},"GRUB will show something like:",[42,4302,4305],{"className":4303,"code":4304,"language":259,"meta":47},[257],"(hd0,gpt1) (hd0,gpt2)\n",[34,4306,4304],{"__ignoreMap":47},[11,4308,4309],{},"You may see more entries depending on how many drives and partitions you have. Each of these represents a partition that might contain an EFI bootloader.",[26,4311,4313],{"id":4312},"step-2-find-the-efi-partition-windows-or-ubuntu","Step 2: Find the EFI Partition (Windows or Ubuntu)",[11,4315,4316],{},"Next, inspect each partition to find where your EFI boot files live. For example:",[42,4318,4320],{"className":44,"code":4319,"language":46,"meta":47,"style":47},"ls (hd0,gpt1)\u002F\n",[34,4321,4322],{"__ignoreMap":47},[51,4323,4324,4326],{"class":53,"line":54},[51,4325,1477],{"class":57},[51,4327,4328],{"class":347}," (hd0,gpt1)\u002F\n",[11,4330,4331],{},"Check each partition until you find a structure like:",[208,4333,4334,4340],{},[211,4335,4336,4339],{},[34,4337,4338],{},"EFI\u002FMicrosoft\u002FBoot"," (for Windows)",[211,4341,4342,4345],{},[34,4343,4344],{},"EFI\u002Fubuntu"," (for Ubuntu)",[11,4347,4348],{},"Once you see either of those paths, you have found the EFI system partition for that OS.",[11,4350,4351,4352,4354,4355,4358],{},"For example, if ",[34,4353,4338],{}," exists on ",[34,4356,4357],{},"(hd0,gpt1)",", then:",[208,4360,4361],{},[211,4362,4363,4365],{},[34,4364,4357],{}," is your Windows EFI partition.",[26,4367,4369],{"id":4368},"step-3-set-the-root-to-the-windows-efi-partition","Step 3: Set the Root to the Windows EFI Partition",[11,4371,4372],{},"Now tell GRUB to use that partition as the root:",[42,4374,4376],{"className":44,"code":4375,"language":46,"meta":47,"style":47},"set root=(hd0,gpt1)\n",[34,4377,4378],{"__ignoreMap":47},[51,4379,4380,4383,4386,4389,4392],{"class":53,"line":54},[51,4381,4382],{"class":949},"set",[51,4384,4385],{"class":69}," root=",[51,4387,4388],{"class":395},"(",[51,4390,4391],{"class":57},"hd0,gpt1",[51,4393,372],{"class":395},[11,4395,4396,4397,4399],{},"Replace ",[34,4398,4357],{}," with the correct partition you discovered in the previous step.",[26,4401,4403],{"id":4402},"step-4-chainload-the-windows-bootloader","Step 4: Chainload the Windows Bootloader",[11,4405,4406],{},"Next, chainload the Windows boot manager from GRUB:",[42,4408,4410],{"className":44,"code":4409,"language":46,"meta":47,"style":47},"chainloader \u002FEFI\u002FMicrosoft\u002FBoot\u002Fbootmgfw.efi\n",[34,4411,4412],{"__ignoreMap":47},[51,4413,4414,4417],{"class":53,"line":54},[51,4415,4416],{"class":57},"chainloader",[51,4418,4419],{"class":69}," \u002FEFI\u002FMicrosoft\u002FBoot\u002Fbootmgfw.efi\n",[11,4421,4422],{},"If there is no error, proceed to boot:",[42,4424,4426],{"className":44,"code":4425,"language":46,"meta":47,"style":47},"boot\n",[34,4427,4428],{"__ignoreMap":47},[51,4429,4430],{"class":53,"line":54},[51,4431,4425],{"class":57},[11,4433,4434],{},"If everything is correct, your laptop should now boot into Windows instead of staying stuck at the GRUB error prompt.",[26,4436,4438,4439],{"id":4437},"step-5-make-windows-the-default-bootloader-with-bcdedit","Step 5: Make Windows the Default Bootloader with ",[34,4440,4210],{},[11,4442,4443,4444,4447],{},"Once inside Windows, you can make Windows Boot Manager the permanent default bootloader. Open a Command Prompt ",[204,4445,4446],{},"as Administrator"," and run:",[42,4449,4451],{"className":44,"code":4450,"language":46,"meta":47,"style":47},"bcdedit \u002Fset {bootmgr} path \\EFI\\Microsoft\\Boot\\bootmgfw.efi\n",[34,4452,4453],{"__ignoreMap":47},[51,4454,4455,4457,4460,4463,4466,4469,4472,4475,4478,4481,4484,4487],{"class":53,"line":54},[51,4456,4210],{"class":57},[51,4458,4459],{"class":69}," \u002Fset",[51,4461,4462],{"class":69}," {bootmgr}",[51,4464,4465],{"class":69}," path",[51,4467,4468],{"class":282}," \\E",[51,4470,4471],{"class":69},"FI",[51,4473,4474],{"class":282},"\\M",[51,4476,4477],{"class":69},"icrosoft",[51,4479,4480],{"class":282},"\\B",[51,4482,4483],{"class":69},"oot",[51,4485,4486],{"class":282},"\\b",[51,4488,4489],{"class":69},"ootmgfw.efi\n",[11,4491,4492],{},"This command tells the system to use the Windows boot manager from now on, instead of GRUB. On the next restart, the machine should:",[208,4494,4495,4498],{},[211,4496,4497],{},"Go directly to the Windows boot menu, or",[211,4499,4500],{},"Boot straight into Windows, depending on your configuration",[11,4502,4503],{},"From there, you can decide whether to repair or reinstall GRUB if you still want a dual boot menu, or simply keep Windows boot manager as the default.",[26,4505,4507],{"id":4506},"final-thoughts","Final Thoughts",[11,4509,4510,4511,4513],{},"A broken GRUB bootloader can look scary, especially when your laptop only shows a ",[34,4512,4195],{}," prompt. However, as long as the EFI files are still there, you can:",[208,4515,4516,4519,4522],{},[211,4517,4518],{},"Use the GRUB terminal to locate your EFI partition",[211,4520,4521],{},"Manually boot into Windows via chainloading",[211,4523,4524,4525],{},"Restore Windows Boot Manager as the default with ",[34,4526,4210],{},[11,4528,4529],{},"This simple method brought my old dual boot laptop back to life and might do the same for yours.",[3913,4531],{},[154,4533,4534],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":47,"searchDepth":158,"depth":158,"links":4536},[4537,4538,4539,4540,4541,4542,4543,4545],{"id":4185,"depth":158,"text":4186},{"id":4246,"depth":158,"text":4247},{"id":4284,"depth":158,"text":4285},{"id":4312,"depth":158,"text":4313},{"id":4368,"depth":158,"text":4369},{"id":4402,"depth":158,"text":4403},{"id":4437,"depth":158,"text":4544},"Step 5: Make Windows the Default Bootloader with bcdedit",{"id":4506,"depth":158,"text":4507},"Stuck at a GRUB prompt on a dual boot Windows and Ubuntu laptop? Learn how to manually boot into Windows from GRUB and make it the default bootloader.",{},"\u002Fblog\u002F2025\u002Ffix-grub-error-dual-boot-windows-ubuntu","2025-12-09",{"title":4180,"description":4546},"blog\u002F2025\u002Ffix-grub-error-dual-boot-windows-ubuntu",[4553,3981],"grub","pyOplkH9-frYd5ZNLhXcM56eE6iHsIpMZ_6FVmFuIQU",{"id":4556,"title":4557,"author":178,"body":4558,"description":4607,"draft":162,"extension":163,"featured":162,"meta":4608,"navigation":165,"ogImage":166,"path":4609,"pubDatetime":4610,"seo":4611,"stem":4612,"tags":4613,"__hash__":4615},"blog\u002Fblog\u002F2025\u002Fexposing-your-local-apps-to-the-internet-safely-cloudflare-tunnel-2025.md","Exposing Your Local Apps to the Internet [SAFELY!] — Cloudflare Tunnel [2025]",{"type":8,"value":4559,"toc":4603},[4560,4564,4567,4573,4577,4593,4597,4600],[15,4561,4563],{"id":4562},"story","Story",[11,4565,4566],{},"I want to create a lab server (it’s just a name, lol)in my home and deploy some apps that I want to use outside my home. Instead of exposing my IP to the Internet (and it is VERY💥 Dangerous) if you can’t set good security on it, after doing some research, I found a way I can expose my local apps to the Internet without changing my Firewall or setting anything on my computer, even exposing any port!",[4568,4569,4570],"blockquote",{},[11,4571,4572],{},"The answer is using Tunneling from Cloudflare, and the good news is FREE!",[26,4574,4576],{"id":4575},"requirements","Requirements:",[249,4578,4579,4582,4590],{},[211,4580,4581],{},"Docker, trust me you will be happy using Docker. But if you want to use it another way, Cloudflare has documentation about it, and still easy.",[211,4583,4584,4585],{},"A domain, you can purchase one from any provider that you love. Mine from ",[2733,4586,4589],{"href":4587,"rel":4588},"https:\u002F\u002Fmy.domainesia.com\u002Fref.php?u=23913",[2737],"Domainesia",[211,4591,4592],{},"An app or anything that you want to exposed to the internet.",[26,4594,4596],{"id":4595},"lets-go","Let’s go! 🐱‍🏍",[11,4598,4599],{},"First thing first, go to Cloudflare. You need to sign in if you don’t have an account yet, it’s super easy. I think you will get it.",[11,4601,4602],{},"Once you finish, we will get this page, I already have an active site. We need to click the Add a Site button on the right side.",{"title":47,"searchDepth":158,"depth":158,"links":4604},[4605,4606],{"id":4575,"depth":158,"text":4576},{"id":4595,"depth":158,"text":4596},"Tutorial how to expose your local apps to the internet safely using Cloudflare Tunnel",{},"\u002Fblog\u002F2025\u002Fexposing-your-local-apps-to-the-internet-safely-cloudflare-tunnel-2025","2025-08-28",{"title":4557,"description":4607},"blog\u002F2025\u002Fexposing-your-local-apps-to-the-internet-safely-cloudflare-tunnel-2025",[4614,131],"cloudflare","VBQ73wexN7COhVCfhCncS2FYfHkghjbyjMkCp55L6yc",{"id":4617,"title":4618,"author":178,"body":4619,"description":4623,"draft":162,"extension":163,"featured":162,"meta":4777,"navigation":165,"ogImage":166,"path":4778,"pubDatetime":4779,"seo":4780,"stem":4781,"tags":4782,"__hash__":4784},"blog\u002Fblog\u002F2025\u002Fmultitasking-looks-impressive-but-hides-many-problems.md","Truth About Multitasking: How to Boost Your Productivity and Achieve Success",{"type":8,"value":4620,"toc":4770},[4621,4624,4628,4658,4670,4673,4676,4679,4682,4685,4688,4691,4694,4697,4700,4707,4710,4713,4716,4719,4722,4729,4732,4735,4737,4740,4743,4746,4751,4754],[11,4622,4623],{},"Why You Should Avoid Multitasking and How to Work More Effectively",[26,4625,4627],{"id":4626},"table-of-contents","Table of contents",[208,4629,4630,4635,4641,4647,4653],{},[211,4631,4632],{},[2733,4633,4627],{"href":4634},"#table-of-contents",[211,4636,4637],{},[2733,4638,4640],{"href":4639},"#multitasking-less-productivity-more-problems","Multitasking: Less Productivity, More Problems",[211,4642,4643],{},[2733,4644,4646],{"href":4645},"#the-right-approach-single-tasking","The Right Approach: Single-Tasking",[211,4648,4649],{},[2733,4650,4652],{"href":4651},"#my-battle-with-distractions","My Battle with Distractions",[211,4654,4655],{},[2733,4656,3905],{"href":4657},"#conclusion",[11,4659,4660,4661,4665,4666,4669],{},"I have a habit I can’t fully control—one that automatically kicks in: ",[4662,4663,4664],"em",{},"multitasking",". For example, while working on Task A, certain parts of it remind me of Task B, instantly distracting me and shifting my focus to Task B. This can branch out further to Tasks C, D, and beyond. Right now, as I type this post, I’m technically juggling two different tasks. Then, a thought pops into my head: ",[4662,4667,4668],{},"“Why am I working on these two things at once?”"," Oh, wait—now it’s three! All while I’m checking the terminal for an ongoing environment installation.",[11,4671,4672],{},"To most people, “multitasking” sounds impressive. How could it not? Someone who can handle multiple tasks at once must seem highly productive. But the reality is the opposite.",[11,4674,4675],{},"There’s already plenty written about multitasking, but I want to share my personal experience and efforts to reduce this automatic habit.",[26,4677,4640],{"id":4678},"multitasking-less-productivity-more-problems",[11,4680,4681],{},"Why does multitasking reduce productivity when logic suggests it should boost efficiency? The answer lies in the difference between the human brain and a machine’s processor. Our brains aren’t designed to handle multiple tasks simultaneously without distraction.",[11,4683,4684],{},"Distraction is a unique trait of the human brain. We’re wired to focus on one thing at a time.",[11,4686,4687],{},"So, is multitasking impossible? Of course not—but not for tasks requiring full cognitive load. If you multitask while doing mentally demanding work, you’ll likely face burnout. Your brain becomes exhausted, work progress slows, and deadlines slip.",[11,4689,4690],{},"Ironically, the original goal of multitasking—to boost productivity—backfires.",[26,4692,4646],{"id":4693},"the-right-approach-single-tasking",[11,4695,4696],{},"There’s only one effective way to improve productivity: Focus on one thing at a time.",[11,4698,4699],{},"Yes, we all know this answer. But why is it so hard to practice?",[11,4701,4702,4703,4706],{},"Distractions come not just externally (notifications, interruptions) but also ",[4662,4704,4705],{},"internally","—our own wandering thoughts. To stay focused, we need consistency: the discipline to ignore sudden distractions and stick to the task at hand.",[11,4708,4709],{},"This requires training. For example, as I write this post, my brain urges me to check the environment installation progress or switch to another task. I consciously ignore those urges to finish this article. It sounds odd, but I know many people experience this too.",[11,4711,4712],{},"If I switched tasks to check the installation status, this post would likely end up abandoned in my drafts. Why? Because revisiting it later would feel less urgent—my initial motivation would fade.",[11,4714,4715],{},"By staying focused on writing, I’ve managed to complete this post faster.",[26,4717,4652],{"id":4718},"my-battle-with-distractions",[11,4720,4721],{},"Actually, while writing this post, distractions flooded in: checking the installation, skipping disliked songs, glancing at phone notifications, and even shifting my sitting position.",[11,4723,4724,4725,4728],{},"Yet, focusing solely on this post proved that ",[204,4726,4727],{},"single-tasking works",". I finished it thoroughly and efficiently.",[11,4730,4731],{},"I am far away from keeping the mindset 'FOCUS', and learning about that is a never-ending process.",[11,4733,4734],{},"The best tool to keep our mind focused is also our mind, only ourselves that can maintain the focus.",[26,4736,3905],{"id":3904},[11,4738,4739],{},"I wrote this post for myself—to prove that focusing on one task at a time helps me complete work faster. By dedicating our brain’s full resources to a single goal, we achieve better results.",[11,4741,4742],{},"If you’ve felt the same struggle, I hope this resonates with you. Let’s train our brains to embrace depth over breadth.",[11,4744,4745],{},"Struggling with multitasking? Share your story in the comments—or tag someone who needs this reminder! 💡",[11,4747,4748],{},[204,4749,4750],{},"Cheers!",[11,4752,4753],{},"References:",[208,4755,4756,4763],{},[211,4757,4758],{},[2733,4759,4762],{"href":4760,"rel":4761},"https:\u002F\u002Fwww.apa.org\u002Ftopics\u002Fresearch\u002Fmultitasking",[2737],"American Psychological Association: Multitasking Costs",[211,4764,4765],{},[2733,4766,4769],{"href":4767,"rel":4768},"https:\u002F\u002Fhbr.org\u002Ffocus",[2737],"Harvard Business Review: The Focused Mind",{"title":47,"searchDepth":158,"depth":158,"links":4771},[4772,4773,4774,4775,4776],{"id":4626,"depth":158,"text":4627},{"id":4678,"depth":158,"text":4640},{"id":4693,"depth":158,"text":4646},{"id":4718,"depth":158,"text":4652},{"id":3904,"depth":158,"text":3905},{},"\u002Fblog\u002F2025\u002Fmultitasking-looks-impressive-but-hides-many-problems","2025-02-12",{"title":4618,"description":4623},"blog\u002F2025\u002Fmultitasking-looks-impressive-but-hides-many-problems",[1990,4783],"mindfulness","kHVmR3cYO_NvTMG6Ypw7VEmOZXMUxhXdUQnDr7JjUHc",{"id":4786,"title":4787,"author":178,"body":4788,"description":4792,"draft":162,"extension":163,"featured":162,"meta":5147,"navigation":165,"ogImage":4798,"path":5148,"pubDatetime":5149,"seo":5150,"stem":5151,"tags":5152,"__hash__":5154},"blog\u002Fblog\u002F2025\u002Fhow-to-change-the-default-location-for-saving-conda-environments-in-windows.md","How to Change Conda Env Location on Windows",{"type":8,"value":4789,"toc":5133},[4790,4793,4799,4802,4872,4875,4889,4896,4899,4902,4909,4920,4923,4926,4933,4936,4939,4942,4945,4966,4969,4975,4981,4984,4998,5007,5010,5024,5027,5030,5036,5039,5058,5070,5073,5080,5086,5092,5098,5101,5104,5107,5113,5116,5122,5124,5127,5130],[11,4791,4792],{},"How to change the default location for saving environment Conda in Windows",[11,4794,4795],{},[4217,4796],{"alt":4797,"src":4798},"Anaconda Image","\u002Fimages\u002Fconda-image.jpg",[26,4800,4801],{"id":4626},"Table of Contents",[208,4803,4804,4808,4814,4820,4826,4832,4838,4844,4850,4856,4862,4868],{},[211,4805,4806],{},[2733,4807,4801],{"href":4634},[211,4809,4810],{},[2733,4811,4813],{"href":4812},"#introduction---why-should-change","Introduction - Why Should Change?",[211,4815,4816],{},[2733,4817,4819],{"href":4818},"#why-change-the-default-env-location","Why Change the Default Env Location?",[211,4821,4822],{},[2733,4823,4825],{"href":4824},"#why-not-use-venv","Why Not Use Venv?",[211,4827,4828],{},[2733,4829,4831],{"href":4830},"#how-to-change-the-location-env-conda","How To Change the Location ENV Conda",[211,4833,4834],{},[2733,4835,4837],{"href":4836},"#step-1-locate-and-edit-the-condarc","Step 1: Locate and Edit the .condarc",[211,4839,4840],{},[2733,4841,4843],{"href":4842},"#step-2-add-new-environment-directories","Step 2: Add New Environment Directories",[211,4845,4846],{},[2733,4847,4849],{"href":4848},"#how-to-create-a-new-environment-in-a-new-location","How to Create a New Environment in a New Location",[211,4851,4852],{},[2733,4853,4855],{"href":4854},"#step-3-create-a-new-env","Step 3: Create a New Env",[211,4857,4858],{},[2733,4859,4861],{"href":4860},"#activating-new-env","Activating New Env",[211,4863,4864],{},[2733,4865,4867],{"href":4866},"#remove-the-env","Remove The Env",[211,4869,4870],{},[2733,4871,3905],{"href":4657},[26,4873,4813],{"id":4874},"introduction-why-should-change",[11,4876,4877,4882,4883,4888],{},[2733,4878,4881],{"href":4879,"rel":4880},"https:\u002F\u002Fwww.anaconda.com\u002Fdownload",[2737],"Anaconda"," is a popular open-source distribution of Python and R programming languages, specifically designed for data science, machine learning, and scientific computing. It comes with a powerful package manager called**",[2733,4884,4887],{"href":4885,"rel":4886},"https:\u002F\u002Fdocs.conda.io\u002F",[2737],"Conda","**, which simplifies the process of creating, managing, and switching between virtual environments. Virtual environments are isolated spaces where you can install specific versions of Python and libraries without affecting your system-wide setup.",[11,4890,4891,4892,4895],{},"However, one common issue Anaconda users face is the",[204,4893,4894],{},"default location for saving environments",". By default, Conda stores environments on the system drive (usually C:), which can quickly consume valuable disk space—especially if you work with multiple environments for testing, development, or different projects. If your system drive is running out of space, moving or adding a new location for Conda environments can be a lifesaver.",[11,4897,4898],{},"In this guide, I’ll show you how to change the default location for Conda environments in Windows and add a new directory to store your environments on another drive.",[26,4900,4819],{"id":4901},"why-change-the-default-env-location",[11,4903,4904,4905,4908],{},"The primary reason to change the default location is",[204,4906,4907],{},"disk space management",". If your system drive (C:) is running low on storage, moving your Conda environments to another drive with more free space can help. This is particularly useful if you:",[208,4910,4911,4914,4917],{},[211,4912,4913],{},"Work with multiple environments for different projects.",[211,4915,4916],{},"Use large libraries or datasets that take up significant space.",[211,4918,4919],{},"Want to keep your system drive clean and optimized.",[11,4921,4922],{},"I faced this issue myself when my C: drive was nearly full due to numerous Conda environments. Even after cleaning up unused environments, the space consumption was still significant. That’s when I decided to explore how to move or add a new location for Conda environments.",[26,4924,4825],{"id":4925},"why-not-use-venv",[11,4927,4928,4929,4932],{},"Before diving into Conda, I considered using Python’s built-in",[204,4930,4931],{},"venv","module to create virtual environments. However, I quickly realized that venv has limitations, especially when working with multiple Python versions. With venv, you need to install the specific Python version on your system before creating an environment, which adds unnecessary complexity.",[11,4934,4935],{},"Conda, on the other hand, allows you to specify the Python version directly when creating an environment, without needing to pre-install it. This makes Conda a more flexible and user-friendly option for managing environments. However, I still needed a way to move or add a new location for Conda environments to free up space on my system drive.",[26,4937,4831],{"id":4938},"how-to-change-the-location-env-conda",[11,4940,4941],{},"To change the default location for Conda environments, you’ll need to modify the**.condarc**file. This file contains configuration settings for Conda, including the directories where environments are stored.",[26,4943,4837],{"id":4944},"step-1-locate-and-edit-the-condarc",[249,4946,4947,4953,4960],{},[211,4948,4949,4950,1490],{},"Open your file explorer and navigate to your home directory (usually ",[34,4951,4952],{},"C:\\Users\\YourUsername",[211,4954,4955,4956,4959],{},"Look for a file named ",[34,4957,4958],{},".condarc",". If it doesn’t exist, you can create one.",[211,4961,4962,4963,4965],{},"Open the ",[34,4964,4958],{}," file in a text editor (e.g., Notepad or VS Code).",[26,4967,4843],{"id":4968},"step-2-add-new-environment-directories",[11,4970,4971,4972,4974],{},"In the ",[34,4973,4958],{}," file, add the following lines to specify the default and new environment directories:",[42,4976,4979],{"className":4977,"code":4978,"language":259},[257],"envs_dirs:\n  - C:\\Users\\YourUsername\\Anaconda3\\envs  # Default location\n  - D:\\anaconda-envs  # New location\n",[34,4980,4978],{"__ignoreMap":47},[11,4982,4983],{},"In this example:",[208,4985,4986,4992],{},[211,4987,4988,4991],{},[34,4989,4990],{},"C:\\Users\\YourUsername\\Anaconda3\\envs"," is the default location where Conda stores environments.",[211,4993,4994,4997],{},[34,4995,4996],{},"D:\\anaconda-envs","is the new directory on another drive where you want to store environments.",[11,4999,5000,5001,5003,5004,5006],{},"**Note:**Make sure to create the new directory (e.g.,",[34,5002,4996],{},") before editing the",[34,5005,4958],{},"file.",[26,5008,4849],{"id":5009},"how-to-create-a-new-environment-in-a-new-location",[11,5011,5012,5013,5015,5016,5019,5020,5023],{},"Once you’ve added the new directory to the",[34,5014,4958],{},"file, you can create environments in the new location using the",[34,5017,5018],{},"conda create","command with the",[34,5021,5022],{},"-p","(prefix) option.",[26,5025,4855],{"id":5026},"step-3-create-a-new-env",[11,5028,5029],{},"To create a new environment in the new location, use the following command:",[42,5031,5034],{"className":5032,"code":5033,"language":259},[257],"conda create -p D:\\anaconda-envs\\env-demo python=3.9\n",[34,5035,5033],{"__ignoreMap":47},[11,5037,5038],{},"Here’s what each part of the command does:",[208,5040,5041,5046,5052],{},[211,5042,5043,5045],{},[34,5044,5018],{},": The basic command to create a new environment.",[211,5047,5048,5051],{},[34,5049,5050],{},"-p D:\\anaconda-envs\\env-demo",": Specifies the path where the new environment will be created.",[211,5053,5054,5057],{},[34,5055,5056],{},"python=3.9",": Specifies the Python version for the environment.",[11,5059,5060,5062,5063,5066,5067,5069],{},[204,5061,2238],{}," Unlike the default ",[34,5064,5065],{},"conda create -n env-name"," command, the ",[34,5068,5022],{}," option allows you to specify the exact path for the environment.",[26,5071,4861],{"id":5072},"activating-new-env",[11,5074,5075,5076,5079],{},"To activate the environment, use the",[34,5077,5078],{},"conda activate","a command followed by the full path to the environment:",[42,5081,5084],{"className":5082,"code":5083,"language":259},[257],"conda activate D:\\anaconda-envs\\env-demo\n",[34,5085,5083],{"__ignoreMap":47},[11,5087,5088,5089,379],{},"Or, you just activate using the name of env like this, since the new env is recognized on the ",[34,5090,5091],{},"conda env list",[42,5093,5096],{"className":5094,"code":5095,"language":259},[257],"conda activate env-demo\n",[34,5097,5095],{"__ignoreMap":47},[11,5099,5100],{},"Once activated, you’ll see the environment name in your terminal prompt, indicating that the environment is active.",[26,5102,4867],{"id":5103},"remove-the-env",[11,5105,5106],{},"Removing the env with a custom prefix is slightly different from the normal way to remove the conda env. Usually, we can use this to remove the Conda env:",[42,5108,5111],{"className":5109,"code":5110,"language":259},[257],"conda remove -n test_env --all\n",[34,5112,5110],{"__ignoreMap":47},[11,5114,5115],{},"But, to remove the environment with a custom location, we can do this:",[42,5117,5120],{"className":5118,"code":5119,"language":259},[257],"conda env remove -p your\u002Fcustom\u002Fpath\u002Fenv\n",[34,5121,5119],{"__ignoreMap":47},[26,5123,3905],{"id":3904},[11,5125,5126],{},"Managing disk space is crucial when working with multiple Conda environments, especially if your system drive is running low on storage. By adding a new location for Conda environments, you can keep your system drive clean and organized while taking advantage of Conda’s powerful environment management features.",[11,5128,5129],{},"Anaconda and Conda are incredibly versatile tools for data scientists, developers, and anyone working with Python. Whether you’re testing different library versions or working on multiple projects, Conda makes it easy to create and manage isolated environments without worrying about conflicts.",[11,5131,5132],{},"Now that you know how to change the default location for Conda environments, you can optimize your workflow and make the most of your available storage. Happy coding!",{"title":47,"searchDepth":158,"depth":158,"links":5134},[5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146],{"id":4626,"depth":158,"text":4801},{"id":4874,"depth":158,"text":4813},{"id":4901,"depth":158,"text":4819},{"id":4925,"depth":158,"text":4825},{"id":4938,"depth":158,"text":4831},{"id":4944,"depth":158,"text":4837},{"id":4968,"depth":158,"text":4843},{"id":5009,"depth":158,"text":4849},{"id":5026,"depth":158,"text":4855},{"id":5072,"depth":158,"text":4861},{"id":5103,"depth":158,"text":4867},{"id":3904,"depth":158,"text":3905},{},"\u002Fblog\u002F2025\u002Fhow-to-change-the-default-location-for-saving-conda-environments-in-windows","2025-02-11",{"title":4787,"description":4792},"blog\u002F2025\u002Fhow-to-change-the-default-location-for-saving-conda-environments-in-windows",[5153,4097],"conda","rJM6T-kMhyPYxjGddQF2zjeubDdiGAtZf5_K1GAYrjQ",{"id":5156,"title":5157,"author":178,"body":5158,"description":5162,"draft":162,"extension":163,"featured":162,"meta":5405,"navigation":165,"ogImage":166,"path":5406,"pubDatetime":5407,"seo":5408,"stem":5409,"tags":5410,"__hash__":5413},"blog\u002Fblog\u002F2025\u002Fvitepress-a-simple-documentation-site-and-production-ready.md","Vitepress: A Simple Documentation Site, and Production Ready!",{"type":8,"value":5159,"toc":5396},[5160,5163,5165,5168,5179,5184,5187,5189,5228,5231,5234,5237,5240,5243,5246,5249,5252,5255,5258,5261,5264,5270,5276,5282,5288,5291,5294,5297,5300,5303,5309,5312,5318,5321,5326,5329,5335,5341,5344,5347,5353,5356,5359,5376,5385,5388,5390,5393],[11,5161,5162],{},"Create a simple yet powerful documentation site using Vitepress",[26,5164,895],{"id":894},[11,5166,5167],{},"Storing documentation in traditional ways, such as using Microsoft Office and saving files on a NAS server, can be cumbersome and time-consuming. Finding specific documents often feels like looking for a needle in a haystack. To solve this issue, I experimented with various tools to create documentation for all the projects in my company, particularly for my team.",[11,5169,5170,5171,5174,5175,5178],{},"Eventually, I discovered ",[204,5172,5173],{},"Vitepress",", a tool that makes creating and maintaining documentation easier. Since Markdown powers Vitepress, it seamlessly integrates with my existing documents in ",[34,5176,5177],{},".docx"," format, requiring minimal changes.",[4568,5180,5181],{},[11,5182,5183],{},"Because Vitepress uses Vue, it’s a natural fit for me. My familiarity with Vue from previous projects made Vitepress an obvious choice.",[11,5185,5186],{},"In this post, I’ll walk you through how to set up Vitepress to kickstart your own documentation site and explain why it could be the ideal tool for your projects.",[26,5188,4627],{"id":4626},[208,5190,5191,5196,5200,5206,5212,5218,5224],{},[211,5192,5193],{},[2733,5194,895],{"href":5195},"#introduction",[211,5197,5198],{},[2733,5199,4627],{"href":4634},[211,5201,5202],{},[2733,5203,5205],{"href":5204},"#features-of-vitepress","Features of Vitepress",[211,5207,5208],{},[2733,5209,5211],{"href":5210},"#use-case-vitepress","Use Case Vitepress",[211,5213,5214],{},[2733,5215,5217],{"href":5216},"#installing-vitepress","Installing Vitepress",[211,5219,5220],{},[2733,5221,5223],{"href":5222},"#customizing-vitepress","Customizing Vitepress",[211,5225,5226],{},[2733,5227,3905],{"href":4657},[26,5229,5205],{"id":5230},"features-of-vitepress",[11,5232,5233],{},"Vitepress stands out due to its unique features:",[11,5235,5236],{},"1. Markdown-Powered: Write documentation in Markdown, which is easy to learn and use.",[11,5238,5239],{},"2. Vue-Powered: Leverage Vue components for advanced interactivity.",[11,5241,5242],{},"3. Static Site Generation: Build fast, SEO-friendly static sites.",[11,5244,5245],{},"4. Lightweight and Fast: Optimized for performance and simplicity.",[11,5247,5248],{},"5. Customizable Themes: Adjust styles and layouts to fit your brand.",[11,5250,5251],{},"6. Built-in Search: Enable readers to find content quickly.",[11,5253,5254],{},"7. Dark Mode Support: Improve readability in low-light conditions.",[11,5256,5257],{},"These features make Vitepress a versatile and powerful tool for creating documentation sites.",[26,5259,5211],{"id":5260},"use-case-vitepress",[11,5262,5263],{},"Vitepress can be used in various scenarios:",[11,5265,5266,5269],{},[204,5267,5268],{},"Internal Documentation:"," Streamline your team’s knowledge-sharing process.",[11,5271,5272,5275],{},[204,5273,5274],{},"Open-Source Projects:"," Host documentation for your open-source libraries or tools.",[11,5277,5278,5281],{},[204,5279,5280],{},"Corporate Knowledge Bases:"," Create a centralized hub for company policies, guides, and FAQs.",[11,5283,5284,5287],{},[204,5285,5286],{},"Personal Projects:"," Showcase tutorials, guides, or portfolios.",[11,5289,5290],{},"Whether for professional or personal use, Vitepress adapts to your needs.",[26,5292,5217],{"id":5293},"installing-vitepress",[11,5295,5296],{},"Before installing Vitepress, ensure you have Node.js installed. I highly recommend using **NVM** (Node Version Manager) for easier management of Node.js versions.",[11,5298,5299],{},"To install Vitepress, follow these steps:",[11,5301,5302],{},"1. Add Vitepress as a development dependency:",[42,5304,5307],{"className":5305,"code":5306,"language":259},[257],"npm add -D vitepress\n",[34,5308,5306],{"__ignoreMap":47},[11,5310,5311],{},"2. Initialize a Vitepress project and answer a few setup questions:",[42,5313,5316],{"className":5314,"code":5315,"language":259},[257],"npx vitepress init\n",[34,5317,5315],{"__ignoreMap":47},[11,5319,5320],{},"Here’s a sample of how I answered the setup questions:",[11,5322,5323],{},[4662,5324,5325],{},"Your answers may vary depending on your project requirements.",[11,5327,5328],{},"3. Once setup is complete, run the following command to start your Vitepress project:",[42,5330,5333],{"className":5331,"code":5332,"language":259},[257],"npm run docs:dev\n",[34,5334,5332],{"__ignoreMap":47},[11,5336,5337,5338,816],{},"4. Access your documentation site at: ",[34,5339,5340],{},"http:\u002F\u002Flocalhost:5173",[26,5342,5223],{"id":5343},"customizing-vitepress",[11,5345,5346],{},"Now comes the exciting part: customizing your documentation site to fit your needs. Customization in Vitepress revolves around editing the `config.js` file, located at:",[42,5348,5351],{"className":5349,"code":5350,"language":259},[257],".\u002Fdocs\u002F.vitepress\u002Fconfig.js\n",[34,5352,5350],{"__ignoreMap":47},[11,5354,5355],{},"If you opted for TypeScript during initialization, the configuration file will have a `.mts` extension instead of `.js`.",[11,5357,5358],{},"Some key customization options include:",[208,5360,5361,5364,5367,5370,5373],{},[211,5362,5363],{},"Adding navigation menus",[211,5365,5366],{},"Setting up a homepage",[211,5368,5369],{},"Configuring a theme",[211,5371,5372],{},"Implementing search functionality",[211,5374,5375],{},"Enabling dark mode for better accesibility",[11,5377,5378,5379,5384],{},"Refer to the ",[2733,5380,5383],{"href":5381,"rel":5382},"https:\u002F\u002Fvitepress.dev",[2737],"official Vitepress documentation"," for a comprehensive guide to all features.",[11,5386,5387],{},"In my case, I used Vitepress to deploy my internal documentation. The flexibility of Markdown and the lightweight nature of Vitepress made it an excellent choice.",[26,5389,3905],{"id":3904},[11,5391,5392],{},"Using Vitepress gives you complete control over your documentation. It is especially suited for internal usage due to its simplicity and Markdown support, making documentation more concise and manageable. Its features, such as customizable themes, static site generation, and seamless integration with Vue, make it a reliable tool for any project.",[11,5394,5395],{},"I look forward to exploring Vitepress further and unlocking its full potential for our documentation needs. Whether you are an individual developer or part of a larger team, Vitepress can help you create a documentation site that is both user-friendly and efficient.",{"title":47,"searchDepth":158,"depth":158,"links":5397},[5398,5399,5400,5401,5402,5403,5404],{"id":894,"depth":158,"text":895},{"id":4626,"depth":158,"text":4627},{"id":5230,"depth":158,"text":5205},{"id":5260,"depth":158,"text":5211},{"id":5293,"depth":158,"text":5217},{"id":5343,"depth":158,"text":5223},{"id":3904,"depth":158,"text":3905},{},"\u002Fblog\u002F2025\u002Fvitepress-a-simple-documentation-site-and-production-ready","2025-01-14",{"title":5157,"description":5162},"blog\u002F2025\u002Fvitepress-a-simple-documentation-site-and-production-ready",[5411,5412],"documentation","vitepress","q2K44qcfNd3KrfELfA-mCHC7x38XBhIUhK4Vvjqi8mk",{"id":5415,"title":5416,"author":6,"body":5417,"description":5989,"draft":162,"extension":163,"featured":162,"meta":5990,"navigation":165,"ogImage":166,"path":5991,"pubDatetime":5992,"seo":5993,"stem":5994,"tags":5995,"__hash__":5997},"blog\u002Fblog\u002F2024\u002Faccelerating-lan-network-speed-a-deep-dive-into-performance-testing-with-docker-and-iperf3.md","How To Analyze Network Speed Using Iperf3 and Docker",{"type":8,"value":5418,"toc":5957},[5419,5422,5424,5426,5429,5432,5435,5438,5441,5444,5448,5451,5455,5458,5462,5465,5476,5479,5483,5486,5489,5493,5496,5500,5503,5507,5511,5514,5529,5533,5536,5542,5572,5578,5610,5616,5620,5631,5634,5638,5641,5644,5648,5653,5665,5671,5676,5683,5713,5716,5719,5722,5769,5772,5776,5779,5783,5794,5798,5806,5810,5818,5822,5830,5833,5837,5840,5844,5847,5851,5855,5863,5867,5875,5879,5887,5891,5896,5900,5903,5907,5921,5925,5936,5940,5951,5954],[11,5420,5421],{},"A walkthrough to examine performance LAN network speed with Docker",[3913,5423],{},[26,5425,895],{"id":894},[11,5427,5428],{},"Think about the last time you streamed a video, shared files, or worked on a project online. You probably didn’t give much thought to your network speed, but it’s what keeps everything running smoothly behind the scenes.",[11,5430,5431],{},"Your local area network (LAN) speed is like the highway for your digital data, determining how quickly information travels between devices. When your network is slow, it can feel like you’re stuck in traffic, waiting for files to load or videos to buffer.",[11,5433,5434],{},"That’s where speed testing comes in. It’s like checking the speedometer on your car to make sure everything’s running smoothly. By testing your LAN speed, you can spot any slowdowns or bottlenecks and fix them before they cause problems.",[11,5436,5437],{},"In this article, we’ll show you how to test your LAN speed using two handy tools: Docker and iperf3. Docker is like a virtual toolbox for running software, and iperf3 is a nifty tool for measuring network performance.",[11,5439,5440],{},"We’ll walk you through setting up an iperf3 server using Docker, configuring the iperf3 client for testing, and understanding the results. By the end, you’ll be able to fine-tune your network like a pro and keep things running smoothly.",[11,5442,5443],{},"Let’s get started! 🚀",[26,5445,5447],{"id":5446},"understanding-lan-network-speed-testing","Understanding LAN Network Speed Testing",[11,5449,5450],{},"Have you ever experienced frustratingly slow internet speeds, even though you’re connected to a high-speed network? Understanding LAN network speed testing can help shed light on these issues and pave the way for smoother digital experiences.",[581,5452,5454],{"id":5453},"why-test-lan-network-speed","Why Test LAN Network Speed?",[11,5456,5457],{},"Testing LAN network speed is essential for ensuring that your network operates at its best. It’s like checking the pulse of your network to make sure it’s healthy and functioning optimally. By conducting regular speed tests, you can identify any bottlenecks or issues that may be slowing down your network and take steps to address them.",[581,5459,5461],{"id":5460},"factors-affecting-performance","Factors Affecting Performance",[11,5463,5464],{},"Several factors can impact LAN network performance, including:",[208,5466,5467,5470,5473],{},[211,5468,5469],{},"Bandwidth: The amount of data that can be transmitted over your network at any given time.",[211,5471,5472],{},"Latency: The time it takes for data to travel from one point to another on your network.",[211,5474,5475],{},"Congestion: When too many devices are trying to use the network at once, leading to slowdowns and delays.",[11,5477,5478],{},"Understanding these factors is key to diagnosing and resolving performance issues on your LAN.",[581,5480,5482],{"id":5481},"introduction-to-iperf3","Introduction to iperf3",[11,5484,5485],{},"iperf3 is a powerful tool for conducting LAN network speed tests. It allows you to measure the bandwidth, throughput, and latency of your network with precision. With iperf3, you can simulate real-world network conditions and identify areas for improvement.",[11,5487,5488],{},"In the next sections, we’ll dive deeper into how to use iperf3 to test your LAN network speed and optimize its performance.",[26,5490,5492],{"id":5491},"setting-up-the-iperf3-server-with-docker","Setting Up the iperf3 Server with Docker",[11,5494,5495],{},"Setting up an iperf3 server with Docker offers several advantages, including ease of deployment, isolation, and scalability. In this section, we’ll walk you through the process of creating and running the iperf3 server container using Docker.",[26,5497,5499],{"id":5498},"why-use-docker","Why Use Docker?",[11,5501,5502],{},"Docker provides a convenient platform for containerizing applications, allowing you to package software and its dependencies into a standardized unit for easy deployment. By using Docker, you can ensure consistency across different environments and simplify the process of setting up and managing the iperf3 server.",[26,5504,5506],{"id":5505},"step-by-step-instructions","Step-by-Step Instructions📑",[26,5508,5510],{"id":5509},"pull-the-iperf3-docker-image","Pull the iperf3 Docker Image",[11,5512,5513],{},"Start by pulling the iperf3 Docker image from the Docker Hub repository using the following command:",[42,5515,5517],{"className":44,"code":5516,"language":46,"meta":47,"style":47},"docker pull networkstatic\u002Fiperf3\n",[34,5518,5519],{"__ignoreMap":47},[51,5520,5521,5523,5526],{"class":53,"line":54},[51,5522,131],{"class":57},[51,5524,5525],{"class":69}," pull",[51,5527,5528],{"class":69}," networkstatic\u002Fiperf3\n",[26,5530,5532],{"id":5531},"run-the-iperf3-server-container","Run the iperf3 Server Container",[11,5534,5535],{},"Once the image is pulled, you can run the iperf3 server container using Docker. You have two options:",[11,5537,5538,5541],{},[204,5539,5540],{},"Direct Command",": Run the container directly with the command provided earlier:",[42,5543,5545],{"className":44,"code":5544,"language":46,"meta":47,"style":47},"docker run -it --rm --name=iperf3-server -p 5201:5201 networkstatic\u002Fiperf3 -s\n",[34,5546,5547],{"__ignoreMap":47},[51,5548,5549,5551,5553,5555,5558,5561,5563,5566,5569],{"class":53,"line":54},[51,5550,131],{"class":57},[51,5552,276],{"class":69},[51,5554,137],{"class":61},[51,5556,5557],{"class":61}," --rm",[51,5559,5560],{"class":61}," --name=iperf3-server",[51,5562,1022],{"class":61},[51,5564,5565],{"class":69}," 5201:5201",[51,5567,5568],{"class":69}," networkstatic\u002Fiperf3",[51,5570,5571],{"class":61}," -s\n",[11,5573,5574,5577],{},[204,5575,5576],{},"Batch File",": If you have a batch file named “start_server.bat” that contains the Docker command, simply double-click the batch file to start the iperf3 server container.",[42,5579,5581],{"className":44,"code":5580,"language":46,"meta":47,"style":47},"@echo off\ndocker run  -it --rm --name=iperf3-server -p 5201:5201 networkstatic\u002Fiperf3 -s\n",[34,5582,5583,5589],{"__ignoreMap":47},[51,5584,5585,5587],{"class":53,"line":54},[51,5586,931],{"class":57},[51,5588,934],{"class":69},[51,5590,5591,5593,5595,5598,5600,5602,5604,5606,5608],{"class":53,"line":158},[51,5592,131],{"class":57},[51,5594,276],{"class":69},[51,5596,5597],{"class":61},"  -it",[51,5599,5557],{"class":61},[51,5601,5560],{"class":61},[51,5603,1022],{"class":61},[51,5605,5565],{"class":69},[51,5607,5568],{"class":69},[51,5609,5571],{"class":61},[11,5611,5612,5615],{},[204,5613,5614],{},"Verify Server Status",": After running the container, you should see an output indicating that the iperf3 server is listening for connections on port 5201.",[26,5617,5619],{"id":5618},"tips-for-optimization","Tips for Optimization",[208,5621,5622,5625,5628],{},[211,5623,5624],{},"Consider specifying additional parameters when running the iperf3 server container, such as limiting bandwidth ( — bandwidth) or specifying the protocol ( — udp or — tcp), to simulate specific network conditions.",[211,5626,5627],{},"Monitor container resource usage and adjust container settings as needed to ensure optimal performance.",[211,5629,5630],{},"Regularly update the iperf3 Docker image to ensure you have the latest features and security patches.",[11,5632,5633],{},"By following these steps and tips, you can set up an iperf3 server with Docker quickly and efficiently, allowing you to conduct LAN network speed tests with ease.",[26,5635,5637],{"id":5636},"configuring-the-iperf3-client-for-speed-testing","Configuring the iperf3 Client for Speed Testing",[11,5639,5640],{},"Now that we have the iperf3 server up and running, it’s time to configure the iperf3 client for conducting speed tests on our LAN network. In this section, we’ll walk you through the process of configuring and running the iperf3 client container for conducting LAN speed tests.",[11,5642,5643],{},"Understanding the iperf3 Client The iperf3 client plays a crucial role in LAN speed testing by initiating connections to the iperf3 server and measuring the network performance between the client and server. It allows you to specify various parameters, such as the duration of the test, the protocol to use (TCP or UDP), and the target server’s address.",[26,5645,5647],{"id":5646},"step-by-step-instructions-1","Step-by-Step Instructions",[11,5649,5650,5652],{},[204,5651,5510],{},": If you haven’t already done so, pull the iperf3 Docker image from the Docker Hub repository using the following command:",[42,5654,5655],{"className":44,"code":5516,"language":46,"meta":47,"style":47},[34,5656,5657],{"__ignoreMap":47},[51,5658,5659,5661,5663],{"class":53,"line":54},[51,5660,131],{"class":57},[51,5662,5525],{"class":69},[51,5664,5528],{"class":69},[11,5666,5667,5670],{},[204,5668,5669],{},"Run the iperf3 Client Container",": Once the image is pulled, you can run the iperf3 client container using Docker. You have two options: Direct command or use batch file.",[26,5672,5674],{"id":5673},"direct-command",[204,5675,5540],{},[11,5677,5678,5679,5682],{},"Use the following command to start the client container and initiate a speed test, replacing ",[34,5680,5681],{},"\u003Cip_address>"," with the IP address of the iperf3 server:",[42,5684,5686],{"className":44,"code":5685,"language":46,"meta":47,"style":47},"docker run -it --rm networkstatic\u002Fiperf3 -c \u003Cip_address>\n",[34,5687,5688],{"__ignoreMap":47},[51,5689,5690,5692,5694,5696,5698,5700,5703,5705,5708,5711],{"class":53,"line":54},[51,5691,131],{"class":57},[51,5693,276],{"class":69},[51,5695,137],{"class":61},[51,5697,5557],{"class":61},[51,5699,5568],{"class":69},[51,5701,5702],{"class":61}," -c",[51,5704,341],{"class":340},[51,5706,5707],{"class":69},"ip_addres",[51,5709,5710],{"class":347},"s",[51,5712,351],{"class":340},[11,5714,5715],{},"You need to change the ip_address to your location of iperf3-server.",[26,5717,5576],{"id":5718},"batch-file",[11,5720,5721],{},"If you have a batch file named “run_iperf3_client.bat” that prompts for the IP address of the server and contains the Docker command, simply double-click the batch file to start the iperf3 client container.",[42,5723,5725],{"className":44,"code":5724,"language":46,"meta":47,"style":47},"@echo off\nset \u002Fp ip_address=Input the IP server:\ndocker run -it --rm networkstatic\u002Fiperf3 -c %ip_address%\n",[34,5726,5727,5733,5752],{"__ignoreMap":47},[51,5728,5729,5731],{"class":53,"line":54},[51,5730,931],{"class":57},[51,5732,934],{"class":69},[51,5734,5735,5737,5740,5743,5746,5749],{"class":53,"line":158},[51,5736,4382],{"class":949},[51,5738,5739],{"class":69}," \u002Fp",[51,5741,5742],{"class":69}," ip_address=Input",[51,5744,5745],{"class":69}," the",[51,5747,5748],{"class":69}," IP",[51,5750,5751],{"class":69}," server:\n",[51,5753,5754,5756,5758,5760,5762,5764,5766],{"class":53,"line":296},[51,5755,131],{"class":57},[51,5757,276],{"class":69},[51,5759,137],{"class":61},[51,5761,5557],{"class":61},[51,5763,5568],{"class":69},[51,5765,5702],{"class":61},[51,5767,5768],{"class":69}," %ip_address%\n",[11,5770,5771],{},"This will create a prompt to insert the IP address then it will run the docker image. You only need to run the bat file.",[26,5773,5775],{"id":5774},"interpreting-test-results","Interpreting Test Results",[11,5777,5778],{},"The output from iperf provides important information about how well your network performed during the speed test. Let’s look at the main points:",[26,5780,5782],{"id":5781},"bitrate-speed","Bitrate (Speed)",[208,5784,5785,5788,5791],{},[211,5786,5787],{},"This tells you how fast data moved between the iperf3 client and server, measured in megabits per second (Mbps).",[211,5789,5790],{},"Each line shows the speed during a specific period (like 0.00–1.00 seconds, 1.00–2.00 seconds, etc.).",[211,5792,5793],{},"The average speed for the whole test is also provided.",[26,5795,5797],{"id":5796},"transfer-amount-transferred","Transfer (Amount Transferred)",[208,5799,5800,5803],{},[211,5801,5802],{},"This shows how much data was sent between the client and server during the test, measured in megabytes (MB).",[211,5804,5805],{},"It adds up all the data transferred during the entire test.",[26,5807,5809],{"id":5808},"retransmits-re-sent-data","Retransmits (Re-sent Data)",[208,5811,5812,5815],{},[211,5813,5814],{},"This tells you how many times data had to be resent because of errors or problems during transmission.",[211,5816,5817],{},"More retransmits could mean there were issues with the connection or too much traffic on the network.",[26,5819,5821],{"id":5820},"congestion-window-traffic-control","Congestion Window (Traffic Control):",[208,5823,5824,5827],{},[211,5825,5826],{},"This shows how many packets of data were allowed to travel at once on the network.",[211,5828,5829],{},"Monitoring this can help understand how the network handles traffic and controls congestion.",[11,5831,5832],{},"By understanding these points, you can see how well your network performed and if there were any problems during the test. For example, a steady speed with few retransmits usually means a good connection, while fluctuating speeds or many retransmits might indicate issues to look into.",[15,5834,5836],{"id":5835},"optimizing-lan-network-performance","Optimizing LAN Network Performance",[11,5838,5839],{},"Now that you’ve conducted LAN speed tests and analyzed the results, it’s time to optimize your network for improved performance. In this section, we’ll explore strategies and best practices for optimizing LAN network performance based on the insights gained from the speed tests.",[26,5841,5843],{"id":5842},"explanation","Explanation",[11,5845,5846],{},"Understanding the factors that influence LAN network performance is crucial for effective optimization. By identifying areas for improvement revealed by the speed tests, you can implement targeted strategies to enhance your network’s speed, reliability, and efficiency.",[26,5848,5850],{"id":5849},"best-practices","Best Practices",[26,5852,5854],{"id":5853},"optimize-network-configuration","Optimize Network Configuration",[208,5856,5857,5860],{},[211,5858,5859],{},"Ensure your network hardware, such as routers, switches, and cables, is up to date and configured for optimal performance.",[211,5861,5862],{},"Consider upgrading to gigabit Ethernet or higher-speed networking technologies to increase data transfer rates.",[26,5864,5866],{"id":5865},"manage-network-traffic","Manage Network Traffic",[208,5868,5869,5872],{},[211,5870,5871],{},"Prioritize critical traffic by implementing Quality of Service (QoS) policies to ensure essential applications receive sufficient bandwidth.",[211,5873,5874],{},"Limit unnecessary network traffic, such as background updates or file transfers, during peak usage hours to prevent congestion.",[26,5876,5878],{"id":5877},"minimize-latency","Minimize Latency",[208,5880,5881,5884],{},[211,5882,5883],{},"Reduce network latency by optimizing network routing, minimizing packet loss, and implementing caching mechanisms where applicable.",[211,5885,5886],{},"Consider using Ethernet over fiber or other low-latency networking technologies for latency-sensitive applications.",[26,5888,5890],{"id":5889},"enhance-security-measures","Enhance Security Measures",[208,5892,5893],{},[211,5894,5895],{},"Implement robust security measures, such as firewalls, intrusion detection systems, and access controls, to protect your network from unauthorized access and malicious threats.",[15,5897,5899],{"id":5898},"conclusion-and-next-steps","Conclusion and Next Steps",[11,5901,5902],{},"You’ve learned how to optimize your LAN network using Docker and iperf3. Here’s what to do next:",[26,5904,5906],{"id":5905},"key-points-recap","Key Points Recap",[208,5908,5909,5912,5915,5918],{},[211,5910,5911],{},"Tested your LAN network speed with iperf3 to understand its performance.",[211,5913,5914],{},"Set up iperf3 server and client containers with Docker for testing.",[211,5916,5917],{},"Interpreted test results to identify areas for improvement.",[211,5919,5920],{},"Implemented strategies like optimizing network settings and managing traffic for better performance.",[26,5922,5924],{"id":5923},"take-action-now-its-time-to-act","Take Action Now it’s time to act",[208,5926,5927,5930,5933],{},[211,5928,5929],{},"Use what you’ve learned to optimize your network configuration and fix any issues you find.",[211,5931,5932],{},"Follow the best practices for managing traffic, reducing latency, and enhancing security.",[211,5934,5935],{},"Keep an eye on your network’s performance and make adjustments as needed to keep it running smoothly.",[26,5937,5939],{"id":5938},"further-resources-for-more-help","Further Resources For more help",[208,5941,5942,5945,5948],{},[211,5943,5944],{},"Check out Docker and iperf3 documentation for advanced tips.",[211,5946,5947],{},"Join online communities to chat with experts and learn from others.",[211,5949,5950],{},"Explore books and courses on networking to deepen your knowledge.",[11,5952,5953],{},"By applying these steps, you’ll improve your LAN network’s speed and reliability, making for a better digital experience for everyone.",[154,5955,5956],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":47,"searchDepth":158,"depth":158,"links":5958},[5959,5960,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988],{"id":894,"depth":158,"text":895},{"id":5446,"depth":158,"text":5447,"children":5961},[5962,5963,5964],{"id":5453,"depth":296,"text":5454},{"id":5460,"depth":296,"text":5461},{"id":5481,"depth":296,"text":5482},{"id":5491,"depth":158,"text":5492},{"id":5498,"depth":158,"text":5499},{"id":5505,"depth":158,"text":5506},{"id":5509,"depth":158,"text":5510},{"id":5531,"depth":158,"text":5532},{"id":5618,"depth":158,"text":5619},{"id":5636,"depth":158,"text":5637},{"id":5646,"depth":158,"text":5647},{"id":5673,"depth":158,"text":5540},{"id":5718,"depth":158,"text":5576},{"id":5774,"depth":158,"text":5775},{"id":5781,"depth":158,"text":5782},{"id":5796,"depth":158,"text":5797},{"id":5808,"depth":158,"text":5809},{"id":5820,"depth":158,"text":5821},{"id":5842,"depth":158,"text":5843},{"id":5849,"depth":158,"text":5850},{"id":5853,"depth":158,"text":5854},{"id":5865,"depth":158,"text":5866},{"id":5877,"depth":158,"text":5878},{"id":5889,"depth":158,"text":5890},{"id":5905,"depth":158,"text":5906},{"id":5923,"depth":158,"text":5924},{"id":5938,"depth":158,"text":5939},"Tutorial on how to analyze network speed using iperf3 and Docker",{},"\u002Fblog\u002F2024\u002Faccelerating-lan-network-speed-a-deep-dive-into-performance-testing-with-docker-and-iperf3","2024-12-24",{"title":5416,"description":5989},"blog\u002F2024\u002Faccelerating-lan-network-speed-a-deep-dive-into-performance-testing-with-docker-and-iperf3",[131,5996],"network","WT3l72wJtlcvCQZYGb5XnLjD-fAcJZRPgOkRna9_JG0",{"id":5999,"title":6000,"author":6,"body":6001,"description":6005,"draft":162,"extension":163,"featured":162,"meta":6578,"navigation":165,"ogImage":166,"path":6579,"pubDatetime":6580,"seo":6581,"stem":6582,"tags":6583,"__hash__":6584},"blog\u002Fblog\u002F2024\u002Fwordpress-local-development-with-docker-a-complete-guide-100-easy-guaranteed.md","WordPress Local Development with Docker: A Complete Guide! 100% Easy Guaranteed",{"type":8,"value":6002,"toc":6562},[6003,6006,6008,6091,6094,6097,6105,6108,6110,6122,6125,6128,6149,6152,6227,6230,6254,6260,6298,6305,6321,6324,6340,6343,6346,6352,6363,6366,6369,6372,6375,6442,6445,6448,6452,6466,6469,6498,6501,6508,6511,6514,6529,6532,6541,6544,6554,6556,6559],[11,6004,6005],{},"How to Run WordPress on Your Local Machine for Development with the Power of Docker",[26,6007,4801],{"id":4626},[208,6009,6010,6014,6020,6045,6059,6087],{},[211,6011,6012],{},[2733,6013,4801],{"href":4634},[211,6015,6016],{},[2733,6017,6019],{"href":6018},"#why-use-docker-for-local-wordpress-development","Why Use Docker for Local WordPress Development?",[211,6021,6022,6026],{},[2733,6023,6025],{"href":6024},"#how-to-set-up-wordpress-with-docker","How to Set Up WordPress With Docker",[208,6027,6028,6033,6039],{},[211,6029,6030],{},[2733,6031,2012],{"href":6032},"#prerequisites",[211,6034,6035],{},[2733,6036,6038],{"href":6037},"#step-to-perform","Step to Perform",[211,6040,6041],{},[2733,6042,6044],{"href":6043},"#stopping-the-services","Stopping the Services",[211,6046,6047,6051],{},[2733,6048,6050],{"href":6049},"#moving-from-local-development-to-production","Moving from Local Development to Production",[208,6052,6053],{},[211,6054,6055],{},[2733,6056,6058],{"href":6057},"#warning","⚠WARNING⚠",[211,6060,6061,6065],{},[2733,6062,6064],{"href":6063},"#migration-steps","Migration Steps",[208,6066,6067],{},[211,6068,6069,6073],{},[2733,6070,6072],{"href":6071},"#managing-password-securely","Managing Password Securely",[208,6074,6075,6081],{},[211,6076,6077],{},[2733,6078,6080],{"href":6079},"#for-windows-users","For Windows Users",[211,6082,6083],{},[2733,6084,6086],{"href":6085},"#for-linuxmac-users","For Linux\u002FMac Users",[211,6088,6089],{},[2733,6090,3905],{"href":4657},[26,6092,6019],{"id":6093},"why-use-docker-for-local-wordpress-development",[11,6095,6096],{},"As a developer, I once faced the challenge of building a WordPress website directly on a VPS. Making edits directly on the server was cumbersome, risky, and time-consuming. This experience drove me to find a better solution: setting up a local development environment. With Docker, I discovered a powerful and streamlined way to achieve this. I could test, tweak, and perfect the site by building locally before deploying it to the VPS.",[11,6098,6099,6100,816],{},"You can also use Cloudflare Tunnel to expose your local WordPress site to the internet securely. This is especially useful for sharing progress with clients or collaborators without deploying to a live server. For more details, you can check out the documentation: ",[2733,6101,6104],{"href":6102,"rel":6103},"https:\u002F\u002Farzlabserver.my.id\u002Fexposing-your-local-apps-to-the-internet-safely-cloudflare-tunnel-2024\u002F",[2737],"Exposing Your Local Apps to the Internet [SAFELY!] — Cloudflare Tunnel [2024]",[26,6106,6025],{"id":6107},"how-to-set-up-wordpress-with-docker",[581,6109,2012],{"id":2011},[208,6111,6112,6119],{},[211,6113,6114,6115,816],{},"Docker and Docker Compose are installed on your machine. Check their official documentation for do this: ",[2733,6116,877],{"href":6117,"rel":6118},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002Fubuntu\u002F",[2737],[211,6120,6121],{},"Basic understanding of Docker commands and YAML configuration.",[581,6123,6038],{"id":6124},"step-to-perform",[11,6126,6127],{},"1. Clone the Repository",[42,6129,6131],{"className":44,"code":6130,"language":46,"meta":47,"style":47},"git clone https:\u002F\u002Fgithub.com\u002Farizmuajianisan\u002Fdocker-wordpress-mysql-phpmyadmin.git\ncd docker-wordpress-mysql-phpmyadmin\n",[34,6132,6133,6142],{"__ignoreMap":47},[51,6134,6135,6137,6139],{"class":53,"line":54},[51,6136,2444],{"class":57},[51,6138,2447],{"class":69},[51,6140,6141],{"class":69}," https:\u002F\u002Fgithub.com\u002Farizmuajianisan\u002Fdocker-wordpress-mysql-phpmyadmin.git\n",[51,6143,6144,6146],{"class":53,"line":158},[51,6145,2464],{"class":949},[51,6147,6148],{"class":69}," docker-wordpress-mysql-phpmyadmin\n",[11,6150,6151],{},"2. Setup the .env",[208,6153,6154,6164],{},[211,6155,6156,6157,6160,6161],{},"Rename the ",[34,6158,6159],{},".env.EXAMPLE"," file to ",[34,6162,6163],{},".env",[211,6165,6166,6167,6169,6170],{},"Open the ",[34,6168,6163],{}," file and configure the following variables with your values:",[208,6171,6172,6178,6184,6190,6196,6202,6208,6214],{},[211,6173,6174,6177],{},[34,6175,6176],{},"MYSQL_DB_NAME",": Your desired database name.",[211,6179,6180,6183],{},[34,6181,6182],{},"MYSQL_USER",": Your MySQL username.",[211,6185,6186,6189],{},[34,6187,6188],{},"MYSQL_ROOT_PASSWORD",": Your MySQL root password.",[211,6191,6192,6195],{},[34,6193,6194],{},"MYSQL_PASSWORD",": Your MySQL user password.",[211,6197,6198,6201],{},[34,6199,6200],{},"PORT_WORDPRESS",": The port for accessing WordPress.",[211,6203,6204,6207],{},[34,6205,6206],{},"PORT_MYSQL",": The port for accessing the MySQL",[211,6209,6210,6213],{},[34,6211,6212],{},"PORT_PHPMYADMIN",": The port for accessing phpMyAdmin.",[211,6215,6216,6219,6220,6219,6223,6226],{},[34,6217,6218],{},"NAME_WORDPRESS",", ",[34,6221,6222],{},"NABE_DB",[34,6224,6225],{},"NAME_PHPMYADMIN",": Container names for the respective services.",[11,6228,6229],{},"3. Create a Docker Network to ensure smooth communication between services:",[42,6231,6233],{"className":44,"code":6232,"language":46,"meta":47,"style":47},"docker network create your-network-name --subnet 10.0.1.0\u002F24\n",[34,6234,6235],{"__ignoreMap":47},[51,6236,6237,6239,6242,6245,6248,6251],{"class":53,"line":54},[51,6238,131],{"class":57},[51,6240,6241],{"class":69}," network",[51,6243,6244],{"class":69}," create",[51,6246,6247],{"class":69}," your-network-name",[51,6249,6250],{"class":61}," --subnet",[51,6252,6253],{"class":69}," 10.0.1.0\u002F24\n",[11,6255,6256,6257,6259],{},"Update your ",[34,6258,593],{}," file to use the newly created network:",[42,6261,6263],{"className":44,"code":6262,"language":46,"meta":47,"style":47},"networks:\n  default:\n    name: your-network-name\n    external: true\n    driver: bridge\n",[34,6264,6265,6270,6275,6283,6290],{"__ignoreMap":47},[51,6266,6267],{"class":53,"line":54},[51,6268,6269],{"class":57},"networks:\n",[51,6271,6272],{"class":53,"line":158},[51,6273,6274],{"class":57},"  default:\n",[51,6276,6277,6280],{"class":53,"line":296},[51,6278,6279],{"class":57},"    name:",[51,6281,6282],{"class":69}," your-network-name\n",[51,6284,6285,6288],{"class":53,"line":307},[51,6286,6287],{"class":57},"    external:",[51,6289,561],{"class":2812},[51,6291,6292,6295],{"class":53,"line":318},[51,6293,6294],{"class":57},"    driver:",[51,6296,6297],{"class":69}," bridge\n",[11,6299,6300,6301,6304],{},"4. Run ",[204,6302,6303],{},"Docker Compose"," Start all services:",[42,6306,6308],{"className":44,"code":6307,"language":46,"meta":47,"style":47},"docker-compose up -d\n",[34,6309,6310],{"__ignoreMap":47},[51,6311,6312,6315,6318],{"class":53,"line":54},[51,6313,6314],{"class":57},"docker-compose",[51,6316,6317],{"class":69}," up",[51,6319,6320],{"class":61}," -d\n",[11,6322,6323],{},"5. Access Your Services",[208,6325,6326,6333],{},[211,6327,6328,6329],{},"WordPress: ",[2733,6330,6331],{"href":6331,"rel":6332},"http:\u002F\u002Flocalhost:8080",[2737],[211,6334,6335,6336],{},"phpMyAdmin: ",[2733,6337,6338],{"href":6338,"rel":6339},"http:\u002F\u002Flocalhost:8082",[2737],[581,6341,6044],{"id":6342},"stopping-the-services",[11,6344,6345],{},"To stop the running containers:",[42,6347,6350],{"className":6348,"code":6349,"language":259},[257],"docker-compose down\n",[34,6351,6349],{"__ignoreMap":47},[42,6353,6354],{"className":44,"code":6349,"language":46,"meta":47,"style":47},[34,6355,6356],{"__ignoreMap":47},[51,6357,6358,6360],{"class":53,"line":54},[51,6359,6314],{"class":57},[51,6361,6362],{"class":69}," down\n",[26,6364,6050],{"id":6365},"moving-from-local-development-to-production",[581,6367,6058],{"id":6368},"warning",[11,6370,6371],{},"Before migrating, ensure WordPress is installed and configured on your production server.",[26,6373,6064],{"id":6374},"migration-steps",[249,6376,6377,6413,6423],{},[211,6378,6379,6382],{},[204,6380,6381],{},"On the Development Site:",[208,6383,6384,6390,6410],{},[211,6385,6386,6387,816],{},"Install the ",[204,6388,6389],{},"UpdraftPlus: WP Backup & Migration Plugin",[211,6391,6392,6393],{},"Use UpdraftPlus to create a full backup, including:\n",[208,6394,6395,6398,6401,6404,6407],{},[211,6396,6397],{},"Database",[211,6399,6400],{},"Plugins",[211,6402,6403],{},"Themes",[211,6405,6406],{},"Uploads",[211,6408,6409],{},"Other files",[211,6411,6412],{},"Download the backup files.",[211,6414,6415,6418],{},[204,6416,6417],{},"Transfer to the Production Server:",[208,6419,6420],{},[211,6421,6422],{},"Copy the backup files to your production server using a secure method (e.g., SCP or FTP).",[211,6424,6425,6428],{},[204,6426,6427],{},"On the Production Site:",[208,6429,6430,6433,6436,6439],{},[211,6431,6432],{},"Install UpdraftPlus.",[211,6434,6435],{},"Upload the backup files.",[211,6437,6438],{},"Restore the site using the plugin’s interface.",[211,6440,6441],{},"Log in with the credentials from your development site.",[581,6443,6072],{"id":6444},"managing-password-securely",[11,6446,6447],{},"The repository includes utility scripts for managing MySQL passwords securely.",[6449,6450,6080],"h4",{"id":6451},"for-windows-users",[208,6453,6454,6460],{},[211,6455,6456,6459],{},[34,6457,6458],{},"generate_root_password.bat",": Generates a secure MySQL root password.",[211,6461,6462,6465],{},[34,6463,6464],{},"generate_user_password.bat",": Generates a secure MySQL user password.",[11,6467,6468],{},"To use these scripts:",[249,6470,6471,6478,6495],{},[211,6472,6473,6474,6477],{},"Double-click the desired ",[34,6475,6476],{},".bat"," file.",[211,6479,6480,6481],{},"The script will:",[208,6482,6483,6486,6492],{},[211,6484,6485],{},"Generate a random password using OpenSSL.",[211,6487,6488,6489,6491],{},"Update the ",[34,6490,6163],{}," file with the new password.",[211,6493,6494],{},"Display the password in the console.",[211,6496,6497],{},"Press any key to close the window.",[6449,6499,6086],{"id":6500},"for-linuxmac-users",[208,6502,6503],{},[211,6504,6505,6459],{},[34,6506,6507],{},"generate_root_password.sh",[11,6509,6510],{},"To use the script:",[11,6512,6513],{},"1. Make it executable (first time only):",[42,6515,6517],{"className":44,"code":6516,"language":46,"meta":47,"style":47},"chmod +x generate_root_password.sh\n",[34,6518,6519],{"__ignoreMap":47},[51,6520,6521,6524,6526],{"class":53,"line":54},[51,6522,6523],{"class":57},"chmod",[51,6525,2607],{"class":69},[51,6527,6528],{"class":69}," generate_root_password.sh\n",[11,6530,6531],{},"2. Run the script:",[42,6533,6535],{"className":44,"code":6534,"language":46,"meta":47,"style":47},".\u002Fgenerate_root_password.sh\n",[34,6536,6537],{"__ignoreMap":47},[51,6538,6539],{"class":53,"line":54},[51,6540,6534],{"class":57},[11,6542,6543],{},"3. The script will:",[208,6545,6546,6548,6552],{},[211,6547,6485],{},[211,6549,6488,6550,6491],{},[34,6551,6163],{},[211,6553,6494],{},[26,6555,3905],{"id":3904},[11,6557,6558],{},"By using Docker, you can streamline your WordPress development workflow, ensuring efficiency and reducing risks. This approach lets you perfect your website locally before deploying it to production.",[154,6560,6561],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":47,"searchDepth":158,"depth":158,"links":6563},[6564,6565,6566,6571,6574,6577],{"id":4626,"depth":158,"text":4801},{"id":6093,"depth":158,"text":6019},{"id":6107,"depth":158,"text":6025,"children":6567},[6568,6569,6570],{"id":2011,"depth":296,"text":2012},{"id":6124,"depth":296,"text":6038},{"id":6342,"depth":296,"text":6044},{"id":6365,"depth":158,"text":6050,"children":6572},[6573],{"id":6368,"depth":296,"text":6058},{"id":6374,"depth":158,"text":6064,"children":6575},[6576],{"id":6444,"depth":296,"text":6072},{"id":3904,"depth":158,"text":3905},{},"\u002Fblog\u002F2024\u002Fwordpress-local-development-with-docker-a-complete-guide-100-easy-guaranteed","2024-12-23",{"title":6000,"description":6005},"blog\u002F2024\u002Fwordpress-local-development-with-docker-a-complete-guide-100-easy-guaranteed",[131,172],"Quitsgy2qIyw8vmO-LDEHkVpwxVr8e0knM2YWEDpcA0",{"id":4,"title":5,"author":6,"body":6586,"description":13,"draft":162,"extension":163,"featured":162,"meta":6684,"navigation":165,"ogImage":166,"path":167,"pubDatetime":168,"seo":6685,"stem":170,"tags":6686,"__hash__":173},{"type":8,"value":6587,"toc":6680},[6588,6590,6592,6594,6596,6598,6602,6604,6622,6626,6630,6632,6650,6652,6654,6656,6672,6674,6678],[11,6589,13],{},[15,6591,18],{"id":17},[11,6593,21],{},[11,6595,24],{},[26,6597,29],{"id":28},[11,6599,32,6600,37],{},[34,6601,36],{},[11,6603,40],{},[42,6605,6606],{"className":44,"code":45,"language":46,"meta":47,"style":47},[34,6607,6608],{"__ignoreMap":47},[51,6609,6610,6612,6614,6616,6618,6620],{"class":53,"line":54},[51,6611,58],{"class":57},[51,6613,62],{"class":61},[51,6615,66],{"class":65},[51,6617,70],{"class":69},[51,6619,73],{"class":65},[51,6621,76],{"class":69},[11,6623,79,6624,82],{},[34,6625,36],{},[11,6627,85,6628,88],{},[34,6629,36],{},[11,6631,91],{},[42,6633,6634],{"className":44,"code":94,"language":46,"meta":47,"style":47},[34,6635,6636],{"__ignoreMap":47},[51,6637,6638,6640,6642,6644,6646,6648],{"class":53,"line":54},[51,6639,58],{"class":57},[51,6641,62],{"class":61},[51,6643,66],{"class":65},[51,6645,107],{"class":69},[51,6647,73],{"class":65},[51,6649,76],{"class":69},[11,6651,114],{},[26,6653,118],{"id":117},[11,6655,121],{},[42,6657,6658],{"className":44,"code":124,"language":46,"meta":47,"style":47},[34,6659,6660],{"__ignoreMap":47},[51,6661,6662,6664,6666,6668,6670],{"class":53,"line":54},[51,6663,131],{"class":57},[51,6665,134],{"class":69},[51,6667,137],{"class":61},[51,6669,140],{"class":69},[51,6671,143],{"class":69},[11,6673,146],{},[11,6675,149,6676,152],{},[34,6677,36],{},[154,6679,156],{},{"title":47,"searchDepth":158,"depth":158,"links":6681},[6682,6683],{"id":28,"depth":158,"text":29},{"id":117,"depth":158,"text":118},{},{"title":5,"description":13},[131,172],{"id":6688,"title":6689,"author":6,"body":6690,"description":6959,"draft":162,"extension":163,"featured":162,"meta":6960,"navigation":165,"ogImage":166,"path":6961,"pubDatetime":6962,"seo":6963,"stem":6964,"tags":6965,"__hash__":6966},"blog\u002Fblog\u002F2024\u002Fdefault-timezone-for-docker-containerized-app-and-how-to-change-into-yours.md","Default Timezone For Docker Containerized App And How To Change Into Yours",{"type":8,"value":6691,"toc":6954},[6692,6696,6699,6702,6706,6709,6748,6754,6898,6901,6920,6923,6926,6928,6938,6948,6951],[26,6693,6695],{"id":6694},"the-story","The Story",[11,6697,6698],{},"This started when I built an image containing a Python app to back up the clock for PLC when turned off. But whenever I run the image, it gives the wrong time. I did a lot of tests on the Python app and gave the correct time. What the *** going on? 😖",[11,6700,6701],{},"But I got the answer: the Docker image will use the UTC as its default timezone. So this got me in trouble. But I was kind of curious, so I created some tests to see what the real problem was.",[26,6703,6705],{"id":6704},"lets-figure-it-out","Let’s Figure it Out 🚀",[11,6707,6708],{},"I create some testing apps to print the current time with the timezone.",[42,6710,6713],{"className":6711,"code":6712,"language":4097,"meta":47,"style":47},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","from datetime import datetime\nfrom pytz import timezone\n\nprint(f\"Current local time: {datetime.now()}\")\ncurrent_timezone = datetime.now().astimezone().tzinfo\n\nprint(f\"Current timezone: {current_timezone}\")\n",[34,6714,6715,6720,6725,6729,6734,6739,6743],{"__ignoreMap":47},[51,6716,6717],{"class":53,"line":54},[51,6718,6719],{},"from datetime import datetime\n",[51,6721,6722],{"class":53,"line":158},[51,6723,6724],{},"from pytz import timezone\n",[51,6726,6727],{"class":53,"line":296},[51,6728,944],{"emptyLinePlaceholder":165},[51,6730,6731],{"class":53,"line":307},[51,6732,6733],{},"print(f\"Current local time: {datetime.now()}\")\n",[51,6735,6736],{"class":53,"line":318},[51,6737,6738],{},"current_timezone = datetime.now().astimezone().tzinfo\n",[51,6740,6741],{"class":53,"line":326},[51,6742,944],{"emptyLinePlaceholder":165},[51,6744,6745],{"class":53,"line":354},[51,6746,6747],{},"print(f\"Current timezone: {current_timezone}\")\n",[11,6749,6750,6751,816],{},"And bundle with the ",[34,6752,6753],{},"Dockerfile",[42,6755,6757],{"className":44,"code":6756,"language":46,"meta":47,"style":47},"FROM python:3.9-slim\n\nWORKDIR \u002Fapp\n\nRUN apt-get update \\\n    && apt-get install -y tzdata \\\n    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F* \u002Fvar\u002Fcache\u002Fapt\u002Farchives\u002F*\n\nCOPY . .\n\nRUN pip install --no-cache-dir pytz\n\n# Run your Python app\nCMD [\"python\", \"app.py\"]\n",[34,6758,6759,6767,6771,6779,6783,6795,6811,6831,6835,6846,6850,6865,6869,6874],{"__ignoreMap":47},[51,6760,6761,6764],{"class":53,"line":54},[51,6762,6763],{"class":57},"FROM",[51,6765,6766],{"class":69}," python:3.9-slim\n",[51,6768,6769],{"class":53,"line":158},[51,6770,944],{"emptyLinePlaceholder":165},[51,6772,6773,6776],{"class":53,"line":296},[51,6774,6775],{"class":57},"WORKDIR",[51,6777,6778],{"class":69}," \u002Fapp\n",[51,6780,6781],{"class":53,"line":307},[51,6782,944],{"emptyLinePlaceholder":165},[51,6784,6785,6788,6791,6793],{"class":53,"line":318},[51,6786,6787],{"class":57},"RUN",[51,6789,6790],{"class":69}," apt-get",[51,6792,2132],{"class":69},[51,6794,283],{"class":282},[51,6796,6797,6800,6802,6804,6806,6809],{"class":53,"line":326},[51,6798,6799],{"class":395},"    &&",[51,6801,6790],{"class":57},[51,6803,2167],{"class":69},[51,6805,2170],{"class":61},[51,6807,6808],{"class":69}," tzdata",[51,6810,283],{"class":282},[51,6812,6813,6815,6817,6819,6822,6825,6828],{"class":53,"line":354},[51,6814,6799],{"class":395},[51,6816,3795],{"class":57},[51,6818,3813],{"class":61},[51,6820,6821],{"class":69}," \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F",[51,6823,6824],{"class":282},"*",[51,6826,6827],{"class":69}," \u002Fvar\u002Fcache\u002Fapt\u002Farchives\u002F",[51,6829,6830],{"class":282},"*\n",[51,6832,6833],{"class":53,"line":453},[51,6834,944],{"emptyLinePlaceholder":165},[51,6836,6837,6840,6843],{"class":53,"line":468},[51,6838,6839],{"class":57},"COPY",[51,6841,6842],{"class":69}," .",[51,6844,6845],{"class":69}," .\n",[51,6847,6848],{"class":53,"line":480},[51,6849,944],{"emptyLinePlaceholder":165},[51,6851,6852,6854,6857,6859,6862],{"class":53,"line":492},[51,6853,6787],{"class":57},[51,6855,6856],{"class":69}," pip",[51,6858,2167],{"class":69},[51,6860,6861],{"class":61}," --no-cache-dir",[51,6863,6864],{"class":69}," pytz\n",[51,6866,6867],{"class":53,"line":504},[51,6868,944],{"emptyLinePlaceholder":165},[51,6870,6871],{"class":53,"line":512},[51,6872,6873],{"class":1262},"# Run your Python app\n",[51,6875,6876,6879,6881,6883,6885,6887,6889,6891,6894,6896],{"class":53,"line":520},[51,6877,6878],{"class":57},"CMD",[51,6880,360],{"class":347},[51,6882,2796],{"class":65},[51,6884,4097],{"class":69},[51,6886,2796],{"class":65},[51,6888,6219],{"class":347},[51,6890,2796],{"class":65},[51,6892,6893],{"class":69},"app.py",[51,6895,2796],{"class":65},[51,6897,2977],{"class":69},[11,6899,6900],{},"Then build the image.",[42,6902,6904],{"className":44,"code":6903,"language":46,"meta":47,"style":47},"docker build -t timezone-app .\n",[34,6905,6906],{"__ignoreMap":47},[51,6907,6908,6910,6912,6915,6918],{"class":53,"line":54},[51,6909,131],{"class":57},[51,6911,2491],{"class":69},[51,6913,6914],{"class":61}," -t",[51,6916,6917],{"class":69}," timezone-app",[51,6919,6845],{"class":69},[11,6921,6922],{},"Let’s find the answer, first, we run the container at the default condition (not pass the timezone variable). And correct, the container uses the UTC timezone.",[11,6924,6925],{},"Now try using it to pass the timezone variable when running the container. See, the timezone is matched with my location (it shows WIB — Waktu Indonesia Barat — or UTC+7)",[26,6927,3905],{"id":3904},[11,6929,6930,6931,6933,6934,6937],{},"If you build some app that expects to run at a specific time, you need to set the timezone.",[563,6932],{},"\nYou can see the available time zone through the ",[34,6935,6936],{},"pytz"," package.",[11,6939,6940,6941,6944,6945],{},"In my case, I just need to install the ",[34,6942,6943],{},"tzdata"," inside the image and pass it when running the container or simply just set it inside the ",[34,6946,6947],{},"Dockerfile.",[11,6949,6950],{},"I hope this will help you if you encounter the same issue.",[154,6952,6953],{},"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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":47,"searchDepth":158,"depth":158,"links":6955},[6956,6957,6958],{"id":6694,"depth":158,"text":6695},{"id":6704,"depth":158,"text":6705},{"id":3904,"depth":158,"text":3905},"Tutorial how to change default timezone for docker containerized app",{},"\u002Fblog\u002F2024\u002Fdefault-timezone-for-docker-containerized-app-and-how-to-change-into-yours","2024-11-05",{"title":6689,"description":6959},"blog\u002F2024\u002Fdefault-timezone-for-docker-containerized-app-and-how-to-change-into-yours",[131],"ZSeOJ9vVfijjU5ZSdzQz0HhgUsi2DkH-zpVyxUevTb0",1785199851907]