[{"data":1,"prerenderedAt":788},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fmeta\u002Fauthoring-guide":186,"surround-\u002Fmeta\u002Fauthoring-guide":635,"notes-index":640},[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":168,"body":188,"category":161,"createdAt":618,"description":619,"draft":620,"extension":621,"featured":620,"keywords":622,"links":626,"meta":627,"navigation":628,"path":169,"readingTime":224,"seo":629,"stem":170,"tags":630,"updatedAt":618,"__hash__":634},"docs\u002F6.meta\u002F1.authoring-guide.md",{"type":189,"value":190,"toc":612},"minimark",[191,195,200,203,384,393,397,437,441,448,580,584,590,608],[192,193,194],"p",{},"Conventions for writing notes, kept here so the rules live where they're used.\nWhen in doubt, copy an existing note and adapt it.",[196,197,199],"h2",{"id":198},"frontmatter","Frontmatter",[192,201,202],{},"Every note starts with a frontmatter block:",[204,205,210],"pre",{"className":206,"code":207,"language":208,"meta":209,"style":209},"language-yaml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","---\ntitle: Eloquent Relationships          # required. Sentence case, no trailing period\ndescription: One sentence, used in cards, search and SEO.  # required\ntags: [laravel, eloquent, database]    # 2–6, lowercase-kebab, singular nouns\nkeywords: [hasMany, eager loading]     # optional search synonyms, never displayed\ncategory: Laravel                      # optional; defaults to the folder name\ncreatedAt: 2026-07-17                  # required, YYYY-MM-DD\nupdatedAt: 2026-07-17                  # required, bump on every meaningful edit\nfeatured: false                        # optional; shows on the homepage. Keep to ~6 site-wide\ndraft: false                           # optional; hidden in production, visible in dev\n---\n","yaml","",[211,212,213,222,241,255,286,309,323,338,351,366,379],"code",{"__ignoreMap":209},[214,215,218],"span",{"class":216,"line":217},"line",1,[214,219,221],{"class":220},"sYn-s","---\n",[214,223,225,229,233,237],{"class":216,"line":224},2,[214,226,228],{"class":227},"suXOh","title",[214,230,232],{"class":231},"soVBu",":",[214,234,236],{"class":235},"sTbE_"," Eloquent Relationships",[214,238,240],{"class":239},"s9Tkl","          # required. Sentence case, no trailing period\n",[214,242,244,247,249,252],{"class":216,"line":243},3,[214,245,246],{"class":227},"description",[214,248,232],{"class":231},[214,250,251],{"class":235}," One sentence, used in cards, search and SEO.",[214,253,254],{"class":239},"  # required\n",[214,256,258,261,263,266,269,272,275,277,280,283],{"class":216,"line":257},4,[214,259,260],{"class":227},"tags",[214,262,232],{"class":231},[214,264,265],{"class":231}," [",[214,267,268],{"class":235},"laravel",[214,270,271],{"class":231},",",[214,273,274],{"class":235}," eloquent",[214,276,271],{"class":231},[214,278,279],{"class":235}," database",[214,281,282],{"class":231},"]",[214,284,285],{"class":239},"    # 2–6, lowercase-kebab, singular nouns\n",[214,287,289,292,294,296,299,301,304,306],{"class":216,"line":288},5,[214,290,291],{"class":227},"keywords",[214,293,232],{"class":231},[214,295,265],{"class":231},[214,297,298],{"class":235},"hasMany",[214,300,271],{"class":231},[214,302,303],{"class":235}," eager loading",[214,305,282],{"class":231},[214,307,308],{"class":239},"     # optional search synonyms, never displayed\n",[214,310,312,315,317,320],{"class":216,"line":311},6,[214,313,314],{"class":227},"category",[214,316,232],{"class":231},[214,318,319],{"class":235}," Laravel",[214,321,322],{"class":239},"                      # optional; defaults to the folder name\n",[214,324,326,329,331,335],{"class":216,"line":325},7,[214,327,328],{"class":227},"createdAt",[214,330,232],{"class":231},[214,332,334],{"class":333},"se3Ec"," 2026-07-17",[214,336,337],{"class":239},"                  # required, YYYY-MM-DD\n",[214,339,341,344,346,348],{"class":216,"line":340},8,[214,342,343],{"class":227},"updatedAt",[214,345,232],{"class":231},[214,347,334],{"class":333},[214,349,350],{"class":239},"                  # required, bump on every meaningful edit\n",[214,352,354,357,359,363],{"class":216,"line":353},9,[214,355,356],{"class":227},"featured",[214,358,232],{"class":231},[214,360,362],{"class":361},"sq3J1"," false",[214,364,365],{"class":239},"                        # optional; shows on the homepage. Keep to ~6 site-wide\n",[214,367,369,372,374,376],{"class":216,"line":368},10,[214,370,371],{"class":227},"draft",[214,373,232],{"class":231},[214,375,362],{"class":361},[214,377,378],{"class":239},"                           # optional; hidden in production, visible in dev\n",[214,380,382],{"class":216,"line":381},11,[214,383,221],{"class":220},[385,386,387],"note",{},[192,388,389,392],{},[211,390,391],{},"readingTime"," is calculated automatically at build time — never set it by hand.",[196,394,396],{"id":395},"files-folders","Files & folders",[398,399,400,408,424,430],"ul",{},[401,402,403,404,407],"li",{},"Notes are markdown files under ",[211,405,406],{},"content\u002F",".",[401,409,410,411,414,415,418,419,423],{},"Numeric prefixes (",[211,412,413],{},"1.intro.md",", ",[211,416,417],{},"2.setup.md",") set ",[420,421,422],"strong",{},"order"," and are stripped\nfrom the URL. Renumbering reorders the sidebar without changing links.",[401,425,426,427,407],{},"A folder's title and icon come from its ",[211,428,429],{},".navigation.yml",[401,431,432,433,436],{},"A file prefixed with ",[211,434,435],{},"-"," is excluded entirely — use it for scratch drafts.",[196,438,440],{"id":439},"markdown-mdc-features","Markdown & MDC features",[192,442,443,444,447],{},"The full set is demonstrated on the ",[445,446,172],"a",{"href":173},".\nThe essentials:",[449,450,451,464],"table",{},[452,453,454],"thead",{},[455,456,457,461],"tr",{},[458,459,460],"th",{},"Feature",[458,462,463],{},"Syntax",[465,466,467,487,498,509,523,533,548,560,570],"tbody",{},[455,468,469,473],{},[470,471,472],"td",{},"Callouts",[470,474,475,414,478,414,481,414,484],{},[211,476,477],{},"::note",[211,479,480],{},"::tip",[211,482,483],{},"::warning",[211,485,486],{},"::caution",[455,488,489,492],{},[470,490,491],{},"Code block",[470,493,494,497],{},[211,495,496],{},"```ts [filename.ts]{2-4}"," (language, optional filename, line highlights)",[455,499,500,503],{},[470,501,502],{},"Tabbed code",[470,504,505,508],{},[211,506,507],{},"::code-group"," around several fenced blocks",[455,510,511,514],{},[470,512,513],{},"Tabs",[470,515,516,519,520],{},[211,517,518],{},"::tabs"," with ",[211,521,522],{},"::tabs-item{label=\"...\"}",[455,524,525,528],{},[470,526,527],{},"Collapsible",[470,529,530],{},[211,531,532],{},"::collapsible{name=\"...\"}",[455,534,535,538],{},[470,536,537],{},"Steps",[470,539,540,543,544,547],{},[211,541,542],{},"::steps{level=\"3\"}"," around ",[211,545,546],{},"###"," headings",[455,549,550,553],{},[470,551,552],{},"Diagram",[470,554,555,556,559],{},"a ",[211,557,558],{},"```mermaid"," fenced block",[455,561,562,565],{},[470,563,564],{},"Video",[470,566,567],{},[211,568,569],{},"::video-embed{src=\"https:\u002F\u002Fyoutube.com\u002Fwatch?v=...\"}",[455,571,572,575],{},[470,573,574],{},"Keyboard",[470,576,577],{},[211,578,579],{},":kbd{value=\"meta\"}",[196,581,583],{"id":582},"writing-style","Writing style",[585,586,587],"tip",{},[192,588,589],{},"Lead with the useful thing. A note is a reference you'll read while working, not\nan essay — put the command, the pattern or the answer first, and the background\nafter.",[398,591,592,599,605],{},[401,593,594,595,598],{},"One ",[211,596,597],{},"#"," H1 at most (or none — the title comes from frontmatter).",[401,600,601,602,407],{},"Link related notes with root-relative paths: ",[211,603,604],{},"[naming](\u002Fdev\u002Fclean-code\u002Fnaming-things)",[401,606,607],{},"Prefer a short, real example over a long explanation.",[609,610,611],"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 .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 .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}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":209,"searchDepth":243,"depth":243,"links":613},[614,615,616,617],{"id":198,"depth":224,"text":199},{"id":395,"depth":224,"text":396},{"id":439,"depth":224,"text":440},{"id":582,"depth":224,"text":583},"2026-07-17","The frontmatter and markdown conventions every note in this knowledge base follows.",false,"md",[198,260,623,624,625],"mdc","conventions","how to write notes",[],{},true,{"title":168,"description":619},[631,624,632,633],"meta","markdown","authoring","-O2Am4ZUcmmlqaIz8yqou1NBt0qdEdg500sjXsGAIE8",[636,638],{"title":161,"path":162,"stem":166,"description":637,"children":-1},"How this knowledge base itself is built and maintained.",{"title":172,"path":173,"stem":174,"description":639,"children":-1},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[641,647,653,656,662,665,672,675,678,685,688,691,698,702,707,710,718,722,725,731,734,738,741,744,746,752,755,760,763,769,772,774,777,779,785],{"path":20,"title":19,"description":642,"tags":643,"category":13,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[268,644,645,646],"eloquent","database","orm",{"path":24,"title":23,"description":648,"tags":649,"category":13,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"My quick reference for setting up and using Laravel Homestead during development.",[268,650,651,652],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":654,"tags":655,"category":13,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":657,"tags":658,"category":27,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":224,"draft":620},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[659,660,661,650,268],"bash","bashrc","git bash",{"path":28,"title":27,"description":663,"tags":664,"category":27,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":666,"tags":667,"category":37,"featured":628,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Practical rules for naming variables, functions and types so code reads like prose.",[668,669,670,671],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":673,"tags":674,"category":37,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":676,"tags":677,"category":47,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":679,"tags":680,"category":53,"featured":628,"updatedAt":618,"createdAt":618,"readingTime":224,"draft":620},"The Git commands I actually use day to day, plus how to undo things safely.",[681,682,683,684],"git","cli","version-control","cheat-sheet",{"path":54,"title":53,"description":686,"tags":687,"category":53,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":689,"tags":690,"category":10,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":692,"tags":693,"category":63,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":257,"draft":620},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[694,695,696,697],"ai","software development","prompt engineering","beginners",{"path":87,"title":86,"description":699,"tags":700,"category":63,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":257,"draft":620},"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.",[694,701,696,697],"javascript",{"path":91,"title":90,"description":703,"tags":704,"category":63,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":243,"draft":620},"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.",[701,697,705,706],"programming","web development",{"path":77,"title":76,"description":708,"tags":709,"category":76,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":711,"tags":712,"category":94,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":243,"draft":620},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[713,714,701,715,716,717],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":719,"tags":720,"category":94,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":243,"draft":620},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[713,714,701,716,721,717],"arrays",{"path":95,"title":94,"description":723,"tags":724,"category":94,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":726,"tags":727,"category":94,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":224,"draft":620},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[713,714,701,728,729,730],"functions","if-statement","debugging",{"path":109,"title":108,"description":732,"tags":733,"category":108,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":735,"tags":736,"category":118,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":257,"draft":620},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[694,696,737],"workflow",{"path":119,"title":118,"description":739,"tags":740,"category":118,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":742,"tags":743,"category":63,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":742,"tags":745,"category":63,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},[],{"path":136,"title":135,"description":747,"tags":748,"category":128,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Two tiny functions to control how often a handler runs — with the difference explained.",[701,749,750,751],"performance","snippets","events",{"path":129,"title":128,"description":753,"tags":754,"category":128,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":756,"tags":757,"category":139,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"The essential Vim motions and commands to get productive and get out.",[758,759,684,682],"vim","editor",{"path":140,"title":139,"description":761,"tags":762,"category":139,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Dense, scannable references for commands and syntax.",[],{"path":158,"title":157,"description":764,"tags":765,"category":150,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"A reusable PR description template that makes reviews faster and kinder.",[681,766,767,768],"github","template","collaboration",{"path":151,"title":150,"description":770,"tags":771,"category":150,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":619,"tags":773,"category":161,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":224,"draft":620},[631,624,632,633],{"path":173,"title":172,"description":639,"tags":775,"category":161,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":224,"draft":620},[632,623,776],"reference",{"path":162,"title":161,"description":637,"tags":778,"category":161,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},[],{"path":184,"title":183,"description":780,"tags":781,"category":176,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[782,783,784,730],"cors","http","apis",{"path":177,"title":176,"description":786,"tags":787,"category":176,"featured":620,"updatedAt":618,"createdAt":618,"readingTime":217,"draft":620},"Symptoms, causes and fixes for problems worth remembering.",[],1784276796857]