[{"data":1,"prerenderedAt":1284},["ShallowReactive",2],{"blog-git-tags-explained":3,"blog-all-for-related":790},{"id":4,"title":5,"author":6,"body":7,"cardAlt":5,"categories":774,"description":777,"draft":778,"extension":779,"headerImage":780,"keywords":781,"meta":782,"name":783,"navigation":784,"path":785,"seo":786,"series":6,"stem":787,"updated":6,"year":788,"__hash__":789},"blog\u002Fblog\u002Fgit-tags-explained.md","Git tags : Explained",null,{"type":8,"value":9,"toc":759},"minimark",[10,14,25,37,40,56,59,62,755],[11,12,13],"p",{},"Git is a beautiful and quite necessary tool for developers. It eases our lives in maintaining codebases shared across multiple people with ease.",[11,15,16,17,24],{},"Using ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fgit-scm.com\u002F",[22],"nofollow","Git-scm"," simple definition here -",[26,27,28],"blockquote",{},[11,29,30,31,36],{},"Git is a ",[18,32,35],{"href":33,"rel":34},"https:\u002F\u002Fgit-scm.com\u002Fabout\u002Ffree-and-open-source",[22],"free and open source"," distributed version control system designed to handle everything from small to very large projects with speed and efficiency.",[11,38,39],{},"If you are not aware of git, i'll recommend to learn basics first -",[41,42,43,50],"ul",{},[44,45,46],"li",{},[18,47,48],{"href":48,"rel":49},"https:\u002F\u002Ftry.github.io\u002F",[22],[44,51,52],{},[18,53,54],{"href":54,"rel":55},"https:\u002F\u002Fwww.vogella.com\u002Ftutorials\u002FGit\u002Farticle.html",[22],[11,57,58],{},"In this article, we are going to understand what, why, when and how's about Git tags. This should be enough to get to started to use tags in your projects.",[11,60,61],{},"Let's get started !!",[63,64,65,68,73,81,88,91,93,97,104,107,110,112,116,119,124,178,189,192,205,216,219,235,240,289,296,300,303,311,316,327,333,352,357,360,374,383,387,415,418,422,434,437,440,479,490,507,510,527,531,563,566,570,592,596,622,625,629,643,646,650,682,685,688],"ads",{},[66,67],"hr",{},[69,70,72],"h2",{"id":71},"what","What?",[11,74,75,76,80],{},"Tagging basically refers to having ",[77,78,79],"strong",{},"references to certain points ( i.e milestones) in Git history",". Tags allow you to capture specific points in your code's git history which can be used anytime later.",[11,82,83,84,87],{},"You can treat a tag like ",[77,85,86],{},"a branch that doesn't change",".",[11,89,90],{},"Tag represents a version of a particular branch at a moment in time. Thus, tags essentially lets developers mark important checkpoints in their development process.",[66,92],{},[69,94,96],{"id":95},"why-and-when","Why and When?",[11,98,99,100,103],{},"You must have seen something like ",[77,101,102],{},"v1.0.0"," . This generally denotes version\u002Frelease number of a product. Generally, when some major changes are done and need to be shipped to users, a tag is created.",[11,105,106],{},"Tags are usually used to mark a certain milestone like a new feature releases or some bug fix which can be distributed to users\u002Fenterprises.",[11,108,109],{},"You don't want this to change again and again. Thus, using tags ensures that the user gets the version which was created at a certain point of time irrespective of new commits added to the codebase.",[66,111],{},[69,113,115],{"id":114},"how","How ?",[11,117,118],{},"Now that you understand the use case of tags, let's see how we can actually use it.\nTime to implement tags ✅",[120,121,123],"h3",{"id":122},"creating-a-tag","Creating a tag",[125,126,131],"pre",{"className":127,"code":128,"language":129,"meta":130,"style":130},"language-bash shiki shiki-themes github-light github-dark","git tag \u003Ctag_name>\n\u002F\u002F Eg. git tag v1.0.1\n","bash","",[132,133,134,161],"code",{"__ignoreMap":130},[135,136,139,143,147,151,154,158],"span",{"class":137,"line":138},"line",1,[135,140,142],{"class":141},"sScJk","git",[135,144,146],{"class":145},"sZZnC"," tag",[135,148,150],{"class":149},"szBVR"," \u003C",[135,152,153],{"class":145},"tag_nam",[135,155,157],{"class":156},"sVt8B","e",[135,159,160],{"class":149},">\n",[135,162,164,167,170,173,175],{"class":137,"line":163},2,[135,165,166],{"class":141},"\u002F\u002F",[135,168,169],{"class":145}," Eg.",[135,171,172],{"class":145}," git",[135,174,146],{"class":145},[135,176,177],{"class":145}," v1.0.1\n",[11,179,180,181,184,185,188],{},"This command tags the latest commit in your current branch.\nHere ",[132,182,183],{},"tag_name"," is basically a name which you want to give to this commit. It is generally something like ",[132,186,187],{},"v1.0.1"," , although you can have it as anything which you want.",[11,190,191],{},"Generally the naming pattern followed is -",[125,193,195],{"className":127,"code":194,"language":129,"meta":130,"style":130},"v\u003Cmajor>.\u003Cminor>.\u003Cpatch>\n",[132,196,197],{"__ignoreMap":130},[135,198,199,202],{"class":137,"line":138},[135,200,201],{"class":141},"v",[135,203,204],{"class":156},"\u003Cmajor>.\u003Cminor>.\u003Cpatch>\n",[41,206,207,210,213],{},[44,208,209],{},"major: breaking changes",[44,211,212],{},"minor: version compatible with previous version",[44,214,215],{},"patch: bug fix",[11,217,218],{},"Once you created a tag, you can push it to remote using -",[125,220,222],{"className":127,"code":221,"language":129,"meta":130,"style":130},"git push --tags\n",[132,223,224],{"__ignoreMap":130},[135,225,226,228,231],{"class":137,"line":138},[135,227,142],{"class":141},[135,229,230],{"class":145}," push",[135,232,234],{"class":233},"sj4cs"," --tags\n",[11,236,237],{},[77,238,239],{},"You can also create a tag with message",[125,241,243],{"className":127,"code":242,"language":129,"meta":130,"style":130},"git tag -a \u003Ctag_name> -m \"message\"\n\u002F\u002F Eg. git tag -a v1.0.1 -m \"First release\"\n",[132,244,245,269],{"__ignoreMap":130},[135,246,247,249,251,254,256,258,260,263,266],{"class":137,"line":138},[135,248,142],{"class":141},[135,250,146],{"class":145},[135,252,253],{"class":233}," -a",[135,255,150],{"class":149},[135,257,153],{"class":145},[135,259,157],{"class":156},[135,261,262],{"class":149},">",[135,264,265],{"class":233}," -m",[135,267,268],{"class":145}," \"message\"\n",[135,270,271,273,275,277,279,281,284,286],{"class":137,"line":163},[135,272,166],{"class":141},[135,274,169],{"class":145},[135,276,172],{"class":145},[135,278,146],{"class":145},[135,280,253],{"class":233},[135,282,283],{"class":145}," v1.0.1",[135,285,265],{"class":233},[135,287,288],{"class":145}," \"First release\"\n",[11,290,291,292,295],{},"Wait, what is ",[132,293,294],{},"-a"," here? Let's dig in!",[120,297,299],{"id":298},"types-of-git-tags","Types of git tags",[11,301,302],{},"There are 2 types of git tags -",[41,304,305,308],{},[44,306,307],{},"Annonated",[44,309,310],{},"Lightweight",[11,312,313],{},[77,314,315],{},"Annonated Git tags",[11,317,318,319,322,323,326],{},"Annotated tags store extra ",[77,320,321],{},"metadata"," such as author name, release notes, tag-message, and date as full objects in the Git database. This data is important for a ",[77,324,325],{},"public release"," of your project.",[11,328,329,330,332],{},"The ",[132,331,294],{}," in the previous example is to make this tags annonated.",[125,334,336],{"className":127,"code":335,"language":129,"meta":130,"style":130},"git tag -a v1.0.1 -m \"First release\"\n",[132,337,338],{"__ignoreMap":130},[135,339,340,342,344,346,348,350],{"class":137,"line":138},[135,341,142],{"class":141},[135,343,146],{"class":145},[135,345,253],{"class":233},[135,347,283],{"class":145},[135,349,265],{"class":233},[135,351,288],{"class":145},[11,353,354],{},[77,355,356],{},"Lightweight Git tags",[11,358,359],{},"Lightweight tags are the simplest way to add a tag. They just store the name and hash of the commit they refer to and they don't contain any extra information. They act like simple bookmarks.",[125,361,363],{"className":127,"code":362,"language":129,"meta":130,"style":130},"git tag v2.1-lw\n",[132,364,365],{"__ignoreMap":130},[135,366,367,369,371],{"class":137,"line":138},[135,368,142],{"class":141},[135,370,146],{"class":145},[135,372,373],{"class":145}," v2.1-lw\n",[11,375,376,379,380,382],{},[132,377,378],{},"lw"," signifies its a lightweight tag. Adding a ",[132,381,378],{}," is completely optional, it's just for better readability.",[120,384,386],{"id":385},"create-git-tag-for-specific-commit","Create git tag for specific commit",[125,388,390],{"className":127,"code":389,"language":129,"meta":130,"style":130},"git tag \u003Ctag_name> \u003Ccommit_sha>\n",[132,391,392],{"__ignoreMap":130},[135,393,394,396,398,400,402,404,406,408,411,413],{"class":137,"line":138},[135,395,142],{"class":141},[135,397,146],{"class":145},[135,399,150],{"class":149},[135,401,153],{"class":145},[135,403,157],{"class":156},[135,405,262],{"class":149},[135,407,150],{"class":149},[135,409,410],{"class":145},"commit_sh",[135,412,18],{"class":156},[135,414,160],{"class":149},[11,416,417],{},"In case, you want to create a tag for some older commit, this can be achieved with the above command.",[120,419,421],{"id":420},"listing-all-tags","Listing all tags",[125,423,425],{"className":127,"code":424,"language":129,"meta":130,"style":130},"git tag\n",[132,426,427],{"__ignoreMap":130},[135,428,429,431],{"class":137,"line":138},[135,430,142],{"class":141},[135,432,433],{"class":145}," tag\n",[11,435,436],{},"The above command lists down all the existing tags.",[11,438,439],{},"You'll see output something like -",[125,441,443],{"className":127,"code":442,"language":129,"meta":130,"style":130},"1.0.0\n1.0.1\n1.0.2\n1.0.3\n2.0.0\n2.1.0\n",[132,444,445,450,455,461,467,473],{"__ignoreMap":130},[135,446,447],{"class":137,"line":138},[135,448,449],{"class":141},"1.0.0\n",[135,451,452],{"class":137,"line":163},[135,453,454],{"class":141},"1.0.1\n",[135,456,458],{"class":137,"line":457},3,[135,459,460],{"class":141},"1.0.2\n",[135,462,464],{"class":137,"line":463},4,[135,465,466],{"class":141},"1.0.3\n",[135,468,470],{"class":137,"line":469},5,[135,471,472],{"class":141},"2.0.0\n",[135,474,476],{"class":137,"line":475},6,[135,477,478],{"class":141},"2.1.0\n",[11,480,481,482,485,486,489],{},"You can also use ",[132,483,484],{},"-l"," or ",[132,487,488],{},"--list"," option to filter out tags by using regular expression.",[125,491,493],{"className":127,"code":492,"language":129,"meta":130,"style":130},"git tag -l \"1.0*\"\n",[132,494,495],{"__ignoreMap":130},[135,496,497,499,501,504],{"class":137,"line":138},[135,498,142],{"class":141},[135,500,146],{"class":145},[135,502,503],{"class":233}," -l",[135,505,506],{"class":145}," \"1.0*\"\n",[11,508,509],{},"Results in -",[125,511,513],{"className":127,"code":512,"language":129,"meta":130,"style":130},"1.0.0\n1.0.1\n1.0.2\n",[132,514,515,519,523],{"__ignoreMap":130},[135,516,517],{"class":137,"line":138},[135,518,449],{"class":141},[135,520,521],{"class":137,"line":163},[135,522,454],{"class":141},[135,524,525],{"class":137,"line":457},[135,526,460],{"class":141},[120,528,530],{"id":529},"fetch-tag-details","Fetch tag details",[125,532,534],{"className":127,"code":533,"language":129,"meta":130,"style":130},"git show \u003Ctag_name>\n\u002F\u002F Eg. git show v1.0.1\n",[132,535,536,551],{"__ignoreMap":130},[135,537,538,540,543,545,547,549],{"class":137,"line":138},[135,539,142],{"class":141},[135,541,542],{"class":145}," show",[135,544,150],{"class":149},[135,546,153],{"class":145},[135,548,157],{"class":156},[135,550,160],{"class":149},[135,552,553,555,557,559,561],{"class":137,"line":163},[135,554,166],{"class":141},[135,556,169],{"class":145},[135,558,172],{"class":145},[135,560,542],{"class":145},[135,562,177],{"class":145},[11,564,565],{},"This shows the author, tag message, respective commit, date and other details.",[120,567,569],{"id":568},"deleting-a-tag","Deleting a tag",[125,571,573],{"className":127,"code":572,"language":129,"meta":130,"style":130},"git tag -d \u003Ctag_name>\n",[132,574,575],{"__ignoreMap":130},[135,576,577,579,581,584,586,588,590],{"class":137,"line":138},[135,578,142],{"class":141},[135,580,146],{"class":145},[135,582,583],{"class":233}," -d",[135,585,150],{"class":149},[135,587,153],{"class":145},[135,589,157],{"class":156},[135,591,160],{"class":149},[120,593,595],{"id":594},"pushing-tags","Pushing tags",[125,597,599],{"className":127,"code":598,"language":129,"meta":130,"style":130},"git push origin \u003Cbranch> --tags\n",[132,600,601],{"__ignoreMap":130},[135,602,603,605,607,610,612,615,618,620],{"class":137,"line":138},[135,604,142],{"class":141},[135,606,230],{"class":145},[135,608,609],{"class":145}," origin",[135,611,150],{"class":149},[135,613,614],{"class":145},"branc",[135,616,617],{"class":156},"h",[135,619,262],{"class":149},[135,621,234],{"class":233},[11,623,624],{},"Use this command to push your tags to remote.",[120,626,628],{"id":627},"pulling-tags","Pulling tags",[125,630,632],{"className":127,"code":631,"language":129,"meta":130,"style":130},"git fetch --tags\n",[132,633,634],{"__ignoreMap":130},[135,635,636,638,641],{"class":137,"line":138},[135,637,142],{"class":141},[135,639,640],{"class":145}," fetch",[135,642,234],{"class":233},[11,644,645],{},"Use this command to pull tags to your current branch from remote.",[120,647,649],{"id":648},"checkout-tags","Checkout tags",[125,651,653],{"className":127,"code":652,"language":129,"meta":130,"style":130},"git checkout \u003Ctag_name>\n\u002F\u002F Eg. git checkout v1.0.1\n",[132,654,655,670],{"__ignoreMap":130},[135,656,657,659,662,664,666,668],{"class":137,"line":138},[135,658,142],{"class":141},[135,660,661],{"class":145}," checkout",[135,663,150],{"class":149},[135,665,153],{"class":145},[135,667,157],{"class":156},[135,669,160],{"class":149},[135,671,672,674,676,678,680],{"class":137,"line":163},[135,673,166],{"class":141},[135,675,169],{"class":145},[135,677,172],{"class":145},[135,679,661],{"class":145},[135,681,177],{"class":145},[11,683,684],{},"In case you want to go back to state of codebase at a certain tag, you can use the above command to checkout a particular tag",[11,686,687],{},"You have a good knowledge about git tags now, start using tags in your projects 😁",[63,689,690,692,696,727,736,738,741,750],{},[66,691],{},[69,693,695],{"id":694},"more-resources-to-learn","More Resources to learn",[41,697,698,705,712,719],{},[44,699,700],{},[18,701,704],{"href":702,"rel":703},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2",[22],"Excellent book to learn git",[44,706,707],{},[18,708,711],{"href":709,"rel":710},"https:\u002F\u002Fsoftwareengineering.stackexchange.com\u002Fquestions\u002F165725\u002Fgit-branching-and-tagging-best-practices",[22],"Best git tag practices",[44,713,714],{},[18,715,718],{"href":716,"rel":717},"https:\u002F\u002Fwww.atlassian.com\u002Fgit\u002Ftutorials\u002Finspecting-a-repository\u002Fgit-tag",[22],"On tagging by atlassian",[44,720,721,722],{},"Upskill yourself with awesome courses on ",[18,723,726],{"href":724,"rel":725},"https:\u002F\u002Fwww.educative.io\u002Fexplore?aff=K3zN",[22],"Educative",[11,728,729,730,735],{},"Liked the article? Consider ",[18,731,734],{"href":732,"rel":733},"https:\u002F\u002Fwww.buymeacoffee.com\u002FchHAzigTb",[22],"supporting me"," ☕️",[66,737],{},[11,739,740],{},"I hope you learned something new. Feel free to suggest improvements ✔️",[11,742,743,744,749],{},"I share regular updates and resources on ",[18,745,748],{"href":746,"rel":747},"https:\u002F\u002Ftwitter.com\u002Fmkfeuhrer",[22],"Twitter",". Let's connect!",[11,751,752],{},[77,753,754],{},"Keep exploring 🔎 Keep learning 🚀",[756,757,758],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":130,"searchDepth":163,"depth":163,"links":760},[761,762,763],{"id":71,"depth":163,"text":72},{"id":95,"depth":163,"text":96},{"id":114,"depth":163,"text":115,"children":764},[765,766,767,768,769,770,771,772,773],{"id":122,"depth":457,"text":123},{"id":298,"depth":457,"text":299},{"id":385,"depth":457,"text":386},{"id":420,"depth":457,"text":421},{"id":529,"depth":457,"text":530},{"id":568,"depth":457,"text":569},{"id":594,"depth":457,"text":595},{"id":627,"depth":457,"text":628},{"id":648,"depth":457,"text":649},[775,776],"Git","Programming","What Git tags are, why and when to use them, and how to start tagging releases in your own projects.",false,"md","blog\u002Fgit-tags-explained\u002Fgit-tags-explained-card.webp","git tags, git push tag, git remove tag, git tags list",{},"git-tags-explained",true,"\u002Fblog\u002Fgit-tags-explained",{"title":5,"description":777},"blog\u002Fgit-tags-explained","2020-06-18","AvWUfyesZ6sAM5GsnKC5vn1gdDqKFFNMy2X8Th2RDOg",[791,798,805,813,822,829,836,843,849,855,861,867,873,883,889,896,903,910,916,922,928,934,936,942,948,954,960,966,973,980,986,992,998,1004,1010,1016,1022,1028,1034,1040,1046,1052,1058,1065,1071,1077,1083,1090,1096,1102,1109,1116,1122,1129,1135,1142,1148,1155,1161,1167,1173,1179,1185,1191,1197,1203,1209,1215,1221,1227,1234,1240,1247,1253,1259,1265,1272,1278],{"path":792,"title":793,"description":794,"categories":795,"draft":784,"year":797,"series":6},"\u002Fblog\u002Fai-assisted-workstation","Building an AI-Assisted Personal Workstation","How I built a personal AI workstation: markdown knowledge base, portable agent skills, handoff-driven sessions. What worked, what broke, what I would change.",[796,776],"Productivity","2026-08-26",{"path":799,"title":800,"description":801,"categories":802,"draft":778,"year":804,"series":6},"\u002Fblog\u002Faws-s3-golang","Uploading images to AWS S3 in Golang","In this tutorial I cover how to upload, fetch and manage other operations for objects on AWS S3 in Golang",[803,776],"Golang","2020-01-12",{"path":806,"title":807,"description":808,"categories":809,"draft":778,"year":812,"series":6},"\u002Fblog\u002Fbooks-for-engineers","Best Books for Software Engineers","Best Books to help you build you software engineering career - ranging from fundamentats, interview prep to productivity.",[810,811],"Books","Life","2021-12-26",{"path":814,"title":815,"description":816,"categories":817,"draft":778,"year":821,"series":6},"\u002Fblog\u002Fbuilding-acrons","Building Acrons 🚀","Building Acrons, a one-stop tool to decode everyday acronyms like DIY, FOMO, and BRB without losing your flow.",[818,819,820],"Side Projects","Web","Tools","2020-05-26",{"path":823,"title":824,"description":825,"categories":826,"draft":778,"year":828,"series":6},"\u002Fblog\u002Fcap-theorem","CAP Theorem Explained","Learn the concept and misconceptions around popular CAP theorem in system design.",[827,776],"System Design","2021-07-26",{"path":830,"title":831,"description":832,"categories":833,"draft":778,"year":835,"series":6},"\u002Fblog\u002Fcode-reviews","Code Review Checklist","Why code reviews matter, and best practices that catch bugs early and keep code quality high before merge.",[834],"Engineering Principles","2020-07-20",{"path":837,"title":838,"description":839,"categories":840,"draft":778,"year":842,"series":6},"\u002Fblog\u002Fdark-mode","Add Dark mode to websites","Dark mode is ❤️️ Add it to your websites with little CSS and JS",[841,819],"Javascript","2020-07-04",{"path":844,"title":845,"description":846,"categories":847,"draft":778,"year":848,"series":6},"\u002Fblog\u002Fdate-time-golang","Working with Date and Time in Go","Learn how to use time in Golang - Multiple formats, locations and using date.",[803,776],"2020-10-09",{"path":850,"title":851,"description":852,"categories":853,"draft":778,"year":854,"series":6},"\u002Fblog\u002Fdefer-in-golang","Understanding Defer In Golang","Learn about defer keyword in golang and how it can help you avoid panics due to bugs.",[803,776],"2021-05-05",{"path":856,"title":857,"description":858,"categories":859,"draft":778,"year":860,"series":6},"\u002Fblog\u002Fenums-golang","Implementing Enums in Golang","Enums are a way to defined set of constant values. Learn how to implement enums in Go using iota with examples.",[803,776],"2021-12-18",{"path":862,"title":863,"description":864,"categories":865,"draft":778,"year":866,"series":6},"\u002Fblog\u002Fenvironment-variable-golang","Guide to Environment variables in Go","Learn what are environment variables and how to use them in Go",[803,776],"2020-08-14",{"path":868,"title":869,"description":870,"categories":871,"draft":778,"year":872,"series":6},"\u002Fblog\u002Ferror-handling-golang","Handle errors the right way — Golang","How to handle errors in golang to make your life easy",[803,776],"2020-01-30",{"path":874,"title":875,"description":876,"categories":877,"draft":784,"year":880,"series":881},"\u002Fblog\u002Ffile-attack-document-macros","File Attack Deep Dives, Part 3: Document Macros","How malicious VBA hides in vbaProject.bin, which AutoOpen entry points fire it, and the sandbox signals that catch it.",[878,879],"Security","Systems","2026-09-17",{"name":882,"part":457},"File Attack Deep Dives",{"path":884,"title":885,"description":886,"categories":887,"draft":778,"year":797,"series":888},"\u002Fblog\u002Ffile-attack-field-guide","How File-Based Attacks Land: A Detection Engineer's Field Guide","A practical taxonomy of how malware and phishing arrive as files, why classic controls miss them, and how detection should think.",[878,879],{"name":882,"part":138},{"path":890,"title":891,"description":892,"categories":893,"draft":784,"year":894,"series":895},"\u002Fblog\u002Ffile-attack-html-smuggling","File Attack Deep Dives, Part 2: HTML Smuggling","How attackers assemble malware inside the browser with Blob URLs, and the URL and script tells that catch it.",[878,879],"2026-09-10",{"name":882,"part":163},{"path":897,"title":898,"description":899,"categories":900,"draft":784,"year":901,"series":902},"\u002Fblog\u002Ffile-attack-lnk-iso","File Attack Deep Dives, Part 5: LNK and ISO Smuggling","How ISO containers and weaponized shortcuts bypass Mark of the Web, and the forensic fields that catch them.",[878,879],"2026-10-01",{"name":882,"part":469},{"path":904,"title":905,"description":906,"categories":907,"draft":784,"year":908,"series":909},"\u002Fblog\u002Ffile-attack-pdf-url-actions","File Attack Deep Dives, Part 4: PDF URL Actions","How PDF OpenAction, Launch, and URI actions turn opening a document into a phishing click, and the action audit that catches them.",[878,879],"2026-09-24",{"name":882,"part":463},{"path":911,"title":912,"description":913,"categories":914,"draft":778,"year":915,"series":6},"\u002Fblog\u002Ffile-upload-golang","Uploading Files in Golang with Multipart Request","Learn how to upload files from your client to server as a multipart request in Golang.",[803,776],"2021-03-13",{"path":917,"title":918,"description":919,"categories":920,"draft":778,"year":921,"series":6},"\u002Fblog\u002Fgit-branch","Git Branch 101","Branching is a new path of development that makes it a lot easier to build features. Learn why and how to use branching in git.",[775,776],"2022-03-20",{"path":923,"title":924,"description":925,"categories":926,"draft":778,"year":927,"series":6},"\u002Fblog\u002Fgit-pull-request-template","Guide to Pull Request Templates","Improve collaboration and code reviews with pull request templates. Blog include PR template and how to create one on github\u002Fgitlab",[775,776],"2023-08-24",{"path":929,"title":930,"description":931,"categories":932,"draft":778,"year":933,"series":6},"\u002Fblog\u002Fgit-remove-sensitive-info","Securing Git: Remove Sensitive Information","Protect your code from security breaches by using BFG tool to remove sensitive information from Git history. Learn how to do it in this comprehensive guide.",[775,776],"2023-10-16",{"path":785,"title":5,"description":777,"categories":935,"draft":778,"year":788,"series":6},[775,776],{"path":937,"title":938,"description":939,"categories":940,"draft":778,"year":941,"series":6},"\u002Fblog\u002Fgo-dependency-injection","Dependency Injection in Go using Wire","Learn about dependency injection, its benefits and how to implement it in Go services using wire",[803,776],"2022-11-26",{"path":943,"title":944,"description":945,"categories":946,"draft":778,"year":947,"series":6},"\u002Fblog\u002Fgo-generics","Introduction to Generics in Go","Learn about generics in Golang, it's benefits and how to implement it in applications.",[803,776],"2022-11-27",{"path":949,"title":950,"description":951,"categories":952,"draft":778,"year":953,"series":6},"\u002Fblog\u002Fgo-in-memory-cache","Building In-Memory Cache in Go","Learn about in-memory caching in Golang, it's benefits and how to implement it with and without generics with a TTL(expiry).",[803,776],"2024-03-28",{"path":955,"title":956,"description":957,"categories":958,"draft":778,"year":959,"series":6},"\u002Fblog\u002Fgo-makefile","Ultimate Makefile for Golang","Boost your productivity and save time with ultimate Makefile for Golang projects.",[803,776],"2024-06-10",{"path":961,"title":962,"description":963,"categories":964,"draft":778,"year":965,"series":6},"\u002Fblog\u002Fgo-middleware","Mastering Middlewares in Golang","Learn about middlewares, their use cases and how to implement them in Golang applications",[803,776],"2022-03-13",{"path":967,"title":968,"description":969,"categories":970,"draft":778,"year":972,"series":6},"\u002Fblog\u002Fgo-naming-conventions","Naming Conventions in Golang","Why naming conventions matter in Go, with best practices and practical examples for clear, readable, maintainable code.",[803,776,971],"Code Quality","2023-05-19",{"path":974,"title":975,"description":976,"categories":977,"draft":778,"year":979,"series":6},"\u002Fblog\u002Fgo-with-redis","Go with Redis","A practical introduction to using Redis with Golang to make your applications faster with in-memory data storage.",[803,978,776],"Database","2020-05-03",{"path":981,"title":982,"description":983,"categories":984,"draft":778,"year":985,"series":6},"\u002Fblog\u002Fgolang-maps","Learn Maps in Golang (with examples)","A complete guide to maps in Golang: creating maps, adding and removing items, iterating, and how map equality works.",[803,776],"2020-09-10",{"path":987,"title":988,"description":989,"categories":990,"draft":778,"year":991,"series":6},"\u002Fblog\u002Fguide-to-cdn","Guide to Content Delivery Network","CDN is one of the backbone of modern world internet infrastructure. Learn about Content Delivery Network, it's working, types and benefits.",[827,776],"2022-01-23",{"path":993,"title":994,"description":995,"categories":996,"draft":778,"year":997,"series":6},"\u002Fblog\u002Fguide-to-rule-engines","Guide to Rule Engines","Rule Engines help in solving changing business requirements with ease. Learn all about Rule engines, it's working, benefits and how to implement one in Golang",[803,776],"2022-09-12",{"path":999,"title":1000,"description":1001,"categories":1002,"draft":778,"year":1003,"series":6},"\u002Fblog\u002Fhexagonal-architecture","Guide to Hexagonal Architecture","Learn how to design efficient application with hexagonal architecture with practical example",[827,776],"2020-12-13",{"path":1005,"title":1006,"description":1007,"categories":1008,"draft":778,"year":1009,"series":6},"\u002Fblog\u002Fhttp-status-codes","Learn HTTP Status Codes","A tour of HTTP response status codes, what each class means, and when to use which code in your applications.",[819,776],"2020-07-30",{"path":1011,"title":1012,"description":1013,"categories":1014,"draft":778,"year":1015,"series":6},"\u002Fblog\u002Fintroduction-to-goroutines","Introduction to Goroutines","Understand the basics of concurrency and learn how to work with Goroutines in golang.",[803,776],"2021-04-10",{"path":1017,"title":1018,"description":1019,"categories":1020,"draft":778,"year":1021,"series":6},"\u002Fblog\u002Fjson-in-postgres-with-golang","Storing JSON in Postgres with Golang","Learn how to store JSON objects in Postgres and how to implement it in Golang.",[776,978,803],"2021-02-13",{"path":1023,"title":1024,"description":1025,"categories":1026,"draft":778,"year":1027,"series":6},"\u002Fblog\u002Fjson-web-token","Complete Guide to JWT","JSON Web Tokens are a very compact way to carry information. Learn about JWTs in depth, from its structure to when to use it.",[776,819],"2021-11-20",{"path":1029,"title":1030,"description":1031,"categories":1032,"draft":778,"year":1033,"series":6},"\u002Fblog\u002Flearn-to-say-no","Learning to say No","Learn why it's important to say 'NO'. How it helps in increasing productivity and explore strategies for saying No",[811,810],"2022-04-09",{"path":1035,"title":1036,"description":1037,"categories":1038,"draft":778,"year":1039,"series":6},"\u002Fblog\u002Flearn-unlearn-relearn","Learn - Unlearn - Relearn","Unlearning things to learn new is the way to grow. Discover how to do that!",[796,811],"2020-09-25",{"path":1041,"title":1042,"description":1043,"categories":1044,"draft":778,"year":1045,"series":6},"\u002Fblog\u002Flinting-in-golang","Introduction to Linting in Go","Introduction to improving code quality using linting. Learn how to add linting in your Go projects.",[803,776],"2021-07-07",{"path":1047,"title":1048,"description":1049,"categories":1050,"draft":778,"year":1051,"series":6},"\u002Fblog\u002Fload-balancing","Load Balancing 101","Complete guide on load balancers explaining the internal working and how does it help in making applications efficient.",[827,776],"2021-05-29",{"path":1053,"title":1054,"description":1055,"categories":1056,"draft":778,"year":1057,"series":6},"\u002Fblog\u002Fmaking-decisions-the-right-way","Making Decisions: The right way","Decisions are hard! Learn how to make the right decisions always",[796,811],"2020-06-07",{"path":1059,"title":1060,"description":1061,"categories":1062,"draft":778,"year":1064,"series":6},"\u002Fblog\u002Fmanage-logs-with-logrotate","Using Logrotate to manage logs","Learn how to use logrotate system utility to manage logs with example",[1063,776],"Linux","2020-09-08",{"path":1066,"title":1067,"description":1068,"categories":1069,"draft":778,"year":1070,"series":6},"\u002Fblog\u002Fmarshal-structs-golang","Marshal structs the right way: Golang","Why Golang marshals empty structs into your JSON instead of null, and how to marshal structs the right way.",[803,776],"2020-03-31",{"path":1072,"title":1073,"description":1074,"categories":1075,"draft":778,"year":1076,"series":6},"\u002Fblog\u002Fnotes-almanack-naval","Book Notes : Almanack of Naval Ravikant","My notes\u002Fhighlights from Almanack of Naval Ravikant book by Eric Jorgenson",[810,811],"2020-10-17",{"path":1078,"title":1079,"description":1080,"categories":1081,"draft":778,"year":1082,"series":6},"\u002Fblog\u002Fnotes-anything-you-want","Book Notes : Anything you want","My notes\u002Fhighlights from Anything you want book by Derek Sivers",[810,811],"2021-09-25",{"path":1084,"title":1085,"description":1086,"categories":1087,"draft":778,"year":1089,"series":6},"\u002Fblog\u002Fnotes-getting-real","Book Notes : Getting Real","My notes and highlights from Getting Real by Jason Fried and David Heinemeier Hansson on building web applications.",[810,1088],"Startups","2020-11-03",{"path":1091,"title":1092,"description":1093,"categories":1094,"draft":778,"year":1095,"series":6},"\u002Fblog\u002Fnotes-hell-yeah-or-no","Book Notes : Hell Yeah or No","My notes\u002Fhighlights from Hell Yeah or No book by Derek Sivers",[810,811],"2020-09-16",{"path":1097,"title":1098,"description":1099,"categories":1100,"draft":778,"year":1101,"series":6},"\u002Fblog\u002Fnotes-how-to-be-a-capitalist","Book Notes : How to Be a Capitalist Without Any Capital","My notes\u002Fhighlights from How to Be a Capitalist Without Any Capital by Nathan Latka",[810,1088],"2020-01-07",{"path":1103,"title":1104,"description":1105,"categories":1106,"draft":778,"year":1108,"series":6},"\u002Fblog\u002Fnotes-lean-b2b","Book Notes : Lean B2B","My notes and highlights from Lean B2B by Étienne Garbugli on assessing markets, building MVPs, and selling to businesses.",[810,1107],"Entrepreneurship","2022-07-02",{"path":1110,"title":1111,"description":1112,"categories":1113,"draft":778,"year":1115,"series":6},"\u002Fblog\u002Fnotes-lets-talk-money","Book Notes : Let's Talk Money","My notes and highlights from Let's Talk Money by Monica Halan on managing personal finances and savings.",[810,1114],"Personal Finance","2021-02-26",{"path":1117,"title":1118,"description":1119,"categories":1120,"draft":778,"year":1121,"series":6},"\u002Fblog\u002Fnotes-obviously-awesome","Book Notes : Obviously Awesome","My notes and highlights from Obviously Awesome by April Dunford on product positioning and marketing strategy.",[810,1088],"2020-04-26",{"path":1123,"title":1124,"description":1125,"categories":1126,"draft":778,"year":1128,"series":6},"\u002Fblog\u002Fnotes-refactoring-ui","Book Notes: Refactoring UI","My notes and highlights from Refactoring UI by Adam Wathan and Steve Schoger, full of practical design tips for engineers.",[810,1127],"Design","2020-05-09",{"path":1130,"title":1131,"description":1132,"categories":1133,"draft":778,"year":1134,"series":6},"\u002Fblog\u002Fnotes-rework","Book Notes: Rework","My notes and highlights from Rework by Jason Fried and David Heinemeier Hansson on a better way to succeed in business.",[810,1088],"2021-04-14",{"path":1136,"title":1137,"description":1138,"categories":1139,"draft":778,"year":1141,"series":6},"\u002Fblog\u002Fone-on-one-meetings","Guide to Effective 1:1 Meetings","One on One meetings are important for your personal & professional growth. Learn how to master 1:1s with your manager and peers.",[1140,796],"Career","2023-03-05",{"path":1143,"title":1144,"description":1145,"categories":1146,"draft":778,"year":1147,"series":6},"\u002Fblog\u002Fpersonal-okrs","Personal OKRs for Success","Why one should set personal OKRs and how to achieve success with them",[796,811],"2020-06-27",{"path":1149,"title":1150,"description":1151,"categories":1152,"draft":778,"year":1154,"series":6},"\u002Fblog\u002Fpoker-tips","Poker Tips: Johns Hopkins Poker Class","Notes from Johns Hopkins poker course. This guide will help you improve in Poker and win some large pots.",[811,1153],"Poker","2020-06-13",{"path":1156,"title":1157,"description":1158,"categories":1159,"draft":778,"year":1160,"series":6},"\u002Fblog\u002Fpomodoro","Get work done: The Pomo Way","Learn to focus and get productive by following the Pomodoro Technique",[796],"2020-10-24",{"path":1162,"title":1163,"description":1164,"categories":1165,"draft":778,"year":1166,"series":6},"\u002Fblog\u002Fpostgres-constraints","Postgres Constraints","Constraints are line of defense for database. Explore various types of constrainsts in postgres",[978,776],"2020-11-07",{"path":1168,"title":1169,"description":1170,"categories":1171,"draft":778,"year":1172,"series":6},"\u002Fblog\u002Fppf-explained","PPF Explained","Learn basics about Public Provident Fund and why you should invest",[811,1114],"2020-12-24",{"path":1174,"title":1175,"description":1176,"categories":1177,"draft":778,"year":1178,"series":6},"\u002Fblog\u002Fproductivity-chrome-extensions","Boost Productivity with Chrome Extensions","Utitizing chrome extensions to boost your productivity!",[796,820,819],"2020-04-24",{"path":1180,"title":1181,"description":1182,"categories":1183,"draft":778,"year":1184,"series":6},"\u002Fblog\u002Fproductivity-in-vscode","Improve your productivity with VS Code","Key VS Code features like the integrated terminal, shortcuts, and extensions that improved my everyday productivity.",[796,776],"2020-03-12",{"path":1186,"title":1187,"description":1188,"categories":1189,"draft":778,"year":1190,"series":6},"\u002Fblog\u002Freading-101","Improving Reading 101","Why reading matters, how to build a reading habit, and what to read next - from my own journey into books.",[810,811],"2020-04-04",{"path":1192,"title":1193,"description":1194,"categories":1195,"draft":778,"year":1196,"series":6},"\u002Fblog\u002Freverse-proxy","Understanding Reverse Proxy","Learn about reverse proxy, how it is different from forward proxy and explore advantages of using it in system design.",[827,776],"2021-10-03",{"path":1198,"title":1199,"description":1200,"categories":1201,"draft":778,"year":1202,"series":6},"\u002Fblog\u002Frunning-periodic-background-task-golang","Running periodic background tasks in Golang","How to run periodic background tasks in Golang by combining cron-style scheduling with background execution.",[803,776],"2019-11-21",{"path":1204,"title":1205,"description":1206,"categories":1207,"draft":778,"year":1208,"series":6},"\u002Fblog\u002Fsessions-in-golang","Sessions using Golang and Redis","How cookies and sessions work, and how to implement persistent login sessions in Golang using Redis.",[803,978,776],"2020-02-25",{"path":1210,"title":1211,"description":1212,"categories":1213,"draft":778,"year":1214,"series":6},"\u002Fblog\u002Fsolid-dry-kiss-yagni","Solid Dry Kiss Yagni","An introduction to the SOLID, DRY, KISS, and YAGNI principles and how they help you write cleaner, robust code.",[834],"2020-07-17",{"path":1216,"title":1217,"description":1218,"categories":1219,"draft":778,"year":1220,"series":6},"\u002Fblog\u002Fstack-in-golang","Implement Stack in Golang","Learn how to implement stack data structure in Golang (Full code)",[803,776],"2020-09-14",{"path":1222,"title":1223,"description":1224,"categories":1225,"draft":778,"year":1226,"series":6},"\u002Fblog\u002Fstart-oss-today","Start your Open Source journey today","Start your OSS journey with intro to GIT. Participate in Hacktoberfest!",[775,776],"2020-09-19",{"path":1228,"title":1229,"description":1230,"categories":1231,"draft":778,"year":1233,"series":6},"\u002Fblog\u002Fsticky-social-bar","Sticky social share component in HTML","Learn how to build a social media sharing component in HTML and add it to your website.",[776,1232],"Frontend","2021-02-05",{"path":1235,"title":1236,"description":1237,"categories":1238,"draft":778,"year":1239,"series":6},"\u002Fblog\u002Fterm-insurance","Term insurance Simplified","Everything you need to know before you buy a term insurance.",[811,1114],"2020-11-29",{"path":1241,"title":1242,"description":1243,"categories":1244,"draft":778,"year":1246,"series":6},"\u002Fblog\u002Fterminal-output-with-redirection","Handling terminal outputs with Redirection","Learn how to handle terminal outputs with Redirection and saving it to files",[1063,1245,776],"Terminal","2020-09-06",{"path":1248,"title":1249,"description":1250,"categories":1251,"draft":778,"year":1252,"series":6},"\u002Fblog\u002Fthink-and-grow-rich","Book Notes: Think and Grow Rich","My notes and highlights from Think and Grow Rich by Napoleon Hill, covering its process for building wealth.",[810,811],"2020-05-19",{"path":1254,"title":1255,"description":1256,"categories":1257,"draft":778,"year":1258,"series":6},"\u002Fblog\u002Ftransactions-postgres-golang","Transactions on Postgres with Golang","Performing Postgres database operations in Golang with GORM, from basic queries to full transaction support.",[803,978,776],"2020-03-18",{"path":1260,"title":1261,"description":1262,"categories":1263,"draft":778,"year":1264,"series":6},"\u002Fblog\u002Fwaitgroups-in-golang","WaitGroups in Golang","Learn about WaitGroups in golang and how to use them to perform concurrent operations without blocking the main thread.",[803,776],"2022-05-31",{"path":1266,"title":1267,"description":1268,"categories":1269,"draft":778,"year":1271,"series":6},"\u002Fblog\u002Fwhat-i-use","What I Use: Products and Softwares","List of what I use in my day to day life ranging from terminal, editors, softwares, devices to accessories",[811,1270],"Tech","2024-06-01",{"path":1273,"title":1274,"description":1275,"categories":1276,"draft":778,"year":1277,"series":6},"\u002Fblog\u002Fyear-in-review-2020","Year in Review: 2020","It's a wrap! 2020 was a crazy year, See how my year went!",[811],"2020-12-31",{"path":1279,"title":1280,"description":1281,"categories":1282,"draft":778,"year":1283,"series":6},"\u002Fblog\u002Fyear-in-review-2021","Year in Review: 2021","It's a wrap! 2021 was a mixed bag, full of ups and downs. Key Goal for 2022: Start now!",[811],"2021-12-31",1788637295074]