[{"data":1,"prerenderedAt":10048},["ShallowReactive",2],{"/pl/writing":3,"seo-stack":38,"seo-faq-data-pl":129,"articles-pl":199},{"id":4,"title":5,"body":6,"date":28,"description":29,"extension":30,"head":28,"meta":31,"navigation":32,"ogImage":28,"path":33,"robots":28,"schemaOrg":28,"seo":34,"sitemap":35,"stem":36,"__hash__":37},"content_pl/pl/3.writing.md","Blog",{"type":7,"value":8,"toc":25},"minimark",[9],[10,11,12,20],"writing",{},[13,14,16],"template",{"v-slot:title":15},"",[17,18,19],"p",{},"Artykuły",[13,21,22],{"v-slot:subtitle":15},[17,23,24],{},"Notatki z pracy developerem",{"title":15,"searchDepth":26,"depth":26,"links":27},2,[],null,"Moje artykuły o programowaniu","md",{},true,"/pl/writing",{"title":5,"description":29},{"loc":33},"pl/3.writing","rYLEDIWOlOXSNqCOBlOK80JQIkLWxUpztCfhgxTgxdg",{"id":39,"extension":40,"items":41,"meta":106,"stem":127,"__hash__":128},"stack/stack.json","json",[42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102],{"name":43,"link":44,"icon":45},"Nuxt","https://nuxt.com/","custom:nuxt",{"name":47,"link":48,"icon":49},"Vue","https://vuejs.org/","custom:vue",{"name":51,"link":52,"icon":53},"TypeScript","https://www.typescriptlang.org/","custom:typescript",{"name":55,"link":56,"icon":57},"Node.js","https://nodejs.org/","custom:node-js",{"name":59,"link":60,"icon":61},"React/React Native","https://react.dev/","custom:reactjs",{"name":63,"link":64,"icon":65},"TailwindCSS","https://tailwindcss.com/","custom:tailwind",{"name":67,"link":68,"icon":69},"Supabase","https://www.prisma.io/","custom:supabase",{"name":71,"link":72,"icon":73},"Postgre","https://www.postgresql.org/","custom:pgsql",{"name":75,"link":76,"icon":77},"Rust","https://www.rust-lang.org/","custom:rust",{"name":79,"link":80,"icon":81},"Python","https://www.python.org/","custom:python",{"name":83,"link":84,"icon":85},"Lua","https://www.lua.org/","custom:lua",{"name":87,"link":88,"icon":89},"C++","https://isocpp.org/","custom:cpp",{"name":91,"link":92,"icon":93},"Golang","https://go.dev/","custom:go",{"name":95,"link":96,"icon":97},"Figma","https://www.figma.com/","custom:figma",{"name":99,"link":100,"icon":101},"Photoshop","https://www.adobe.com/products/photoshop.html","custom:photoshop",{"name":103,"link":104,"icon":105},"Illustrator","https://www.adobe.com/products/illustrator.html","custom:illustrator",{"path":107,"body":108,"title":126},"/stack",{"items":109},[110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125],{"name":43,"link":44,"icon":45},{"name":47,"link":48,"icon":49},{"name":51,"link":52,"icon":53},{"name":55,"link":56,"icon":57},{"name":59,"link":60,"icon":61},{"name":63,"link":64,"icon":65},{"name":67,"link":68,"icon":69},{"name":71,"link":72,"icon":73},{"name":75,"link":76,"icon":77},{"name":79,"link":80,"icon":81},{"name":83,"link":84,"icon":85},{"name":87,"link":88,"icon":89},{"name":91,"link":92,"icon":93},{"name":95,"link":96,"icon":97},{"name":99,"link":100,"icon":101},{"name":103,"link":104,"icon":105},"Stack","stack","aWyFpcVGYuaHymPCKadQyiY7s0WWw_rDYWJaXBNtvoc",{"id":130,"title":131,"extension":40,"faqQuestions":132,"meta":175,"stem":197,"subtitle":178,"__hash__":198},"faq_pl/pl/faq.json","FAQ",[133,145,163],{"title":134,"questions":135},"O mnie i umiejętnościach",[136,139,142],{"label":137,"content":138},"Jakie usługi oferujesz?","**Web Development**: Strony responsywne, landing page'i, aplikacje webowe, UI/UX | **Mobile**: Aplikacje mobilne (uczę się React Native) | **Game Dev**: Skrypty dla FiveM (Lua), Modelowanie 3D (budynki, pojazdy etc) | **Backend**: Node.js, API, bazy danych. Szukam projektów, które pomogą mi rosnąć, a klientowi dostarczę jakość.",{"label":140,"content":141},"Czym się zajmujesz?","**Frontend**: HTML, CSS, JavaScript, TypeScript, Vue.js, Nuxt.js, React, Tailwind | **Backend**: Node.js, Express.js, PostgreSQL, MongoDB | **DevOps**: Git, Docker, Linux, wdrażanie aplikacji. Ciągle się uczę i rozwijam swoje umiejętności.",{"label":143,"content":144},"Jesteś dostępny do pracy?","Tak! Szukam projektów freelance, staży i pracy pełnoetatowej. Interesują mnie projekty, które pozwolą mi się rozwijać i dostarczać wartość.",{"title":146,"questions":147},"Współpraca i ceny",[148,151,154,157,160],{"label":149,"content":150},"Ile kosztuje?","Stawki są elastyczne - zazwyczaj €25-40 za godzinę dla pracy freelance. Dla większych projektów możemy ustalić cenę całościową lub pakietową.",{"label":152,"content":153},"Jak wygląda proces płatności?","Zazwyczaj proszę o 40% zaliczki na start, resztę 60% na koniec. Mogę zaakceptować przelew, PayPal albo inne metody. Dla dużych projektów - płatności etapowe po osiągnięciu milestones'ów.",{"label":155,"content":156},"Jak długo trwa projekt?","Zależy od skali. Prosta landing page: 1-2 tygodnie. Złożona aplikacja: 1-3 miesiące. Zawsze daję realny szacunek i informuję o postępach.",{"label":158,"content":159},"Jak pracujesz nad projektami?","Zaczynam od zrozumienia wymagań, potem rozbijam to na mniejsze zadania. Wierzę w jasną komunikację i czystym kod. Nie boję się pytać, gdy coś jest niejasne.",{"label":161,"content":162},"Pracujesz w zespołach?","Lubię! Pracowałem w zespołach, znam Git, code review, patrzę na kod innych. Staram się być łatwy do pracy i otwarty na feedback.",{"title":164,"questions":165},"Osobiste",[166,169,172],{"label":167,"content":168},"Co Cię motywuje?","Rozwiązywanie problemów i widzenie, że coś moje działa w prawdziwym życiu. Każdy projekt to szansa, aby się nauczyć czegoś nowego. To satysfakcjonujące!",{"label":170,"content":171},"Jak się aktualizujesz?","Czytam blogi, uczestniczę w społecznościach developerów, robię side-projecty, biorę kursy. W tej branży musisz się ciągle uczyć - i lubię to.",{"label":173,"content":174},"Czego się uczysz teraz?","Pogłębiam TypeScript, zaawansowane wzorce Vue.js, optymalizację wydajności i accessibility. Chciałbym też więcej wiedzieć o backend'zie i DevOps'ie.",{"path":176,"body":177},"/pl/faq",{"title":131,"subtitle":178,"faqQuestions":179},"Często zadawane pytania",[180,185,192],{"title":134,"questions":181},[182,183,184],{"label":137,"content":138},{"label":140,"content":141},{"label":143,"content":144},{"title":146,"questions":186},[187,188,189,190,191],{"label":149,"content":150},{"label":152,"content":153},{"label":155,"content":156},{"label":158,"content":159},{"label":161,"content":162},{"title":164,"questions":193},[194,195,196],{"label":167,"content":168},{"label":170,"content":171},{"label":173,"content":174},"pl/faq","TXjuRP2jHY72uT4DTozaL4U0aHHBGEzUGSD0KbL_qaU",[200,1047,3984,6793],{"id":201,"title":202,"body":203,"date":1032,"description":1033,"extension":30,"head":28,"image":1034,"meta":1035,"navigation":32,"ogImage":28,"path":1036,"readingTime":1037,"robots":28,"schemaOrg":28,"seo":1038,"sitemap":1039,"stem":1040,"tags":1041,"__hash__":1046},"articles_pl/pl/articles/5-things-i-wish-i-knew-before-first-dev-job.md","5 rzeczy, które chciałbym wiedzieć przed moją pierwszą pracą jako developer",{"type":7,"value":204,"toc":1020},[205,210,213,216,219,224,230,233,238,251,314,320,324,329,332,337,348,353,368,544,548,553,556,561,578,643,648,665,669,674,677,682,708,713,773,777,782,785,790,807,812,844,991,995,998,1001,1006,1010,1013,1016],[206,207,209],"h2",{"id":208},"wstęp","Wstęp",[17,211,212],{},"Rozpoczęcie swojej pierwszej pracy jako developer może być przytłaczające. Są nowe narzędzia, nowy kod, nowi ludzie i nowe oczekiwania.",[17,214,215],{},"Pamiętam, że byłem całkowicie zdezorientowany w moim pierwszym tygodniu. Był kod, którego nie rozumiałem, konwencje, którymi nigdy się nie zajmowałem, i systemy, które wydawały się czarną magią.",[17,217,218],{},"Landing your first developer job is exciting, but it can also be intimidating. Looking back at my journey, there are several things I wish someone had told me before I started. These insights would have saved me from countless moments of confusion, self-doubt, and unnecessary stress.",[220,221,223],"h3",{"id":222},"_1-its-okay-to-not-know-everything","1. It's Okay to Not Know Everything",[17,225,226],{},[227,228,229],"strong",{},"The Myth of the \"Perfect Developer\"",[17,231,232],{},"When I started, I thought I needed to know every technology, framework, and best practice. The reality? Even senior developers Google things daily. The key isn't knowing everything—it's knowing how to find answers and learn quickly.",[17,234,235],{},[227,236,237],{},"What I Learned:",[239,240,241,245,248],"ul",{},[242,243,244],"li",{},"Asking questions is a sign of engagement, not weakness",[242,246,247],{},"Everyone was a beginner once, and most developers are happy to help",[242,249,250],{},"The ability to learn is more valuable than what you currently know",[252,253,257],"pre",{"className":254,"code":255,"language":256,"meta":15,"style":15},"language-js shiki shiki-themes github-light github-dark github-dark","// Instead of pretending to understand\nconst confusing = someComplexFunction();\n\n// It's better to ask or research\n// \"Hey, could you explain what someComplexFunction() does?\"\n// Or: Search the codebase, read docs, then ask if still unclear\n","js",[258,259,260,269,290,296,302,308],"code",{"__ignoreMap":15},[261,262,265],"span",{"class":263,"line":264},"line",1,[261,266,268],{"class":267},"sCsY4","// Instead of pretending to understand\n",[261,270,271,275,279,282,286],{"class":263,"line":26},[261,272,274],{"class":273},"so5gQ","const",[261,276,278],{"class":277},"suiK_"," confusing",[261,280,281],{"class":273}," =",[261,283,285],{"class":284},"shcOC"," someComplexFunction",[261,287,289],{"class":288},"slsVL","();\n",[261,291,293],{"class":263,"line":292},3,[261,294,295],{"emptyLinePlaceholder":32},"\n",[261,297,299],{"class":263,"line":298},4,[261,300,301],{"class":267},"// It's better to ask or research\n",[261,303,305],{"class":263,"line":304},5,[261,306,307],{"class":267},"// \"Hey, could you explain what someComplexFunction() does?\"\n",[261,309,311],{"class":263,"line":310},6,[261,312,313],{"class":267},"// Or: Search the codebase, read docs, then ask if still unclear\n",[17,315,316,319],{},[227,317,318],{},"Pro Tip:"," Keep a learning journal. When you encounter something new, write it down. This creates a personal knowledge base you can reference later.",[220,321,323],{"id":322},"_2-code-reviews-are-your-best-friend","2. Code Reviews Are Your Best Friend",[17,325,326],{},[227,327,328],{},"From Scary to Valuable",[17,330,331],{},"My first code review felt like a personal attack. Every comment seemed to say \"you're not good enough.\" But once I shifted my perspective, code reviews became my fastest path to improvement.",[17,333,334],{},[227,335,336],{},"What Makes a Good Code Review:",[239,338,339,342,345],{},[242,340,341],{},"It's about the code, not about you personally",[242,343,344],{},"Each comment is a free lesson from experienced developers",[242,346,347],{},"It helps you write better code and learn team standards",[17,349,350],{},[227,351,352],{},"How to Handle Feedback:",[354,355,356,359,362,365],"ol",{},[242,357,358],{},"Read all comments before responding",[242,360,361],{},"Ask for clarification if something isn't clear",[242,363,364],{},"Thank reviewers for their time",[242,366,367],{},"Apply the lessons to future code",[252,369,373],{"className":370,"code":371,"language":372,"meta":15,"style":15},"language-vue shiki shiki-themes github-light github-dark github-dark","\u003C!-- Before code review -->\n\u003Ctemplate>\n  \u003Cdiv v-if=\"data\">\n    \u003Cdiv v-for=\"item in data\">{{ item }}\u003C/div>\n  \u003C/div>\n\u003C/template>\n\n\u003C!-- After applying feedback -->\n\u003Ctemplate>\n  \u003Cdiv v-if=\"data?.length\">\n    \u003Cdiv v-for=\"item in data\" :key=\"item.id\">\n      {{ item.name }}\n    \u003C/div>\n  \u003C/div>\n\u003C/template>\n","vue",[258,374,375,380,391,411,433,442,451,456,462,471,487,510,516,526,535],{"__ignoreMap":15},[261,376,377],{"class":263,"line":264},[261,378,379],{"class":267},"\u003C!-- Before code review -->\n",[261,381,382,385,388],{"class":263,"line":26},[261,383,384],{"class":288},"\u003C",[261,386,13],{"class":387},"sByVh",[261,389,390],{"class":288},">\n",[261,392,393,396,399,402,405,409],{"class":263,"line":292},[261,394,395],{"class":288},"  \u003C",[261,397,398],{"class":387},"div",[261,400,401],{"class":284}," v-if",[261,403,404],{"class":288},"=",[261,406,408],{"class":407},"sfrk1","\"data\"",[261,410,390],{"class":288},[261,412,413,416,418,421,423,426,429,431],{"class":263,"line":298},[261,414,415],{"class":288},"    \u003C",[261,417,398],{"class":387},[261,419,420],{"class":284}," v-for",[261,422,404],{"class":288},[261,424,425],{"class":407},"\"item in data\"",[261,427,428],{"class":288},">{{ item }}\u003C/",[261,430,398],{"class":387},[261,432,390],{"class":288},[261,434,435,438,440],{"class":263,"line":304},[261,436,437],{"class":288},"  \u003C/",[261,439,398],{"class":387},[261,441,390],{"class":288},[261,443,444,447,449],{"class":263,"line":310},[261,445,446],{"class":288},"\u003C/",[261,448,13],{"class":387},[261,450,390],{"class":288},[261,452,454],{"class":263,"line":453},7,[261,455,295],{"emptyLinePlaceholder":32},[261,457,459],{"class":263,"line":458},8,[261,460,461],{"class":267},"\u003C!-- After applying feedback -->\n",[261,463,465,467,469],{"class":263,"line":464},9,[261,466,384],{"class":288},[261,468,13],{"class":387},[261,470,390],{"class":288},[261,472,474,476,478,480,482,485],{"class":263,"line":473},10,[261,475,395],{"class":288},[261,477,398],{"class":387},[261,479,401],{"class":284},[261,481,404],{"class":288},[261,483,484],{"class":407},"\"data?.length\"",[261,486,390],{"class":288},[261,488,490,492,494,496,498,500,503,505,508],{"class":263,"line":489},11,[261,491,415],{"class":288},[261,493,398],{"class":387},[261,495,420],{"class":284},[261,497,404],{"class":288},[261,499,425],{"class":407},[261,501,502],{"class":284}," :key",[261,504,404],{"class":288},[261,506,507],{"class":407},"\"item.id\"",[261,509,390],{"class":288},[261,511,513],{"class":263,"line":512},12,[261,514,515],{"class":288},"      {{ item.name }}\n",[261,517,519,522,524],{"class":263,"line":518},13,[261,520,521],{"class":288},"    \u003C/",[261,523,398],{"class":387},[261,525,390],{"class":288},[261,527,529,531,533],{"class":263,"line":528},14,[261,530,437],{"class":288},[261,532,398],{"class":387},[261,534,390],{"class":288},[261,536,538,540,542],{"class":263,"line":537},15,[261,539,446],{"class":288},[261,541,13],{"class":387},[261,543,390],{"class":288},[220,545,547],{"id":546},"_3-version-control-is-more-than-just-commits","3. Version Control Is More Than Just Commits",[17,549,550],{},[227,551,552],{},"Git Beyond the Basics",[17,554,555],{},"I thought I knew Git because I could commit and push. Then I had to resolve my first merge conflict, rebase a branch, and cherry-pick commits. Suddenly, I realized there was so much more to learn.",[17,557,558],{},[227,559,560],{},"Essential Git Skills:",[239,562,563,566,569,572,575],{},[242,564,565],{},"Writing meaningful commit messages",[242,567,568],{},"Understanding branching strategies",[242,570,571],{},"Handling merge conflicts",[242,573,574],{},"Using git stash for context switching",[242,576,577],{},"Interactive rebase for clean history",[252,579,583],{"className":580,"code":581,"language":582,"meta":15,"style":15},"language-bash shiki shiki-themes github-light github-dark github-dark","# Bad commit message\ngit commit -m \"fixed stuff\"\n\n# Good commit message\ngit commit -m \"fix: resolve null pointer exception in user authentication\n\n- Add null check before accessing user.email\n- Add unit test to prevent regression\n- Fixes #123\"\n","bash",[258,584,585,590,604,608,613,624,628,633,638],{"__ignoreMap":15},[261,586,587],{"class":263,"line":264},[261,588,589],{"class":267},"# Bad commit message\n",[261,591,592,595,598,601],{"class":263,"line":26},[261,593,594],{"class":284},"git",[261,596,597],{"class":407}," commit",[261,599,600],{"class":277}," -m",[261,602,603],{"class":407}," \"fixed stuff\"\n",[261,605,606],{"class":263,"line":292},[261,607,295],{"emptyLinePlaceholder":32},[261,609,610],{"class":263,"line":298},[261,611,612],{"class":267},"# Good commit message\n",[261,614,615,617,619,621],{"class":263,"line":304},[261,616,594],{"class":284},[261,618,597],{"class":407},[261,620,600],{"class":277},[261,622,623],{"class":407}," \"fix: resolve null pointer exception in user authentication\n",[261,625,626],{"class":263,"line":310},[261,627,295],{"emptyLinePlaceholder":32},[261,629,630],{"class":263,"line":453},[261,631,632],{"class":407},"- Add null check before accessing user.email\n",[261,634,635],{"class":263,"line":458},[261,636,637],{"class":407},"- Add unit test to prevent regression\n",[261,639,640],{"class":263,"line":464},[261,641,642],{"class":407},"- Fixes #123\"\n",[17,644,645],{},[227,646,647],{},"My Workflow Now:",[354,649,650,653,656,659,662],{},[242,651,652],{},"Pull latest changes from main",[242,654,655],{},"Create a feature branch with a descriptive name",[242,657,658],{},"Make small, focused commits",[242,660,661],{},"Rebase if needed before creating PR",[242,663,664],{},"Squash commits if requested",[220,666,668],{"id":667},"_4-communication-skills-matter-as-much-as-code","4. Communication Skills Matter as Much as Code",[17,670,671],{},[227,672,673],{},"The Surprise Soft Skill",[17,675,676],{},"Nobody told me that half of my job would be communication. Explaining technical concepts, writing documentation, participating in stand-ups, and collaborating with non-technical team members became daily activities.",[17,678,679],{},[227,680,681],{},"Communication Channels:",[239,683,684,690,696,702],{},[242,685,686,689],{},[227,687,688],{},"Slack/Teams:"," Quick questions, status updates",[242,691,692,695],{},[227,693,694],{},"Email:"," Formal communication, external stakeholders",[242,697,698,701],{},[227,699,700],{},"Documentation:"," Future you and your teammates will thank you",[242,703,704,707],{},[227,705,706],{},"Meetings:"," Active listening, asking questions, sharing updates",[17,709,710],{},[227,711,712],{},"Tips for Better Communication:",[252,714,718],{"className":715,"code":716,"language":717,"meta":15,"style":15},"language-markdown shiki shiki-themes github-light github-dark github-dark","## When Reporting a Bug\n\n❌ \"It doesn't work\"\n\n✅ \"The login form returns a 500 error when submitting with special characters in the password field. Steps to reproduce:\n1. Go to /login\n2. Enter email: test@example.com\n3. Enter password: Test@123!\n4. Click submit\n5. Expected: Successful login\n6. Actual: 500 server error\"\n","markdown",[258,719,720,725,729,734,738,743,748,753,758,763,768],{"__ignoreMap":15},[261,721,722],{"class":263,"line":264},[261,723,724],{},"## When Reporting a Bug\n",[261,726,727],{"class":263,"line":26},[261,728,295],{"emptyLinePlaceholder":32},[261,730,731],{"class":263,"line":292},[261,732,733],{},"❌ \"It doesn't work\"\n",[261,735,736],{"class":263,"line":298},[261,737,295],{"emptyLinePlaceholder":32},[261,739,740],{"class":263,"line":304},[261,741,742],{},"✅ \"The login form returns a 500 error when submitting with special characters in the password field. Steps to reproduce:\n",[261,744,745],{"class":263,"line":310},[261,746,747],{},"1. Go to /login\n",[261,749,750],{"class":263,"line":453},[261,751,752],{},"2. Enter email: test@example.com\n",[261,754,755],{"class":263,"line":458},[261,756,757],{},"3. Enter password: Test@123!\n",[261,759,760],{"class":263,"line":464},[261,761,762],{},"4. Click submit\n",[261,764,765],{"class":263,"line":473},[261,766,767],{},"5. Expected: Successful login\n",[261,769,770],{"class":263,"line":489},[261,771,772],{},"6. Actual: 500 server error\"\n",[220,774,776],{"id":775},"_5-imposter-syndrome-is-normal-and-youre-not-alone","5. Imposter Syndrome Is Normal (And You're Not Alone)",[17,778,779],{},[227,780,781],{},"The Universal Developer Experience",[17,783,784],{},"I spent months thinking I'd be \"found out\" as a fraud who didn't belong in tech. Then I learned that even experienced developers feel this way. Imposter syndrome doesn't mean you're a fraud—it means you're pushing yourself to grow.",[17,786,787],{},[227,788,789],{},"Signs You're Actually Doing Fine:",[239,791,792,795,798,801,804],{},[242,793,794],{},"You're learning something new every week",[242,796,797],{},"Your code gets approved (even if it needs revisions)",[242,799,800],{},"You're solving problems, even if it takes time",[242,802,803],{},"Teammates trust you with tasks",[242,805,806],{},"You're contributing to the team's goals",[17,808,809],{},[227,810,811],{},"Strategies That Helped Me:",[354,813,814,820,826,832,838],{},[242,815,816,819],{},[227,817,818],{},"Keep a \"wins\" document:"," Write down every achievement, no matter how small",[242,821,822,825],{},[227,823,824],{},"Compare yourself to past you:"," Not to others",[242,827,828,831],{},[227,829,830],{},"Remember:"," Everyone's learning curve is different",[242,833,834,837],{},[227,835,836],{},"Talk about it:"," You'll find you're not alone",[242,839,840,843],{},[227,841,842],{},"Celebrate progress:"," Even small victories count",[252,845,847],{"className":254,"code":846,"language":256,"meta":15,"style":15},"// Week 1: This was hard\nfunction fetchData() {\n  // Struggled for hours with async/await\n}\n\n// Week 10: This became second nature\nasync function fetchData() {\n  try {\n    const response = await fetch(API_URL);\n    const data = await response.json();\n    return data;\n  } catch (error) {\n    console.error('Failed to fetch:', error);\n  }\n}\n",[258,848,849,854,865,870,875,879,884,896,904,929,947,955,966,982,987],{"__ignoreMap":15},[261,850,851],{"class":263,"line":264},[261,852,853],{"class":267},"// Week 1: This was hard\n",[261,855,856,859,862],{"class":263,"line":26},[261,857,858],{"class":273},"function",[261,860,861],{"class":284}," fetchData",[261,863,864],{"class":288},"() {\n",[261,866,867],{"class":263,"line":292},[261,868,869],{"class":267},"  // Struggled for hours with async/await\n",[261,871,872],{"class":263,"line":298},[261,873,874],{"class":288},"}\n",[261,876,877],{"class":263,"line":304},[261,878,295],{"emptyLinePlaceholder":32},[261,880,881],{"class":263,"line":310},[261,882,883],{"class":267},"// Week 10: This became second nature\n",[261,885,886,889,892,894],{"class":263,"line":453},[261,887,888],{"class":273},"async",[261,890,891],{"class":273}," function",[261,893,861],{"class":284},[261,895,864],{"class":288},[261,897,898,901],{"class":263,"line":458},[261,899,900],{"class":273},"  try",[261,902,903],{"class":288}," {\n",[261,905,906,909,912,914,917,920,923,926],{"class":263,"line":464},[261,907,908],{"class":273},"    const",[261,910,911],{"class":277}," response",[261,913,281],{"class":273},[261,915,916],{"class":273}," await",[261,918,919],{"class":284}," fetch",[261,921,922],{"class":288},"(",[261,924,925],{"class":277},"API_URL",[261,927,928],{"class":288},");\n",[261,930,931,933,936,938,940,943,945],{"class":263,"line":473},[261,932,908],{"class":273},[261,934,935],{"class":277}," data",[261,937,281],{"class":273},[261,939,916],{"class":273},[261,941,942],{"class":288}," response.",[261,944,40],{"class":284},[261,946,289],{"class":288},[261,948,949,952],{"class":263,"line":489},[261,950,951],{"class":273},"    return",[261,953,954],{"class":288}," data;\n",[261,956,957,960,963],{"class":263,"line":512},[261,958,959],{"class":288},"  } ",[261,961,962],{"class":273},"catch",[261,964,965],{"class":288}," (error) {\n",[261,967,968,971,974,976,979],{"class":263,"line":518},[261,969,970],{"class":288},"    console.",[261,972,973],{"class":284},"error",[261,975,922],{"class":288},[261,977,978],{"class":407},"'Failed to fetch:'",[261,980,981],{"class":288},", error);\n",[261,983,984],{"class":263,"line":528},[261,985,986],{"class":288},"  }\n",[261,988,989],{"class":263,"line":537},[261,990,874],{"class":288},[206,992,994],{"id":993},"conclusion","Conclusion",[17,996,997],{},"Your first developer job is a learning experience in itself. These five lessons—embracing not knowing everything, valuing code reviews, mastering version control, communicating effectively, and overcoming imposter syndrome—transformed my approach to development.",[17,999,1000],{},"Remember: every senior developer was once in your shoes. The difference isn't talent—it's time, persistence, and a willingness to learn. Be patient with yourself, stay curious, and don't be afraid to ask questions.",[17,1002,1003],{},[227,1004,1005],{},"Your journey is just beginning, and that's exciting!",[220,1007,1009],{"id":1008},"final-thoughts","Final Thoughts",[17,1011,1012],{},"What would you add to this list? Every developer's journey is unique, and your experiences will shape your own lessons learned. The important thing is to keep learning, stay humble, and remember that making mistakes is part of the process.",[17,1014,1015],{},"Welcome to the wonderful world of professional development! 🚀",[1017,1018,1019],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}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 .sByVh, html code.shiki .sByVh{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}",{"title":15,"searchDepth":26,"depth":26,"links":1021},[1022,1029],{"id":208,"depth":26,"text":209,"children":1023},[1024,1025,1026,1027,1028],{"id":222,"depth":292,"text":223},{"id":322,"depth":292,"text":323},{"id":546,"depth":292,"text":547},{"id":667,"depth":292,"text":668},{"id":775,"depth":292,"text":776},{"id":993,"depth":26,"text":994,"children":1030},[1031],{"id":1008,"depth":292,"text":1009},"08/09/2025","Rozpoczęcie swojej pierwszej pracy jako developer może być przytłaczające. Oto pięć ważnych lekcji, które się nauczyłem i które mogły sprawić, że przejście do profesjonalnego desenvolvementy byłoby znacznie gładsze.","/articles/5-raycast-snippets.jpg",{},"/pl/articles/5-things-i-wish-i-knew-before-first-dev-job","7",{"title":202,"description":1033},{"loc":1036},"pl/articles/5-things-i-wish-i-knew-before-first-dev-job",[1042,1043,1044,1045],"Kariera","Junior Developer","Nauka","Porady","3-u5glZhEQsUM7t06FCOSPJQ9MdNszl8Eg9PGSRWtAo",{"id":1048,"title":1049,"body":1050,"date":3971,"description":3972,"extension":30,"head":28,"image":3973,"meta":3974,"navigation":32,"ogImage":28,"path":3975,"readingTime":3976,"robots":28,"schemaOrg":28,"seo":3977,"sitemap":3978,"stem":3979,"tags":3980,"__hash__":3983},"articles_pl/pl/articles/building-my-first-fullstack-project.md","Budowanie mojego pierwszego Full-Stack projektu - Wnioski",{"type":7,"value":1051,"toc":3957},[1052,1054,1057,1064,1068,1071,1103,1106,1110,1115,1118,1123,1163,1168,1325,1331,1335,1340,1343,1348,1777,2102,2106,2111,2179,2184,2457,2461,2466,2550,2555,2655,2660,2905,2909,2914,2917,3571,3575,3580,3606,3611,3678,3885,3889,3892,3930,3934,3940,3943,3945,3948,3954],[206,1053,209],{"id":208},[17,1055,1056],{},"Budowanie mojej pierwszej aplikacji full-stack było zarówno ekscytujące, jak i przerażające. Popełniłem niezliczone błędy, natknąłem się na wiele przeszkód i prawie kilka razy chciałem się poddać. Ale przytłumaczenie się nauczyło mnie więcej niż jakikolwiek poradnik. Oto moja szczera relacja z tej podróży.",[17,1058,1059],{},[1060,1061],"img",{"alt":1062,"src":1063},"preview","/articles/first-fullstack-project.jpg",[220,1065,1067],{"id":1066},"projekt-aplikacja-do-zarządzania-zadaniami","Projekt: Aplikacja do zarządzania zadaniami",[17,1069,1070],{},"Postanowiłem zbudować wspólną aplikację do zarządzania zadaniami - ambitne jak na pierwszy projekt, wiem. Stack, który wybrałem był:",[239,1072,1073,1079,1085,1091,1097],{},[242,1074,1075,1078],{},[227,1076,1077],{},"Frontend:"," Vue 3 + TypeScript + Tailwind CSS",[242,1080,1081,1084],{},[227,1082,1083],{},"Backend:"," Node.js + Express",[242,1086,1087,1090],{},[227,1088,1089],{},"Database:"," PostgreSQL",[242,1092,1093,1096],{},[227,1094,1095],{},"Authentication:"," JWT",[242,1098,1099,1102],{},[227,1100,1101],{},"Deployment:"," Docker + Railway",[17,1104,1105],{},"Looking back, I probably should have started simpler, but sometimes the best learning comes from jumping in the deep end.",[206,1107,1109],{"id":1108},"lesson-1-planning-saves-time-even-when-it-feels-slow","Lesson 1: Planning Saves Time (Even When It Feels Slow)",[17,1111,1112],{},[227,1113,1114],{},"The Mistake",[17,1116,1117],{},"I was so eager to start coding that I skipped proper planning. I had a vague idea of \"a task app\" and just started building. Three weeks in, I realized I had built features that didn't work together and had to refactor everything.",[17,1119,1120],{},[227,1121,1122],{},"What I Should Have Done",[252,1124,1126],{"className":715,"code":1125,"language":717,"meta":15,"style":15},"## Pre-Development Checklist\n- [ ] Define core features (MVP only)\n- [ ] Sketch basic UI wireframes\n- [ ] Design database schema\n- [ ] Plan API endpoints\n- [ ] Set up development environment\n- [ ] Create project structure\n",[258,1127,1128,1133,1138,1143,1148,1153,1158],{"__ignoreMap":15},[261,1129,1130],{"class":263,"line":264},[261,1131,1132],{},"## Pre-Development Checklist\n",[261,1134,1135],{"class":263,"line":26},[261,1136,1137],{},"- [ ] Define core features (MVP only)\n",[261,1139,1140],{"class":263,"line":292},[261,1141,1142],{},"- [ ] Sketch basic UI wireframes\n",[261,1144,1145],{"class":263,"line":298},[261,1146,1147],{},"- [ ] Design database schema\n",[261,1149,1150],{"class":263,"line":304},[261,1151,1152],{},"- [ ] Plan API endpoints\n",[261,1154,1155],{"class":263,"line":310},[261,1156,1157],{},"- [ ] Set up development environment\n",[261,1159,1160],{"class":263,"line":453},[261,1161,1162],{},"- [ ] Create project structure\n",[17,1164,1165],{},[227,1166,1167],{},"The Database Schema I Wish I Started With:",[252,1169,1173],{"className":1170,"code":1171,"language":1172,"meta":15,"style":15},"language-sql shiki shiki-themes github-light github-dark github-dark","-- Users table\nCREATE TABLE users (\n  id SERIAL PRIMARY KEY,\n  email VARCHAR(255) UNIQUE NOT NULL,\n  password_hash VARCHAR(255) NOT NULL,\n  username VARCHAR(100) NOT NULL,\n  created_at TIMESTAMP DEFAULT NOW()\n);\n\n-- Projects table\nCREATE TABLE projects (\n  id SERIAL PRIMARY KEY,\n  name VARCHAR(255) NOT NULL,\n  description TEXT,\n  owner_id INTEGER REFERENCES users(id),\n  created_at TIMESTAMP DEFAULT NOW()\n);\n\n-- Tasks table\nCREATE TABLE tasks (\n  id SERIAL PRIMARY KEY,\n  title VARCHAR(255) NOT NULL,\n  description TEXT,\n  status VARCHAR(50) DEFAULT 'todo',\n  project_id INTEGER REFERENCES projects(id),\n  assigned_to INTEGER REFERENCES users(id),\n  created_at TIMESTAMP DEFAULT NOW(),\n  due_date TIMESTAMP\n);\n","sql",[258,1174,1175,1180,1185,1190,1195,1200,1205,1210,1214,1218,1223,1228,1232,1237,1242,1247,1252,1257,1262,1268,1274,1279,1285,1290,1296,1302,1308,1314,1320],{"__ignoreMap":15},[261,1176,1177],{"class":263,"line":264},[261,1178,1179],{},"-- Users table\n",[261,1181,1182],{"class":263,"line":26},[261,1183,1184],{},"CREATE TABLE users (\n",[261,1186,1187],{"class":263,"line":292},[261,1188,1189],{},"  id SERIAL PRIMARY KEY,\n",[261,1191,1192],{"class":263,"line":298},[261,1193,1194],{},"  email VARCHAR(255) UNIQUE NOT NULL,\n",[261,1196,1197],{"class":263,"line":304},[261,1198,1199],{},"  password_hash VARCHAR(255) NOT NULL,\n",[261,1201,1202],{"class":263,"line":310},[261,1203,1204],{},"  username VARCHAR(100) NOT NULL,\n",[261,1206,1207],{"class":263,"line":453},[261,1208,1209],{},"  created_at TIMESTAMP DEFAULT NOW()\n",[261,1211,1212],{"class":263,"line":458},[261,1213,928],{},[261,1215,1216],{"class":263,"line":464},[261,1217,295],{"emptyLinePlaceholder":32},[261,1219,1220],{"class":263,"line":473},[261,1221,1222],{},"-- Projects table\n",[261,1224,1225],{"class":263,"line":489},[261,1226,1227],{},"CREATE TABLE projects (\n",[261,1229,1230],{"class":263,"line":512},[261,1231,1189],{},[261,1233,1234],{"class":263,"line":518},[261,1235,1236],{},"  name VARCHAR(255) NOT NULL,\n",[261,1238,1239],{"class":263,"line":528},[261,1240,1241],{},"  description TEXT,\n",[261,1243,1244],{"class":263,"line":537},[261,1245,1246],{},"  owner_id INTEGER REFERENCES users(id),\n",[261,1248,1250],{"class":263,"line":1249},16,[261,1251,1209],{},[261,1253,1255],{"class":263,"line":1254},17,[261,1256,928],{},[261,1258,1260],{"class":263,"line":1259},18,[261,1261,295],{"emptyLinePlaceholder":32},[261,1263,1265],{"class":263,"line":1264},19,[261,1266,1267],{},"-- Tasks table\n",[261,1269,1271],{"class":263,"line":1270},20,[261,1272,1273],{},"CREATE TABLE tasks (\n",[261,1275,1277],{"class":263,"line":1276},21,[261,1278,1189],{},[261,1280,1282],{"class":263,"line":1281},22,[261,1283,1284],{},"  title VARCHAR(255) NOT NULL,\n",[261,1286,1288],{"class":263,"line":1287},23,[261,1289,1241],{},[261,1291,1293],{"class":263,"line":1292},24,[261,1294,1295],{},"  status VARCHAR(50) DEFAULT 'todo',\n",[261,1297,1299],{"class":263,"line":1298},25,[261,1300,1301],{},"  project_id INTEGER REFERENCES projects(id),\n",[261,1303,1305],{"class":263,"line":1304},26,[261,1306,1307],{},"  assigned_to INTEGER REFERENCES users(id),\n",[261,1309,1311],{"class":263,"line":1310},27,[261,1312,1313],{},"  created_at TIMESTAMP DEFAULT NOW(),\n",[261,1315,1317],{"class":263,"line":1316},28,[261,1318,1319],{},"  due_date TIMESTAMP\n",[261,1321,1323],{"class":263,"line":1322},29,[261,1324,928],{},[17,1326,1327,1330],{},[227,1328,1329],{},"Key Takeaway:"," Spend 20% of your time planning to save 50% of your development time.",[206,1332,1334],{"id":1333},"lesson-2-start-with-authentication-its-harder-than-you-think","Lesson 2: Start With Authentication (It's Harder Than You Think)",[17,1336,1337],{},[227,1338,1339],{},"The Challenge",[17,1341,1342],{},"I naively thought, \"I'll add authentication later.\" Bad idea. Retrofitting auth into an existing app meant rewriting almost every API endpoint and component.",[17,1344,1345],{},[227,1346,1347],{},"My Authentication Flow (After Many Iterations):",[252,1349,1353],{"className":1350,"code":1351,"language":1352,"meta":15,"style":15},"language-typescript shiki shiki-themes github-light github-dark github-dark","// Backend: Login endpoint\nimport { sign } from 'jsonwebtoken';\nimport { compare } from 'bcrypt';\n\nexport async function login(req, res) {\n  try {\n    const { email, password } = req.body;\n    \n    // Find user\n    const user = await db.query(\n      'SELECT * FROM users WHERE email = $1',\n      [email]\n    );\n    \n    if (!user.rows[0]) {\n      return res.status(401).json({ error: 'Invalid credentials' });\n    }\n    \n    // Verify password\n    const validPassword = await compare(\n      password,\n      user.rows[0].password_hash\n    );\n    \n    if (!validPassword) {\n      return res.status(401).json({ error: 'Invalid credentials' });\n    }\n    \n    // Generate JWT\n    const token = sign(\n      { userId: user.rows[0].id, email: user.rows[0].email },\n      process.env.JWT_SECRET!,\n      { expiresIn: '7d' }\n    );\n    \n    res.json({ token, user: { id: user.rows[0].id, email } });\n  } catch (error) {\n    res.status(500).json({ error: 'Server error' });\n  }\n}\n","typescript",[258,1354,1355,1360,1377,1391,1395,1423,1429,1452,1457,1462,1482,1490,1495,1500,1504,1524,1554,1559,1563,1568,1584,1589,1599,1603,1607,1618,1640,1644,1648,1653,1668,1684,1697,1709,1714,1719,1735,1744,1767,1772],{"__ignoreMap":15},[261,1356,1357],{"class":263,"line":264},[261,1358,1359],{"class":267},"// Backend: Login endpoint\n",[261,1361,1362,1365,1368,1371,1374],{"class":263,"line":26},[261,1363,1364],{"class":273},"import",[261,1366,1367],{"class":288}," { sign } ",[261,1369,1370],{"class":273},"from",[261,1372,1373],{"class":407}," 'jsonwebtoken'",[261,1375,1376],{"class":288},";\n",[261,1378,1379,1381,1384,1386,1389],{"class":263,"line":292},[261,1380,1364],{"class":273},[261,1382,1383],{"class":288}," { compare } ",[261,1385,1370],{"class":273},[261,1387,1388],{"class":407}," 'bcrypt'",[261,1390,1376],{"class":288},[261,1392,1393],{"class":263,"line":298},[261,1394,295],{"emptyLinePlaceholder":32},[261,1396,1397,1400,1403,1405,1408,1410,1414,1417,1420],{"class":263,"line":304},[261,1398,1399],{"class":273},"export",[261,1401,1402],{"class":273}," async",[261,1404,891],{"class":273},[261,1406,1407],{"class":284}," login",[261,1409,922],{"class":288},[261,1411,1413],{"class":1412},"sQHwn","req",[261,1415,1416],{"class":288},", ",[261,1418,1419],{"class":1412},"res",[261,1421,1422],{"class":288},") {\n",[261,1424,1425,1427],{"class":263,"line":310},[261,1426,900],{"class":273},[261,1428,903],{"class":288},[261,1430,1431,1433,1436,1439,1441,1444,1447,1449],{"class":263,"line":453},[261,1432,908],{"class":273},[261,1434,1435],{"class":288}," { ",[261,1437,1438],{"class":277},"email",[261,1440,1416],{"class":288},[261,1442,1443],{"class":277},"password",[261,1445,1446],{"class":288}," } ",[261,1448,404],{"class":273},[261,1450,1451],{"class":288}," req.body;\n",[261,1453,1454],{"class":263,"line":458},[261,1455,1456],{"class":288},"    \n",[261,1458,1459],{"class":263,"line":464},[261,1460,1461],{"class":267},"    // Find user\n",[261,1463,1464,1466,1469,1471,1473,1476,1479],{"class":263,"line":473},[261,1465,908],{"class":273},[261,1467,1468],{"class":277}," user",[261,1470,281],{"class":273},[261,1472,916],{"class":273},[261,1474,1475],{"class":288}," db.",[261,1477,1478],{"class":284},"query",[261,1480,1481],{"class":288},"(\n",[261,1483,1484,1487],{"class":263,"line":489},[261,1485,1486],{"class":407},"      'SELECT * FROM users WHERE email = $1'",[261,1488,1489],{"class":288},",\n",[261,1491,1492],{"class":263,"line":512},[261,1493,1494],{"class":288},"      [email]\n",[261,1496,1497],{"class":263,"line":518},[261,1498,1499],{"class":288},"    );\n",[261,1501,1502],{"class":263,"line":528},[261,1503,1456],{"class":288},[261,1505,1506,1509,1512,1515,1518,1521],{"class":263,"line":537},[261,1507,1508],{"class":273},"    if",[261,1510,1511],{"class":288}," (",[261,1513,1514],{"class":273},"!",[261,1516,1517],{"class":288},"user.rows[",[261,1519,1520],{"class":277},"0",[261,1522,1523],{"class":288},"]) {\n",[261,1525,1526,1529,1532,1535,1537,1540,1543,1545,1548,1551],{"class":263,"line":1249},[261,1527,1528],{"class":273},"      return",[261,1530,1531],{"class":288}," res.",[261,1533,1534],{"class":284},"status",[261,1536,922],{"class":288},[261,1538,1539],{"class":277},"401",[261,1541,1542],{"class":288},").",[261,1544,40],{"class":284},[261,1546,1547],{"class":288},"({ error: ",[261,1549,1550],{"class":407},"'Invalid credentials'",[261,1552,1553],{"class":288}," });\n",[261,1555,1556],{"class":263,"line":1254},[261,1557,1558],{"class":288},"    }\n",[261,1560,1561],{"class":263,"line":1259},[261,1562,1456],{"class":288},[261,1564,1565],{"class":263,"line":1264},[261,1566,1567],{"class":267},"    // Verify password\n",[261,1569,1570,1572,1575,1577,1579,1582],{"class":263,"line":1270},[261,1571,908],{"class":273},[261,1573,1574],{"class":277}," validPassword",[261,1576,281],{"class":273},[261,1578,916],{"class":273},[261,1580,1581],{"class":284}," compare",[261,1583,1481],{"class":288},[261,1585,1586],{"class":263,"line":1276},[261,1587,1588],{"class":288},"      password,\n",[261,1590,1591,1594,1596],{"class":263,"line":1281},[261,1592,1593],{"class":288},"      user.rows[",[261,1595,1520],{"class":277},[261,1597,1598],{"class":288},"].password_hash\n",[261,1600,1601],{"class":263,"line":1287},[261,1602,1499],{"class":288},[261,1604,1605],{"class":263,"line":1292},[261,1606,1456],{"class":288},[261,1608,1609,1611,1613,1615],{"class":263,"line":1298},[261,1610,1508],{"class":273},[261,1612,1511],{"class":288},[261,1614,1514],{"class":273},[261,1616,1617],{"class":288},"validPassword) {\n",[261,1619,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638],{"class":263,"line":1304},[261,1621,1528],{"class":273},[261,1623,1531],{"class":288},[261,1625,1534],{"class":284},[261,1627,922],{"class":288},[261,1629,1539],{"class":277},[261,1631,1542],{"class":288},[261,1633,40],{"class":284},[261,1635,1547],{"class":288},[261,1637,1550],{"class":407},[261,1639,1553],{"class":288},[261,1641,1642],{"class":263,"line":1310},[261,1643,1558],{"class":288},[261,1645,1646],{"class":263,"line":1316},[261,1647,1456],{"class":288},[261,1649,1650],{"class":263,"line":1322},[261,1651,1652],{"class":267},"    // Generate JWT\n",[261,1654,1656,1658,1661,1663,1666],{"class":263,"line":1655},30,[261,1657,908],{"class":273},[261,1659,1660],{"class":277}," token",[261,1662,281],{"class":273},[261,1664,1665],{"class":284}," sign",[261,1667,1481],{"class":288},[261,1669,1671,1674,1676,1679,1681],{"class":263,"line":1670},31,[261,1672,1673],{"class":288},"      { userId: user.rows[",[261,1675,1520],{"class":277},[261,1677,1678],{"class":288},"].id, email: user.rows[",[261,1680,1520],{"class":277},[261,1682,1683],{"class":288},"].email },\n",[261,1685,1687,1690,1693,1695],{"class":263,"line":1686},32,[261,1688,1689],{"class":288},"      process.env.",[261,1691,1692],{"class":277},"JWT_SECRET",[261,1694,1514],{"class":273},[261,1696,1489],{"class":288},[261,1698,1700,1703,1706],{"class":263,"line":1699},33,[261,1701,1702],{"class":288},"      { expiresIn: ",[261,1704,1705],{"class":407},"'7d'",[261,1707,1708],{"class":288}," }\n",[261,1710,1712],{"class":263,"line":1711},34,[261,1713,1499],{"class":288},[261,1715,1717],{"class":263,"line":1716},35,[261,1718,1456],{"class":288},[261,1720,1722,1725,1727,1730,1732],{"class":263,"line":1721},36,[261,1723,1724],{"class":288},"    res.",[261,1726,40],{"class":284},[261,1728,1729],{"class":288},"({ token, user: { id: user.rows[",[261,1731,1520],{"class":277},[261,1733,1734],{"class":288},"].id, email } });\n",[261,1736,1738,1740,1742],{"class":263,"line":1737},37,[261,1739,959],{"class":288},[261,1741,962],{"class":273},[261,1743,965],{"class":288},[261,1745,1747,1749,1751,1753,1756,1758,1760,1762,1765],{"class":263,"line":1746},38,[261,1748,1724],{"class":288},[261,1750,1534],{"class":284},[261,1752,922],{"class":288},[261,1754,1755],{"class":277},"500",[261,1757,1542],{"class":288},[261,1759,40],{"class":284},[261,1761,1547],{"class":288},[261,1763,1764],{"class":407},"'Server error'",[261,1766,1553],{"class":288},[261,1768,1770],{"class":263,"line":1769},39,[261,1771,986],{"class":288},[261,1773,1775],{"class":263,"line":1774},40,[261,1776,874],{"class":288},[252,1778,1780],{"className":1350,"code":1779,"language":1352,"meta":15,"style":15},"// Frontend: Auth composable\nexport function useAuth() {\n  const token = ref(localStorage.getItem('token'));\n  const user = ref(null);\n  \n  async function login(email: string, password: string) {\n    const response = await fetch('/api/auth/login', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ email, password })\n    });\n    \n    if (!response.ok) throw new Error('Login failed');\n    \n    const data = await response.json();\n    token.value = data.token;\n    user.value = data.user;\n    localStorage.setItem('token', data.token);\n  }\n  \n  function logout() {\n    token.value = null;\n    user.value = null;\n    localStorage.removeItem('token');\n  }\n  \n  return { token, user, login, logout };\n}\n",[258,1781,1782,1787,1798,1824,1841,1846,1875,1895,1905,1922,1939,1944,1948,1975,1979,1995,2005,2015,2030,2034,2038,2048,2059,2069,2082,2086,2090,2098],{"__ignoreMap":15},[261,1783,1784],{"class":263,"line":264},[261,1785,1786],{"class":267},"// Frontend: Auth composable\n",[261,1788,1789,1791,1793,1796],{"class":263,"line":26},[261,1790,1399],{"class":273},[261,1792,891],{"class":273},[261,1794,1795],{"class":284}," useAuth",[261,1797,864],{"class":288},[261,1799,1800,1803,1805,1807,1810,1813,1816,1818,1821],{"class":263,"line":292},[261,1801,1802],{"class":273},"  const",[261,1804,1660],{"class":277},[261,1806,281],{"class":273},[261,1808,1809],{"class":284}," ref",[261,1811,1812],{"class":288},"(localStorage.",[261,1814,1815],{"class":284},"getItem",[261,1817,922],{"class":288},[261,1819,1820],{"class":407},"'token'",[261,1822,1823],{"class":288},"));\n",[261,1825,1826,1828,1830,1832,1834,1836,1839],{"class":263,"line":298},[261,1827,1802],{"class":273},[261,1829,1468],{"class":277},[261,1831,281],{"class":273},[261,1833,1809],{"class":284},[261,1835,922],{"class":288},[261,1837,1838],{"class":277},"null",[261,1840,928],{"class":288},[261,1842,1843],{"class":263,"line":304},[261,1844,1845],{"class":288},"  \n",[261,1847,1848,1851,1853,1855,1857,1859,1862,1865,1867,1869,1871,1873],{"class":263,"line":310},[261,1849,1850],{"class":273},"  async",[261,1852,891],{"class":273},[261,1854,1407],{"class":284},[261,1856,922],{"class":288},[261,1858,1438],{"class":1412},[261,1860,1861],{"class":273},":",[261,1863,1864],{"class":277}," string",[261,1866,1416],{"class":288},[261,1868,1443],{"class":1412},[261,1870,1861],{"class":273},[261,1872,1864],{"class":277},[261,1874,1422],{"class":288},[261,1876,1877,1879,1881,1883,1885,1887,1889,1892],{"class":263,"line":453},[261,1878,908],{"class":273},[261,1880,911],{"class":277},[261,1882,281],{"class":273},[261,1884,916],{"class":273},[261,1886,919],{"class":284},[261,1888,922],{"class":288},[261,1890,1891],{"class":407},"'/api/auth/login'",[261,1893,1894],{"class":288},", {\n",[261,1896,1897,1900,1903],{"class":263,"line":458},[261,1898,1899],{"class":288},"      method: ",[261,1901,1902],{"class":407},"'POST'",[261,1904,1489],{"class":288},[261,1906,1907,1910,1913,1916,1919],{"class":263,"line":464},[261,1908,1909],{"class":288},"      headers: { ",[261,1911,1912],{"class":407},"'Content-Type'",[261,1914,1915],{"class":288},": ",[261,1917,1918],{"class":407},"'application/json'",[261,1920,1921],{"class":288}," },\n",[261,1923,1924,1927,1930,1933,1936],{"class":263,"line":473},[261,1925,1926],{"class":288},"      body: ",[261,1928,1929],{"class":277},"JSON",[261,1931,1932],{"class":288},".",[261,1934,1935],{"class":284},"stringify",[261,1937,1938],{"class":288},"({ email, password })\n",[261,1940,1941],{"class":263,"line":489},[261,1942,1943],{"class":288},"    });\n",[261,1945,1946],{"class":263,"line":512},[261,1947,1456],{"class":288},[261,1949,1950,1952,1954,1956,1959,1962,1965,1968,1970,1973],{"class":263,"line":518},[261,1951,1508],{"class":273},[261,1953,1511],{"class":288},[261,1955,1514],{"class":273},[261,1957,1958],{"class":288},"response.ok) ",[261,1960,1961],{"class":273},"throw",[261,1963,1964],{"class":273}," new",[261,1966,1967],{"class":284}," Error",[261,1969,922],{"class":288},[261,1971,1972],{"class":407},"'Login failed'",[261,1974,928],{"class":288},[261,1976,1977],{"class":263,"line":528},[261,1978,1456],{"class":288},[261,1980,1981,1983,1985,1987,1989,1991,1993],{"class":263,"line":537},[261,1982,908],{"class":273},[261,1984,935],{"class":277},[261,1986,281],{"class":273},[261,1988,916],{"class":273},[261,1990,942],{"class":288},[261,1992,40],{"class":284},[261,1994,289],{"class":288},[261,1996,1997,2000,2002],{"class":263,"line":1249},[261,1998,1999],{"class":288},"    token.value ",[261,2001,404],{"class":273},[261,2003,2004],{"class":288}," data.token;\n",[261,2006,2007,2010,2012],{"class":263,"line":1254},[261,2008,2009],{"class":288},"    user.value ",[261,2011,404],{"class":273},[261,2013,2014],{"class":288}," data.user;\n",[261,2016,2017,2020,2023,2025,2027],{"class":263,"line":1259},[261,2018,2019],{"class":288},"    localStorage.",[261,2021,2022],{"class":284},"setItem",[261,2024,922],{"class":288},[261,2026,1820],{"class":407},[261,2028,2029],{"class":288},", data.token);\n",[261,2031,2032],{"class":263,"line":1264},[261,2033,986],{"class":288},[261,2035,2036],{"class":263,"line":1270},[261,2037,1845],{"class":288},[261,2039,2040,2043,2046],{"class":263,"line":1276},[261,2041,2042],{"class":273},"  function",[261,2044,2045],{"class":284}," logout",[261,2047,864],{"class":288},[261,2049,2050,2052,2054,2057],{"class":263,"line":1281},[261,2051,1999],{"class":288},[261,2053,404],{"class":273},[261,2055,2056],{"class":277}," null",[261,2058,1376],{"class":288},[261,2060,2061,2063,2065,2067],{"class":263,"line":1287},[261,2062,2009],{"class":288},[261,2064,404],{"class":273},[261,2066,2056],{"class":277},[261,2068,1376],{"class":288},[261,2070,2071,2073,2076,2078,2080],{"class":263,"line":1292},[261,2072,2019],{"class":288},[261,2074,2075],{"class":284},"removeItem",[261,2077,922],{"class":288},[261,2079,1820],{"class":407},[261,2081,928],{"class":288},[261,2083,2084],{"class":263,"line":1298},[261,2085,986],{"class":288},[261,2087,2088],{"class":263,"line":1304},[261,2089,1845],{"class":288},[261,2091,2092,2095],{"class":263,"line":1310},[261,2093,2094],{"class":273},"  return",[261,2096,2097],{"class":288}," { token, user, login, logout };\n",[261,2099,2100],{"class":263,"line":1316},[261,2101,874],{"class":288},[206,2103,2105],{"id":2104},"lesson-3-error-handling-isnt-optional","Lesson 3: Error Handling Isn't Optional",[17,2107,2108],{},[227,2109,2110],{},"My Initial Approach (Don't Do This)",[252,2112,2114],{"className":1350,"code":2113,"language":1352,"meta":15,"style":15},"// ❌ Bad: No error handling\nasync function fetchTasks() {\n  const response = await fetch('/api/tasks');\n  const tasks = await response.json();\n  return tasks;\n}\n",[258,2115,2116,2121,2132,2151,2168,2175],{"__ignoreMap":15},[261,2117,2118],{"class":263,"line":264},[261,2119,2120],{"class":267},"// ❌ Bad: No error handling\n",[261,2122,2123,2125,2127,2130],{"class":263,"line":26},[261,2124,888],{"class":273},[261,2126,891],{"class":273},[261,2128,2129],{"class":284}," fetchTasks",[261,2131,864],{"class":288},[261,2133,2134,2136,2138,2140,2142,2144,2146,2149],{"class":263,"line":292},[261,2135,1802],{"class":273},[261,2137,911],{"class":277},[261,2139,281],{"class":273},[261,2141,916],{"class":273},[261,2143,919],{"class":284},[261,2145,922],{"class":288},[261,2147,2148],{"class":407},"'/api/tasks'",[261,2150,928],{"class":288},[261,2152,2153,2155,2158,2160,2162,2164,2166],{"class":263,"line":298},[261,2154,1802],{"class":273},[261,2156,2157],{"class":277}," tasks",[261,2159,281],{"class":273},[261,2161,916],{"class":273},[261,2163,942],{"class":288},[261,2165,40],{"class":284},[261,2167,289],{"class":288},[261,2169,2170,2172],{"class":263,"line":304},[261,2171,2094],{"class":273},[261,2173,2174],{"class":288}," tasks;\n",[261,2176,2177],{"class":263,"line":310},[261,2178,874],{"class":288},[17,2180,2181],{},[227,2182,2183],{},"What I Learned to Do",[252,2185,2187],{"className":1350,"code":2186,"language":1352,"meta":15,"style":15},"// ✅ Good: Proper error handling\nasync function fetchTasks() {\n  try {\n    const response = await fetch('/api/tasks', {\n      headers: {\n        'Authorization': `Bearer ${token.value}`\n      }\n    });\n    \n    if (!response.ok) {\n      if (response.status === 401) {\n        // Token expired, redirect to login\n        await logout();\n        router.push('/login');\n        throw new Error('Session expired');\n      }\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    \n    const data = await response.json();\n    return data;\n  } catch (error) {\n    console.error('Failed to fetch tasks:', error);\n    // Show user-friendly error message\n    showNotification('Failed to load tasks. Please try again.', 'error');\n    return [];\n  }\n}\n",[258,2188,2189,2194,2204,2210,2228,2233,2254,2259,2263,2267,2278,2294,2299,2308,2323,2339,2343,2369,2373,2377,2393,2399,2407,2420,2425,2442,2449,2453],{"__ignoreMap":15},[261,2190,2191],{"class":263,"line":264},[261,2192,2193],{"class":267},"// ✅ Good: Proper error handling\n",[261,2195,2196,2198,2200,2202],{"class":263,"line":26},[261,2197,888],{"class":273},[261,2199,891],{"class":273},[261,2201,2129],{"class":284},[261,2203,864],{"class":288},[261,2205,2206,2208],{"class":263,"line":292},[261,2207,900],{"class":273},[261,2209,903],{"class":288},[261,2211,2212,2214,2216,2218,2220,2222,2224,2226],{"class":263,"line":298},[261,2213,908],{"class":273},[261,2215,911],{"class":277},[261,2217,281],{"class":273},[261,2219,916],{"class":273},[261,2221,919],{"class":284},[261,2223,922],{"class":288},[261,2225,2148],{"class":407},[261,2227,1894],{"class":288},[261,2229,2230],{"class":263,"line":304},[261,2231,2232],{"class":288},"      headers: {\n",[261,2234,2235,2238,2240,2243,2246,2248,2251],{"class":263,"line":310},[261,2236,2237],{"class":407},"        'Authorization'",[261,2239,1915],{"class":288},[261,2241,2242],{"class":407},"`Bearer ${",[261,2244,2245],{"class":288},"token",[261,2247,1932],{"class":407},[261,2249,2250],{"class":288},"value",[261,2252,2253],{"class":407},"}`\n",[261,2255,2256],{"class":263,"line":453},[261,2257,2258],{"class":288},"      }\n",[261,2260,2261],{"class":263,"line":458},[261,2262,1943],{"class":288},[261,2264,2265],{"class":263,"line":464},[261,2266,1456],{"class":288},[261,2268,2269,2271,2273,2275],{"class":263,"line":473},[261,2270,1508],{"class":273},[261,2272,1511],{"class":288},[261,2274,1514],{"class":273},[261,2276,2277],{"class":288},"response.ok) {\n",[261,2279,2280,2283,2286,2289,2292],{"class":263,"line":489},[261,2281,2282],{"class":273},"      if",[261,2284,2285],{"class":288}," (response.status ",[261,2287,2288],{"class":273},"===",[261,2290,2291],{"class":277}," 401",[261,2293,1422],{"class":288},[261,2295,2296],{"class":263,"line":512},[261,2297,2298],{"class":267},"        // Token expired, redirect to login\n",[261,2300,2301,2304,2306],{"class":263,"line":518},[261,2302,2303],{"class":273},"        await",[261,2305,2045],{"class":284},[261,2307,289],{"class":288},[261,2309,2310,2313,2316,2318,2321],{"class":263,"line":528},[261,2311,2312],{"class":288},"        router.",[261,2314,2315],{"class":284},"push",[261,2317,922],{"class":288},[261,2319,2320],{"class":407},"'/login'",[261,2322,928],{"class":288},[261,2324,2325,2328,2330,2332,2334,2337],{"class":263,"line":537},[261,2326,2327],{"class":273},"        throw",[261,2329,1964],{"class":273},[261,2331,1967],{"class":284},[261,2333,922],{"class":288},[261,2335,2336],{"class":407},"'Session expired'",[261,2338,928],{"class":288},[261,2340,2341],{"class":263,"line":1249},[261,2342,2258],{"class":288},[261,2344,2345,2348,2350,2352,2354,2357,2360,2362,2364,2367],{"class":263,"line":1254},[261,2346,2347],{"class":273},"      throw",[261,2349,1964],{"class":273},[261,2351,1967],{"class":284},[261,2353,922],{"class":288},[261,2355,2356],{"class":407},"`HTTP error! status: ${",[261,2358,2359],{"class":288},"response",[261,2361,1932],{"class":407},[261,2363,1534],{"class":288},[261,2365,2366],{"class":407},"}`",[261,2368,928],{"class":288},[261,2370,2371],{"class":263,"line":1259},[261,2372,1558],{"class":288},[261,2374,2375],{"class":263,"line":1264},[261,2376,1456],{"class":288},[261,2378,2379,2381,2383,2385,2387,2389,2391],{"class":263,"line":1270},[261,2380,908],{"class":273},[261,2382,935],{"class":277},[261,2384,281],{"class":273},[261,2386,916],{"class":273},[261,2388,942],{"class":288},[261,2390,40],{"class":284},[261,2392,289],{"class":288},[261,2394,2395,2397],{"class":263,"line":1276},[261,2396,951],{"class":273},[261,2398,954],{"class":288},[261,2400,2401,2403,2405],{"class":263,"line":1281},[261,2402,959],{"class":288},[261,2404,962],{"class":273},[261,2406,965],{"class":288},[261,2408,2409,2411,2413,2415,2418],{"class":263,"line":1287},[261,2410,970],{"class":288},[261,2412,973],{"class":284},[261,2414,922],{"class":288},[261,2416,2417],{"class":407},"'Failed to fetch tasks:'",[261,2419,981],{"class":288},[261,2421,2422],{"class":263,"line":1292},[261,2423,2424],{"class":267},"    // Show user-friendly error message\n",[261,2426,2427,2430,2432,2435,2437,2440],{"class":263,"line":1298},[261,2428,2429],{"class":284},"    showNotification",[261,2431,922],{"class":288},[261,2433,2434],{"class":407},"'Failed to load tasks. Please try again.'",[261,2436,1416],{"class":288},[261,2438,2439],{"class":407},"'error'",[261,2441,928],{"class":288},[261,2443,2444,2446],{"class":263,"line":1304},[261,2445,951],{"class":273},[261,2447,2448],{"class":288}," [];\n",[261,2450,2451],{"class":263,"line":1310},[261,2452,986],{"class":288},[261,2454,2455],{"class":263,"line":1316},[261,2456,874],{"class":288},[206,2458,2460],{"id":2459},"lesson-4-api-design-matters","Lesson 4: API Design Matters",[17,2462,2463],{},[227,2464,2465],{},"My First API Attempt",[252,2467,2469],{"className":1350,"code":2468,"language":1352,"meta":15,"style":15},"// ❌ Inconsistent and confusing\napp.get('/getTasks', ...)\napp.post('/task/create', ...)\napp.post('/deleteTask', ...)\napp.put('/tasks/update/:id', ...)\n",[258,2470,2471,2476,2497,2515,2532],{"__ignoreMap":15},[261,2472,2473],{"class":263,"line":264},[261,2474,2475],{"class":267},"// ❌ Inconsistent and confusing\n",[261,2477,2478,2481,2484,2486,2489,2491,2494],{"class":263,"line":26},[261,2479,2480],{"class":288},"app.",[261,2482,2483],{"class":284},"get",[261,2485,922],{"class":288},[261,2487,2488],{"class":407},"'/getTasks'",[261,2490,1416],{"class":288},[261,2492,2493],{"class":273},"...",[261,2495,2496],{"class":288},")\n",[261,2498,2499,2501,2504,2506,2509,2511,2513],{"class":263,"line":292},[261,2500,2480],{"class":288},[261,2502,2503],{"class":284},"post",[261,2505,922],{"class":288},[261,2507,2508],{"class":407},"'/task/create'",[261,2510,1416],{"class":288},[261,2512,2493],{"class":273},[261,2514,2496],{"class":288},[261,2516,2517,2519,2521,2523,2526,2528,2530],{"class":263,"line":298},[261,2518,2480],{"class":288},[261,2520,2503],{"class":284},[261,2522,922],{"class":288},[261,2524,2525],{"class":407},"'/deleteTask'",[261,2527,1416],{"class":288},[261,2529,2493],{"class":273},[261,2531,2496],{"class":288},[261,2533,2534,2536,2539,2541,2544,2546,2548],{"class":263,"line":304},[261,2535,2480],{"class":288},[261,2537,2538],{"class":284},"put",[261,2540,922],{"class":288},[261,2542,2543],{"class":407},"'/tasks/update/:id'",[261,2545,1416],{"class":288},[261,2547,2493],{"class":273},[261,2549,2496],{"class":288},[17,2551,2552],{},[227,2553,2554],{},"After Learning REST Principles",[252,2556,2558],{"className":1350,"code":2557,"language":1352,"meta":15,"style":15},"// ✅ RESTful and consistent\napp.get('/api/tasks', getAllTasks);\napp.get('/api/tasks/:id', getTaskById);\napp.post('/api/tasks', createTask);\napp.put('/api/tasks/:id', updateTask);\napp.delete('/api/tasks/:id', deleteTask);\n\n// Nested resources\napp.get('/api/projects/:projectId/tasks', getProjectTasks);\n",[258,2559,2560,2565,2578,2592,2605,2618,2632,2636,2641],{"__ignoreMap":15},[261,2561,2562],{"class":263,"line":264},[261,2563,2564],{"class":267},"// ✅ RESTful and consistent\n",[261,2566,2567,2569,2571,2573,2575],{"class":263,"line":26},[261,2568,2480],{"class":288},[261,2570,2483],{"class":284},[261,2572,922],{"class":288},[261,2574,2148],{"class":407},[261,2576,2577],{"class":288},", getAllTasks);\n",[261,2579,2580,2582,2584,2586,2589],{"class":263,"line":292},[261,2581,2480],{"class":288},[261,2583,2483],{"class":284},[261,2585,922],{"class":288},[261,2587,2588],{"class":407},"'/api/tasks/:id'",[261,2590,2591],{"class":288},", getTaskById);\n",[261,2593,2594,2596,2598,2600,2602],{"class":263,"line":298},[261,2595,2480],{"class":288},[261,2597,2503],{"class":284},[261,2599,922],{"class":288},[261,2601,2148],{"class":407},[261,2603,2604],{"class":288},", createTask);\n",[261,2606,2607,2609,2611,2613,2615],{"class":263,"line":304},[261,2608,2480],{"class":288},[261,2610,2538],{"class":284},[261,2612,922],{"class":288},[261,2614,2588],{"class":407},[261,2616,2617],{"class":288},", updateTask);\n",[261,2619,2620,2622,2625,2627,2629],{"class":263,"line":310},[261,2621,2480],{"class":288},[261,2623,2624],{"class":284},"delete",[261,2626,922],{"class":288},[261,2628,2588],{"class":407},[261,2630,2631],{"class":288},", deleteTask);\n",[261,2633,2634],{"class":263,"line":453},[261,2635,295],{"emptyLinePlaceholder":32},[261,2637,2638],{"class":263,"line":458},[261,2639,2640],{"class":267},"// Nested resources\n",[261,2642,2643,2645,2647,2649,2652],{"class":263,"line":464},[261,2644,2480],{"class":288},[261,2646,2483],{"class":284},[261,2648,922],{"class":288},[261,2650,2651],{"class":407},"'/api/projects/:projectId/tasks'",[261,2653,2654],{"class":288},", getProjectTasks);\n",[17,2656,2657],{},[227,2658,2659],{},"With Proper Middleware",[252,2661,2663],{"className":1350,"code":2662,"language":1352,"meta":15,"style":15},"import { authenticate } from './middleware/auth';\n\n// Protected routes\napp.use('/api/tasks', authenticate);\napp.use('/api/projects', authenticate);\n\n// Middleware\nexport async function authenticate(req, res, next) {\n  try {\n    const token = req.headers.authorization?.split(' ')[1];\n    \n    if (!token) {\n      return res.status(401).json({ error: 'No token provided' });\n    }\n    \n    const decoded = verify(token, process.env.JWT_SECRET!);\n    req.user = decoded;\n    next();\n  } catch (error) {\n    res.status(401).json({ error: 'Invalid token' });\n  }\n}\n",[258,2664,2665,2679,2683,2688,2702,2715,2719,2724,2750,2756,2784,2788,2799,2822,2826,2830,2851,2861,2868,2876,2897,2901],{"__ignoreMap":15},[261,2666,2667,2669,2672,2674,2677],{"class":263,"line":264},[261,2668,1364],{"class":273},[261,2670,2671],{"class":288}," { authenticate } ",[261,2673,1370],{"class":273},[261,2675,2676],{"class":407}," './middleware/auth'",[261,2678,1376],{"class":288},[261,2680,2681],{"class":263,"line":26},[261,2682,295],{"emptyLinePlaceholder":32},[261,2684,2685],{"class":263,"line":292},[261,2686,2687],{"class":267},"// Protected routes\n",[261,2689,2690,2692,2695,2697,2699],{"class":263,"line":298},[261,2691,2480],{"class":288},[261,2693,2694],{"class":284},"use",[261,2696,922],{"class":288},[261,2698,2148],{"class":407},[261,2700,2701],{"class":288},", authenticate);\n",[261,2703,2704,2706,2708,2710,2713],{"class":263,"line":304},[261,2705,2480],{"class":288},[261,2707,2694],{"class":284},[261,2709,922],{"class":288},[261,2711,2712],{"class":407},"'/api/projects'",[261,2714,2701],{"class":288},[261,2716,2717],{"class":263,"line":310},[261,2718,295],{"emptyLinePlaceholder":32},[261,2720,2721],{"class":263,"line":453},[261,2722,2723],{"class":267},"// Middleware\n",[261,2725,2726,2728,2730,2732,2735,2737,2739,2741,2743,2745,2748],{"class":263,"line":458},[261,2727,1399],{"class":273},[261,2729,1402],{"class":273},[261,2731,891],{"class":273},[261,2733,2734],{"class":284}," authenticate",[261,2736,922],{"class":288},[261,2738,1413],{"class":1412},[261,2740,1416],{"class":288},[261,2742,1419],{"class":1412},[261,2744,1416],{"class":288},[261,2746,2747],{"class":1412},"next",[261,2749,1422],{"class":288},[261,2751,2752,2754],{"class":263,"line":464},[261,2753,900],{"class":273},[261,2755,903],{"class":288},[261,2757,2758,2760,2762,2764,2767,2770,2772,2775,2778,2781],{"class":263,"line":473},[261,2759,908],{"class":273},[261,2761,1660],{"class":277},[261,2763,281],{"class":273},[261,2765,2766],{"class":288}," req.headers.authorization?.",[261,2768,2769],{"class":284},"split",[261,2771,922],{"class":288},[261,2773,2774],{"class":407},"' '",[261,2776,2777],{"class":288},")[",[261,2779,2780],{"class":277},"1",[261,2782,2783],{"class":288},"];\n",[261,2785,2786],{"class":263,"line":489},[261,2787,1456],{"class":288},[261,2789,2790,2792,2794,2796],{"class":263,"line":512},[261,2791,1508],{"class":273},[261,2793,1511],{"class":288},[261,2795,1514],{"class":273},[261,2797,2798],{"class":288},"token) {\n",[261,2800,2801,2803,2805,2807,2809,2811,2813,2815,2817,2820],{"class":263,"line":518},[261,2802,1528],{"class":273},[261,2804,1531],{"class":288},[261,2806,1534],{"class":284},[261,2808,922],{"class":288},[261,2810,1539],{"class":277},[261,2812,1542],{"class":288},[261,2814,40],{"class":284},[261,2816,1547],{"class":288},[261,2818,2819],{"class":407},"'No token provided'",[261,2821,1553],{"class":288},[261,2823,2824],{"class":263,"line":528},[261,2825,1558],{"class":288},[261,2827,2828],{"class":263,"line":537},[261,2829,1456],{"class":288},[261,2831,2832,2834,2837,2839,2842,2845,2847,2849],{"class":263,"line":1249},[261,2833,908],{"class":273},[261,2835,2836],{"class":277}," decoded",[261,2838,281],{"class":273},[261,2840,2841],{"class":284}," verify",[261,2843,2844],{"class":288},"(token, process.env.",[261,2846,1692],{"class":277},[261,2848,1514],{"class":273},[261,2850,928],{"class":288},[261,2852,2853,2856,2858],{"class":263,"line":1254},[261,2854,2855],{"class":288},"    req.user ",[261,2857,404],{"class":273},[261,2859,2860],{"class":288}," decoded;\n",[261,2862,2863,2866],{"class":263,"line":1259},[261,2864,2865],{"class":284},"    next",[261,2867,289],{"class":288},[261,2869,2870,2872,2874],{"class":263,"line":1264},[261,2871,959],{"class":288},[261,2873,962],{"class":273},[261,2875,965],{"class":288},[261,2877,2878,2880,2882,2884,2886,2888,2890,2892,2895],{"class":263,"line":1270},[261,2879,1724],{"class":288},[261,2881,1534],{"class":284},[261,2883,922],{"class":288},[261,2885,1539],{"class":277},[261,2887,1542],{"class":288},[261,2889,40],{"class":284},[261,2891,1547],{"class":288},[261,2893,2894],{"class":407},"'Invalid token'",[261,2896,1553],{"class":288},[261,2898,2899],{"class":263,"line":1276},[261,2900,986],{"class":288},[261,2902,2903],{"class":263,"line":1281},[261,2904,874],{"class":288},[206,2906,2908],{"id":2907},"lesson-5-state-management-gets-complex-fast","Lesson 5: State Management Gets Complex Fast",[17,2910,2911],{},[227,2912,2913],{},"When I Realized I Needed Pinia",[17,2915,2916],{},"Initially, I passed props and emitted events everywhere. With 3+ levels of components, it became a nightmare. Enter Pinia.",[252,2918,2920],{"className":1350,"code":2919,"language":1352,"meta":15,"style":15},"// stores/tasks.ts\nimport { defineStore } from 'pinia';\n\ninterface Task {\n  id: number;\n  title: string;\n  description: string;\n  status: 'todo' | 'in-progress' | 'done';\n  projectId: number;\n}\n\nexport const useTasksStore = defineStore('tasks', {\n  state: () => ({\n    tasks: [] as Task[],\n    loading: false,\n    error: null as string | null\n  }),\n  \n  getters: {\n    tasksByProject: (state) => (projectId: number) => {\n      return state.tasks.filter(task => task.projectId === projectId);\n    },\n    tasksByStatus: (state) => (status: Task['status']) => {\n      return state.tasks.filter(task => task.status === status);\n    }\n  },\n  \n  actions: {\n    async fetchTasks() {\n      this.loading = true;\n      this.error = null;\n      try {\n        const response = await fetch('/api/tasks');\n        this.tasks = await response.json();\n      } catch (error) {\n        this.error = 'Failed to fetch tasks';\n      } finally {\n        this.loading = false;\n      }\n    },\n    \n    async createTask(task: Omit\u003CTask, 'id'>) {\n      try {\n        const response = await fetch('/api/tasks', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(task)\n        });\n        const newTask = await response.json();\n        this.tasks.push(newTask);\n      } catch (error) {\n        this.error = 'Failed to create task';\n      }\n    }\n  }\n});\n",[258,2921,2922,2927,2941,2945,2955,2967,2978,2989,3012,3023,3027,3031,3053,3067,3080,3090,3107,3112,3116,3121,3152,3178,3183,3217,3239,3243,3248,3252,3257,3266,3281,3294,3301,3320,3338,3347,3360,3369,3382,3386,3390,3395,3425,3432,3451,3461,3475,3490,3496,3514,3527,3536,3550,3555,3560,3565],{"__ignoreMap":15},[261,2923,2924],{"class":263,"line":264},[261,2925,2926],{"class":267},"// stores/tasks.ts\n",[261,2928,2929,2931,2934,2936,2939],{"class":263,"line":26},[261,2930,1364],{"class":273},[261,2932,2933],{"class":288}," { defineStore } ",[261,2935,1370],{"class":273},[261,2937,2938],{"class":407}," 'pinia'",[261,2940,1376],{"class":288},[261,2942,2943],{"class":263,"line":292},[261,2944,295],{"emptyLinePlaceholder":32},[261,2946,2947,2950,2953],{"class":263,"line":298},[261,2948,2949],{"class":273},"interface",[261,2951,2952],{"class":284}," Task",[261,2954,903],{"class":288},[261,2956,2957,2960,2962,2965],{"class":263,"line":304},[261,2958,2959],{"class":1412},"  id",[261,2961,1861],{"class":273},[261,2963,2964],{"class":277}," number",[261,2966,1376],{"class":288},[261,2968,2969,2972,2974,2976],{"class":263,"line":310},[261,2970,2971],{"class":1412},"  title",[261,2973,1861],{"class":273},[261,2975,1864],{"class":277},[261,2977,1376],{"class":288},[261,2979,2980,2983,2985,2987],{"class":263,"line":453},[261,2981,2982],{"class":1412},"  description",[261,2984,1861],{"class":273},[261,2986,1864],{"class":277},[261,2988,1376],{"class":288},[261,2990,2991,2994,2996,2999,3002,3005,3007,3010],{"class":263,"line":458},[261,2992,2993],{"class":1412},"  status",[261,2995,1861],{"class":273},[261,2997,2998],{"class":407}," 'todo'",[261,3000,3001],{"class":273}," |",[261,3003,3004],{"class":407}," 'in-progress'",[261,3006,3001],{"class":273},[261,3008,3009],{"class":407}," 'done'",[261,3011,1376],{"class":288},[261,3013,3014,3017,3019,3021],{"class":263,"line":464},[261,3015,3016],{"class":1412},"  projectId",[261,3018,1861],{"class":273},[261,3020,2964],{"class":277},[261,3022,1376],{"class":288},[261,3024,3025],{"class":263,"line":473},[261,3026,874],{"class":288},[261,3028,3029],{"class":263,"line":489},[261,3030,295],{"emptyLinePlaceholder":32},[261,3032,3033,3035,3038,3041,3043,3046,3048,3051],{"class":263,"line":512},[261,3034,1399],{"class":273},[261,3036,3037],{"class":273}," const",[261,3039,3040],{"class":277}," useTasksStore",[261,3042,281],{"class":273},[261,3044,3045],{"class":284}," defineStore",[261,3047,922],{"class":288},[261,3049,3050],{"class":407},"'tasks'",[261,3052,1894],{"class":288},[261,3054,3055,3058,3061,3064],{"class":263,"line":518},[261,3056,3057],{"class":284},"  state",[261,3059,3060],{"class":288},": () ",[261,3062,3063],{"class":273},"=>",[261,3065,3066],{"class":288}," ({\n",[261,3068,3069,3072,3075,3077],{"class":263,"line":528},[261,3070,3071],{"class":288},"    tasks: [] ",[261,3073,3074],{"class":273},"as",[261,3076,2952],{"class":284},[261,3078,3079],{"class":288},"[],\n",[261,3081,3082,3085,3088],{"class":263,"line":537},[261,3083,3084],{"class":288},"    loading: ",[261,3086,3087],{"class":277},"false",[261,3089,1489],{"class":288},[261,3091,3092,3095,3097,3100,3102,3104],{"class":263,"line":1249},[261,3093,3094],{"class":288},"    error: ",[261,3096,1838],{"class":277},[261,3098,3099],{"class":273}," as",[261,3101,1864],{"class":277},[261,3103,3001],{"class":273},[261,3105,3106],{"class":277}," null\n",[261,3108,3109],{"class":263,"line":1254},[261,3110,3111],{"class":288},"  }),\n",[261,3113,3114],{"class":263,"line":1259},[261,3115,1845],{"class":288},[261,3117,3118],{"class":263,"line":1264},[261,3119,3120],{"class":288},"  getters: {\n",[261,3122,3123,3126,3129,3132,3135,3137,3139,3142,3144,3146,3148,3150],{"class":263,"line":1270},[261,3124,3125],{"class":284},"    tasksByProject",[261,3127,3128],{"class":288},": (",[261,3130,3131],{"class":1412},"state",[261,3133,3134],{"class":288},") ",[261,3136,3063],{"class":273},[261,3138,1511],{"class":288},[261,3140,3141],{"class":1412},"projectId",[261,3143,1861],{"class":273},[261,3145,2964],{"class":277},[261,3147,3134],{"class":288},[261,3149,3063],{"class":273},[261,3151,903],{"class":288},[261,3153,3154,3156,3159,3162,3164,3167,3170,3173,3175],{"class":263,"line":1276},[261,3155,1528],{"class":273},[261,3157,3158],{"class":288}," state.tasks.",[261,3160,3161],{"class":284},"filter",[261,3163,922],{"class":288},[261,3165,3166],{"class":1412},"task",[261,3168,3169],{"class":273}," =>",[261,3171,3172],{"class":288}," task.projectId ",[261,3174,2288],{"class":273},[261,3176,3177],{"class":288}," projectId);\n",[261,3179,3180],{"class":263,"line":1281},[261,3181,3182],{"class":288},"    },\n",[261,3184,3185,3188,3190,3192,3194,3196,3198,3200,3202,3204,3207,3210,3213,3215],{"class":263,"line":1287},[261,3186,3187],{"class":284},"    tasksByStatus",[261,3189,3128],{"class":288},[261,3191,3131],{"class":1412},[261,3193,3134],{"class":288},[261,3195,3063],{"class":273},[261,3197,1511],{"class":288},[261,3199,1534],{"class":1412},[261,3201,1861],{"class":273},[261,3203,2952],{"class":284},[261,3205,3206],{"class":288},"[",[261,3208,3209],{"class":407},"'status'",[261,3211,3212],{"class":288},"]) ",[261,3214,3063],{"class":273},[261,3216,903],{"class":288},[261,3218,3219,3221,3223,3225,3227,3229,3231,3234,3236],{"class":263,"line":1292},[261,3220,1528],{"class":273},[261,3222,3158],{"class":288},[261,3224,3161],{"class":284},[261,3226,922],{"class":288},[261,3228,3166],{"class":1412},[261,3230,3169],{"class":273},[261,3232,3233],{"class":288}," task.status ",[261,3235,2288],{"class":273},[261,3237,3238],{"class":288}," status);\n",[261,3240,3241],{"class":263,"line":1298},[261,3242,1558],{"class":288},[261,3244,3245],{"class":263,"line":1304},[261,3246,3247],{"class":288},"  },\n",[261,3249,3250],{"class":263,"line":1310},[261,3251,1845],{"class":288},[261,3253,3254],{"class":263,"line":1316},[261,3255,3256],{"class":288},"  actions: {\n",[261,3258,3259,3262,3264],{"class":263,"line":1322},[261,3260,3261],{"class":273},"    async",[261,3263,2129],{"class":284},[261,3265,864],{"class":288},[261,3267,3268,3271,3274,3276,3279],{"class":263,"line":1655},[261,3269,3270],{"class":277},"      this",[261,3272,3273],{"class":288},".loading ",[261,3275,404],{"class":273},[261,3277,3278],{"class":277}," true",[261,3280,1376],{"class":288},[261,3282,3283,3285,3288,3290,3292],{"class":263,"line":1670},[261,3284,3270],{"class":277},[261,3286,3287],{"class":288},".error ",[261,3289,404],{"class":273},[261,3291,2056],{"class":277},[261,3293,1376],{"class":288},[261,3295,3296,3299],{"class":263,"line":1686},[261,3297,3298],{"class":273},"      try",[261,3300,903],{"class":288},[261,3302,3303,3306,3308,3310,3312,3314,3316,3318],{"class":263,"line":1699},[261,3304,3305],{"class":273},"        const",[261,3307,911],{"class":277},[261,3309,281],{"class":273},[261,3311,916],{"class":273},[261,3313,919],{"class":284},[261,3315,922],{"class":288},[261,3317,2148],{"class":407},[261,3319,928],{"class":288},[261,3321,3322,3325,3328,3330,3332,3334,3336],{"class":263,"line":1711},[261,3323,3324],{"class":277},"        this",[261,3326,3327],{"class":288},".tasks ",[261,3329,404],{"class":273},[261,3331,916],{"class":273},[261,3333,942],{"class":288},[261,3335,40],{"class":284},[261,3337,289],{"class":288},[261,3339,3340,3343,3345],{"class":263,"line":1716},[261,3341,3342],{"class":288},"      } ",[261,3344,962],{"class":273},[261,3346,965],{"class":288},[261,3348,3349,3351,3353,3355,3358],{"class":263,"line":1721},[261,3350,3324],{"class":277},[261,3352,3287],{"class":288},[261,3354,404],{"class":273},[261,3356,3357],{"class":407}," 'Failed to fetch tasks'",[261,3359,1376],{"class":288},[261,3361,3362,3364,3367],{"class":263,"line":1737},[261,3363,3342],{"class":288},[261,3365,3366],{"class":273},"finally",[261,3368,903],{"class":288},[261,3370,3371,3373,3375,3377,3380],{"class":263,"line":1746},[261,3372,3324],{"class":277},[261,3374,3273],{"class":288},[261,3376,404],{"class":273},[261,3378,3379],{"class":277}," false",[261,3381,1376],{"class":288},[261,3383,3384],{"class":263,"line":1769},[261,3385,2258],{"class":288},[261,3387,3388],{"class":263,"line":1774},[261,3389,3182],{"class":288},[261,3391,3393],{"class":263,"line":3392},41,[261,3394,1456],{"class":288},[261,3396,3398,3400,3403,3405,3407,3409,3412,3414,3417,3419,3422],{"class":263,"line":3397},42,[261,3399,3261],{"class":273},[261,3401,3402],{"class":284}," createTask",[261,3404,922],{"class":288},[261,3406,3166],{"class":1412},[261,3408,1861],{"class":273},[261,3410,3411],{"class":284}," Omit",[261,3413,384],{"class":288},[261,3415,3416],{"class":284},"Task",[261,3418,1416],{"class":288},[261,3420,3421],{"class":407},"'id'",[261,3423,3424],{"class":288},">) {\n",[261,3426,3428,3430],{"class":263,"line":3427},43,[261,3429,3298],{"class":273},[261,3431,903],{"class":288},[261,3433,3435,3437,3439,3441,3443,3445,3447,3449],{"class":263,"line":3434},44,[261,3436,3305],{"class":273},[261,3438,911],{"class":277},[261,3440,281],{"class":273},[261,3442,916],{"class":273},[261,3444,919],{"class":284},[261,3446,922],{"class":288},[261,3448,2148],{"class":407},[261,3450,1894],{"class":288},[261,3452,3454,3457,3459],{"class":263,"line":3453},45,[261,3455,3456],{"class":288},"          method: ",[261,3458,1902],{"class":407},[261,3460,1489],{"class":288},[261,3462,3464,3467,3469,3471,3473],{"class":263,"line":3463},46,[261,3465,3466],{"class":288},"          headers: { ",[261,3468,1912],{"class":407},[261,3470,1915],{"class":288},[261,3472,1918],{"class":407},[261,3474,1921],{"class":288},[261,3476,3478,3481,3483,3485,3487],{"class":263,"line":3477},47,[261,3479,3480],{"class":288},"          body: ",[261,3482,1929],{"class":277},[261,3484,1932],{"class":288},[261,3486,1935],{"class":284},[261,3488,3489],{"class":288},"(task)\n",[261,3491,3493],{"class":263,"line":3492},48,[261,3494,3495],{"class":288},"        });\n",[261,3497,3499,3501,3504,3506,3508,3510,3512],{"class":263,"line":3498},49,[261,3500,3305],{"class":273},[261,3502,3503],{"class":277}," newTask",[261,3505,281],{"class":273},[261,3507,916],{"class":273},[261,3509,942],{"class":288},[261,3511,40],{"class":284},[261,3513,289],{"class":288},[261,3515,3517,3519,3522,3524],{"class":263,"line":3516},50,[261,3518,3324],{"class":277},[261,3520,3521],{"class":288},".tasks.",[261,3523,2315],{"class":284},[261,3525,3526],{"class":288},"(newTask);\n",[261,3528,3530,3532,3534],{"class":263,"line":3529},51,[261,3531,3342],{"class":288},[261,3533,962],{"class":273},[261,3535,965],{"class":288},[261,3537,3539,3541,3543,3545,3548],{"class":263,"line":3538},52,[261,3540,3324],{"class":277},[261,3542,3287],{"class":288},[261,3544,404],{"class":273},[261,3546,3547],{"class":407}," 'Failed to create task'",[261,3549,1376],{"class":288},[261,3551,3553],{"class":263,"line":3552},53,[261,3554,2258],{"class":288},[261,3556,3558],{"class":263,"line":3557},54,[261,3559,1558],{"class":288},[261,3561,3563],{"class":263,"line":3562},55,[261,3564,986],{"class":288},[261,3566,3568],{"class":263,"line":3567},56,[261,3569,3570],{"class":288},"});\n",[206,3572,3574],{"id":3573},"lesson-6-deployment-is-a-whole-new-challenge","Lesson 6: Deployment Is a Whole New Challenge",[17,3576,3577],{},[227,3578,3579],{},"My Deployment Journey",[354,3581,3582,3588,3594,3600],{},[242,3583,3584,3587],{},[227,3585,3586],{},"Week 1:"," \"I'll just push to GitHub, it'll be fine\"",[242,3589,3590,3593],{},[227,3591,3592],{},"Week 2:"," \"Why doesn't it work on the server?\"",[242,3595,3596,3599],{},[227,3597,3598],{},"Week 3:"," \"What do you mean environment variables?\"",[242,3601,3602,3605],{},[227,3603,3604],{},"Week 4:"," Finally got it working with Docker",[17,3607,3608],{},[227,3609,3610],{},"The Docker Setup That Worked",[252,3612,3616],{"className":3613,"code":3614,"language":3615,"meta":15,"style":15},"language-dockerfile shiki shiki-themes github-light github-dark github-dark","# Dockerfile (Backend)\nFROM node:18-alpine\n\nWORKDIR /app\n\nCOPY package*.json ./\nRUN npm ci --only=production\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD [\"node\", \"server.js\"]\n","dockerfile",[258,3617,3618,3623,3628,3632,3637,3641,3646,3651,3655,3660,3664,3669,3673],{"__ignoreMap":15},[261,3619,3620],{"class":263,"line":264},[261,3621,3622],{},"# Dockerfile (Backend)\n",[261,3624,3625],{"class":263,"line":26},[261,3626,3627],{},"FROM node:18-alpine\n",[261,3629,3630],{"class":263,"line":292},[261,3631,295],{"emptyLinePlaceholder":32},[261,3633,3634],{"class":263,"line":298},[261,3635,3636],{},"WORKDIR /app\n",[261,3638,3639],{"class":263,"line":304},[261,3640,295],{"emptyLinePlaceholder":32},[261,3642,3643],{"class":263,"line":310},[261,3644,3645],{},"COPY package*.json ./\n",[261,3647,3648],{"class":263,"line":453},[261,3649,3650],{},"RUN npm ci --only=production\n",[261,3652,3653],{"class":263,"line":458},[261,3654,295],{"emptyLinePlaceholder":32},[261,3656,3657],{"class":263,"line":464},[261,3658,3659],{},"COPY . .\n",[261,3661,3662],{"class":263,"line":473},[261,3663,295],{"emptyLinePlaceholder":32},[261,3665,3666],{"class":263,"line":489},[261,3667,3668],{},"EXPOSE 3000\n",[261,3670,3671],{"class":263,"line":512},[261,3672,295],{"emptyLinePlaceholder":32},[261,3674,3675],{"class":263,"line":518},[261,3676,3677],{},"CMD [\"node\", \"server.js\"]\n",[252,3679,3683],{"className":3680,"code":3681,"language":3682,"meta":15,"style":15},"language-yaml shiki shiki-themes github-light github-dark github-dark","# docker-compose.yml\nversion: '3.8'\n\nservices:\n  backend:\n    build: ./backend\n    ports:\n      - \"3000:3000\"\n    environment:\n      - DATABASE_URL=${DATABASE_URL}\n      - JWT_SECRET=${JWT_SECRET}\n    depends_on:\n      - db\n  \n  frontend:\n    build: ./frontend\n    ports:\n      - \"4173:4173\"\n  \n  db:\n    image: postgres:15-alpine\n    environment:\n      - POSTGRES_DB=taskapp\n      - POSTGRES_PASSWORD=${DB_PASSWORD}\n    volumes:\n      - postgres_data:/var/lib/postgresql/data\n\nvolumes:\n  postgres_data:\n","yaml",[258,3684,3685,3690,3700,3704,3712,3719,3729,3736,3744,3751,3758,3765,3772,3779,3783,3790,3799,3805,3812,3816,3823,3833,3839,3846,3853,3860,3867,3871,3878],{"__ignoreMap":15},[261,3686,3687],{"class":263,"line":264},[261,3688,3689],{"class":267},"# docker-compose.yml\n",[261,3691,3692,3695,3697],{"class":263,"line":26},[261,3693,3694],{"class":387},"version",[261,3696,1915],{"class":288},[261,3698,3699],{"class":407},"'3.8'\n",[261,3701,3702],{"class":263,"line":292},[261,3703,295],{"emptyLinePlaceholder":32},[261,3705,3706,3709],{"class":263,"line":298},[261,3707,3708],{"class":387},"services",[261,3710,3711],{"class":288},":\n",[261,3713,3714,3717],{"class":263,"line":304},[261,3715,3716],{"class":387},"  backend",[261,3718,3711],{"class":288},[261,3720,3721,3724,3726],{"class":263,"line":310},[261,3722,3723],{"class":387},"    build",[261,3725,1915],{"class":288},[261,3727,3728],{"class":407},"./backend\n",[261,3730,3731,3734],{"class":263,"line":453},[261,3732,3733],{"class":387},"    ports",[261,3735,3711],{"class":288},[261,3737,3738,3741],{"class":263,"line":458},[261,3739,3740],{"class":288},"      - ",[261,3742,3743],{"class":407},"\"3000:3000\"\n",[261,3745,3746,3749],{"class":263,"line":464},[261,3747,3748],{"class":387},"    environment",[261,3750,3711],{"class":288},[261,3752,3753,3755],{"class":263,"line":473},[261,3754,3740],{"class":288},[261,3756,3757],{"class":407},"DATABASE_URL=${DATABASE_URL}\n",[261,3759,3760,3762],{"class":263,"line":489},[261,3761,3740],{"class":288},[261,3763,3764],{"class":407},"JWT_SECRET=${JWT_SECRET}\n",[261,3766,3767,3770],{"class":263,"line":512},[261,3768,3769],{"class":387},"    depends_on",[261,3771,3711],{"class":288},[261,3773,3774,3776],{"class":263,"line":518},[261,3775,3740],{"class":288},[261,3777,3778],{"class":407},"db\n",[261,3780,3781],{"class":263,"line":528},[261,3782,1845],{"class":288},[261,3784,3785,3788],{"class":263,"line":537},[261,3786,3787],{"class":387},"  frontend",[261,3789,3711],{"class":288},[261,3791,3792,3794,3796],{"class":263,"line":1249},[261,3793,3723],{"class":387},[261,3795,1915],{"class":288},[261,3797,3798],{"class":407},"./frontend\n",[261,3800,3801,3803],{"class":263,"line":1254},[261,3802,3733],{"class":387},[261,3804,3711],{"class":288},[261,3806,3807,3809],{"class":263,"line":1259},[261,3808,3740],{"class":288},[261,3810,3811],{"class":407},"\"4173:4173\"\n",[261,3813,3814],{"class":263,"line":1264},[261,3815,1845],{"class":288},[261,3817,3818,3821],{"class":263,"line":1270},[261,3819,3820],{"class":387},"  db",[261,3822,3711],{"class":288},[261,3824,3825,3828,3830],{"class":263,"line":1276},[261,3826,3827],{"class":387},"    image",[261,3829,1915],{"class":288},[261,3831,3832],{"class":407},"postgres:15-alpine\n",[261,3834,3835,3837],{"class":263,"line":1281},[261,3836,3748],{"class":387},[261,3838,3711],{"class":288},[261,3840,3841,3843],{"class":263,"line":1287},[261,3842,3740],{"class":288},[261,3844,3845],{"class":407},"POSTGRES_DB=taskapp\n",[261,3847,3848,3850],{"class":263,"line":1292},[261,3849,3740],{"class":288},[261,3851,3852],{"class":407},"POSTGRES_PASSWORD=${DB_PASSWORD}\n",[261,3854,3855,3858],{"class":263,"line":1298},[261,3856,3857],{"class":387},"    volumes",[261,3859,3711],{"class":288},[261,3861,3862,3864],{"class":263,"line":1304},[261,3863,3740],{"class":288},[261,3865,3866],{"class":407},"postgres_data:/var/lib/postgresql/data\n",[261,3868,3869],{"class":263,"line":1310},[261,3870,295],{"emptyLinePlaceholder":32},[261,3872,3873,3876],{"class":263,"line":1316},[261,3874,3875],{"class":387},"volumes",[261,3877,3711],{"class":288},[261,3879,3880,3883],{"class":263,"line":1322},[261,3881,3882],{"class":387},"  postgres_data",[261,3884,3711],{"class":288},[206,3886,3888],{"id":3887},"what-id-do-differently","What I'd Do Differently",[17,3890,3891],{},"If I started over today, here's my approach:",[354,3893,3894,3900,3906,3912,3918,3924],{},[242,3895,3896,3899],{},[227,3897,3898],{},"Start smaller:"," Build a simple CRUD app first",[242,3901,3902,3905],{},[227,3903,3904],{},"Use a starter template:"," Don't reinvent the wheel",[242,3907,3908,3911],{},[227,3909,3910],{},"Set up CI/CD early:"," Automate testing and deployment",[242,3913,3914,3917],{},[227,3915,3916],{},"Write tests:"," At least for critical functionality",[242,3919,3920,3923],{},[227,3921,3922],{},"Document as you go:"," Future you will thank present you",[242,3925,3926,3929],{},[227,3927,3928],{},"Ask for code reviews:"," Even from peers",[206,3931,3933],{"id":3932},"the-most-valuable-lesson","The Most Valuable Lesson",[17,3935,3936,3939],{},[227,3937,3938],{},"Building is the best teacher."," No tutorial, course, or book can replace the experience of building something real, hitting problems, and figuring out solutions.",[17,3941,3942],{},"My first full-stack project is far from perfect. The code could be cleaner, the architecture more sophisticated, and the features more polished. But it works, it's deployed, and I learned more building it than I did in months of tutorials.",[206,3944,994],{"id":993},[17,3946,3947],{},"Your first full-stack project will be messy. You'll make mistakes. You'll want to give up. That's normal. The key is to push through, learn from each obstacle, and celebrate small wins along the way.",[17,3949,3950,3953],{},[227,3951,3952],{},"Start building today. Your future self will thank you."," 🚀",[1017,3955,3956],{},"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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sByVh, html code.shiki .sByVh{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#85E89D}",{"title":15,"searchDepth":26,"depth":26,"links":3958},[3959,3962,3963,3964,3965,3966,3967,3968,3969,3970],{"id":208,"depth":26,"text":209,"children":3960},[3961],{"id":1066,"depth":292,"text":1067},{"id":1108,"depth":26,"text":1109},{"id":1333,"depth":26,"text":1334},{"id":2104,"depth":26,"text":2105},{"id":2459,"depth":26,"text":2460},{"id":2907,"depth":26,"text":2908},{"id":3573,"depth":26,"text":3574},{"id":3887,"depth":26,"text":3888},{"id":3932,"depth":26,"text":3933},{"id":993,"depth":26,"text":994},"08/10/2025","Podróż budowania mojej pierwszej aplikacji full-stack nauczyła mnie bezcennych lekcji o developerskiej pracy, planowaniu i wytrwałości. Oto co się nauczyłem.","/articles/launch-your-porfolio.jpg",{},"/pl/articles/building-my-first-fullstack-project","8",{"title":1049,"description":3972},{"loc":3975},"pl/articles/building-my-first-fullstack-project",[3981,3982,1044,47,55],"Full-Stack","Projekt","d2_kNEVcPqwcGYEGKGKh-lo7YZ_xf1LlzIrr-wOBE0E",{"id":3985,"title":3986,"body":3987,"date":6778,"description":6779,"extension":30,"head":28,"image":6780,"meta":6781,"navigation":32,"ogImage":28,"path":6782,"readingTime":6783,"robots":28,"schemaOrg":28,"seo":6784,"sitemap":6785,"stem":6786,"tags":6787,"__hash__":6792},"articles_pl/pl/articles/git-commands-every-junior-developer-should-master.md","Komendy Git, które każdy junior developer powinien opanować",{"type":7,"value":3988,"toc":6741},[3989,3991,3994,4008,4011,4015,4019,4024,4066,4071,4164,4169,4177,4181,4186,4274,4284,4288,4292,4297,4385,4389,4510,4515,4576,4580,4584,4664,4669,4689,4693,4768,4772,4776,4839,4843,4898,4902,4981,4986,5060,5064,5125,5130,5144,5148,5152,5158,5318,5323,5420,5424,5470,5475,5510,5515,5601,5605,5662,5667,5703,5707,5711,5889,5894,5938,5942,6004,6008,6065,6069,6075,6271,6275,6280,6330,6335,6411,6416,6471,6475,6519,6521,6524,6529,6532,6535,6539,6738],[206,3990,209],{"id":208},[17,3992,3993],{},"Git jest jednym z najbardziej ważnych narzędzi dla każdego developera. Jeśli zaledwie używasz git add, git commit i git push, tracisz moc tego narzędzia.",[17,3995,3996,3997,1416,4000,4003,4004,4007],{},"When I started as a developer, I thought I knew Git. I could ",[258,3998,3999],{},"git add",[258,4001,4002],{},"git commit",", and ",[258,4005,4006],{},"git push",". But then came my first merge conflict, my first accidental commit to main, and my first \"oh no, I need to undo that.\" Suddenly, basic Git wasn't enough.",[17,4009,4010],{},"This guide covers the Git commands that transformed me from a nervous beginner to a confident contributor. No fluff—just the commands you'll actually use in real projects.",[206,4012,4014],{"id":4013},"level-1-beyond-the-basics","Level 1: Beyond the Basics",[220,4016,4018],{"id":4017},"the-commit-message-that-matters","The Commit Message That Matters",[17,4020,4021],{},[227,4022,4023],{},"Bad habits I had to break:",[252,4025,4027],{"className":580,"code":4026,"language":582,"meta":15,"style":15},"# ❌ Don't do this\ngit commit -m \"fixed stuff\"\ngit commit -m \"updates\"\ngit commit -m \"asdf\"\n",[258,4028,4029,4034,4044,4055],{"__ignoreMap":15},[261,4030,4031],{"class":263,"line":264},[261,4032,4033],{"class":267},"# ❌ Don't do this\n",[261,4035,4036,4038,4040,4042],{"class":263,"line":26},[261,4037,594],{"class":284},[261,4039,597],{"class":407},[261,4041,600],{"class":277},[261,4043,603],{"class":407},[261,4045,4046,4048,4050,4052],{"class":263,"line":292},[261,4047,594],{"class":284},[261,4049,597],{"class":407},[261,4051,600],{"class":277},[261,4053,4054],{"class":407}," \"updates\"\n",[261,4056,4057,4059,4061,4063],{"class":263,"line":298},[261,4058,594],{"class":284},[261,4060,597],{"class":407},[261,4062,600],{"class":277},[261,4064,4065],{"class":407}," \"asdf\"\n",[17,4067,4068],{},[227,4069,4070],{},"What I learned to do:",[252,4072,4074],{"className":580,"code":4073,"language":582,"meta":15,"style":15},"# ✅ Good commit messages\ngit commit -m \"fix: resolve null pointer in user login\n\n- Add null check before accessing user.email property\n- Add test case for login with missing email\n- Fixes #247\"\n\n# Follow conventional commits\ngit commit -m \"feat: add dark mode toggle to navigation\"\ngit commit -m \"refactor: simplify authentication logic\"\ngit commit -m \"docs: update API documentation for v2 endpoints\"\ngit commit -m \"test: add unit tests for payment validation\"\n",[258,4075,4076,4081,4092,4096,4101,4106,4111,4115,4120,4131,4142,4153],{"__ignoreMap":15},[261,4077,4078],{"class":263,"line":264},[261,4079,4080],{"class":267},"# ✅ Good commit messages\n",[261,4082,4083,4085,4087,4089],{"class":263,"line":26},[261,4084,594],{"class":284},[261,4086,597],{"class":407},[261,4088,600],{"class":277},[261,4090,4091],{"class":407}," \"fix: resolve null pointer in user login\n",[261,4093,4094],{"class":263,"line":292},[261,4095,295],{"emptyLinePlaceholder":32},[261,4097,4098],{"class":263,"line":298},[261,4099,4100],{"class":407},"- Add null check before accessing user.email property\n",[261,4102,4103],{"class":263,"line":304},[261,4104,4105],{"class":407},"- Add test case for login with missing email\n",[261,4107,4108],{"class":263,"line":310},[261,4109,4110],{"class":407},"- Fixes #247\"\n",[261,4112,4113],{"class":263,"line":453},[261,4114,295],{"emptyLinePlaceholder":32},[261,4116,4117],{"class":263,"line":458},[261,4118,4119],{"class":267},"# Follow conventional commits\n",[261,4121,4122,4124,4126,4128],{"class":263,"line":464},[261,4123,594],{"class":284},[261,4125,597],{"class":407},[261,4127,600],{"class":277},[261,4129,4130],{"class":407}," \"feat: add dark mode toggle to navigation\"\n",[261,4132,4133,4135,4137,4139],{"class":263,"line":473},[261,4134,594],{"class":284},[261,4136,597],{"class":407},[261,4138,600],{"class":277},[261,4140,4141],{"class":407}," \"refactor: simplify authentication logic\"\n",[261,4143,4144,4146,4148,4150],{"class":263,"line":489},[261,4145,594],{"class":284},[261,4147,597],{"class":407},[261,4149,600],{"class":277},[261,4151,4152],{"class":407}," \"docs: update API documentation for v2 endpoints\"\n",[261,4154,4155,4157,4159,4161],{"class":263,"line":512},[261,4156,594],{"class":284},[261,4158,597],{"class":407},[261,4160,600],{"class":277},[261,4162,4163],{"class":407}," \"test: add unit tests for payment validation\"\n",[17,4165,4166],{},[227,4167,4168],{},"Commit Message Template:",[252,4170,4175],{"className":4171,"code":4173,"language":4174},[4172],"language-text","\u003Ctype>: \u003Cshort summary>\n\n\u003Coptional body>\n- Bullet point changes\n- Be specific about what changed\n\n\u003Coptional footer>\nFixes #issue-number\n","text",[258,4176,4173],{"__ignoreMap":15},[220,4178,4180],{"id":4179},"checking-status-and-differences","Checking Status and Differences",[17,4182,4183],{},[227,4184,4185],{},"Commands I use every day:",[252,4187,4189],{"className":580,"code":4188,"language":582,"meta":15,"style":15},"# See what's changed\ngit status\n\n# See what's different (before staging)\ngit diff\n\n# See what's staged for commit\ngit diff --staged\n\n# Compare branches\ngit diff main..feature-branch\n\n# See changes in a specific file\ngit diff path/to/file.ts\n",[258,4190,4191,4196,4203,4207,4212,4219,4223,4228,4238,4242,4247,4256,4260,4265],{"__ignoreMap":15},[261,4192,4193],{"class":263,"line":264},[261,4194,4195],{"class":267},"# See what's changed\n",[261,4197,4198,4200],{"class":263,"line":26},[261,4199,594],{"class":284},[261,4201,4202],{"class":407}," status\n",[261,4204,4205],{"class":263,"line":292},[261,4206,295],{"emptyLinePlaceholder":32},[261,4208,4209],{"class":263,"line":298},[261,4210,4211],{"class":267},"# See what's different (before staging)\n",[261,4213,4214,4216],{"class":263,"line":304},[261,4215,594],{"class":284},[261,4217,4218],{"class":407}," diff\n",[261,4220,4221],{"class":263,"line":310},[261,4222,295],{"emptyLinePlaceholder":32},[261,4224,4225],{"class":263,"line":453},[261,4226,4227],{"class":267},"# See what's staged for commit\n",[261,4229,4230,4232,4235],{"class":263,"line":458},[261,4231,594],{"class":284},[261,4233,4234],{"class":407}," diff",[261,4236,4237],{"class":277}," --staged\n",[261,4239,4240],{"class":263,"line":464},[261,4241,295],{"emptyLinePlaceholder":32},[261,4243,4244],{"class":263,"line":473},[261,4245,4246],{"class":267},"# Compare branches\n",[261,4248,4249,4251,4253],{"class":263,"line":489},[261,4250,594],{"class":284},[261,4252,4234],{"class":407},[261,4254,4255],{"class":407}," main..feature-branch\n",[261,4257,4258],{"class":263,"line":512},[261,4259,295],{"emptyLinePlaceholder":32},[261,4261,4262],{"class":263,"line":518},[261,4263,4264],{"class":267},"# See changes in a specific file\n",[261,4266,4267,4269,4271],{"class":263,"line":528},[261,4268,594],{"class":284},[261,4270,4234],{"class":407},[261,4272,4273],{"class":407}," path/to/file.ts\n",[17,4275,4276,4279,4280,4283],{},[227,4277,4278],{},"Pro tip:"," Use ",[258,4281,4282],{},"git status -s"," for a cleaner, shorter output.",[206,4285,4287],{"id":4286},"level-2-branching-like-a-pro","Level 2: Branching Like a Pro",[220,4289,4291],{"id":4290},"creating-and-switching-branches","Creating and Switching Branches",[17,4293,4294],{},[227,4295,4296],{},"The evolution of my workflow:",[252,4298,4300],{"className":580,"code":4299,"language":582,"meta":15,"style":15},"# Old way (still works)\ngit branch feature-login\ngit checkout feature-login\n\n# Better way\ngit checkout -b feature-login\n\n# Modern way (Git 2.23+)\ngit switch -c feature-login\n\n# Switch to existing branch\ngit switch main\n",[258,4301,4302,4307,4317,4326,4330,4335,4346,4350,4355,4367,4371,4376],{"__ignoreMap":15},[261,4303,4304],{"class":263,"line":264},[261,4305,4306],{"class":267},"# Old way (still works)\n",[261,4308,4309,4311,4314],{"class":263,"line":26},[261,4310,594],{"class":284},[261,4312,4313],{"class":407}," branch",[261,4315,4316],{"class":407}," feature-login\n",[261,4318,4319,4321,4324],{"class":263,"line":292},[261,4320,594],{"class":284},[261,4322,4323],{"class":407}," checkout",[261,4325,4316],{"class":407},[261,4327,4328],{"class":263,"line":298},[261,4329,295],{"emptyLinePlaceholder":32},[261,4331,4332],{"class":263,"line":304},[261,4333,4334],{"class":267},"# Better way\n",[261,4336,4337,4339,4341,4344],{"class":263,"line":310},[261,4338,594],{"class":284},[261,4340,4323],{"class":407},[261,4342,4343],{"class":277}," -b",[261,4345,4316],{"class":407},[261,4347,4348],{"class":263,"line":453},[261,4349,295],{"emptyLinePlaceholder":32},[261,4351,4352],{"class":263,"line":458},[261,4353,4354],{"class":267},"# Modern way (Git 2.23+)\n",[261,4356,4357,4359,4362,4365],{"class":263,"line":464},[261,4358,594],{"class":284},[261,4360,4361],{"class":407}," switch",[261,4363,4364],{"class":277}," -c",[261,4366,4316],{"class":407},[261,4368,4369],{"class":263,"line":473},[261,4370,295],{"emptyLinePlaceholder":32},[261,4372,4373],{"class":263,"line":489},[261,4374,4375],{"class":267},"# Switch to existing branch\n",[261,4377,4378,4380,4382],{"class":263,"line":512},[261,4379,594],{"class":284},[261,4381,4361],{"class":407},[261,4383,4384],{"class":407}," main\n",[220,4386,4388],{"id":4387},"branch-management","Branch Management",[252,4390,4392],{"className":580,"code":4391,"language":582,"meta":15,"style":15},"# List all branches\ngit branch -a\n\n# List remote branches only\ngit branch -r\n\n# Delete a local branch\ngit branch -d feature-login\n\n# Force delete (if not merged)\ngit branch -D feature-login\n\n# Delete remote branch\ngit push origin --delete feature-login\n\n# Rename current branch\ngit branch -m new-branch-name\n",[258,4393,4394,4399,4408,4412,4417,4426,4430,4435,4446,4450,4455,4466,4470,4475,4490,4494,4499],{"__ignoreMap":15},[261,4395,4396],{"class":263,"line":264},[261,4397,4398],{"class":267},"# List all branches\n",[261,4400,4401,4403,4405],{"class":263,"line":26},[261,4402,594],{"class":284},[261,4404,4313],{"class":407},[261,4406,4407],{"class":277}," -a\n",[261,4409,4410],{"class":263,"line":292},[261,4411,295],{"emptyLinePlaceholder":32},[261,4413,4414],{"class":263,"line":298},[261,4415,4416],{"class":267},"# List remote branches only\n",[261,4418,4419,4421,4423],{"class":263,"line":304},[261,4420,594],{"class":284},[261,4422,4313],{"class":407},[261,4424,4425],{"class":277}," -r\n",[261,4427,4428],{"class":263,"line":310},[261,4429,295],{"emptyLinePlaceholder":32},[261,4431,4432],{"class":263,"line":453},[261,4433,4434],{"class":267},"# Delete a local branch\n",[261,4436,4437,4439,4441,4444],{"class":263,"line":458},[261,4438,594],{"class":284},[261,4440,4313],{"class":407},[261,4442,4443],{"class":277}," -d",[261,4445,4316],{"class":407},[261,4447,4448],{"class":263,"line":464},[261,4449,295],{"emptyLinePlaceholder":32},[261,4451,4452],{"class":263,"line":473},[261,4453,4454],{"class":267},"# Force delete (if not merged)\n",[261,4456,4457,4459,4461,4464],{"class":263,"line":489},[261,4458,594],{"class":284},[261,4460,4313],{"class":407},[261,4462,4463],{"class":277}," -D",[261,4465,4316],{"class":407},[261,4467,4468],{"class":263,"line":512},[261,4469,295],{"emptyLinePlaceholder":32},[261,4471,4472],{"class":263,"line":518},[261,4473,4474],{"class":267},"# Delete remote branch\n",[261,4476,4477,4479,4482,4485,4488],{"class":263,"line":528},[261,4478,594],{"class":284},[261,4480,4481],{"class":407}," push",[261,4483,4484],{"class":407}," origin",[261,4486,4487],{"class":277}," --delete",[261,4489,4316],{"class":407},[261,4491,4492],{"class":263,"line":537},[261,4493,295],{"emptyLinePlaceholder":32},[261,4495,4496],{"class":263,"line":1249},[261,4497,4498],{"class":267},"# Rename current branch\n",[261,4500,4501,4503,4505,4507],{"class":263,"line":1254},[261,4502,594],{"class":284},[261,4504,4313],{"class":407},[261,4506,600],{"class":277},[261,4508,4509],{"class":407}," new-branch-name\n",[17,4511,4512],{},[227,4513,4514],{},"My Branching Strategy:",[252,4516,4518],{"className":580,"code":4517,"language":582,"meta":15,"style":15},"# Feature development\ngit switch -c feature/user-authentication\n\n# Bug fixes\ngit switch -c fix/login-validation-error\n\n# Hotfix for production\ngit switch -c hotfix/security-patch\n",[258,4519,4520,4525,4536,4540,4545,4556,4560,4565],{"__ignoreMap":15},[261,4521,4522],{"class":263,"line":264},[261,4523,4524],{"class":267},"# Feature development\n",[261,4526,4527,4529,4531,4533],{"class":263,"line":26},[261,4528,594],{"class":284},[261,4530,4361],{"class":407},[261,4532,4364],{"class":277},[261,4534,4535],{"class":407}," feature/user-authentication\n",[261,4537,4538],{"class":263,"line":292},[261,4539,295],{"emptyLinePlaceholder":32},[261,4541,4542],{"class":263,"line":298},[261,4543,4544],{"class":267},"# Bug fixes\n",[261,4546,4547,4549,4551,4553],{"class":263,"line":304},[261,4548,594],{"class":284},[261,4550,4361],{"class":407},[261,4552,4364],{"class":277},[261,4554,4555],{"class":407}," fix/login-validation-error\n",[261,4557,4558],{"class":263,"line":310},[261,4559,295],{"emptyLinePlaceholder":32},[261,4561,4562],{"class":263,"line":453},[261,4563,4564],{"class":267},"# Hotfix for production\n",[261,4566,4567,4569,4571,4573],{"class":263,"line":458},[261,4568,594],{"class":284},[261,4570,4361],{"class":407},[261,4572,4364],{"class":277},[261,4574,4575],{"class":407}," hotfix/security-patch\n",[206,4577,4579],{"id":4578},"level-3-syncing-with-remote","Level 3: Syncing with Remote",[220,4581,4583],{"id":4582},"fetch-vs-pull-the-difference-that-matters","Fetch vs Pull (The Difference That Matters)",[252,4585,4587],{"className":580,"code":4586,"language":582,"meta":15,"style":15},"# Fetch: Download changes but don't merge\ngit fetch origin\n\n# See what's new\ngit log HEAD..origin/main\n\n# Pull: Fetch + Merge\ngit pull origin main\n\n# Pull with rebase (cleaner history)\ngit pull --rebase origin main\n",[258,4588,4589,4594,4603,4607,4612,4622,4626,4631,4642,4646,4651],{"__ignoreMap":15},[261,4590,4591],{"class":263,"line":264},[261,4592,4593],{"class":267},"# Fetch: Download changes but don't merge\n",[261,4595,4596,4598,4600],{"class":263,"line":26},[261,4597,594],{"class":284},[261,4599,919],{"class":407},[261,4601,4602],{"class":407}," origin\n",[261,4604,4605],{"class":263,"line":292},[261,4606,295],{"emptyLinePlaceholder":32},[261,4608,4609],{"class":263,"line":298},[261,4610,4611],{"class":267},"# See what's new\n",[261,4613,4614,4616,4619],{"class":263,"line":304},[261,4615,594],{"class":284},[261,4617,4618],{"class":407}," log",[261,4620,4621],{"class":407}," HEAD..origin/main\n",[261,4623,4624],{"class":263,"line":310},[261,4625,295],{"emptyLinePlaceholder":32},[261,4627,4628],{"class":263,"line":453},[261,4629,4630],{"class":267},"# Pull: Fetch + Merge\n",[261,4632,4633,4635,4638,4640],{"class":263,"line":458},[261,4634,594],{"class":284},[261,4636,4637],{"class":407}," pull",[261,4639,4484],{"class":407},[261,4641,4384],{"class":407},[261,4643,4644],{"class":263,"line":464},[261,4645,295],{"emptyLinePlaceholder":32},[261,4647,4648],{"class":263,"line":473},[261,4649,4650],{"class":267},"# Pull with rebase (cleaner history)\n",[261,4652,4653,4655,4657,4660,4662],{"class":263,"line":489},[261,4654,594],{"class":284},[261,4656,4637],{"class":407},[261,4658,4659],{"class":277}," --rebase",[261,4661,4484],{"class":407},[261,4663,4384],{"class":407},[17,4665,4666],{},[227,4667,4668],{},"When I use each:",[239,4670,4671,4677,4683],{},[242,4672,4673,4676],{},[258,4674,4675],{},"git fetch",": When I want to see what's changed before merging",[242,4678,4679,4682],{},[258,4680,4681],{},"git pull",": When I'm ready to merge remote changes",[242,4684,4685,4688],{},[258,4686,4687],{},"git pull --rebase",": When I want to keep my commits on top",[220,4690,4692],{"id":4691},"pushing-with-confidence","Pushing with Confidence",[252,4694,4696],{"className":580,"code":4695,"language":582,"meta":15,"style":15},"# Push current branch\ngit push\n\n# Set upstream and push\ngit push -u origin feature-login\n\n# Force push (use with caution!)\ngit push --force-with-lease\n\n# ⚠️ Never use on shared branches!\ngit push --force\n",[258,4697,4698,4703,4710,4714,4719,4732,4736,4741,4750,4754,4759],{"__ignoreMap":15},[261,4699,4700],{"class":263,"line":264},[261,4701,4702],{"class":267},"# Push current branch\n",[261,4704,4705,4707],{"class":263,"line":26},[261,4706,594],{"class":284},[261,4708,4709],{"class":407}," push\n",[261,4711,4712],{"class":263,"line":292},[261,4713,295],{"emptyLinePlaceholder":32},[261,4715,4716],{"class":263,"line":298},[261,4717,4718],{"class":267},"# Set upstream and push\n",[261,4720,4721,4723,4725,4728,4730],{"class":263,"line":304},[261,4722,594],{"class":284},[261,4724,4481],{"class":407},[261,4726,4727],{"class":277}," -u",[261,4729,4484],{"class":407},[261,4731,4316],{"class":407},[261,4733,4734],{"class":263,"line":310},[261,4735,295],{"emptyLinePlaceholder":32},[261,4737,4738],{"class":263,"line":453},[261,4739,4740],{"class":267},"# Force push (use with caution!)\n",[261,4742,4743,4745,4747],{"class":263,"line":458},[261,4744,594],{"class":284},[261,4746,4481],{"class":407},[261,4748,4749],{"class":277}," --force-with-lease\n",[261,4751,4752],{"class":263,"line":464},[261,4753,295],{"emptyLinePlaceholder":32},[261,4755,4756],{"class":263,"line":473},[261,4757,4758],{"class":267},"# ⚠️ Never use on shared branches!\n",[261,4760,4761,4763,4765],{"class":263,"line":489},[261,4762,594],{"class":284},[261,4764,4481],{"class":407},[261,4766,4767],{"class":277}," --force\n",[206,4769,4771],{"id":4770},"level-4-undoing-mistakes-lifesavers","Level 4: Undoing Mistakes (Lifesavers)",[220,4773,4775],{"id":4774},"unstaging-files","Unstaging Files",[252,4777,4779],{"className":580,"code":4778,"language":582,"meta":15,"style":15},"# Unstage a specific file\ngit restore --staged file.ts\n\n# Unstage all files\ngit restore --staged .\n\n# Old way (still works)\ngit reset HEAD file.ts\n",[258,4780,4781,4786,4799,4803,4808,4819,4823,4827],{"__ignoreMap":15},[261,4782,4783],{"class":263,"line":264},[261,4784,4785],{"class":267},"# Unstage a specific file\n",[261,4787,4788,4790,4793,4796],{"class":263,"line":26},[261,4789,594],{"class":284},[261,4791,4792],{"class":407}," restore",[261,4794,4795],{"class":277}," --staged",[261,4797,4798],{"class":407}," file.ts\n",[261,4800,4801],{"class":263,"line":292},[261,4802,295],{"emptyLinePlaceholder":32},[261,4804,4805],{"class":263,"line":298},[261,4806,4807],{"class":267},"# Unstage all files\n",[261,4809,4810,4812,4814,4816],{"class":263,"line":304},[261,4811,594],{"class":284},[261,4813,4792],{"class":407},[261,4815,4795],{"class":277},[261,4817,4818],{"class":407}," .\n",[261,4820,4821],{"class":263,"line":310},[261,4822,295],{"emptyLinePlaceholder":32},[261,4824,4825],{"class":263,"line":453},[261,4826,4306],{"class":267},[261,4828,4829,4831,4834,4837],{"class":263,"line":458},[261,4830,594],{"class":284},[261,4832,4833],{"class":407}," reset",[261,4835,4836],{"class":407}," HEAD",[261,4838,4798],{"class":407},[220,4840,4842],{"id":4841},"discarding-changes","Discarding Changes",[252,4844,4846],{"className":580,"code":4845,"language":582,"meta":15,"style":15},"# Discard changes in a specific file\ngit restore file.ts\n\n# Discard all changes (be careful!)\ngit restore .\n\n# Old way\ngit checkout -- file.ts\n",[258,4847,4848,4853,4861,4865,4870,4878,4882,4887],{"__ignoreMap":15},[261,4849,4850],{"class":263,"line":264},[261,4851,4852],{"class":267},"# Discard changes in a specific file\n",[261,4854,4855,4857,4859],{"class":263,"line":26},[261,4856,594],{"class":284},[261,4858,4792],{"class":407},[261,4860,4798],{"class":407},[261,4862,4863],{"class":263,"line":292},[261,4864,295],{"emptyLinePlaceholder":32},[261,4866,4867],{"class":263,"line":298},[261,4868,4869],{"class":267},"# Discard all changes (be careful!)\n",[261,4871,4872,4874,4876],{"class":263,"line":304},[261,4873,594],{"class":284},[261,4875,4792],{"class":407},[261,4877,4818],{"class":407},[261,4879,4880],{"class":263,"line":310},[261,4881,295],{"emptyLinePlaceholder":32},[261,4883,4884],{"class":263,"line":453},[261,4885,4886],{"class":267},"# Old way\n",[261,4888,4889,4891,4893,4896],{"class":263,"line":458},[261,4890,594],{"class":284},[261,4892,4323],{"class":407},[261,4894,4895],{"class":277}," --",[261,4897,4798],{"class":407},[220,4899,4901],{"id":4900},"undoing-commits","Undoing Commits",[252,4903,4905],{"className":580,"code":4904,"language":582,"meta":15,"style":15},"# Undo last commit, keep changes staged\ngit reset --soft HEAD~1\n\n# Undo last commit, keep changes unstaged\ngit reset HEAD~1\n\n# Undo last commit, discard all changes ⚠️\ngit reset --hard HEAD~1\n\n# Undo multiple commits\ngit reset --soft HEAD~3\n",[258,4906,4907,4912,4924,4928,4933,4941,4945,4950,4961,4965,4970],{"__ignoreMap":15},[261,4908,4909],{"class":263,"line":264},[261,4910,4911],{"class":267},"# Undo last commit, keep changes staged\n",[261,4913,4914,4916,4918,4921],{"class":263,"line":26},[261,4915,594],{"class":284},[261,4917,4833],{"class":407},[261,4919,4920],{"class":277}," --soft",[261,4922,4923],{"class":407}," HEAD~1\n",[261,4925,4926],{"class":263,"line":292},[261,4927,295],{"emptyLinePlaceholder":32},[261,4929,4930],{"class":263,"line":298},[261,4931,4932],{"class":267},"# Undo last commit, keep changes unstaged\n",[261,4934,4935,4937,4939],{"class":263,"line":304},[261,4936,594],{"class":284},[261,4938,4833],{"class":407},[261,4940,4923],{"class":407},[261,4942,4943],{"class":263,"line":310},[261,4944,295],{"emptyLinePlaceholder":32},[261,4946,4947],{"class":263,"line":453},[261,4948,4949],{"class":267},"# Undo last commit, discard all changes ⚠️\n",[261,4951,4952,4954,4956,4959],{"class":263,"line":458},[261,4953,594],{"class":284},[261,4955,4833],{"class":407},[261,4957,4958],{"class":277}," --hard",[261,4960,4923],{"class":407},[261,4962,4963],{"class":263,"line":464},[261,4964,295],{"emptyLinePlaceholder":32},[261,4966,4967],{"class":263,"line":473},[261,4968,4969],{"class":267},"# Undo multiple commits\n",[261,4971,4972,4974,4976,4978],{"class":263,"line":489},[261,4973,594],{"class":284},[261,4975,4833],{"class":407},[261,4977,4920],{"class":277},[261,4979,4980],{"class":407}," HEAD~3\n",[17,4982,4983],{},[227,4984,4985],{},"Real scenario I faced:",[252,4987,4989],{"className":580,"code":4988,"language":582,"meta":15,"style":15},"# Oops, committed to main instead of a feature branch!\n\n# 1. Create the feature branch (keeps the commits)\ngit branch feature-my-work\n\n# 2. Reset main to match remote\ngit reset --hard origin/main\n\n# 3. Switch to feature branch\ngit switch feature-my-work\n\n# 4. Now your commits are safe on the feature branch!\n",[258,4990,4991,4996,5000,5005,5014,5018,5023,5034,5038,5043,5051,5055],{"__ignoreMap":15},[261,4992,4993],{"class":263,"line":264},[261,4994,4995],{"class":267},"# Oops, committed to main instead of a feature branch!\n",[261,4997,4998],{"class":263,"line":26},[261,4999,295],{"emptyLinePlaceholder":32},[261,5001,5002],{"class":263,"line":292},[261,5003,5004],{"class":267},"# 1. Create the feature branch (keeps the commits)\n",[261,5006,5007,5009,5011],{"class":263,"line":298},[261,5008,594],{"class":284},[261,5010,4313],{"class":407},[261,5012,5013],{"class":407}," feature-my-work\n",[261,5015,5016],{"class":263,"line":304},[261,5017,295],{"emptyLinePlaceholder":32},[261,5019,5020],{"class":263,"line":310},[261,5021,5022],{"class":267},"# 2. Reset main to match remote\n",[261,5024,5025,5027,5029,5031],{"class":263,"line":453},[261,5026,594],{"class":284},[261,5028,4833],{"class":407},[261,5030,4958],{"class":277},[261,5032,5033],{"class":407}," origin/main\n",[261,5035,5036],{"class":263,"line":458},[261,5037,295],{"emptyLinePlaceholder":32},[261,5039,5040],{"class":263,"line":464},[261,5041,5042],{"class":267},"# 3. Switch to feature branch\n",[261,5044,5045,5047,5049],{"class":263,"line":473},[261,5046,594],{"class":284},[261,5048,4361],{"class":407},[261,5050,5013],{"class":407},[261,5052,5053],{"class":263,"line":489},[261,5054,295],{"emptyLinePlaceholder":32},[261,5056,5057],{"class":263,"line":512},[261,5058,5059],{"class":267},"# 4. Now your commits are safe on the feature branch!\n",[220,5061,5063],{"id":5062},"the-magic-of-revert","The Magic of Revert",[252,5065,5067],{"className":580,"code":5066,"language":582,"meta":15,"style":15},"# Create a new commit that undoes changes\ngit revert abc123\n\n# Revert multiple commits\ngit revert abc123 def456\n\n# Revert without committing yet\ngit revert --no-commit abc123\n",[258,5068,5069,5074,5084,5088,5093,5105,5109,5114],{"__ignoreMap":15},[261,5070,5071],{"class":263,"line":264},[261,5072,5073],{"class":267},"# Create a new commit that undoes changes\n",[261,5075,5076,5078,5081],{"class":263,"line":26},[261,5077,594],{"class":284},[261,5079,5080],{"class":407}," revert",[261,5082,5083],{"class":407}," abc123\n",[261,5085,5086],{"class":263,"line":292},[261,5087,295],{"emptyLinePlaceholder":32},[261,5089,5090],{"class":263,"line":298},[261,5091,5092],{"class":267},"# Revert multiple commits\n",[261,5094,5095,5097,5099,5102],{"class":263,"line":304},[261,5096,594],{"class":284},[261,5098,5080],{"class":407},[261,5100,5101],{"class":407}," abc123",[261,5103,5104],{"class":407}," def456\n",[261,5106,5107],{"class":263,"line":310},[261,5108,295],{"emptyLinePlaceholder":32},[261,5110,5111],{"class":263,"line":453},[261,5112,5113],{"class":267},"# Revert without committing yet\n",[261,5115,5116,5118,5120,5123],{"class":263,"line":458},[261,5117,594],{"class":284},[261,5119,5080],{"class":407},[261,5121,5122],{"class":277}," --no-commit",[261,5124,5083],{"class":407},[17,5126,5127],{},[227,5128,5129],{},"When to use revert vs reset:",[239,5131,5132,5138],{},[242,5133,5134,5137],{},[227,5135,5136],{},"Reset:"," For local commits not pushed yet",[242,5139,5140,5143],{},[227,5141,5142],{},"Revert:"," For commits already pushed (safe for shared branches)",[206,5145,5147],{"id":5146},"level-5-advanced-workflows","Level 5: Advanced Workflows",[220,5149,5151],{"id":5150},"stashing-your-secret-weapon","Stashing: Your Secret Weapon",[17,5153,5154,5157],{},[227,5155,5156],{},"Scenario:"," You're working on a feature, but need to quickly fix a bug on main.",[252,5159,5161],{"className":580,"code":5160,"language":582,"meta":15,"style":15},"# Save current work\ngit stash\n\n# Or with a message\ngit stash save \"WIP: user authentication form\"\n\n# List stashes\ngit stash list\n\n# Apply most recent stash\ngit stash pop\n\n# Apply specific stash\ngit stash apply stash@{1}\n\n# Apply and keep in stash\ngit stash apply\n\n# Delete stash\ngit stash drop stash@{0}\n\n# Clear all stashes\ngit stash clear\n",[258,5162,5163,5168,5175,5179,5184,5197,5201,5206,5215,5219,5224,5233,5237,5242,5258,5262,5267,5276,5280,5285,5300,5304,5309],{"__ignoreMap":15},[261,5164,5165],{"class":263,"line":264},[261,5166,5167],{"class":267},"# Save current work\n",[261,5169,5170,5172],{"class":263,"line":26},[261,5171,594],{"class":284},[261,5173,5174],{"class":407}," stash\n",[261,5176,5177],{"class":263,"line":292},[261,5178,295],{"emptyLinePlaceholder":32},[261,5180,5181],{"class":263,"line":298},[261,5182,5183],{"class":267},"# Or with a message\n",[261,5185,5186,5188,5191,5194],{"class":263,"line":304},[261,5187,594],{"class":284},[261,5189,5190],{"class":407}," stash",[261,5192,5193],{"class":407}," save",[261,5195,5196],{"class":407}," \"WIP: user authentication form\"\n",[261,5198,5199],{"class":263,"line":310},[261,5200,295],{"emptyLinePlaceholder":32},[261,5202,5203],{"class":263,"line":453},[261,5204,5205],{"class":267},"# List stashes\n",[261,5207,5208,5210,5212],{"class":263,"line":458},[261,5209,594],{"class":284},[261,5211,5190],{"class":407},[261,5213,5214],{"class":407}," list\n",[261,5216,5217],{"class":263,"line":464},[261,5218,295],{"emptyLinePlaceholder":32},[261,5220,5221],{"class":263,"line":473},[261,5222,5223],{"class":267},"# Apply most recent stash\n",[261,5225,5226,5228,5230],{"class":263,"line":489},[261,5227,594],{"class":284},[261,5229,5190],{"class":407},[261,5231,5232],{"class":407}," pop\n",[261,5234,5235],{"class":263,"line":512},[261,5236,295],{"emptyLinePlaceholder":32},[261,5238,5239],{"class":263,"line":518},[261,5240,5241],{"class":267},"# Apply specific stash\n",[261,5243,5244,5246,5248,5251,5254,5256],{"class":263,"line":528},[261,5245,594],{"class":284},[261,5247,5190],{"class":407},[261,5249,5250],{"class":407}," apply",[261,5252,5253],{"class":407}," stash@{",[261,5255,2780],{"class":277},[261,5257,874],{"class":407},[261,5259,5260],{"class":263,"line":537},[261,5261,295],{"emptyLinePlaceholder":32},[261,5263,5264],{"class":263,"line":1249},[261,5265,5266],{"class":267},"# Apply and keep in stash\n",[261,5268,5269,5271,5273],{"class":263,"line":1254},[261,5270,594],{"class":284},[261,5272,5190],{"class":407},[261,5274,5275],{"class":407}," apply\n",[261,5277,5278],{"class":263,"line":1259},[261,5279,295],{"emptyLinePlaceholder":32},[261,5281,5282],{"class":263,"line":1264},[261,5283,5284],{"class":267},"# Delete stash\n",[261,5286,5287,5289,5291,5294,5296,5298],{"class":263,"line":1270},[261,5288,594],{"class":284},[261,5290,5190],{"class":407},[261,5292,5293],{"class":407}," drop",[261,5295,5253],{"class":407},[261,5297,1520],{"class":277},[261,5299,874],{"class":407},[261,5301,5302],{"class":263,"line":1276},[261,5303,295],{"emptyLinePlaceholder":32},[261,5305,5306],{"class":263,"line":1281},[261,5307,5308],{"class":267},"# Clear all stashes\n",[261,5310,5311,5313,5315],{"class":263,"line":1287},[261,5312,594],{"class":284},[261,5314,5190],{"class":407},[261,5316,5317],{"class":407}," clear\n",[17,5319,5320],{},[227,5321,5322],{},"My typical workflow:",[252,5324,5326],{"className":580,"code":5325,"language":582,"meta":15,"style":15},"# Working on feature-login\ngit stash save \"half-done: login form validation\"\n\n# Switch to main and fix bug\ngit switch main\ngit pull\n# ... make fixes ...\ngit commit -m \"fix: critical security patch\"\ngit push\n\n# Back to feature\ngit switch feature-login\ngit stash pop\n# Continue working\n",[258,5327,5328,5333,5344,5348,5353,5361,5368,5373,5384,5390,5394,5399,5407,5415],{"__ignoreMap":15},[261,5329,5330],{"class":263,"line":264},[261,5331,5332],{"class":267},"# Working on feature-login\n",[261,5334,5335,5337,5339,5341],{"class":263,"line":26},[261,5336,594],{"class":284},[261,5338,5190],{"class":407},[261,5340,5193],{"class":407},[261,5342,5343],{"class":407}," \"half-done: login form validation\"\n",[261,5345,5346],{"class":263,"line":292},[261,5347,295],{"emptyLinePlaceholder":32},[261,5349,5350],{"class":263,"line":298},[261,5351,5352],{"class":267},"# Switch to main and fix bug\n",[261,5354,5355,5357,5359],{"class":263,"line":304},[261,5356,594],{"class":284},[261,5358,4361],{"class":407},[261,5360,4384],{"class":407},[261,5362,5363,5365],{"class":263,"line":310},[261,5364,594],{"class":284},[261,5366,5367],{"class":407}," pull\n",[261,5369,5370],{"class":263,"line":453},[261,5371,5372],{"class":267},"# ... make fixes ...\n",[261,5374,5375,5377,5379,5381],{"class":263,"line":458},[261,5376,594],{"class":284},[261,5378,597],{"class":407},[261,5380,600],{"class":277},[261,5382,5383],{"class":407}," \"fix: critical security patch\"\n",[261,5385,5386,5388],{"class":263,"line":464},[261,5387,594],{"class":284},[261,5389,4709],{"class":407},[261,5391,5392],{"class":263,"line":473},[261,5393,295],{"emptyLinePlaceholder":32},[261,5395,5396],{"class":263,"line":489},[261,5397,5398],{"class":267},"# Back to feature\n",[261,5400,5401,5403,5405],{"class":263,"line":512},[261,5402,594],{"class":284},[261,5404,4361],{"class":407},[261,5406,4316],{"class":407},[261,5408,5409,5411,5413],{"class":263,"line":518},[261,5410,594],{"class":284},[261,5412,5190],{"class":407},[261,5414,5232],{"class":407},[261,5416,5417],{"class":263,"line":528},[261,5418,5419],{"class":267},"# Continue working\n",[220,5421,5423],{"id":5422},"interactive-rebase-clean-up-your-history","Interactive Rebase: Clean Up Your History",[252,5425,5427],{"className":580,"code":5426,"language":582,"meta":15,"style":15},"# Rebase last 3 commits\ngit rebase -i HEAD~3\n\n# This opens an editor with:\n# pick abc123 feat: add login form\n# pick def456 fix: typo\n# pick ghi789 feat: add validation\n",[258,5428,5429,5434,5446,5450,5455,5460,5465],{"__ignoreMap":15},[261,5430,5431],{"class":263,"line":264},[261,5432,5433],{"class":267},"# Rebase last 3 commits\n",[261,5435,5436,5438,5441,5444],{"class":263,"line":26},[261,5437,594],{"class":284},[261,5439,5440],{"class":407}," rebase",[261,5442,5443],{"class":277}," -i",[261,5445,4980],{"class":407},[261,5447,5448],{"class":263,"line":292},[261,5449,295],{"emptyLinePlaceholder":32},[261,5451,5452],{"class":263,"line":298},[261,5453,5454],{"class":267},"# This opens an editor with:\n",[261,5456,5457],{"class":263,"line":304},[261,5458,5459],{"class":267},"# pick abc123 feat: add login form\n",[261,5461,5462],{"class":263,"line":310},[261,5463,5464],{"class":267},"# pick def456 fix: typo\n",[261,5466,5467],{"class":263,"line":453},[261,5468,5469],{"class":267},"# pick ghi789 feat: add validation\n",[17,5471,5472],{},[227,5473,5474],{},"Available commands in interactive rebase:",[252,5476,5478],{"className":580,"code":5477,"language":582,"meta":15,"style":15},"# pick = use commit\n# reword = change commit message\n# edit = pause to amend commit\n# squash = combine with previous commit\n# fixup = like squash, but discard commit message\n# drop = remove commit\n",[258,5479,5480,5485,5490,5495,5500,5505],{"__ignoreMap":15},[261,5481,5482],{"class":263,"line":264},[261,5483,5484],{"class":267},"# pick = use commit\n",[261,5486,5487],{"class":263,"line":26},[261,5488,5489],{"class":267},"# reword = change commit message\n",[261,5491,5492],{"class":263,"line":292},[261,5493,5494],{"class":267},"# edit = pause to amend commit\n",[261,5496,5497],{"class":263,"line":298},[261,5498,5499],{"class":267},"# squash = combine with previous commit\n",[261,5501,5502],{"class":263,"line":304},[261,5503,5504],{"class":267},"# fixup = like squash, but discard commit message\n",[261,5506,5507],{"class":263,"line":310},[261,5508,5509],{"class":267},"# drop = remove commit\n",[17,5511,5512],{},[227,5513,5514],{},"Example: Cleaning up commits before a PR",[252,5516,5518],{"className":580,"code":5517,"language":582,"meta":15,"style":15},"pick abc123 feat: add login form\nfixup def456 fix: typo in login form\nfixup ghi789 fix: another small fix\nreword jkl012 feat: add validation\n\n# Results in 2 clean commits instead of 4 messy ones\n",[258,5519,5520,5538,5559,5577,5592,5596],{"__ignoreMap":15},[261,5521,5522,5525,5527,5530,5533,5535],{"class":263,"line":264},[261,5523,5524],{"class":284},"pick",[261,5526,5101],{"class":407},[261,5528,5529],{"class":407}," feat:",[261,5531,5532],{"class":407}," add",[261,5534,1407],{"class":407},[261,5536,5537],{"class":407}," form\n",[261,5539,5540,5543,5546,5549,5552,5555,5557],{"class":263,"line":26},[261,5541,5542],{"class":284},"fixup",[261,5544,5545],{"class":407}," def456",[261,5547,5548],{"class":407}," fix:",[261,5550,5551],{"class":407}," typo",[261,5553,5554],{"class":407}," in",[261,5556,1407],{"class":407},[261,5558,5537],{"class":407},[261,5560,5561,5563,5566,5568,5571,5574],{"class":263,"line":292},[261,5562,5542],{"class":284},[261,5564,5565],{"class":407}," ghi789",[261,5567,5548],{"class":407},[261,5569,5570],{"class":407}," another",[261,5572,5573],{"class":407}," small",[261,5575,5576],{"class":407}," fix\n",[261,5578,5579,5582,5585,5587,5589],{"class":263,"line":298},[261,5580,5581],{"class":284},"reword",[261,5583,5584],{"class":407}," jkl012",[261,5586,5529],{"class":407},[261,5588,5532],{"class":407},[261,5590,5591],{"class":407}," validation\n",[261,5593,5594],{"class":263,"line":304},[261,5595,295],{"emptyLinePlaceholder":32},[261,5597,5598],{"class":263,"line":310},[261,5599,5600],{"class":267},"# Results in 2 clean commits instead of 4 messy ones\n",[220,5602,5604],{"id":5603},"cherry-picking-commits","Cherry-Picking Commits",[252,5606,5608],{"className":580,"code":5607,"language":582,"meta":15,"style":15},"# Apply a specific commit from another branch\ngit cherry-pick abc123\n\n# Cherry-pick multiple commits\ngit cherry-pick abc123 def456\n\n# Cherry-pick without committing\ngit cherry-pick --no-commit abc123\n",[258,5609,5610,5615,5624,5628,5633,5643,5647,5652],{"__ignoreMap":15},[261,5611,5612],{"class":263,"line":264},[261,5613,5614],{"class":267},"# Apply a specific commit from another branch\n",[261,5616,5617,5619,5622],{"class":263,"line":26},[261,5618,594],{"class":284},[261,5620,5621],{"class":407}," cherry-pick",[261,5623,5083],{"class":407},[261,5625,5626],{"class":263,"line":292},[261,5627,295],{"emptyLinePlaceholder":32},[261,5629,5630],{"class":263,"line":298},[261,5631,5632],{"class":267},"# Cherry-pick multiple commits\n",[261,5634,5635,5637,5639,5641],{"class":263,"line":304},[261,5636,594],{"class":284},[261,5638,5621],{"class":407},[261,5640,5101],{"class":407},[261,5642,5104],{"class":407},[261,5644,5645],{"class":263,"line":310},[261,5646,295],{"emptyLinePlaceholder":32},[261,5648,5649],{"class":263,"line":453},[261,5650,5651],{"class":267},"# Cherry-pick without committing\n",[261,5653,5654,5656,5658,5660],{"class":263,"line":458},[261,5655,594],{"class":284},[261,5657,5621],{"class":407},[261,5659,5122],{"class":277},[261,5661,5083],{"class":407},[17,5663,5664],{},[227,5665,5666],{},"Use case:",[252,5668,5670],{"className":580,"code":5669,"language":582,"meta":15,"style":15},"# You made a hotfix on main that's also needed on develop\ngit switch develop\ngit cherry-pick \u003Chotfix-commit-hash>\n",[258,5671,5672,5677,5686],{"__ignoreMap":15},[261,5673,5674],{"class":263,"line":264},[261,5675,5676],{"class":267},"# You made a hotfix on main that's also needed on develop\n",[261,5678,5679,5681,5683],{"class":263,"line":26},[261,5680,594],{"class":284},[261,5682,4361],{"class":407},[261,5684,5685],{"class":407}," develop\n",[261,5687,5688,5690,5692,5695,5698,5701],{"class":263,"line":292},[261,5689,594],{"class":284},[261,5691,5621],{"class":407},[261,5693,5694],{"class":273}," \u003C",[261,5696,5697],{"class":407},"hotfix-commit-has",[261,5699,5700],{"class":288},"h",[261,5702,390],{"class":273},[206,5704,5706],{"id":5705},"level-6-investigating-history","Level 6: Investigating History",[220,5708,5710],{"id":5709},"git-log-more-than-you-think","Git Log: More Than You Think",[252,5712,5714],{"className":580,"code":5713,"language":582,"meta":15,"style":15},"# Basic log\ngit log\n\n# One line per commit\ngit log --oneline\n\n# Last 5 commits\ngit log -5\n\n# Show commits with diffs\ngit log -p\n\n# Graph view (amazing for branches)\ngit log --graph --oneline --all\n\n# Commits by specific author\ngit log --author=\"Your Name\"\n\n# Commits in date range\ngit log --since=\"2 weeks ago\"\n\n# Search commit messages\ngit log --grep=\"login\"\n\n# See what changed in a file\ngit log -p path/to/file.ts\n",[258,5715,5716,5721,5728,5732,5737,5746,5750,5755,5764,5768,5773,5782,5786,5791,5806,5810,5815,5827,5831,5836,5848,5852,5857,5869,5873,5878],{"__ignoreMap":15},[261,5717,5718],{"class":263,"line":264},[261,5719,5720],{"class":267},"# Basic log\n",[261,5722,5723,5725],{"class":263,"line":26},[261,5724,594],{"class":284},[261,5726,5727],{"class":407}," log\n",[261,5729,5730],{"class":263,"line":292},[261,5731,295],{"emptyLinePlaceholder":32},[261,5733,5734],{"class":263,"line":298},[261,5735,5736],{"class":267},"# One line per commit\n",[261,5738,5739,5741,5743],{"class":263,"line":304},[261,5740,594],{"class":284},[261,5742,4618],{"class":407},[261,5744,5745],{"class":277}," --oneline\n",[261,5747,5748],{"class":263,"line":310},[261,5749,295],{"emptyLinePlaceholder":32},[261,5751,5752],{"class":263,"line":453},[261,5753,5754],{"class":267},"# Last 5 commits\n",[261,5756,5757,5759,5761],{"class":263,"line":458},[261,5758,594],{"class":284},[261,5760,4618],{"class":407},[261,5762,5763],{"class":277}," -5\n",[261,5765,5766],{"class":263,"line":464},[261,5767,295],{"emptyLinePlaceholder":32},[261,5769,5770],{"class":263,"line":473},[261,5771,5772],{"class":267},"# Show commits with diffs\n",[261,5774,5775,5777,5779],{"class":263,"line":489},[261,5776,594],{"class":284},[261,5778,4618],{"class":407},[261,5780,5781],{"class":277}," -p\n",[261,5783,5784],{"class":263,"line":512},[261,5785,295],{"emptyLinePlaceholder":32},[261,5787,5788],{"class":263,"line":518},[261,5789,5790],{"class":267},"# Graph view (amazing for branches)\n",[261,5792,5793,5795,5797,5800,5803],{"class":263,"line":528},[261,5794,594],{"class":284},[261,5796,4618],{"class":407},[261,5798,5799],{"class":277}," --graph",[261,5801,5802],{"class":277}," --oneline",[261,5804,5805],{"class":277}," --all\n",[261,5807,5808],{"class":263,"line":537},[261,5809,295],{"emptyLinePlaceholder":32},[261,5811,5812],{"class":263,"line":1249},[261,5813,5814],{"class":267},"# Commits by specific author\n",[261,5816,5817,5819,5821,5824],{"class":263,"line":1254},[261,5818,594],{"class":284},[261,5820,4618],{"class":407},[261,5822,5823],{"class":277}," --author=",[261,5825,5826],{"class":407},"\"Your Name\"\n",[261,5828,5829],{"class":263,"line":1259},[261,5830,295],{"emptyLinePlaceholder":32},[261,5832,5833],{"class":263,"line":1264},[261,5834,5835],{"class":267},"# Commits in date range\n",[261,5837,5838,5840,5842,5845],{"class":263,"line":1270},[261,5839,594],{"class":284},[261,5841,4618],{"class":407},[261,5843,5844],{"class":277}," --since=",[261,5846,5847],{"class":407},"\"2 weeks ago\"\n",[261,5849,5850],{"class":263,"line":1276},[261,5851,295],{"emptyLinePlaceholder":32},[261,5853,5854],{"class":263,"line":1281},[261,5855,5856],{"class":267},"# Search commit messages\n",[261,5858,5859,5861,5863,5866],{"class":263,"line":1287},[261,5860,594],{"class":284},[261,5862,4618],{"class":407},[261,5864,5865],{"class":277}," --grep=",[261,5867,5868],{"class":407},"\"login\"\n",[261,5870,5871],{"class":263,"line":1292},[261,5872,295],{"emptyLinePlaceholder":32},[261,5874,5875],{"class":263,"line":1298},[261,5876,5877],{"class":267},"# See what changed in a file\n",[261,5879,5880,5882,5884,5887],{"class":263,"line":1304},[261,5881,594],{"class":284},[261,5883,4618],{"class":407},[261,5885,5886],{"class":277}," -p",[261,5888,4273],{"class":407},[17,5890,5891],{},[227,5892,5893],{},"My favorite alias:",[252,5895,5897],{"className":580,"code":5896,"language":582,"meta":15,"style":15},"# Add to ~/.gitconfig\n[alias]\n    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\u003C%an>%Creset' --abbrev-commit\n\n# Then use: git lg\n",[258,5898,5899,5904,5909,5929,5933],{"__ignoreMap":15},[261,5900,5901],{"class":263,"line":264},[261,5902,5903],{"class":267},"# Add to ~/.gitconfig\n",[261,5905,5906],{"class":263,"line":26},[261,5907,5908],{"class":288},"[alias]\n",[261,5910,5911,5914,5916,5918,5920,5923,5926],{"class":263,"line":292},[261,5912,5913],{"class":284},"    lg",[261,5915,281],{"class":407},[261,5917,4618],{"class":407},[261,5919,5799],{"class":277},[261,5921,5922],{"class":277}," --pretty=format:",[261,5924,5925],{"class":407},"'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\u003C%an>%Creset'",[261,5927,5928],{"class":277}," --abbrev-commit\n",[261,5930,5931],{"class":263,"line":298},[261,5932,295],{"emptyLinePlaceholder":32},[261,5934,5935],{"class":263,"line":304},[261,5936,5937],{"class":267},"# Then use: git lg\n",[220,5939,5941],{"id":5940},"git-blame-find-who-changed-what","Git Blame: Find Who Changed What",[252,5943,5945],{"className":580,"code":5944,"language":582,"meta":15,"style":15},"# See who modified each line\ngit blame file.ts\n\n# Blame for specific lines\ngit blame -L 10,20 file.ts\n\n# Ignore whitespace changes\ngit blame -w file.ts\n",[258,5946,5947,5952,5961,5965,5970,5984,5988,5993],{"__ignoreMap":15},[261,5948,5949],{"class":263,"line":264},[261,5950,5951],{"class":267},"# See who modified each line\n",[261,5953,5954,5956,5959],{"class":263,"line":26},[261,5955,594],{"class":284},[261,5957,5958],{"class":407}," blame",[261,5960,4798],{"class":407},[261,5962,5963],{"class":263,"line":292},[261,5964,295],{"emptyLinePlaceholder":32},[261,5966,5967],{"class":263,"line":298},[261,5968,5969],{"class":267},"# Blame for specific lines\n",[261,5971,5972,5974,5976,5979,5982],{"class":263,"line":304},[261,5973,594],{"class":284},[261,5975,5958],{"class":407},[261,5977,5978],{"class":277}," -L",[261,5980,5981],{"class":407}," 10,20",[261,5983,4798],{"class":407},[261,5985,5986],{"class":263,"line":310},[261,5987,295],{"emptyLinePlaceholder":32},[261,5989,5990],{"class":263,"line":453},[261,5991,5992],{"class":267},"# Ignore whitespace changes\n",[261,5994,5995,5997,5999,6002],{"class":263,"line":458},[261,5996,594],{"class":284},[261,5998,5958],{"class":407},[261,6000,6001],{"class":277}," -w",[261,6003,4798],{"class":407},[220,6005,6007],{"id":6006},"git-show-inspect-commits","Git Show: Inspect Commits",[252,6009,6011],{"className":580,"code":6010,"language":582,"meta":15,"style":15},"# Show commit details\ngit show abc123\n\n# Show changes in a commit\ngit show abc123 --stat\n\n# Show specific file from a commit\ngit show abc123:path/to/file.ts\n",[258,6012,6013,6018,6027,6031,6036,6047,6051,6056],{"__ignoreMap":15},[261,6014,6015],{"class":263,"line":264},[261,6016,6017],{"class":267},"# Show commit details\n",[261,6019,6020,6022,6025],{"class":263,"line":26},[261,6021,594],{"class":284},[261,6023,6024],{"class":407}," show",[261,6026,5083],{"class":407},[261,6028,6029],{"class":263,"line":292},[261,6030,295],{"emptyLinePlaceholder":32},[261,6032,6033],{"class":263,"line":298},[261,6034,6035],{"class":267},"# Show changes in a commit\n",[261,6037,6038,6040,6042,6044],{"class":263,"line":304},[261,6039,594],{"class":284},[261,6041,6024],{"class":407},[261,6043,5101],{"class":407},[261,6045,6046],{"class":277}," --stat\n",[261,6048,6049],{"class":263,"line":310},[261,6050,295],{"emptyLinePlaceholder":32},[261,6052,6053],{"class":263,"line":453},[261,6054,6055],{"class":267},"# Show specific file from a commit\n",[261,6057,6058,6060,6062],{"class":263,"line":458},[261,6059,594],{"class":284},[261,6061,6024],{"class":407},[261,6063,6064],{"class":407}," abc123:path/to/file.ts\n",[206,6066,6068],{"id":6067},"my-essential-git-aliases","My Essential Git Aliases",[17,6070,6071,6072,1861],{},"Add these to ",[258,6073,6074],{},"~/.gitconfig",[252,6076,6078],{"className":580,"code":6077,"language":582,"meta":15,"style":15},"[alias]\n    # Short status\n    s = status -s\n    \n    # Add all and commit\n    ac = !git add -A && git commit\n    \n    # Commit with message\n    cm = commit -m\n    \n    # Amend last commit\n    amend = commit --amend --no-edit\n    \n    # Pretty log\n    lg = log --graph --oneline --decorate --all\n    \n    # Undo last commit\n    undo = reset HEAD~1 --mixed\n    \n    # List branches sorted by last modified\n    br = branch --sort=-committerdate\n    \n    # Show current branch\n    current = branch --show-current\n",[258,6079,6080,6084,6089,6102,6106,6111,6134,6138,6143,6155,6159,6164,6179,6183,6188,6205,6209,6214,6229,6233,6238,6250,6254,6259],{"__ignoreMap":15},[261,6081,6082],{"class":263,"line":264},[261,6083,5908],{"class":288},[261,6085,6086],{"class":263,"line":26},[261,6087,6088],{"class":267},"    # Short status\n",[261,6090,6091,6094,6096,6099],{"class":263,"line":292},[261,6092,6093],{"class":284},"    s",[261,6095,281],{"class":407},[261,6097,6098],{"class":407}," status",[261,6100,6101],{"class":277}," -s\n",[261,6103,6104],{"class":263,"line":298},[261,6105,1456],{"class":288},[261,6107,6108],{"class":263,"line":304},[261,6109,6110],{"class":267},"    # Add all and commit\n",[261,6112,6113,6116,6118,6121,6123,6126,6129,6131],{"class":263,"line":310},[261,6114,6115],{"class":284},"    ac",[261,6117,281],{"class":407},[261,6119,6120],{"class":407}," !git",[261,6122,5532],{"class":407},[261,6124,6125],{"class":277}," -A",[261,6127,6128],{"class":288}," && ",[261,6130,594],{"class":284},[261,6132,6133],{"class":407}," commit\n",[261,6135,6136],{"class":263,"line":453},[261,6137,1456],{"class":288},[261,6139,6140],{"class":263,"line":458},[261,6141,6142],{"class":267},"    # Commit with message\n",[261,6144,6145,6148,6150,6152],{"class":263,"line":464},[261,6146,6147],{"class":284},"    cm",[261,6149,281],{"class":407},[261,6151,597],{"class":407},[261,6153,6154],{"class":277}," -m\n",[261,6156,6157],{"class":263,"line":473},[261,6158,1456],{"class":288},[261,6160,6161],{"class":263,"line":489},[261,6162,6163],{"class":267},"    # Amend last commit\n",[261,6165,6166,6169,6171,6173,6176],{"class":263,"line":512},[261,6167,6168],{"class":284},"    amend",[261,6170,281],{"class":407},[261,6172,597],{"class":407},[261,6174,6175],{"class":277}," --amend",[261,6177,6178],{"class":277}," --no-edit\n",[261,6180,6181],{"class":263,"line":518},[261,6182,1456],{"class":288},[261,6184,6185],{"class":263,"line":528},[261,6186,6187],{"class":267},"    # Pretty log\n",[261,6189,6190,6192,6194,6196,6198,6200,6203],{"class":263,"line":537},[261,6191,5913],{"class":284},[261,6193,281],{"class":407},[261,6195,4618],{"class":407},[261,6197,5799],{"class":277},[261,6199,5802],{"class":277},[261,6201,6202],{"class":277}," --decorate",[261,6204,5805],{"class":277},[261,6206,6207],{"class":263,"line":1249},[261,6208,1456],{"class":288},[261,6210,6211],{"class":263,"line":1254},[261,6212,6213],{"class":267},"    # Undo last commit\n",[261,6215,6216,6219,6221,6223,6226],{"class":263,"line":1259},[261,6217,6218],{"class":284},"    undo",[261,6220,281],{"class":407},[261,6222,4833],{"class":407},[261,6224,6225],{"class":407}," HEAD~1",[261,6227,6228],{"class":277}," --mixed\n",[261,6230,6231],{"class":263,"line":1264},[261,6232,1456],{"class":288},[261,6234,6235],{"class":263,"line":1270},[261,6236,6237],{"class":267},"    # List branches sorted by last modified\n",[261,6239,6240,6243,6245,6247],{"class":263,"line":1276},[261,6241,6242],{"class":284},"    br",[261,6244,281],{"class":407},[261,6246,4313],{"class":407},[261,6248,6249],{"class":277}," --sort=-committerdate\n",[261,6251,6252],{"class":263,"line":1281},[261,6253,1456],{"class":288},[261,6255,6256],{"class":263,"line":1287},[261,6257,6258],{"class":267},"    # Show current branch\n",[261,6260,6261,6264,6266,6268],{"class":263,"line":1292},[261,6262,6263],{"class":284},"    current",[261,6265,281],{"class":407},[261,6267,4313],{"class":407},[261,6269,6270],{"class":277}," --show-current\n",[206,6272,6274],{"id":6273},"the-commands-that-saved-my-project","The Commands That Saved My Project",[17,6276,6277],{},[227,6278,6279],{},"Scenario 1: Accidentally committed sensitive data",[252,6281,6283],{"className":580,"code":6282,"language":582,"meta":15,"style":15},"# Remove file from last commit\ngit rm --cached .env\ngit commit --amend --no-edit\n\n# If already pushed (⚠️ rewrites history)\ngit push --force-with-lease\n",[258,6284,6285,6290,6303,6313,6317,6322],{"__ignoreMap":15},[261,6286,6287],{"class":263,"line":264},[261,6288,6289],{"class":267},"# Remove file from last commit\n",[261,6291,6292,6294,6297,6300],{"class":263,"line":26},[261,6293,594],{"class":284},[261,6295,6296],{"class":407}," rm",[261,6298,6299],{"class":277}," --cached",[261,6301,6302],{"class":407}," .env\n",[261,6304,6305,6307,6309,6311],{"class":263,"line":292},[261,6306,594],{"class":284},[261,6308,597],{"class":407},[261,6310,6175],{"class":277},[261,6312,6178],{"class":277},[261,6314,6315],{"class":263,"line":298},[261,6316,295],{"emptyLinePlaceholder":32},[261,6318,6319],{"class":263,"line":304},[261,6320,6321],{"class":267},"# If already pushed (⚠️ rewrites history)\n",[261,6323,6324,6326,6328],{"class":263,"line":310},[261,6325,594],{"class":284},[261,6327,4481],{"class":407},[261,6329,4749],{"class":277},[17,6331,6332],{},[227,6333,6334],{},"Scenario 2: Need to find when a bug was introduced",[252,6336,6338],{"className":580,"code":6337,"language":582,"meta":15,"style":15},"# Binary search through commits\ngit bisect start\ngit bisect bad                 # Current commit is bad\ngit bisect good abc123         # This commit was good\n# Git checks out middle commit, test it\ngit bisect bad                 # or git bisect good\n# Repeat until found\ngit bisect reset\n",[258,6339,6340,6345,6355,6367,6381,6386,6397,6402],{"__ignoreMap":15},[261,6341,6342],{"class":263,"line":264},[261,6343,6344],{"class":267},"# Binary search through commits\n",[261,6346,6347,6349,6352],{"class":263,"line":26},[261,6348,594],{"class":284},[261,6350,6351],{"class":407}," bisect",[261,6353,6354],{"class":407}," start\n",[261,6356,6357,6359,6361,6364],{"class":263,"line":292},[261,6358,594],{"class":284},[261,6360,6351],{"class":407},[261,6362,6363],{"class":407}," bad",[261,6365,6366],{"class":267},"                 # Current commit is bad\n",[261,6368,6369,6371,6373,6376,6378],{"class":263,"line":298},[261,6370,594],{"class":284},[261,6372,6351],{"class":407},[261,6374,6375],{"class":407}," good",[261,6377,5101],{"class":407},[261,6379,6380],{"class":267},"         # This commit was good\n",[261,6382,6383],{"class":263,"line":304},[261,6384,6385],{"class":267},"# Git checks out middle commit, test it\n",[261,6387,6388,6390,6392,6394],{"class":263,"line":310},[261,6389,594],{"class":284},[261,6391,6351],{"class":407},[261,6393,6363],{"class":407},[261,6395,6396],{"class":267},"                 # or git bisect good\n",[261,6398,6399],{"class":263,"line":453},[261,6400,6401],{"class":267},"# Repeat until found\n",[261,6403,6404,6406,6408],{"class":263,"line":458},[261,6405,594],{"class":284},[261,6407,6351],{"class":407},[261,6409,6410],{"class":407}," reset\n",[17,6412,6413],{},[227,6414,6415],{},"Scenario 3: Lost commit after hard reset",[252,6417,6419],{"className":580,"code":6418,"language":582,"meta":15,"style":15},"# View all reference changes\ngit reflog\n\n# Find your lost commit\ngit reflog show HEAD\n\n# Restore it\ngit cherry-pick abc123\n",[258,6420,6421,6426,6433,6437,6442,6454,6458,6463],{"__ignoreMap":15},[261,6422,6423],{"class":263,"line":264},[261,6424,6425],{"class":267},"# View all reference changes\n",[261,6427,6428,6430],{"class":263,"line":26},[261,6429,594],{"class":284},[261,6431,6432],{"class":407}," reflog\n",[261,6434,6435],{"class":263,"line":292},[261,6436,295],{"emptyLinePlaceholder":32},[261,6438,6439],{"class":263,"line":298},[261,6440,6441],{"class":267},"# Find your lost commit\n",[261,6443,6444,6446,6449,6451],{"class":263,"line":304},[261,6445,594],{"class":284},[261,6447,6448],{"class":407}," reflog",[261,6450,6024],{"class":407},[261,6452,6453],{"class":407}," HEAD\n",[261,6455,6456],{"class":263,"line":310},[261,6457,295],{"emptyLinePlaceholder":32},[261,6459,6460],{"class":263,"line":453},[261,6461,6462],{"class":267},"# Restore it\n",[261,6464,6465,6467,6469],{"class":263,"line":458},[261,6466,594],{"class":284},[261,6468,5621],{"class":407},[261,6470,5083],{"class":407},[206,6472,6474],{"id":6473},"best-practices-i-live-by","Best Practices I Live By",[354,6476,6477,6483,6493,6499,6505,6511],{},[242,6478,6479,6482],{},[227,6480,6481],{},"Commit often, push daily"," - Small commits are easier to review and revert",[242,6484,6485,6488,6489,6492],{},[227,6486,6487],{},"Never force push to shared branches"," - Use ",[258,6490,6491],{},"--force-with-lease"," if you must",[242,6494,6495,6498],{},[227,6496,6497],{},"Write meaningful commit messages"," - Your future self will thank you",[242,6500,6501,6504],{},[227,6502,6503],{},"Keep main/develop protected"," - Always use feature branches",[242,6506,6507,6510],{},[227,6508,6509],{},"Pull before you push"," - Avoid conflicts",[242,6512,6513,6488,6516],{},[227,6514,6515],{},"Review before you commit",[258,6517,6518],{},"git diff --staged",[206,6520,994],{"id":993},[17,6522,6523],{},"Git is more than just version control—it's a time machine, a collaboration tool, and a safety net. Master these commands, and you'll spend less time fighting Git and more time building amazing things.",[17,6525,6526],{},[227,6527,6528],{},"Start with the basics, practice regularly, and gradually add more commands to your toolkit.",[17,6530,6531],{},"The difference between a junior and senior developer isn't knowing every Git command—it's knowing which command to use when, and having the confidence to use it.",[17,6533,6534],{},"Happy coding! 🚀",[220,6536,6538],{"id":6537},"quick-reference-card","Quick Reference Card",[252,6540,6542],{"className":580,"code":6541,"language":582,"meta":15,"style":15},"# Daily workflow\ngit status                     # Check status\ngit add .                      # Stage all changes\ngit commit -m \"message\"        # Commit\ngit push                       # Push to remote\n\n# Branching\ngit switch -c feature-name     # Create new branch\ngit switch main                # Switch branch\ngit branch -d feature-name     # Delete branch\n\n# Syncing\ngit pull                       # Update current branch\ngit fetch                      # Download updates\n\n# Fixing mistakes\ngit restore file.ts            # Discard changes\ngit reset HEAD~1               # Undo last commit\ngit stash                      # Save work for later\n\n# History\ngit log --oneline              # View commits\ngit diff                       # See changes\n",[258,6543,6544,6549,6558,6570,6584,6593,6597,6602,6616,6628,6641,6645,6650,6659,6668,6672,6677,6689,6700,6709,6713,6718,6729],{"__ignoreMap":15},[261,6545,6546],{"class":263,"line":264},[261,6547,6548],{"class":267},"# Daily workflow\n",[261,6550,6551,6553,6555],{"class":263,"line":26},[261,6552,594],{"class":284},[261,6554,6098],{"class":407},[261,6556,6557],{"class":267},"                     # Check status\n",[261,6559,6560,6562,6564,6567],{"class":263,"line":292},[261,6561,594],{"class":284},[261,6563,5532],{"class":407},[261,6565,6566],{"class":407}," .",[261,6568,6569],{"class":267},"                      # Stage all changes\n",[261,6571,6572,6574,6576,6578,6581],{"class":263,"line":298},[261,6573,594],{"class":284},[261,6575,597],{"class":407},[261,6577,600],{"class":277},[261,6579,6580],{"class":407}," \"message\"",[261,6582,6583],{"class":267},"        # Commit\n",[261,6585,6586,6588,6590],{"class":263,"line":304},[261,6587,594],{"class":284},[261,6589,4481],{"class":407},[261,6591,6592],{"class":267},"                       # Push to remote\n",[261,6594,6595],{"class":263,"line":310},[261,6596,295],{"emptyLinePlaceholder":32},[261,6598,6599],{"class":263,"line":453},[261,6600,6601],{"class":267},"# Branching\n",[261,6603,6604,6606,6608,6610,6613],{"class":263,"line":458},[261,6605,594],{"class":284},[261,6607,4361],{"class":407},[261,6609,4364],{"class":277},[261,6611,6612],{"class":407}," feature-name",[261,6614,6615],{"class":267},"     # Create new branch\n",[261,6617,6618,6620,6622,6625],{"class":263,"line":464},[261,6619,594],{"class":284},[261,6621,4361],{"class":407},[261,6623,6624],{"class":407}," main",[261,6626,6627],{"class":267},"                # Switch branch\n",[261,6629,6630,6632,6634,6636,6638],{"class":263,"line":473},[261,6631,594],{"class":284},[261,6633,4313],{"class":407},[261,6635,4443],{"class":277},[261,6637,6612],{"class":407},[261,6639,6640],{"class":267},"     # Delete branch\n",[261,6642,6643],{"class":263,"line":489},[261,6644,295],{"emptyLinePlaceholder":32},[261,6646,6647],{"class":263,"line":512},[261,6648,6649],{"class":267},"# Syncing\n",[261,6651,6652,6654,6656],{"class":263,"line":518},[261,6653,594],{"class":284},[261,6655,4637],{"class":407},[261,6657,6658],{"class":267},"                       # Update current branch\n",[261,6660,6661,6663,6665],{"class":263,"line":528},[261,6662,594],{"class":284},[261,6664,919],{"class":407},[261,6666,6667],{"class":267},"                      # Download updates\n",[261,6669,6670],{"class":263,"line":537},[261,6671,295],{"emptyLinePlaceholder":32},[261,6673,6674],{"class":263,"line":1249},[261,6675,6676],{"class":267},"# Fixing mistakes\n",[261,6678,6679,6681,6683,6686],{"class":263,"line":1254},[261,6680,594],{"class":284},[261,6682,4792],{"class":407},[261,6684,6685],{"class":407}," file.ts",[261,6687,6688],{"class":267},"            # Discard changes\n",[261,6690,6691,6693,6695,6697],{"class":263,"line":1259},[261,6692,594],{"class":284},[261,6694,4833],{"class":407},[261,6696,6225],{"class":407},[261,6698,6699],{"class":267},"               # Undo last commit\n",[261,6701,6702,6704,6706],{"class":263,"line":1264},[261,6703,594],{"class":284},[261,6705,5190],{"class":407},[261,6707,6708],{"class":267},"                      # Save work for later\n",[261,6710,6711],{"class":263,"line":1270},[261,6712,295],{"emptyLinePlaceholder":32},[261,6714,6715],{"class":263,"line":1276},[261,6716,6717],{"class":267},"# History\n",[261,6719,6720,6722,6724,6726],{"class":263,"line":1281},[261,6721,594],{"class":284},[261,6723,4618],{"class":407},[261,6725,5802],{"class":277},[261,6727,6728],{"class":267},"              # View commits\n",[261,6730,6731,6733,6735],{"class":263,"line":1287},[261,6732,594],{"class":284},[261,6734,4234],{"class":407},[261,6736,6737],{"class":267},"                       # See changes\n",[1017,6739,6740],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}",{"title":15,"searchDepth":26,"depth":26,"links":6742},[6743,6744,6748,6752,6756,6762,6767,6772,6773,6774,6775],{"id":208,"depth":26,"text":209},{"id":4013,"depth":26,"text":4014,"children":6745},[6746,6747],{"id":4017,"depth":292,"text":4018},{"id":4179,"depth":292,"text":4180},{"id":4286,"depth":26,"text":4287,"children":6749},[6750,6751],{"id":4290,"depth":292,"text":4291},{"id":4387,"depth":292,"text":4388},{"id":4578,"depth":26,"text":4579,"children":6753},[6754,6755],{"id":4582,"depth":292,"text":4583},{"id":4691,"depth":292,"text":4692},{"id":4770,"depth":26,"text":4771,"children":6757},[6758,6759,6760,6761],{"id":4774,"depth":292,"text":4775},{"id":4841,"depth":292,"text":4842},{"id":4900,"depth":292,"text":4901},{"id":5062,"depth":292,"text":5063},{"id":5146,"depth":26,"text":5147,"children":6763},[6764,6765,6766],{"id":5150,"depth":292,"text":5151},{"id":5422,"depth":292,"text":5423},{"id":5603,"depth":292,"text":5604},{"id":5705,"depth":26,"text":5706,"children":6768},[6769,6770,6771],{"id":5709,"depth":292,"text":5710},{"id":5940,"depth":292,"text":5941},{"id":6006,"depth":292,"text":6007},{"id":6067,"depth":26,"text":6068},{"id":6273,"depth":26,"text":6274},{"id":6473,"depth":26,"text":6474},{"id":993,"depth":26,"text":994,"children":6776},[6777],{"id":6537,"depth":292,"text":6538},"23/09/2025","Wychodzę poza podstawowe git add i git commit. Oto istotne komendy Git i workflowy, które sprawią, że będziesz bardziej pewny i efektywny developer.","/articles/simplicity-is-the-ultimate-sophistication.jpg",{},"/pl/articles/git-commands-every-junior-developer-should-master","9",{"title":3986,"description":6779},{"loc":6782},"pl/articles/git-commands-every-junior-developer-should-master",[6788,6789,6790,6791],"Git","Version Control","Workflow","Best Practices","1X7HgiH4bN9PeFnobYpSSy37MGxUAP8eBEXCkj_DfdY",{"id":6794,"title":6795,"body":6796,"date":3971,"description":10036,"extension":30,"head":28,"image":6813,"meta":10037,"navigation":32,"ogImage":28,"path":10038,"readingTime":10039,"robots":28,"schemaOrg":28,"seo":10040,"sitemap":10041,"stem":10042,"tags":10043,"__hash__":10047},"articles_pl/pl/articles/organize-dev-environment-for-productivity.md","Jak organizuję swoje środowisko programistyczne dla maksymalnej produktywności",{"type":7,"value":6797,"toc":9983},[6798,6800,6803,6806,6809,6814,6818,6822,6825,7043,7047,7335,7339,7474,7478,7482,7488,7493,7507,7511,7517,7521,7525,7973,7977,8220,8224,8227,8232,8282,8286,8293,8328,8333,8353,8357,8361,8367,8371,8377,8381,8513,8517,8521,8634,8638,8716,8719,8740,8744,8748,8986,8990,9117,9121,9125,9164,9168,9171,9191,9297,9301,9305,9388,9441,9445,9599,9603,9607,9691,9695,9724,9728,9732,9831,9835,9904,9908,9911,9943,9945,9948,9951,9956,9960,9977,9980],[206,6799,209],{"id":208},[17,6801,6802],{},"Przez lata nauczyłem się, że moje otoczenie ma ogromny wpływ na moją produktywność. Nieuporządkowany desktop, brakujące narzędzia i słaba organizacja to przepis na roztargnienię i spowolnienie.",[17,6804,6805],{},"My first development environment was a mess. 50+ browser tabs open, files scattered across my desktop, no consistent naming conventions, and a terminal setup that fought me at every step. After months of frustration, I finally took the time to optimize my workspace.",[17,6807,6808],{},"The result? I'm coding faster, making fewer mistakes, and actually enjoying the development process more. Here's exactly how I set up my environment, and why it works.",[17,6810,6811],{},[1060,6812],{"alt":1062,"src":6813},"/articles/dev-environment.jpg",[206,6815,6817],{"id":6816},"the-foundation-vs-code-configuration","The Foundation: VS Code Configuration",[220,6819,6821],{"id":6820},"essential-extensions","Essential Extensions",[17,6823,6824],{},"After trying dozens of extensions, these are the ones I actually use every day:",[252,6826,6829],{"className":6827,"code":6828,"language":40,"meta":15,"style":15},"language-json shiki shiki-themes github-light github-dark github-dark","// My essential VS Code extensions\n{\n  \"recommendations\": [\n    // Vue/Nuxt development\n    \"Vue.volar\",                    // Vue language support\n    \"Vue.vscode-typescript-vue-plugin\",\n    \n    // Code quality\n    \"dbaeumer.vscode-eslint\",       // Linting\n    \"esbenp.prettier-vscode\",       // Formatting\n    \"streetsidesoftware.code-spell-checker\",\n    \n    // Productivity\n    \"usernamehw.errorlens\",         // Inline errors\n    \"eamodio.gitlens\",             // Git superpowers\n    \"christian-kohler.path-intellisense\",\n    \"formulahendry.auto-rename-tag\",\n    \n    // UI/UX\n    \"PKief.material-icon-theme\",    // File icons\n    \"GitHub.github-vscode-theme\",   // Theme\n    \"oderwat.indent-rainbow\",       // Indent visualization\n    \n    // Utilities\n    \"wayou.vscode-todo-highlight\",  // Highlight TODOs\n    \"naumovs.color-highlight\",      // Color preview\n    \"ms-vscode.live-server\"         // Live preview\n  ]\n}\n",[258,6830,6831,6836,6841,6849,6854,6865,6872,6876,6881,6892,6902,6909,6913,6918,6929,6940,6947,6954,6958,6963,6974,6985,6995,6999,7004,7015,7026,7034,7039],{"__ignoreMap":15},[261,6832,6833],{"class":263,"line":264},[261,6834,6835],{"class":267},"// My essential VS Code extensions\n",[261,6837,6838],{"class":263,"line":26},[261,6839,6840],{"class":288},"{\n",[261,6842,6843,6846],{"class":263,"line":292},[261,6844,6845],{"class":277},"  \"recommendations\"",[261,6847,6848],{"class":288},": [\n",[261,6850,6851],{"class":263,"line":298},[261,6852,6853],{"class":267},"    // Vue/Nuxt development\n",[261,6855,6856,6859,6862],{"class":263,"line":304},[261,6857,6858],{"class":407},"    \"Vue.volar\"",[261,6860,6861],{"class":288},",                    ",[261,6863,6864],{"class":267},"// Vue language support\n",[261,6866,6867,6870],{"class":263,"line":310},[261,6868,6869],{"class":407},"    \"Vue.vscode-typescript-vue-plugin\"",[261,6871,1489],{"class":288},[261,6873,6874],{"class":263,"line":453},[261,6875,1456],{"class":288},[261,6877,6878],{"class":263,"line":458},[261,6879,6880],{"class":267},"    // Code quality\n",[261,6882,6883,6886,6889],{"class":263,"line":464},[261,6884,6885],{"class":407},"    \"dbaeumer.vscode-eslint\"",[261,6887,6888],{"class":288},",       ",[261,6890,6891],{"class":267},"// Linting\n",[261,6893,6894,6897,6899],{"class":263,"line":473},[261,6895,6896],{"class":407},"    \"esbenp.prettier-vscode\"",[261,6898,6888],{"class":288},[261,6900,6901],{"class":267},"// Formatting\n",[261,6903,6904,6907],{"class":263,"line":489},[261,6905,6906],{"class":407},"    \"streetsidesoftware.code-spell-checker\"",[261,6908,1489],{"class":288},[261,6910,6911],{"class":263,"line":512},[261,6912,1456],{"class":288},[261,6914,6915],{"class":263,"line":518},[261,6916,6917],{"class":267},"    // Productivity\n",[261,6919,6920,6923,6926],{"class":263,"line":528},[261,6921,6922],{"class":407},"    \"usernamehw.errorlens\"",[261,6924,6925],{"class":288},",         ",[261,6927,6928],{"class":267},"// Inline errors\n",[261,6930,6931,6934,6937],{"class":263,"line":537},[261,6932,6933],{"class":407},"    \"eamodio.gitlens\"",[261,6935,6936],{"class":288},",             ",[261,6938,6939],{"class":267},"// Git superpowers\n",[261,6941,6942,6945],{"class":263,"line":1249},[261,6943,6944],{"class":407},"    \"christian-kohler.path-intellisense\"",[261,6946,1489],{"class":288},[261,6948,6949,6952],{"class":263,"line":1254},[261,6950,6951],{"class":407},"    \"formulahendry.auto-rename-tag\"",[261,6953,1489],{"class":288},[261,6955,6956],{"class":263,"line":1259},[261,6957,1456],{"class":288},[261,6959,6960],{"class":263,"line":1264},[261,6961,6962],{"class":267},"    // UI/UX\n",[261,6964,6965,6968,6971],{"class":263,"line":1270},[261,6966,6967],{"class":407},"    \"PKief.material-icon-theme\"",[261,6969,6970],{"class":288},",    ",[261,6972,6973],{"class":267},"// File icons\n",[261,6975,6976,6979,6982],{"class":263,"line":1276},[261,6977,6978],{"class":407},"    \"GitHub.github-vscode-theme\"",[261,6980,6981],{"class":288},",   ",[261,6983,6984],{"class":267},"// Theme\n",[261,6986,6987,6990,6992],{"class":263,"line":1281},[261,6988,6989],{"class":407},"    \"oderwat.indent-rainbow\"",[261,6991,6888],{"class":288},[261,6993,6994],{"class":267},"// Indent visualization\n",[261,6996,6997],{"class":263,"line":1287},[261,6998,1456],{"class":288},[261,7000,7001],{"class":263,"line":1292},[261,7002,7003],{"class":267},"    // Utilities\n",[261,7005,7006,7009,7012],{"class":263,"line":1298},[261,7007,7008],{"class":407},"    \"wayou.vscode-todo-highlight\"",[261,7010,7011],{"class":288},",  ",[261,7013,7014],{"class":267},"// Highlight TODOs\n",[261,7016,7017,7020,7023],{"class":263,"line":1304},[261,7018,7019],{"class":407},"    \"naumovs.color-highlight\"",[261,7021,7022],{"class":288},",      ",[261,7024,7025],{"class":267},"// Color preview\n",[261,7027,7028,7031],{"class":263,"line":1310},[261,7029,7030],{"class":407},"    \"ms-vscode.live-server\"",[261,7032,7033],{"class":267},"         // Live preview\n",[261,7035,7036],{"class":263,"line":1316},[261,7037,7038],{"class":288},"  ]\n",[261,7040,7041],{"class":263,"line":1322},[261,7042,874],{"class":288},[220,7044,7046],{"id":7045},"settings-that-make-a-difference","Settings That Make a Difference",[252,7048,7050],{"className":6827,"code":7049,"language":40,"meta":15,"style":15},"// settings.json\n{\n  // Editor behavior\n  \"editor.formatOnSave\": true,\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": true\n  },\n  \"editor.tabSize\": 2,\n  \"editor.linkedEditing\": true,\n  \"editor.bracketPairColorization.enabled\": true,\n  \"editor.guides.bracketPairs\": true,\n  \n  // File handling\n  \"files.autoSave\": \"onFocusChange\",\n  \"files.trimTrailingWhitespace\": true,\n  \"files.insertFinalNewline\": true,\n  \n  // Terminal\n  \"terminal.integrated.fontSize\": 14,\n  \"terminal.integrated.fontFamily\": \"MesloLGS NF\",\n  \n  // Git\n  \"git.autofetch\": true,\n  \"git.confirmSync\": false,\n  \"git.enableSmartCommit\": true,\n  \n  // Language-specific\n  \"[vue]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[typescript]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[json]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  }\n}\n",[258,7051,7052,7057,7061,7066,7078,7086,7096,7100,7112,7123,7134,7145,7149,7154,7166,7177,7188,7192,7197,7209,7221,7225,7230,7241,7252,7263,7267,7272,7279,7289,7293,7300,7308,7312,7319,7327,7331],{"__ignoreMap":15},[261,7053,7054],{"class":263,"line":264},[261,7055,7056],{"class":267},"// settings.json\n",[261,7058,7059],{"class":263,"line":26},[261,7060,6840],{"class":288},[261,7062,7063],{"class":263,"line":292},[261,7064,7065],{"class":267},"  // Editor behavior\n",[261,7067,7068,7071,7073,7076],{"class":263,"line":298},[261,7069,7070],{"class":277},"  \"editor.formatOnSave\"",[261,7072,1915],{"class":288},[261,7074,7075],{"class":277},"true",[261,7077,1489],{"class":288},[261,7079,7080,7083],{"class":263,"line":304},[261,7081,7082],{"class":277},"  \"editor.codeActionsOnSave\"",[261,7084,7085],{"class":288},": {\n",[261,7087,7088,7091,7093],{"class":263,"line":310},[261,7089,7090],{"class":277},"    \"source.fixAll.eslint\"",[261,7092,1915],{"class":288},[261,7094,7095],{"class":277},"true\n",[261,7097,7098],{"class":263,"line":453},[261,7099,3247],{"class":288},[261,7101,7102,7105,7107,7110],{"class":263,"line":458},[261,7103,7104],{"class":277},"  \"editor.tabSize\"",[261,7106,1915],{"class":288},[261,7108,7109],{"class":277},"2",[261,7111,1489],{"class":288},[261,7113,7114,7117,7119,7121],{"class":263,"line":464},[261,7115,7116],{"class":277},"  \"editor.linkedEditing\"",[261,7118,1915],{"class":288},[261,7120,7075],{"class":277},[261,7122,1489],{"class":288},[261,7124,7125,7128,7130,7132],{"class":263,"line":473},[261,7126,7127],{"class":277},"  \"editor.bracketPairColorization.enabled\"",[261,7129,1915],{"class":288},[261,7131,7075],{"class":277},[261,7133,1489],{"class":288},[261,7135,7136,7139,7141,7143],{"class":263,"line":489},[261,7137,7138],{"class":277},"  \"editor.guides.bracketPairs\"",[261,7140,1915],{"class":288},[261,7142,7075],{"class":277},[261,7144,1489],{"class":288},[261,7146,7147],{"class":263,"line":512},[261,7148,1845],{"class":288},[261,7150,7151],{"class":263,"line":518},[261,7152,7153],{"class":267},"  // File handling\n",[261,7155,7156,7159,7161,7164],{"class":263,"line":528},[261,7157,7158],{"class":277},"  \"files.autoSave\"",[261,7160,1915],{"class":288},[261,7162,7163],{"class":407},"\"onFocusChange\"",[261,7165,1489],{"class":288},[261,7167,7168,7171,7173,7175],{"class":263,"line":537},[261,7169,7170],{"class":277},"  \"files.trimTrailingWhitespace\"",[261,7172,1915],{"class":288},[261,7174,7075],{"class":277},[261,7176,1489],{"class":288},[261,7178,7179,7182,7184,7186],{"class":263,"line":1249},[261,7180,7181],{"class":277},"  \"files.insertFinalNewline\"",[261,7183,1915],{"class":288},[261,7185,7075],{"class":277},[261,7187,1489],{"class":288},[261,7189,7190],{"class":263,"line":1254},[261,7191,1845],{"class":288},[261,7193,7194],{"class":263,"line":1259},[261,7195,7196],{"class":267},"  // Terminal\n",[261,7198,7199,7202,7204,7207],{"class":263,"line":1264},[261,7200,7201],{"class":277},"  \"terminal.integrated.fontSize\"",[261,7203,1915],{"class":288},[261,7205,7206],{"class":277},"14",[261,7208,1489],{"class":288},[261,7210,7211,7214,7216,7219],{"class":263,"line":1270},[261,7212,7213],{"class":277},"  \"terminal.integrated.fontFamily\"",[261,7215,1915],{"class":288},[261,7217,7218],{"class":407},"\"MesloLGS NF\"",[261,7220,1489],{"class":288},[261,7222,7223],{"class":263,"line":1276},[261,7224,1845],{"class":288},[261,7226,7227],{"class":263,"line":1281},[261,7228,7229],{"class":267},"  // Git\n",[261,7231,7232,7235,7237,7239],{"class":263,"line":1287},[261,7233,7234],{"class":277},"  \"git.autofetch\"",[261,7236,1915],{"class":288},[261,7238,7075],{"class":277},[261,7240,1489],{"class":288},[261,7242,7243,7246,7248,7250],{"class":263,"line":1292},[261,7244,7245],{"class":277},"  \"git.confirmSync\"",[261,7247,1915],{"class":288},[261,7249,3087],{"class":277},[261,7251,1489],{"class":288},[261,7253,7254,7257,7259,7261],{"class":263,"line":1298},[261,7255,7256],{"class":277},"  \"git.enableSmartCommit\"",[261,7258,1915],{"class":288},[261,7260,7075],{"class":277},[261,7262,1489],{"class":288},[261,7264,7265],{"class":263,"line":1304},[261,7266,1845],{"class":288},[261,7268,7269],{"class":263,"line":1310},[261,7270,7271],{"class":267},"  // Language-specific\n",[261,7273,7274,7277],{"class":263,"line":1316},[261,7275,7276],{"class":277},"  \"[vue]\"",[261,7278,7085],{"class":288},[261,7280,7281,7284,7286],{"class":263,"line":1322},[261,7282,7283],{"class":277},"    \"editor.defaultFormatter\"",[261,7285,1915],{"class":288},[261,7287,7288],{"class":407},"\"esbenp.prettier-vscode\"\n",[261,7290,7291],{"class":263,"line":1655},[261,7292,3247],{"class":288},[261,7294,7295,7298],{"class":263,"line":1670},[261,7296,7297],{"class":277},"  \"[typescript]\"",[261,7299,7085],{"class":288},[261,7301,7302,7304,7306],{"class":263,"line":1686},[261,7303,7283],{"class":277},[261,7305,1915],{"class":288},[261,7307,7288],{"class":407},[261,7309,7310],{"class":263,"line":1699},[261,7311,3247],{"class":288},[261,7313,7314,7317],{"class":263,"line":1711},[261,7315,7316],{"class":277},"  \"[json]\"",[261,7318,7085],{"class":288},[261,7320,7321,7323,7325],{"class":263,"line":1716},[261,7322,7283],{"class":277},[261,7324,1915],{"class":288},[261,7326,7288],{"class":407},[261,7328,7329],{"class":263,"line":1721},[261,7330,986],{"class":288},[261,7332,7333],{"class":263,"line":1737},[261,7334,874],{"class":288},[220,7336,7338],{"id":7337},"keyboard-shortcuts-i-couldnt-live-without","Keyboard Shortcuts I Couldn't Live Without",[252,7340,7342],{"className":6827,"code":7341,"language":40,"meta":15,"style":15},"// keybindings.json\n[\n  {\n    \"key\": \"ctrl+shift+d\",\n    \"command\": \"editor.action.copyLinesDownAction\"\n  },\n  {\n    \"key\": \"ctrl+d\",\n    \"command\": \"editor.action.deleteLines\"\n  },\n  {\n    \"key\": \"ctrl+shift+k\",\n    \"command\": \"workbench.action.terminal.kill\"\n  },\n  {\n    \"key\": \"ctrl+shift+`\",\n    \"command\": \"workbench.action.terminal.new\"\n  }\n]\n",[258,7343,7344,7349,7354,7359,7371,7381,7385,7389,7400,7409,7413,7417,7428,7437,7441,7445,7456,7465,7469],{"__ignoreMap":15},[261,7345,7346],{"class":263,"line":264},[261,7347,7348],{"class":267},"// keybindings.json\n",[261,7350,7351],{"class":263,"line":26},[261,7352,7353],{"class":288},"[\n",[261,7355,7356],{"class":263,"line":292},[261,7357,7358],{"class":288},"  {\n",[261,7360,7361,7364,7366,7369],{"class":263,"line":298},[261,7362,7363],{"class":277},"    \"key\"",[261,7365,1915],{"class":288},[261,7367,7368],{"class":407},"\"ctrl+shift+d\"",[261,7370,1489],{"class":288},[261,7372,7373,7376,7378],{"class":263,"line":304},[261,7374,7375],{"class":277},"    \"command\"",[261,7377,1915],{"class":288},[261,7379,7380],{"class":407},"\"editor.action.copyLinesDownAction\"\n",[261,7382,7383],{"class":263,"line":310},[261,7384,3247],{"class":288},[261,7386,7387],{"class":263,"line":453},[261,7388,7358],{"class":288},[261,7390,7391,7393,7395,7398],{"class":263,"line":458},[261,7392,7363],{"class":277},[261,7394,1915],{"class":288},[261,7396,7397],{"class":407},"\"ctrl+d\"",[261,7399,1489],{"class":288},[261,7401,7402,7404,7406],{"class":263,"line":464},[261,7403,7375],{"class":277},[261,7405,1915],{"class":288},[261,7407,7408],{"class":407},"\"editor.action.deleteLines\"\n",[261,7410,7411],{"class":263,"line":473},[261,7412,3247],{"class":288},[261,7414,7415],{"class":263,"line":489},[261,7416,7358],{"class":288},[261,7418,7419,7421,7423,7426],{"class":263,"line":512},[261,7420,7363],{"class":277},[261,7422,1915],{"class":288},[261,7424,7425],{"class":407},"\"ctrl+shift+k\"",[261,7427,1489],{"class":288},[261,7429,7430,7432,7434],{"class":263,"line":518},[261,7431,7375],{"class":277},[261,7433,1915],{"class":288},[261,7435,7436],{"class":407},"\"workbench.action.terminal.kill\"\n",[261,7438,7439],{"class":263,"line":528},[261,7440,3247],{"class":288},[261,7442,7443],{"class":263,"line":537},[261,7444,7358],{"class":288},[261,7446,7447,7449,7451,7454],{"class":263,"line":1249},[261,7448,7363],{"class":277},[261,7450,1915],{"class":288},[261,7452,7453],{"class":407},"\"ctrl+shift+`\"",[261,7455,1489],{"class":288},[261,7457,7458,7460,7462],{"class":263,"line":1254},[261,7459,7375],{"class":277},[261,7461,1915],{"class":288},[261,7463,7464],{"class":407},"\"workbench.action.terminal.new\"\n",[261,7466,7467],{"class":263,"line":1259},[261,7468,986],{"class":288},[261,7470,7471],{"class":263,"line":1264},[261,7472,7473],{"class":288},"]\n",[206,7475,7477],{"id":7476},"project-structure-that-scales","Project Structure That Scales",[220,7479,7481],{"id":7480},"folder-organization","Folder Organization",[252,7483,7486],{"className":7484,"code":7485,"language":4174},[4172],"~/Development/\n├── personal/           # Personal projects\n│   ├── portfolio/\n│   ├── blog/\n│   └── experiments/\n├── work/              # Work-related projects\n│   ├── client-a/\n│   └── client-b/\n├── learning/          # Tutorials and courses\n│   ├── vue-mastery/\n│   └── typescript-101/\n└── templates/         # Project starters\n    ├── nuxt-starter/\n    └── vue-component-library/\n",[258,7487,7485],{"__ignoreMap":15},[17,7489,7490],{},[227,7491,7492],{},"Why this works:",[239,7494,7495,7498,7501,7504],{},[242,7496,7497],{},"Clear separation of contexts",[242,7499,7500],{},"Easy to find projects",[242,7502,7503],{},"Backup strategies can target specific folders",[242,7505,7506],{},"Mental clarity: \"I'm in learning mode\" vs \"I'm in work mode\"",[220,7508,7510],{"id":7509},"project-level-organization","Project-Level Organization",[252,7512,7515],{"className":7513,"code":7514,"language":4174},[4172],"my-nuxt-app/\n├── .vscode/                 # VS Code settings\n│   ├── settings.json\n│   └── extensions.json\n├── app/\n│   ├── components/\n│   │   ├── common/         # Reusable components\n│   │   ├── features/       # Feature-specific components\n│   │   └── layouts/        # Layout components\n│   ├── composables/        # Composition functions\n│   ├── utils/              # Helper functions\n│   └── types/              # TypeScript types\n├── content/                # Content files\n├── public/                 # Static assets\n├── server/                 # Backend code\n├── tests/                  # Test files\n│   ├── unit/\n│   └── e2e/\n├── .env.example           # Environment template\n├── .gitignore\n├── docker-compose.yml\n├── nuxt.config.ts\n├── package.json\n├── README.md\n└── tsconfig.json\n",[258,7516,7514],{"__ignoreMap":15},[206,7518,7520],{"id":7519},"terminal-setup-from-pain-to-pleasure","Terminal Setup: From Pain to Pleasure",[220,7522,7524],{"id":7523},"oh-my-zsh-configuration","Oh My Zsh Configuration",[252,7526,7528],{"className":580,"code":7527,"language":582,"meta":15,"style":15},"# ~/.zshrc\n# Theme\nZSH_THEME=\"powerlevel10k/powerlevel10k\"\n\n# Plugins that boost productivity\nplugins=(\n  git\n  node\n  npm\n  docker\n  docker-compose\n  vscode\n  colored-man-pages\n  zsh-autosuggestions\n  zsh-syntax-highlighting\n)\n\n# Aliases that save time\nalias gs='git status'\nalias ga='git add'\nalias gc='git commit -m'\nalias gp='git push'\nalias gl='git pull'\nalias gco='git checkout'\nalias gcb='git checkout -b'\nalias gd='git diff'\nalias gb='git branch'\n\n# Project shortcuts\nalias dev='cd ~/Development'\nalias personal='cd ~/Development/personal'\nalias work='cd ~/Development/work'\n\n# Common commands\nalias c='clear'\nalias nrd='npm run dev'\nalias nrb='npm run build'\nalias prd='pnpm run dev'\nalias prb='pnpm run build'\n\n# Docker shortcuts\nalias dcu='docker-compose up'\nalias dcd='docker-compose down'\nalias dcr='docker-compose restart'\n\n# VS Code\nalias code.='code .'\n\n# List with colors\nalias ls='ls --color=auto'\nalias ll='ls -alh'\n\n# Quick navigation\nalias ..='cd ..'\nalias ...='cd ../..'\nalias ....='cd ../../..'\n",[258,7529,7530,7535,7540,7550,7554,7559,7568,7573,7578,7583,7588,7593,7598,7603,7608,7613,7617,7621,7626,7639,7651,7663,7675,7687,7699,7711,7723,7735,7739,7744,7756,7768,7780,7784,7789,7801,7813,7825,7837,7849,7853,7858,7870,7882,7894,7898,7903,7910,7914,7919,7931,7943,7947,7952,7959,7966],{"__ignoreMap":15},[261,7531,7532],{"class":263,"line":264},[261,7533,7534],{"class":267},"# ~/.zshrc\n",[261,7536,7537],{"class":263,"line":26},[261,7538,7539],{"class":267},"# Theme\n",[261,7541,7542,7545,7547],{"class":263,"line":292},[261,7543,7544],{"class":288},"ZSH_THEME",[261,7546,404],{"class":273},[261,7548,7549],{"class":407},"\"powerlevel10k/powerlevel10k\"\n",[261,7551,7552],{"class":263,"line":298},[261,7553,295],{"emptyLinePlaceholder":32},[261,7555,7556],{"class":263,"line":304},[261,7557,7558],{"class":267},"# Plugins that boost productivity\n",[261,7560,7561,7564,7566],{"class":263,"line":310},[261,7562,7563],{"class":288},"plugins",[261,7565,404],{"class":273},[261,7567,1481],{"class":288},[261,7569,7570],{"class":263,"line":453},[261,7571,7572],{"class":407},"  git\n",[261,7574,7575],{"class":263,"line":458},[261,7576,7577],{"class":407},"  node\n",[261,7579,7580],{"class":263,"line":464},[261,7581,7582],{"class":407},"  npm\n",[261,7584,7585],{"class":263,"line":473},[261,7586,7587],{"class":407},"  docker\n",[261,7589,7590],{"class":263,"line":489},[261,7591,7592],{"class":407},"  docker-compose\n",[261,7594,7595],{"class":263,"line":512},[261,7596,7597],{"class":407},"  vscode\n",[261,7599,7600],{"class":263,"line":518},[261,7601,7602],{"class":407},"  colored-man-pages\n",[261,7604,7605],{"class":263,"line":528},[261,7606,7607],{"class":407},"  zsh-autosuggestions\n",[261,7609,7610],{"class":263,"line":537},[261,7611,7612],{"class":407},"  zsh-syntax-highlighting\n",[261,7614,7615],{"class":263,"line":1249},[261,7616,2496],{"class":288},[261,7618,7619],{"class":263,"line":1254},[261,7620,295],{"emptyLinePlaceholder":32},[261,7622,7623],{"class":263,"line":1259},[261,7624,7625],{"class":267},"# Aliases that save time\n",[261,7627,7628,7631,7634,7636],{"class":263,"line":1264},[261,7629,7630],{"class":273},"alias",[261,7632,7633],{"class":288}," gs",[261,7635,404],{"class":273},[261,7637,7638],{"class":407},"'git status'\n",[261,7640,7641,7643,7646,7648],{"class":263,"line":1270},[261,7642,7630],{"class":273},[261,7644,7645],{"class":288}," ga",[261,7647,404],{"class":273},[261,7649,7650],{"class":407},"'git add'\n",[261,7652,7653,7655,7658,7660],{"class":263,"line":1276},[261,7654,7630],{"class":273},[261,7656,7657],{"class":288}," gc",[261,7659,404],{"class":273},[261,7661,7662],{"class":407},"'git commit -m'\n",[261,7664,7665,7667,7670,7672],{"class":263,"line":1281},[261,7666,7630],{"class":273},[261,7668,7669],{"class":288}," gp",[261,7671,404],{"class":273},[261,7673,7674],{"class":407},"'git push'\n",[261,7676,7677,7679,7682,7684],{"class":263,"line":1287},[261,7678,7630],{"class":273},[261,7680,7681],{"class":288}," gl",[261,7683,404],{"class":273},[261,7685,7686],{"class":407},"'git pull'\n",[261,7688,7689,7691,7694,7696],{"class":263,"line":1292},[261,7690,7630],{"class":273},[261,7692,7693],{"class":288}," gco",[261,7695,404],{"class":273},[261,7697,7698],{"class":407},"'git checkout'\n",[261,7700,7701,7703,7706,7708],{"class":263,"line":1298},[261,7702,7630],{"class":273},[261,7704,7705],{"class":288}," gcb",[261,7707,404],{"class":273},[261,7709,7710],{"class":407},"'git checkout -b'\n",[261,7712,7713,7715,7718,7720],{"class":263,"line":1304},[261,7714,7630],{"class":273},[261,7716,7717],{"class":288}," gd",[261,7719,404],{"class":273},[261,7721,7722],{"class":407},"'git diff'\n",[261,7724,7725,7727,7730,7732],{"class":263,"line":1310},[261,7726,7630],{"class":273},[261,7728,7729],{"class":288}," gb",[261,7731,404],{"class":273},[261,7733,7734],{"class":407},"'git branch'\n",[261,7736,7737],{"class":263,"line":1316},[261,7738,295],{"emptyLinePlaceholder":32},[261,7740,7741],{"class":263,"line":1322},[261,7742,7743],{"class":267},"# Project shortcuts\n",[261,7745,7746,7748,7751,7753],{"class":263,"line":1655},[261,7747,7630],{"class":273},[261,7749,7750],{"class":288}," dev",[261,7752,404],{"class":273},[261,7754,7755],{"class":407},"'cd ~/Development'\n",[261,7757,7758,7760,7763,7765],{"class":263,"line":1670},[261,7759,7630],{"class":273},[261,7761,7762],{"class":288}," personal",[261,7764,404],{"class":273},[261,7766,7767],{"class":407},"'cd ~/Development/personal'\n",[261,7769,7770,7772,7775,7777],{"class":263,"line":1686},[261,7771,7630],{"class":273},[261,7773,7774],{"class":288}," work",[261,7776,404],{"class":273},[261,7778,7779],{"class":407},"'cd ~/Development/work'\n",[261,7781,7782],{"class":263,"line":1699},[261,7783,295],{"emptyLinePlaceholder":32},[261,7785,7786],{"class":263,"line":1711},[261,7787,7788],{"class":267},"# Common commands\n",[261,7790,7791,7793,7796,7798],{"class":263,"line":1716},[261,7792,7630],{"class":273},[261,7794,7795],{"class":288}," c",[261,7797,404],{"class":273},[261,7799,7800],{"class":407},"'clear'\n",[261,7802,7803,7805,7808,7810],{"class":263,"line":1721},[261,7804,7630],{"class":273},[261,7806,7807],{"class":288}," nrd",[261,7809,404],{"class":273},[261,7811,7812],{"class":407},"'npm run dev'\n",[261,7814,7815,7817,7820,7822],{"class":263,"line":1737},[261,7816,7630],{"class":273},[261,7818,7819],{"class":288}," nrb",[261,7821,404],{"class":273},[261,7823,7824],{"class":407},"'npm run build'\n",[261,7826,7827,7829,7832,7834],{"class":263,"line":1746},[261,7828,7630],{"class":273},[261,7830,7831],{"class":288}," prd",[261,7833,404],{"class":273},[261,7835,7836],{"class":407},"'pnpm run dev'\n",[261,7838,7839,7841,7844,7846],{"class":263,"line":1769},[261,7840,7630],{"class":273},[261,7842,7843],{"class":288}," prb",[261,7845,404],{"class":273},[261,7847,7848],{"class":407},"'pnpm run build'\n",[261,7850,7851],{"class":263,"line":1774},[261,7852,295],{"emptyLinePlaceholder":32},[261,7854,7855],{"class":263,"line":3392},[261,7856,7857],{"class":267},"# Docker shortcuts\n",[261,7859,7860,7862,7865,7867],{"class":263,"line":3397},[261,7861,7630],{"class":273},[261,7863,7864],{"class":288}," dcu",[261,7866,404],{"class":273},[261,7868,7869],{"class":407},"'docker-compose up'\n",[261,7871,7872,7874,7877,7879],{"class":263,"line":3427},[261,7873,7630],{"class":273},[261,7875,7876],{"class":288}," dcd",[261,7878,404],{"class":273},[261,7880,7881],{"class":407},"'docker-compose down'\n",[261,7883,7884,7886,7889,7891],{"class":263,"line":3434},[261,7885,7630],{"class":273},[261,7887,7888],{"class":288}," dcr",[261,7890,404],{"class":273},[261,7892,7893],{"class":407},"'docker-compose restart'\n",[261,7895,7896],{"class":263,"line":3453},[261,7897,295],{"emptyLinePlaceholder":32},[261,7899,7900],{"class":263,"line":3463},[261,7901,7902],{"class":267},"# VS Code\n",[261,7904,7905,7907],{"class":263,"line":3477},[261,7906,7630],{"class":277},[261,7908,7909],{"class":407}," code.='code .'\n",[261,7911,7912],{"class":263,"line":3492},[261,7913,295],{"emptyLinePlaceholder":32},[261,7915,7916],{"class":263,"line":3498},[261,7917,7918],{"class":267},"# List with colors\n",[261,7920,7921,7923,7926,7928],{"class":263,"line":3516},[261,7922,7630],{"class":273},[261,7924,7925],{"class":288}," ls",[261,7927,404],{"class":273},[261,7929,7930],{"class":407},"'ls --color=auto'\n",[261,7932,7933,7935,7938,7940],{"class":263,"line":3529},[261,7934,7630],{"class":273},[261,7936,7937],{"class":288}," ll",[261,7939,404],{"class":273},[261,7941,7942],{"class":407},"'ls -alh'\n",[261,7944,7945],{"class":263,"line":3538},[261,7946,295],{"emptyLinePlaceholder":32},[261,7948,7949],{"class":263,"line":3552},[261,7950,7951],{"class":267},"# Quick navigation\n",[261,7953,7954,7956],{"class":263,"line":3557},[261,7955,7630],{"class":277},[261,7957,7958],{"class":407}," ..='cd ..'\n",[261,7960,7961,7963],{"class":263,"line":3562},[261,7962,7630],{"class":277},[261,7964,7965],{"class":407}," ...='cd ../..'\n",[261,7967,7968,7970],{"class":263,"line":3567},[261,7969,7630],{"class":277},[261,7971,7972],{"class":407}," ....='cd ../../..'\n",[220,7974,7976],{"id":7975},"custom-functions","Custom Functions",[252,7978,7980],{"className":580,"code":7979,"language":582,"meta":15,"style":15},"# Create and enter directory\nmkcd() {\n  mkdir -p \"$1\" && cd \"$1\"\n}\n\n# Create new project from template\nnewproject() {\n  local template=$1\n  local name=$2\n  cp -r ~/Development/templates/$template ~/Development/personal/$name\n  cd ~/Development/personal/$name\n  code .\n}\n\n# Git commit with conventional commit format\ngccm() {\n  local type=$1\n  shift\n  local message=\"$@\"\n  git commit -m \"$type: $message\"\n}\n\n# Quick server\nserve() {\n  python3 -m http.server ${1:-8000}\n}\n",[258,7981,7982,7987,7994,8022,8026,8030,8035,8042,8055,8067,8087,8097,8104,8108,8112,8117,8124,8135,8140,8156,8177,8181,8185,8190,8197,8216],{"__ignoreMap":15},[261,7983,7984],{"class":263,"line":264},[261,7985,7986],{"class":267},"# Create and enter directory\n",[261,7988,7989,7992],{"class":263,"line":26},[261,7990,7991],{"class":284},"mkcd",[261,7993,864],{"class":288},[261,7995,7996,7999,8001,8004,8007,8010,8012,8015,8017,8019],{"class":263,"line":292},[261,7997,7998],{"class":284},"  mkdir",[261,8000,5886],{"class":277},[261,8002,8003],{"class":407}," \"",[261,8005,8006],{"class":277},"$1",[261,8008,8009],{"class":407},"\"",[261,8011,6128],{"class":288},[261,8013,8014],{"class":277},"cd",[261,8016,8003],{"class":407},[261,8018,8006],{"class":277},[261,8020,8021],{"class":407},"\"\n",[261,8023,8024],{"class":263,"line":298},[261,8025,874],{"class":288},[261,8027,8028],{"class":263,"line":304},[261,8029,295],{"emptyLinePlaceholder":32},[261,8031,8032],{"class":263,"line":310},[261,8033,8034],{"class":267},"# Create new project from template\n",[261,8036,8037,8040],{"class":263,"line":453},[261,8038,8039],{"class":284},"newproject",[261,8041,864],{"class":288},[261,8043,8044,8047,8050,8052],{"class":263,"line":458},[261,8045,8046],{"class":273},"  local",[261,8048,8049],{"class":288}," template",[261,8051,404],{"class":273},[261,8053,8054],{"class":1412},"$1\n",[261,8056,8057,8059,8062,8064],{"class":263,"line":464},[261,8058,8046],{"class":273},[261,8060,8061],{"class":288}," name",[261,8063,404],{"class":273},[261,8065,8066],{"class":1412},"$2\n",[261,8068,8069,8072,8075,8078,8081,8084],{"class":263,"line":473},[261,8070,8071],{"class":284},"  cp",[261,8073,8074],{"class":277}," -r",[261,8076,8077],{"class":407}," ~/Development/templates/",[261,8079,8080],{"class":288},"$template ",[261,8082,8083],{"class":407},"~/Development/personal/",[261,8085,8086],{"class":288},"$name\n",[261,8088,8089,8092,8095],{"class":263,"line":489},[261,8090,8091],{"class":277},"  cd",[261,8093,8094],{"class":407}," ~/Development/personal/",[261,8096,8086],{"class":288},[261,8098,8099,8102],{"class":263,"line":512},[261,8100,8101],{"class":284},"  code",[261,8103,4818],{"class":407},[261,8105,8106],{"class":263,"line":518},[261,8107,874],{"class":288},[261,8109,8110],{"class":263,"line":528},[261,8111,295],{"emptyLinePlaceholder":32},[261,8113,8114],{"class":263,"line":537},[261,8115,8116],{"class":267},"# Git commit with conventional commit format\n",[261,8118,8119,8122],{"class":263,"line":1249},[261,8120,8121],{"class":284},"gccm",[261,8123,864],{"class":288},[261,8125,8126,8128,8131,8133],{"class":263,"line":1254},[261,8127,8046],{"class":273},[261,8129,8130],{"class":288}," type",[261,8132,404],{"class":273},[261,8134,8054],{"class":1412},[261,8136,8137],{"class":263,"line":1259},[261,8138,8139],{"class":277},"  shift\n",[261,8141,8142,8144,8147,8149,8151,8154],{"class":263,"line":1264},[261,8143,8046],{"class":273},[261,8145,8146],{"class":288}," message",[261,8148,404],{"class":273},[261,8150,8009],{"class":407},[261,8152,8153],{"class":277},"$@",[261,8155,8021],{"class":407},[261,8157,8158,8161,8163,8165,8167,8170,8172,8175],{"class":263,"line":1270},[261,8159,8160],{"class":284},"  git",[261,8162,597],{"class":407},[261,8164,600],{"class":277},[261,8166,8003],{"class":407},[261,8168,8169],{"class":288},"$type",[261,8171,1915],{"class":407},[261,8173,8174],{"class":288},"$message",[261,8176,8021],{"class":407},[261,8178,8179],{"class":263,"line":1276},[261,8180,874],{"class":288},[261,8182,8183],{"class":263,"line":1281},[261,8184,295],{"emptyLinePlaceholder":32},[261,8186,8187],{"class":263,"line":1287},[261,8188,8189],{"class":267},"# Quick server\n",[261,8191,8192,8195],{"class":263,"line":1292},[261,8193,8194],{"class":284},"serve",[261,8196,864],{"class":288},[261,8198,8199,8202,8204,8207,8210,8213],{"class":263,"line":1298},[261,8200,8201],{"class":284},"  python3",[261,8203,600],{"class":277},[261,8205,8206],{"class":407}," http.server",[261,8208,8209],{"class":1412}," ${1",[261,8211,8212],{"class":273},":-",[261,8214,8215],{"class":1412},"8000}\n",[261,8217,8218],{"class":263,"line":1304},[261,8219,874],{"class":288},[206,8221,8223],{"id":8222},"browser-setup-for-development","Browser Setup for Development",[220,8225,6821],{"id":8226},"essential-extensions-1",[17,8228,8229],{},[227,8230,8231],{},"Chrome/Edge:",[354,8233,8234,8240,8246,8252,8258,8264,8270,8276],{},[242,8235,8236,8239],{},[227,8237,8238],{},"Vue DevTools"," - Debug Vue applications",[242,8241,8242,8245],{},[227,8243,8244],{},"React DevTools"," - Debug React applications",[242,8247,8248,8251],{},[227,8249,8250],{},"Redux DevTools"," - State management debugging",[242,8253,8254,8257],{},[227,8255,8256],{},"JSON Formatter"," - Pretty print JSON",[242,8259,8260,8263],{},[227,8261,8262],{},"Wappalyzer"," - Identify technologies",[242,8265,8266,8269],{},[227,8267,8268],{},"ColorZilla"," - Color picker",[242,8271,8272,8275],{},[227,8273,8274],{},"Lighthouse"," - Performance auditing",[242,8277,8278,8281],{},[227,8279,8280],{},"Octotree"," - GitHub code tree",[220,8283,8285],{"id":8284},"tab-management-strategy","Tab Management Strategy",[17,8287,8288,8289,8292],{},"I use ",[227,8290,8291],{},"session managers"," and follow these rules:",[252,8294,8296],{"className":715,"code":8295,"language":717,"meta":15,"style":15},"## Tab Organization Rules\n1. Max 10 tabs per window\n2. One window per project\n3. Pin frequently used tabs (localhost, docs)\n4. Close tabs at end of day\n5. Save sessions for active projects\n",[258,8297,8298,8303,8308,8313,8318,8323],{"__ignoreMap":15},[261,8299,8300],{"class":263,"line":264},[261,8301,8302],{},"## Tab Organization Rules\n",[261,8304,8305],{"class":263,"line":26},[261,8306,8307],{},"1. Max 10 tabs per window\n",[261,8309,8310],{"class":263,"line":292},[261,8311,8312],{},"2. One window per project\n",[261,8314,8315],{"class":263,"line":298},[261,8316,8317],{},"3. Pin frequently used tabs (localhost, docs)\n",[261,8319,8320],{"class":263,"line":304},[261,8321,8322],{},"4. Close tabs at end of day\n",[261,8324,8325],{"class":263,"line":310},[261,8326,8327],{},"5. Save sessions for active projects\n",[17,8329,8330],{},[227,8331,8332],{},"Pinned tabs in my dev window:",[239,8334,8335,8341,8344,8347,8350],{},[242,8336,8337,8340],{},[258,8338,8339],{},"localhost:3000"," - Development server",[242,8342,8343],{},"Vue.js Documentation",[242,8345,8346],{},"MDN Web Docs",[242,8348,8349],{},"GitHub Repository",[242,8351,8352],{},"Project management tool",[206,8354,8356],{"id":8355},"file-naming-conventions","File Naming Conventions",[220,8358,8360],{"id":8359},"component-files","Component Files",[252,8362,8365],{"className":8363,"code":8364,"language":4174},[4172],"✅ Good:\nUserProfile.vue\nLoginForm.vue\nNavigationBar.vue\nProductCard.vue\n\n❌ Bad:\nuserprofile.vue\nlogin_form.vue\nNav-Bar.vue\nproduct-card-component.vue\n",[258,8366,8364],{"__ignoreMap":15},[220,8368,8370],{"id":8369},"utility-files","Utility Files",[252,8372,8375],{"className":8373,"code":8374,"language":4174},[4172],"✅ Good:\nformatDate.ts\nvalidateEmail.ts\nfetchUserData.ts\n\n❌ Bad:\nutils.ts\nhelpers.ts\nfunctions.ts\n",[258,8376,8374],{"__ignoreMap":15},[220,8378,8380],{"id":8379},"general-rules","General Rules",[252,8382,8384],{"className":1350,"code":8383,"language":1352,"meta":15,"style":15},"// PascalCase for components\n// camelCase for utilities, functions, variables\n// kebab-case for file paths in URLs\n// SCREAMING_SNAKE_CASE for constants\n\n// Components\nexport default defineComponent({\n  name: 'UserProfile'\n});\n\n// Functions\nfunction calculateTotal(items: Item[]): number {}\n\n// Constants\nconst MAX_RETRY_ATTEMPTS = 3;\nconst API_BASE_URL = 'https://api.example.com';\n",[258,8385,8386,8391,8396,8401,8406,8410,8415,8428,8436,8440,8444,8449,8476,8480,8485,8499],{"__ignoreMap":15},[261,8387,8388],{"class":263,"line":264},[261,8389,8390],{"class":267},"// PascalCase for components\n",[261,8392,8393],{"class":263,"line":26},[261,8394,8395],{"class":267},"// camelCase for utilities, functions, variables\n",[261,8397,8398],{"class":263,"line":292},[261,8399,8400],{"class":267},"// kebab-case for file paths in URLs\n",[261,8402,8403],{"class":263,"line":298},[261,8404,8405],{"class":267},"// SCREAMING_SNAKE_CASE for constants\n",[261,8407,8408],{"class":263,"line":304},[261,8409,295],{"emptyLinePlaceholder":32},[261,8411,8412],{"class":263,"line":310},[261,8413,8414],{"class":267},"// Components\n",[261,8416,8417,8419,8422,8425],{"class":263,"line":453},[261,8418,1399],{"class":273},[261,8420,8421],{"class":273}," default",[261,8423,8424],{"class":284}," defineComponent",[261,8426,8427],{"class":288},"({\n",[261,8429,8430,8433],{"class":263,"line":458},[261,8431,8432],{"class":288},"  name: ",[261,8434,8435],{"class":407},"'UserProfile'\n",[261,8437,8438],{"class":263,"line":464},[261,8439,3570],{"class":288},[261,8441,8442],{"class":263,"line":473},[261,8443,295],{"emptyLinePlaceholder":32},[261,8445,8446],{"class":263,"line":489},[261,8447,8448],{"class":267},"// Functions\n",[261,8450,8451,8453,8456,8458,8461,8463,8466,8469,8471,8473],{"class":263,"line":512},[261,8452,858],{"class":273},[261,8454,8455],{"class":284}," calculateTotal",[261,8457,922],{"class":288},[261,8459,8460],{"class":1412},"items",[261,8462,1861],{"class":273},[261,8464,8465],{"class":284}," Item",[261,8467,8468],{"class":288},"[])",[261,8470,1861],{"class":273},[261,8472,2964],{"class":277},[261,8474,8475],{"class":288}," {}\n",[261,8477,8478],{"class":263,"line":518},[261,8479,295],{"emptyLinePlaceholder":32},[261,8481,8482],{"class":263,"line":528},[261,8483,8484],{"class":267},"// Constants\n",[261,8486,8487,8489,8492,8494,8497],{"class":263,"line":537},[261,8488,274],{"class":273},[261,8490,8491],{"class":277}," MAX_RETRY_ATTEMPTS",[261,8493,281],{"class":273},[261,8495,8496],{"class":277}," 3",[261,8498,1376],{"class":288},[261,8500,8501,8503,8506,8508,8511],{"class":263,"line":1249},[261,8502,274],{"class":273},[261,8504,8505],{"class":277}," API_BASE_URL",[261,8507,281],{"class":273},[261,8509,8510],{"class":407}," 'https://api.example.com'",[261,8512,1376],{"class":288},[206,8514,8516],{"id":8515},"git-workflow-automation","Git Workflow Automation",[220,8518,8520],{"id":8519},"git-hooks-with-husky","Git Hooks with Husky",[252,8522,8524],{"className":6827,"code":8523,"language":40,"meta":15,"style":15},"// package.json\n{\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"lint-staged\",\n      \"commit-msg\": \"commitlint -E HUSKY_GIT_PARAMS\"\n    }\n  },\n  \"lint-staged\": {\n    \"*.{js,ts,vue}\": [\n      \"eslint --fix\",\n      \"prettier --write\"\n    ],\n    \"*.{css,scss}\": [\n      \"prettier --write\"\n    ]\n  }\n}\n",[258,8525,8526,8531,8535,8542,8549,8561,8571,8575,8579,8586,8593,8600,8605,8610,8617,8621,8626,8630],{"__ignoreMap":15},[261,8527,8528],{"class":263,"line":264},[261,8529,8530],{"class":267},"// package.json\n",[261,8532,8533],{"class":263,"line":26},[261,8534,6840],{"class":288},[261,8536,8537,8540],{"class":263,"line":292},[261,8538,8539],{"class":277},"  \"husky\"",[261,8541,7085],{"class":288},[261,8543,8544,8547],{"class":263,"line":298},[261,8545,8546],{"class":277},"    \"hooks\"",[261,8548,7085],{"class":288},[261,8550,8551,8554,8556,8559],{"class":263,"line":304},[261,8552,8553],{"class":277},"      \"pre-commit\"",[261,8555,1915],{"class":288},[261,8557,8558],{"class":407},"\"lint-staged\"",[261,8560,1489],{"class":288},[261,8562,8563,8566,8568],{"class":263,"line":310},[261,8564,8565],{"class":277},"      \"commit-msg\"",[261,8567,1915],{"class":288},[261,8569,8570],{"class":407},"\"commitlint -E HUSKY_GIT_PARAMS\"\n",[261,8572,8573],{"class":263,"line":453},[261,8574,1558],{"class":288},[261,8576,8577],{"class":263,"line":458},[261,8578,3247],{"class":288},[261,8580,8581,8584],{"class":263,"line":464},[261,8582,8583],{"class":277},"  \"lint-staged\"",[261,8585,7085],{"class":288},[261,8587,8588,8591],{"class":263,"line":473},[261,8589,8590],{"class":277},"    \"*.{js,ts,vue}\"",[261,8592,6848],{"class":288},[261,8594,8595,8598],{"class":263,"line":489},[261,8596,8597],{"class":407},"      \"eslint --fix\"",[261,8599,1489],{"class":288},[261,8601,8602],{"class":263,"line":512},[261,8603,8604],{"class":407},"      \"prettier --write\"\n",[261,8606,8607],{"class":263,"line":518},[261,8608,8609],{"class":288},"    ],\n",[261,8611,8612,8615],{"class":263,"line":528},[261,8613,8614],{"class":277},"    \"*.{css,scss}\"",[261,8616,6848],{"class":288},[261,8618,8619],{"class":263,"line":537},[261,8620,8604],{"class":407},[261,8622,8623],{"class":263,"line":1249},[261,8624,8625],{"class":288},"    ]\n",[261,8627,8628],{"class":263,"line":1254},[261,8629,986],{"class":288},[261,8631,8632],{"class":263,"line":1259},[261,8633,874],{"class":288},[220,8635,8637],{"id":8636},"commit-message-template","Commit Message Template",[252,8639,8641],{"className":580,"code":8640,"language":582,"meta":15,"style":15},"# ~/.gitmessage\n# \u003Ctype>: \u003Csubject>\n#\n# \u003Cbody>\n#\n# \u003Cfooter>\n\n# Types:\n# feat:     New feature\n# fix:      Bug fix\n# docs:     Documentation only changes\n# style:    Code style changes (formatting, etc)\n# refactor: Code refactoring\n# test:     Adding or updating tests\n# chore:    Maintenance tasks\n",[258,8642,8643,8648,8653,8658,8663,8667,8672,8676,8681,8686,8691,8696,8701,8706,8711],{"__ignoreMap":15},[261,8644,8645],{"class":263,"line":264},[261,8646,8647],{"class":267},"# ~/.gitmessage\n",[261,8649,8650],{"class":263,"line":26},[261,8651,8652],{"class":267},"# \u003Ctype>: \u003Csubject>\n",[261,8654,8655],{"class":263,"line":292},[261,8656,8657],{"class":267},"#\n",[261,8659,8660],{"class":263,"line":298},[261,8661,8662],{"class":267},"# \u003Cbody>\n",[261,8664,8665],{"class":263,"line":304},[261,8666,8657],{"class":267},[261,8668,8669],{"class":263,"line":310},[261,8670,8671],{"class":267},"# \u003Cfooter>\n",[261,8673,8674],{"class":263,"line":453},[261,8675,295],{"emptyLinePlaceholder":32},[261,8677,8678],{"class":263,"line":458},[261,8679,8680],{"class":267},"# Types:\n",[261,8682,8683],{"class":263,"line":464},[261,8684,8685],{"class":267},"# feat:     New feature\n",[261,8687,8688],{"class":263,"line":473},[261,8689,8690],{"class":267},"# fix:      Bug fix\n",[261,8692,8693],{"class":263,"line":489},[261,8694,8695],{"class":267},"# docs:     Documentation only changes\n",[261,8697,8698],{"class":263,"line":512},[261,8699,8700],{"class":267},"# style:    Code style changes (formatting, etc)\n",[261,8702,8703],{"class":263,"line":518},[261,8704,8705],{"class":267},"# refactor: Code refactoring\n",[261,8707,8708],{"class":263,"line":528},[261,8709,8710],{"class":267},"# test:     Adding or updating tests\n",[261,8712,8713],{"class":263,"line":537},[261,8714,8715],{"class":267},"# chore:    Maintenance tasks\n",[17,8717,8718],{},"Set as default:",[252,8720,8722],{"className":580,"code":8721,"language":582,"meta":15,"style":15},"git config --global commit.template ~/.gitmessage\n",[258,8723,8724],{"__ignoreMap":15},[261,8725,8726,8728,8731,8734,8737],{"class":263,"line":264},[261,8727,594],{"class":284},[261,8729,8730],{"class":407}," config",[261,8732,8733],{"class":277}," --global",[261,8735,8736],{"class":407}," commit.template",[261,8738,8739],{"class":407}," ~/.gitmessage\n",[206,8741,8743],{"id":8742},"documentation-system","Documentation System",[220,8745,8747],{"id":8746},"readme-template","README Template",[252,8749,8751],{"className":715,"code":8750,"language":717,"meta":15,"style":15},"# Project Name\n\nBrief description of what this project does.\n\n## 🚀 Quick Start\n\n\\`\\`\\`bash\n# Clone the repository\ngit clone https://github.com/username/project.git\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n\\`\\`\\`\n\n## 📁 Project Structure\n\n\\`\\`\\`\nsrc/\n├── components/    # Reusable components\n├── pages/        # Page components\n└── utils/        # Utility functions\n\\`\\`\\`\n\n## 🛠️ Tech Stack\n\n- **Framework:** Nuxt 3\n- **Language:** TypeScript\n- **Styling:** Tailwind CSS\n- **State:** Pinia\n\n## 📝 Available Scripts\n\n- \\`npm run dev\\` - Start development server\n- \\`npm run build\\` - Build for production\n- \\`npm run test\\` - Run tests\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch\n3. Commit your changes\n4. Push to the branch\n5. Open a Pull Request\n\n## 📄 License\n\nMIT\n",[258,8752,8753,8758,8762,8767,8771,8776,8780,8785,8790,8795,8799,8804,8809,8813,8818,8823,8828,8832,8837,8841,8845,8850,8855,8860,8865,8869,8873,8878,8882,8887,8892,8897,8902,8906,8911,8915,8920,8925,8930,8934,8939,8943,8948,8953,8958,8963,8968,8972,8977,8981],{"__ignoreMap":15},[261,8754,8755],{"class":263,"line":264},[261,8756,8757],{},"# Project Name\n",[261,8759,8760],{"class":263,"line":26},[261,8761,295],{"emptyLinePlaceholder":32},[261,8763,8764],{"class":263,"line":292},[261,8765,8766],{},"Brief description of what this project does.\n",[261,8768,8769],{"class":263,"line":298},[261,8770,295],{"emptyLinePlaceholder":32},[261,8772,8773],{"class":263,"line":304},[261,8774,8775],{},"## 🚀 Quick Start\n",[261,8777,8778],{"class":263,"line":310},[261,8779,295],{"emptyLinePlaceholder":32},[261,8781,8782],{"class":263,"line":453},[261,8783,8784],{},"\\`\\`\\`bash\n",[261,8786,8787],{"class":263,"line":458},[261,8788,8789],{},"# Clone the repository\n",[261,8791,8792],{"class":263,"line":464},[261,8793,8794],{},"git clone https://github.com/username/project.git\n",[261,8796,8797],{"class":263,"line":473},[261,8798,295],{"emptyLinePlaceholder":32},[261,8800,8801],{"class":263,"line":489},[261,8802,8803],{},"# Install dependencies\n",[261,8805,8806],{"class":263,"line":512},[261,8807,8808],{},"npm install\n",[261,8810,8811],{"class":263,"line":518},[261,8812,295],{"emptyLinePlaceholder":32},[261,8814,8815],{"class":263,"line":528},[261,8816,8817],{},"# Start development server\n",[261,8819,8820],{"class":263,"line":537},[261,8821,8822],{},"npm run dev\n",[261,8824,8825],{"class":263,"line":1249},[261,8826,8827],{},"\\`\\`\\`\n",[261,8829,8830],{"class":263,"line":1254},[261,8831,295],{"emptyLinePlaceholder":32},[261,8833,8834],{"class":263,"line":1259},[261,8835,8836],{},"## 📁 Project Structure\n",[261,8838,8839],{"class":263,"line":1264},[261,8840,295],{"emptyLinePlaceholder":32},[261,8842,8843],{"class":263,"line":1270},[261,8844,8827],{},[261,8846,8847],{"class":263,"line":1276},[261,8848,8849],{},"src/\n",[261,8851,8852],{"class":263,"line":1281},[261,8853,8854],{},"├── components/    # Reusable components\n",[261,8856,8857],{"class":263,"line":1287},[261,8858,8859],{},"├── pages/        # Page components\n",[261,8861,8862],{"class":263,"line":1292},[261,8863,8864],{},"└── utils/        # Utility functions\n",[261,8866,8867],{"class":263,"line":1298},[261,8868,8827],{},[261,8870,8871],{"class":263,"line":1304},[261,8872,295],{"emptyLinePlaceholder":32},[261,8874,8875],{"class":263,"line":1310},[261,8876,8877],{},"## 🛠️ Tech Stack\n",[261,8879,8880],{"class":263,"line":1316},[261,8881,295],{"emptyLinePlaceholder":32},[261,8883,8884],{"class":263,"line":1322},[261,8885,8886],{},"- **Framework:** Nuxt 3\n",[261,8888,8889],{"class":263,"line":1655},[261,8890,8891],{},"- **Language:** TypeScript\n",[261,8893,8894],{"class":263,"line":1670},[261,8895,8896],{},"- **Styling:** Tailwind CSS\n",[261,8898,8899],{"class":263,"line":1686},[261,8900,8901],{},"- **State:** Pinia\n",[261,8903,8904],{"class":263,"line":1699},[261,8905,295],{"emptyLinePlaceholder":32},[261,8907,8908],{"class":263,"line":1711},[261,8909,8910],{},"## 📝 Available Scripts\n",[261,8912,8913],{"class":263,"line":1716},[261,8914,295],{"emptyLinePlaceholder":32},[261,8916,8917],{"class":263,"line":1721},[261,8918,8919],{},"- \\`npm run dev\\` - Start development server\n",[261,8921,8922],{"class":263,"line":1737},[261,8923,8924],{},"- \\`npm run build\\` - Build for production\n",[261,8926,8927],{"class":263,"line":1746},[261,8928,8929],{},"- \\`npm run test\\` - Run tests\n",[261,8931,8932],{"class":263,"line":1769},[261,8933,295],{"emptyLinePlaceholder":32},[261,8935,8936],{"class":263,"line":1774},[261,8937,8938],{},"## 🤝 Contributing\n",[261,8940,8941],{"class":263,"line":3392},[261,8942,295],{"emptyLinePlaceholder":32},[261,8944,8945],{"class":263,"line":3397},[261,8946,8947],{},"1. Fork the repository\n",[261,8949,8950],{"class":263,"line":3427},[261,8951,8952],{},"2. Create your feature branch\n",[261,8954,8955],{"class":263,"line":3434},[261,8956,8957],{},"3. Commit your changes\n",[261,8959,8960],{"class":263,"line":3453},[261,8961,8962],{},"4. Push to the branch\n",[261,8964,8965],{"class":263,"line":3463},[261,8966,8967],{},"5. Open a Pull Request\n",[261,8969,8970],{"class":263,"line":3477},[261,8971,295],{"emptyLinePlaceholder":32},[261,8973,8974],{"class":263,"line":3492},[261,8975,8976],{},"## 📄 License\n",[261,8978,8979],{"class":263,"line":3498},[261,8980,295],{"emptyLinePlaceholder":32},[261,8982,8983],{"class":263,"line":3516},[261,8984,8985],{},"MIT\n",[220,8987,8989],{"id":8988},"code-documentation","Code Documentation",[252,8991,8993],{"className":1350,"code":8992,"language":1352,"meta":15,"style":15},"/**\n * Fetches user data from the API\n * @param userId - The unique identifier for the user\n * @returns Promise containing user data\n * @throws {Error} If user is not found or network request fails\n * @example\n * ```ts\n * const user = await fetchUser('123');\n * console.log(user.name);\n * ```\n */\nasync function fetchUser(userId: string): Promise\u003CUser> {\n  // Implementation\n}\n",[258,8994,8995,9000,9005,9019,9029,9042,9049,9054,9059,9064,9069,9074,9108,9113],{"__ignoreMap":15},[261,8996,8997],{"class":263,"line":264},[261,8998,8999],{"class":267},"/**\n",[261,9001,9002],{"class":263,"line":26},[261,9003,9004],{"class":267}," * Fetches user data from the API\n",[261,9006,9007,9010,9013,9016],{"class":263,"line":292},[261,9008,9009],{"class":267}," * ",[261,9011,9012],{"class":273},"@param",[261,9014,9015],{"class":288}," userId",[261,9017,9018],{"class":267}," - The unique identifier for the user\n",[261,9020,9021,9023,9026],{"class":263,"line":298},[261,9022,9009],{"class":267},[261,9024,9025],{"class":273},"@returns",[261,9027,9028],{"class":267}," Promise containing user data\n",[261,9030,9031,9033,9036,9039],{"class":263,"line":304},[261,9032,9009],{"class":267},[261,9034,9035],{"class":273},"@throws",[261,9037,9038],{"class":284}," {Error}",[261,9040,9041],{"class":267}," If user is not found or network request fails\n",[261,9043,9044,9046],{"class":263,"line":310},[261,9045,9009],{"class":267},[261,9047,9048],{"class":273},"@example\n",[261,9050,9051],{"class":263,"line":453},[261,9052,9053],{"class":267}," * ```ts\n",[261,9055,9056],{"class":263,"line":458},[261,9057,9058],{"class":267}," * const user = await fetchUser('123');\n",[261,9060,9061],{"class":263,"line":464},[261,9062,9063],{"class":267}," * console.log(user.name);\n",[261,9065,9066],{"class":263,"line":473},[261,9067,9068],{"class":267}," * ```\n",[261,9070,9071],{"class":263,"line":489},[261,9072,9073],{"class":267}," */\n",[261,9075,9076,9078,9080,9083,9085,9088,9090,9092,9095,9097,9100,9102,9105],{"class":263,"line":512},[261,9077,888],{"class":273},[261,9079,891],{"class":273},[261,9081,9082],{"class":284}," fetchUser",[261,9084,922],{"class":288},[261,9086,9087],{"class":1412},"userId",[261,9089,1861],{"class":273},[261,9091,1864],{"class":277},[261,9093,9094],{"class":288},")",[261,9096,1861],{"class":273},[261,9098,9099],{"class":284}," Promise",[261,9101,384],{"class":288},[261,9103,9104],{"class":284},"User",[261,9106,9107],{"class":288},"> {\n",[261,9109,9110],{"class":263,"line":518},[261,9111,9112],{"class":267},"  // Implementation\n",[261,9114,9115],{"class":263,"line":528},[261,9116,874],{"class":288},[206,9118,9120],{"id":9119},"task-management","Task Management",[220,9122,9124],{"id":9123},"todo-system-in-code","TODO System in Code",[252,9126,9128],{"className":1350,"code":9127,"language":1352,"meta":15,"style":15},"// TODO: Implement error handling\n// FIXME: This breaks when user is null\n// HACK: Temporary solution until API is fixed\n// NOTE: This logic matches the mobile app\n// OPTIMIZE: Consider caching this result\n\n// With VS Code extension, these are highlighted!\n",[258,9129,9130,9135,9140,9145,9150,9155,9159],{"__ignoreMap":15},[261,9131,9132],{"class":263,"line":264},[261,9133,9134],{"class":267},"// TODO: Implement error handling\n",[261,9136,9137],{"class":263,"line":26},[261,9138,9139],{"class":267},"// FIXME: This breaks when user is null\n",[261,9141,9142],{"class":263,"line":292},[261,9143,9144],{"class":267},"// HACK: Temporary solution until API is fixed\n",[261,9146,9147],{"class":263,"line":298},[261,9148,9149],{"class":267},"// NOTE: This logic matches the mobile app\n",[261,9151,9152],{"class":263,"line":304},[261,9153,9154],{"class":267},"// OPTIMIZE: Consider caching this result\n",[261,9156,9157],{"class":263,"line":310},[261,9158,295],{"emptyLinePlaceholder":32},[261,9160,9161],{"class":263,"line":453},[261,9162,9163],{"class":267},"// With VS Code extension, these are highlighted!\n",[220,9165,9167],{"id":9166},"project-task-management","Project Task Management",[17,9169,9170],{},"I use a combination of:",[354,9172,9173,9179,9185],{},[242,9174,9175,9178],{},[227,9176,9177],{},"GitHub Issues"," - For project-level tasks",[242,9180,9181,9184],{},[227,9182,9183],{},"TODO.md"," in project root - For quick notes",[242,9186,9187,9190],{},[227,9188,9189],{},"Code comments"," - For inline reminders",[252,9192,9194],{"className":715,"code":9193,"language":717,"meta":15,"style":15},"\u003C!-- TODO.md -->\n# TODO\n\n## High Priority\n- [ ] Fix authentication bug\n- [ ] Add error boundaries\n- [ ] Write tests for API layer\n\n## Medium Priority\n- [ ] Refactor user service\n- [ ] Update documentation\n- [ ] Optimize image loading\n\n## Low Priority\n- [ ] Add dark mode\n- [ ] Improve accessibility\n- [ ] Add animations\n\n## Done ✅\n- [x] Set up CI/CD\n- [x] Configure ESLint\n",[258,9195,9196,9201,9206,9210,9215,9220,9225,9230,9234,9239,9244,9249,9254,9258,9263,9268,9273,9278,9282,9287,9292],{"__ignoreMap":15},[261,9197,9198],{"class":263,"line":264},[261,9199,9200],{},"\u003C!-- TODO.md -->\n",[261,9202,9203],{"class":263,"line":26},[261,9204,9205],{},"# TODO\n",[261,9207,9208],{"class":263,"line":292},[261,9209,295],{"emptyLinePlaceholder":32},[261,9211,9212],{"class":263,"line":298},[261,9213,9214],{},"## High Priority\n",[261,9216,9217],{"class":263,"line":304},[261,9218,9219],{},"- [ ] Fix authentication bug\n",[261,9221,9222],{"class":263,"line":310},[261,9223,9224],{},"- [ ] Add error boundaries\n",[261,9226,9227],{"class":263,"line":453},[261,9228,9229],{},"- [ ] Write tests for API layer\n",[261,9231,9232],{"class":263,"line":458},[261,9233,295],{"emptyLinePlaceholder":32},[261,9235,9236],{"class":263,"line":464},[261,9237,9238],{},"## Medium Priority\n",[261,9240,9241],{"class":263,"line":473},[261,9242,9243],{},"- [ ] Refactor user service\n",[261,9245,9246],{"class":263,"line":489},[261,9247,9248],{},"- [ ] Update documentation\n",[261,9250,9251],{"class":263,"line":512},[261,9252,9253],{},"- [ ] Optimize image loading\n",[261,9255,9256],{"class":263,"line":518},[261,9257,295],{"emptyLinePlaceholder":32},[261,9259,9260],{"class":263,"line":528},[261,9261,9262],{},"## Low Priority\n",[261,9264,9265],{"class":263,"line":537},[261,9266,9267],{},"- [ ] Add dark mode\n",[261,9269,9270],{"class":263,"line":1249},[261,9271,9272],{},"- [ ] Improve accessibility\n",[261,9274,9275],{"class":263,"line":1254},[261,9276,9277],{},"- [ ] Add animations\n",[261,9279,9280],{"class":263,"line":1259},[261,9281,295],{"emptyLinePlaceholder":32},[261,9283,9284],{"class":263,"line":1264},[261,9285,9286],{},"## Done ✅\n",[261,9288,9289],{"class":263,"line":1270},[261,9290,9291],{},"- [x] Set up CI/CD\n",[261,9293,9294],{"class":263,"line":1276},[261,9295,9296],{},"- [x] Configure ESLint\n",[206,9298,9300],{"id":9299},"environment-variables-management","Environment Variables Management",[220,9302,9304],{"id":9303},"env-structure",".env Structure",[252,9306,9308],{"className":580,"code":9307,"language":582,"meta":15,"style":15},"# .env.example (committed to repo)\n# Database\nDATABASE_URL=postgresql://localhost:5432/myapp\n\n# API Keys (get from dashboard)\nAPI_KEY=your_api_key_here\nSECRET_KEY=your_secret_key_here\n\n# App Config\nNODE_ENV=development\nPORT=3000\n",[258,9309,9310,9315,9320,9330,9334,9339,9349,9359,9363,9368,9378],{"__ignoreMap":15},[261,9311,9312],{"class":263,"line":264},[261,9313,9314],{"class":267},"# .env.example (committed to repo)\n",[261,9316,9317],{"class":263,"line":26},[261,9318,9319],{"class":267},"# Database\n",[261,9321,9322,9325,9327],{"class":263,"line":292},[261,9323,9324],{"class":288},"DATABASE_URL",[261,9326,404],{"class":273},[261,9328,9329],{"class":407},"postgresql://localhost:5432/myapp\n",[261,9331,9332],{"class":263,"line":298},[261,9333,295],{"emptyLinePlaceholder":32},[261,9335,9336],{"class":263,"line":304},[261,9337,9338],{"class":267},"# API Keys (get from dashboard)\n",[261,9340,9341,9344,9346],{"class":263,"line":310},[261,9342,9343],{"class":288},"API_KEY",[261,9345,404],{"class":273},[261,9347,9348],{"class":407},"your_api_key_here\n",[261,9350,9351,9354,9356],{"class":263,"line":453},[261,9352,9353],{"class":288},"SECRET_KEY",[261,9355,404],{"class":273},[261,9357,9358],{"class":407},"your_secret_key_here\n",[261,9360,9361],{"class":263,"line":458},[261,9362,295],{"emptyLinePlaceholder":32},[261,9364,9365],{"class":263,"line":464},[261,9366,9367],{"class":267},"# App Config\n",[261,9369,9370,9373,9375],{"class":263,"line":473},[261,9371,9372],{"class":288},"NODE_ENV",[261,9374,404],{"class":273},[261,9376,9377],{"class":407},"development\n",[261,9379,9380,9383,9385],{"class":263,"line":489},[261,9381,9382],{"class":288},"PORT",[261,9384,404],{"class":273},[261,9386,9387],{"class":407},"3000\n",[252,9389,9391],{"className":580,"code":9390,"language":582,"meta":15,"style":15},"# .env (not committed, in .gitignore)\nDATABASE_URL=postgresql://localhost:5432/myapp_dev\nAPI_KEY=actual_api_key_123abc\nSECRET_KEY=actual_secret_xyz789\nNODE_ENV=development\nPORT=3000\n",[258,9392,9393,9398,9407,9416,9425,9433],{"__ignoreMap":15},[261,9394,9395],{"class":263,"line":264},[261,9396,9397],{"class":267},"# .env (not committed, in .gitignore)\n",[261,9399,9400,9402,9404],{"class":263,"line":26},[261,9401,9324],{"class":288},[261,9403,404],{"class":273},[261,9405,9406],{"class":407},"postgresql://localhost:5432/myapp_dev\n",[261,9408,9409,9411,9413],{"class":263,"line":292},[261,9410,9343],{"class":288},[261,9412,404],{"class":273},[261,9414,9415],{"class":407},"actual_api_key_123abc\n",[261,9417,9418,9420,9422],{"class":263,"line":298},[261,9419,9353],{"class":288},[261,9421,404],{"class":273},[261,9423,9424],{"class":407},"actual_secret_xyz789\n",[261,9426,9427,9429,9431],{"class":263,"line":304},[261,9428,9372],{"class":288},[261,9430,404],{"class":273},[261,9432,9377],{"class":407},[261,9434,9435,9437,9439],{"class":263,"line":310},[261,9436,9382],{"class":288},[261,9438,404],{"class":273},[261,9440,9387],{"class":407},[220,9442,9444],{"id":9443},"type-safe-environment-variables","Type-Safe Environment Variables",[252,9446,9448],{"className":1350,"code":9447,"language":1352,"meta":15,"style":15},"// ~/env.ts\nexport const env = {\n  API_KEY: process.env.API_KEY!,\n  DATABASE_URL: process.env.DATABASE_URL!,\n  NODE_ENV: process.env.NODE_ENV as 'development' | 'production',\n} as const;\n\n// Validate at startup\nObject.entries(env).forEach(([key, value]) => {\n  if (!value) {\n    throw new Error(`Missing environment variable: ${key}`);\n  }\n});\n",[258,9449,9450,9455,9468,9479,9490,9509,9520,9524,9529,9559,9571,9591,9595],{"__ignoreMap":15},[261,9451,9452],{"class":263,"line":264},[261,9453,9454],{"class":267},"// ~/env.ts\n",[261,9456,9457,9459,9461,9464,9466],{"class":263,"line":26},[261,9458,1399],{"class":273},[261,9460,3037],{"class":273},[261,9462,9463],{"class":277}," env",[261,9465,281],{"class":273},[261,9467,903],{"class":288},[261,9469,9470,9473,9475,9477],{"class":263,"line":292},[261,9471,9472],{"class":288},"  API_KEY: process.env.",[261,9474,9343],{"class":277},[261,9476,1514],{"class":273},[261,9478,1489],{"class":288},[261,9480,9481,9484,9486,9488],{"class":263,"line":298},[261,9482,9483],{"class":288},"  DATABASE_URL: process.env.",[261,9485,9324],{"class":277},[261,9487,1514],{"class":273},[261,9489,1489],{"class":288},[261,9491,9492,9495,9497,9499,9502,9504,9507],{"class":263,"line":304},[261,9493,9494],{"class":288},"  NODE_ENV: process.env.",[261,9496,9372],{"class":277},[261,9498,3099],{"class":273},[261,9500,9501],{"class":407}," 'development'",[261,9503,3001],{"class":273},[261,9505,9506],{"class":407}," 'production'",[261,9508,1489],{"class":288},[261,9510,9511,9514,9516,9518],{"class":263,"line":310},[261,9512,9513],{"class":288},"} ",[261,9515,3074],{"class":273},[261,9517,3037],{"class":273},[261,9519,1376],{"class":288},[261,9521,9522],{"class":263,"line":453},[261,9523,295],{"emptyLinePlaceholder":32},[261,9525,9526],{"class":263,"line":458},[261,9527,9528],{"class":267},"// Validate at startup\n",[261,9530,9531,9534,9537,9540,9543,9546,9549,9551,9553,9555,9557],{"class":263,"line":464},[261,9532,9533],{"class":288},"Object.",[261,9535,9536],{"class":284},"entries",[261,9538,9539],{"class":288},"(env).",[261,9541,9542],{"class":284},"forEach",[261,9544,9545],{"class":288},"(([",[261,9547,9548],{"class":1412},"key",[261,9550,1416],{"class":288},[261,9552,2250],{"class":1412},[261,9554,3212],{"class":288},[261,9556,3063],{"class":273},[261,9558,903],{"class":288},[261,9560,9561,9564,9566,9568],{"class":263,"line":473},[261,9562,9563],{"class":273},"  if",[261,9565,1511],{"class":288},[261,9567,1514],{"class":273},[261,9569,9570],{"class":288},"value) {\n",[261,9572,9573,9576,9578,9580,9582,9585,9587,9589],{"class":263,"line":489},[261,9574,9575],{"class":273},"    throw",[261,9577,1964],{"class":273},[261,9579,1967],{"class":284},[261,9581,922],{"class":288},[261,9583,9584],{"class":407},"`Missing environment variable: ${",[261,9586,9548],{"class":288},[261,9588,2366],{"class":407},[261,9590,928],{"class":288},[261,9592,9593],{"class":263,"line":512},[261,9594,986],{"class":288},[261,9596,9597],{"class":263,"line":518},[261,9598,3570],{"class":288},[206,9600,9602],{"id":9601},"backup-strategy","Backup Strategy",[220,9604,9606],{"id":9605},"what-i-back-up","What I Back Up",[252,9608,9610],{"className":580,"code":9609,"language":582,"meta":15,"style":15},"# Daily automated backups\n~/Development/personal     # Personal projects\n~/Development/work         # Work projects\n~/.zshrc                   # Shell config\n~/.gitconfig               # Git config\n~/.ssh                     # SSH keys (encrypted)\n\n# Weekly backups\n~/Documents\n~/Desktop\n",[258,9611,9612,9617,9628,9638,9648,9658,9668,9672,9677,9684],{"__ignoreMap":15},[261,9613,9614],{"class":263,"line":264},[261,9615,9616],{"class":267},"# Daily automated backups\n",[261,9618,9619,9622,9625],{"class":263,"line":26},[261,9620,9621],{"class":273},"~",[261,9623,9624],{"class":288},"/Development/personal     ",[261,9626,9627],{"class":267},"# Personal projects\n",[261,9629,9630,9632,9635],{"class":263,"line":292},[261,9631,9621],{"class":273},[261,9633,9634],{"class":288},"/Development/work         ",[261,9636,9637],{"class":267},"# Work projects\n",[261,9639,9640,9642,9645],{"class":263,"line":298},[261,9641,9621],{"class":273},[261,9643,9644],{"class":288},"/.zshrc                   ",[261,9646,9647],{"class":267},"# Shell config\n",[261,9649,9650,9652,9655],{"class":263,"line":304},[261,9651,9621],{"class":273},[261,9653,9654],{"class":288},"/.gitconfig               ",[261,9656,9657],{"class":267},"# Git config\n",[261,9659,9660,9662,9665],{"class":263,"line":310},[261,9661,9621],{"class":273},[261,9663,9664],{"class":288},"/.ssh                     ",[261,9666,9667],{"class":267},"# SSH keys (encrypted)\n",[261,9669,9670],{"class":263,"line":453},[261,9671,295],{"emptyLinePlaceholder":32},[261,9673,9674],{"class":263,"line":458},[261,9675,9676],{"class":267},"# Weekly backups\n",[261,9678,9679,9681],{"class":263,"line":464},[261,9680,9621],{"class":273},[261,9682,9683],{"class":288},"/Documents\n",[261,9685,9686,9688],{"class":263,"line":473},[261,9687,9621],{"class":273},[261,9689,9690],{"class":288},"/Desktop\n",[220,9692,9694],{"id":9693},"tools-i-use","Tools I Use",[239,9696,9697,9702,9708,9718],{},[242,9698,9699,9701],{},[227,9700,6788],{}," - Code versioning",[242,9703,9704,9707],{},[227,9705,9706],{},"GitHub"," - Remote backup",[242,9709,9710,9713,9714,9717],{},[227,9711,9712],{},"Time Machine"," (Mac) / ",[227,9715,9716],{},"Backblaze"," - Full system backup",[242,9719,9720,9723],{},[227,9721,9722],{},"Dotfiles repo"," - Configuration files",[206,9725,9727],{"id":9726},"daily-workflow","Daily Workflow",[220,9729,9731],{"id":9730},"morning-routine","Morning Routine",[252,9733,9735],{"className":580,"code":9734,"language":582,"meta":15,"style":15},"# 1. Start the day fresh\ncd ~/Development/work/current-project\ngit switch main\ngit pull\n\n# 2. Check what's new\ngit log --since=\"yesterday\" --oneline\n\n# 3. Start dev environment\ndocker-compose up -d\nnpm run dev\n\n# 4. Open VS Code\ncode .\n",[258,9736,9737,9742,9749,9757,9763,9767,9772,9785,9789,9794,9805,9816,9820,9825],{"__ignoreMap":15},[261,9738,9739],{"class":263,"line":264},[261,9740,9741],{"class":267},"# 1. Start the day fresh\n",[261,9743,9744,9746],{"class":263,"line":26},[261,9745,8014],{"class":277},[261,9747,9748],{"class":407}," ~/Development/work/current-project\n",[261,9750,9751,9753,9755],{"class":263,"line":292},[261,9752,594],{"class":284},[261,9754,4361],{"class":407},[261,9756,4384],{"class":407},[261,9758,9759,9761],{"class":263,"line":298},[261,9760,594],{"class":284},[261,9762,5367],{"class":407},[261,9764,9765],{"class":263,"line":304},[261,9766,295],{"emptyLinePlaceholder":32},[261,9768,9769],{"class":263,"line":310},[261,9770,9771],{"class":267},"# 2. Check what's new\n",[261,9773,9774,9776,9778,9780,9783],{"class":263,"line":453},[261,9775,594],{"class":284},[261,9777,4618],{"class":407},[261,9779,5844],{"class":277},[261,9781,9782],{"class":407},"\"yesterday\"",[261,9784,5745],{"class":277},[261,9786,9787],{"class":263,"line":458},[261,9788,295],{"emptyLinePlaceholder":32},[261,9790,9791],{"class":263,"line":464},[261,9792,9793],{"class":267},"# 3. Start dev environment\n",[261,9795,9796,9799,9802],{"class":263,"line":473},[261,9797,9798],{"class":284},"docker-compose",[261,9800,9801],{"class":407}," up",[261,9803,9804],{"class":277}," -d\n",[261,9806,9807,9810,9813],{"class":263,"line":489},[261,9808,9809],{"class":284},"npm",[261,9811,9812],{"class":407}," run",[261,9814,9815],{"class":407}," dev\n",[261,9817,9818],{"class":263,"line":512},[261,9819,295],{"emptyLinePlaceholder":32},[261,9821,9822],{"class":263,"line":518},[261,9823,9824],{"class":267},"# 4. Open VS Code\n",[261,9826,9827,9829],{"class":263,"line":528},[261,9828,258],{"class":284},[261,9830,4818],{"class":407},[220,9832,9834],{"id":9833},"end-of-day","End of Day",[252,9836,9838],{"className":580,"code":9837,"language":582,"meta":15,"style":15},"# 1. Commit work\ngit add .\ngit commit -m \"wip: feature progress\"\n\n# 2. Push to remote (safety net)\ngit push\n\n# 3. Close dev environment\ndocker-compose down\n\n# 4. Close all terminals and tabs\n",[258,9839,9840,9845,9853,9864,9868,9873,9879,9883,9888,9895,9899],{"__ignoreMap":15},[261,9841,9842],{"class":263,"line":264},[261,9843,9844],{"class":267},"# 1. Commit work\n",[261,9846,9847,9849,9851],{"class":263,"line":26},[261,9848,594],{"class":284},[261,9850,5532],{"class":407},[261,9852,4818],{"class":407},[261,9854,9855,9857,9859,9861],{"class":263,"line":292},[261,9856,594],{"class":284},[261,9858,597],{"class":407},[261,9860,600],{"class":277},[261,9862,9863],{"class":407}," \"wip: feature progress\"\n",[261,9865,9866],{"class":263,"line":298},[261,9867,295],{"emptyLinePlaceholder":32},[261,9869,9870],{"class":263,"line":304},[261,9871,9872],{"class":267},"# 2. Push to remote (safety net)\n",[261,9874,9875,9877],{"class":263,"line":310},[261,9876,594],{"class":284},[261,9878,4709],{"class":407},[261,9880,9881],{"class":263,"line":453},[261,9882,295],{"emptyLinePlaceholder":32},[261,9884,9885],{"class":263,"line":458},[261,9886,9887],{"class":267},"# 3. Close dev environment\n",[261,9889,9890,9892],{"class":263,"line":464},[261,9891,9798],{"class":284},[261,9893,9894],{"class":407}," down\n",[261,9896,9897],{"class":263,"line":473},[261,9898,295],{"emptyLinePlaceholder":32},[261,9900,9901],{"class":263,"line":489},[261,9902,9903],{"class":267},"# 4. Close all terminals and tabs\n",[206,9905,9907],{"id":9906},"the-results","The Results",[17,9909,9910],{},"Since optimizing my environment:",[239,9912,9913,9919,9925,9931,9937],{},[242,9914,9915,9918],{},[227,9916,9917],{},"50% faster"," at starting new projects",[242,9920,9921,9924],{},[227,9922,9923],{},"Fewer mistakes"," thanks to linting and formatting",[242,9926,9927,9930],{},[227,9928,9929],{},"Better focus"," with organized files and tabs",[242,9932,9933,9936],{},[227,9934,9935],{},"Less stress"," knowing everything is backed up",[242,9938,9939,9942],{},[227,9940,9941],{},"More enjoyment"," coding with a smooth workflow",[206,9944,994],{"id":993},[17,9946,9947],{},"Your development environment is your workshop. Invest time in setting it up right, and you'll reap the benefits every single day you code.",[17,9949,9950],{},"Start small—pick one area from this guide and improve it this week. Next week, tackle another. Before you know it, you'll have a development environment that feels like home.",[17,9952,9953,3953],{},[227,9954,9955],{},"Your future productive self will thank you!",[220,9957,9959],{"id":9958},"quick-wins-to-start-today","Quick Wins to Start Today",[354,9961,9962,9965,9968,9971,9974],{},[242,9963,9964],{},"Install 3 essential VS Code extensions",[242,9966,9967],{},"Set up auto-save and format-on-save",[242,9969,9970],{},"Create one useful terminal alias",[242,9972,9973],{},"Organize your projects folder",[242,9975,9976],{},"Set up a proper .gitignore",[17,9978,9979],{},"Small improvements compound into massive productivity gains over time.",[1017,9981,9982],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}",{"title":15,"searchDepth":26,"depth":26,"links":9984},[9985,9986,9991,9995,9999,10003,10008,10012,10016,10020,10024,10028,10032,10033],{"id":208,"depth":26,"text":209},{"id":6816,"depth":26,"text":6817,"children":9987},[9988,9989,9990],{"id":6820,"depth":292,"text":6821},{"id":7045,"depth":292,"text":7046},{"id":7337,"depth":292,"text":7338},{"id":7476,"depth":26,"text":7477,"children":9992},[9993,9994],{"id":7480,"depth":292,"text":7481},{"id":7509,"depth":292,"text":7510},{"id":7519,"depth":26,"text":7520,"children":9996},[9997,9998],{"id":7523,"depth":292,"text":7524},{"id":7975,"depth":292,"text":7976},{"id":8222,"depth":26,"text":8223,"children":10000},[10001,10002],{"id":8226,"depth":292,"text":6821},{"id":8284,"depth":292,"text":8285},{"id":8355,"depth":26,"text":8356,"children":10004},[10005,10006,10007],{"id":8359,"depth":292,"text":8360},{"id":8369,"depth":292,"text":8370},{"id":8379,"depth":292,"text":8380},{"id":8515,"depth":26,"text":8516,"children":10009},[10010,10011],{"id":8519,"depth":292,"text":8520},{"id":8636,"depth":292,"text":8637},{"id":8742,"depth":26,"text":8743,"children":10013},[10014,10015],{"id":8746,"depth":292,"text":8747},{"id":8988,"depth":292,"text":8989},{"id":9119,"depth":26,"text":9120,"children":10017},[10018,10019],{"id":9123,"depth":292,"text":9124},{"id":9166,"depth":292,"text":9167},{"id":9299,"depth":26,"text":9300,"children":10021},[10022,10023],{"id":9303,"depth":292,"text":9304},{"id":9443,"depth":292,"text":9444},{"id":9601,"depth":26,"text":9602,"children":10025},[10026,10027],{"id":9605,"depth":292,"text":9606},{"id":9693,"depth":292,"text":9694},{"id":9726,"depth":26,"text":9727,"children":10029},[10030,10031],{"id":9730,"depth":292,"text":9731},{"id":9833,"depth":292,"text":9834},{"id":9906,"depth":26,"text":9907},{"id":993,"depth":26,"text":994,"children":10034},[10035],{"id":9958,"depth":292,"text":9959},"Od chaotycznego biurka do uproszczonego workflowy — oto jak ustawiłem swoje środowisko programistyczne, aby zminimalizować szum i zmaksymalizować fokus.",{},"/pl/articles/organize-dev-environment-for-productivity","10",{"title":6795,"description":10036},{"loc":10038},"pl/articles/organize-dev-environment-for-productivity",[10044,10045,10046,6790],"Produktywność","Development Setup","Narzędzia","9pJsj--6UX3xQqpYazoPKioQwilwNOvD0bBGpdoB5J4",1785840165285]