[{"data":1,"prerenderedAt":695},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fcheat-sheets\u002Fvim-cheat-sheet":186,"surround-\u002Fcheat-sheets\u002Fvim-cheat-sheet":539,"notes-index":544},[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":146,"body":188,"category":139,"createdAt":519,"description":520,"draft":521,"extension":522,"featured":521,"keywords":523,"links":529,"meta":530,"navigation":531,"path":147,"readingTime":532,"seo":533,"stem":148,"tags":534,"updatedAt":519,"__hash__":538},"docs\u002F4.cheat-sheets\u002F1.vim-cheat-sheet.md",{"type":189,"value":190,"toc":511},"minimark",[191,205,210,293,297,385,389,480,484,494],[192,193,194,195,199,200,204],"p",{},"Enough Vim to edit confidently — and, crucially, to quit. Everything below is\nfrom ",[196,197,198],"strong",{},"normal mode"," (press ",[201,202,203],"code",{},"Esc"," to get there).",[206,207,209],"h2",{"id":208},"surviving","Surviving",[211,212,213,226],"table",{},[214,215,216],"thead",{},[217,218,219,223],"tr",{},[220,221,222],"th",{},"Keys",[220,224,225],{},"Action",[227,228,229,240,249,259,269,283],"tbody",{},[217,230,231,237],{},[232,233,234],"td",{},[201,235,236],{},"i",[232,238,239],{},"Insert before cursor",[217,241,242,246],{},[232,243,244],{},[201,245,203],{},[232,247,248],{},"Back to normal mode",[217,250,251,256],{},[232,252,253],{},[201,254,255],{},":w",[232,257,258],{},"Save",[217,260,261,266],{},[232,262,263],{},[201,264,265],{},":q",[232,267,268],{},"Quit",[217,270,271,280],{},[232,272,273,276,277],{},[201,274,275],{},":wq"," or ",[201,278,279],{},"ZZ",[232,281,282],{},"Save and quit",[217,284,285,290],{},[232,286,287],{},[201,288,289],{},":q!",[232,291,292],{},"Quit without saving",[206,294,296],{"id":295},"moving","Moving",[211,298,299,307],{},[214,300,301],{},[217,302,303,305],{},[220,304,222],{},[220,306,225],{},[227,308,309,319,333,346,359,372],{},[217,310,311,316],{},[232,312,313],{},[201,314,315],{},"h j k l",[232,317,318],{},"Left, down, up, right",[217,320,321,330],{},[232,322,323,326,327],{},[201,324,325],{},"w"," \u002F ",[201,328,329],{},"b",[232,331,332],{},"Next \u002F previous word",[217,334,335,343],{},[232,336,337,326,340],{},[201,338,339],{},"0",[201,341,342],{},"$",[232,344,345],{},"Start \u002F end of line",[217,347,348,356],{},[232,349,350,326,353],{},[201,351,352],{},"gg",[201,354,355],{},"G",[232,357,358],{},"Top \u002F bottom of file",[217,360,361,369],{},[232,362,363,326,366],{},[201,364,365],{},"{",[201,367,368],{},"}",[232,370,371],{},"Previous \u002F next paragraph",[217,373,374,382],{},[232,375,376,326,379],{},[201,377,378],{},"Ctrl-d",[201,380,381],{},"Ctrl-u",[232,383,384],{},"Half page down \u002F up",[206,386,388],{"id":387},"editing","Editing",[211,390,391,399],{},[214,392,393],{},[217,394,395,397],{},[220,396,222],{},[220,398,225],{},[227,400,401,411,421,431,440,450,460,470],{},[217,402,403,408],{},[232,404,405],{},[201,406,407],{},"x",[232,409,410],{},"Delete character",[217,412,413,418],{},[232,414,415],{},[201,416,417],{},"dd",[232,419,420],{},"Delete line",[217,422,423,428],{},[232,424,425],{},[201,426,427],{},"yy",[232,429,430],{},"Yank (copy) line",[217,432,433,437],{},[232,434,435],{},[201,436,192],{},[232,438,439],{},"Paste after cursor",[217,441,442,447],{},[232,443,444],{},[201,445,446],{},"u",[232,448,449],{},"Undo",[217,451,452,457],{},[232,453,454],{},[201,455,456],{},"Ctrl-r",[232,458,459],{},"Redo",[217,461,462,467],{},[232,463,464],{},[201,465,466],{},"cw",[232,468,469],{},"Change word",[217,471,472,477],{},[232,473,474],{},[201,475,476],{},".",[232,478,479],{},"Repeat last change",[206,481,483],{"id":482},"search-replace","Search & replace",[485,486,492],"pre",{"className":487,"code":489,"language":490,"meta":491},[488],"language-text","\u002Fpattern        search forward (n = next, N = previous)\n:%s\u002Fold\u002Fnew\u002Fg   replace all in file\n:%s\u002Fold\u002Fnew\u002Fgc  replace all, confirming each\n","text","",[201,493,489],{"__ignoreMap":491},[495,496,497],"tip",{},[192,498,499,500,503,504,506,507,510],{},"The real power is combining operators with motions: ",[201,501,502],{},"d"," (delete) + ",[201,505,325],{}," (word) =\n",[201,508,509],{},"dw",". Learn the grammar, not a list of commands.",{"title":491,"searchDepth":512,"depth":512,"links":513},3,[514,516,517,518],{"id":208,"depth":515,"text":209},2,{"id":295,"depth":515,"text":296},{"id":387,"depth":515,"text":388},{"id":482,"depth":515,"text":483},"2026-07-17","The essential Vim motions and commands to get productive and get out.",false,"md",[524,525,198,526,527,528],"vim","motions","insert mode","quit","save",[],{},true,1,{"title":146,"description":520},[524,535,536,537],"editor","cheat-sheet","cli","dCRBJVinrcZFbxaGOhNxuZ9AH1c1g8ORIDBuFMzMR0A",[540,542],{"title":139,"path":140,"stem":144,"description":541,"children":-1},"Dense, scannable references for commands and syntax.",{"title":150,"path":151,"stem":155,"description":543,"children":-1},"Reusable starting points for files, configs and docs.",[545,552,558,561,567,570,577,580,583,588,591,594,602,606,611,614,622,626,629,635,638,642,645,648,650,656,659,661,663,669,671,678,683,686,692],{"path":20,"title":19,"description":546,"tags":547,"category":13,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[548,549,550,551],"laravel","eloquent","database","orm",{"path":24,"title":23,"description":553,"tags":554,"category":13,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"My quick reference for setting up and using Laravel Homestead during development.",[548,555,556,557],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":559,"tags":560,"category":13,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":562,"tags":563,"category":27,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":515,"draft":521},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[564,565,566,555,548],"bash","bashrc","git bash",{"path":28,"title":27,"description":568,"tags":569,"category":27,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":571,"tags":572,"category":37,"featured":531,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Practical rules for naming variables, functions and types so code reads like prose.",[573,574,575,576],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":578,"tags":579,"category":37,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":581,"tags":582,"category":47,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":584,"tags":585,"category":53,"featured":531,"updatedAt":519,"createdAt":519,"readingTime":515,"draft":521},"The Git commands I actually use day to day, plus how to undo things safely.",[586,537,587,536],"git","version-control",{"path":54,"title":53,"description":589,"tags":590,"category":53,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":592,"tags":593,"category":10,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":595,"tags":596,"category":63,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":601,"draft":521},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[597,598,599,600],"ai","software development","prompt engineering","beginners",4,{"path":87,"title":86,"description":603,"tags":604,"category":63,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":601,"draft":521},"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.",[597,605,599,600],"javascript",{"path":91,"title":90,"description":607,"tags":608,"category":63,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":512,"draft":521},"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.",[605,600,609,610],"programming","web development",{"path":77,"title":76,"description":612,"tags":613,"category":76,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":615,"tags":616,"category":94,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":512,"draft":521},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[617,618,605,619,620,621],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":623,"tags":624,"category":94,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":512,"draft":521},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[617,618,605,620,625,621],"arrays",{"path":95,"title":94,"description":627,"tags":628,"category":94,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":630,"tags":631,"category":94,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":515,"draft":521},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[617,618,605,632,633,634],"functions","if-statement","debugging",{"path":109,"title":108,"description":636,"tags":637,"category":108,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":639,"tags":640,"category":118,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":601,"draft":521},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[597,599,641],"workflow",{"path":119,"title":118,"description":643,"tags":644,"category":118,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":646,"tags":647,"category":63,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":646,"tags":649,"category":63,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},[],{"path":136,"title":135,"description":651,"tags":652,"category":128,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Two tiny functions to control how often a handler runs — with the difference explained.",[605,653,654,655],"performance","snippets","events",{"path":129,"title":128,"description":657,"tags":658,"category":128,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":520,"tags":660,"category":139,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},[524,535,536,537],{"path":140,"title":139,"description":541,"tags":662,"category":139,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},[],{"path":158,"title":157,"description":664,"tags":665,"category":150,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"A reusable PR description template that makes reviews faster and kinder.",[586,666,667,668],"github","template","collaboration",{"path":151,"title":150,"description":543,"tags":670,"category":150,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},[],{"path":169,"title":168,"description":672,"tags":673,"category":161,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":515,"draft":521},"The frontmatter and markdown conventions every note in this knowledge base follows.",[674,675,676,677],"meta","conventions","markdown","authoring",{"path":173,"title":172,"description":679,"tags":680,"category":161,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":515,"draft":521},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[676,681,682],"mdc","reference",{"path":162,"title":161,"description":684,"tags":685,"category":161,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":687,"tags":688,"category":176,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[689,690,691,634],"cors","http","apis",{"path":177,"title":176,"description":693,"tags":694,"category":176,"featured":521,"updatedAt":519,"createdAt":519,"readingTime":532,"draft":521},"Symptoms, causes and fixes for problems worth remembering.",[],1784276796652]