[{"data":1,"prerenderedAt":1873},["ShallowReactive",2],{"sidebar-posts":3,"post-count":89,"post-\u002Fnuxt-jam-stack":90,"page-\u002Fnuxt-jam-stack":1863,"neighbours-\u002Fnuxt-jam-stack":1865,"post-projects-\u002Fnuxt-jam-stack":1870},[4,8,11,15,19,23,27,30,34,38,42,46,50,54,58,61,65,69,73,77,81,85],{"path":5,"title":6,"date":7},"\u002Fclaude-found-a-security-bug-then-someone-came-probing","Claude found a security bug. The same day, someone came probing for it.","2026-11-11",{"path":9,"title":10,"date":7},"\u002Fm4-mac-mini-2tb-ssd-upgrade","I swapped the 256 GB SSD in my M4 Mac Mini for 2 TB",{"path":12,"title":13,"date":14},"\u002Fmaxing-out-claude-code-weeks-2-3","Maxing out Claude Code, weeks 2 and 3: two apps in review, SEO bots on autopilot and a power cut","2026-11-06",{"path":16,"title":17,"date":18},"\u002Fbuilding-take-contentin-mobile-app","I built a ContentIn mobile app in one night and tested it from the sauna","2026-10-29",{"path":20,"title":21,"date":22},"\u002Fmac-mini-claude-code-dev-server","My Mac Mini is my dev server, and one Claude Code session runs each project","2026-10-27",{"path":24,"title":25,"date":26},"\u002Fmax-out-claude-code-every-week","Max out Claude Code every week until I make 10K a month","2026-10-26",{"path":28,"title":29,"date":26},"\u002Fmaxing-out-claude-code-week-1","Maxing out Claude Code, week 1: a new blog, an app stuck in review and a full Mac Mini",{"path":31,"title":32,"date":33},"\u002Ffully-ai-coded-blog-claude-code","This blog is now fully AI coded and run by an agent I just talk to","2026-10-24",{"path":35,"title":36,"date":37},"\u002Fwhy-i-built-pepelly","Why I built Pepelly, a YouTube app for my daughter without the brain rot","2026-10-22",{"path":39,"title":40,"date":41},"\u002Fhow-i-built-an-equity-tracking-app-for-bootstrap-founders-in-a-weekend","How I Built an Equity Tracking App for Bootstrap Founders in a Weekend","2024-11-25",{"path":43,"title":44,"date":45},"\u002Fbuilding-directory-website-with-ai-in-a-day","How I Built a Directory Website in a Day with AI—and Why It's a Game-Changer for SaaS Traffic","2024-11-10",{"path":47,"title":48,"date":49},"\u002Fnetlify-build-plugin-for-nuxt-dynamic-routes","Use a netlify build plugin to generate your nuxt routes","2020-08-08",{"path":51,"title":52,"date":53},"\u002Foptimized-responsive-lazyloading-images-with-nuxt","How to use optimized, responsive and lazyloading images in a nuxt project","2019-11-16",{"path":55,"title":56,"date":57},"\u002Fnuxt-jam-stack","Building a SEO optimized blog with a Nuxt JAM stack and Markdown files","2019-11-07",{"path":59,"title":60,"date":57},"\u002Fprismjs-nuxtjs-static-pages","Getting Prismjs working with Nuxt",{"path":62,"title":63,"date":64},"\u002Fkeylogs-live-on-producthunt","My second launch this year: Keylogs is LIVE on Product Hunt today!","2018-02-12",{"path":66,"title":67,"date":68},"\u002Fa-new-year-and-a-new-startup","A new year and a new startup","2018-01-19",{"path":70,"title":71,"date":72},"\u002Fabout-mydash-whats-the-stack-and-why-did-i-choose-it","About myDash - What’s the stack and why did I choose it?","2017-10-16",{"path":74,"title":75,"date":76},"\u002Fsuper-fast-wordpress-hosting-germany","WordPress hosting test: super fast on raidboxes.eu","2016-12-09",{"path":78,"title":79,"date":80},"\u002Fbest-resources-for-stock-images","Best resources for stock images","2016-12-05",{"path":82,"title":83,"date":84},"\u002Fset-up-automatic-backups-for-parse-server-on-digital-ocean","Set up automatic backups for parse-server on digital ocean","2016-05-25",{"path":86,"title":87,"date":88},"\u002Fhow-to-run-parse-dashboard-alongside-parse-server-on-digital-ocean","How to setup parse-dashboard alongside parse-server on Digital Ocean","2016-05-18",22,{"id":91,"title":56,"body":92,"date":57,"description":1852,"draft":1853,"extension":1854,"image":1855,"meta":1856,"navigation":501,"path":55,"projects":1857,"readingTime":378,"seo":1859,"stem":1860,"tags":1861,"updated":1863,"__hash__":1864},"posts\u002Fnuxt-jam-stack.md",{"type":93,"value":94,"toc":1830},"minimark",[95,130,135,138,147,158,161,174,179,182,185,188,192,195,233,236,240,250,271,275,279,286,290,293,335,342,424,428,435,530,539,543,550,577,588,613,617,628,1190,1196,1200,1207,1547,1558,1562,1569,1588,1592,1596,1607,1678,1685,1688,1742,1750,1754,1775,1784,1788,1791,1794,1806,1809,1826],[96,97,98],"p",{},[99,100,109,127],"a",{"style":101,"href":102,"target":103,"rel":104,"title":108},"float:right;background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, \"San Francisco\", \"Helvetica Neue\", Helvetica, Ubuntu, Roboto, Noto, \"Segoe UI\", Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px","https:\u002F\u002Funsplash.com\u002F@foodfaithfit?utm_medium=referral&utm_campaign=photographer-credit&utm_content=creditBadge","_blank",[105,106,107],"nofollow","noopener","noreferrer","Download free do whatever you want high-resolution photos from Taylor Kiser",[110,111,113],"span",{"style":112},"display:inline-block;padding:2px 3px",[114,115,119,123],"svg",{"xmlns":116,"style":117,"viewBox":118},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white","0 0 32 32",[120,121,122],"title",{},"unsplash-logo",[124,125],"path",{"d":126},"M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z",[110,128,129],{"style":112},"Taylor Kiser",[131,132,134],"h2",{"id":133},"the-quest","The quest",[96,136,137],{},"This blog keeps evolving with me. It started as a flash(!) website about 12 years back, briefly resided in WordPress and has been a ghost installation for the past few years. Even though I don't write very regularly, every once in a while I rebuild it with some new system. Mainly to test some new development in web tech.",[96,139,140,141,146],{},"This time I wanted to create a JAM stack without a CMS in the back for ease of maintenance. ",[99,142,145],{"href":143,"rel":144},"https:\u002F\u002Fjamstack.wtf\u002F",[105],"JAM"," stands for Javascript, API and Markup. All pages are pre-build and ready html files on the server. In my case I wanted the content with markdown files right in my code repository. So technically I'm skipping the A - does that make this a JM stack? Or better a JMM stack for markdown? Who knows - who cares? ¯\\_(ツ)_\u002F¯",[148,149,150],"blockquote",{},[96,151,152,153,157],{},"Hint: this was a pain to write in markdown with all the escapes: ",[154,155,156],"code",{},"¯&#92;\\_(ツ)\\_\u002F¯",")",[96,159,160],{},"I was intrigued by the JAM stack for several reasons:",[162,163,164,168,171],"ul",{},[165,166,167],"li",{},"it's easier and faster to build and maintain a custom site",[165,169,170],{},"I love writing in markdown",[165,172,173],{},"It can be hosted server less which means less setup, maintainance and money",[175,176,178],"h3",{"id":177},"why-i-wanted-to-switch-from-ghost","Why I wanted to switch from Ghost",[96,180,181],{},"I was using ghost for the previous version of this blog. I love the simplicity and usability of the backend a lot. Why did I want to switch? For one, I never really liked working with handlebars in the theme files. But more importantly I used to host it on a little dokku server that I use for small apps. For some reason this installation broke a few weeks back.",[96,183,184],{},"It has always been a hassle for me to get ghost going on a non-dedicated server. The CLI unfortunately didn't help too much for me. Worst is the upgrading though. I've skipped the jump to the 1.0 version a few year back and that made it almost impossible for me to upgrade my broken blog to an update running version. I was trying for 4 hours just to get an export of my old content to be able to import it in a newer version. Upgrading to a new version is often better done by a completely new installation on a new server.",[96,186,187],{},"The last time it broke I set up a new VPS for it as this was quicker than befriending dokku and ghost again. Since this is really just a personal blog an own server and all this maintenance hassle seemed like overkill. So JAM to the rescue!",[131,189,191],{"id":190},"the-plan-setup-and-challenge","The plan, setup and challenge",[96,193,194],{},"Here is what I had in mind for the blog:",[162,196,197,200,203,211,219,222,230],{},[165,198,199],{},"super fast rendering",[165,201,202],{},"SEO optimized",[165,204,205,206],{},"simple, clean design with ",[99,207,210],{"href":208,"rel":209},"https:\u002F\u002Ftailwindcss.com\u002F",[105],"tailwindcss",[165,212,213,218],{},[99,214,217],{"href":215,"rel":216},"https:\u002F\u002Fnuxtjs.org\u002F",[105],"nuxt"," at the core",[165,220,221],{},"markdown for content",[165,223,224,225],{},"server less hosting on ",[99,226,229],{"href":227,"rel":228},"https:\u002F\u002Fwww.netlify.com\u002F",[105],"netlify",[165,231,232],{},"comments handled by disqus",[96,234,235],{},"In short this blog is now based on nuxt, tailwindcss and hosted on netlify. The main challenge was to get classic dynamic elements like tags or categories and some SEO specific stuff like creating a sitemap to work smoothly in the background.",[175,237,239],{"id":238},"why-nuxt","Why nuxt?",[96,241,242,243,249],{},"If been using vuejs and nuxt in most of my recent projects and I LIKE IT A LOT. I think I've found that one framework that works best for me. For bigger projects like ",[99,244,248],{"href":245,"rel":246,"title":247},"https:\u002F\u002Fviabam.com",[105],"Tours and Transfers","viabam"," I usually throw in a nodejs server for a nice fullstack Javascript evironment.",[96,251,252,253,258,259,264,265,270],{},"More commonly used JAM stack options are ",[99,254,257],{"href":255,"rel":256},"https:\u002F\u002Fjekyllrb.com\u002F",[105],"Jekyll",", ",[99,260,263],{"href":261,"rel":262},"https:\u002F\u002Fgohugo.io\u002F",[105],"Hugo"," and ",[99,266,269],{"href":267,"rel":268},"https:\u002F\u002Fwww.gatsbyjs.org\u002F",[105],"Gatsby",".",[131,272,274],{"id":273},"the-whole-installation-and-configuration-process","The whole installation and configuration process",[175,276,278],{"id":277},"nuxt-installation","Nuxt Installation",[96,280,281,282,285],{},"The nuxt installation with the new CLI is most awesome and swift (including tailwindcss used to be such a hassle!). I skipped the server framework and since I wanted to use markdown files right in my repository I did not install axios. Choose the package manager, linting and test options to your preference and select ",[154,283,284],{},"Universal (SSR)"," for your rendering mode. Done!",[175,287,289],{"id":288},"add-front-end-matter","Add front end matter",[96,291,292],{},"To get markdown files going we need to install some npm module. I used `frontmatter-markdown-loader``",[294,295,300],"pre",{"className":296,"code":297,"language":298,"meta":299,"style":299},"language-bash shiki shiki-themes derkinzi-tomorrow-night","npm install frontmatter-markdown-loader\n# or\nyarn add frontmatter-markdown-loader\n","bash","",[154,301,302,317,324],{"__ignoreMap":299},[110,303,306,310,314],{"class":304,"line":305},"line",1,[110,307,309],{"class":308},"sHQA9","npm",[110,311,313],{"class":312},"sRYIx"," install",[110,315,316],{"class":312}," frontmatter-markdown-loader\n",[110,318,320],{"class":304,"line":319},2,[110,321,323],{"class":322},"sUXBo","# or\n",[110,325,327,330,333],{"class":304,"line":326},3,[110,328,329],{"class":308},"yarn",[110,331,332],{"class":312}," add",[110,334,316],{"class":312},[96,336,337,338,341],{},"Then enable it in the build part of your ",[154,339,340],{},"config.nuxt.js",":",[294,343,347],{"className":344,"code":345,"language":346,"meta":299,"style":299},"language-javascript shiki shiki-themes derkinzi-tomorrow-night","build: {\n  extend(config, ctx) {   \n    \u002F\u002F ... other code ...\n    \u002F\u002F add frontmatter-markdown-loader\n    config.module.rules.push(\n      {\n        test: \u002F\\.md$\u002F,\n        include: path.resolve(__dirname, \"content\"),\n        loader: \"frontmatter-markdown-loader\",\n      }\n    );\n  }\n}\n","javascript",[154,348,349,354,359,364,370,376,382,388,394,400,406,412,418],{"__ignoreMap":299},[110,350,351],{"class":304,"line":305},[110,352,353],{},"build: {\n",[110,355,356],{"class":304,"line":319},[110,357,358],{},"  extend(config, ctx) {   \n",[110,360,361],{"class":304,"line":326},[110,362,363],{},"    \u002F\u002F ... other code ...\n",[110,365,367],{"class":304,"line":366},4,[110,368,369],{},"    \u002F\u002F add frontmatter-markdown-loader\n",[110,371,373],{"class":304,"line":372},5,[110,374,375],{},"    config.module.rules.push(\n",[110,377,379],{"class":304,"line":378},6,[110,380,381],{},"      {\n",[110,383,385],{"class":304,"line":384},7,[110,386,387],{},"        test: \u002F\\.md$\u002F,\n",[110,389,391],{"class":304,"line":390},8,[110,392,393],{},"        include: path.resolve(__dirname, \"content\"),\n",[110,395,397],{"class":304,"line":396},9,[110,398,399],{},"        loader: \"frontmatter-markdown-loader\",\n",[110,401,403],{"class":304,"line":402},10,[110,404,405],{},"      }\n",[110,407,409],{"class":304,"line":408},11,[110,410,411],{},"    );\n",[110,413,415],{"class":304,"line":414},12,[110,416,417],{},"  }\n",[110,419,421],{"class":304,"line":420},13,[110,422,423],{},"}\n",[175,425,427],{"id":426},"first-piece-of-content","First piece of content",[96,429,430,431,434],{},"Create a ",[154,432,433],{},"\u002Fcontent\u002Fposts\u002F"," folder in the root of your project and add your first markdown file. Here is some example content:",[294,436,440],{"className":437,"code":438,"language":439,"meta":299,"style":299},"language-markdown shiki shiki-themes derkinzi-tomorrow-night","---\ntitle: Building a SEO optimized blog with a Nuxt JAM stack\nslug: \u002Fnuxt-jam-stack\nshort: How to build a SEO optimized, static file blog with nuxtjs and markdown files. Including a sitemap.xml and catagory or tag pages.\ndate: 07\u002F11\u002F2019\nimage: \u002Fimages\u002Fmy-featured-image.jpg\ntags:\n  - code\n  - nuxt\n  - markdown\n---\n\n## My blog post\n\nThe normal **markdown** content.\n","markdown",[154,441,442,448,453,458,463,468,473,478,483,488,493,497,503,513,518],{"__ignoreMap":299},[110,443,444],{"class":304,"line":305},[110,445,447],{"class":446},"s2jRq","---\n",[110,449,450],{"class":304,"line":319},[110,451,452],{"class":446},"title: Building a SEO optimized blog with a Nuxt JAM stack\n",[110,454,455],{"class":304,"line":326},[110,456,457],{"class":446},"slug: \u002Fnuxt-jam-stack\n",[110,459,460],{"class":304,"line":366},[110,461,462],{"class":446},"short: How to build a SEO optimized, static file blog with nuxtjs and markdown files. Including a sitemap.xml and catagory or tag pages.\n",[110,464,465],{"class":304,"line":372},[110,466,467],{"class":446},"date: 07\u002F11\u002F2019\n",[110,469,470],{"class":304,"line":378},[110,471,472],{"class":446},"image: \u002Fimages\u002Fmy-featured-image.jpg\n",[110,474,475],{"class":304,"line":384},[110,476,477],{"class":446},"tags:\n",[110,479,480],{"class":304,"line":390},[110,481,482],{"class":446},"  - code\n",[110,484,485],{"class":304,"line":396},[110,486,487],{"class":446},"  - nuxt\n",[110,489,490],{"class":304,"line":402},[110,491,492],{"class":446},"  - markdown\n",[110,494,495],{"class":304,"line":408},[110,496,447],{"class":446},[110,498,499],{"class":304,"line":414},[110,500,502],{"emptyLinePlaceholder":501},true,"\n",[110,504,505,509],{"class":304,"line":420},[110,506,508],{"class":507},"sVJFD","##",[110,510,512],{"class":511},"spXqI"," My blog post\n",[110,514,516],{"class":304,"line":515},14,[110,517,502],{"emptyLinePlaceholder":501},[110,519,521,524,527],{"class":304,"line":520},15,[110,522,523],{"class":446},"The normal ",[110,525,526],{"class":507},"**markdown**",[110,528,529],{"class":446}," content.\n",[96,531,532,533,264,535,538],{},"As you can see there is a header section following the YAML syntax for some meta information for this particular piece of content. ",[154,534,120],{},[154,536,537],{},"short"," can later be used for dedicated h1s, meta title and description as well as your blog post list page. For the tags we'll create \"dynamic\" pages for better inter linking and navigation throughout the site. To be consistent name the files exactly like the slug. WE'll see why in a bit.",[175,540,542],{"id":541},"the-url-structure-of-the-blog","The url structure of the blog",[96,544,545,546,549],{},"If you are familiar with nuxt you'll know that the url structure for nuxt project is automatically created based on the folders and files in the ",[154,547,548],{},"\u002Fpages"," folder. In my case I wanted as much as possible to sit right on my root domain without any subfolders. Here is the structure:",[294,551,555],{"className":552,"code":553,"language":554,"meta":299,"style":299},"language-html shiki shiki-themes derkinzi-tomorrow-night","derkinzi.de                 \u002F\u002Fhomepage\nderkinzi.de\u002Fmy-blog-article \u002F\u002Fsingle post\nderkinzi.de\u002Fblog            \u002F\u002Fview all posts\nderkinzi.de\u002Ftag\u002Fmytag       \u002F\u002Ffor all posts related to tag\n","html",[154,556,557,562,567,572],{"__ignoreMap":299},[110,558,559],{"class":304,"line":305},[110,560,561],{"class":446},"derkinzi.de                 \u002F\u002Fhomepage\n",[110,563,564],{"class":304,"line":319},[110,565,566],{"class":446},"derkinzi.de\u002Fmy-blog-article \u002F\u002Fsingle post\n",[110,568,569],{"class":304,"line":326},[110,570,571],{"class":446},"derkinzi.de\u002Fblog            \u002F\u002Fview all posts\n",[110,573,574],{"class":304,"line":366},[110,575,576],{"class":446},"derkinzi.de\u002Ftag\u002Fmytag       \u002F\u002Ffor all posts related to tag\n",[96,578,579,580,583,584,587],{},"This translates to the following file structure. Files starting with and ",[154,581,582],{},"_slug"," catch all routes in this folder and pass on the slug as ",[154,585,586],{},"params.slug"," to the file:",[294,589,591],{"className":552,"code":590,"language":554,"meta":299,"style":299},"pages\u002Findex.vue       \u002F\u002Fhomepage\npages\u002F_slug.vue       \u002F\u002Fsingle post\npages\u002Fblog.vue        \u002F\u002Fview all posts\npages\u002Ftag\u002F_slug.vue   \u002F\u002Ffor all posts related to tag\n",[154,592,593,598,603,608],{"__ignoreMap":299},[110,594,595],{"class":304,"line":305},[110,596,597],{"class":446},"pages\u002Findex.vue       \u002F\u002Fhomepage\n",[110,599,600],{"class":304,"line":319},[110,601,602],{"class":446},"pages\u002F_slug.vue       \u002F\u002Fsingle post\n",[110,604,605],{"class":304,"line":326},[110,606,607],{"class":446},"pages\u002Fblog.vue        \u002F\u002Fview all posts\n",[110,609,610],{"class":304,"line":366},[110,611,612],{"class":446},"pages\u002Ftag\u002F_slug.vue   \u002F\u002Ffor all posts related to tag\n",[175,614,616],{"id":615},"the-single-post-file","The single post file",[96,618,619,620,623,624,627],{},"This is a simplified, unstyled content single post page for ",[154,621,622],{},"pages\u002F_slug.vue",". It's fetching the featured image, tags and title from the markdown meta information. For SEO we create a canonical tag as well as the meta information in the ",[154,625,626],{},"head()"," section:",[294,629,631],{"className":552,"code":630,"language":554,"meta":299,"style":299},"\u003Ctemplate>\n  \u003Cdiv>\n    \u003Cdiv class=\"post-head\">\n      \u003Ch1>{{post.attributes.title}}\u003C\u002Fh1>\n      \u003Cimg :src=\"post.attributes.image\" v-if=\"post.attributes.image\">\n      \u003Cdiv>\n        \u003Cdiv class=\"date\">{{post.attributes.date}}\u003C\u002Fdiv>\n        \u003Cdiv class=\"tags\">\n          \u003Cspan v-for=\"tag in post.attributes.tags\">\n            \u003Cnuxt-link :to=\"'\u002Ftag\u002F'+tag\">\\#{{tag}}\u003C\u002Fnuxt-link>\n          \u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"content\" v-html=\"post.html\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\u003Cscript>\n  export default {\n    async asyncData({ params }) {\n      let post = await import(`~\u002Fcontent\u002Fposts\u002F${params.slug}.md`);\n      return { post }\n    },\n    head() {\n      return {\n        title: this.post.attributes.title,\n        meta: [{\n          hid: 'description',\n          name: 'description',\n          content: this.post.attributes.short\n        }],\n        link: [{\n          rel: 'canonical',\n          href: 'https:\u002F\u002Fderkinzi.de' + this.post.attributes.slug\n        }]\n      }\n    }\n  }\n\u003C\u002Fscript>\n",[154,632,633,645,655,676,691,720,728,751,768,787,812,821,830,839,848,882,892,902,912,925,937,988,1002,1008,1017,1024,1044,1053,1071,1087,1102,1108,1116,1133,1159,1165,1170,1176,1181],{"__ignoreMap":299},[110,634,635,638,642],{"class":304,"line":305},[110,636,637],{"class":446},"\u003C",[110,639,641],{"class":640},"sx7Ch","template",[110,643,644],{"class":446},">\n",[110,646,647,650,653],{"class":304,"line":319},[110,648,649],{"class":446},"  \u003C",[110,651,652],{"class":640},"div",[110,654,644],{"class":446},[110,656,657,660,663,666,669,672,674],{"class":304,"line":326},[110,658,659],{"class":446},"    \u003C",[110,661,662],{"class":640},"div class",[110,664,665],{"class":446},"=",[110,667,668],{"class":446},"\"",[110,670,671],{"class":312},"post-head",[110,673,668],{"class":446},[110,675,644],{"class":446},[110,677,678,681,684,687,689],{"class":304,"line":366},[110,679,680],{"class":446},"      \u003C",[110,682,683],{"class":640},"h1",[110,685,686],{"class":446},">{{post.attributes.title}}\u003C\u002F",[110,688,683],{"class":640},[110,690,644],{"class":446},[110,692,693,695,698,700,702,705,707,710,712,714,716,718],{"class":304,"line":372},[110,694,680],{"class":446},[110,696,697],{"class":640},"img :src",[110,699,665],{"class":446},[110,701,668],{"class":446},[110,703,704],{"class":312},"post.attributes.image",[110,706,668],{"class":446},[110,708,709],{"class":640}," v-if",[110,711,665],{"class":446},[110,713,668],{"class":446},[110,715,704],{"class":312},[110,717,668],{"class":446},[110,719,644],{"class":446},[110,721,722,724,726],{"class":304,"line":378},[110,723,680],{"class":446},[110,725,652],{"class":640},[110,727,644],{"class":446},[110,729,730,733,735,737,739,742,744,747,749],{"class":304,"line":384},[110,731,732],{"class":446},"        \u003C",[110,734,662],{"class":640},[110,736,665],{"class":446},[110,738,668],{"class":446},[110,740,741],{"class":312},"date",[110,743,668],{"class":446},[110,745,746],{"class":446},">{{post.attributes.date}}\u003C\u002F",[110,748,652],{"class":640},[110,750,644],{"class":446},[110,752,753,755,757,759,761,764,766],{"class":304,"line":390},[110,754,732],{"class":446},[110,756,662],{"class":640},[110,758,665],{"class":446},[110,760,668],{"class":446},[110,762,763],{"class":312},"tags",[110,765,668],{"class":446},[110,767,644],{"class":446},[110,769,770,773,776,778,780,783,785],{"class":304,"line":396},[110,771,772],{"class":446},"          \u003C",[110,774,775],{"class":640},"span v-for",[110,777,665],{"class":446},[110,779,668],{"class":446},[110,781,782],{"class":312},"tag in post.attributes.tags",[110,784,668],{"class":446},[110,786,644],{"class":446},[110,788,789,792,795,797,799,802,804,807,810],{"class":304,"line":402},[110,790,791],{"class":446},"            \u003C",[110,793,794],{"class":640},"nuxt-link :to",[110,796,665],{"class":446},[110,798,668],{"class":446},[110,800,801],{"class":312},"'\u002Ftag\u002F'+tag",[110,803,668],{"class":446},[110,805,806],{"class":446},">\\#{{tag}}\u003C\u002F",[110,808,809],{"class":640},"nuxt-link",[110,811,644],{"class":446},[110,813,814,817,819],{"class":304,"line":408},[110,815,816],{"class":446},"          \u003C\u002F",[110,818,110],{"class":640},[110,820,644],{"class":446},[110,822,823,826,828],{"class":304,"line":414},[110,824,825],{"class":446},"        \u003C\u002F",[110,827,652],{"class":640},[110,829,644],{"class":446},[110,831,832,835,837],{"class":304,"line":420},[110,833,834],{"class":446},"      \u003C\u002F",[110,836,652],{"class":640},[110,838,644],{"class":446},[110,840,841,844,846],{"class":304,"line":515},[110,842,843],{"class":446},"    \u003C\u002F",[110,845,652],{"class":640},[110,847,644],{"class":446},[110,849,850,852,854,856,858,861,863,866,868,870,873,875,878,880],{"class":304,"line":520},[110,851,659],{"class":446},[110,853,662],{"class":640},[110,855,665],{"class":446},[110,857,668],{"class":446},[110,859,860],{"class":312},"content",[110,862,668],{"class":446},[110,864,865],{"class":640}," v-html",[110,867,665],{"class":446},[110,869,668],{"class":446},[110,871,872],{"class":312},"post.html",[110,874,668],{"class":446},[110,876,877],{"class":446},">\u003C\u002F",[110,879,652],{"class":640},[110,881,644],{"class":446},[110,883,885,888,890],{"class":304,"line":884},16,[110,886,887],{"class":446},"  \u003C\u002F",[110,889,652],{"class":640},[110,891,644],{"class":446},[110,893,895,898,900],{"class":304,"line":894},17,[110,896,897],{"class":446},"\u003C\u002F",[110,899,641],{"class":640},[110,901,644],{"class":446},[110,903,905,907,910],{"class":304,"line":904},18,[110,906,637],{"class":446},[110,908,909],{"class":640},"script",[110,911,644],{"class":446},[110,913,915,919,922],{"class":304,"line":914},19,[110,916,918],{"class":917},"sm2d5","  export",[110,920,921],{"class":917}," default",[110,923,924],{"class":446}," {\n",[110,926,928,931,934],{"class":304,"line":927},20,[110,929,930],{"class":917},"    async",[110,932,933],{"class":308}," asyncData",[110,935,936],{"class":446},"({ params }) {\n",[110,938,940,943,946,950,953,956,959,962,965,968,971,973,977,980,983,985],{"class":304,"line":939},21,[110,941,942],{"class":917},"      let",[110,944,945],{"class":312}," post",[110,947,949],{"class":948},"sJYcM"," =",[110,951,952],{"class":917}," await",[110,954,955],{"class":948}," import",[110,957,958],{"class":446},"(",[110,960,961],{"class":446},"`",[110,963,964],{"class":312},"~\u002Fcontent\u002Fposts\u002F",[110,966,967],{"class":446},"${",[110,969,970],{"class":312},"params",[110,972,270],{"class":446},[110,974,976],{"class":975},"sJEhD","slug",[110,978,979],{"class":446},"}",[110,981,982],{"class":312},".md",[110,984,961],{"class":446},[110,986,987],{"class":446},");\n",[110,989,990,993,996,999],{"class":304,"line":89},[110,991,992],{"class":917},"      return",[110,994,995],{"class":446}," { ",[110,997,998],{"class":312},"post",[110,1000,1001],{"class":446}," }\n",[110,1003,1005],{"class":304,"line":1004},23,[110,1006,1007],{"class":446},"    },\n",[110,1009,1011,1014],{"class":304,"line":1010},24,[110,1012,1013],{"class":308},"    head",[110,1015,1016],{"class":446},"() {\n",[110,1018,1020,1022],{"class":304,"line":1019},25,[110,1021,992],{"class":917},[110,1023,924],{"class":446},[110,1025,1027,1030,1033,1036,1039,1041],{"class":304,"line":1026},26,[110,1028,1029],{"class":975},"        title",[110,1031,1032],{"class":446},": ",[110,1034,1035],{"class":640},"this",[110,1037,1038],{"class":446},".post.attributes.",[110,1040,120],{"class":975},[110,1042,1043],{"class":446},",\n",[110,1045,1047,1050],{"class":304,"line":1046},27,[110,1048,1049],{"class":975},"        meta",[110,1051,1052],{"class":446},": [{\n",[110,1054,1056,1059,1061,1064,1067,1069],{"class":304,"line":1055},28,[110,1057,1058],{"class":975},"          hid",[110,1060,1032],{"class":446},[110,1062,1063],{"class":446},"'",[110,1065,1066],{"class":312},"description",[110,1068,1063],{"class":446},[110,1070,1043],{"class":446},[110,1072,1074,1077,1079,1081,1083,1085],{"class":304,"line":1073},29,[110,1075,1076],{"class":975},"          name",[110,1078,1032],{"class":446},[110,1080,1063],{"class":446},[110,1082,1066],{"class":312},[110,1084,1063],{"class":446},[110,1086,1043],{"class":446},[110,1088,1090,1093,1095,1097,1099],{"class":304,"line":1089},30,[110,1091,1092],{"class":975},"          content",[110,1094,1032],{"class":446},[110,1096,1035],{"class":640},[110,1098,1038],{"class":446},[110,1100,1101],{"class":975},"short\n",[110,1103,1105],{"class":304,"line":1104},31,[110,1106,1107],{"class":446},"        }],\n",[110,1109,1111,1114],{"class":304,"line":1110},32,[110,1112,1113],{"class":975},"        link",[110,1115,1052],{"class":446},[110,1117,1119,1122,1124,1126,1129,1131],{"class":304,"line":1118},33,[110,1120,1121],{"class":975},"          rel",[110,1123,1032],{"class":446},[110,1125,1063],{"class":446},[110,1127,1128],{"class":312},"canonical",[110,1130,1063],{"class":446},[110,1132,1043],{"class":446},[110,1134,1136,1139,1141,1143,1146,1148,1151,1154,1156],{"class":304,"line":1135},34,[110,1137,1138],{"class":975},"          href",[110,1140,1032],{"class":446},[110,1142,1063],{"class":446},[110,1144,1145],{"class":312},"https:\u002F\u002Fderkinzi.de",[110,1147,1063],{"class":446},[110,1149,1150],{"class":948}," +",[110,1152,1153],{"class":640}," this",[110,1155,1038],{"class":446},[110,1157,1158],{"class":975},"slug\n",[110,1160,1162],{"class":304,"line":1161},35,[110,1163,1164],{"class":446},"        }]\n",[110,1166,1168],{"class":304,"line":1167},36,[110,1169,405],{"class":446},[110,1171,1173],{"class":304,"line":1172},37,[110,1174,1175],{"class":446},"    }\n",[110,1177,1179],{"class":304,"line":1178},38,[110,1180,417],{"class":446},[110,1182,1184,1186,1188],{"class":304,"line":1183},39,[110,1185,897],{"class":446},[110,1187,909],{"class":640},[110,1189,644],{"class":446},[96,1191,1192,1193,270],{},"With this in place you should be able to see your demo blog post at ",[154,1194,1195],{},"http:\u002F\u002Flocalhost:8080\u002Fmy-blog-article",[175,1197,1199],{"id":1198},"post-listing-page","Post listing page",[96,1201,1202,1203,1206],{},"To see all pages (",[154,1204,1205],{},"\u002Fpages\u002Fblog.vue",") we need to fetch the content a little different. Here is again the simplified version:",[294,1208,1210],{"className":552,"code":1209,"language":554,"meta":299,"style":299},"\u003Ctemplate>\n    \u003Cdiv>\n        \u003Ch1>My blog posts:\u003C\u002Fh1>\n        \u003Cul>\n            \u003Cli v-for=\"post in posts\" :key=\"post.attributes.title\">\n                \u003Cnuxt-link to=\"#\">{{post.attributes.title}}\u003C\u002Fnuxt-link>\n            \u003C\u002Fli>\n        \u003C\u002Ful>\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\u003Cscript>\n  export default {\n    async asyncData() {\n      const resolve = await require.context('~\u002Fcontent\u002Fposts\u002F', true, \u002F\\.md$\u002F)\n      let imports = resolve.keys().map((key) => resolve(key))\n      \u002F\u002F sort by date\n      imports.sort((a, b) =>\n        moment(b.attributes.date, 'DD\u002FMM\u002FYYYY').diff(moment(a.attributes.date, 'DD\u002FMM\u002FYYYY'))\n      )\n      return { posts: imports }\n    }\n  }\n\u003C\u002Fscript>\n",[154,1211,1212,1220,1228,1241,1249,1279,1302,1311,1319,1327,1335,1343,1351,1359,1409,1446,1451,1465,1510,1515,1531,1535,1539],{"__ignoreMap":299},[110,1213,1214,1216,1218],{"class":304,"line":305},[110,1215,637],{"class":446},[110,1217,641],{"class":640},[110,1219,644],{"class":446},[110,1221,1222,1224,1226],{"class":304,"line":319},[110,1223,659],{"class":446},[110,1225,652],{"class":640},[110,1227,644],{"class":446},[110,1229,1230,1232,1234,1237,1239],{"class":304,"line":326},[110,1231,732],{"class":446},[110,1233,683],{"class":640},[110,1235,1236],{"class":446},">My blog posts:\u003C\u002F",[110,1238,683],{"class":640},[110,1240,644],{"class":446},[110,1242,1243,1245,1247],{"class":304,"line":366},[110,1244,732],{"class":446},[110,1246,162],{"class":640},[110,1248,644],{"class":446},[110,1250,1251,1253,1256,1258,1260,1263,1265,1268,1270,1272,1275,1277],{"class":304,"line":372},[110,1252,791],{"class":446},[110,1254,1255],{"class":640},"li v-for",[110,1257,665],{"class":446},[110,1259,668],{"class":446},[110,1261,1262],{"class":312},"post in posts",[110,1264,668],{"class":446},[110,1266,1267],{"class":640}," :key",[110,1269,665],{"class":446},[110,1271,668],{"class":446},[110,1273,1274],{"class":312},"post.attributes.title",[110,1276,668],{"class":446},[110,1278,644],{"class":446},[110,1280,1281,1284,1287,1289,1291,1294,1296,1298,1300],{"class":304,"line":378},[110,1282,1283],{"class":446},"                \u003C",[110,1285,1286],{"class":640},"nuxt-link to",[110,1288,665],{"class":446},[110,1290,668],{"class":446},[110,1292,1293],{"class":312},"#",[110,1295,668],{"class":446},[110,1297,686],{"class":446},[110,1299,809],{"class":640},[110,1301,644],{"class":446},[110,1303,1304,1307,1309],{"class":304,"line":384},[110,1305,1306],{"class":446},"            \u003C\u002F",[110,1308,165],{"class":640},[110,1310,644],{"class":446},[110,1312,1313,1315,1317],{"class":304,"line":390},[110,1314,825],{"class":446},[110,1316,162],{"class":640},[110,1318,644],{"class":446},[110,1320,1321,1323,1325],{"class":304,"line":396},[110,1322,843],{"class":446},[110,1324,652],{"class":640},[110,1326,644],{"class":446},[110,1328,1329,1331,1333],{"class":304,"line":402},[110,1330,897],{"class":446},[110,1332,641],{"class":640},[110,1334,644],{"class":446},[110,1336,1337,1339,1341],{"class":304,"line":408},[110,1338,637],{"class":446},[110,1340,909],{"class":640},[110,1342,644],{"class":446},[110,1344,1345,1347,1349],{"class":304,"line":414},[110,1346,918],{"class":917},[110,1348,921],{"class":917},[110,1350,924],{"class":446},[110,1352,1353,1355,1357],{"class":304,"line":420},[110,1354,930],{"class":917},[110,1356,933],{"class":308},[110,1358,1016],{"class":446},[110,1360,1361,1364,1367,1369,1371,1374,1378,1380,1382,1384,1386,1388,1391,1394,1397,1400,1403,1406],{"class":304,"line":515},[110,1362,1363],{"class":917},"      const",[110,1365,1366],{"class":975}," resolve",[110,1368,949],{"class":948},[110,1370,952],{"class":917},[110,1372,1373],{"class":446}," require.",[110,1375,1377],{"class":1376},"s8nuv","context",[110,1379,958],{"class":446},[110,1381,1063],{"class":446},[110,1383,964],{"class":312},[110,1385,1063],{"class":446},[110,1387,258],{"class":446},[110,1389,1390],{"class":1376},"true",[110,1392,1393],{"class":446},",",[110,1395,1396],{"class":446}," \u002F",[110,1398,1399],{"class":312},"\\.md",[110,1401,1402],{"class":917},"$",[110,1404,1405],{"class":446},"\u002F",[110,1407,1408],{"class":446},")\n",[110,1410,1411,1413,1416,1418,1421,1424,1427,1430,1433,1436,1438,1440,1443],{"class":304,"line":520},[110,1412,942],{"class":917},[110,1414,1415],{"class":312}," imports",[110,1417,949],{"class":948},[110,1419,1420],{"class":446}," resolve.",[110,1422,1423],{"class":1376},"keys",[110,1425,1426],{"class":446},"().",[110,1428,1429],{"class":1376},"map",[110,1431,1432],{"class":446},"((key) ",[110,1434,1435],{"class":917},"=>",[110,1437,1366],{"class":1376},[110,1439,958],{"class":446},[110,1441,1442],{"class":312},"key",[110,1444,1445],{"class":446},"))\n",[110,1447,1448],{"class":304,"line":884},[110,1449,1450],{"class":322},"      \u002F\u002F sort by date\n",[110,1452,1453,1456,1459,1462],{"class":304,"line":894},[110,1454,1455],{"class":446},"      imports.",[110,1457,1458],{"class":1376},"sort",[110,1460,1461],{"class":446},"((a, b) ",[110,1463,1464],{"class":917},"=>\n",[110,1466,1467,1470,1473,1475,1477,1479,1482,1484,1487,1490,1492,1495,1498,1500,1502,1504,1506,1508],{"class":304,"line":904},[110,1468,1469],{"class":1376},"        moment",[110,1471,1472],{"class":446},"(b.attributes.",[110,1474,741],{"class":975},[110,1476,258],{"class":446},[110,1478,1063],{"class":446},[110,1480,1481],{"class":312},"DD\u002FMM\u002FYYYY",[110,1483,1063],{"class":446},[110,1485,1486],{"class":446},").",[110,1488,1489],{"class":1376},"diff",[110,1491,958],{"class":446},[110,1493,1494],{"class":1376},"moment",[110,1496,1497],{"class":446},"(a.attributes.",[110,1499,741],{"class":975},[110,1501,258],{"class":446},[110,1503,1063],{"class":446},[110,1505,1481],{"class":312},[110,1507,1063],{"class":446},[110,1509,1445],{"class":446},[110,1511,1512],{"class":304,"line":914},[110,1513,1514],{"class":446},"      )\n",[110,1516,1517,1519,1521,1524,1526,1529],{"class":304,"line":927},[110,1518,992],{"class":917},[110,1520,995],{"class":446},[110,1522,1523],{"class":975},"posts",[110,1525,1032],{"class":446},[110,1527,1528],{"class":312},"imports",[110,1530,1001],{"class":446},[110,1532,1533],{"class":304,"line":939},[110,1534,1175],{"class":446},[110,1536,1537],{"class":304,"line":89},[110,1538,417],{"class":446},[110,1540,1541,1543,1545],{"class":304,"line":1004},[110,1542,897],{"class":446},[110,1544,909],{"class":640},[110,1546,644],{"class":446},[96,1548,1549,1550,1553,1554,1557],{},"See how I sort the posts using ",[154,1551,1552],{},"momentjs"," and their data attribute from the meta section of the markdown file. You can easily extend the display in the ",[154,1555,1556],{},"v-for"," loop with more information like featured image and excerpt.",[175,1559,1561],{"id":1560},"the-tags-or-category-page","The tags or category page",[96,1563,1564,1565,1568],{},"The template is basically identical to the above. I simply filter out the posts using the tag in ",[154,1566,1567],{},"asyncData()"," with",[294,1570,1572],{"className":344,"code":1571,"language":346,"meta":299,"style":299},"imports = imports.filter(\n  (post) => post.attributes.tags.filter((tag) => tag === params.slug).length\n)\n",[154,1573,1574,1579,1584],{"__ignoreMap":299},[110,1575,1576],{"class":304,"line":305},[110,1577,1578],{},"imports = imports.filter(\n",[110,1580,1581],{"class":304,"line":319},[110,1582,1583],{},"  (post) => post.attributes.tags.filter((tag) => tag === params.slug).length\n",[110,1585,1586],{"class":304,"line":326},[110,1587,1408],{},[131,1589,1591],{"id":1590},"generate-all-dynamic-pages-and-create-a-sitemap","Generate all \"dynamic\" pages and create a sitemap",[175,1593,1595],{"id":1594},"create-an-array-of-all-pages-so-nuxt-knows-what-to-generate","Create an array of all pages so nuxt knows what to generate",[96,1597,1598,1599,1602,1603,1606],{},"By default nuxt will only generate the pages it can see in the pages folder. This means it does not generate our posts as they are only represented by the dynamic file ",[154,1600,1601],{},"_slug.vue",". In order for nuxt to create all the pages we want we need to make sure it has a full list of them in ",[154,1604,1605],{},"nuxt.config.js",". We can make sure of this with a little helper function:",[294,1608,1610],{"className":344,"code":1609,"language":346,"meta":299,"style":299},"\u002F\u002F nuxt.config.js\nexport default async () => {\n  const dynamicRoutes = await getDynamicPaths({\n    '': 'posts\u002F*.md',\n    '\u002Ftag': 'posts\u002F*.md'\n  })\n  return {\n    ...\n    generate: {\n      routes: dynamicRoutes\n    }\n    ...\n  }\n}\n",[154,1611,1612,1617,1622,1627,1632,1637,1642,1647,1652,1657,1662,1666,1670,1674],{"__ignoreMap":299},[110,1613,1614],{"class":304,"line":305},[110,1615,1616],{},"\u002F\u002F nuxt.config.js\n",[110,1618,1619],{"class":304,"line":319},[110,1620,1621],{},"export default async () => {\n",[110,1623,1624],{"class":304,"line":326},[110,1625,1626],{},"  const dynamicRoutes = await getDynamicPaths({\n",[110,1628,1629],{"class":304,"line":366},[110,1630,1631],{},"    '': 'posts\u002F*.md',\n",[110,1633,1634],{"class":304,"line":372},[110,1635,1636],{},"    '\u002Ftag': 'posts\u002F*.md'\n",[110,1638,1639],{"class":304,"line":378},[110,1640,1641],{},"  })\n",[110,1643,1644],{"class":304,"line":384},[110,1645,1646],{},"  return {\n",[110,1648,1649],{"class":304,"line":390},[110,1650,1651],{},"    ...\n",[110,1653,1654],{"class":304,"line":396},[110,1655,1656],{},"    generate: {\n",[110,1658,1659],{"class":304,"line":402},[110,1660,1661],{},"      routes: dynamicRoutes\n",[110,1663,1664],{"class":304,"line":408},[110,1665,1175],{},[110,1667,1668],{"class":304,"line":414},[110,1669,1651],{},[110,1671,1672],{"class":304,"line":420},[110,1673,417],{},[110,1675,1676],{"class":304,"line":515},[110,1677,423],{},[96,1679,1680,1681,1684],{},"As you can see I changed the nuxt.config.js slightly. It's now an async function returning it's usual contents. I needed to do this to be able to create the dynamic routes(and the sitemap) before the actual ",[154,1682,1683],{},"nuxt generate"," command runs.",[96,1686,1687],{},"Here is a simple version that will create the routes for the posts but NOT for the tags pages:",[294,1689,1691],{"className":344,"code":1690,"language":346,"meta":299,"style":299},"function getDynamicPaths(urlFilepathTable) {\n  return [].concat(\n    ...Object.keys(urlFilepathTable).map(url => {\n      var filepathGlob = urlFilepathTable[url];\n      return glob\n        .sync(filepathGlob, { cwd: 'content' })\n        .map(filepath => `${url}\u002F${path.basename(filepath, '.md')}`);\n    })\n  );\n}\n",[154,1692,1693,1698,1703,1708,1713,1718,1723,1728,1733,1738],{"__ignoreMap":299},[110,1694,1695],{"class":304,"line":305},[110,1696,1697],{},"function getDynamicPaths(urlFilepathTable) {\n",[110,1699,1700],{"class":304,"line":319},[110,1701,1702],{},"  return [].concat(\n",[110,1704,1705],{"class":304,"line":326},[110,1706,1707],{},"    ...Object.keys(urlFilepathTable).map(url => {\n",[110,1709,1710],{"class":304,"line":366},[110,1711,1712],{},"      var filepathGlob = urlFilepathTable[url];\n",[110,1714,1715],{"class":304,"line":372},[110,1716,1717],{},"      return glob\n",[110,1719,1720],{"class":304,"line":378},[110,1721,1722],{},"        .sync(filepathGlob, { cwd: 'content' })\n",[110,1724,1725],{"class":304,"line":384},[110,1726,1727],{},"        .map(filepath => `${url}\u002F${path.basename(filepath, '.md')}`);\n",[110,1729,1730],{"class":304,"line":390},[110,1731,1732],{},"    })\n",[110,1734,1735],{"class":304,"line":396},[110,1736,1737],{},"  );\n",[110,1739,1740],{"class":304,"line":402},[110,1741,423],{},[96,1743,1744,1745],{},"For a more complicated version of this that will also create pages for all the tags\u002Fcategories used on our posts please check the ",[99,1746,1749],{"href":1747,"rel":1748},"https:\u002F\u002Fgithub.com\u002FKinzi\u002Fderkinzi.de\u002Fblob\u002Fmaster\u002Fserver\u002FfetchRoutes.js",[105],"original file on github",[175,1751,1753],{"id":1752},"create-the-sitemap","Create the sitemap",[96,1755,1756,1757,1760,1761,1766,1767,1770,1771,1774],{},"Based on above array of our pages we can also create the sitemap. Bascically all we need is a properly formated .xml file written to the ",[154,1758,1759],{},"\u002Fstatic"," folder of our nuxt project. I wrote a little script for it.It's to long to post here so ",[99,1762,1765],{"href":1763,"rel":1764},"https:\u002F\u002Fgithub.com\u002FKinzi\u002Fderkinzi.de\u002Fblob\u002Fmaster\u002Fserver\u002Fsitemap.js",[105],"check it on github",". I run it right after creating the ",[154,1768,1769],{},"dynamicRoutes"," array and before the ",[154,1772,1773],{},"return"," in the nuxt.config.js:",[294,1776,1778],{"className":344,"code":1777,"language":346,"meta":299,"style":299},"await createSitemap(dynamicRoutes)\n",[154,1779,1780],{"__ignoreMap":299},[110,1781,1782],{"class":304,"line":305},[110,1783,1777],{},[131,1785,1787],{"id":1786},"ideas-for-future-developments","Ideas for future developments",[96,1789,1790],{},"Here is what I want to tweak further for this blog:",[96,1792,1793],{},"Done:",[162,1795,1796,1801],{},[165,1797,1798],{},[99,1799,1800],{"href":59},"Highlight code with PrismJs in Nuxt",[165,1802,1803],{},[99,1804,1805],{"href":51},"Optimize Images in Nuxt",[96,1807,1808],{},"To do:",[162,1810,1811,1814,1817,1820,1823],{},[165,1812,1813],{},"Link to other related posts in the bottom",[165,1815,1816],{},"Automatic table of contents",[165,1818,1819],{},"Parse actual markdown content to create optimized image src-sets in content",[165,1821,1822],{},"Open Graph",[165,1824,1825],{},"automatic tweet new posts",[1827,1828,1829],"style",{},"html pre.shiki code .sHQA9, html code.shiki .sHQA9{--shiki-default:#6196CC}html pre.shiki code .sRYIx, html code.shiki .sRYIx{--shiki-default:#7EC699}html pre.shiki code .sUXBo, html code.shiki .sUXBo{--shiki-default:#999999;--shiki-default-font-style:italic}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 .s2jRq, html code.shiki .s2jRq{--shiki-default:#CCCCCC}html pre.shiki code .sVJFD, html code.shiki .sVJFD{--shiki-default:#CCCCCC;--shiki-default-font-weight:bold}html pre.shiki code .spXqI, html code.shiki .spXqI{--shiki-default:#F08D49;--shiki-default-font-weight:bold}html pre.shiki code .sx7Ch, html code.shiki .sx7Ch{--shiki-default:#E2777A}html pre.shiki code .sm2d5, html code.shiki .sm2d5{--shiki-default:#CC99CD}html pre.shiki code .sJYcM, html code.shiki .sJYcM{--shiki-default:#67CDCC}html pre.shiki code .sJEhD, html code.shiki .sJEhD{--shiki-default:#F8C555}html pre.shiki code .s8nuv, html code.shiki .s8nuv{--shiki-default:#F08D49}",{"title":299,"searchDepth":319,"depth":326,"links":1831},[1832,1835,1838,1847,1851],{"id":133,"depth":319,"text":134,"children":1833},[1834],{"id":177,"depth":326,"text":178},{"id":190,"depth":319,"text":191,"children":1836},[1837],{"id":238,"depth":326,"text":239},{"id":273,"depth":319,"text":274,"children":1839},[1840,1841,1842,1843,1844,1845,1846],{"id":277,"depth":326,"text":278},{"id":288,"depth":326,"text":289},{"id":426,"depth":326,"text":427},{"id":541,"depth":326,"text":542},{"id":615,"depth":326,"text":616},{"id":1198,"depth":326,"text":1199},{"id":1560,"depth":326,"text":1561},{"id":1590,"depth":319,"text":1591,"children":1848},[1849,1850],{"id":1594,"depth":326,"text":1595},{"id":1752,"depth":326,"text":1753},{"id":1786,"depth":319,"text":1787},"How to build a SEO optimized, static file blog with nuxtjs and markdown files. Including a sitemap.xml and category or tag pages.",false,"md","\u002Fimg\u002Fjam-stack-nuxt.jpg",{},[1858],"derkinzi",{"title":56,"description":1852},"nuxt-jam-stack",[217,1862],"jamstack",null,"Wuz1sUR91QvdKMc_wITBheuShQcClvYtuv6UmQCIpzQ",[1866,1868],{"title":52,"path":51,"stem":1867,"children":-1},"optimized-responsive-lazyloading-images-with-nuxt",{"title":60,"path":59,"stem":1869,"children":-1},"prismjs-nuxtjs-static-pages",[1871],{"id":1858,"title":1872},"derkinzi.de",1794389892025]