[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fintegrations\u002Fgithub-nuxt-content":3},{"id":4,"title":5,"body":6,"description":748,"extension":749,"meta":750,"navigation":751,"order":752,"path":753,"seo":754,"stem":755,"summary":756,"__hash__":757},"docs\u002Fdocs\u002Fintegrations\u002Fgithub-nuxt-content.md","GitHub and Nuxt Content integration",{"type":7,"value":8,"toc":734},"minimark",[9,13,22,30,42,47,50,75,78,144,147,201,205,235,238,242,245,276,279,283,286,300,303,307,310,313,387,390,461,465,468,510,516,520,523,527,530,533,597,601,604,634,638,703,707,710,727,730],[10,11,5],"h1",{"id":12},"github-and-nuxt-content-integration",[14,15,16,17,21],"p",{},"The GitHub path is for websites whose content is stored as files and deployed from Git. It is strongest for Nuxt Content sites, especially when the customer already uses ",[18,19,20],"code",{},"@nuxt\u002Fcontent",".",[14,23,24,25,21],{},"For Next.js or another custom framework, use this path only when the app already has a file-backed content route that can render the files 42flows commits. Otherwise use the ",[26,27,29],"a",{"href":28},"\u002Fdocs\u002Fintegrations\u002Fwebhook","universal webhook",[14,31,32,33,37,38,21],{},"For the broader setup hub, see the ",[26,34,36],{"href":35},"\u002Fnuxt","Nuxt setup guides"," and the ",[26,39,41],{"href":40},"\u002Ffeatures\u002Fnuxt-content-publishing","Nuxt Content publishing feature page",[43,44,46],"h2",{"id":45},"what-gets-installed","What gets installed",[14,48,49],{},"For Nuxt sites, 42flows uses the npm package:",[51,52,57],"pre",{"className":53,"code":54,"language":55,"meta":56,"style":56},"language-bash shiki shiki-themes github-light github-dark","npm install @42flowsdotcom\u002Fnuxt-content\n","bash","",[18,58,59],{"__ignoreMap":56},[60,61,64,68,72],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"sScJk","npm",[60,69,71],{"class":70},"sZZnC"," install",[60,73,74],{"class":70}," @42flowsdotcom\u002Fnuxt-content\n",[14,76,77],{},"The package provides:",[79,80,81,94],"table",{},[82,83,84],"thead",{},[85,86,87,91],"tr",{},[88,89,90],"th",{},"Capability",[88,92,93],{},"Purpose",[95,96,97,108,118,126,136],"tbody",{},[85,98,99,105],{},[100,101,102],"td",{},[18,103,104],{},"\u002Fapi\u002F42flows\u002Fcontent",[100,106,107],{},"Direct receiver endpoint for POSTing content when using direct receiver delivery.",[85,109,110,115],{},[100,111,112],{},[18,113,114],{},"\u002Fapi\u002F42flows\u002Fhealth",[100,116,117],{},"Authenticated health check used by the dashboard connection test.",[85,119,120,123],{},[100,121,122],{},"MDC components",[100,124,125],{},"Rich content blocks such as summaries, FAQ, sources, comparison tables, definitions, and strategy lists.",[85,127,128,131],{},[100,129,130],{},"Route\u002Fcontent helpers",[100,132,133,134,21],{},"A Nuxt-side layer for rendering 42flows content with ",[18,135,20],{},[85,137,138,141],{},[100,139,140],{},"Analytics proxy helpers",[100,142,143],{},"Supporting runtime routes used by the package where enabled.",[14,145,146],{},"The package can run in multiple modes:",[79,148,149,159],{},[82,150,151],{},[85,152,153,156],{},[88,154,155],{},"Mode",[88,157,158],{},"Meaning",[95,160,161,171,181,191],{},[85,162,163,168],{},[100,164,165],{},[18,166,167],{},"auto",[100,169,170],{},"Let the module use the default 42flows behavior where possible.",[85,172,173,178],{},[100,174,175],{},[18,176,177],{},"takeover",[100,179,180],{},"Let the 42flows route layer own the relevant content route.",[85,182,183,188],{},[100,184,185],{},[18,186,187],{},"headless",[100,189,190],{},"Install endpoints\u002Fcomponents without owning routes.",[85,192,193,198],{},[100,194,195],{},[18,196,197],{},"dual-source",[100,199,200],{},"Use local content and 42flows content side by side.",[43,202,204],{"id":203},"connect-flow","Connect flow",[206,207,208,217,220,223,226,229,232],"ol",{},[209,210,211,212,216],"li",{},"The customer chooses ",[213,214,215],"strong",{},"Nuxt Content via GitHub"," in the dashboard.",[209,218,219],{},"They install the 42flows GitHub App on the selected repository.",[209,221,222],{},"The dashboard lists repositories from the installation session.",[209,224,225],{},"The customer selects owner, repo, branch, and content root.",[209,227,228],{},"42flows introspects the repo.",[209,230,231],{},"If the project is a Nuxt site, 42flows can add the receiver package where appropriate.",[209,233,234],{},"Future content is delivered through Git commits.",[14,236,237],{},"The dashboard should show which repo, branch, and content folder are being used before content is published.",[43,239,241],{"id":240},"repo-introspection","Repo introspection",[14,243,244],{},"The introspection step reads the repository before committing anything. It looks for:",[246,247,248,254,259,264,267,270,273],"ul",{},[209,249,250,253],{},[18,251,252],{},"package.json"," and package manager lockfiles.",[209,255,256,21],{},[18,257,258],{},"nuxt.config.*",[209,260,261,21],{},[18,262,263],{},"content.config.ts",[209,265,266],{},"Optional 42flows route configuration.",[209,268,269],{},"Existing markdown\u002Fcontent directories.",[209,271,272],{},"Route conventions that map files to public URLs.",[209,274,275],{},"Default branch and repository metadata.",[14,277,278],{},"This is how the dashboard can explain what 42flows will change before it changes it.",[43,280,282],{"id":281},"generated-commits","Generated commits",[14,284,285],{},"When a flow publishes through GitHub, 42flows creates one Git commit that can include:",[246,287,288,291,294,297],{},[209,289,290],{},"The generated markdown\u002FMDC article.",[209,292,293],{},"Optional featured image assets.",[209,295,296],{},"Receiver package\u002Finstall changes when the setup step needs them.",[209,298,299],{},"Lockfile changes when the package manager update is part of the receiver install.",[14,301,302],{},"42flows keeps one publication as one Git commit where possible, so the customer's deploy pipeline gets one clean change to build.",[43,304,306],{"id":305},"file-path-and-public-url-mapping","File path and public URL mapping",[14,308,309],{},"GitHub delivery resolves both a file path and a public URL.",[14,311,312],{},"Example:",[79,314,315,325],{},[82,316,317],{},[85,318,319,322],{},[88,320,321],{},"Input",[88,323,324],{},"Example value",[95,326,327,337,347,357,367,377],{},[85,328,329,332],{},[100,330,331],{},"Flow type",[100,333,334],{},[18,335,336],{},"origin",[85,338,339,342],{},[100,340,341],{},"Slug",[100,343,344],{},[18,345,346],{},"best-ai-seo-workflow-for-dentists",[85,348,349,352],{},[100,350,351],{},"Content root",[100,353,354],{},[18,355,356],{},"content",[85,358,359,362],{},[100,360,361],{},"Pattern",[100,363,364],{},[18,365,366],{},"\u002Fblog\u002F:slug",[85,368,369,372],{},[100,370,371],{},"File path",[100,373,374],{},[18,375,376],{},"content\u002Fblog\u002Fbest-ai-seo-workflow-for-dentists.md",[85,378,379,382],{},[100,380,381],{},"Public URL",[100,383,384],{},[18,385,386],{},"https:\u002F\u002Fcustomer.com\u002Fblog\u002Fbest-ai-seo-workflow-for-dentists",[14,388,389],{},"42flows should follow the route shape the site already uses. If the repo does not show a custom route, these are the default patterns:",[79,391,392,401],{},[82,393,394],{},[85,395,396,399],{},[88,397,398],{},"Flow",[88,400,361],{},[95,402,403,412,422,432,442,452],{},[85,404,405,408],{},[100,406,407],{},"Origin Flow",[100,409,410],{},[18,411,366],{},[85,413,414,417],{},[100,415,416],{},"Friction Flow",[100,418,419],{},[18,420,421],{},"\u002Fproblem\u002F:slug",[85,423,424,427],{},[100,425,426],{},"Comparison Flow",[100,428,429],{},[18,430,431],{},"\u002Fcompare\u002F:slug",[85,433,434,437],{},[100,435,436],{},"Reports",[100,438,439],{},[18,440,441],{},"\u002Freports\u002F:slug",[85,443,444,447],{},[100,445,446],{},"Best\u002FPicks",[100,448,449],{},[18,450,451],{},"\u002Fpicks\u002F:slug",[85,453,454,457],{},[100,455,456],{},"Cold Flow",[100,458,459],{},[18,460,366],{},[43,462,464],{"id":463},"direct-receiver-versus-github-commit","Direct receiver versus GitHub commit",[14,466,467],{},"Nuxt has two delivery styles:",[79,469,470,483],{},[82,471,472],{},[85,473,474,477,480],{},[88,475,476],{},"Style",[88,478,479],{},"How content arrives",[88,481,482],{},"Best fit",[95,484,485,496],{},[85,486,487,490,493],{},[100,488,489],{},"GitHub commit",[100,491,492],{},"42flows commits markdown\u002Fassets into the repo. The customer's deploy pipeline builds the site.",[100,494,495],{},"Vercel\u002FNetlify\u002FGitHub-deployed Nuxt sites with file-backed content.",[85,497,498,501,507],{},[100,499,500],{},"Direct receiver",[100,502,503,504,506],{},"42flows sends content to ",[18,505,104],{}," with a bearer token.",[100,508,509],{},"Self-hosted Nuxt sites or customers that want direct delivery without Git commits.",[14,511,512,513,515],{},"GitHub commit mode does not need to call ",[18,514,104],{}," for each article. The receiver package is still useful because it gives the site a known 42flows rendering and component layer.",[43,517,519],{"id":518},"improving-existing-markdown-pages","Improving existing markdown pages",[14,521,522],{},"If the existing page is a markdown file in the repo, 42flows can propose file-level improvements and commit accepted changes. If a Git change needs to be undone, use the normal GitHub and deployment workflow for that repo.",[43,524,526],{"id":525},"verification","Verification",[14,528,529],{},"After delivery, 42flows can schedule a live URL verification. The verifier fetches the public URL and checks whether the expected 42flows marker is present.",[14,531,532],{},"Useful outcomes:",[79,534,535,545],{},[82,536,537],{},[85,538,539,542],{},[88,540,541],{},"Result",[88,543,544],{},"Common cause",[95,546,547,557,567,577,587],{},[85,548,549,554],{},[100,550,551],{},[18,552,553],{},"success",[100,555,556],{},"Deploy finished and the page rendered with the marker.",[85,558,559,564],{},[100,560,561],{},[18,562,563],{},"not_found",[100,565,566],{},"Deploy has not run yet, the route pattern is wrong, or content root is wrong.",[85,568,569,574],{},[100,570,571],{},[18,572,573],{},"build_failure",[100,575,576],{},"The committed content or package install broke the customer build.",[85,578,579,584],{},[100,580,581],{},[18,582,583],{},"slug_collision",[100,585,586],{},"The public URL belongs to a different page.",[85,588,589,594],{},[100,590,591],{},[18,592,593],{},"stale_cache",[100,595,596],{},"The CDN or static host still serves the old build.",[43,598,600],{"id":599},"customer-facing-setup-checklist","Customer-facing setup checklist",[14,602,603],{},"For a smooth GitHub integration:",[206,605,606,609,612,615,621,628,631],{},[209,607,608],{},"Confirm the customer owns the repository and can install GitHub Apps.",[209,610,611],{},"Confirm the repo deploys from the branch selected in the dashboard.",[209,613,614],{},"Confirm the site has a public route for the intended content path.",[209,616,617,618,620],{},"For Nuxt, confirm ",[18,619,20],{}," is present or can be added.",[209,622,623,624,627],{},"Add ",[18,625,626],{},"@42flowsdotcom\u002Fnuxt-content"," through the automated install or the manual fallback.",[209,629,630],{},"Set the receiver\u002FAPI key if direct receiver mode is used.",[209,632,633],{},"Publish a test article and wait for delivery verification.",[43,635,637],{"id":636},"troubleshooting","Troubleshooting",[79,639,640,650],{},[82,641,642],{},[85,643,644,647],{},[88,645,646],{},"Symptom",[88,648,649],{},"Check",[95,651,652,660,671,679,687,695],{},[85,653,654,657],{},[100,655,656],{},"The dashboard cannot list repos",[100,658,659],{},"The GitHub App installation session may have expired or the app was installed on a different account.",[85,661,662,665],{},[100,663,664],{},"Receiver install fails",[100,666,667,668,670],{},"Check package manager lockfile state, Nuxt version, ",[18,669,20],{}," version, and whether the branch is protected.",[85,672,673,676],{},[100,674,675],{},"File committed but page 404s",[100,677,678],{},"Check content root, route pattern, slug, and deploy completion.",[85,680,681,684],{},[100,682,683],{},"Page renders raw MDC components",[100,685,686],{},"The site does not have the 42flows Nuxt module\u002Fcomponent layer active.",[85,688,689,692],{},[100,690,691],{},"Build fails after commit",[100,693,694],{},"Inspect the deployment logs, then either fix the renderer\u002Fpackage setup or revert the commit.",[85,696,697,700],{},[100,698,699],{},"Verification sees stale content",[100,701,702],{},"Purge static host\u002FCDN cache or wait for the deployment to finish.",[43,704,706],{"id":705},"when-not-to-use-github-delivery","When not to use GitHub delivery",[14,708,709],{},"Do not use GitHub delivery just because the customer code lives on GitHub. Use the webhook when:",[246,711,712,715,718,721,724],{},[209,713,714],{},"The app stores content in a database.",[209,716,717],{},"The app uses a headless CMS.",[209,719,720],{},"The app needs ISR\u002Frevalidation logic after writes.",[209,722,723],{},"The app cannot render the MDC\u002Fmarkdown file format.",[209,725,726],{},"The customer wants to validate and transform payloads before storing them.",[14,728,729],{},"In those cases, the customer route should receive the 42flows payload, upsert by slug, trigger cache\u002Fbuild work, and return the public URL.",[731,732,733],"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 .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);}",{"title":56,"searchDepth":735,"depth":735,"links":736},2,[737,738,739,740,741,742,743,744,745,746,747],{"id":45,"depth":735,"text":46},{"id":203,"depth":735,"text":204},{"id":240,"depth":735,"text":241},{"id":281,"depth":735,"text":282},{"id":305,"depth":735,"text":306},{"id":463,"depth":735,"text":464},{"id":518,"depth":735,"text":519},{"id":525,"depth":735,"text":526},{"id":599,"depth":735,"text":600},{"id":636,"depth":735,"text":637},{"id":705,"depth":735,"text":706},"How 42flows uses the GitHub App, Nuxt Content receiver package, repository introspection, flow paths, and markdown commits to publish content.","md",{},true,22,"\u002Fdocs\u002Fintegrations\u002Fgithub-nuxt-content",{"title":5,"description":748},"docs\u002Fintegrations\u002Fgithub-nuxt-content","The GitHub-based path for modern file-backed websites, including Nuxt Content receiver setup, generated commits, route mapping, and troubleshooting.","iu9loRuatnp5olbJWHnKarVgAkz6owfvCvPGnuuFRF8"]