[{"data":1,"prerenderedAt":733},["ShallowReactive",2],{"$B3SvcJdz-H":3,"pages-links":23,"posts-links":29,"posts-search":58,"blog-why-are-go-modules-in-my-nodes-modules":129,"decks-for-why-are-go-modules-in-my-nodes-modules":728,"meta":729},{"id":4,"title":5,"author":6,"description":14,"extension":15,"meta":16,"repository":17,"stem":21,"__hash__":22},"meta\u002Fmeta.yml","bmo.dev",{"name":7,"github":8,"gitlab":9,"email":10,"linkedin":11,"mastodon":12,"bio":13},"William Little","https:\u002F\u002Fgithub.com\u002Fbmodotdev\u002F","https:\u002F\u002Fgitlab.com\u002Fbmodotdev\u002F","L29hqTSwqROvoJ8hMTI2","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fwilliam-e-little-jr\u002F","https:\u002F\u002Fdefcon.social\u002F@bmodotdev","I am a Full Stack Software & DevOps Engineer who loves building and experimenting with Software, Linux, & electronics.\n","A personal blog where I share my thoughts, projects, and anything I might find interesting or helpful.\n","yml",{},{"url":18,"git":19,"branch":20},"https:\u002F\u002Fgitlab.com\u002Fbmodotdev\u002Fbmo.dev\u002F","git@gitlab.com:bmodotdev\u002Fbmo.dev.git","main","meta","MPtcc2KHfBCBy4V4SDhZFIvjyZ_Ba4e-yDnx_Ok_KOs",[24],{"path":25,"extension":26,"title":27,"id":28},"\u002Fabout","md","About","pages\u002Fabout.md",[30,34,38,42,46,50,54],{"path":31,"extension":26,"title":32,"id":33},"\u002Fblog\u002Fconventional-commit-caveats","Conventional Commit Caveats","blog\u002Fblog\u002Fconventional-commit-caveats.md",{"path":35,"extension":26,"title":36,"id":37},"\u002Fblog\u002Fdodging-a-critical-cve-with-zta","Dodging a Critical CVE with ZTA","blog\u002Fblog\u002Fdodging-a-critical-cve-with-zta.md",{"path":39,"extension":26,"title":40,"id":41},"\u002Fblog\u002Flog4perl-mixed-screen-appender","Mixed Output Streams with Log4perl Screen Appender","blog\u002Fblog\u002Flog4perl-mixed-screen-appender.md",{"path":43,"extension":26,"title":44,"id":45},"\u002Fblog\u002Fmake-version","make version","blog\u002Fblog\u002Fmake-version.md",{"path":47,"extension":26,"title":48,"id":49},"\u002Fblog\u002Fpadding-oracle-attacks-rubiks-cow","Padding Oracle Attacks & Rubik’s Cow","blog\u002Fblog\u002Fpadding-oracle-attacks-rubiks-cow.md",{"path":51,"extension":26,"title":52,"id":53},"\u002Fblog\u002Ftracing-signals-in-linux","Tracing Signals in Linux","blog\u002Fblog\u002Ftracing-signals-in-linux.md",{"path":55,"extension":26,"title":56,"id":57},"\u002Fblog\u002Fwhy-are-go-modules-in-my-nodes-modules","Why are Go modules in my node_modules?","blog\u002Fblog\u002Fwhy-are-go-modules-in-my-nodes-modules.md",[59,69,81,90,100,108,117],{"path":55,"title":56,"description":60,"tags":61,"thumbnail":64,"created":68},"Let’s dissect this developer pattern that leads to arbitrary code execution across languages.",[62,63],"go","js",{"sm":65,"md":66,"lg":67},"\u002Fassets\u002Fdavid-mitchell-great-british-baking-show_sm.webp","\u002Fassets\u002Fdavid-mitchell-great-british-baking-show_md.webp","\u002Fassets\u002Fdavid-mitchell-great-british-baking-show_lg.webp","2026-04-07",{"path":35,"title":36,"description":70,"tags":71,"thumbnail":76,"created":80},"Let’s discuss tenets of Zero Trust Architecture, Go, gRPC, and why everyone dodged CVE-2026-33186, right?",[72,73,62,74,75],"awk","cve","grpc","zta",{"sm":77,"md":78,"lg":79},"\u002Fassets\u002Fdodging-the-flyer_sm.webp","\u002Fassets\u002Fdodging-the-flyer_md.webp","\u002Fassets\u002Fdodging-the-flyer_lg.webp","2026-04-02",{"path":47,"title":48,"description":82,"tags":83,"thumbnail":85,"created":89},"In this thought experiment, you’ll learn about cryptographic primitives, combinitorical group theory, and along the way, gain a deeper appreciation for 1999’s film, The Matrix. Oh yeah, and a Cow!",[84],"cryptography",{"sm":86,"md":87,"lg":88},"\u002Fassets\u002Fbournemouth_sm.webp","\u002Fassets\u002Fbournemouth_md.webp","\u002Fassets\u002Fbournemouth_lg.webp","2026-03-06",{"path":43,"title":44,"description":91,"tags":92,"thumbnail":95,"created":99},"Here is how I went about implementing a simple versioning system for my Go project using Conventional Commmits, awk, and make.",[72,93,62,94],"git","semver",{"sm":96,"md":97,"lg":98},"\u002Fassets\u002Flego-pieces_sm.webp","\u002Fassets\u002Flego-pieces_md.webp","\u002Fassets\u002Flego-pieces_lg.webp","2025-11-11",{"path":31,"title":32,"description":101,"tags":102,"thumbnail":103,"created":107},"The Conventional Commmits spec aims to bring structure to commit messages so that we write succint yet meaningful commits. That sounds great, but let’s examine some potential drawbacks.",[93,94],{"sm":104,"md":105,"lg":106},"\u002Fassets\u002Fgit-commit_sm.webp","\u002Fassets\u002Fgit-commit_md.webp","\u002Fassets\u002Fgit-commit_lg.webp","2025-11-07",{"path":39,"title":40,"description":109,"tags":110,"thumbnail":112,"created":116},"Log4perl provides a powerful logging framework, but how can we dynamically and meaninfully use stdout and stderr?",[111],"perl",{"sm":113,"md":114,"lg":115},"\u002Fassets\u002Fperl-latte-onion_100x100.webp","\u002Fassets\u002Fperl-latte-onion_250x250.webp","\u002Fassets\u002Fperl-latte-onion_600x600.webp","2022-02-14",{"path":51,"title":52,"description":118,"tags":119,"thumbnail":124,"created":128},"Signals, or software interrupts, are used to communicate with a process. They could be used to kill a process, restart, or signal a segmentation fault, but how can we know where that signal came from?",[120,121,122,123],"signals","systemtap","strace","linux",{"sm":125,"md":126,"lg":127},"\u002Fassets\u002Ftraffic-light_sm.webp","\u002Fassets\u002Ftraffic-light_md.webp","\u002Fassets\u002Ftraffic-light_lg.webp","2022-02-13",{"id":57,"title":56,"body":130,"created":68,"description":60,"extension":26,"meta":720,"navigation":721,"path":55,"seo":722,"stem":723,"tags":724,"thumbnail":725,"updated":726,"__hash__":727},{"type":131,"value":132,"toc":711},"minimark",[133,151,154,253,264,269,281,284,295,299,307,314,319,322,332,398,404,436,442,584,590,635,638,652,655,659,671,674,681,685,694,701,704,707],[134,135,136,144],"with-caption",{},[137,138,139],"p",{},[140,141],"img",{"alt":142,"src":67,"target":143},"David Mitchell Great British Baking Show","_blank",[145,146,148],"template",{"v-slot:caption":147},"",[137,149,150],{},"“that’s not jam, it’s strawberries and goo” - David Mitchell",[137,152,153],{},"I was upping my test coverage for a Go project when something scrolled\npast that caught my eye.",[155,156,160],"pre",{"className":157,"code":158,"language":159,"meta":147,"style":147},"language-bash shiki shiki-themes houston","$ go test --coverprofile=coverage.out .\u002F...\n[... etc ...]\nok mypacakge\u002Fcmd\u002Ffoo 0.0.33s coverage: 83.3%\nok mypackage\u002Fservice\u002Ffoo 0.053s coverage: 89.7%\n?  mypackage\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted [no test files]\nok mypackage\u002Futils\u002F 0.911s coverage: 92.4%\n[... etc ...]\n","bash",[161,162,163,185,192,210,226,232,248],"code",{"__ignoreMap":147},[164,165,168,172,176,179,182],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"stHQG","$",[164,173,175],{"class":174},"se2J0"," go",[164,177,178],{"class":174}," test",[164,180,181],{"class":174}," --coverprofile=coverage.out",[164,183,184],{"class":174}," .\u002F...\n",[164,186,188],{"class":166,"line":187},2,[164,189,191],{"class":190},"sLo_3","[... etc ...]\n",[164,193,195,198,201,204,207],{"class":166,"line":194},3,[164,196,197],{"class":170},"ok",[164,199,200],{"class":174}," mypacakge\u002Fcmd\u002Ffoo",[164,202,203],{"class":174}," 0.0.33s",[164,205,206],{"class":174}," coverage:",[164,208,209],{"class":174}," 83.3%\n",[164,211,213,215,218,221,223],{"class":166,"line":212},4,[164,214,197],{"class":170},[164,216,217],{"class":174}," mypackage\u002Fservice\u002Ffoo",[164,219,220],{"class":174}," 0.053s",[164,222,206],{"class":174},[164,224,225],{"class":174}," 89.7%\n",[164,227,229],{"class":166,"line":228},5,[164,230,231],{"class":190},"?  mypackage\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted [no test files]\n",[164,233,235,237,240,243,245],{"class":166,"line":234},6,[164,236,197],{"class":170},[164,238,239],{"class":174}," mypackage\u002Futils\u002F",[164,241,242],{"class":174}," 0.911s",[164,244,206],{"class":174},[164,246,247],{"class":174}," 92.4%\n",[164,249,251],{"class":166,"line":250},7,[164,252,191],{"class":190},[137,254,255,259,260,263],{},[140,256],{"alt":257,"src":258},"Leo Pointing","\u002Fassets\u002Fleo-pointing_md.webp","\nDid ",[161,261,262],{},"go test"," just traverse my node_modules?",[265,266,268],"h2",{"id":267},"the-full-stack-dev","The Full-Stack Dev",[137,270,271,272,276,277,280],{},"More developers are pushed today to be a ",[273,274,275],"em",{},"jack-of-all"," trades.\nIt’s become common to expect some positions to cover frontend and\nbackend development, especially considering the hyped agility that\nwell integrated coding agents can provide.\nI’d also wager coding agents can lure developers far too deep outside\ntheir expertise, confidently encouraging them, “",[273,278,279],{},"Jump!","”.",[137,282,283],{},"While the JS ecosystem has been maturing on the backend side of\ndevelopment, more experienced full-stack developers become familiar\nwith a few backend languages and frontend frameworks; choosing  the\nbest fit for the given project.",[137,285,286,287,294],{},"A popular pairing has been Go with modern JS frameworks like Angular,\nReact, Vue, etc.\nGo even has an amazing feature ",[288,289,293],"a",{"href":290,"rel":291,"target":143},"https:\u002F\u002Fpkg.go.dev\u002Fembed",[292],"nofollow","go embed","\nthat allows you to embed files into your binary, accessible by a small\nfile-system like interface.\nYou can deliver your entire application, backend and frontend, in a\nsingle binary.",[265,296,298],{"id":297},"ace-in-the-node","ACE in the Node",[134,300,301],{},[137,302,303],{},[140,304],{"alt":305,"src":306},"Magicians Selection Trap Card","\u002Fassets\u002Fmagicians-selection-trap-card_smd.webp",[137,308,309,310,313],{},"Regardless of whether you embed your frontend or serve it from the\nfile-system, how you actually structure your project, the directory\nhierarchy, could lead to arbitrary code execution in your most critical workflows, building and testing.\nYou will see this critical flaw in many tutorials, some quietly\nside-step the issue without a word, most recommend the ",[273,311,312],{},"footgun","\nwithout realizing it’s loaded.",[315,316,318],"h3",{"id":317},"poc","PoC",[137,320,321],{},"You can try this PoC directly on your machine, but I prefer to build\nan image to use as a temporary test environment.\nSo understand the container runtime environment is not required to\ntrigger this ACE.",[137,323,324,325,327,328,331],{},"First, build an image. You can copy\u002Fpaste this as one big command\n(ignoring ",[161,326,171],{},"), or create a Containerfile or Dockerfile with the\ncontents of the ",[273,329,330],{},"heredoc",".",[155,333,335],{"className":157,"code":334,"language":159,"meta":147,"style":147},"$ podman build -t pwnme - \u003C\u003C'EOF'\nFROM docker.io\u002Fnode:24-alpine\nWORKDIR \u002Fapp\nRUN mkdir frontend && cd frontend \\\n&& npm init --yes && npm install --save-dev eslint\nRUN apk add -q --no-cache go && go mod init mypackage\nENTRYPOINT [\"\u002Fusr\u002Fbin\u002Fgo\"]\nEOF\n",[161,336,337,362,367,372,377,382,387,392],{"__ignoreMap":147},[164,338,339,341,344,347,350,353,356,359],{"class":166,"line":167},[164,340,171],{"class":170},[164,342,343],{"class":174}," podman",[164,345,346],{"class":174}," build",[164,348,349],{"class":174}," -t",[164,351,352],{"class":174}," pwnme",[164,354,355],{"class":174}," -",[164,357,358],{"class":190}," \u003C\u003C",[164,360,361],{"class":190},"'EOF'\n",[164,363,364],{"class":166,"line":187},[164,365,366],{"class":174},"FROM docker.io\u002Fnode:24-alpine\n",[164,368,369],{"class":166,"line":194},[164,370,371],{"class":174},"WORKDIR \u002Fapp\n",[164,373,374],{"class":166,"line":212},[164,375,376],{"class":174},"RUN mkdir frontend && cd frontend \\\n",[164,378,379],{"class":166,"line":228},[164,380,381],{"class":174},"&& npm init --yes && npm install --save-dev eslint\n",[164,383,384],{"class":166,"line":234},[164,385,386],{"class":174},"RUN apk add -q --no-cache go && go mod init mypackage\n",[164,388,389],{"class":166,"line":250},[164,390,391],{"class":174},"ENTRYPOINT [\"\u002Fusr\u002Fbin\u002Fgo\"]\n",[164,393,395],{"class":166,"line":394},8,[164,396,397],{"class":190},"EOF\n",[137,399,400,401,403],{},"Now we can run our tests. Does ",[161,402,262],{}," traverse node_modules?",[155,405,407],{"className":157,"code":406,"language":159,"meta":147,"style":147},"$ podman run --rm -it localhost\u002Fpwnme test .\u002F...\n?       mypackage\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted      [no test files]\n",[161,408,409,431],{"__ignoreMap":147},[164,410,411,413,415,418,421,424,427,429],{"class":166,"line":167},[164,412,171],{"class":170},[164,414,343],{"class":174},[164,416,417],{"class":174}," run",[164,419,420],{"class":174}," --rm",[164,422,423],{"class":174}," -it",[164,425,426],{"class":174}," localhost\u002Fpwnme",[164,428,178],{"class":174},[164,430,184],{"class":174},[164,432,433],{"class":166,"line":187},[164,434,435],{"class":190},"?       mypackage\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted      [no test files]\n",[137,437,438,439,441],{},"Can we touch grass with ",[161,440,262],{},"?",[155,443,445],{"className":157,"code":444,"language":159,"meta":147,"style":147},"$ podman run --rm --entrypoint \u002Fbin\u002Fsh -it localhost\u002Fpwnme\n\u002Fapp # cat \u003C\u003C'EOF' > \u002Fapp\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted\u002Fflatted_test.go\n> package flatted\n> import \"os\"\n> func init() { _ = os.WriteFile(\"\u002Fpwned\", []byte(\"booo!\\n\"), 0666) }\n> EOF\n\u002Fapp # go clean -testcache && go test .\u002F...\nok      mypackage\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted      0.002s [no tests to run]\n\u002Fapp # cat \u002Fpwned\nbooo!\n",[161,446,447,468,477,482,490,536,541,548,570,578],{"__ignoreMap":147},[164,448,449,451,453,455,457,460,463,465],{"class":166,"line":167},[164,450,171],{"class":170},[164,452,343],{"class":174},[164,454,417],{"class":174},[164,456,420],{"class":174},[164,458,459],{"class":174}," --entrypoint",[164,461,462],{"class":174}," \u002Fbin\u002Fsh",[164,464,423],{"class":174},[164,466,467],{"class":174}," localhost\u002Fpwnme\n",[164,469,470,473],{"class":166,"line":187},[164,471,472],{"class":170},"\u002Fapp",[164,474,476],{"class":475},"sy89t"," # cat \u003C\u003C'EOF' > \u002Fapp\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted\u002Fflatted_test.go\n",[164,478,479],{"class":166,"line":194},[164,480,481],{"class":190},"> package flatted\n",[164,483,484,487],{"class":166,"line":212},[164,485,486],{"class":190},"> import ",[164,488,489],{"class":174},"\"os\"\n",[164,491,492,495,498,501,504,507,510,513,516,519,522,525,528,530,533],{"class":166,"line":228},[164,493,494],{"class":190},"> func ",[164,496,497],{"class":170},"init",[164,499,500],{"class":190},"() { ",[164,502,503],{"class":170},"_",[164,505,506],{"class":174}," =",[164,508,509],{"class":174}," os.WriteFile",[164,511,512],{"class":190},"(",[164,514,515],{"class":170},"\"\u002Fpwned\"",[164,517,518],{"class":170},",",[164,520,521],{"class":190}," []byte(",[164,523,524],{"class":170},"\"booo!\\n\"",[164,526,527],{"class":190},")",[164,529,518],{"class":174},[164,531,532],{"class":174}," 0666",[164,534,535],{"class":190},") }\n",[164,537,538],{"class":166,"line":234},[164,539,540],{"class":190},"> EOF\n",[164,542,543,545],{"class":166,"line":250},[164,544,472],{"class":170},[164,546,547],{"class":475}," # go clean -testcache && go test .\u002F...\n",[164,549,550,552,555,558,561,564,567],{"class":166,"line":394},[164,551,197],{"class":170},[164,553,554],{"class":174},"      mypackage\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted",[164,556,557],{"class":174},"      0.002s",[164,559,560],{"class":190}," [no ",[164,562,563],{"class":174},"tests",[164,565,566],{"class":174}," to",[164,568,569],{"class":174}," run]\n",[164,571,573,575],{"class":166,"line":572},9,[164,574,472],{"class":170},[164,576,577],{"class":475}," # cat \u002Fpwned\n",[164,579,581],{"class":166,"line":580},10,[164,582,583],{"class":170},"booo!\n",[137,585,586,587,441],{},"What about ",[161,588,589],{},"go generate",[155,591,595],{"className":592,"code":593,"language":594,"meta":147,"style":147},"language-sh shiki shiki-themes houston","$ podman run --rm --entrypoint \u002Fbin\u002Fsh -it localhost\u002Fpwnme\n\u002Fapp # cat \u003C\u003C'EOF' > \u002Fapp\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted\u002Fgen.go\n> package flatted\n> \u002F\u002Fgo:generate touch \u002Fgo-go-generate\n> EOF\n\u002Fapp # go generate .\u002F...\n\u002Fapp # ls -l \u002Fgo-go-generate\n-rw-r--r--    1 root     root             0 Apr  9 00:12 \u002Fgo-go-generate\n","sh",[161,596,597,602,607,611,616,620,625,630],{"__ignoreMap":147},[164,598,599],{"class":166,"line":167},[164,600,601],{},"$ podman run --rm --entrypoint \u002Fbin\u002Fsh -it localhost\u002Fpwnme\n",[164,603,604],{"class":166,"line":187},[164,605,606],{},"\u002Fapp # cat \u003C\u003C'EOF' > \u002Fapp\u002Ffrontend\u002Fnode_modules\u002Fflatted\u002Fgolang\u002Fpkg\u002Fflatted\u002Fgen.go\n",[164,608,609],{"class":166,"line":194},[164,610,481],{},[164,612,613],{"class":166,"line":212},[164,614,615],{},"> \u002F\u002Fgo:generate touch \u002Fgo-go-generate\n",[164,617,618],{"class":166,"line":228},[164,619,540],{},[164,621,622],{"class":166,"line":234},[164,623,624],{},"\u002Fapp # go generate .\u002F...\n",[164,626,627],{"class":166,"line":250},[164,628,629],{},"\u002Fapp # ls -l \u002Fgo-go-generate\n",[164,631,632],{"class":166,"line":394},[164,633,634],{},"-rw-r--r--    1 root     root             0 Apr  9 00:12 \u002Fgo-go-generate\n",[137,636,637],{},"OK, you get the point, there are probably quite a few ways to get an\nACE with this pattern; how do we avoid it?",[639,640,642,645],"block-quote",{"link":641},"https:\u002F\u002Fpkg.go.dev\u002Fcmd\u002Fgo#hdr-Package_lists_and_patterns",[137,643,644],{},"Directory and file names that begin with \".\" or \"_\" are ignored by the go tool, as are directories named \"testdata\".",[145,646,647],{"v-slot:cite":147},[137,648,649],{},[161,650,651],{},"go doc cmd\u002Fgo",[137,653,654],{},"Probably the easiest to overlook and easiest to implement, if you\ndon’t want Go crawling other directories, you should prefix the\nthe directory with an underscore.\nIt’s simple, yet annoyingly easy to trip over.",[265,656,658],{"id":657},"hierarchy","Hierarchy",[134,660,661,667],{},[137,662,663],{},[140,664],{"alt":665,"src":666},"Mon Mothma - Andor","\u002Fassets\u002Fstar-wars-andor-mon-mothra_md.webp",[145,668,669],{"v-slot:caption":147},[137,670,665],{},[137,672,673],{},"Ultimately, I believe the best practice for maintaining a frontend and\nbackend is segmenting them into their own repositories.\nYou won’t need to fuss with naming conventions, but many developers\nlikely view this as a hurdle in their workflow.\nWe need two merges to two repositories that must stay in sync.\nWe need two CI\u002FCD pipelines, one of which that can securely consume\nbuild artifacts of another.",[137,675,676,677,680],{},"Keeping the repositories and build pipelines separate will grant you\nthe greatest isolation and ",[273,678,679],{},"limit"," the ability for one project to\ncompromise another.\nIt really shouldn't be much of a bother to setup safe consuming\nof upstream packages, but I am quite sure that is not the norm\nfor most developers; especially those who might be stretched-thin in a\nfull-stack role.",[265,682,684],{"id":683},"embedding","Embedding",[137,686,687,688,690,691,331],{},"The ",[161,689,293],{}," is such a nice feature, but consider the security\nrequirement that it may not traverse up the directory tree, only down.\nThis is to prevent accidental leaks of say, ",[161,692,693],{},"\u002Fetc\u002Fshadow",[137,695,696,697,700],{},"So even though you can trigger this ACE simply due to a poor\ndirectory structure, backends that seek to embed their frontend\nrequire the target to exist in the Go project directory.\nWhile your repository root could be two directories, a README.md, and\na Makefile, most developers aren’t carefully making that choice.\nRather, the common boilerplate in tutorials is letting Go own the\nproject root and keeping a ",[161,698,699],{},"frontend\u002F"," directory alongside.",[265,702,703],{"id":703},"npm",[137,705,706],{},"My intention of this post is to highlight how any number of\nlanguages, packagers, or tools paired with poor project structure\ncould result in surprising attacks.\nI am not here to point the finger at any developer, package, etc.\nI was just rather shocked to see it myself.",[708,709,710],"style",{},"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 pre.shiki code .stHQG, html code.shiki .stHQG{--shiki-default:#00DAEF}html pre.shiki code .se2J0, html code.shiki .se2J0{--shiki-default:#FFD493}html pre.shiki code .sLo_3, html code.shiki .sLo_3{--shiki-default:#EEF0F9}html pre.shiki code .sy89t, html code.shiki .sy89t{--shiki-default:#EEF0F98F;--shiki-default-font-style:italic}",{"title":147,"searchDepth":187,"depth":187,"links":712},[713,714,717,718,719],{"id":267,"depth":187,"text":268},{"id":297,"depth":187,"text":298,"children":715},[716],{"id":317,"depth":194,"text":318},{"id":657,"depth":187,"text":658},{"id":683,"depth":187,"text":684},{"id":703,"depth":187,"text":703},{},true,{"title":56,"description":60},"blog\u002Fwhy-are-go-modules-in-my-nodes-modules",[62,63],{"sm":65,"md":66,"lg":67},null,"rS1L_xoIObfj1cqhtpiW-wK_551fgKEq5ns_6IwBe_Y",[],{"id":4,"title":5,"author":730,"description":14,"extension":15,"meta":731,"repository":732,"stem":21,"__hash__":22},{"name":7,"github":8,"gitlab":9,"email":10,"linkedin":11,"mastodon":12,"bio":13},{},{"url":18,"git":19,"branch":20},1793313045134]