[{"data":1,"prerenderedAt":821},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fopencode-cli":229,"surround-\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fopencode-cli":618,"notes-index":623},[4,88,171,182,192,203,218],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,50,56,78],{"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,46],{"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},"Services Return, Callers Present","\u002Fdev\u002Fclean-code\u002Fservices-return-callers-present","1.dev\u002F15.clean-code\u002F2.services-return-callers-present",{"title":51,"path":52,"stem":53,"children":54},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[55],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59,"children":60},"C#","\u002Fdev\u002Fcsharp","1.dev\u002F2.csharp\u002Findex",[61,62,66,70,74],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65},"C# Basics","\u002Fdev\u002Fcsharp\u002Fcsharp-basics","1.dev\u002F2.csharp\u002F1.csharp-basics",{"title":67,"path":68,"stem":69},"Classes & Models","\u002Fdev\u002Fcsharp\u002Fclasses-and-models","1.dev\u002F2.csharp\u002F2.classes-and-models",{"title":71,"path":72,"stem":73},"Services & Helpers","\u002Fdev\u002Fcsharp\u002Fservices-and-helpers","1.dev\u002F2.csharp\u002F3.services-and-helpers",{"title":75,"path":76,"stem":77},"Project Structure","\u002Fdev\u002Fcsharp\u002Fproject-structure","1.dev\u002F2.csharp\u002F4.project-structure",{"title":79,"path":80,"stem":81,"children":82},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[83,84],{"title":79,"path":80,"stem":81},{"title":85,"path":86,"stem":87},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":89,"path":90,"stem":91,"children":92},"Teaching","\u002Fteaching","2.teaching",[93,95],{"title":89,"path":90,"stem":94},"2.teaching\u002Findex",{"title":96,"path":97,"stem":98,"children":99},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[100,101,119,137,147,161],{"title":96,"path":97,"stem":98},{"title":102,"path":103,"stem":104,"children":105},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[106,107,111,115],{"title":102,"path":103,"stem":104},{"title":108,"path":109,"stem":110},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":112,"path":113,"stem":114},"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":116,"path":117,"stem":118},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":120,"path":121,"stem":122,"children":123},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[124,125,129,133],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":130,"path":131,"stem":132},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":134,"path":135,"stem":136},"Semester Project","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fsemester-project","2.teaching\u002F1.apps-dev\u002F2.activities\u002F4.semester-project",{"title":138,"path":139,"stem":140,"children":141},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[142,143],{"title":138,"path":139,"stem":140},{"title":144,"path":145,"stem":146},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":148,"path":149,"stem":150,"children":151},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[152,153,157],{"title":148,"path":149,"stem":150},{"title":154,"path":155,"stem":156},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":158,"path":159,"stem":160},"Using OpenCode CLI Instead of Copy-Pasting from ChatGPT","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fopencode-cli","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F2.opencode-cli",{"title":162,"path":163,"stem":164,"children":165},"Cheat Sheets","\u002Fteaching\u002Fapps-dev\u002Fcheat-sheets","2.teaching\u002F1.apps-dev\u002F8.cheat-sheets\u002Findex",[166,167],{"title":162,"path":163,"stem":164},{"title":168,"path":169,"stem":170},"How to Collaborate on GitHub","\u002Fteaching\u002Fapps-dev\u002Fcheat-sheets\u002Fgithub-collaboration","2.teaching\u002F1.apps-dev\u002F8.cheat-sheets\u002F1.github-collaboration",{"title":172,"path":173,"stem":174,"children":175},"Snippets","\u002Fsnippets","3.snippets",[176,178],{"title":172,"path":173,"stem":177},"3.snippets\u002Findex",{"title":179,"path":180,"stem":181},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":162,"path":183,"stem":184,"children":185},"\u002Fcheat-sheets","4.cheat-sheets",[186,188],{"title":162,"path":183,"stem":187},"4.cheat-sheets\u002Findex",{"title":189,"path":190,"stem":191},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":193,"path":194,"stem":195,"children":196},"Templates","\u002Ftemplates","5.templates",[197,199],{"title":193,"path":194,"stem":198},"5.templates\u002Findex",{"title":200,"path":201,"stem":202},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":204,"path":205,"stem":206,"children":207},"Meta","\u002Fmeta","6.meta",[208,210,214],{"title":204,"path":205,"stem":209},"6.meta\u002Findex",{"title":211,"path":212,"stem":213},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":215,"path":216,"stem":217},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":219,"path":220,"stem":221,"children":222},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[223,225],{"title":219,"path":220,"stem":224},"7.troubleshooting\u002Findex",{"title":226,"path":227,"stem":228},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":230,"title":158,"body":231,"category":148,"createdAt":597,"description":598,"draft":599,"extension":600,"featured":599,"keywords":601,"links":608,"meta":609,"navigation":610,"path":159,"readingTime":575,"seo":611,"stem":160,"tags":612,"updatedAt":597,"__hash__":617},"docs\u002F2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F2.opencode-cli.md",{"type":232,"value":233,"toc":574},"minimark",[234,243,250,255,328,332,463,467,557,561,570],[235,236,237,238,242],"p",{},"Copy-pasting from ChatGPT breaks down fast: you lose track of which file a snippet\nbelongs to, and the AI never sees the rest of your project. OpenCode runs in your\nterminal ",[239,240,241],"strong",{},"inside your project folder",", so it reads your real files and writes code\nstraight into them.",[235,244,245,246,249],{},"This pairs with the ",[247,248,154],"a",{"href":155}," —\nsame discipline, better tool.",[251,252,254],"h2",{"id":253},"prerequisites","Prerequisites",[256,257,259,264,274,280,287,291,298,321],"steps",{"level":258},"3",[260,261,263],"h3",{"id":262},"install-nodejs","Install Node.js",[235,265,266,267,273],{},"Download it from ",[247,268,272],{"href":269,"rel":270},"https:\u002F\u002Fnodejs.org\u002Fen\u002Fdownload\u002Fcurrent",[271],"nofollow","nodejs.org\u002Fen\u002Fdownload\u002Fcurrent",".",[235,275,276,277,273],{},"Choose the ",[239,278,279],{},"Windows Installer (.msi)",[235,281,282],{},[283,284],"img",{"alt":285,"src":286},"The Node.js download page with the Windows Installer (.msi) option highlighted","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941589\u002Fnode-install_vavvgm.png",[260,288,290],{"id":289},"verify-the-installation","Verify the installation",[235,292,293,294,297],{},"Open ",[239,295,296],{},"Command Prompt"," (CMD) and run:",[299,300,305],"pre",{"className":301,"code":302,"language":303,"meta":304,"style":304},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","node -v\n","bash","",[306,307,308],"code",{"__ignoreMap":304},[309,310,313,317],"span",{"class":311,"line":312},"line",1,[309,314,316],{"class":315},"sYn-s","node",[309,318,320],{"class":319},"sz9Cv"," -v\n",[235,322,323,324,327],{},"It should print a version number such as ",[306,325,326],{},"v24.12.0"," — the exact version depends on\nwhat you installed. If you get \"command not found\", close and reopen CMD first;\nthe installer only updates the PATH for new terminal windows.",[251,329,331],{"id":330},"installing-opencode","Installing OpenCode",[256,333,334,338,341,361,365,368,377,381,393,399,405,411,415,430,436,440,450,456,460],{"level":258},[260,335,337],{"id":336},"install-the-package-globally","Install the package globally",[235,339,340],{},"In CMD or Git Bash:",[299,342,344],{"className":301,"code":343,"language":303,"meta":304,"style":304},"npm install -g opencode-ai\n",[306,345,346],{"__ignoreMap":304},[309,347,348,351,355,358],{"class":311,"line":312},[309,349,350],{"class":315},"npm",[309,352,354],{"class":353},"sTbE_"," install",[309,356,357],{"class":319}," -g",[309,359,360],{"class":353}," opencode-ai\n",[260,362,364],{"id":363},"start-opencode","Start OpenCode",[235,366,367],{},"If it didn't open automatically after installing, run:",[299,369,371],{"className":301,"code":370,"language":303,"meta":304,"style":304},"opencode\n",[306,372,373],{"__ignoreMap":304},[309,374,375],{"class":311,"line":312},[309,376,370],{"class":315},[260,378,380],{"id":379},"get-an-api-key","Get an API key",[235,382,293,383,388,389,392],{},[247,384,387],{"href":385,"rel":386},"https:\u002F\u002Fopencode.ai\u002Fzen",[271],"opencode.ai\u002Fzen"," in your browser, click\n",[239,390,391],{},"Get started with Zen",", and register or log in.",[235,394,395,396,273],{},"After registering, click ",[239,397,398],{},"Copy Key",[235,400,401],{},[283,402],{"alt":403,"src":404},"The OpenCode Zen dashboard showing the API key with a Copy Key button","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941588\u002Fzen-api-key_lp9gxr.png",[406,407,408],"warning",{},[235,409,410],{},"An API key is a password. Don't paste it into a chat, a screenshot, or a file you\ncommit to Git.",[260,412,414],{"id":413},"connect-the-key","Connect the key",[235,416,417,418,421,422,425,426,273],{},"Back in the terminal where OpenCode is running, type ",[306,419,420],{},"\u002Fconnect",", choose\n",[239,423,424],{},"OpenCode Zen",", then paste the key and press ",[427,428],"kbd",{"value":429},"enter",[235,431,432],{},[283,433],{"alt":434,"src":435},"The OpenCode \u002Fconnect command with OpenCode Zen selected as the provider","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941589\u002Fconnect-key-opencode_q8rmrd.png",[260,437,439],{"id":438},"pick-a-model","Pick a model",[235,441,442,443,446,447,273],{},"Type ",[306,444,445],{},"\u002Fmodels"," and choose a free one — for example ",[239,448,449],{},"DeepSeek V4 Flash Free",[235,451,452],{},[283,453],{"alt":454,"src":455},"The OpenCode model picker listing available models including free options","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941588\u002Fmodels_ol8qjn.png",[260,457,459],{"id":458},"test-it","Test it",[235,461,462],{},"Send any message to confirm the connection works before you start on real code.",[251,464,466],{"id":465},"using-it-on-a-project","Using it on a project",[256,468,469,473,483,489,495,499,507,513,517,528,544,550,554],{"level":258},[260,470,472],{"id":471},"open-a-terminal-in-your-project-folder","Open a terminal in your project folder",[235,474,475,476,479,480,273],{},"Right-click inside the folder and choose ",[239,477,478],{},"Open in Terminal"," or\n",[239,481,482],{},"Open Git Bash here",[235,484,485],{},[283,486],{"alt":487,"src":488},"Windows right-click context menu showing the Open in Terminal option","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941588\u002Fopen-cmd-in-project_pgr0ca.png",[490,491,492],"note",{},[235,493,494],{},"This step is the whole point. OpenCode only sees the folder you launched it from —\nlaunch it from the wrong place and it writes files in the wrong place.",[260,496,498],{"id":497},"run-opencode","Run OpenCode",[299,500,501],{"className":301,"code":370,"language":303,"meta":304,"style":304},[306,502,503],{"__ignoreMap":304},[309,504,505],{"class":311,"line":312},[309,506,370],{"class":315},[235,508,509],{},[283,510],{"alt":511,"src":512},"OpenCode running inside a project folder in the terminal","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941588\u002Ftype-open-code-in-project_l1sadw.png",[260,514,516],{"id":515},"switch-between-plan-and-build-mode","Switch between Plan and Build mode",[235,518,519,520,523,524,527],{},"Press ",[427,521],{"value":522},"shift"," ",[427,525],{"value":526},"tab"," to toggle.",[529,530,531,538],"ul",{},[532,533,534,537],"li",{},[239,535,536],{},"Plan mode"," — the AI proposes what it will do without touching your files.",[532,539,540,543],{},[239,541,542],{},"Build mode"," — the AI actually edits files.",[235,545,546],{},[283,547],{"alt":548,"src":549},"OpenCode showing Plan mode after pressing Shift + Tab","https:\u002F\u002Fres.cloudinary.com\u002Fdu6rliaeg\u002Fimage\u002Fupload\u002Fv1784941588\u002Fshift-tab-plan-mode_g87mdp.png",[260,551,553],{"id":552},"start-building","Start building",[235,555,556],{},"Every generated file lands inside the folder you opened the terminal in — no\ncopy-pasting, no guessing which file a snippet belonged to.",[251,558,560],{"id":559},"habits-worth-keeping","Habits worth keeping",[562,563,564,567],"tip",{},[235,565,566],{},"Plan before you build. Read what it wrote. Commit often so you can undo a bad\ngeneration with Git instead of by hand.",[235,568,569],{},"The tool changed; the responsibility didn't. You still have to be able to explain\nevery line it produces.",[571,572,573],"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 .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}",{"title":304,"searchDepth":575,"depth":575,"links":576},3,[577,582,590,596],{"id":253,"depth":578,"text":254,"children":579},2,[580,581],{"id":262,"depth":575,"text":263},{"id":289,"depth":575,"text":290},{"id":330,"depth":578,"text":331,"children":583},[584,585,586,587,588,589],{"id":336,"depth":575,"text":337},{"id":363,"depth":575,"text":364},{"id":379,"depth":575,"text":380},{"id":413,"depth":575,"text":414},{"id":438,"depth":575,"text":439},{"id":458,"depth":575,"text":459},{"id":465,"depth":578,"text":466,"children":591},[592,593,594,595],{"id":471,"depth":575,"text":472},{"id":497,"depth":575,"text":498},{"id":515,"depth":575,"text":516},{"id":552,"depth":575,"text":553},{"id":559,"depth":578,"text":560},"2026-07-25","Install and configure the OpenCode CLI so AI writes code directly into your project folder instead of you copying it from a chat window.",false,"md",[602,603,604,605,606,607],"opencode","opencode zen","cli ai coding","vibe coding","npm install -g opencode-ai","deepseek free model",[],{},true,{"title":158,"description":598},[613,602,614,615,616],"ai","cli","tooling","workflow","ZVLICMVzhFDco_pgcVZDR9cv6Pw6W4ky4Uh7odm7JQ0",[619,621],{"title":154,"path":155,"stem":156,"description":620,"children":-1},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",{"title":162,"path":163,"stem":164,"description":622,"children":-1},"Step-by-step references students can follow on their own during class.",[624,634,642,644,646,654,662,667,670,673,676,684,690,693,698,701,707,710,713,718,721,724,730,734,739,742,748,752,755,760,763,765,768,771,773,779,782,787,790,794,797,804,809,812,818],{"path":135,"title":134,"description":625,"tags":626,"category":120,"featured":599,"updatedAt":632,"createdAt":632,"readingTime":633,"draft":599},"Teams of four build one frontend application over the whole semester using AI, in a single shared GitHub repository where everyone contributes.",[627,628,629,630,613,631],"teaching","activity","capstone","github","frontend","2026-08-01",12,{"path":169,"title":168,"description":635,"tags":636,"category":162,"featured":599,"updatedAt":632,"createdAt":632,"readingTime":641,"draft":599},"Create one repository, push your project, and add your teammates as collaborators so the whole team can work on the same code.",[630,637,638,639,640],"git","collaboration","teamwork","setup",4,{"path":163,"title":162,"description":622,"tags":643,"category":162,"featured":599,"updatedAt":632,"createdAt":632,"readingTime":312,"draft":599},[],{"path":159,"title":158,"description":598,"tags":645,"category":148,"featured":599,"updatedAt":597,"createdAt":597,"readingTime":575,"draft":599},[613,602,614,615,616],{"path":48,"title":47,"description":647,"tags":648,"category":37,"featured":599,"updatedAt":653,"createdAt":653,"readingTime":578,"draft":599},"A service should return a result and let the caller decide how to show it — the single most useful separation-of-concerns rule.",[649,650,651,652],"clean-code","architecture","separation-of-concerns","services","2026-07-19",{"path":64,"title":63,"description":655,"tags":656,"category":661,"featured":599,"updatedAt":653,"createdAt":653,"readingTime":575,"draft":599},"Types, variables, control flow and how to write a function (method) in C#, mapped from PHP.",[657,658,659,660],"csharp","dotnet","basics","functions",null,{"path":68,"title":67,"description":663,"tags":664,"category":661,"featured":599,"updatedAt":653,"createdAt":653,"readingTime":575,"draft":599},"Create a class, give it properties and a constructor, and use it — the C# version of a Laravel model.",[657,658,665,666],"classes","models",{"path":72,"title":71,"description":668,"tags":669,"category":661,"featured":599,"updatedAt":653,"createdAt":653,"readingTime":575,"draft":599},"Put code in another file — a service or a static helper — and call it from anywhere, the C# way.",[657,658,652,650],{"path":76,"title":75,"description":671,"tags":672,"category":661,"featured":599,"updatedAt":653,"createdAt":653,"readingTime":575,"draft":599},"How C# files, namespaces, folders and the dotnet CLI fit together into a running app.",[657,658,615,650],{"path":58,"title":57,"description":674,"tags":675,"category":661,"featured":599,"updatedAt":653,"createdAt":653,"readingTime":312,"draft":599},"Learning C# and .NET from a Laravel\u002FPHP background — the fundamentals, mapped to what you already know.",[657,658,659],{"path":20,"title":19,"description":677,"tags":678,"category":13,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[679,680,681,682],"laravel","eloquent","database","orm","2026-07-17",{"path":24,"title":23,"description":685,"tags":686,"category":13,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"My quick reference for setting up and using Laravel Homestead during development.",[679,687,688,689],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":691,"tags":692,"category":13,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":694,"tags":695,"category":27,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":578,"draft":599},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[303,696,697,687,679],"bashrc","git bash",{"path":28,"title":27,"description":699,"tags":700,"category":27,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":702,"tags":703,"category":37,"featured":610,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Practical rules for naming variables, functions and types so code reads like prose.",[649,704,705,706],"naming","readability","craft",{"path":38,"title":37,"description":708,"tags":709,"category":37,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Writing code that other people (and future you) can read.",[],{"path":52,"title":51,"description":711,"tags":712,"category":51,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Getting reliable, useful results out of language models.",[],{"path":86,"title":85,"description":714,"tags":715,"category":79,"featured":610,"updatedAt":683,"createdAt":683,"readingTime":578,"draft":599},"The Git commands I actually use day to day, plus how to undo things safely.",[637,614,716,717],"version-control","cheat-sheet",{"path":80,"title":79,"description":719,"tags":720,"category":79,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":722,"tags":723,"category":10,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Languages, frameworks and the craft of building software.",[],{"path":109,"title":108,"description":725,"tags":726,"category":89,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":641,"draft":599},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[613,727,728,729],"software development","prompt engineering","beginners",{"path":113,"title":112,"description":731,"tags":732,"category":89,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":641,"draft":599},"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.",[613,733,728,729],"javascript",{"path":117,"title":116,"description":735,"tags":736,"category":89,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":575,"draft":599},"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.",[733,729,737,738],"programming","web development",{"path":103,"title":102,"description":740,"tags":741,"category":102,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Session-by-session plans with objectives, timing and materials.",[],{"path":127,"title":126,"description":743,"tags":744,"category":120,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":575,"draft":599},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[627,628,733,745,746,747],"portfolio","dom","loops",{"path":131,"title":130,"description":749,"tags":750,"category":120,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":575,"draft":599},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[627,628,733,746,751,747],"arrays",{"path":121,"title":120,"description":753,"tags":754,"category":120,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"In-class activities that get students doing, not just listening.",[],{"path":145,"title":144,"description":756,"tags":757,"category":120,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":578,"draft":599},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[627,628,733,660,758,759],"if-statement","debugging",{"path":139,"title":138,"description":761,"tags":762,"category":138,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Practice problems that build skill through repetition.",[],{"path":155,"title":154,"description":620,"tags":764,"category":148,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":641,"draft":599},[613,728,616],{"path":149,"title":148,"description":766,"tags":767,"category":148,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Prompt templates for teaching with and about AI.",[],{"path":97,"title":96,"description":769,"tags":770,"category":89,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Lesson plans, activities, rubrics and student references.",[],{"path":90,"title":89,"description":769,"tags":772,"category":89,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},[],{"path":180,"title":179,"description":774,"tags":775,"category":172,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Two tiny functions to control how often a handler runs — with the difference explained.",[733,776,777,778],"performance","snippets","events",{"path":173,"title":172,"description":780,"tags":781,"category":172,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Small, copy-ready fragments you reach for again and again.",[],{"path":190,"title":189,"description":783,"tags":784,"category":162,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"The essential Vim motions and commands to get productive and get out.",[785,786,717,614],"vim","editor",{"path":183,"title":162,"description":788,"tags":789,"category":162,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Dense, scannable references for commands and syntax.",[],{"path":201,"title":200,"description":791,"tags":792,"category":193,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"A reusable PR description template that makes reviews faster and kinder.",[637,630,793,638],"template",{"path":194,"title":193,"description":795,"tags":796,"category":193,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Reusable starting points for files, configs and docs.",[],{"path":212,"title":211,"description":798,"tags":799,"category":204,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":578,"draft":599},"The frontmatter and markdown conventions every note in this knowledge base follows.",[800,801,802,803],"meta","conventions","markdown","authoring",{"path":216,"title":215,"description":805,"tags":806,"category":204,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":578,"draft":599},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[802,807,808],"mdc","reference",{"path":205,"title":204,"description":810,"tags":811,"category":204,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"How this knowledge base itself is built and maintained.",[],{"path":227,"title":226,"description":813,"tags":814,"category":219,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[815,816,817,759],"cors","http","apis",{"path":220,"title":219,"description":819,"tags":820,"category":219,"featured":599,"updatedAt":683,"createdAt":683,"readingTime":312,"draft":599},"Symptoms, causes and fixes for problems worth remembering.",[],1785598842048]