[{"data":1,"prerenderedAt":941},["ShallowReactive",2],{"\u002Farticles\u002Fcommit-to-release":3,"\u002Farticles\u002Fcommit-to-release-surround":930},{"id":4,"title":5,"author":6,"body":7,"date":914,"description":13,"draft":915,"extension":167,"image":6,"lastmod":914,"meta":916,"minRead":6,"navigation":290,"path":926,"seo":927,"stem":928,"__hash__":929},"articles\u002Farticles\u002Fcommit-to-release.md","From Commit to Release: Automating GitHub Workflows",null,{"type":8,"value":9,"toc":894},"minimark",[10,14,19,33,39,44,63,67,140,144,148,156,160,222,226,230,237,338,342,348,355,463,470,495,502,572,576,632,635,675,679,686,709,716,757,764,772,779,787,791,795,802,815,822,847,854,869,873,886,890],[11,12,13],"p",{},"This documentation describes an automated GitHub workflow system that handles pull request labelling and automated releases for both development and production environments. The system uses branch naming conventions to automatically label PRs, generates release notes, and manages versioning.",[15,16,18],"h2",{"id":17},"how-it-works","How It Works",[20,21,22],"mermaid",{},[23,24,29],"pre",{"className":25,"code":27,"language":28},[26],"language-text","graph LR\n    A[\"🌿 Branch Name\"] --> B{\"PR Labeler\"}\n    \n    B -->|\"breaking:*\"| C1[\"🏷️ breaking\"]\n    B -->|\"feature:*\"| C2[\"🏷️ feature\"]\n    B -->|\"fix:*\"| C3[\"🏷️ fix\"]\n    B -->|\"chore:*\"| C4[\"🏷️ chore\"]\n    \n    C1 --> D[\"Version Resolution\"]\n    C2 --> D\n    C3 --> D\n    C4 --> D\n    \n    D -->|breaking| E1[\"📈 Major\n    1.0.0 → 2.0.0\"]\n    D -->|feature\u002Ffix| E2[\"📊 Minor\n    1.0.0 → 1.1.0\"]\n    D -->|chore| E3[\"📉 Patch\n    1.0.0 → 1.0.1\"]\n    \n    E1 --> F[\"📦 Release\"]\n    E2 --> F\n    E3 --> F\n    \n    style A fill:#4078f2,stroke:#2c5aa0,color:#fff\n    style F fill:#0e8a16,stroke:#0a6b11,color:#fff\n    style C1 fill:#d73a49,stroke:#b02a37,color:#fff\n    style C2 fill:#0e8a16,stroke:#0a6b11,color:#fff\n    style C3 fill:#ffd33d,stroke:#d4a72c,color:#000\n    style C4 fill:#0366d6,stroke:#024c9c,color:#fff\n","text",[30,31,27],"code",{"__ignoreMap":32},"",[34,35,36],"note",{},[11,37,38],{},"This workflow automates the entire release process from branch creation to production deployment.",[40,41,43],"h3",{"id":42},"pr-labeling-system","PR Labeling System",[45,46,47,51,54,60],"ul",{},[48,49,50],"li",{},"Monitors for new pull requests",[48,52,53],{},"Analyses branch names to apply appropriate labels",[48,55,56,57],{},"Uses configured patterns in ",[30,58,59],{},"pr-labeler.yml",[48,61,62],{},"Labels determine how changes are categorised in releases",[40,64,66],{"id":65},"release-management","Release Management",[68,69,70,91,110],"ol",{},[48,71,72,76],{},[73,74,75],"strong",{},"Development Releases",[68,77,78,85,88],{},[48,79,80,81,84],{},"Triggered by pushes to ",[30,82,83],{},"dev"," branch",[48,86,87],{},"Creates draft releases",[48,89,90],{},"Maintains development version tracking",[48,92,93,96,97],{},[73,94,95],{},"Production Releases",":\n",[68,98,99,104,107],{},[48,100,80,101,84],{},[30,102,103],{},"main",[48,105,106],{},"Automatically publishes releases",[48,108,109],{},"Includes hotfix detection",[48,111,112,115,116],{},[73,113,114],{},"Version Resolution"," : Automatically determines version numbers based on PR labels\n",[68,117,118,124,134],{},[48,119,120,123],{},[30,121,122],{},"breaking"," → Major version bump",[48,125,126,129,130,133],{},[30,127,128],{},"feature",", ",[30,131,132],{},"fix"," → Minor version bump",[48,135,136,139],{},[30,137,138],{},"chore",", etc. → Patch version bump",[15,141,143],{"id":142},"setup-instructions","Setup Instructions",[40,145,147],{"id":146},"prerequisites","Prerequisites",[45,149,150,153],{},[48,151,152],{},"GitHub Personal Access Token (classic) or Organisation Token",[48,154,155],{},"Token Must have private repository read, write and workflow permissions",[40,157,159],{"id":158},"required-files-structure","Required Files Structure",[23,161,168],{"className":162,"code":163,"filename":164,"highlights":165,"language":167,"meta":32,"style":32},"language-md shiki shiki-themes material-theme-lighter one-light one-dark-pro","📦root\n┣📦.github\n┣ 📂workflows\n┃ ┣ 📜pr-labeler.yml # PR labeling workflow\n┃ ┣ 📜release-dev.yml # Development release workflow\n┃ ┗ 📜release-prod.yml # Production release workflow\n┣ 📜pr-labeler.yml # Label configuration\n┗ 📜release-drafter.yml # Release configuration\n","Folder Structure.md",[166],3,"md",[30,169,170,179,185,192,198,204,210,216],{"__ignoreMap":32},[171,172,175],"span",{"class":173,"line":174},"line",1,[171,176,178],{"class":177},"sM89C","📦root\n",[171,180,182],{"class":173,"line":181},2,[171,183,184],{"class":177},"┣📦.github\n",[171,186,189],{"class":187,"line":166},[173,188],"highlight",[171,190,191],{"class":177},"┣ 📂workflows\n",[171,193,195],{"class":173,"line":194},4,[171,196,197],{"class":177},"┃ ┣ 📜pr-labeler.yml # PR labeling workflow\n",[171,199,201],{"class":173,"line":200},5,[171,202,203],{"class":177},"┃ ┣ 📜release-dev.yml # Development release workflow\n",[171,205,207],{"class":173,"line":206},6,[171,208,209],{"class":177},"┃ ┗ 📜release-prod.yml # Production release workflow\n",[171,211,213],{"class":173,"line":212},7,[171,214,215],{"class":177},"┣ 📜pr-labeler.yml # Label configuration\n",[171,217,219],{"class":173,"line":218},8,[171,220,221],{"class":177},"┗ 📜release-drafter.yml # Release configuration\n",[40,223,225],{"id":224},"customising-templates","Customising Templates",[40,227,229],{"id":228},"modifying-pr-labels","Modifying PR Labels",[11,231,232,233,236],{},"To add or modify label patterns, edit ",[30,234,235],{},".github\u002Fpr-labeler.yml",":",[23,238,242],{"className":239,"code":240,"filename":59,"language":241,"meta":32,"style":32},"language-yaml shiki shiki-themes material-theme-lighter one-light one-dark-pro","# Add new label\nenhancement: [\"enhance\u002F*\", \"improvement\u002F*\"]\n\n# Modify existing label\nfeature:\n  - \"feature\u002F*\"\n  - \"feat\u002F*\"\n  - \"new\u002F*\"\n","yaml",[30,243,244,250,286,292,297,303,316,327],{"__ignoreMap":32},[171,245,246],{"class":173,"line":174},[171,247,249],{"class":248},"seacL","# Add new label\n",[171,251,252,256,259,262,266,270,272,275,278,281,283],{"class":173,"line":181},[171,253,255],{"class":254},"su13H","enhancement",[171,257,236],{"class":258},"sB4Xn",[171,260,261],{"class":258}," [",[171,263,265],{"class":264},"sVH1b","\"",[171,267,269],{"class":268},"spZWa","enhance\u002F*",[171,271,265],{"class":264},[171,273,274],{"class":258},",",[171,276,277],{"class":264}," \"",[171,279,280],{"class":268},"improvement\u002F*",[171,282,265],{"class":264},[171,284,285],{"class":258},"]\n",[171,287,288],{"class":173,"line":166},[171,289,291],{"emptyLinePlaceholder":290},true,"\n",[171,293,294],{"class":173,"line":194},[171,295,296],{"class":248},"# Modify existing label\n",[171,298,299,301],{"class":173,"line":200},[171,300,128],{"class":254},[171,302,96],{"class":258},[171,304,305,308,310,313],{"class":173,"line":206},[171,306,307],{"class":258},"  -",[171,309,277],{"class":264},[171,311,312],{"class":268},"feature\u002F*",[171,314,315],{"class":264},"\"\n",[171,317,318,320,322,325],{"class":173,"line":212},[171,319,307],{"class":258},[171,321,277],{"class":264},[171,323,324],{"class":268},"feat\u002F*",[171,326,315],{"class":264},[171,328,329,331,333,336],{"class":173,"line":218},[171,330,307],{"class":258},[171,332,277],{"class":264},[171,334,335],{"class":268},"new\u002F*",[171,337,315],{"class":264},[40,339,341],{"id":340},"customising-release-notes","Customising Release Notes",[11,343,344,345,236],{},"Edit ",[30,346,347],{},".github\u002Frelease-drafter.yml",[68,349,350],{},[48,351,352,236],{},[73,353,354],{},"Change Categories",[23,356,359],{"className":239,"code":357,"filename":358,"language":241,"meta":32,"style":32},"categories:\n- title: '🚀 New Features' # Modified emoji and title\n\nlabels:\n- 'feature'\n- 'enhancement'\n- title: '🔧 Improvements' # New category\n\nlabels:\n- 'improvement'\n","release-drafter.yml",[30,360,361,368,390,394,401,412,422,440,444,451],{"__ignoreMap":32},[171,362,363,366],{"class":173,"line":174},[171,364,365],{"class":254},"categories",[171,367,96],{"class":258},[171,369,370,373,376,378,381,384,387],{"class":173,"line":181},[171,371,372],{"class":258},"-",[171,374,375],{"class":254}," title",[171,377,236],{"class":258},[171,379,380],{"class":264}," '",[171,382,383],{"class":268},"🚀 New Features",[171,385,386],{"class":264},"'",[171,388,389],{"class":248}," # Modified emoji and title\n",[171,391,392],{"class":173,"line":166},[171,393,291],{"emptyLinePlaceholder":290},[171,395,396,399],{"class":173,"line":194},[171,397,398],{"class":254},"labels",[171,400,96],{"class":258},[171,402,403,405,407,409],{"class":173,"line":200},[171,404,372],{"class":258},[171,406,380],{"class":264},[171,408,128],{"class":268},[171,410,411],{"class":264},"'\n",[171,413,414,416,418,420],{"class":173,"line":206},[171,415,372],{"class":258},[171,417,380],{"class":264},[171,419,255],{"class":268},[171,421,411],{"class":264},[171,423,424,426,428,430,432,435,437],{"class":173,"line":212},[171,425,372],{"class":258},[171,427,375],{"class":254},[171,429,236],{"class":258},[171,431,380],{"class":264},[171,433,434],{"class":268},"🔧 Improvements",[171,436,386],{"class":264},[171,438,439],{"class":248}," # New category\n",[171,441,442],{"class":173,"line":218},[171,443,291],{"emptyLinePlaceholder":290},[171,445,447,449],{"class":173,"line":446},9,[171,448,398],{"class":254},[171,450,96],{"class":258},[171,452,454,456,458,461],{"class":173,"line":453},10,[171,455,372],{"class":258},[171,457,380],{"class":264},[171,459,460],{"class":268},"improvement",[171,462,411],{"class":264},[68,464,465],{"start":181},[48,466,467,236],{},[73,468,469],{},"Modify Change Format",[23,471,474],{"className":239,"code":472,"filename":473,"language":241,"meta":32,"style":32},"# Add commit details\nchange-template: '- $TITLE (#$NUMBER)\\n $COMMIT_MESSAGES'\n","template format.yml",[30,475,476,481],{"__ignoreMap":32},[171,477,478],{"class":173,"line":174},[171,479,480],{"class":248},"# Add commit details\n",[171,482,483,486,488,490,493],{"class":173,"line":181},[171,484,485],{"class":254},"change-template",[171,487,236],{"class":258},[171,489,380],{"class":264},[171,491,492],{"class":268},"- $TITLE (#$NUMBER)\\n $COMMIT_MESSAGES",[171,494,411],{"class":264},[68,496,497],{"start":166},[48,498,499,236],{},[73,500,501],{},"Custom Release Template",[23,503,506],{"className":239,"code":504,"filename":505,"language":241,"meta":32,"style":32},"template: |\n\n## Release v$RESOLVED_VERSION\n### What's Changed\n$CHANGES\n\n### Contributors\n$CONTRIBUTORS\n\n### Additional Notes\n_Released on: $RELEASE_DATE_\n\n","Release Template.yml",[30,507,508,519,523,528,533,538,542,547,552,556,561],{"__ignoreMap":32},[171,509,510,513,515],{"class":173,"line":174},[171,511,512],{"class":254},"template",[171,514,236],{"class":258},[171,516,518],{"class":517},"sQsOY"," |\n",[171,520,521],{"class":173,"line":181},[171,522,291],{"emptyLinePlaceholder":290},[171,524,525],{"class":173,"line":166},[171,526,527],{"class":248},"## Release v$RESOLVED_VERSION\n",[171,529,530],{"class":173,"line":194},[171,531,532],{"class":248},"### What's Changed\n",[171,534,535],{"class":173,"line":200},[171,536,537],{"class":268},"$CHANGES\n",[171,539,540],{"class":173,"line":206},[171,541,291],{"emptyLinePlaceholder":290},[171,543,544],{"class":173,"line":212},[171,545,546],{"class":248},"### Contributors\n",[171,548,549],{"class":173,"line":218},[171,550,551],{"class":268},"$CONTRIBUTORS\n",[171,553,554],{"class":173,"line":446},[171,555,291],{"emptyLinePlaceholder":290},[171,557,558],{"class":173,"line":453},[171,559,560],{"class":248},"### Additional Notes\n",[171,562,564,567,569],{"class":173,"line":563},11,[171,565,566],{"class":254},"_Released on",[171,568,236],{"class":258},[171,570,571],{"class":268}," $RELEASE_DATE_\n",[15,573,575],{"id":574},"branch-naming-convention","Branch Naming Convention",[23,577,580],{"className":162,"code":578,"filename":579,"language":167,"meta":32,"style":32},"\u003Ctype>\u002F\u003Cdescription>\n\nTypes:\n\nfeature\u002F → New features (minor version)\n\nfix\u002F → Bug fixes (minor version)\n\nchore\u002F → Maintenance (patch version)\n\nbreaking\u002F → Breaking changes (major version)\n","Branch Naming Convention.md",[30,581,582,587,591,596,600,605,609,614,618,623,627],{"__ignoreMap":32},[171,583,584],{"class":173,"line":174},[171,585,586],{"class":177},"\u003Ctype>\u002F\u003Cdescription>\n",[171,588,589],{"class":173,"line":181},[171,590,291],{"emptyLinePlaceholder":290},[171,592,593],{"class":173,"line":166},[171,594,595],{"class":177},"Types:\n",[171,597,598],{"class":173,"line":194},[171,599,291],{"emptyLinePlaceholder":290},[171,601,602],{"class":173,"line":200},[171,603,604],{"class":177},"feature\u002F → New features (minor version)\n",[171,606,607],{"class":173,"line":206},[171,608,291],{"emptyLinePlaceholder":290},[171,610,611],{"class":173,"line":212},[171,612,613],{"class":177},"fix\u002F → Bug fixes (minor version)\n",[171,615,616],{"class":173,"line":218},[171,617,291],{"emptyLinePlaceholder":290},[171,619,620],{"class":173,"line":446},[171,621,622],{"class":177},"chore\u002F → Maintenance (patch version)\n",[171,624,625],{"class":173,"line":453},[171,626,291],{"emptyLinePlaceholder":290},[171,628,629],{"class":173,"line":563},[171,630,631],{"class":177},"breaking\u002F → Breaking changes (major version)\n",[11,633,634],{},"Examples:",[23,636,641],{"className":637,"code":638,"filename":639,"language":640,"meta":32,"style":32},"language-txt shiki shiki-themes material-theme-lighter one-light one-dark-pro","feature\u002Fuser-authentication\n\nfix\u002Flogin-timeout\n\nchore\u002Fupdate-dependencies\n\nbreaking\u002Fapi-v2\n","Example Branch Name.md","txt",[30,642,643,648,652,657,661,666,670],{"__ignoreMap":32},[171,644,645],{"class":173,"line":174},[171,646,647],{},"feature\u002Fuser-authentication\n",[171,649,650],{"class":173,"line":181},[171,651,291],{"emptyLinePlaceholder":290},[171,653,654],{"class":173,"line":166},[171,655,656],{},"fix\u002Flogin-timeout\n",[171,658,659],{"class":173,"line":194},[171,660,291],{"emptyLinePlaceholder":290},[171,662,663],{"class":173,"line":200},[171,664,665],{},"chore\u002Fupdate-dependencies\n",[171,667,668],{"class":173,"line":206},[171,669,291],{"emptyLinePlaceholder":290},[171,671,672],{"class":173,"line":212},[171,673,674],{},"breaking\u002Fapi-v2\n",[15,676,678],{"id":677},"development-flow","Development Flow",[68,680,681],{},[48,682,683,236],{},[73,684,685],{},"Create Feature Branch",[23,687,691],{"className":688,"code":689,"language":690,"meta":32,"style":32},"language-bash shiki shiki-themes material-theme-lighter one-light one-dark-pro","git checkout -b feature\u002Fnew-login\n","bash",[30,692,693],{"__ignoreMap":32},[171,694,695,699,702,706],{"class":173,"line":174},[171,696,698],{"class":697},"stT07","git",[171,700,701],{"class":268}," checkout",[171,703,705],{"class":704},"s6NbW"," -b",[171,707,708],{"class":268}," feature\u002Fnew-login\n",[68,710,711],{"start":181},[48,712,713,236],{},[73,714,715],{},"Make Changes and Commit",[23,717,719],{"className":688,"code":718,"language":690,"meta":32,"style":32},"git commit -m \"feat: Add OAuth login\"\n\ngit commit -m \"Add password reset\"\n",[30,720,721,738,742],{"__ignoreMap":32},[171,722,723,725,728,731,733,736],{"class":173,"line":174},[171,724,698],{"class":697},[171,726,727],{"class":268}," commit",[171,729,730],{"class":704}," -m",[171,732,277],{"class":264},[171,734,735],{"class":268},"feat: Add OAuth login",[171,737,315],{"class":264},[171,739,740],{"class":173,"line":181},[171,741,291],{"emptyLinePlaceholder":290},[171,743,744,746,748,750,752,755],{"class":173,"line":166},[171,745,698],{"class":697},[171,747,727],{"class":268},[171,749,730],{"class":704},[171,751,277],{"class":264},[171,753,754],{"class":268},"Add password reset",[171,756,315],{"class":264},[68,758,759],{"start":166},[48,760,761,236],{},[73,762,763],{},"Create Pull Request",[45,765,766,769],{},[48,767,768],{},"Title: \"Add new authentication system\"",[48,770,771],{},"Branch will automatically be labeled as \"feature\"",[68,773,774],{"start":194},[48,775,776,236],{},[73,777,778],{},"Merge Process",[45,780,781,784],{},[48,782,783],{},"Dev: Creates draft release",[48,785,786],{},"Main: Publishes release automatically",[15,788,790],{"id":789},"troubleshooting","Troubleshooting",[40,792,794],{"id":793},"common-issues","Common Issues",[68,796,797],{},[48,798,799],{},[73,800,801],{},"PR Labels Not Applied",[45,803,804,809,812],{},[48,805,806,807],{},"Verify branch name matches patterns in ",[30,808,59],{},[48,810,811],{},"Check workflow permissions in GitHub",[48,813,814],{},"Verify TOKEN secret is configured",[68,816,817],{"start":181},[48,818,819],{},[73,820,821],{},"Release Not Generated",[45,823,824,833,836],{},[48,825,826,827,829,830,832],{},"Check branch matches workflow trigger (",[30,828,83],{}," or ",[30,831,103],{},")",[48,834,835],{},"Review workflow run logs for errors",[48,837,838,841,842,844,845,832],{},[30,839,840],{},".github"," dir with all files needs to be in both (",[30,843,83],{}," and ",[30,846,103],{},[68,848,849],{"start":166},[48,850,851],{},[73,852,853],{},"Incorrect Version Numbers",[45,855,856,863,866],{},[48,857,858,859,862],{},"Check PR labels match ",[30,860,861],{},"version-resolver"," configuration",[48,864,865],{},"Verify label application in PR",[48,867,868],{},"Review version resolution rules",[15,870,872],{"id":871},"support-future-improvements","Support & Future Improvements",[45,874,875,878],{},[48,876,877],{},"Review GitHub Actions logs",[48,879,880],{},[881,882,883],"a",{"href":883,"rel":884},"https:\u002F\u002Fhelp.shortcut.com\u002Fhc\u002Fen-us\u002Farticles\u002F207540323-Using-Branches-and-Pull-Requests-with-the-Shortcut-VCS-Integrations",[885],"nofollow",[15,887,889],{"id":888},"thank-you","Thank You",[891,892,893],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sM89C, html code.shiki .sM89C{--shiki-light:#90A4AE;--shiki-default:#383A42;--shiki-dark:#ABB2BF}html pre.shiki code .seacL, html code.shiki .seacL{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0A1A7;--shiki-default-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic}html pre.shiki code .su13H, html code.shiki .su13H{--shiki-light:#E53935;--shiki-default:#E45649;--shiki-dark:#E06C75}html pre.shiki code .sB4Xn, html code.shiki .sB4Xn{--shiki-light:#39ADB5;--shiki-default:#383A42;--shiki-dark:#ABB2BF}html pre.shiki code .sVH1b, html code.shiki .sVH1b{--shiki-light:#39ADB5;--shiki-default:#50A14F;--shiki-dark:#98C379}html pre.shiki code .spZWa, html code.shiki .spZWa{--shiki-light:#91B859;--shiki-default:#50A14F;--shiki-dark:#98C379}html pre.shiki code .sQsOY, html code.shiki .sQsOY{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#A626A4;--shiki-default-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:inherit}html pre.shiki code .stT07, html code.shiki .stT07{--shiki-light:#E2931D;--shiki-default:#4078F2;--shiki-dark:#61AFEF}html pre.shiki code .s6NbW, html code.shiki .s6NbW{--shiki-light:#91B859;--shiki-default:#986801;--shiki-dark:#D19A66}",{"title":32,"searchDepth":181,"depth":181,"links":895},[896,900,907,908,909,912,913],{"id":17,"depth":181,"text":18,"children":897},[898,899],{"id":42,"depth":166,"text":43},{"id":65,"depth":166,"text":66},{"id":142,"depth":181,"text":143,"children":901},[902,903,904,905,906],{"id":146,"depth":166,"text":147},{"id":158,"depth":166,"text":159},{"id":224,"depth":166,"text":225},{"id":228,"depth":166,"text":229},{"id":340,"depth":166,"text":341},{"id":574,"depth":181,"text":575},{"id":677,"depth":181,"text":678},{"id":789,"depth":181,"text":790,"children":910},[911],{"id":793,"depth":166,"text":794},{"id":871,"depth":181,"text":872},{"id":888,"depth":181,"text":889},"2024-12-01",false,{"slug":917,"difficulty":918,"featured":915,"icon":919,"ogImage":920,"tags":922,"topic":919},"commit-to-release","advanced","devops",{"alt":921},"Automating GitHub Workflows",[923,924,925],"dev-ops","ci-cd","automation","\u002Farticles\u002Fcommit-to-release",{"title":5,"description":13},"articles\u002Fcommit-to-release","0CgyLEDVNVyiRjb1mTYmQYsSlALIaKzf6gvaajtTPYE",[931,936],{"title":932,"path":933,"stem":934,"description":935,"children":-1},"How to Handle Browser Back Button Navigation Events in Vue 3","\u002Farticles\u002Fremote-back-button-js","articles\u002Fremote-back-button-js","As web applications become more sophisticated, managing browser navigation becomes increasingly complex. One common challenge is handling the browser's back button when dealing with modals, dialogs, or drawers. Today, we'll explore a powerful Vue 3 composable that solves this problem while maintaining a smooth user experience.",{"title":937,"path":938,"stem":939,"description":940,"children":-1},"Nuxt Server-Side Proxy for Open Weather Api","\u002Farticles\u002Fopen-weather-proxy","articles\u002Fopen-weather-proxy","A common problem when using open weather api is Cross-Origin Resource Sharing (CORS) issues. This typically happens when you're trying to make an API call from a web application running in a browser, and the browser blocks the request because the API server does not include the necessary CORS headers in its response. The quickest fix is to add a cors header however, as we do not control the api server we can not add a cors header even if we wanted too.",1778820754460]