[{"data":1,"prerenderedAt":270},["ShallowReactive",2],{"post-naming-things-so-future-you-survives":3,"blog-posts":14},{"_path":4,"title":5,"description":6,"date":7,"tags":8,"readingTime":12,"body":13},"\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",[9,10,11],"javascript","best-practices","maintainability",5,"# Naming Things So Future You Survives\n\nNaming is the daily tax of programming. Good names shrink the need for comments and make refactors safer. Bad names turn every file into archaeology.\n\n## Name after meaning, not after mechanics\n\nA name should say what a value represents in the domain, not how you happened to compute it. `filteredPosts` is weaker than `publishedPosts` if the filter’s intent is publication state. `data` and `info` are almost always a stall—push one noun further.\n\nHelpful questions:\n\n- What would a teammate call this in a sentence?\n- Is the boolean named for the true case (`isOpen`, `hasError`)?\n- Does the list name pluralize the item (`tags`, not `tagList` unless you need the distinction)?\n- Are units visible where they matter (`timeoutMs`, `maxSizeBytes`)?\n\nAvoid encoding types into names (`strName`, `arrUsers`) unless you are in an untyped context where it prevents real confusion. Prefer clear nouns and let the type system—or nearby code—carry structure.\n\nBe careful with humor and memes in identifiers. `yeetUser` is funny until it appears in a stack trace during an incident. Reserve personality for commit messages or UI copy if you need it; keep code vocabulary dull and precise.\n\nAbbreviations are a tax. `btn`, `msg`, and `ctx` are fine in tiny scopes; as exports they force every reader to expand them. If an abbreviation is standard in your domain (`url`, `id`, `html`), use it consistently. If it is only standard in your head, spell it out.\n\n## Keep a small, consistent vocabulary\n\nProjects drift when the same concept collects synonyms. If you call it a “paste” in the UI, do not call the same entity `snippet`, `blob`, and `document` across modules without a reason.\n\nBuild a lightweight glossary for the repo’s core nouns—even five entries help:\n\n- What is a Post vs a Page?\n- What is an App vs a Tool?\n- What is transient client state vs persisted settings?\n\nReuse those words in component names, route segments, analytics events, and test descriptions. Consistency lets people predict where code lives. `PasteBin.vue` beside a store field named `snippetText` is a tiny tax that compounds.\n\nWhen you rename a concept, rename it everywhere you can in one pass—or alias briefly with a comment that the alias is temporary. Half-migrations (`User` in new code, `Account` in old) are how bugs hide in mapping layers.\n\nShared language also helps non-code surfaces: support replies, blog posts about the feature, and commit subjects. When everyone says “paste,” search works. When half the team says “bin entry,” you maintain a thesaurus instead of a product.\n\n## Choose names that age through change\n\nOverly specific names go stale. `fetchPostsFromBlogJson` becomes a lie when the source changes. Prefer stability at the boundary (`loadPosts`) and keep source details inside the function body or a private helper.\n\nConversely, vague names rot in the other direction. `Manager`, `Helper`, `Util`, and `Handler` dump responsibilities into junk drawers. If you need a util, name the capability: `formatDate`, `parseExportZip`, `clamp`. Files named `helpers.js` attract every leftover function until nobody dares open them.\n\nComponent naming benefits from the same pressure. Prefer `BlogCard` over `Card2`. Prefer `ThemeToggle` over `Toggle`. If two components share a shape, name the difference that matters to readers—`AppCard` vs `BlogCard`—instead of numbering.\n\nFor booleans and state enums, prefer positive forms and exhaustive sets. `isDisabled` nested under double negatives (`if (!isDisabled)`) creates mental debt. `status: 'idle' | 'pending' | 'error'` often beats a pile of loosely related flags.\n\n## Rename early, document only what names cannot\n\nIf a name bothers you during a change, rename it while the context is fresh—especially before merging. Fear of updating imports keeps wrong names immortal. Modern editors make renames cheap; living with `temp2` is expensive.\n\nComments should explain why, not restate the name. `\u002F\u002F get posts` above `getPosts()` is noise. `\u002F\u002F Cloudflare Pages serves this with a trailing slash; keep paths consistent` is signal. When you need a comment to decode an identifier, the identifier usually failed first.\n\nTests are a second naming surface. `it('returns null when slug is missing')` documents behavior better than `it('works')`. Matching domain words between implementation and tests makes failures readable in CI.\n\nAllow short names in tiny scopes: loop indices, very local coordinates, brief callbacks. Length should scale with distance—the farther a name travels (exported APIs, shared components), the more precise it should be.\n\nEvent names and analytics keys deserve the same care. `click_stuff` helps no one in a dashboard three months later. Prefer stable, human phrases you would still understand without the codebase open: `blog_post_share_clicked`, `paste_created`, `theme_toggled`. Those strings become part of your product history—name them like it.\n\n## Wrap-up\n\nNames that survive are meaningful, consistent, stable at boundaries, and cheap to correct. Spend a few extra seconds choosing words you would still accept in a year. Future you will not remember the joke—but they will remember whether the codebase felt navigable.",[15,24,34,43,50,58,65,73,80,87,94,101,108,115,121,129,135,143,152,160,166,173,179,187,195,202,208,214,221,227,233,239,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":33},"\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,32],"gadgets","hardware","productivity",4,{"_path":35,"title":36,"description":37,"date":38,"tags":39,"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",[40,41,42],"accessibility","css","design",{"_path":44,"title":45,"description":46,"date":47,"tags":48,"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,49,32],"storage",{"_path":51,"title":52,"description":53,"date":54,"tags":55,"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,56,57],"audio","habits",{"_path":59,"title":60,"description":61,"date":62,"tags":63,"readingTime":33},"\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,32,64],"workspace",{"_path":66,"title":67,"description":68,"date":69,"tags":70,"readingTime":33},"\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",[71,57,72],"gaming","indie",{"_path":74,"title":75,"description":76,"date":77,"tags":78,"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,79,57],"mobile",{"_path":81,"title":82,"description":83,"date":84,"tags":85,"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",[32,86,57],"side-projects",{"_path":88,"title":89,"description":90,"date":91,"tags":92,"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",[40,93,22],"html",{"_path":95,"title":96,"description":97,"date":98,"tags":99,"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",[100,9,22],"vue",{"_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,42],"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",[71,72,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",[100,22,10],{"_path":122,"title":123,"description":124,"date":125,"tags":126,"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",[127,22,128],"performance","web",{"_path":130,"title":131,"description":132,"date":133,"tags":134,"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",[41,22,42],{"_path":136,"title":137,"description":138,"date":139,"tags":140,"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",[71,141,142],"cloud-gaming","tech",{"_path":144,"title":145,"description":146,"date":147,"tags":148,"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",[149,150,151],"nuxt","ssg","devops",{"_path":153,"title":154,"description":155,"date":156,"tags":157,"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",[9,158,159],"devtools","debugging",{"_path":161,"title":162,"description":163,"date":164,"tags":165,"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",[9,10,22],{"_path":167,"title":168,"description":169,"date":170,"tags":171,"readingTime":33},"\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",[71,57,172],"wellness",{"_path":174,"title":175,"description":176,"date":177,"tags":178,"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",[93,127,22],{"_path":180,"title":181,"description":182,"date":183,"tags":184,"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",[185,186,32],"git","workflow",{"_path":188,"title":189,"description":190,"date":191,"tags":192,"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",[71,193,194],"streaming","content",{"_path":196,"title":197,"description":198,"date":199,"tags":200,"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",[201,100,22],"typescript",{"_path":203,"title":204,"description":205,"date":206,"tags":207,"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",[149,151,22],{"_path":209,"title":210,"description":211,"date":212,"tags":213,"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",[32,22,10],{"_path":215,"title":216,"description":217,"date":218,"tags":219,"readingTime":33},"\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",[71,220,57],"co-op",{"_path":222,"title":223,"description":224,"date":225,"tags":226,"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",[93,40,22],{"_path":228,"title":229,"description":230,"date":231,"tags":232,"readingTime":12},"\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",[185,186,32],{"_path":234,"title":235,"description":236,"date":237,"tags":238,"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,42],{"_path":4,"title":5,"description":6,"date":7,"tags":240,"readingTime":12},[9,10,11],{"_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",[71,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,42],"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,57],"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",[93,22,269],"architecture",1784620505227]