[{"data":1,"prerenderedAt":879},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fdev\u002Flaravel\u002Flaravel-homestead":186,"surround-\u002Fdev\u002Flaravel\u002Flaravel-homestead":726,"notes-index":731},[4,62,127,138,149,160,175],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,46,52],{"title":10,"path":6,"stem":11},"Development","1.dev\u002Findex",{"title":13,"path":14,"stem":15,"children":16},"Laravel","\u002Fdev\u002Flaravel","1.dev\u002F1.laravel\u002Findex",[17,18,22],{"title":13,"path":14,"stem":15},{"title":19,"path":20,"stem":21},"Eloquent Relationships","\u002Fdev\u002Flaravel\u002Feloquent-relationships","1.dev\u002F1.laravel\u002F1.eloquent-relationships",{"title":23,"path":24,"stem":25},"Laravel Homestead","\u002Fdev\u002Flaravel\u002Flaravel-homestead","1.dev\u002F1.laravel\u002F2.laravel-homestead",{"title":27,"path":28,"stem":29,"children":30},"Bash","\u002Fdev\u002Fbash","1.dev\u002F13.bash\u002Findex",[31,32],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35},"My Bash RC","\u002Fdev\u002Fbash\u002Fbash-rc","1.dev\u002F13.bash\u002F2.bash-rc",{"title":37,"path":38,"stem":39,"children":40},"Clean Code","\u002Fdev\u002Fclean-code","1.dev\u002F15.clean-code\u002Findex",[41,42],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Naming Things","\u002Fdev\u002Fclean-code\u002Fnaming-things","1.dev\u002F15.clean-code\u002F1.naming-things",{"title":47,"path":48,"stem":49,"children":50},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[51],{"title":47,"path":48,"stem":49},{"title":53,"path":54,"stem":55,"children":56},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[57,58],{"title":53,"path":54,"stem":55},{"title":59,"path":60,"stem":61},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":63,"path":64,"stem":65,"children":66},"Teaching","\u002Fteaching","2.teaching",[67,69],{"title":63,"path":64,"stem":68},"2.teaching\u002Findex",{"title":70,"path":71,"stem":72,"children":73},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[74,75,93,107,117],{"title":70,"path":71,"stem":72},{"title":76,"path":77,"stem":78,"children":79},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[80,81,85,89],{"title":76,"path":77,"stem":78},{"title":82,"path":83,"stem":84},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":86,"path":87,"stem":88},"Coding with AI: Prompts & Reading JavaScript","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fprompts-and-reading-js","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F2.prompts-and-reading-js",{"title":90,"path":91,"stem":92},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":94,"path":95,"stem":96,"children":97},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[98,99,103],{"title":94,"path":95,"stem":96},{"title":100,"path":101,"stem":102},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":104,"path":105,"stem":106},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":108,"path":109,"stem":110,"children":111},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[112,113],{"title":108,"path":109,"stem":110},{"title":114,"path":115,"stem":116},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":118,"path":119,"stem":120,"children":121},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[122,123],{"title":118,"path":119,"stem":120},{"title":124,"path":125,"stem":126},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":128,"path":129,"stem":130,"children":131},"Snippets","\u002Fsnippets","3.snippets",[132,134],{"title":128,"path":129,"stem":133},"3.snippets\u002Findex",{"title":135,"path":136,"stem":137},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":139,"path":140,"stem":141,"children":142},"Cheat Sheets","\u002Fcheat-sheets","4.cheat-sheets",[143,145],{"title":139,"path":140,"stem":144},"4.cheat-sheets\u002Findex",{"title":146,"path":147,"stem":148},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":150,"path":151,"stem":152,"children":153},"Templates","\u002Ftemplates","5.templates",[154,156],{"title":150,"path":151,"stem":155},"5.templates\u002Findex",{"title":157,"path":158,"stem":159},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":161,"path":162,"stem":163,"children":164},"Meta","\u002Fmeta","6.meta",[165,167,171],{"title":161,"path":162,"stem":166},"6.meta\u002Findex",{"title":168,"path":169,"stem":170},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":172,"path":173,"stem":174},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":176,"path":177,"stem":178,"children":179},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[180,182],{"title":176,"path":177,"stem":181},"7.troubleshooting\u002Findex",{"title":183,"path":184,"stem":185},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":187,"title":23,"body":188,"category":13,"createdAt":711,"description":712,"draft":713,"extension":714,"featured":713,"keywords":715,"links":718,"meta":719,"navigation":355,"path":24,"readingTime":236,"seo":720,"stem":25,"tags":721,"updatedAt":711,"__hash__":725},"docs\u002F1.dev\u002F1.laravel\u002F2.laravel-homestead.md",{"type":189,"value":190,"toc":698},"minimark",[191,195,200,203,215,219,222,251,254,267,270,282,289,293,296,304,307,408,412,425,428,437,441,453,456,465,469,481,483,492,496,501,517,519,528,532,535,551,565,578,592,596,599,605,608,612,615,627,630,642,645,657,660,672,676,688,694],[192,193,194],"p",{},"Laravel Homestead is the virtual machine I use for local Laravel development.\nIt provides a consistent development environment with PHP, Composer, MySQL,\nNginx, Redis, and other tools already configured.",[196,197,199],"h2",{"id":198},"prerequisites","Prerequisites",[192,201,202],{},"Before installing Homestead, install:",[204,205,206,210,213],"ul",{},[207,208,209],"li",{},"VirtualBox",[207,211,212],{},"Vagrant",[207,214,53],{},[196,216,218],{"id":217},"install-homestead","Install Homestead",[192,220,221],{},"Clone the Homestead repository.",[223,224,229],"pre",{"className":225,"code":226,"language":227,"meta":228,"style":228},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","git clone https:\u002F\u002Fgithub.com\u002Flaravel\u002Fhomestead.git ~\u002FHomestead\n","bash","",[230,231,232],"code",{"__ignoreMap":228},[233,234,237,241,245,248],"span",{"class":235,"line":236},"line",1,[233,238,240],{"class":239},"sYn-s","git",[233,242,244],{"class":243},"sTbE_"," clone",[233,246,247],{"class":243}," https:\u002F\u002Fgithub.com\u002Flaravel\u002Fhomestead.git",[233,249,250],{"class":243}," ~\u002FHomestead\n",[192,252,253],{},"Move into the directory.",[223,255,257],{"className":225,"code":256,"language":227,"meta":228,"style":228},"cd ~\u002FHomestead\n",[230,258,259],{"__ignoreMap":228},[233,260,261,265],{"class":235,"line":236},[233,262,264],{"class":263},"sJdAF","cd",[233,266,250],{"class":243},[192,268,269],{},"Initialize Homestead.",[223,271,273],{"className":225,"code":272,"language":227,"meta":228,"style":228},"bash init.sh\n",[230,274,275],{"__ignoreMap":228},[233,276,277,279],{"class":235,"line":236},[233,278,227],{"class":239},[233,280,281],{"class":243}," init.sh\n",[192,283,284,285,288],{},"This creates your ",[230,286,287],{},"Homestead.yaml"," configuration file.",[196,290,292],{"id":291},"configure-homestead","Configure Homestead",[192,294,295],{},"The main configuration file is:",[223,297,302],{"className":298,"code":300,"language":301,"meta":228},[299],"language-text","~\u002FHomestead\u002FHomestead.yaml\n","text",[230,303,300],{"__ignoreMap":228},[192,305,306],{},"Common settings include:",[223,308,312],{"className":309,"code":310,"language":311,"meta":228,"style":228},"language-yaml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","folders:\n  - map: C:\\Codes\n    to: \u002Fhome\u002Fvagrant\u002FCodes\n\nsites:\n  - map: my-app.test\n    to: \u002Fhome\u002Fvagrant\u002FCodes\u002Fmy-app\u002Fpublic\n\ndatabases:\n  - my_app\n","yaml",[230,313,314,324,339,350,357,365,377,387,392,400],{"__ignoreMap":228},[233,315,316,320],{"class":235,"line":236},[233,317,319],{"class":318},"suXOh","folders",[233,321,323],{"class":322},"soVBu",":\n",[233,325,327,330,333,336],{"class":235,"line":326},2,[233,328,329],{"class":322},"  -",[233,331,332],{"class":318}," map",[233,334,335],{"class":322},":",[233,337,338],{"class":243}," C:\\Codes\n",[233,340,342,345,347],{"class":235,"line":341},3,[233,343,344],{"class":318},"    to",[233,346,335],{"class":322},[233,348,349],{"class":243}," \u002Fhome\u002Fvagrant\u002FCodes\n",[233,351,353],{"class":235,"line":352},4,[233,354,356],{"emptyLinePlaceholder":355},true,"\n",[233,358,360,363],{"class":235,"line":359},5,[233,361,362],{"class":318},"sites",[233,364,323],{"class":322},[233,366,368,370,372,374],{"class":235,"line":367},6,[233,369,329],{"class":322},[233,371,332],{"class":318},[233,373,335],{"class":322},[233,375,376],{"class":243}," my-app.test\n",[233,378,380,382,384],{"class":235,"line":379},7,[233,381,344],{"class":318},[233,383,335],{"class":322},[233,385,386],{"class":243}," \u002Fhome\u002Fvagrant\u002FCodes\u002Fmy-app\u002Fpublic\n",[233,388,390],{"class":235,"line":389},8,[233,391,356],{"emptyLinePlaceholder":355},[233,393,395,398],{"class":235,"line":394},9,[233,396,397],{"class":318},"databases",[233,399,323],{"class":322},[233,401,403,405],{"class":235,"line":402},10,[233,404,329],{"class":322},[233,406,407],{"class":243}," my_app\n",[196,409,411],{"id":410},"start-the-virtual-machine","Start the Virtual Machine",[223,413,415],{"className":225,"code":414,"language":227,"meta":228,"style":228},"vagrant up\n",[230,416,417],{"__ignoreMap":228},[233,418,419,422],{"class":235,"line":236},[233,420,421],{"class":239},"vagrant",[233,423,424],{"class":243}," up\n",[192,426,427],{},"Or using my Bash alias:",[223,429,431],{"className":225,"code":430,"language":227,"meta":228,"style":228},"hm-start\n",[230,432,433],{"__ignoreMap":228},[233,434,435],{"class":235,"line":236},[233,436,430],{"class":239},[196,438,440],{"id":439},"ssh-into-homestead","SSH into Homestead",[223,442,444],{"className":225,"code":443,"language":227,"meta":228,"style":228},"vagrant ssh\n",[230,445,446],{"__ignoreMap":228},[233,447,448,450],{"class":235,"line":236},[233,449,421],{"class":239},[233,451,452],{"class":243}," ssh\n",[192,454,455],{},"Or:",[223,457,459],{"className":225,"code":458,"language":227,"meta":228,"style":228},"hm-ssh\n",[230,460,461],{"__ignoreMap":228},[233,462,463],{"class":235,"line":236},[233,464,458],{"class":239},[196,466,468],{"id":467},"stop-homestead","Stop Homestead",[223,470,472],{"className":225,"code":471,"language":227,"meta":228,"style":228},"vagrant halt\n",[230,473,474],{"__ignoreMap":228},[233,475,476,478],{"class":235,"line":236},[233,477,421],{"class":239},[233,479,480],{"class":243}," halt\n",[192,482,455],{},[223,484,486],{"className":225,"code":485,"language":227,"meta":228,"style":228},"hm-stop\n",[230,487,488],{"__ignoreMap":228},[233,489,490],{"class":235,"line":236},[233,491,485],{"class":239},[196,493,495],{"id":494},"reload-homestead","Reload Homestead",[192,497,498,499,335],{},"After changing ",[230,500,287],{},[223,502,504],{"className":225,"code":503,"language":227,"meta":228,"style":228},"vagrant reload --provision\n",[230,505,506],{"__ignoreMap":228},[233,507,508,510,513],{"class":235,"line":236},[233,509,421],{"class":239},[233,511,512],{"class":243}," reload",[233,514,516],{"class":515},"sz9Cv"," --provision\n",[192,518,455],{},[223,520,522],{"className":225,"code":521,"language":227,"meta":228,"style":228},"hm-reload\n",[230,523,524],{"__ignoreMap":228},[233,525,526],{"class":235,"line":236},[233,527,521],{"class":239},[196,529,531],{"id":530},"laravel-commands","Laravel Commands",[192,533,534],{},"Once inside the VM:",[223,536,538],{"className":225,"code":537,"language":227,"meta":228,"style":228},"php artisan serve\n",[230,539,540],{"__ignoreMap":228},[233,541,542,545,548],{"class":235,"line":236},[233,543,544],{"class":239},"php",[233,546,547],{"class":243}," artisan",[233,549,550],{"class":243}," serve\n",[223,552,554],{"className":225,"code":553,"language":227,"meta":228,"style":228},"php artisan migrate\n",[230,555,556],{"__ignoreMap":228},[233,557,558,560,562],{"class":235,"line":236},[233,559,544],{"class":239},[233,561,547],{"class":243},[233,563,564],{"class":243}," migrate\n",[223,566,568],{"className":225,"code":567,"language":227,"meta":228,"style":228},"composer install\n",[230,569,570],{"__ignoreMap":228},[233,571,572,575],{"class":235,"line":236},[233,573,574],{"class":239},"composer",[233,576,577],{"class":243}," install\n",[223,579,581],{"className":225,"code":580,"language":227,"meta":228,"style":228},"php artisan optimize:clear\n",[230,582,583],{"__ignoreMap":228},[233,584,585,587,589],{"class":235,"line":236},[233,586,544],{"class":239},[233,588,547],{"class":243},[233,590,591],{"class":243}," optimize:clear\n",[196,593,595],{"id":594},"access-phpmyadmin","Access phpMyAdmin",[192,597,598],{},"If you have phpMyAdmin installed in Homestead:",[223,600,603],{"className":601,"code":602,"language":301,"meta":228},[299],"http:\u002F\u002Fphpmyadmin.test\n",[230,604,602],{"__ignoreMap":228},[192,606,607],{},"or your configured local domain.",[196,609,611],{"id":610},"useful-commands","Useful Commands",[192,613,614],{},"Check VM status.",[223,616,618],{"className":225,"code":617,"language":227,"meta":228,"style":228},"vagrant status\n",[230,619,620],{"__ignoreMap":228},[233,621,622,624],{"class":235,"line":236},[233,623,421],{"class":239},[233,625,626],{"class":243}," status\n",[192,628,629],{},"Suspend the VM.",[223,631,633],{"className":225,"code":632,"language":227,"meta":228,"style":228},"vagrant suspend\n",[230,634,635],{"__ignoreMap":228},[233,636,637,639],{"class":235,"line":236},[233,638,421],{"class":239},[233,640,641],{"class":243}," suspend\n",[192,643,644],{},"Resume the VM.",[223,646,648],{"className":225,"code":647,"language":227,"meta":228,"style":228},"vagrant resume\n",[230,649,650],{"__ignoreMap":228},[233,651,652,654],{"class":235,"line":236},[233,653,421],{"class":239},[233,655,656],{"class":243}," resume\n",[192,658,659],{},"Destroy the VM.",[223,661,663],{"className":225,"code":662,"language":227,"meta":228,"style":228},"vagrant destroy\n",[230,664,665],{"__ignoreMap":228},[233,666,667,669],{"class":235,"line":236},[233,668,421],{"class":239},[233,670,671],{"class":243}," destroy\n",[196,673,675],{"id":674},"related-notes","Related Notes",[204,677,678,683],{},[207,679,680],{},[230,681,682],{},"\u002Fdev\u002Fbash\u002Fmy-bash-rc",[207,684,685],{},[230,686,687],{},"\u002Fdev\u002Fbash\u002Fgit-commands",[689,690,691],"tip",{},[192,692,693],{},"Treat Homestead like a dedicated development computer. Keep your projects on\nthe shared folder, do your Laravel work inside the VM, and let Vagrant handle\nthe environment. It saves you from the timeless tradition of \"works on my\nmachine\" becoming \"why doesn't it work on anyone else's machine?\"",[695,696,697],"style",{},"html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}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 .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":228,"searchDepth":341,"depth":341,"links":699},[700,701,702,703,704,705,706,707,708,709,710],{"id":198,"depth":326,"text":199},{"id":217,"depth":326,"text":218},{"id":291,"depth":326,"text":292},{"id":410,"depth":326,"text":411},{"id":439,"depth":326,"text":440},{"id":467,"depth":326,"text":468},{"id":494,"depth":326,"text":495},{"id":530,"depth":326,"text":531},{"id":594,"depth":326,"text":595},{"id":610,"depth":326,"text":611},{"id":674,"depth":326,"text":675},"2026-07-17","My quick reference for setting up and using Laravel Homestead during development.",false,"md",[716,421,717],"laravel homestead","homestead setup",[],{},{"title":23,"description":712},[722,723,421,724],"laravel","homestead","virtualbox","LIG4Cmlm7NsgJB4oLTfGsR766SQ5vhpzJGz0QQvcLqA",[727,729],{"title":19,"path":20,"stem":21,"description":728,"children":-1},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",{"title":27,"path":28,"stem":29,"description":730,"children":-1},"Shell scripting and a faster life on the command line.",[732,737,739,742,747,749,756,759,762,768,771,774,781,785,790,793,801,805,808,814,817,821,824,827,829,835,838,843,846,852,855,862,867,870,876],{"path":20,"title":19,"description":728,"tags":733,"category":13,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},[722,734,735,736],"eloquent","database","orm",{"path":24,"title":23,"description":712,"tags":738,"category":13,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},[722,723,421,724],{"path":14,"title":13,"description":740,"tags":741,"category":13,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":743,"tags":744,"category":27,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":326,"draft":713},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[227,745,746,723,722],"bashrc","git bash",{"path":28,"title":27,"description":730,"tags":748,"category":27,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},[],{"path":44,"title":43,"description":750,"tags":751,"category":37,"featured":355,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Practical rules for naming variables, functions and types so code reads like prose.",[752,753,754,755],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":757,"tags":758,"category":37,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":760,"tags":761,"category":47,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":763,"tags":764,"category":53,"featured":355,"updatedAt":711,"createdAt":711,"readingTime":326,"draft":713},"The Git commands I actually use day to day, plus how to undo things safely.",[240,765,766,767],"cli","version-control","cheat-sheet",{"path":54,"title":53,"description":769,"tags":770,"category":53,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":772,"tags":773,"category":10,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":775,"tags":776,"category":63,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":352,"draft":713},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[777,778,779,780],"ai","software development","prompt engineering","beginners",{"path":87,"title":86,"description":782,"tags":783,"category":63,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":352,"draft":713},"Learn how to write effective AI prompts and read JavaScript code confidently. This lesson teaches students how to direct AI instead of blindly copying its output.",[777,784,779,780],"javascript",{"path":91,"title":90,"description":786,"tags":787,"category":63,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":341,"draft":713},"Introduction to the fundamentals of JavaScript, from variables and functions to loops, DOM manipulation, and events. This lesson prepares students for the Mini Product Store activity.",[784,780,788,789],"programming","web development",{"path":77,"title":76,"description":791,"tags":792,"category":76,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":794,"tags":795,"category":94,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":341,"draft":713},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[796,797,784,798,799,800],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":802,"tags":803,"category":94,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":341,"draft":713},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[796,797,784,799,804,800],"arrays",{"path":95,"title":94,"description":806,"tags":807,"category":94,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":809,"tags":810,"category":94,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":326,"draft":713},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[796,797,784,811,812,813],"functions","if-statement","debugging",{"path":109,"title":108,"description":815,"tags":816,"category":108,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":818,"tags":819,"category":118,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":352,"draft":713},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[777,779,820],"workflow",{"path":119,"title":118,"description":822,"tags":823,"category":118,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":825,"tags":826,"category":63,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":825,"tags":828,"category":63,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},[],{"path":136,"title":135,"description":830,"tags":831,"category":128,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Two tiny functions to control how often a handler runs — with the difference explained.",[784,832,833,834],"performance","snippets","events",{"path":129,"title":128,"description":836,"tags":837,"category":128,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":839,"tags":840,"category":139,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"The essential Vim motions and commands to get productive and get out.",[841,842,767,765],"vim","editor",{"path":140,"title":139,"description":844,"tags":845,"category":139,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Dense, scannable references for commands and syntax.",[],{"path":158,"title":157,"description":847,"tags":848,"category":150,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"A reusable PR description template that makes reviews faster and kinder.",[240,849,850,851],"github","template","collaboration",{"path":151,"title":150,"description":853,"tags":854,"category":150,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":856,"tags":857,"category":161,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":326,"draft":713},"The frontmatter and markdown conventions every note in this knowledge base follows.",[858,859,860,861],"meta","conventions","markdown","authoring",{"path":173,"title":172,"description":863,"tags":864,"category":161,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":326,"draft":713},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[860,865,866],"mdc","reference",{"path":162,"title":161,"description":868,"tags":869,"category":161,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":871,"tags":872,"category":176,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[873,874,875,813],"cors","http","apis",{"path":177,"title":176,"description":877,"tags":878,"category":176,"featured":713,"updatedAt":711,"createdAt":711,"readingTime":236,"draft":713},"Symptoms, causes and fixes for problems worth remembering.",[],1784276795594]