[{"data":1,"prerenderedAt":270},["ShallowReactive",2],{"post-git-without-the-jargon":3,"blog-posts":14},{"_path":4,"title":5,"description":6,"date":7,"tags":8,"readingTime":12,"body":13},"\u002Fblog\u002Fgit-without-the-jargon\u002F","Learning Git Without the Jargon","A plain-language mental model for commits, branches, and merges when tutorials assume you already know Git.","2025-05-14",[9,10,11],"git","workflow","productivity",5,"# Learning Git Without the Jargon\n\nGit tutorials often jump straight to rebasing and detached HEADs. A simpler mental model is enough to collaborate safely—and to stop feeling lost every time someone says “just push your branch.”\n\n## Three ideas to start\n\n1. **Commits** — saved snapshots of your project with a message explaining why\n2. **Branches** — parallel timelines for a feature or fix without breaking the main line\n3. **Remote** — the shared copy on GitHub (or similar) your team pulls from and pushes to\n\nEverything else is a variation on those three. You do not need to memorize every subcommand before your first useful week with git. You need to know what a snapshot is, how to work on a side timeline, and how to sync with the shared copy.\n\nThink of commits like save points in a game: you can return to them, compare them, and share them. The message is the note you leave for future players—including you next month. A vague message like “updates” is a save point with no label on the map.\n\nBranches are not scary forks of reality; they are named lines of saves. `main` (or `master`) is the line you treat as stable. `fix-header` is a temporary line where you try work until it is ready to join `main`. If the experiment fails, you delete the branch and `main` never had to suffer.\n\nThe remote is the backup and the meeting point. Your laptop has a local copy; GitHub has another. `pull` brings remote commits to you. `push` sends your commits to the remote. Most “git is confusing” moments are really “which copy am I looking at?” moments. Asking that question out loud clears a lot of fog.\n\n## A safe daily loop\n\n```bash\ngit pull\n# make changes\ngit add .\ngit commit -m \"Describe the change in plain English\"\ngit push\n```\n\nPull before you start, commit in small logical chunks, push when a slice is ready for review or backup. That loop covers a surprising amount of professional work.\n\nWhat each step is doing in plain language:\n\n- `git pull` — get any new snapshots teammates (or you on another machine) already shared\n- edit files — normal work; git is watching but not recording yet\n- `git add` — choose which changes belong in the next snapshot (`.` means “all of them in this folder”)\n- `git commit` — freeze those changes with a message\n- `git push` — upload your new snapshots to the remote\n\nWhen you want more control, replace `git add .` with adding specific files. That keeps accidental debug logs or local config out of the snapshot. For beginners, adding everything in a clean project folder is fine—just glance at `git status` first so you know what you are including.\n\n```bash\ngit status\ngit diff\n```\n\n`status` lists what changed. `diff` shows the actual lines. Reading those two before committing is the single best habit that prevents “what did I just ship?” surprises.\n\nIf pull complains that you have local changes, you are not broken—you simply have uncommitted work. Commit or stash first, then pull. Stash is a temporary pocket: `git stash` hides your unfinished edits, `git pull` runs, `git stash pop` brings them back. Use it when you need to sync before you are ready to commit.\n\n## When merges feel scary\n\nConflicts mean two people edited the same lines. Open the file, pick the correct result (or combine both), save, then commit the resolution. It is tedious, not mystical.\n\nGit marks the conflict with visible markers in the file:\n\n```text\n\u003C\u003C\u003C\u003C\u003C\u003C\u003C HEAD\nyour version\n=======\ntheir version\n>>>>>>> branch-name\n```\n\nDelete the markers, keep the code you want, save, then:\n\n```bash\ngit add path\u002Fto\u002Ffile\ngit commit -m \"Resolve conflict in header nav\"\n```\n\nYour editor or GitHub’s UI can help, but the idea is the same: produce one sensible file, then record the snapshot that finishes the merge.\n\nMerging a branch into `main` is how finished work joins the stable line. On GitHub that often happens through a pull request: you push a branch, open a request, someone reviews, and merge creates the join commit (or squash, depending on settings). As a newcomer, prefer the default merge button your team already uses. Advanced rewriting (rebase, interactive rebase) can wait until you have a concrete pain—messy history on a long branch—and a teammate who can sit with you once.\n\nIf you feel stuck, these commands are enough to ask for help with context:\n\n```bash\ngit status\ngit branch\ngit log --oneline -5\n```\n\nThat trio tells someone whether you are mid-merge, which branch you are on, and what you recently committed.\n\n## What you can ignore for now\n\nYou can build real software for a long time without fluently using rebase, cherry-pick, reflog, or submodule. Those tools exist for recovery and history shaping. Learn them when a problem appears: “I need to move one commit,” “I need to find a deleted branch,” “this repo nests another repo.” Until then, snapshots, branches, and sync will carry you.\n\nAvoid force-pushing to shared branches. Force-push overwrites history on the remote; teammates who already pulled the old history get a mess. On your own private branch, force-push is sometimes used after a cleanup—still treat it as advanced and deliberate.\n\n## Wrap-up\n\nYou do not need every Git command on day one. Learn snapshots, branches, and sync with the remote—then add advanced moves when a real problem asks for them. The jargon gets easier once the three core ideas feel boring, and boring is exactly where you want your version control to sit.",[15,24,33,42,49,57,64,72,79,86,93,101,108,115,122,130,136,144,153,161,167,174,180,186,194,201,207,213,220,226,228,234,241,248,255,263],{"_path":16,"title":17,"description":18,"date":19,"tags":20,"readingTime":12},"\u002Fblog\u002Fclient-side-tools-that-earn-trust\u002F","Client-Side Tools That Earn Trust","How to design browser tools that feel private by default—local processing, clear data boundaries, and UX that never asks people to guess where their files go.","2026-07-20",[21,22,23],"privacy","frontend","tools",{"_path":25,"title":26,"description":27,"date":28,"tags":29,"readingTime":32},"\u002Fblog\u002Fusb-c-cables-that-actually-matter\u002F","USB-C Cables That Actually Matter","How to buy USB-C cables by wattage and data speed so you stop guessing which cord charges slowly or fails a file transfer.","2026-07-14",[30,31,11],"gadgets","hardware",4,{"_path":34,"title":35,"description":36,"date":37,"tags":38,"readingTime":12},"\u002Fblog\u002Fcolor-contrast-people-can-read\u002F","Color Contrast People Can Actually Read","Quick checks for text and UI colors that stay legible in light mode, dark mode, and on mediocre displays.","2026-07-07",[39,40,41],"accessibility","css","design",{"_path":43,"title":44,"description":45,"date":46,"tags":47,"readingTime":12},"\u002Fblog\u002Fportable-ssds-worth-carrying\u002F","Portable SSDs Worth Carrying","When a pocket SSD beats cloud sync for travel, backups, and large media—and how to pick one that stays fast and durable.","2026-06-26",[30,48,11],"storage",{"_path":50,"title":51,"description":52,"date":53,"tags":54,"readingTime":12},"\u002Fblog\u002Fwireless-earbuds-that-last-the-day\u002F","Wireless Earbuds That Last the Day","Simple charging and fit habits that stretch earbud battery life without babysitting the case every few hours.","2026-06-18",[30,55,56],"audio","habits",{"_path":58,"title":59,"description":60,"date":61,"tags":62,"readingTime":32},"\u002Fblog\u002Fwhen-a-second-monitor-helps\u002F","When a Second Monitor Actually Helps","A practical take on dual screens for coding, writing, and research—plus when a single good display is still the better desk.","2026-06-10",[30,11,63],"workspace",{"_path":65,"title":66,"description":67,"date":68,"tags":69,"readingTime":32},"\u002Fblog\u002Fshort-session-game-picks\u002F","Short-Session Games That Respect Your Evening","Genres and design patterns that fit a 30-minute window without the “one more hour” trap.","2026-06-04",[70,56,71],"gaming","indie",{"_path":73,"title":74,"description":75,"date":76,"tags":77,"readingTime":12},"\u002Fblog\u002Fphone-charging-habits-that-age-better\u002F","Phone Charging Habits That Age Better","Practical charging routines that keep a phone useful longer—without obsessing over the perfect battery percentage.","2026-05-23",[30,78,56],"mobile",{"_path":80,"title":81,"description":82,"date":83,"tags":84,"readingTime":12},"\u002Fblog\u002Ffinishing-side-projects-without-burning-out\u002F","Finishing Side Projects Without Burning Out","A practical playbook for shrinking scope, shipping thin vertical slices, and keeping personal projects fun long enough to actually launch.","2026-05-14",[11,85,56],"side-projects",{"_path":87,"title":88,"description":89,"date":90,"tags":91,"readingTime":12},"\u002Fblog\u002Faccessible-forms-people-finish\u002F","Accessible Forms That People Actually Finish","Practical accessibility checks for labels, errors, and focus so your forms work for more users.","2026-05-07",[39,92,22],"html",{"_path":94,"title":95,"description":96,"date":97,"tags":98,"readingTime":12},"\u002Fblog\u002Fvue-composition-api-patterns\u002F","Practical Vue Composition API Patterns","Reusable patterns for composables, shared state, and cleaner component logic in Vue 3.","2026-04-27",[99,100,22],"vue","javascript",{"_path":102,"title":103,"description":104,"date":105,"tags":106,"readingTime":12},"\u002Fblog\u002Fdesigning-empty-states-that-teach\u002F","Designing Empty States That Teach the Product","Empty screens are not placeholders—they are onboarding. How to write, layout, and sequence first-run UI so people know what to do next.","2026-04-19",[107,22,41],"ux",{"_path":109,"title":110,"description":111,"date":112,"tags":113,"readingTime":12},"\u002Fblog\u002Fwhy-indie-games-keep-winning\u002F","Why Indie Games Keep Winning Attention","How small teams punch above their weight with focused design, personality, and smart scope.","2026-04-13",[70,71,114],"industry",{"_path":116,"title":117,"description":118,"date":119,"tags":120,"readingTime":12},"\u002Fblog\u002Fkeeping-component-props-simple\u002F","Keeping Component Props Simple","When to split a component, when to use slots, and how to avoid prop objects that grow forever.","2026-04-03",[99,22,121],"best-practices",{"_path":123,"title":124,"description":125,"date":126,"tags":127,"readingTime":12},"\u002Fblog\u002Fcalm-frontend-performance\u002F","A Calm Approach to Frontend Performance","Performance work that sticks: measure what users feel, fix the critical path first, and avoid optimization theater on personal and portfolio sites.","2026-03-26",[128,22,129],"performance","web",{"_path":131,"title":132,"description":133,"date":134,"tags":135,"readingTime":12},"\u002Fblog\u002Fcss-layout-without-the-hacks\u002F","CSS Layout Without the Hacks","Modern Flexbox and Grid techniques that replace brittle floats, magic numbers, and overflow tricks.","2026-03-17",[40,22,41],{"_path":137,"title":138,"description":139,"date":140,"tags":141,"readingTime":12},"\u002Fblog\u002Fcloud-gaming-what-gets-in-the-way\u002F","Cloud Gaming: What Still Gets in the Way","Latency, input feel, and library lock-in—why streaming games is impressive and still uneven.","2026-03-10",[70,142,143],"cloud-gaming","tech",{"_path":145,"title":146,"description":147,"date":148,"tags":149,"readingTime":12},"\u002Fblog\u002Fshipping-static-sites-with-nuxt\u002F","Shipping Static Sites with Nuxt","How I build and deploy a Nuxt site to Cloudflare Pages with predictable routes and content.","2026-03-02",[150,151,152],"nuxt","ssg","devops",{"_path":154,"title":155,"description":156,"date":157,"tags":158,"readingTime":12},"\u002Fblog\u002Fdebugging-faster-in-the-browser\u002F","Debugging Faster in the Browser","A short toolkit of DevTools habits—breakpoints, network filters, and DOM inspection—that cut debug time.","2026-02-24",[100,159,160],"devtools","debugging",{"_path":162,"title":163,"description":164,"date":165,"tags":166,"readingTime":12},"\u002Fblog\u002Fsmall-javascript-habits-that-scale\u002F","Small JavaScript Habits That Scale","Everyday habits—naming, early returns, and clearer async flow—that keep front-end codebases maintainable.","2026-02-18",[100,121,22],{"_path":168,"title":169,"description":170,"date":171,"tags":172,"readingTime":32},"\u002Fblog\u002Fhealthier-gaming-routine\u002F","Building a Healthier Gaming Routine","Simple habits for sessions that stay fun—breaks, goals, and knowing when to stop.","2026-02-02",[70,56,173],"wellness",{"_path":175,"title":176,"description":177,"date":178,"tags":179,"readingTime":12},"\u002Fblog\u002Fresponsive-images-without-layout-shift\u002F","Responsive Images Without Layout Shift","Width, height, srcset, and lazy loading patterns that keep pages stable while images load.","2026-01-22",[92,128,22],{"_path":181,"title":182,"description":183,"date":184,"tags":185,"readingTime":12},"\u002Fblog\u002Fgit-habits-for-small-teams\u002F","Git Habits for Solo and Small Teams","Branch naming, commit messages, and PR hygiene that keep history useful without slowing you down.","2026-01-09",[9,10,11],{"_path":187,"title":188,"description":189,"date":190,"tags":191,"readingTime":12},"\u002Fblog\u002Fwhat-makes-a-game-stream-worth-watching\u002F","What Makes a Game Stream Worth Watching","Commentary, pacing, and community—why some streams click even when the gameplay is messy.","2025-12-14",[70,192,193],"streaming","content",{"_path":195,"title":196,"description":197,"date":198,"tags":199,"readingTime":12},"\u002Fblog\u002Fwhen-to-reach-for-typescript-vue\u002F","When to Reach for TypeScript on a Vue App","A pragmatic take on where TypeScript pays off in Vue—and where plain JS is still fine.","2025-11-30",[200,99,22],"typescript",{"_path":202,"title":203,"description":204,"date":205,"tags":206,"readingTime":12},"\u002Fblog\u002Fenvironment-variables-for-static-sites\u002F","Environment Variables for Static Sites","How to use build-time env vars in Nuxt and other static generators without leaking secrets or breaking CI.","2025-10-05",[150,152,22],{"_path":208,"title":209,"description":210,"date":211,"tags":212,"readingTime":12},"\u002Fblog\u002Fpicking-a-side-project-stack\u002F","Picking a Side Project Stack Without Overthinking It","How to choose tools for a personal project when the goal is shipping, not building the perfect architecture.","2025-09-18",[11,22,121],{"_path":214,"title":215,"description":216,"date":217,"tags":218,"readingTime":32},"\u002Fblog\u002Fco-op-games-for-busy-friends\u002F","Co-op Games That Work When Everyone Is Busy","Async-friendly and drop-in co-op picks for friend groups that rarely share the same free evening.","2025-08-22",[70,219,56],"co-op",{"_path":221,"title":222,"description":223,"date":224,"tags":225,"readingTime":12},"\u002Fblog\u002Fsemantic-html-still-matters\u002F","Semantic HTML Still Matters","Landmarks, headings, and native elements that make pages easier to use, style, and maintain.","2025-07-06",[92,39,22],{"_path":4,"title":5,"description":6,"date":7,"tags":227,"readingTime":12},[9,10,11],{"_path":229,"title":230,"description":231,"date":232,"tags":233,"readingTime":12},"\u002Fblog\u002Fwhy-loading-states-matter\u002F","Why Loading States Matter More Than Animations","Skeletons, disabled buttons, and honest feedback beat flashy spinners when data takes time to arrive.","2025-03-28",[107,22,41],{"_path":235,"title":236,"description":237,"date":238,"tags":239,"readingTime":12},"\u002Fblog\u002Fnaming-things-so-future-you-survives\u002F","Naming Things So Future You Survives","Practical rules for naming variables, components, and files so a codebase stays readable months after the clever jokes fade.","2025-03-10",[100,121,240],"maintainability",{"_path":242,"title":243,"description":244,"date":245,"tags":246,"readingTime":12},"\u002Fblog\u002Fsave-systems-that-respect-time\u002F","Save Systems That Respect the Player’s Time","Checkpoints, autosaves, and manual slots are design choices. How thoughtful saving reduces rage-quits without deleting tension from the game.","2025-02-28",[70,247,107],"game-design",{"_path":249,"title":250,"description":251,"date":252,"tags":253,"readingTime":12},"\u002Fblog\u002Fmicrocopy-that-makes-interfaces-human\u002F","Microcopy That Makes Interfaces Feel Human","Button labels, error lines, and helper text are product design. How to write UI words that reduce hesitation without sounding like a chatbot.","2025-01-22",[107,254,41],"writing",{"_path":256,"title":257,"description":258,"date":259,"tags":260,"readingTime":12},"\u002Fblog\u002Freadmes-that-get-projects-running\u002F","READMEs That Get Projects Running","How to write a README that helps someone—including future you—install, run, and understand a project without opening a support chat.","2024-12-18",[261,262,56],"documentation","open-source",{"_path":264,"title":265,"description":266,"date":267,"tags":268,"readingTime":12},"\u002Fblog\u002Fprogressive-enhancement-still-pays-off\u002F","Progressive Enhancement Still Pays Off","Build the core experience in HTML first, then layer CSS and JavaScript so your site stays useful when networks, scripts, or devices misbehave.","2024-11-05",[92,22,269],"architecture",1784620505210]