[{"data":1,"prerenderedAt":5793},["ShallowReactive",2],{"\u002F2024\u002Fkatex":3,"content-surround-path--2024-katex":1145,"navigation":5761},{"id":4,"title":5,"alternates":6,"author":7,"body":8,"categories":6,"comments":1126,"cover":6,"date":1127,"description":1128,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":1130,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":1132,"path":1133,"readingTime":1134,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":1139,"sitemap":1140,"stem":1141,"table_of_contents":1126,"tags":1142,"__hash__":1144},"page\u002F2024\u002Fkatex.md","Announcing KaTeX Support: Easily Embed Mathematical Formulas in Bloggrify",null,"hlassiege",{"type":9,"value":10,"toc":1117},"minimark",[11,15,18,29,34,39,45,321,326,931,936,1107,1111,1114],[12,13,14],"p",{},"Bloggrify now supports KaTeX, so you can embed mathematical formulas and equations directly into your Markdown posts. This is handy for anyone writing technical, scientific, or educational content.",[12,16,17],{},"KaTeX is a fast JavaScript library for TeX math rendering on the web, and a reliable way to render mathematical formulas in your Markdown files.",[12,19,20,21,28],{},"You can find more information on the ",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fkatex.org\u002F",[26],"nofollow","official website",".",[30,31,33],"h2",{"id":32},"getting-started-with-katex","Getting Started with KaTeX",[35,36,38],"h3",{"id":37},"mathematical-formulas","Mathematical formulas",[12,40,41],{},[42,43,44],"strong",{},"Centered formula",[46,47,50],"span",{"className":48},[49],"katex-display",[46,51,54,114],{"className":52},[53],"katex",[46,55,58],{"className":56},[57],"katex-mathml",[59,60,63],"math",{"xmlns":61,"display":62},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML","block",[64,65,66,109],"semantics",{},[67,68,69,73,77,87,90,98,101],"mrow",{},[70,71,72],"mi",{},"L",[74,75,76],"mo",{},"=",[78,79,80,84],"mfrac",{},[81,82,83],"mn",{},"1",[81,85,86],{},"2",[70,88,89],{},"ρ",[91,92,93,96],"msup",{},[70,94,95],{},"v",[81,97,86],{},[70,99,100],{},"S",[102,103,104,107],"msub",{},[70,105,106],{},"C",[70,108,72],{},[110,111,113],"annotation",{"encoding":112},"application\u002Fx-tex","L = \\frac{1}{2} \\rho v^2 S C_L",[46,115,119,145],{"className":116,"ariaHidden":118},[117],"katex-html","true",[46,120,123,128,133,138,142],{"className":121},[122],"base",[46,124],{"className":125,"style":127},[126],"strut","height:0.6833em;",[46,129,72],{"className":130},[131,132],"mord","mathnormal",[46,134],{"className":135,"style":137},[136],"mspace","margin-right:0.2778em;",[46,139,76],{"className":140},[141],"mrel",[46,143],{"className":144,"style":137},[136],[46,146,148,152,232,235,273,277],{"className":147},[122],[46,149],{"className":150,"style":151},[126],"height:2.0074em;vertical-align:-0.686em;",[46,153,155,160,228],{"className":154},[131],[46,156],{"className":157},[158,159],"mopen","nulldelimiter",[46,161,163],{"className":162},[78],[46,164,168,219],{"className":165},[166,167],"vlist-t","vlist-t2",[46,169,172,214],{"className":170},[171],"vlist-r",[46,173,177,191,202],{"className":174,"style":176},[175],"vlist","height:1.3214em;",[46,178,180,185],{"style":179},"top:-2.314em;",[46,181],{"className":182,"style":184},[183],"pstrut","height:3em;",[46,186,188],{"className":187},[131],[46,189,86],{"className":190},[131],[46,192,194,197],{"style":193},"top:-3.23em;",[46,195],{"className":196,"style":184},[183],[46,198],{"className":199,"style":201},[200],"frac-line","border-bottom-width:0.04em;",[46,203,205,208],{"style":204},"top:-3.677em;",[46,206],{"className":207,"style":184},[183],[46,209,211],{"className":210},[131],[46,212,83],{"className":213},[131],[46,215,218],{"className":216},[217],"vlist-s","​",[46,220,222],{"className":221},[171],[46,223,226],{"className":224,"style":225},[175],"height:0.686em;",[46,227],{},[46,229],{"className":230},[231,159],"mclose",[46,233,89],{"className":234},[131,132],[46,236,238,242],{"className":237},[131],[46,239,95],{"className":240,"style":241},[131,132],"margin-right:0.03588em;",[46,243,246],{"className":244},[245],"msupsub",[46,247,249],{"className":248},[166],[46,250,252],{"className":251},[171],[46,253,256],{"className":254,"style":255},[175],"height:0.8641em;",[46,257,259,263],{"style":258},"top:-3.113em;margin-right:0.05em;",[46,260],{"className":261,"style":262},[183],"height:2.7em;",[46,264,270],{"className":265},[266,267,268,269],"sizing","reset-size6","size3","mtight",[46,271,86],{"className":272},[131,269],[46,274,100],{"className":275,"style":276},[131,132],"margin-right:0.05764em;",[46,278,280,284],{"className":279},[131],[46,281,106],{"className":282,"style":283},[131,132],"margin-right:0.07153em;",[46,285,287],{"className":286},[245],[46,288,290,312],{"className":289},[166,167],[46,291,293,309],{"className":292},[171],[46,294,297],{"className":295,"style":296},[175],"height:0.3283em;",[46,298,300,303],{"style":299},"top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;",[46,301],{"className":302,"style":262},[183],[46,304,306],{"className":305},[266,267,268,269],[46,307,72],{"className":308},[131,132,269],[46,310,218],{"className":311},[217],[46,313,315],{"className":314},[171],[46,316,319],{"className":317,"style":318},[175],"height:0.15em;",[46,320],{},[12,322,323],{},[42,324,325],{},"Using code block",[46,327,329,443],{"className":328},[53],[46,330,332],{"className":331},[57],[59,333,334],{"xmlns":61},[64,335,336,440],{},[67,337,338,381,384,412],{},[91,339,340,379],{},[67,341,342,345,363,369,376],{},[74,343,344],{"fence":118},"(",[346,347,348,351,360],"msubsup",{},[74,349,350],{},"∑",[67,352,353,356,358],{},[70,354,355],{},"k",[74,357,76],{},[81,359,83],{},[70,361,362],{},"n",[102,364,365,367],{},[70,366,22],{},[70,368,355],{},[102,370,371,374],{},[70,372,373],{},"b",[70,375,355],{},[74,377,378],{"fence":118},")",[81,380,86],{},[74,382,383],{},"≤",[67,385,386,388,402,410],{},[74,387,344],{"fence":118},[346,389,390,392,400],{},[74,391,350],{},[67,393,394,396,398],{},[70,395,355],{},[74,397,76],{},[81,399,83],{},[70,401,362],{},[346,403,404,406,408],{},[70,405,22],{},[70,407,355],{},[81,409,86],{},[74,411,378],{"fence":118},[67,413,414,416,430,438],{},[74,415,344],{"fence":118},[346,417,418,420,428],{},[74,419,350],{},[67,421,422,424,426],{},[70,423,355],{},[74,425,76],{},[81,427,83],{},[70,429,362],{},[346,431,432,434,436],{},[70,433,373],{},[70,435,355],{},[81,437,86],{},[74,439,378],{"fence":118},[110,441,442],{"encoding":112},"\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq \\left( \\sum_{k=1}^n a_k^2 \\right) \\left( \\sum_{k=1}^n b_k^2 \\right)\n",[46,444,446,657],{"className":445,"ariaHidden":118},[117],[46,447,449,453,648,651,654],{"className":448},[122],[46,450],{"className":451,"style":452},[126],"height:1.308em;vertical-align:-0.2997em;",[46,454,457,623],{"className":455},[456],"minner",[46,458,460,465,534,538,580,620],{"className":459},[456],[46,461,344],{"className":462,"style":464},[158,463],"delimcenter","top:0em;",[46,466,469,475],{"className":467},[468],"mop",[46,470,350],{"className":471,"style":474},[468,472,473],"op-symbol","small-op","position:relative;top:0em;",[46,476,478],{"className":477},[245],[46,479,481,525],{"className":480},[166,167],[46,482,484,522],{"className":483},[171],[46,485,488,510],{"className":486,"style":487},[175],"height:0.8043em;",[46,489,491,494],{"style":490},"top:-2.4003em;margin-left:0em;margin-right:0.05em;",[46,492],{"className":493,"style":262},[183],[46,495,497],{"className":496},[266,267,268,269],[46,498,500,504,507],{"className":499},[131,269],[46,501,355],{"className":502,"style":503},[131,132,269],"margin-right:0.03148em;",[46,505,76],{"className":506},[141,269],[46,508,83],{"className":509},[131,269],[46,511,513,516],{"style":512},"top:-3.2029em;margin-right:0.05em;",[46,514],{"className":515,"style":262},[183],[46,517,519],{"className":518},[266,267,268,269],[46,520,362],{"className":521},[131,132,269],[46,523,218],{"className":524},[217],[46,526,528],{"className":527},[171],[46,529,532],{"className":530,"style":531},[175],"height:0.2997em;",[46,533],{},[46,535],{"className":536,"style":537},[136],"margin-right:0.1667em;",[46,539,541,544],{"className":540},[131],[46,542,22],{"className":543},[131,132],[46,545,547],{"className":546},[245],[46,548,550,572],{"className":549},[166,167],[46,551,553,569],{"className":552},[171],[46,554,557],{"className":555,"style":556},[175],"height:0.3361em;",[46,558,560,563],{"style":559},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[46,561],{"className":562,"style":262},[183],[46,564,566],{"className":565},[266,267,268,269],[46,567,355],{"className":568,"style":503},[131,132,269],[46,570,218],{"className":571},[217],[46,573,575],{"className":574},[171],[46,576,578],{"className":577,"style":318},[175],[46,579],{},[46,581,583,586],{"className":582},[131],[46,584,373],{"className":585},[131,132],[46,587,589],{"className":588},[245],[46,590,592,612],{"className":591},[166,167],[46,593,595,609],{"className":594},[171],[46,596,598],{"className":597,"style":556},[175],[46,599,600,603],{"style":559},[46,601],{"className":602,"style":262},[183],[46,604,606],{"className":605},[266,267,268,269],[46,607,355],{"className":608,"style":503},[131,132,269],[46,610,218],{"className":611},[217],[46,613,615],{"className":614},[171],[46,616,618],{"className":617,"style":318},[175],[46,619],{},[46,621,378],{"className":622,"style":464},[231,463],[46,624,626],{"className":625},[245],[46,627,629],{"className":628},[166],[46,630,632],{"className":631},[171],[46,633,636],{"className":634,"style":635},[175],"height:1.0083em;",[46,637,639,642],{"style":638},"top:-3.2572em;margin-right:0.05em;",[46,640],{"className":641,"style":262},[183],[46,643,645],{"className":644},[266,267,268,269],[46,646,86],{"className":647},[131,269],[46,649],{"className":650,"style":137},[136],[46,652,383],{"className":653},[141],[46,655],{"className":656,"style":137},[136],[46,658,660,664,799,802],{"className":659},[122],[46,661],{"className":662,"style":663},[126],"height:1.2em;vertical-align:-0.35em;",[46,665,667,675,735,738,793],{"className":666},[456],[46,668,670],{"className":669,"style":464},[158,463],[46,671,344],{"className":672},[673,674],"delimsizing","size1",[46,676,678,681],{"className":677},[468],[46,679,350],{"className":680,"style":474},[468,472,473],[46,682,684],{"className":683},[245],[46,685,687,727],{"className":686},[166,167],[46,688,690,724],{"className":689},[171],[46,691,693,713],{"className":692,"style":487},[175],[46,694,695,698],{"style":490},[46,696],{"className":697,"style":262},[183],[46,699,701],{"className":700},[266,267,268,269],[46,702,704,707,710],{"className":703},[131,269],[46,705,355],{"className":706,"style":503},[131,132,269],[46,708,76],{"className":709},[141,269],[46,711,83],{"className":712},[131,269],[46,714,715,718],{"style":512},[46,716],{"className":717,"style":262},[183],[46,719,721],{"className":720},[266,267,268,269],[46,722,362],{"className":723},[131,132,269],[46,725,218],{"className":726},[217],[46,728,730],{"className":729},[171],[46,731,733],{"className":732,"style":531},[175],[46,734],{},[46,736],{"className":737,"style":537},[136],[46,739,741,744],{"className":740},[131],[46,742,22],{"className":743},[131,132],[46,745,747],{"className":746},[245],[46,748,750,784],{"className":749},[166,167],[46,751,753,781],{"className":752},[171],[46,754,757,769],{"className":755,"style":756},[175],"height:0.8141em;",[46,758,760,763],{"style":759},"top:-2.4169em;margin-left:0em;margin-right:0.05em;",[46,761],{"className":762,"style":262},[183],[46,764,766],{"className":765},[266,267,268,269],[46,767,355],{"className":768,"style":503},[131,132,269],[46,770,772,775],{"style":771},"top:-3.063em;margin-right:0.05em;",[46,773],{"className":774,"style":262},[183],[46,776,778],{"className":777},[266,267,268,269],[46,779,86],{"className":780},[131,269],[46,782,218],{"className":783},[217],[46,785,787],{"className":786},[171],[46,788,791],{"className":789,"style":790},[175],"height:0.2831em;",[46,792],{},[46,794,796],{"className":795,"style":464},[231,463],[46,797,378],{"className":798},[673,674],[46,800],{"className":801,"style":537},[136],[46,803,805,811,871,874,925],{"className":804},[456],[46,806,808],{"className":807,"style":464},[158,463],[46,809,344],{"className":810},[673,674],[46,812,814,817],{"className":813},[468],[46,815,350],{"className":816,"style":474},[468,472,473],[46,818,820],{"className":819},[245],[46,821,823,863],{"className":822},[166,167],[46,824,826,860],{"className":825},[171],[46,827,829,849],{"className":828,"style":487},[175],[46,830,831,834],{"style":490},[46,832],{"className":833,"style":262},[183],[46,835,837],{"className":836},[266,267,268,269],[46,838,840,843,846],{"className":839},[131,269],[46,841,355],{"className":842,"style":503},[131,132,269],[46,844,76],{"className":845},[141,269],[46,847,83],{"className":848},[131,269],[46,850,851,854],{"style":512},[46,852],{"className":853,"style":262},[183],[46,855,857],{"className":856},[266,267,268,269],[46,858,362],{"className":859},[131,132,269],[46,861,218],{"className":862},[217],[46,864,866],{"className":865},[171],[46,867,869],{"className":868,"style":531},[175],[46,870],{},[46,872],{"className":873,"style":537},[136],[46,875,877,880],{"className":876},[131],[46,878,373],{"className":879},[131,132],[46,881,883],{"className":882},[245],[46,884,886,917],{"className":885},[166,167],[46,887,889,914],{"className":888},[171],[46,890,892,903],{"className":891,"style":756},[175],[46,893,894,897],{"style":759},[46,895],{"className":896,"style":262},[183],[46,898,900],{"className":899},[266,267,268,269],[46,901,355],{"className":902,"style":503},[131,132,269],[46,904,905,908],{"style":771},[46,906],{"className":907,"style":262},[183],[46,909,911],{"className":910},[266,267,268,269],[46,912,86],{"className":913},[131,269],[46,915,218],{"className":916},[217],[46,918,920],{"className":919},[171],[46,921,923],{"className":922,"style":790},[175],[46,924],{},[46,926,928],{"className":927,"style":464},[231,463],[46,929,378],{"className":930},[673,674],[12,932,933],{},[42,934,935],{},"Inline formula",[12,937,938,939,28],{},"This is an inline formula ",[46,940,942,978],{"className":941},[53],[46,943,945],{"className":944},[57],[59,946,947],{"xmlns":61},[64,948,949,975],{},[67,950,951,957,960,966,968],{},[91,952,953,955],{},[70,954,22],{},[81,956,86],{},[74,958,959],{},"+",[91,961,962,964],{},[70,963,373],{},[81,965,86],{},[74,967,76],{},[91,969,970,973],{},[70,971,972],{},"c",[81,974,86],{},[110,976,977],{"encoding":112},"a^2 + b^2 = c^2",[46,979,981,1028,1072],{"className":980,"ariaHidden":118},[117],[46,982,984,988,1017,1021,1025],{"className":983},[122],[46,985],{"className":986,"style":987},[126],"height:0.8974em;vertical-align:-0.0833em;",[46,989,991,994],{"className":990},[131],[46,992,22],{"className":993},[131,132],[46,995,997],{"className":996},[245],[46,998,1000],{"className":999},[166],[46,1001,1003],{"className":1002},[171],[46,1004,1006],{"className":1005,"style":756},[175],[46,1007,1008,1011],{"style":771},[46,1009],{"className":1010,"style":262},[183],[46,1012,1014],{"className":1013},[266,267,268,269],[46,1015,86],{"className":1016},[131,269],[46,1018],{"className":1019,"style":1020},[136],"margin-right:0.2222em;",[46,1022,959],{"className":1023},[1024],"mbin",[46,1026],{"className":1027,"style":1020},[136],[46,1029,1031,1034,1063,1066,1069],{"className":1030},[122],[46,1032],{"className":1033,"style":756},[126],[46,1035,1037,1040],{"className":1036},[131],[46,1038,373],{"className":1039},[131,132],[46,1041,1043],{"className":1042},[245],[46,1044,1046],{"className":1045},[166],[46,1047,1049],{"className":1048},[171],[46,1050,1052],{"className":1051,"style":756},[175],[46,1053,1054,1057],{"style":771},[46,1055],{"className":1056,"style":262},[183],[46,1058,1060],{"className":1059},[266,267,268,269],[46,1061,86],{"className":1062},[131,269],[46,1064],{"className":1065,"style":137},[136],[46,1067,76],{"className":1068},[141],[46,1070],{"className":1071,"style":137},[136],[46,1073,1075,1078],{"className":1074},[122],[46,1076],{"className":1077,"style":756},[126],[46,1079,1081,1084],{"className":1080},[131],[46,1082,972],{"className":1083},[131,132],[46,1085,1087],{"className":1086},[245],[46,1088,1090],{"className":1089},[166],[46,1091,1093],{"className":1092},[171],[46,1094,1096],{"className":1095,"style":756},[175],[46,1097,1098,1101],{"style":771},[46,1099],{"className":1100,"style":262},[183],[46,1102,1104],{"className":1103},[266,267,268,269],[46,1105,86],{"className":1106},[131,269],[30,1108,1110],{"id":1109},"conclusion","Conclusion",[12,1112,1113],{},"With KaTeX support, you can write rich technical and educational content without leaving Markdown. Whether you're teaching, studying, or just documenting a formula, it helps you communicate complex ideas clearly.",[12,1115,1116],{},"Share what you build with it, and stay tuned to Bloggrify for more updates.",{"title":1118,"searchDepth":1119,"depth":1119,"links":1120},"",2,[1121,1125],{"id":32,"depth":1119,"text":33,"children":1122},[1123],{"id":37,"depth":1124,"text":38},3,{"id":1109,"depth":1119,"text":1110},false,"2024-06-08","Bloggrify now supports KaTeX, allowing you to seamlessly embed mathematical formulas and equations directly into your Markdown posts.","md",{},true,"6","\u002F2024\u002Fkatex",{"text":1135,"minutes":1136,"time":1137,"words":1138},"1 min read",0.64,38400,128,{"title":5,"description":1128},{"loc":1133},"2024\u002Fkatex",[1143,53],"markdown","_fPHJwae6FuhCE4BKaS2rfdrvMegiy63ojBT-KOVI7w",[1146,1414,2028,2409,2504,2788,2944,3080,4067,4276,4935,5570],{"id":1147,"title":1148,"alternates":6,"author":7,"body":1149,"categories":6,"comments":1126,"cover":6,"date":1398,"description":1399,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":1400,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":1401,"path":1402,"readingTime":1403,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":1408,"sitemap":1409,"stem":1410,"table_of_contents":1131,"tags":1411,"__hash__":1413},"page\u002F2026\u002Fversion-3-2.md","Announcing Bloggrify 3.2: redesigned minimalist theme, AI crawler controls, and faster pages",{"type":9,"value":1150,"toc":1387},[1151,1154,1158,1161,1188,1191,1195,1206,1213,1217,1220,1234,1241,1245,1252,1256,1259,1271,1275,1278,1302,1309,1313,1344,1348,1363,1367,1376],[12,1152,1153],{},"Bloggrify 3.2.0 is out. This release redesigns the default minimalist theme, adds a set of SEO controls aimed at AI crawlers, makes pages lighter for the average reader, and fixes a number of correctness issues around drafts, authors and error pages.",[30,1155,1157],{"id":1156},"a-redesigned-minimalist-theme","A redesigned minimalist theme",[12,1159,1160],{},"The minimalist theme, the one Bloggrify ships with, has been rebuilt after the Nuxt UI blog template. It is no longer just a list of posts:",[1162,1163,1164,1177,1182],"ul",{},[1165,1166,1167,1168,1171,1172,1176],"li",{},"a ",[42,1169,1170],{},"table of contents"," on posts, which you can hide per post with the ",[1173,1174,1175],"code",{},"notoc"," frontmatter",[1165,1178,1167,1179],{},[42,1180,1181],{},"newsletter signup form",[1165,1183,1184,1187],{},[42,1185,1186],{},"social share buttons"," on articles",[12,1189,1190],{},"The redesign leans on Nuxt UI components throughout, so it stays consistent with the rest of the stack and inherits its dark mode.",[30,1192,1194],{"id":1193},"controls-for-ai-crawlers-and-llmstxt","Controls for AI crawlers and llms.txt",[12,1196,1197,1198,1201,1202,1205],{},"A new ",[1173,1199,1200],{},"seo"," config key lets you decide how AI tools interact with your blog, without touching your search engine indexing. Blocking the major AI crawlers is one line, and publishing an ",[1173,1203,1204],{},"llms.txt"," index is another. Both default to leaving your blog exactly as it is today.",[12,1207,1208,1209,28],{},"We wrote a full post on what these switches do, what they actually protect, and whether they are worth turning on: ",[22,1210,1212],{"href":1211},"\u002F2026\u002Fai-crawlers-and-llms-txt","Should you block AI crawlers on your blog?",[30,1214,1216],{"id":1215},"lighter-pages-by-default","Lighter pages by default",[12,1218,1219],{},"Two changes move cost off the readers who were paying for features they did not use:",[1162,1221,1222,1228],{},[1165,1223,1224,1227],{},[42,1225,1226],{},"Article images are served as WebP",", which are smaller than the equivalent JPEG or PNG.",[1165,1229,1230,1233],{},[42,1231,1232],{},"The search index loads on first search intent only."," Until now every page quietly downloaded the search engine and content database, even for readers who never searched. It now loads when a reader hovers the search button or opens it with ⌘K.",[12,1235,1236,1237,28],{},"The search change turned out to be more subtle than flipping a flag, so it also has its own write-up: ",[22,1238,1240],{"href":1239},"\u002F2026\u002Floading-search-only-when-readers-need-it","The search box that downloaded itself on every page",[30,1242,1244],{"id":1243},"a-new-comment-provider-hakanai-connect","A new comment provider: Hakanai Connect",[12,1246,1247,1248,1251],{},"Bloggrify gains ",[42,1249,1250],{},"Hakanai Connect"," as an alternative to Hyvor Talk for comments. It is now the provider running on the official Bloggrify blog. Hyvor remains supported, so switching is a config choice, not a migration you are forced into.",[30,1253,1255],{"id":1254},"more-analytics-providers","More analytics providers",[12,1257,1258],{},"Two providers join the existing options, and analytics config is now fully optional:",[1162,1260,1261,1266],{},[1165,1262,1263],{},[42,1264,1265],{},"OpenPanel",[1165,1267,1268],{},[42,1269,1270],{},"Hakanai Pulse",[30,1272,1274],{"id":1273},"authors-and-error-pages","Authors and error pages",[12,1276,1277],{},"Author handling gets more predictable:",[1162,1279,1280,1286,1292,1299],{},[1165,1281,1282,1283],{},"an ",[42,1284,1285],{},"opt-in authors directory page",[1165,1287,1288,1289],{},"the post author is now part of the ",[42,1290,1291],{},"SEO metadata",[1165,1293,1294,1295,1298],{},"Bloggrify ",[42,1296,1297],{},"warns in dev"," when a post references an author you never defined",[1165,1300,1301],{},"posts without an explicit author show up on the default author page instead of disappearing",[12,1303,1304,1305,1308],{},"Themes can now ship ",[42,1306,1307],{},"their own error pages",", with a per-theme override and a sensible fallback when a theme does not provide one.",[30,1310,1312],{"id":1311},"correctness-fixes-worth-calling-out","Correctness fixes worth calling out",[1162,1314,1315,1321,1327,1334],{},[1165,1316,1317,1318],{},"drafts and unlisted pages ",[42,1319,1320],{},"no longer leak into the RSS feed",[1165,1322,1323,1324],{},"unknown URLs and pages with no matching layout return a proper ",[42,1325,1326],{},"404 instead of a 500",[1165,1328,1329,1330,1333],{},"previous\u002Fnext article navigation is now ordered ",[42,1331,1332],{},"by date"," rather than by file path",[1165,1335,1336,1339,1340,1343],{},[1173,1337,1338],{},"draft"," and ",[1173,1341,1342],{},"listed"," frontmatter behave as the documentation describes",[30,1345,1347],{"id":1346},"under-the-hood","Under the hood",[12,1349,1350,1351,1354,1355,1358,1359,1362],{},"Bloggrify 3.2 moves to ",[42,1352,1353],{},"Nuxt 4.4.8"," and upgrades the Nuxt SEO modules (sitemap v8, robots v6, schema-org v6). Lucide icons are now bundled locally with ",[1173,1356,1357],{},"@iconify-json\u002Flucide",", and ",[1173,1360,1361],{},"nuxt-og-image"," was upgraded to v6 to restore OG image generation.",[30,1364,1366],{"id":1365},"contribute","Contribute",[12,1368,1369,1370,1375],{},"Bloggrify is open source. ",[22,1371,1374],{"href":1372,"rel":1373},"https:\u002F\u002Fgithub.com\u002Fbloggrify\u002Fbloggrify",[26],"Help us on GitHub",":",[1162,1377,1378,1381,1384],{},[1165,1379,1380],{},"Report issues",[1165,1382,1383],{},"Submit PRs",[1165,1385,1386],{},"Join discussions",{"title":1118,"searchDepth":1119,"depth":1119,"links":1388},[1389,1390,1391,1392,1393,1394,1395,1396,1397],{"id":1156,"depth":1119,"text":1157},{"id":1193,"depth":1119,"text":1194},{"id":1215,"depth":1119,"text":1216},{"id":1243,"depth":1119,"text":1244},{"id":1254,"depth":1119,"text":1255},{"id":1273,"depth":1119,"text":1274},{"id":1311,"depth":1119,"text":1312},{"id":1346,"depth":1119,"text":1347},{"id":1365,"depth":1119,"text":1366},"2026-07-18","The default theme gets a full redesign with table of contents, newsletter and share buttons, alongside new SEO controls for AI crawlers, WebP images and on-demand search.",{},"15","\u002F2026\u002Fversion-3-2",{"text":1404,"minutes":1405,"time":1406,"words":1407},"3 min read",2.555,153300,511,{"title":1148,"description":1399},{"loc":1402},"2026\u002Fversion-3-2",[1412],"release","zwGWQHp-71ktUSXiO4t6qy_Zj8h3Ga8FW3dM450alNQ",{"id":1415,"title":1416,"alternates":6,"author":7,"body":1417,"categories":6,"comments":1126,"cover":6,"date":2012,"description":2013,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":2014,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":2015,"path":1239,"readingTime":2016,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":2021,"sitemap":2022,"stem":2023,"table_of_contents":1131,"tags":2024,"__hash__":2027},"page\u002F2026\u002Floading-search-only-when-readers-need-it.md","The Search Box That Downloaded Itself on Every Page",{"type":9,"value":1418,"toc":2004},[1419,1422,1426,1429,1432,1435,1439,1442,1554,1569,1572,1576,1579,1675,1685,1688,1691,1695,1698,1701,1752,1755,1758,1848,1854,1857,1938,1947,1951,1954,1973,1983,1987,1990,2000],[12,1420,1421],{},"Bloggrify ships an instant, fuzzy search: hit ⌘K, start typing, and results appear as you go. It feels free. It was not: the download that powers it was being paid by every reader, including the majority who never search. This post looks at why, and how we changed it so the cost falls only on the readers who actually use it.",[30,1423,1425],{"id":1424},"how-search-works-when-there-is-no-server","How search works when there is no server",[12,1427,1428],{},"Bloggrify blogs are static. There is no backend, no database sitting behind an API, nothing to send a query to. So when a reader searches, the searching has to happen in their browser.",[12,1430,1431],{},"That is a lovely property. It also has a consequence: if the browser is going to do the searching, the browser needs the thing to search. Nuxt Content builds that \"thing\" for you, and under the hood it is not small. To run queries client-side, it loads a WebAssembly build of SQLite and a dump of your content database. The browser boots a tiny database engine and asks it questions locally.",[12,1433,1434],{},"That is what makes the search feel instant once it is running. It is also a real download, and downloads are never free.",[30,1436,1438],{"id":1437},"the-catch-everyone-paid-whether-they-searched-or-not","The catch: everyone paid, whether they searched or not",[12,1440,1441],{},"Here is the code we started from, roughly:",[1443,1444,1448],"pre",{"className":1445,"code":1446,"language":1447,"meta":1118,"style":1118},"language-typescript shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","const { data: files } = useLazyAsyncData(\n  'search',\n  () => queryCollectionSearchSections('page'),\n  { server: false }\n)\n","typescript",[1173,1449,1450,1487,1503,1528,1548],{"__ignoreMap":1118},[46,1451,1454,1458,1462,1466,1468,1472,1475,1479,1483],{"class":1452,"line":1453},"line",1,[46,1455,1457],{"class":1456},"skPWg","const",[46,1459,1461],{"class":1460},"sdvfp"," {",[46,1463,1465],{"class":1464},"sCl4M"," data",[46,1467,1375],{"class":1460},[46,1469,1471],{"class":1470},"sdtVv"," files",[46,1473,1474],{"class":1460}," }",[46,1476,1478],{"class":1477},"srEZA"," =",[46,1480,1482],{"class":1481},"srxfx"," useLazyAsyncData",[46,1484,1486],{"class":1485},"s8bja","(\n",[46,1488,1489,1493,1497,1500],{"class":1452,"line":1119},[46,1490,1492],{"class":1491},"srOHQ","  '",[46,1494,1496],{"class":1495},"sw2QF","search",[46,1498,1499],{"class":1491},"'",[46,1501,1502],{"class":1460},",\n",[46,1504,1505,1508,1512,1515,1517,1519,1522,1524,1526],{"class":1452,"line":1124},[46,1506,1507],{"class":1460},"  ()",[46,1509,1511],{"class":1510},"sG1e1"," =>",[46,1513,1514],{"class":1481}," queryCollectionSearchSections",[46,1516,344],{"class":1485},[46,1518,1499],{"class":1491},[46,1520,1521],{"class":1495},"page",[46,1523,1499],{"class":1491},[46,1525,378],{"class":1485},[46,1527,1502],{"class":1460},[46,1529,1531,1534,1538,1541,1545],{"class":1452,"line":1530},4,[46,1532,1533],{"class":1460},"  {",[46,1535,1537],{"class":1536},"sHJOX"," server",[46,1539,1375],{"class":1540},"s1BmC",[46,1542,1544],{"class":1543},"sbhg_"," false",[46,1546,1547],{"class":1460}," }\n",[46,1549,1551],{"class":1452,"line":1550},5,[46,1552,1553],{"class":1485},")\n",[12,1555,1556,1557,1560,1561,1564,1565,1568],{},"Read that carefully. ",[1173,1558,1559],{},"server: false"," says \"do not run this during the static build, run it in the browser\". Sensible: the search index is only useful client-side. But ",[1173,1562,1563],{},"useLazyAsyncData"," fetches ",[42,1566,1567],{},"immediately"," on mount by default. And the search component lives in the navigation bar, which is on every single page.",[12,1570,1571],{},"So the chain was: every page mount, on every visit, quietly kicked off the fetch of the WASM engine and the database dump. For a reader who lands on one post, reads it, and leaves, that is a download of the entire search machinery to power a feature they never touched. Most readers never search. We were charging all of them for the few who do.",[30,1573,1575],{"id":1574},"why-you-cannot-just-load-it-later","Why you cannot just \"load it later\"",[12,1577,1578],{},"The obvious fix is to stop loading it eagerly. Nuxt gives you exactly that switch:",[1443,1580,1582],{"className":1445,"code":1581,"language":1447,"meta":1118,"style":1118},"const { data: files, status, execute: loadSearchIndex } = useLazyAsyncData(\n  'search',\n  () => queryCollectionSearchSections('page'),\n  { server: false, immediate: false }\n)\n",[1173,1583,1584,1620,1630,1650,1671],{"__ignoreMap":1118},[46,1585,1586,1588,1590,1592,1594,1596,1599,1602,1604,1607,1609,1612,1614,1616,1618],{"class":1452,"line":1453},[46,1587,1457],{"class":1456},[46,1589,1461],{"class":1460},[46,1591,1465],{"class":1464},[46,1593,1375],{"class":1460},[46,1595,1471],{"class":1470},[46,1597,1598],{"class":1460},",",[46,1600,1601],{"class":1470}," status",[46,1603,1598],{"class":1460},[46,1605,1606],{"class":1464}," execute",[46,1608,1375],{"class":1460},[46,1610,1611],{"class":1470}," loadSearchIndex",[46,1613,1474],{"class":1460},[46,1615,1478],{"class":1477},[46,1617,1482],{"class":1481},[46,1619,1486],{"class":1485},[46,1621,1622,1624,1626,1628],{"class":1452,"line":1119},[46,1623,1492],{"class":1491},[46,1625,1496],{"class":1495},[46,1627,1499],{"class":1491},[46,1629,1502],{"class":1460},[46,1631,1632,1634,1636,1638,1640,1642,1644,1646,1648],{"class":1452,"line":1124},[46,1633,1507],{"class":1460},[46,1635,1511],{"class":1510},[46,1637,1514],{"class":1481},[46,1639,344],{"class":1485},[46,1641,1499],{"class":1491},[46,1643,1521],{"class":1495},[46,1645,1499],{"class":1491},[46,1647,378],{"class":1485},[46,1649,1502],{"class":1460},[46,1651,1652,1654,1656,1658,1660,1662,1665,1667,1669],{"class":1452,"line":1530},[46,1653,1533],{"class":1460},[46,1655,1537],{"class":1536},[46,1657,1375],{"class":1540},[46,1659,1544],{"class":1543},[46,1661,1598],{"class":1460},[46,1663,1664],{"class":1536}," immediate",[46,1666,1375],{"class":1540},[46,1668,1544],{"class":1543},[46,1670,1547],{"class":1460},[46,1672,1673],{"class":1452,"line":1550},[46,1674,1553],{"class":1485},[12,1676,1677,1680,1681,1684],{},[1173,1678,1679],{},"immediate: false"," means nothing is fetched until you call ",[1173,1682,1683],{},"execute()"," yourself. Now the reader who never searches downloads nothing. Good.",[12,1686,1687],{},"But this is where the interesting part starts, because the naive version of \"load it later\" is worse than the problem it solves. If you wait until the reader clicks the search button to start the download, they open the box, see an empty field, and wait. The engine and the dump have to arrive before they can get a single result. You have taken a feature that felt instant and made it stutter for the exact people who wanted to use it.",[12,1689,1690],{},"The index needs to be there the moment they want it, and not a moment before they show they want it. The whole trick is reading that intent early enough.",[30,1692,1694],{"id":1693},"reading-intent-from-two-directions","Reading intent, from two directions",[12,1696,1697],{},"The challenge is that there are two completely different ways to open search, and they give you different amounts of warning.",[12,1699,1700],{},"The mouse is generous. Nobody clicks a button without first moving the pointer to it, and hovering is a near-certain signal that a click is coming. That gap of a few hundred milliseconds between hover and click is exactly enough to start the download early. So we prefetch on hover and on keyboard focus:",[1443,1702,1706],{"className":1703,"code":1704,"language":1705,"meta":1118,"style":1118},"language-html shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","\u003CUContentSearchButton\n  @pointerenter=\"ensureSearchIndex\"\n  @focus=\"ensureSearchIndex\"\n\u002F>\n","html",[1173,1707,1708,1717,1734,1747],{"__ignoreMap":1118},[46,1709,1710,1713],{"class":1452,"line":1453},[46,1711,1712],{"class":1540},"\u003C",[46,1714,1716],{"class":1715},"sGLM_","UContentSearchButton\n",[46,1718,1719,1723,1725,1728,1731],{"class":1452,"line":1119},[46,1720,1722],{"class":1721},"s3uge","  @pointerenter",[46,1724,76],{"class":1540},[46,1726,1727],{"class":1491},"\"",[46,1729,1730],{"class":1495},"ensureSearchIndex",[46,1732,1733],{"class":1491},"\"\n",[46,1735,1736,1739,1741,1743,1745],{"class":1452,"line":1124},[46,1737,1738],{"class":1721},"  @focus",[46,1740,76],{"class":1540},[46,1742,1727],{"class":1491},[46,1744,1730],{"class":1495},[46,1746,1733],{"class":1491},[46,1748,1749],{"class":1452,"line":1530},[46,1750,1751],{"class":1540},"\u002F>\n",[12,1753,1754],{},"By the time the click lands, the index is usually already on its way, often already there.",[12,1756,1757],{},"The keyboard shortcut is the opposite. ⌘K gives no warning at all: intent and action are the same instant. There is no hover to catch. So we cover it from the other side, by watching the state that actually represents \"search is open\", whichever path opened it:",[1443,1759,1761],{"className":1445,"code":1760,"language":1447,"meta":1118,"style":1118},"const { open } = useContentSearch()\n\nwatch(open, (isOpen) => {\n  if (isOpen) {\n    ensureSearchIndex()\n  }\n})\n",[1173,1762,1763,1782,1787,1811,1827,1834,1840],{"__ignoreMap":1118},[46,1764,1765,1767,1769,1772,1774,1776,1779],{"class":1452,"line":1453},[46,1766,1457],{"class":1456},[46,1768,1461],{"class":1460},[46,1770,1771],{"class":1470}," open",[46,1773,1474],{"class":1460},[46,1775,1478],{"class":1477},[46,1777,1778],{"class":1481}," useContentSearch",[46,1780,1781],{"class":1485},"()\n",[46,1783,1784],{"class":1452,"line":1119},[46,1785,1786],{"emptyLinePlaceholder":1131},"\n",[46,1788,1789,1792,1795,1797,1800,1804,1806,1808],{"class":1452,"line":1124},[46,1790,1791],{"class":1481},"watch",[46,1793,1794],{"class":1485},"(open",[46,1796,1598],{"class":1460},[46,1798,1799],{"class":1460}," (",[46,1801,1803],{"class":1802},"sd0zt","isOpen",[46,1805,378],{"class":1460},[46,1807,1511],{"class":1510},[46,1809,1810],{"class":1460}," {\n",[46,1812,1813,1817,1819,1821,1824],{"class":1452,"line":1530},[46,1814,1816],{"class":1815},"sHqub","  if",[46,1818,1799],{"class":1536},[46,1820,1803],{"class":1485},[46,1822,1823],{"class":1536},") ",[46,1825,1826],{"class":1460},"{\n",[46,1828,1829,1832],{"class":1452,"line":1550},[46,1830,1831],{"class":1481},"    ensureSearchIndex",[46,1833,1781],{"class":1536},[46,1835,1837],{"class":1452,"line":1836},6,[46,1838,1839],{"class":1460},"  }\n",[46,1841,1843,1846],{"class":1452,"line":1842},7,[46,1844,1845],{"class":1460},"}",[46,1847,1553],{"class":1485},[12,1849,1850,1853],{},[1173,1851,1852],{},"open"," is a shared piece of state toggled by the button and by the shortcut alike. Watching it means we do not have to enumerate every possible trigger. Anything that opens search, present or future, flows through here.",[12,1855,1856],{},"Finally, all of these paths funnel through one small guard so the index is fetched once and not on every hover:",[1443,1858,1860],{"className":1445,"code":1859,"language":1447,"meta":1118,"style":1118},"function ensureSearchIndex() {\n  if (status.value === 'idle' || status.value === 'error') {\n    loadSearchIndex()\n  }\n}\n",[1173,1861,1862,1875,1922,1929,1933],{"__ignoreMap":1118},[46,1863,1864,1867,1870,1873],{"class":1452,"line":1453},[46,1865,1866],{"class":1456},"function",[46,1868,1869],{"class":1481}," ensureSearchIndex",[46,1871,1872],{"class":1460},"()",[46,1874,1810],{"class":1460},[46,1876,1877,1879,1881,1884,1886,1889,1892,1895,1898,1900,1903,1905,1907,1909,1911,1913,1916,1918,1920],{"class":1452,"line":1119},[46,1878,1816],{"class":1815},[46,1880,1799],{"class":1536},[46,1882,1883],{"class":1485},"status",[46,1885,28],{"class":1540},[46,1887,1888],{"class":1485},"value",[46,1890,1891],{"class":1477}," ===",[46,1893,1894],{"class":1491}," '",[46,1896,1897],{"class":1495},"idle",[46,1899,1499],{"class":1491},[46,1901,1902],{"class":1477}," ||",[46,1904,1601],{"class":1485},[46,1906,28],{"class":1540},[46,1908,1888],{"class":1485},[46,1910,1891],{"class":1477},[46,1912,1894],{"class":1491},[46,1914,1915],{"class":1495},"error",[46,1917,1499],{"class":1491},[46,1919,1823],{"class":1536},[46,1921,1826],{"class":1460},[46,1923,1924,1927],{"class":1452,"line":1124},[46,1925,1926],{"class":1481},"    loadSearchIndex",[46,1928,1781],{"class":1536},[46,1930,1931],{"class":1452,"line":1530},[46,1932,1839],{"class":1460},[46,1934,1935],{"class":1452,"line":1550},[46,1936,1937],{"class":1460},"}\n",[12,1939,1940,1941,1943,1944,1946],{},"It loads when nothing has happened yet (",[1173,1942,1897],{},"), and it retries if a previous attempt failed (",[1173,1945,1915],{},"), but it stays out of the way while a fetch is in flight or already done. The reader can wave the pointer over the button ten times and only the first one does anything.",[30,1948,1950],{"id":1949},"a-small-tuning-while-we-were-here","A small tuning while we were here",[12,1952,1953],{},"Once search actually loads on demand, it is worth making sure the results are good. Fuzzy matching is handled by Fuse.js, and its defaults are tuned for short strings, not blog content. Two options made a real difference:",[1443,1955,1957],{"className":1445,"code":1956,"language":1447,"meta":1118,"style":1118},":fuse=\"{ resultLimit: 42, fuseOptions: { threshold: 0.3, ignoreLocation: true } }\"\n",[1173,1958,1959],{"__ignoreMap":1118},[46,1960,1961,1964,1966,1968,1971],{"class":1452,"line":1453},[46,1962,1963],{"class":1485},":fuse",[46,1965,76],{"class":1477},[46,1967,1727],{"class":1491},[46,1969,1970],{"class":1495},"{ resultLimit: 42, fuseOptions: { threshold: 0.3, ignoreLocation: true } }",[46,1972,1733],{"class":1491},[12,1974,1975,1978,1979,1982],{},[1173,1976,1977],{},"ignoreLocation"," tells Fuse to stop caring where in the text a match occurs. By default it favours matches near the start of a field, which makes sense for names and titles but punishes a term that appears in the middle of a paragraph. ",[1173,1980,1981],{},"threshold: 0.3"," tightens how fuzzy a match is allowed to be, so a search returns things that are genuinely relevant rather than everything vaguely alike.",[30,1984,1986],{"id":1985},"what-changed-concretely","What changed, concretely",[12,1988,1989],{},"Nothing about the experience got slower, and for most visitors a good chunk of every page load simply disappeared. A reader who never searches now downloads none of the search machinery. A reader who does gets it warmed up before they have finished reaching for it, whether by mouse or by keyboard.",[12,1991,1992,1993,1996,1997,1999],{},"This pattern is not specific to search. Eager data fetching is the comfortable default, and it is very often the wrong one. ",[1173,1994,1995],{},"useAsyncData"," will happily load everything the moment a component mounts, and that convenience quietly adds up when the component is everywhere and the data is heavy. Flipping to ",[1173,1998,1679],{}," and spending a little effort on reading intent is not much code. Here it moved a cost off every reader who was never going to use it.",[2001,2002,2003],"style",{},"html pre.shiki code .skPWg, html code.shiki .skPWg{--shiki-light:#9C3EDA;--shiki-default:#CA9EE6;--shiki-dark:#F97583}html pre.shiki code .sdvfp, html code.shiki .sdvfp{--shiki-light:#39ADB5;--shiki-default:#949CBB;--shiki-dark:#E1E4E8}html pre.shiki code .sCl4M, html code.shiki .sCl4M{--shiki-light:#E53935;--shiki-default:#C6D0F5;--shiki-dark:#FFAB70}html pre.shiki code .sdtVv, html code.shiki .sdtVv{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#79B8FF}html pre.shiki code .srEZA, html code.shiki .srEZA{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#F97583}html pre.shiki code .srxfx, html code.shiki .srxfx{--shiki-light:#6182B8;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}html pre.shiki code .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .srOHQ, html code.shiki .srOHQ{--shiki-light:#39ADB5;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sw2QF, html code.shiki .sw2QF{--shiki-light:#91B859;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sG1e1, html code.shiki .sG1e1{--shiki-light:#9C3EDA;--shiki-default:#81C8BE;--shiki-dark:#F97583}html pre.shiki code .sHJOX, html code.shiki .sHJOX{--shiki-light:#E53935;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .s1BmC, html code.shiki .s1BmC{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#E1E4E8}html pre.shiki code .sbhg_, html code.shiki .sbhg_{--shiki-light:#FF5370;--shiki-default:#EF9F76;--shiki-dark:#79B8FF}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 .sGLM_, html code.shiki .sGLM_{--shiki-light:#E53935;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:inherit;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .s3uge, html code.shiki .s3uge{--shiki-light:#9C3EDA;--shiki-default:#E5C890;--shiki-dark:#B392F0}html pre.shiki code .sd0zt, html code.shiki .sd0zt{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sHqub, html code.shiki .sHqub{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#CA9EE6;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":1118,"searchDepth":1119,"depth":1119,"links":2005},[2006,2007,2008,2009,2010,2011],{"id":1424,"depth":1119,"text":1425},{"id":1437,"depth":1119,"text":1438},{"id":1574,"depth":1119,"text":1575},{"id":1693,"depth":1119,"text":1694},{"id":1949,"depth":1119,"text":1950},{"id":1985,"depth":1119,"text":1986},"2026-07-17","How Bloggrify's instant search worked, why it was quietly costing every reader a download they never used, and how we made it load only on intent.",{},"14",{"text":2017,"minutes":2018,"time":2019,"words":2020},"6 min read",5.125,307500,1025,{"title":1416,"description":2013},{"loc":1239},"2026\u002Floading-search-only-when-readers-need-it",[2025,2026],"performance","nuxt","sLAXHiEnoWs1xEOexwzN9ffNH6b-1lXN1r1ipDjfLEE",{"id":2029,"title":2030,"alternates":6,"author":7,"body":2031,"categories":6,"comments":1126,"cover":6,"date":2395,"description":2396,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":2397,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":2398,"path":1211,"readingTime":2399,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":2403,"sitemap":2404,"stem":2405,"table_of_contents":1131,"tags":2406,"__hash__":2408},"page\u002F2026\u002Fai-crawlers-and-llms-txt.md","Should you block AI crawlers on your blog? And does it even work?",{"type":9,"value":2032,"toc":2388},[2033,2035,2038,2041,2044,2047,2050,2053,2075,2084,2088,2093,2099,2105,2170,2186,2189,2198,2204,2207,2211,2216,2229,2232,2291,2305,2309,2312,2317,2327,2330,2334,2337,2366,2378,2385],[12,2034,1212],{},[12,2036,2037],{},"It is a real question for a lot of writers online right now. Should we let LLMs feed off our content? Is there a risk to our visibility if, tomorrow, readers get their answers straight from ChatGPT?",[12,2039,2040],{},"Some articles are indeed alarmed by the fairly broad drop in traffic across sites.",[12,2042,2043],{},"Or the other way round: by becoming invisible to the LLMs, are we not cutting ourselves off from a potential source of traffic?",[12,2045,2046],{},"For my part, I tend to think that we, as readers, are changing the way we browse and search, and that this drop in traffic is unavoidable. So the question is whether to block the crawlers entirely to slow the trend down, or instead to try to be part of this new ecosystem. You be the judge.",[12,2048,2049],{},"Say you pick one path or the other. How do you go about it? How do you block the crawlers, or encourage them to read your blog? And does it actually work?",[12,2051,2052],{},"Before we start, it helps to separate two things that often get mixed up:",[2054,2055,2056,2066],"ol",{},[1165,2057,2058,2061,2062,2065],{},[42,2059,2060],{},"Do you want AI crawlers to use your content at all?"," That is a ",[1173,2063,2064],{},"robots.txt"," question",[1165,2067,2068,2071,2072,2074],{},[42,2069,2070],{},"Do you want to make your content easy for AI tools to read?"," That is what ",[1173,2073,1204],{}," is for",[12,2076,2077,2078,2080,2081,2083],{},"They are independent. You can block crawlers and skip ",[1173,2079,1204],{},", publish ",[1173,2082,1204],{}," and welcome crawlers, or do neither. What does not make sense is answering \"no\" to the first and \"yes\" to the second, and we will come back to that.",[30,2085,2087],{"id":2086},"do-you-want-ai-to-read-your-blog","Do you want AI to read your blog?",[12,2089,2090,2091,28],{},"First thing first: the major AI crawlers do respect ",[1173,2092,2064],{},[12,2094,2095,2096,2098],{},"OpenAI, Anthropic, Google, Perplexity and the rest publish the names of their crawlers, and they document that those crawlers honour ",[1173,2097,2064],{}," directives. This is not a folk belief, it is written policy. So if you decide you would rather not feed your writing into a training set or an answer engine, you can say so, and the well-behaved bots will listen.",[12,2100,2101,2102,1375],{},"In Bloggrify that decision is one line in your ",[1173,2103,2104],{},"app.config.ts",[1443,2106,2108],{"className":1445,"code":2107,"filename":2104,"language":1447,"meta":1118,"style":1118},"export default defineAppConfig({\n  seo: {\n    ai: {\n      allowCrawlers: false,\n    },\n  },\n})\n",[1173,2109,2110,2125,2134,2143,2154,2159,2164],{"__ignoreMap":1118},[46,2111,2112,2115,2118,2121,2123],{"class":1452,"line":1453},[46,2113,2114],{"class":1815},"export",[46,2116,2117],{"class":1815}," default",[46,2119,2120],{"class":1481}," defineAppConfig",[46,2122,344],{"class":1485},[46,2124,1826],{"class":1460},[46,2126,2127,2130,2132],{"class":1452,"line":1119},[46,2128,2129],{"class":1536},"  seo",[46,2131,1375],{"class":1540},[46,2133,1810],{"class":1460},[46,2135,2136,2139,2141],{"class":1452,"line":1124},[46,2137,2138],{"class":1536},"    ai",[46,2140,1375],{"class":1540},[46,2142,1810],{"class":1460},[46,2144,2145,2148,2150,2152],{"class":1452,"line":1530},[46,2146,2147],{"class":1536},"      allowCrawlers",[46,2149,1375],{"class":1540},[46,2151,1544],{"class":1543},[46,2153,1502],{"class":1460},[46,2155,2156],{"class":1452,"line":1550},[46,2157,2158],{"class":1460},"    },\n",[46,2160,2161],{"class":1452,"line":1836},[46,2162,2163],{"class":1460},"  },\n",[46,2165,2166,2168],{"class":1452,"line":1842},[46,2167,1845],{"class":1460},[46,2169,1553],{"class":1485},[12,2171,2172,2173,2176,2177,2179,2180,2185],{},"That adds a ",[1173,2174,2175],{},"Disallow: \u002F"," group to your generated ",[1173,2178,2064],{}," covering the AI crawlers of the major vendors. Your blog stays perfectly indexed in Google and Bing, because search crawlers are deliberately left alone: you refuse the AI training agents without breaking the features you actually want. If you would like the full details of what gets blocked and what does not, the ",[22,2181,2184],{"href":2182,"rel":2183},"https:\u002F\u002Fbloggrify.com\u002Freference\u002Fai",[26],"AI crawlers reference"," spells it out.",[12,2187,2188],{},"Two things are worth being clear about.",[12,2190,2191,2194,2195,2197],{},[42,2192,2193],{},"It is a request, not a wall."," ",[1173,2196,2064],{}," is voluntary by design. Most crawlers honour it, some have been caught ignoring it, and anything you publish on a public static blog can ultimately be copied by someone who does not care about the rules. If you need real enforcement, you block at the network level, for example with your host's \"block AI scrapers\" feature. That happens outside Bloggrify, at your CDN or hosting provider.",[12,2199,2200,2203],{},[42,2201,2202],{},"Doing nothing is a valid answer too."," If you do not mind AI tools reading your posts, you change nothing. That is the default. Your content stays open, and the crawlers come and go as they always have. Not every blogger wants to fight this, and that is completely fine.",[12,2205,2206],{},"The point is simply that it is your content and your call. Bloggrify gives you the switch so the choice is yours to make, not one made for you by omission.",[30,2208,2210],{"id":2209},"making-your-blog-easy-to-read-llmstxt","Making your blog easy to read: llms.txt",[12,2212,2213,2214,28],{},"If you land on the \"sure, AI can read my blog\" side, there is a second, gentler thing you can offer: ",[1173,2215,1204],{},[12,2217,2218,2220,2221,2223,2224,28],{},[1173,2219,1204],{}," was proposed by Jeremy Howard, co-founder of Answer.AI, in September 2024. The idea is small and reasonable. A web page is full of navigation, scripts and markup that an AI has to wade through to find the actual content. ",[1173,2222,1204],{}," is a single markdown file at the root of your site that hands over a clean, structured index instead: a title, a short description, and a link for each post. You can read the full specification at ",[22,2225,2228],{"href":2226,"rel":2227},"https:\u002F\u002Fllmstxt.org",[26],"llmstxt.org",[12,2230,2231],{},"Turning it on is, again, one line:",[1443,2233,2235],{"className":1445,"code":2234,"filename":2104,"language":1447,"meta":1118,"style":1118},"export default defineAppConfig({\n  seo: {\n    ai: {\n      llms: true,\n    },\n  },\n})\n",[1173,2236,2237,2249,2257,2265,2277,2281,2285],{"__ignoreMap":1118},[46,2238,2239,2241,2243,2245,2247],{"class":1452,"line":1453},[46,2240,2114],{"class":1815},[46,2242,2117],{"class":1815},[46,2244,2120],{"class":1481},[46,2246,344],{"class":1485},[46,2248,1826],{"class":1460},[46,2250,2251,2253,2255],{"class":1452,"line":1119},[46,2252,2129],{"class":1536},[46,2254,1375],{"class":1540},[46,2256,1810],{"class":1460},[46,2258,2259,2261,2263],{"class":1452,"line":1124},[46,2260,2138],{"class":1536},[46,2262,1375],{"class":1540},[46,2264,1810],{"class":1460},[46,2266,2267,2270,2272,2275],{"class":1452,"line":1530},[46,2268,2269],{"class":1536},"      llms",[46,2271,1375],{"class":1540},[46,2273,2274],{"class":1543}," true",[46,2276,1502],{"class":1460},[46,2278,2279],{"class":1452,"line":1550},[46,2280,2158],{"class":1460},[46,2282,2283],{"class":1452,"line":1836},[46,2284,2163],{"class":1460},[46,2286,2287,2289],{"class":1452,"line":1842},[46,2288,1845],{"class":1460},[46,2290,1553],{"class":1485},[12,2292,2293,2294,2297,2298,1339,2301,2304],{},"Bloggrify then generates a ",[1173,2295,2296],{},"\u002Fllms.txt"," route at build time, right next to your ",[1173,2299,2300],{},"sitemap.xml",[1173,2302,2303],{},"rss.xml",". Drafts and hidden posts are excluded, and when the option is off, which is the default, the file is not generated at all.",[35,2306,2308],{"id":2307},"should-you-bother","Should you bother?",[12,2310,2311],{},"Here I want to be straight with you rather than sell it.",[12,2313,2314,2316],{},[1173,2315,1204],{}," is an invitation, not an instruction. It does not tell anyone what they may or may not do with your content, it only makes the content easier to consume. That is exactly why enabling it while also blocking AI crawlers is contradictory, and Bloggrify prints a warning at build time if you try to do both.",[12,2318,2319,2320,2322,2323,2326],{},"The format has picked up real momentum, and you will find it on plenty of sites, especially documentation. But its actual usefulness today is still speculative. No major AI provider has confirmed that its crawlers read ",[1173,2321,1204],{},", and Google has publicly compared it to the old ",[1173,2324,2325],{},"keywords"," meta tag, which is not a flattering comparison. The one case that genuinely works is a human pasting your URL into a chat: the tool fetches the page, and clean markdown beats a page full of navigation every time.",[12,2328,2329],{},"For a documentation site, where structure is everything, that is a clear win. For a blog, where each post is already a clean, focused page, the gain is smaller. It costs you one tiny file. So enable it if the idea appeals to you, but do not expect traffic to appear because of it. It is proposed, it is standardised, and everyone gets to do what they like with it. Bloggrify simply gives you the switch.",[30,2331,2333],{"id":2332},"you-decide","You decide",[12,2335,2336],{},"None of this is Bloggrify taking a side in the AI debate. It is two independent switches with defaults that respect you:",[1162,2338,2339,2353],{},[1165,2340,2341,2344,2345,2348,2349,2352],{},[42,2342,2343],{},"Crawlers are allowed by default."," Flip ",[1173,2346,2347],{},"allowCrawlers"," to ",[1173,2350,2351],{},"false"," the day you decide otherwise, and the major vendors will honour it.",[1165,2354,2355,2344,2360,2348,2363,2365],{},[42,2356,2357,2359],{},[1173,2358,1204],{}," is off by default.",[1173,2361,2362],{},"llms",[1173,2364,118],{}," if you want to publish a clean index, knowing it is an offer, not a guarantee.",[12,2367,2368,2369,2372,2373,28],{},"If you want to go deeper, both are documented in the ",[22,2370,2184],{"href":2182,"rel":2371},[26],", and indexing in search engines, which is a separate topic again, lives in the ",[22,2374,2377],{"href":2375,"rel":2376},"https:\u002F\u002Fbloggrify.com\u002Freference\u002Frobots",[26],"robots.txt reference",[12,2379,2380,2381,28],{},"Bloggrify is open source. You can find the project ",[22,2382,2384],{"href":1372,"rel":2383},[26],"on GitHub",[2001,2386,2387],{},"html pre.shiki code .sHqub, html code.shiki .sHqub{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#CA9EE6;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .srxfx, html code.shiki .srxfx{--shiki-light:#6182B8;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}html pre.shiki code .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .sdvfp, html code.shiki .sdvfp{--shiki-light:#39ADB5;--shiki-default:#949CBB;--shiki-dark:#E1E4E8}html pre.shiki code .sHJOX, html code.shiki .sHJOX{--shiki-light:#E53935;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .s1BmC, html code.shiki .s1BmC{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#E1E4E8}html pre.shiki code .sbhg_, html code.shiki .sbhg_{--shiki-light:#FF5370;--shiki-default:#EF9F76;--shiki-dark:#79B8FF}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);}",{"title":1118,"searchDepth":1119,"depth":1119,"links":2389},[2390,2391,2394],{"id":2086,"depth":1119,"text":2087},{"id":2209,"depth":1119,"text":2210,"children":2392},[2393],{"id":2307,"depth":1124,"text":2308},{"id":2332,"depth":1119,"text":2333},"2026-07-16","The major AI crawlers honour robots.txt, so blocking them is one line in Bloggrify. Whether you should, and what it actually protects, is another question.",{},"13",{"text":2017,"minutes":2400,"time":2401,"words":2402},5.26,315600,1052,{"title":2030,"description":2396},{"loc":1211},"2026\u002Fai-crawlers-and-llms-txt",[1200,2407],"ai","PJpue7xrdDkLMBZt2kJY1h9V8c6xGcPeWfjmHWXVsM0",{"id":2410,"title":2411,"alternates":6,"author":7,"body":2412,"categories":6,"comments":1126,"cover":6,"date":2490,"description":2491,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":2492,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":2493,"path":2494,"readingTime":2495,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":2499,"sitemap":2500,"stem":2501,"table_of_contents":1126,"tags":2502,"__hash__":2503},"page\u002F2025\u002Fversion-3-0.md","Announcing Bloggrify 3.0: CLI tools, Nuxt UI integration, and more",{"type":9,"value":2413,"toc":2481},[2414,2417,2421,2425,2428,2432,2435,2439,2442,2446,2449,2452,2466,2468,2473],[12,2415,2416],{},"We're excited to announce the release of Bloggrify 3.0.0! This major release brings a CLI to manage your blog, a Nuxt UI integration, and moves the whole stack to Nuxt 4 and Nuxt Content 3.",[30,2418,2420],{"id":2419},"whats-new-in-300","What's New in 3.0.0",[35,2422,2424],{"id":2423},"_1-cli-tools","1. CLI tools",[12,2426,2427],{},"Bloggrify now comes with a CLI tool to help you manage your blog. You can use it to create new posts, update existing ones, and more.",[35,2429,2431],{"id":2430},"_2-nuxt-ui-integration","2. Nuxt UI integration",[12,2433,2434],{},"Bloggrify now comes with a Nuxt UI integration to help you create beautiful and modern UI for your blog.",[35,2436,2438],{"id":2437},"_3-nuxt-4-and-nuxt-content-3-support","3. Nuxt 4 and Nuxt-Content 3 support",[12,2440,2441],{},"Bloggrify now comes with a Nuxt 4 and Nuxt-Content 3 support.",[35,2443,2445],{"id":2444},"_4-author-pages","4. Author pages",[12,2447,2448],{},"Author pages are automatically generated based on the authors you define in your app.config.ts file.",[12,2450,2451],{},"And more...",[1162,2453,2454,2457,2460,2463],{},[1165,2455,2456],{},"Automatic og:image generation when cover is not provided",[1165,2458,2459],{},"Use Search feature from nuxt-ui and Nuxt-Content",[1165,2461,2462],{},"Improve RSS discovery",[1165,2464,2465],{},"Improve performance using nuxt seo zeroRuntime option",[30,2467,1366],{"id":1365},[12,2469,1369,2470,1375],{},[22,2471,1374],{"href":1372,"rel":2472},[26],[1162,2474,2475,2477,2479],{},[1165,2476,1380],{},[1165,2478,1383],{},[1165,2480,1386],{},{"title":1118,"searchDepth":1119,"depth":1119,"links":2482},[2483,2489],{"id":2419,"depth":1119,"text":2420,"children":2484},[2485,2486,2487,2488],{"id":2423,"depth":1124,"text":2424},{"id":2430,"depth":1124,"text":2431},{"id":2437,"depth":1124,"text":2438},{"id":2444,"depth":1124,"text":2445},{"id":1365,"depth":1119,"text":1366},"2025-12-27","Major release with new CLI tools, nuxt ui integration, and more.",{},"12","\u002F2025\u002Fversion-3-0",{"text":1135,"minutes":2496,"time":2497,"words":2498},0.75,45000,150,{"title":2411,"description":2491},{"loc":2494},"2025\u002Fversion-3-0",[1412],"RaAzbC_ziNBVoKXYDgE_6zFJmcmtWCKDWEkngzq8J_8",{"id":2505,"title":2506,"alternates":6,"author":7,"body":2507,"categories":6,"comments":1126,"cover":6,"date":2774,"description":2775,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":2776,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":2777,"path":2778,"readingTime":2779,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":2783,"sitemap":2784,"stem":2785,"table_of_contents":1126,"tags":2786,"__hash__":2787},"page\u002F2025\u002Fversion-2-1.md","Announcing Bloggrify 2.1: More Shortcodes and Analytics Integration",{"type":9,"value":2508,"toc":2766},[2509,2512,2516,2520,2523,2611,2631,2635,2638,2641,2719,2723,2726,2745,2748,2750,2755,2763],[12,2510,2511],{},"We're excited to announce the release of Bloggrify 2.1.0! This update improves existing features to enhance your blogging experience: shortcodes and built-in analytics integration.",[30,2513,2515],{"id":2514},"whats-new-in-210","What's New in 2.1.0",[35,2517,2519],{"id":2518},"_1-shortcodes-simplify-complex-content","1. Shortcodes: Simplify Complex Content",[12,2521,2522],{},"Shortcodes provide an elegant way to insert complex elements into your Markdown content without writing lengthy HTML or Vue components.\nHere are the new shortcodes available in Bloggrify 2.1.0:",[1162,2524,2525,2556,2582,2608],{},[1165,2526,2527,2528],{},"youtube: Embed YouTube videos with a simple shortcode",[2529,2530,2531,2538],"mdd",{},[2532,2533,2534],"template",{"v-slot:preview":1118},[2535,2536],"youtube",{"video-id":2537},"su2gNQJkteg",[2532,2539,2540,2547,2549],{"v-slot:markup":1118},[1443,2541,2543],{"className":2542,"code":1118,"language":1143,"meta":1118,"style":1118},"language-markdown shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark",[1173,2544,2545],{"__ignoreMap":1118},[46,2546],{"class":1452,"line":1453},[2535,2548],{"video-id":2537},[1443,2550,2554],{"className":2551,"code":1118,"language":2553},[2552],"language-text","text",[1173,2555,1118],{"__ignoreMap":1118},[1165,2557,2558,2559],{},"X: Embed tweets directly in your content",[2529,2560,2561,2567],{},[2532,2562,2563],{"v-slot:preview":1118},[2564,2565],"x",{"tweet-id":2566},"1750435525071159309",[2532,2568,2569,2575,2577],{"v-slot:markup":1118},[1443,2570,2571],{"className":2542,"code":1118,"language":1143,"meta":1118,"style":1118},[1173,2572,2573],{"__ignoreMap":1118},[46,2574],{"class":1452,"line":1453},[2564,2576],{"tweet-id":2566},[1443,2578,2580],{"className":2579,"code":1118,"language":2553},[2552],[1173,2581,1118],{"__ignoreMap":1118},[1165,2583,2584,2585],{},"instagram: Display Instagram posts with ease",[2529,2586,2587,2593],{},[2532,2588,2589],{"v-slot:preview":1118},[2590,2591],"instagram",{"post-id":2592},"CxOWiQNP2MO",[2532,2594,2595,2601,2603],{"v-slot:markup":1118},[1443,2596,2597],{"className":2542,"code":1118,"language":1143,"meta":1118,"style":1118},[1173,2598,2599],{"__ignoreMap":1118},[46,2600],{"class":1452,"line":1453},[2590,2602],{"post-id":2592},[1443,2604,2606],{"className":2605,"code":1118,"language":2553},[2552],[1173,2607,1118],{"__ignoreMap":1118},[1165,2609,2610],{},"vimeo: Add Vimeo videos to your blog posts",[2529,2612,2613,2619],{},[2532,2614,2615],{"v-slot:preview":1118},[2616,2617],"vimeo",{"video-id":2618},"55073825",[2532,2620,2621],{"v-slot:markup":1118},[1443,2622,2624],{"className":2542,"code":2623,"language":1143,"meta":1118,"style":1118},":Vimeo{videoId=\"55073825\"}\n\n",[1173,2625,2626],{"__ignoreMap":1118},[46,2627,2628],{"class":1452,"line":1453},[46,2629,2630],{"class":1485},":Vimeo{videoId=\"55073825\"}\n",[35,2632,2634],{"id":2633},"_2-analytics-integration","2. Analytics Integration",[12,2636,2637],{},"Umami has been added as a new analytics provider in Bloggrify 2.1.0.",[12,2639,2640],{},"You can now use it alongside Google Analytics, Hakanai Pulse, Fathom, Pirsch, and Plausible to track your blog's performance.",[1443,2642,2646],{"className":2643,"code":2644,"language":2645,"meta":1118,"style":1118},"language-ts shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","\u002F\u002F app.config.ts\nanalytics: {\n    providers: [ {\n        provider: 'umami',\n        code: 'YOUR_TRACKING_CODE'\n    }]\n }\n","ts",[1173,2647,2648,2654,2664,2676,2692,2707,2715],{"__ignoreMap":1118},[46,2649,2650],{"class":1452,"line":1453},[46,2651,2653],{"class":2652},"sRX2Q","\u002F\u002F app.config.ts\n",[46,2655,2656,2660,2662],{"class":1452,"line":1119},[46,2657,2659],{"class":2658},"ss2FP","analytics",[46,2661,1375],{"class":1460},[46,2663,1810],{"class":1460},[46,2665,2666,2669,2671,2674],{"class":1452,"line":1124},[46,2667,2668],{"class":2658},"    providers",[46,2670,1375],{"class":1460},[46,2672,2673],{"class":1536}," [ ",[46,2675,1826],{"class":1460},[46,2677,2678,2681,2683,2685,2688,2690],{"class":1452,"line":1530},[46,2679,2680],{"class":1536},"        provider",[46,2682,1375],{"class":1540},[46,2684,1894],{"class":1491},[46,2686,2687],{"class":1495},"umami",[46,2689,1499],{"class":1491},[46,2691,1502],{"class":1460},[46,2693,2694,2697,2699,2701,2704],{"class":1452,"line":1550},[46,2695,2696],{"class":1536},"        code",[46,2698,1375],{"class":1540},[46,2700,1894],{"class":1491},[46,2702,2703],{"class":1495},"YOUR_TRACKING_CODE",[46,2705,2706],{"class":1491},"'\n",[46,2708,2709,2712],{"class":1452,"line":1836},[46,2710,2711],{"class":1460},"    }",[46,2713,2714],{"class":1536},"]\n",[46,2716,2717],{"class":1452,"line":1842},[46,2718,1547],{"class":1460},[30,2720,2722],{"id":2721},"upgrading-to-210","Upgrading to 2.1.0",[12,2724,2725],{},"Upgrading to Bloggrify 2.1.0 is straightforward:",[1443,2727,2731],{"className":2728,"code":2729,"language":2730,"meta":1118,"style":1118},"language-bash shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","npm install bloggrify@latest\n","bash",[1173,2732,2733],{"__ignoreMap":1118},[46,2734,2735,2739,2742],{"class":1452,"line":1453},[46,2736,2738],{"class":2737},"sAGAT","npm",[46,2740,2741],{"class":1495}," install",[46,2743,2744],{"class":1495}," bloggrify@latest\n",[12,2746,2747],{},"For existing projects, no configuration changes are required unless you want to use the new features.",[30,2749,1366],{"id":1365},[12,2751,1369,2752,1375],{},[22,2753,1374],{"href":1372,"rel":2754},[26],[1162,2756,2757,2759,2761],{},[1165,2758,1380],{},[1165,2760,1383],{},[1165,2762,1386],{},[2001,2764,2765],{},"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 .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .sRX2Q, html code.shiki .sRX2Q{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#949CBB;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .ss2FP, html code.shiki .ss2FP{--shiki-light:#E2931D;--shiki-default:#C6D0F5;--shiki-dark:#B392F0}html pre.shiki code .sdvfp, html code.shiki .sdvfp{--shiki-light:#39ADB5;--shiki-default:#949CBB;--shiki-dark:#E1E4E8}html pre.shiki code .sHJOX, html code.shiki .sHJOX{--shiki-light:#E53935;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .s1BmC, html code.shiki .s1BmC{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#E1E4E8}html pre.shiki code .srOHQ, html code.shiki .srOHQ{--shiki-light:#39ADB5;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sw2QF, html code.shiki .sw2QF{--shiki-light:#91B859;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sAGAT, html code.shiki .sAGAT{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}",{"title":1118,"searchDepth":1119,"depth":1119,"links":2767},[2768,2772,2773],{"id":2514,"depth":1119,"text":2515,"children":2769},[2770,2771],{"id":2518,"depth":1124,"text":2519},{"id":2633,"depth":1124,"text":2634},{"id":2721,"depth":1119,"text":2722},{"id":1365,"depth":1119,"text":1366},"2025-01-25","Minor release with new shortcodes and Umami analytics integration. ",{},"5","\u002F2025\u002Fversion-2-1",{"text":1135,"minutes":2780,"time":2781,"words":2782},0.81,48600,162,{"title":2506,"description":2775},{"loc":2778},"2025\u002Fversion-2-1",[1412],"B_Jd1wPYwVldF5VHyY14Xp-dxdN7gy_LImjmFCBIiZg",{"id":2789,"title":2790,"alternates":6,"author":7,"body":2791,"categories":6,"comments":1126,"cover":6,"date":2930,"description":2931,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":2932,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":2933,"path":2934,"readingTime":2935,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":2939,"sitemap":2940,"stem":2941,"table_of_contents":1126,"tags":2942,"__hash__":2943},"page\u002F2025\u002Fversion-2-0.md","Announcing Bloggrify 2.0: Enhanced SEO, Analytics, and Developer Experience",{"type":9,"value":2792,"toc":2920},[2793,2796,2800,2804,2825,2829,2832,2846,2850,2864,2868,2882,2886,2889,2897,2905,2907,2912],[12,2794,2795],{},"We're excited to announce the release of Bloggrify 2.0.0, representing a lot of development and 46 commits. This release focuses on improving SEO capabilities, expanding analytics options, and enhancing the developer experience.",[30,2797,2799],{"id":2798},"major-improvements","Major Improvements",[35,2801,2803],{"id":2802},"enhanced-seo-stack","Enhanced SEO Stack",[1162,2805,2806,2816,2819,2822],{},[1165,2807,2808,2809,1339,2812,2815],{},"Integrated ",[1173,2810,2811],{},"nuxtjs\u002Frobots",[1173,2813,2814],{},"nuxtjs\u002Fsitemap"," modules",[1165,2817,2818],{},"Added Schema.org support with BlogPosting annotations",[1165,2820,2821],{},"Enhanced meta tags and OpenGraph support",[1165,2823,2824],{},"Report reading time in meta tags and schema.org",[35,2826,2828],{"id":2827},"analytics-support","Analytics Support",[12,2830,2831],{},"Multiple provider support for web analytics:",[1162,2833,2834,2837,2840,2843],{},[1165,2835,2836],{},"Hakanai integration",[1165,2838,2839],{},"Fathom Analytics",[1165,2841,2842],{},"Google Analytics",[1165,2844,2845],{},"Support for multiple providers simultaneously",[35,2847,2849],{"id":2848},"developer-experience","Developer Experience",[1162,2851,2852,2855,2858,2861],{},[1165,2853,2854],{},"Improved error reporting during build",[1165,2856,2857],{},"Simplified template writing",[1165,2859,2860],{},"Better handling of internal links",[1165,2862,2863],{},"Enhanced documentation",[35,2865,2867],{"id":2866},"accessibility-improvements","Accessibility Improvements",[1162,2869,2870,2873,2876,2879],{},[1165,2871,2872],{},"Improved contrast ratios",[1165,2874,2875],{},"Added ARIA labels",[1165,2877,2878],{},"Semantic HTML enhancements",[1165,2880,2881],{},"Table of contents using proper nav elements",[30,2883,2885],{"id":2884},"breaking-changes","Breaking Changes",[12,2887,2888],{},"If upgrading from 1.x, as a user, impacts are minimal. However, theme developers should be aware of deprecations and changes.",[12,2890,2891,2892],{},"The migration guide is available in the ",[22,2893,2896],{"href":2894,"rel":2895},"https:\u002F\u002Fbloggrify.com\u002Fintroduction\u002Fmigration",[26],"documentation",[12,2898,2899,2900,28],{},"Full ",[22,2901,2904],{"href":2902,"rel":2903},"https:\u002F\u002Fgithub.com\u002Fbloggrify\u002Fbloggrify\u002Freleases\u002Ftag\u002Fv2.0.0",[26],"changelog available on GitHub",[30,2906,1366],{"id":1365},[12,2908,1369,2909,1375],{},[22,2910,1374],{"href":1372,"rel":2911},[26],[1162,2913,2914,2916,2918],{},[1165,2915,1380],{},[1165,2917,1383],{},[1165,2919,1386],{},{"title":1118,"searchDepth":1119,"depth":1119,"links":2921},[2922,2928,2929],{"id":2798,"depth":1119,"text":2799,"children":2923},[2924,2925,2926,2927],{"id":2802,"depth":1124,"text":2803},{"id":2827,"depth":1124,"text":2828},{"id":2848,"depth":1124,"text":2849},{"id":2866,"depth":1124,"text":2867},{"id":2884,"depth":1119,"text":2885},{"id":1365,"depth":1119,"text":1366},"2025-01-24","Major release with improved SEO capabilities, multiple analytics providers, and better developer experience. Over 46 commits bringing significant improvements to the framework.",{},"4","\u002F2025\u002Fversion-2-0",{"text":1135,"minutes":2936,"time":2937,"words":2938},0.665,39900,133,{"title":2790,"description":2931},{"loc":2934},"2025\u002Fversion-2-0",[1412],"kzKJkKBZOt3zQv2uX1wo5MbtR-9wO10m1GSExIc1WNQ",{"id":2945,"title":2946,"alternates":6,"author":7,"body":2947,"categories":6,"comments":1126,"cover":6,"date":3066,"description":3067,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":3068,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":3069,"path":3070,"readingTime":3071,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":3075,"sitemap":3076,"stem":3077,"table_of_contents":1126,"tags":3078,"__hash__":3079},"page\u002F2025\u002Fnew-custom-component.md","Introducing a new custom component: listing page",{"type":9,"value":2948,"toc":3063},[2949,2952,2959,2963,2983,2986,3012,3018,3036,3041,3060],[12,2950,2951],{},"A new custom component has been added to Bloggrify. This component is used to create listing pages.\nIt's more a proof of concept than a real component because the design is very basic.\nIt's a way to show how you can create custom components in Bloggrify.",[2953,2954,2956],"alert",{"type":2955},"warning",[12,2957,2958],{},"It's not possible to use several listing components on the same page. Otherwise, there is a conflict with the pagination.",[30,2960,2962],{"id":2961},"listing","Listing",[2529,2964,2965,2971],{},[2532,2966,2967],{"v-slot:preview":1118},[2968,2969],"minimalist-listing",{"title":2970},"My listing",[2532,2972,2973],{"v-slot:markup":1118},[1443,2974,2976],{"className":2542,"code":2975,"language":1143,"meta":1118,"style":1118},":minimalist-listing{title=\"My listing\"}\n\n",[1173,2977,2978],{"__ignoreMap":1118},[46,2979,2980],{"class":1452,"line":1453},[46,2981,2982],{"class":1485},":minimalist-listing{title=\"My listing\"}\n",[12,2984,2985],{},"This component accepts several parameters:",[1162,2987,2988,2994,3000,3006],{},[1165,2989,2990,2993],{},[1173,2991,2992],{},"title",": The title of the listing.",[1165,2995,2996,2999],{},[1173,2997,2998],{},"tag",": The tag to filter the listing.",[1165,3001,3002,3005],{},[1173,3003,3004],{},"category",": The category to filter the listing.",[1165,3007,3008,3011],{},[1173,3009,3010],{},"prefix",": All articles starting with this prefix will be displayed.",[12,3013,3014,3017],{},[42,3015,3016],{},"Example",": how to list all articles with the tag \"markdown\":",[2529,3019,3020,3024],{},[2532,3021,3022],{"v-slot:preview":1118},[2968,3023],{"title":2970,"tag":1143},[2532,3025,3026],{"v-slot:markup":1118},[1443,3027,3029],{"className":2542,"code":3028,"language":1143,"meta":1118,"style":1118},":minimalist-listing{title=\"My listing\" tag=\"markdown\"}\n\n",[1173,3030,3031],{"__ignoreMap":1118},[46,3032,3033],{"class":1452,"line":1453},[46,3034,3035],{"class":1485},":minimalist-listing{title=\"My listing\" tag=\"markdown\"}\n",[12,3037,3038,3040],{},[42,3039,3016],{},": how to list all articles by prefix, for example, all articles starting with \"2024\":",[2529,3042,3043,3048],{},[2532,3044,3045],{"v-slot:preview":1118},[2968,3046],{"title":2970,"prefix":3047},"2024",[2532,3049,3050],{"v-slot:markup":1118},[1443,3051,3053],{"className":2542,"code":3052,"language":1143,"meta":1118,"style":1118},":minimalist-listing{title=\"My listing\" prefix=\"2024\"}\n\n",[1173,3054,3055],{"__ignoreMap":1118},[46,3056,3057],{"class":1452,"line":1453},[46,3058,3059],{"class":1485},":minimalist-listing{title=\"My listing\" prefix=\"2024\"}\n",[2001,3061,3062],{},"html pre.shiki code .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}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);}",{"title":1118,"searchDepth":1119,"depth":1119,"links":3064},[3065],{"id":2961,"depth":1119,"text":2962},"2025-01-21","A new custom component has been added to Bloggrify. This component is used to create listing pages.",{},"11","\u002F2025\u002Fnew-custom-component",{"text":1135,"minutes":3072,"time":3073,"words":3074},0.625,37500,125,{"title":2946,"description":3067},{"loc":3070},"2025\u002Fnew-custom-component",[1143],"lrfDihC8hvhvBN0cqrIre-Rl2mttB2huxPWPSHrpVuc",{"id":4,"title":5,"alternates":6,"author":7,"body":3081,"categories":6,"comments":1126,"cover":6,"date":1127,"description":1128,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":4062,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":1132,"path":1133,"readingTime":4063,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":4064,"sitemap":4065,"stem":1141,"table_of_contents":1126,"tags":4066,"__hash__":1144},{"type":9,"value":3082,"toc":4056},[3083,3085,3087,3092,3094,3096,3100,3307,3311,3882,3886,4050,4052,4054],[12,3084,14],{},[12,3086,17],{},[12,3088,20,3089,28],{},[22,3090,27],{"href":24,"rel":3091},[26],[30,3093,33],{"id":32},[35,3095,38],{"id":37},[12,3097,3098],{},[42,3099,44],{},[46,3101,3103],{"className":3102},[49],[46,3104,3106,3143],{"className":3105},[53],[46,3107,3109],{"className":3108},[57],[59,3110,3111],{"xmlns":61,"display":62},[64,3112,3113,3141],{},[67,3114,3115,3117,3119,3125,3127,3133,3135],{},[70,3116,72],{},[74,3118,76],{},[78,3120,3121,3123],{},[81,3122,83],{},[81,3124,86],{},[70,3126,89],{},[91,3128,3129,3131],{},[70,3130,95],{},[81,3132,86],{},[70,3134,100],{},[102,3136,3137,3139],{},[70,3138,106],{},[70,3140,72],{},[110,3142,113],{"encoding":112},[46,3144,3146,3164],{"className":3145,"ariaHidden":118},[117],[46,3147,3149,3152,3155,3158,3161],{"className":3148},[122],[46,3150],{"className":3151,"style":127},[126],[46,3153,72],{"className":3154},[131,132],[46,3156],{"className":3157,"style":137},[136],[46,3159,76],{"className":3160},[141],[46,3162],{"className":3163,"style":137},[136],[46,3165,3167,3170,3232,3235,3264,3267],{"className":3166},[122],[46,3168],{"className":3169,"style":151},[126],[46,3171,3173,3176,3229],{"className":3172},[131],[46,3174],{"className":3175},[158,159],[46,3177,3179],{"className":3178},[78],[46,3180,3182,3221],{"className":3181},[166,167],[46,3183,3185,3218],{"className":3184},[171],[46,3186,3188,3199,3207],{"className":3187,"style":176},[175],[46,3189,3190,3193],{"style":179},[46,3191],{"className":3192,"style":184},[183],[46,3194,3196],{"className":3195},[131],[46,3197,86],{"className":3198},[131],[46,3200,3201,3204],{"style":193},[46,3202],{"className":3203,"style":184},[183],[46,3205],{"className":3206,"style":201},[200],[46,3208,3209,3212],{"style":204},[46,3210],{"className":3211,"style":184},[183],[46,3213,3215],{"className":3214},[131],[46,3216,83],{"className":3217},[131],[46,3219,218],{"className":3220},[217],[46,3222,3224],{"className":3223},[171],[46,3225,3227],{"className":3226,"style":225},[175],[46,3228],{},[46,3230],{"className":3231},[231,159],[46,3233,89],{"className":3234},[131,132],[46,3236,3238,3241],{"className":3237},[131],[46,3239,95],{"className":3240,"style":241},[131,132],[46,3242,3244],{"className":3243},[245],[46,3245,3247],{"className":3246},[166],[46,3248,3250],{"className":3249},[171],[46,3251,3253],{"className":3252,"style":255},[175],[46,3254,3255,3258],{"style":258},[46,3256],{"className":3257,"style":262},[183],[46,3259,3261],{"className":3260},[266,267,268,269],[46,3262,86],{"className":3263},[131,269],[46,3265,100],{"className":3266,"style":276},[131,132],[46,3268,3270,3273],{"className":3269},[131],[46,3271,106],{"className":3272,"style":283},[131,132],[46,3274,3276],{"className":3275},[245],[46,3277,3279,3299],{"className":3278},[166,167],[46,3280,3282,3296],{"className":3281},[171],[46,3283,3285],{"className":3284,"style":296},[175],[46,3286,3287,3290],{"style":299},[46,3288],{"className":3289,"style":262},[183],[46,3291,3293],{"className":3292},[266,267,268,269],[46,3294,72],{"className":3295},[131,132,269],[46,3297,218],{"className":3298},[217],[46,3300,3302],{"className":3301},[171],[46,3303,3305],{"className":3304,"style":318},[175],[46,3306],{},[12,3308,3309],{},[42,3310,325],{},[46,3312,3314,3419],{"className":3313},[53],[46,3315,3317],{"className":3316},[57],[59,3318,3319],{"xmlns":61},[64,3320,3321,3417],{},[67,3322,3323,3359,3361,3389],{},[91,3324,3325,3357],{},[67,3326,3327,3329,3343,3349,3355],{},[74,3328,344],{"fence":118},[346,3330,3331,3333,3341],{},[74,3332,350],{},[67,3334,3335,3337,3339],{},[70,3336,355],{},[74,3338,76],{},[81,3340,83],{},[70,3342,362],{},[102,3344,3345,3347],{},[70,3346,22],{},[70,3348,355],{},[102,3350,3351,3353],{},[70,3352,373],{},[70,3354,355],{},[74,3356,378],{"fence":118},[81,3358,86],{},[74,3360,383],{},[67,3362,3363,3365,3379,3387],{},[74,3364,344],{"fence":118},[346,3366,3367,3369,3377],{},[74,3368,350],{},[67,3370,3371,3373,3375],{},[70,3372,355],{},[74,3374,76],{},[81,3376,83],{},[70,3378,362],{},[346,3380,3381,3383,3385],{},[70,3382,22],{},[70,3384,355],{},[81,3386,86],{},[74,3388,378],{"fence":118},[67,3390,3391,3393,3407,3415],{},[74,3392,344],{"fence":118},[346,3394,3395,3397,3405],{},[74,3396,350],{},[67,3398,3399,3401,3403],{},[70,3400,355],{},[74,3402,76],{},[81,3404,83],{},[70,3406,362],{},[346,3408,3409,3411,3413],{},[70,3410,373],{},[70,3412,355],{},[81,3414,86],{},[74,3416,378],{"fence":118},[110,3418,442],{"encoding":112},[46,3420,3422,3615],{"className":3421,"ariaHidden":118},[117],[46,3423,3425,3428,3606,3609,3612],{"className":3424},[122],[46,3426],{"className":3427,"style":452},[126],[46,3429,3431,3583],{"className":3430},[456],[46,3432,3434,3437,3497,3500,3540,3580],{"className":3433},[456],[46,3435,344],{"className":3436,"style":464},[158,463],[46,3438,3440,3443],{"className":3439},[468],[46,3441,350],{"className":3442,"style":474},[468,472,473],[46,3444,3446],{"className":3445},[245],[46,3447,3449,3489],{"className":3448},[166,167],[46,3450,3452,3486],{"className":3451},[171],[46,3453,3455,3475],{"className":3454,"style":487},[175],[46,3456,3457,3460],{"style":490},[46,3458],{"className":3459,"style":262},[183],[46,3461,3463],{"className":3462},[266,267,268,269],[46,3464,3466,3469,3472],{"className":3465},[131,269],[46,3467,355],{"className":3468,"style":503},[131,132,269],[46,3470,76],{"className":3471},[141,269],[46,3473,83],{"className":3474},[131,269],[46,3476,3477,3480],{"style":512},[46,3478],{"className":3479,"style":262},[183],[46,3481,3483],{"className":3482},[266,267,268,269],[46,3484,362],{"className":3485},[131,132,269],[46,3487,218],{"className":3488},[217],[46,3490,3492],{"className":3491},[171],[46,3493,3495],{"className":3494,"style":531},[175],[46,3496],{},[46,3498],{"className":3499,"style":537},[136],[46,3501,3503,3506],{"className":3502},[131],[46,3504,22],{"className":3505},[131,132],[46,3507,3509],{"className":3508},[245],[46,3510,3512,3532],{"className":3511},[166,167],[46,3513,3515,3529],{"className":3514},[171],[46,3516,3518],{"className":3517,"style":556},[175],[46,3519,3520,3523],{"style":559},[46,3521],{"className":3522,"style":262},[183],[46,3524,3526],{"className":3525},[266,267,268,269],[46,3527,355],{"className":3528,"style":503},[131,132,269],[46,3530,218],{"className":3531},[217],[46,3533,3535],{"className":3534},[171],[46,3536,3538],{"className":3537,"style":318},[175],[46,3539],{},[46,3541,3543,3546],{"className":3542},[131],[46,3544,373],{"className":3545},[131,132],[46,3547,3549],{"className":3548},[245],[46,3550,3552,3572],{"className":3551},[166,167],[46,3553,3555,3569],{"className":3554},[171],[46,3556,3558],{"className":3557,"style":556},[175],[46,3559,3560,3563],{"style":559},[46,3561],{"className":3562,"style":262},[183],[46,3564,3566],{"className":3565},[266,267,268,269],[46,3567,355],{"className":3568,"style":503},[131,132,269],[46,3570,218],{"className":3571},[217],[46,3573,3575],{"className":3574},[171],[46,3576,3578],{"className":3577,"style":318},[175],[46,3579],{},[46,3581,378],{"className":3582,"style":464},[231,463],[46,3584,3586],{"className":3585},[245],[46,3587,3589],{"className":3588},[166],[46,3590,3592],{"className":3591},[171],[46,3593,3595],{"className":3594,"style":635},[175],[46,3596,3597,3600],{"style":638},[46,3598],{"className":3599,"style":262},[183],[46,3601,3603],{"className":3602},[266,267,268,269],[46,3604,86],{"className":3605},[131,269],[46,3607],{"className":3608,"style":137},[136],[46,3610,383],{"className":3611},[141],[46,3613],{"className":3614,"style":137},[136],[46,3616,3618,3621,3750,3753],{"className":3617},[122],[46,3619],{"className":3620,"style":663},[126],[46,3622,3624,3630,3690,3693,3744],{"className":3623},[456],[46,3625,3627],{"className":3626,"style":464},[158,463],[46,3628,344],{"className":3629},[673,674],[46,3631,3633,3636],{"className":3632},[468],[46,3634,350],{"className":3635,"style":474},[468,472,473],[46,3637,3639],{"className":3638},[245],[46,3640,3642,3682],{"className":3641},[166,167],[46,3643,3645,3679],{"className":3644},[171],[46,3646,3648,3668],{"className":3647,"style":487},[175],[46,3649,3650,3653],{"style":490},[46,3651],{"className":3652,"style":262},[183],[46,3654,3656],{"className":3655},[266,267,268,269],[46,3657,3659,3662,3665],{"className":3658},[131,269],[46,3660,355],{"className":3661,"style":503},[131,132,269],[46,3663,76],{"className":3664},[141,269],[46,3666,83],{"className":3667},[131,269],[46,3669,3670,3673],{"style":512},[46,3671],{"className":3672,"style":262},[183],[46,3674,3676],{"className":3675},[266,267,268,269],[46,3677,362],{"className":3678},[131,132,269],[46,3680,218],{"className":3681},[217],[46,3683,3685],{"className":3684},[171],[46,3686,3688],{"className":3687,"style":531},[175],[46,3689],{},[46,3691],{"className":3692,"style":537},[136],[46,3694,3696,3699],{"className":3695},[131],[46,3697,22],{"className":3698},[131,132],[46,3700,3702],{"className":3701},[245],[46,3703,3705,3736],{"className":3704},[166,167],[46,3706,3708,3733],{"className":3707},[171],[46,3709,3711,3722],{"className":3710,"style":756},[175],[46,3712,3713,3716],{"style":759},[46,3714],{"className":3715,"style":262},[183],[46,3717,3719],{"className":3718},[266,267,268,269],[46,3720,355],{"className":3721,"style":503},[131,132,269],[46,3723,3724,3727],{"style":771},[46,3725],{"className":3726,"style":262},[183],[46,3728,3730],{"className":3729},[266,267,268,269],[46,3731,86],{"className":3732},[131,269],[46,3734,218],{"className":3735},[217],[46,3737,3739],{"className":3738},[171],[46,3740,3742],{"className":3741,"style":790},[175],[46,3743],{},[46,3745,3747],{"className":3746,"style":464},[231,463],[46,3748,378],{"className":3749},[673,674],[46,3751],{"className":3752,"style":537},[136],[46,3754,3756,3762,3822,3825,3876],{"className":3755},[456],[46,3757,3759],{"className":3758,"style":464},[158,463],[46,3760,344],{"className":3761},[673,674],[46,3763,3765,3768],{"className":3764},[468],[46,3766,350],{"className":3767,"style":474},[468,472,473],[46,3769,3771],{"className":3770},[245],[46,3772,3774,3814],{"className":3773},[166,167],[46,3775,3777,3811],{"className":3776},[171],[46,3778,3780,3800],{"className":3779,"style":487},[175],[46,3781,3782,3785],{"style":490},[46,3783],{"className":3784,"style":262},[183],[46,3786,3788],{"className":3787},[266,267,268,269],[46,3789,3791,3794,3797],{"className":3790},[131,269],[46,3792,355],{"className":3793,"style":503},[131,132,269],[46,3795,76],{"className":3796},[141,269],[46,3798,83],{"className":3799},[131,269],[46,3801,3802,3805],{"style":512},[46,3803],{"className":3804,"style":262},[183],[46,3806,3808],{"className":3807},[266,267,268,269],[46,3809,362],{"className":3810},[131,132,269],[46,3812,218],{"className":3813},[217],[46,3815,3817],{"className":3816},[171],[46,3818,3820],{"className":3819,"style":531},[175],[46,3821],{},[46,3823],{"className":3824,"style":537},[136],[46,3826,3828,3831],{"className":3827},[131],[46,3829,373],{"className":3830},[131,132],[46,3832,3834],{"className":3833},[245],[46,3835,3837,3868],{"className":3836},[166,167],[46,3838,3840,3865],{"className":3839},[171],[46,3841,3843,3854],{"className":3842,"style":756},[175],[46,3844,3845,3848],{"style":759},[46,3846],{"className":3847,"style":262},[183],[46,3849,3851],{"className":3850},[266,267,268,269],[46,3852,355],{"className":3853,"style":503},[131,132,269],[46,3855,3856,3859],{"style":771},[46,3857],{"className":3858,"style":262},[183],[46,3860,3862],{"className":3861},[266,267,268,269],[46,3863,86],{"className":3864},[131,269],[46,3866,218],{"className":3867},[217],[46,3869,3871],{"className":3870},[171],[46,3872,3874],{"className":3873,"style":790},[175],[46,3875],{},[46,3877,3879],{"className":3878,"style":464},[231,463],[46,3880,378],{"className":3881},[673,674],[12,3883,3884],{},[42,3885,935],{},[12,3887,938,3888,28],{},[46,3889,3891,3924],{"className":3890},[53],[46,3892,3894],{"className":3893},[57],[59,3895,3896],{"xmlns":61},[64,3897,3898,3922],{},[67,3899,3900,3906,3908,3914,3916],{},[91,3901,3902,3904],{},[70,3903,22],{},[81,3905,86],{},[74,3907,959],{},[91,3909,3910,3912],{},[70,3911,373],{},[81,3913,86],{},[74,3915,76],{},[91,3917,3918,3920],{},[70,3919,972],{},[81,3921,86],{},[110,3923,977],{"encoding":112},[46,3925,3927,3971,4015],{"className":3926,"ariaHidden":118},[117],[46,3928,3930,3933,3962,3965,3968],{"className":3929},[122],[46,3931],{"className":3932,"style":987},[126],[46,3934,3936,3939],{"className":3935},[131],[46,3937,22],{"className":3938},[131,132],[46,3940,3942],{"className":3941},[245],[46,3943,3945],{"className":3944},[166],[46,3946,3948],{"className":3947},[171],[46,3949,3951],{"className":3950,"style":756},[175],[46,3952,3953,3956],{"style":771},[46,3954],{"className":3955,"style":262},[183],[46,3957,3959],{"className":3958},[266,267,268,269],[46,3960,86],{"className":3961},[131,269],[46,3963],{"className":3964,"style":1020},[136],[46,3966,959],{"className":3967},[1024],[46,3969],{"className":3970,"style":1020},[136],[46,3972,3974,3977,4006,4009,4012],{"className":3973},[122],[46,3975],{"className":3976,"style":756},[126],[46,3978,3980,3983],{"className":3979},[131],[46,3981,373],{"className":3982},[131,132],[46,3984,3986],{"className":3985},[245],[46,3987,3989],{"className":3988},[166],[46,3990,3992],{"className":3991},[171],[46,3993,3995],{"className":3994,"style":756},[175],[46,3996,3997,4000],{"style":771},[46,3998],{"className":3999,"style":262},[183],[46,4001,4003],{"className":4002},[266,267,268,269],[46,4004,86],{"className":4005},[131,269],[46,4007],{"className":4008,"style":137},[136],[46,4010,76],{"className":4011},[141],[46,4013],{"className":4014,"style":137},[136],[46,4016,4018,4021],{"className":4017},[122],[46,4019],{"className":4020,"style":756},[126],[46,4022,4024,4027],{"className":4023},[131],[46,4025,972],{"className":4026},[131,132],[46,4028,4030],{"className":4029},[245],[46,4031,4033],{"className":4032},[166],[46,4034,4036],{"className":4035},[171],[46,4037,4039],{"className":4038,"style":756},[175],[46,4040,4041,4044],{"style":771},[46,4042],{"className":4043,"style":262},[183],[46,4045,4047],{"className":4046},[266,267,268,269],[46,4048,86],{"className":4049},[131,269],[30,4051,1110],{"id":1109},[12,4053,1113],{},[12,4055,1116],{},{"title":1118,"searchDepth":1119,"depth":1119,"links":4057},[4058,4061],{"id":32,"depth":1119,"text":33,"children":4059},[4060],{"id":37,"depth":1124,"text":38},{"id":1109,"depth":1119,"text":1110},{},{"text":1135,"minutes":1136,"time":1137,"words":1138},{"title":5,"description":1128},{"loc":1133},[1143,53],{"id":4068,"title":4069,"alternates":6,"author":7,"body":4070,"categories":6,"comments":1126,"cover":4260,"date":4261,"description":4262,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":4263,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":4264,"path":4265,"readingTime":4266,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":4271,"sitemap":4272,"stem":4273,"table_of_contents":1126,"tags":4274,"__hash__":4275},"page\u002F2024\u002Fanalytics.md","Analytics in Bloggrify: Measuring Your Audience Without Tracking Them",{"type":9,"value":4071,"toc":4254},[4072,4075,4078,4082,4085,4088,4095,4098,4102,4109,4112,4115,4119,4138,4141,4144,4148,4153,4239,4251],[12,4073,4074],{},"Most blogs want the same two things from analytics: how many people came, and what they read. That is a modest question. The tools people reach for to answer it, led by Google Analytics, tend to collect far more than that, and they hand you a cookie banner and a privacy policy as the price of entry.",[12,4076,4077],{},"Bloggrify encourages you to use privacy-focused analytics providers that take a narrower path on purpose, and this post explains why, and where the sharp edges are.",[30,4079,4081],{"id":4080},"why-cookieless-analytics","Why cookieless analytics",[12,4083,4084],{},"The reason a site needs a cookie banner is not analytics as such, it is the cookies and the personal data. Under the GDPR and the ePrivacy directive, storing a cookie on a reader's device for tracking, or collecting data that identifies them, requires consent. That is what the banner is: a consent prompt the law obliges you to show.",[12,4086,4087],{},"Cookieless analytics sidestep the whole thing. Providers like Hakanai, Pirsch, Plausible, Umami, Fathom and OpenPanel can count visits without storing anything on the reader's device and without building a profile of who they are. They measure page views, referrers and rough geography from data the browser already sends, then aggregate it. No cookie, no personal data, and in the common case no banner to show. The tracking script is also a fraction of the weight of a typical tag manager, so the page stays fast.",[12,4089,4090,4091,4094],{},"None of that is automatic, though. It describes these tools in their default, privacy-preserving mode, not a guarantee they enforce. Most of them also offer opt-in features that set identifiers, follow individuals across sessions or enrich visitor data, and ",[42,4092,4093],{},"the moment you turn those on you are collecting personal data again and back to needing consent",". Whichever provider you pick, check its settings and keep it in the cookieless mode this whole approach depends on.",[12,4096,4097],{},"Bloggrify integrates with these providers directly. You pick one, drop your site code into the config, and the script is added to every page.",[30,4099,4101],{"id":4100},"google-analytics-is-allowed-not-recommended","Google Analytics is allowed, not recommended",[12,4103,4104,4105,4108],{},"Bloggrify does not forbid Google Analytics. If you already run it everywhere and want it here too, the ",[1173,4106,4107],{},"google"," provider is there. But it is a deliberate outlier in the list, and worth being honest about.",[12,4110,4111],{},"Google Analytics sets cookies and sends visitor data to Google, which puts it squarely in banner-and-consent territory. It has also been on shaky legal ground in Europe: several national regulators, in Austria, France and Italy among others, have ruled that sending European visitors' data to Google Analytics breached the GDPR. The legal picture keeps shifting, but the direction of travel is clear enough that building a new blog on it in 2024 is a strange choice.",[12,4113,4114],{},"I can't remove it because it's widely used, but I don't recommend it.",[30,4116,4118],{"id":4117},"the-ad-blocker-problem-and-the-honest-way-around-it","The ad blocker problem, and the honest way around it",[12,4120,4121,4122,4125,4126,4129,4130,4133,4134,4137],{},"There is a catch about trackers: a large share of your readers never load it. ",[42,4123,4124],{},"Roughly a third of web users run an ad blocker",", and on a technical blog it is routinely more than half. The default cloud scripts, served from domains like ",[1173,4127,4128],{},"plausible.io",", ",[1173,4131,4132],{},"cloud.umami.is"," or ",[1173,4135,4136],{},"cdn.usefathom.com",", sit on the standard block lists. Those readers are simply missing from your numbers, and the more technical your audience, the more wrong your dashboard is.",[12,4139,4140],{},"The fix that actually works is a proxy. Instead of loading the script from the provider's domain, you serve it from your own, so it is indistinguishable from the rest of your site and slips past the block lists. Most providers document a proxy setup for exactly this reason.",[12,4142,4143],{},"I want to be clear about what that is for. A proxy is a way to count the readers an ad blocker would otherwise hide, not a way to quietly reinstate the tracking those readers were trying to avoid. Routing a cookie-setting, profile-building tracker through your own domain to dodge consent would be the wrong use of it. The combination worth aiming for is a cookieless provider that collects no personal data, proxied through your domain so the counts are honest.",[30,4145,4147],{"id":4146},"setting-it-up","Setting it up",[12,4149,4150,4151,1375],{},"The whole configuration is one entry in your ",[1173,4152,2104],{},[1443,4154,4156],{"className":1445,"code":4155,"filename":2104,"language":1447,"meta":1118,"style":1118},"export default defineAppConfig({\n  analytics: {\n    providers: [\n      { provider: 'hakanai', code: 'YOUR_SITE_ID' },\n    ],\n  },\n})\n",[1173,4157,4158,4170,4179,4188,4222,4229,4233],{"__ignoreMap":1118},[46,4159,4160,4162,4164,4166,4168],{"class":1452,"line":1453},[46,4161,2114],{"class":1815},[46,4163,2117],{"class":1815},[46,4165,2120],{"class":1481},[46,4167,344],{"class":1485},[46,4169,1826],{"class":1460},[46,4171,4172,4175,4177],{"class":1452,"line":1119},[46,4173,4174],{"class":1536},"  analytics",[46,4176,1375],{"class":1540},[46,4178,1810],{"class":1460},[46,4180,4181,4183,4185],{"class":1452,"line":1124},[46,4182,2668],{"class":1536},[46,4184,1375],{"class":1540},[46,4186,4187],{"class":1485}," [\n",[46,4189,4190,4193,4196,4198,4200,4203,4205,4207,4210,4212,4214,4217,4219],{"class":1452,"line":1530},[46,4191,4192],{"class":1460},"      {",[46,4194,4195],{"class":1536}," provider",[46,4197,1375],{"class":1540},[46,4199,1894],{"class":1491},[46,4201,4202],{"class":1495},"hakanai",[46,4204,1499],{"class":1491},[46,4206,1598],{"class":1460},[46,4208,4209],{"class":1536}," code",[46,4211,1375],{"class":1540},[46,4213,1894],{"class":1491},[46,4215,4216],{"class":1495},"YOUR_SITE_ID",[46,4218,1499],{"class":1491},[46,4220,4221],{"class":1460}," },\n",[46,4223,4224,4227],{"class":1452,"line":1550},[46,4225,4226],{"class":1485},"    ]",[46,4228,1502],{"class":1460},[46,4230,4231],{"class":1452,"line":1836},[46,4232,2163],{"class":1460},[46,4234,4235,4237],{"class":1452,"line":1842},[46,4236,1845],{"class":1460},[46,4238,1553],{"class":1485},[12,4240,4241,4242,4244,4245,4250],{},"Swap ",[1173,4243,4202],{}," for whichever provider you chose and paste in the site code it gave you. The ",[22,4246,4249],{"href":4247,"rel":4248},"https:\u002F\u002Fbloggrify.com\u002Freference\u002Fanalytics",[26],"analytics reference"," lists every supported provider and the exact code each one expects, along with the proxy setup where it applies.",[2001,4252,4253],{},"html pre.shiki code .sHqub, html code.shiki .sHqub{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#CA9EE6;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .srxfx, html code.shiki .srxfx{--shiki-light:#6182B8;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}html pre.shiki code .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .sdvfp, html code.shiki .sdvfp{--shiki-light:#39ADB5;--shiki-default:#949CBB;--shiki-dark:#E1E4E8}html pre.shiki code .sHJOX, html code.shiki .sHJOX{--shiki-light:#E53935;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .s1BmC, html code.shiki .s1BmC{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#E1E4E8}html pre.shiki code .srOHQ, html code.shiki .srOHQ{--shiki-light:#39ADB5;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sw2QF, html code.shiki .sw2QF{--shiki-light:#91B859;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}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);}",{"title":1118,"searchDepth":1119,"depth":1119,"links":4255},[4256,4257,4258,4259],{"id":4080,"depth":1119,"text":4081},{"id":4100,"depth":1119,"text":4101},{"id":4117,"depth":1119,"text":4118},{"id":4146,"depth":1119,"text":4147},"\u002Fblog\u002Fanalytics.jpg","2024-02-11","How Bloggrify handles analytics: why cookieless providers matter, why Google Analytics is allowed but not recommended, and how to get accurate numbers past ad blockers.",{},"8","\u002F2024\u002Fanalytics",{"text":4267,"minutes":4268,"time":4269,"words":4270},"4 min read",3.6,216000,720,{"title":4069,"description":4262},{"loc":4265},"2024\u002Fanalytics",[2659],"yjGs1m9-7JulBTE3n5OL69angqUSXr7qZGTi_-aMXyE",{"id":4277,"title":4278,"alternates":6,"author":7,"body":4279,"categories":6,"comments":1126,"cover":6,"date":4261,"description":4923,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":4924,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":4925,"path":4926,"readingTime":4927,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":4931,"sitemap":4932,"stem":1200,"table_of_contents":1131,"tags":4933,"__hash__":4934},"page\u002Fseo.md","SEO in Bloggrify: How Your Blog Gets Found",{"type":9,"value":4280,"toc":4907},[4281,4284,4288,4291,4302,4305,4309,4313,4473,4476,4534,4538,4541,4622,4626,4629,4632,4635,4638,4641,4661,4664,4668,4672,4675,4684,4698,4704,4721,4727,4741,4746,4763,4766,4770,4773,4800,4803,4817,4820,4831,4835,4838,4844,4848,4851,4862,4866,4887,4889,4895,4904],[12,4282,4283],{},"When you write a blog post, you want it to reach its audience. That's where SEO (Search Engine Optimization) comes in - it's the practice of making your content discoverable by search engines. Let's explore how Bloggrify helps you achieve this without becoming an SEO expert.",[30,4285,4287],{"id":4286},"why-seo-matters-for-your-blog","Why SEO Matters for Your Blog",[12,4289,4290],{},"Think about how you find information online. You probably:",[2054,4292,4293,4296,4299],{},[1165,4294,4295],{},"Type a question in Google",[1165,4297,4298],{},"Scan the results",[1165,4300,4301],{},"Click on the most relevant one",[12,4303,4304],{},"That's exactly how your potential readers will find your blog. Good SEO means your content appears in these results when it's relevant to the search. But here's the catch: SEO involves dozens of technical details that can be overwhelming.",[30,4306,4308],{"id":4307},"what-bloggrify-does-automatically","What Bloggrify Does Automatically 🤖",[35,4310,4312],{"id":4311},"meta-tags-generation","Meta Tags Generation",[1443,4314,4316],{"className":1703,"code":4315,"language":1705,"meta":1118,"style":1118},"\u003Cmeta name=\"description\" content=\"Your post description\">\n\u003Cmeta name=\"robots\" content=\"index,follow\">\n\u003Cmeta property=\"og:title\" content=\"Your Post Title\">\n\u003Cmeta property=\"og:description\" content=\"Your post description\">\n\u003Cmeta property=\"og:image\" content=\"your-image.jpg\">\n",[1173,4317,4318,4353,4383,4414,4443],{"__ignoreMap":1118},[46,4319,4320,4322,4326,4329,4331,4333,4336,4338,4341,4343,4345,4348,4350],{"class":1452,"line":1453},[46,4321,1712],{"class":1540},[46,4323,4325],{"class":4324},"sjqto","meta",[46,4327,4328],{"class":1721}," name",[46,4330,76],{"class":1540},[46,4332,1727],{"class":1491},[46,4334,4335],{"class":1495},"description",[46,4337,1727],{"class":1491},[46,4339,4340],{"class":1721}," content",[46,4342,76],{"class":1540},[46,4344,1727],{"class":1491},[46,4346,4347],{"class":1495},"Your post description",[46,4349,1727],{"class":1491},[46,4351,4352],{"class":1540},">\n",[46,4354,4355,4357,4359,4361,4363,4365,4368,4370,4372,4374,4376,4379,4381],{"class":1452,"line":1119},[46,4356,1712],{"class":1540},[46,4358,4325],{"class":4324},[46,4360,4328],{"class":1721},[46,4362,76],{"class":1540},[46,4364,1727],{"class":1491},[46,4366,4367],{"class":1495},"robots",[46,4369,1727],{"class":1491},[46,4371,4340],{"class":1721},[46,4373,76],{"class":1540},[46,4375,1727],{"class":1491},[46,4377,4378],{"class":1495},"index,follow",[46,4380,1727],{"class":1491},[46,4382,4352],{"class":1540},[46,4384,4385,4387,4389,4392,4394,4396,4399,4401,4403,4405,4407,4410,4412],{"class":1452,"line":1124},[46,4386,1712],{"class":1540},[46,4388,4325],{"class":4324},[46,4390,4391],{"class":1721}," property",[46,4393,76],{"class":1540},[46,4395,1727],{"class":1491},[46,4397,4398],{"class":1495},"og:title",[46,4400,1727],{"class":1491},[46,4402,4340],{"class":1721},[46,4404,76],{"class":1540},[46,4406,1727],{"class":1491},[46,4408,4409],{"class":1495},"Your Post Title",[46,4411,1727],{"class":1491},[46,4413,4352],{"class":1540},[46,4415,4416,4418,4420,4422,4424,4426,4429,4431,4433,4435,4437,4439,4441],{"class":1452,"line":1530},[46,4417,1712],{"class":1540},[46,4419,4325],{"class":4324},[46,4421,4391],{"class":1721},[46,4423,76],{"class":1540},[46,4425,1727],{"class":1491},[46,4427,4428],{"class":1495},"og:description",[46,4430,1727],{"class":1491},[46,4432,4340],{"class":1721},[46,4434,76],{"class":1540},[46,4436,1727],{"class":1491},[46,4438,4347],{"class":1495},[46,4440,1727],{"class":1491},[46,4442,4352],{"class":1540},[46,4444,4445,4447,4449,4451,4453,4455,4458,4460,4462,4464,4466,4469,4471],{"class":1452,"line":1550},[46,4446,1712],{"class":1540},[46,4448,4325],{"class":4324},[46,4450,4391],{"class":1721},[46,4452,76],{"class":1540},[46,4454,1727],{"class":1491},[46,4456,4457],{"class":1495},"og:image",[46,4459,1727],{"class":1491},[46,4461,4340],{"class":1721},[46,4463,76],{"class":1540},[46,4465,1727],{"class":1491},[46,4467,4468],{"class":1495},"your-image.jpg",[46,4470,1727],{"class":1491},[46,4472,4352],{"class":1540},[12,4474,4475],{},"All these tags are generated automatically from your post's front matter:",[1443,4477,4481],{"className":4478,"code":4479,"language":4480,"meta":1118,"style":1118},"language-yaml shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","---\ntitle: \"My Amazing Post\"\ndescription: \"A clear description of your post\"\ncover: \"\u002Fimages\u002Fpost-cover.jpg\"\n---\n","yaml",[1173,4482,4483,4489,4503,4516,4530],{"__ignoreMap":1118},[46,4484,4485],{"class":1452,"line":1453},[46,4486,4488],{"class":4487},"sIaQ3","---\n",[46,4490,4491,4493,4495,4498,4501],{"class":1452,"line":1119},[46,4492,2992],{"class":4324},[46,4494,1375],{"class":1540},[46,4496,4497],{"class":1491}," \"",[46,4499,4500],{"class":1495},"My Amazing Post",[46,4502,1733],{"class":1491},[46,4504,4505,4507,4509,4511,4514],{"class":1452,"line":1124},[46,4506,4335],{"class":4324},[46,4508,1375],{"class":1540},[46,4510,4497],{"class":1491},[46,4512,4513],{"class":1495},"A clear description of your post",[46,4515,1733],{"class":1491},[46,4517,4518,4521,4523,4525,4528],{"class":1452,"line":1530},[46,4519,4520],{"class":4324},"cover",[46,4522,1375],{"class":1540},[46,4524,4497],{"class":1491},[46,4526,4527],{"class":1495},"\u002Fimages\u002Fpost-cover.jpg",[46,4529,1733],{"class":1491},[46,4531,4532],{"class":1452,"line":1550},[46,4533,4488],{"class":4487},[35,4535,4537],{"id":4536},"structured-data","Structured Data",[12,4539,4540],{},"Bloggrify adds JSON-LD data for blog posts:",[1443,4542,4544],{"className":1703,"code":4543,"language":1705,"meta":1118,"style":1118},"\u003Cscript type=\"application\u002Fld+json\">\n{\n  \"@type\": \"BlogPosting\",\n  \"headline\": \"Your Post Title\",\n  \"datePublished\": \"2024-01-24\",\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Your Name\"\n  }\n}\n\u003C\u002Fscript>\n",[1173,4545,4546,4567,4571,4576,4581,4586,4591,4596,4602,4607,4612],{"__ignoreMap":1118},[46,4547,4548,4550,4553,4556,4558,4560,4563,4565],{"class":1452,"line":1453},[46,4549,1712],{"class":1540},[46,4551,4552],{"class":4324},"script",[46,4554,4555],{"class":1721}," type",[46,4557,76],{"class":1540},[46,4559,1727],{"class":1491},[46,4561,4562],{"class":1495},"application\u002Fld+json",[46,4564,1727],{"class":1491},[46,4566,4352],{"class":1540},[46,4568,4569],{"class":1452,"line":1119},[46,4570,1826],{"class":1485},[46,4572,4573],{"class":1452,"line":1124},[46,4574,4575],{"class":1485},"  \"@type\": \"BlogPosting\",\n",[46,4577,4578],{"class":1452,"line":1530},[46,4579,4580],{"class":1485},"  \"headline\": \"Your Post Title\",\n",[46,4582,4583],{"class":1452,"line":1550},[46,4584,4585],{"class":1485},"  \"datePublished\": \"2024-01-24\",\n",[46,4587,4588],{"class":1452,"line":1836},[46,4589,4590],{"class":1485},"  \"author\": {\n",[46,4592,4593],{"class":1452,"line":1842},[46,4594,4595],{"class":1485},"    \"@type\": \"Person\",\n",[46,4597,4599],{"class":1452,"line":4598},8,[46,4600,4601],{"class":1485},"    \"name\": \"Your Name\"\n",[46,4603,4605],{"class":1452,"line":4604},9,[46,4606,1839],{"class":1485},[46,4608,4610],{"class":1452,"line":4609},10,[46,4611,1937],{"class":1485},[46,4613,4615,4618,4620],{"class":1452,"line":4614},11,[46,4616,4617],{"class":1540},"\u003C\u002F",[46,4619,4552],{"class":4324},[46,4621,4352],{"class":1540},[35,4623,4625],{"id":4624},"technical-optimizations-your-sites-foundation","Technical Optimizations: Your Site's Foundation",[12,4627,4628],{},"SEO relies on many technical elements that are crucial for search engines but can be tedious to implement. Bloggrify automates all these essential aspects for you.",[12,4630,4631],{},"Your site automatically gets a sitemap.xml - think of it as a roadmap that search engines use to discover and index your content. The robots.txt file is also configured to guide crawlers to your important content and away from technical pages they don't need to see.",[12,4633,4634],{},"To avoid duplicate content issues that can harm your rankings, Bloggrify automatically generates canonical URLs. The URL structure is kept clean and consistent - no more incomprehensible URLs filled with parameters!",[12,4636,4637],{},"An RSS feed is also generated automatically. Not only does it allow readers to follow your blog, but it also helps search engines discover your new content quickly.",[12,4639,4640],{},"Here's an overview of these technical optimizations:",[1162,4642,4643,4646,4649,4652,4655,4658],{},[1165,4644,4645],{},"Automatic sitemap.xml generation",[1165,4647,4648],{},"Robots.txt configuration",[1165,4650,4651],{},"Canonical URLs",[1165,4653,4654],{},"Clean URL structure",[1165,4656,4657],{},"RSS feed generation",[1165,4659,4660],{},"Optimized page titles",[12,4662,4663],{},"You don't need to worry about these technical aspects - you can focus on writing your content while Bloggrify handles your site's SEO foundation.",[30,4665,4667],{"id":4666},"best-practices-built-in","Best Practices Built-In 📝",[35,4669,4671],{"id":4670},"performance-built-on-modern-foundations","Performance: Built on Modern Foundations",[12,4673,4674],{},"Website performance is crucial for SEO, and Bloggrify leverages cutting-edge technologies to deliver exceptional speed. Built on Nuxt and Nuxt Content, it benefits from advanced performance optimizations:",[12,4676,4677,4680,4683],{},[42,4678,4679],{},"Static Site Generation (SSG)",[4681,4682],"br",{},"\nYour entire blog is pre-rendered at build time into static HTML. This means:",[1162,4685,4686,4689,4692,4695],{},[1165,4687,4688],{},"No server-side rendering delays",[1165,4690,4691],{},"Fast page loads straight from a CDN",[1165,4693,4694],{},"No database queries slowing things down",[1165,4696,4697],{},"Strong Lighthouse scores out of the box",[12,4699,4700,4703],{},[42,4701,4702],{},"Nuxt Content's Architecture","\nUnder the hood, Nuxt Content provides several performance benefits:",[1162,4705,4706,4709,4712,4715,4718],{},[1165,4707,4708],{},"Built-in file-system caching",[1165,4710,4711],{},"Automatic code splitting",[1165,4713,4714],{},"Component lazy-loading",[1165,4716,4717],{},"Efficient parsing through Nitro engine",[1165,4719,4720],{},"Built-in search with no external dependencies",[12,4722,4723,4726],{},[42,4724,4725],{},"Image Optimization","\nImages are often the heaviest part of a blog. Bloggrify integrates with Nuxt Image, so when you opt in you get:",[1162,4728,4729,4732,4735,4738],{},[1165,4730,4731],{},"Modern formats such as WebP and AVIF",[1165,4733,4734],{},"Responsive, viewport-aware image sizing",[1165,4736,4737],{},"Lazy loading for offscreen images",[1165,4739,4740],{},"A pipeline that plugs into your image CDN of choice",[12,4742,4743],{},[42,4744,4745],{},"Modern Performance Features:",[1162,4747,4748,4751,4754,4757,4760],{},[1165,4749,4750],{},"Route prefetching for instant navigation",[1165,4752,4753],{},"Automatic chunk splitting",[1165,4755,4756],{},"Tree-shaking of unused code",[1165,4758,4759],{},"Asset optimization",[1165,4761,4762],{},"Efficient resource hints",[12,4764,4765],{},"All of this happens automatically. You write your content, and Bloggrify ensures it's delivered to your readers in the most efficient way possible.",[35,4767,4769],{"id":4768},"internal-linking-the-backbone-of-seo","Internal Linking: The Backbone of SEO",[12,4771,4772],{},"While Bloggrify provides the technical foundation for great SEO, writing well-structured content remains in your hands.\nHowever, Bloggrify includes a powerful link validation system while keeping the writing experience simple:",[1443,4774,4777],{"className":4775,"code":4776,"language":1129,"meta":1118,"style":1118},"language-md shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","[Link to another post](\u002Fblog\u002Fanother-post)\n",[1173,4778,4779],{"__ignoreMap":1118},[46,4780,4781,4785,4789,4792,4794,4798],{"class":1452,"line":1453},[46,4782,4784],{"class":4783},"sz0Ad","[",[46,4786,4788],{"class":4787},"sndso","Link to another post",[46,4790,4791],{"class":4783},"]",[46,4793,344],{"class":1460},[46,4795,4797],{"class":4796},"sSGpH","\u002Fblog\u002Fanother-post",[46,4799,1553],{"class":1460},[12,4801,4802],{},"At build time, Bloggrify automatically verifies all internal links. If a link is broken:",[1162,4804,4805,4808,4811,4814],{},[1165,4806,4807],{},"The build process fails",[1165,4809,4810],{},"You get clear error messages showing the broken links",[1165,4812,4813],{},"The exact location of the issue is highlighted",[1165,4815,4816],{},"No risk of deploying with dead links",[12,4818,4819],{},"This automatic validation ensures your internal linking structure remains solid, but remember that creating a meaningful linking strategy is still up to you:",[1162,4821,4822,4825,4828],{},[1165,4823,4824],{},"Choose relevant connections between posts",[1165,4826,4827],{},"Place links naturally in your content",[1165,4829,4830],{},"Write descriptive anchor text",[35,4832,4834],{"id":4833},"clean-urls-the-first-impression","Clean URLs: The First Impression",[12,4836,4837],{},"Bloggrify automatically creates clean URLs:",[1443,4839,4842],{"className":4840,"code":4841,"language":2553},[2552],"✅ \u002Fblog\u002Fseo-friendly-urls\n❌ \u002Fblog\u002Fpost?id=123\n",[1173,4843,4841],{"__ignoreMap":1118},[30,4845,4847],{"id":4846},"monitoring-your-seo","Monitoring Your SEO",[12,4849,4850],{},"Bloggrify integrates with privacy-focused analytics to track:",[1162,4852,4853,4856,4859],{},[1165,4854,4855],{},"Search traffic",[1165,4857,4858],{},"Popular pages",[1165,4860,4861],{},"Rankings performance",[30,4863,4865],{"id":4864},"seo-checklist-for-each-post","SEO Checklist for Each Post",[12,4867,4868,4869,4871,4872,4874,4875,4877,4878,4880,4881,4883,4884,4886],{},"✅ Write a compelling title (50-60 characters)",[4681,4870],{},"\n✅ Add a clear meta description",[4681,4873],{},"\n✅ Include relevant images with alt text",[4681,4876],{},"\n✅ Use descriptive headings",[4681,4879],{},"\n✅ Add internal links to related content",[4681,4882],{},"\n✅ Include relevant tags",[4681,4885],{},"\n✅ Ensure content is readable and valuable",[30,4888,1110],{"id":1109},[12,4890,4891,4892,4894],{},"Remember: The best SEO strategy is to write valuable content for your readers. ",[4681,4893],{},"\nBloggrify handles the technical complexities so you can focus on what matters - creating great content.",[12,4896,4897,4898,4903],{},"Need more details? Check our ",[22,4899,4902],{"href":4900,"rel":4901},"https:\u002F\u002Fbloggrify.com\u002Freference\u002Fseo",[26],"SEO documentation"," or join our community discussions.",[2001,4905,4906],{},"html pre.shiki code .s1BmC, html code.shiki .s1BmC{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#E1E4E8}html pre.shiki code .sjqto, html code.shiki .sjqto{--shiki-light:#E53935;--shiki-default:#8CAAEE;--shiki-dark:#85E89D}html pre.shiki code .s3uge, html code.shiki .s3uge{--shiki-light:#9C3EDA;--shiki-default:#E5C890;--shiki-dark:#B392F0}html pre.shiki code .srOHQ, html code.shiki .srOHQ{--shiki-light:#39ADB5;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sw2QF, html code.shiki .sw2QF{--shiki-light:#91B859;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}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 .sIaQ3, html code.shiki .sIaQ3{--shiki-light:#E2931D;--shiki-default:#F4B8E4;--shiki-dark:#B392F0}html pre.shiki code .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .sz0Ad, html code.shiki .sz0Ad{--shiki-light:#39ADB5;--shiki-default:#BABBF1;--shiki-dark:#E1E4E8}html pre.shiki code .sndso, html code.shiki .sndso{--shiki-light:#91B859;--shiki-light-text-decoration:inherit;--shiki-default:#BABBF1;--shiki-default-text-decoration:inherit;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline}html pre.shiki code .sdvfp, html code.shiki .sdvfp{--shiki-light:#39ADB5;--shiki-default:#949CBB;--shiki-dark:#E1E4E8}html pre.shiki code .sSGpH, html code.shiki .sSGpH{--shiki-light:#E53935;--shiki-light-text-decoration:underline;--shiki-default:#8CAAEE;--shiki-default-text-decoration:inherit;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline}",{"title":1118,"searchDepth":1119,"depth":1119,"links":4908},[4909,4910,4915,4920,4921,4922],{"id":4286,"depth":1119,"text":4287},{"id":4307,"depth":1119,"text":4308,"children":4911},[4912,4913,4914],{"id":4311,"depth":1124,"text":4312},{"id":4536,"depth":1124,"text":4537},{"id":4624,"depth":1124,"text":4625},{"id":4666,"depth":1119,"text":4667,"children":4916},[4917,4918,4919],{"id":4670,"depth":1124,"text":4671},{"id":4768,"depth":1124,"text":4769},{"id":4833,"depth":1124,"text":4834},{"id":4846,"depth":1119,"text":4847},{"id":4864,"depth":1119,"text":4865},{"id":1109,"depth":1119,"text":1110},"Discover how Bloggrify automatically optimizes your blog for search engines and learn best practices to improve your content visibility",{},"3","\u002Fseo",{"text":4267,"minutes":4928,"time":4929,"words":4930},3.68,220800,736,{"title":4278,"description":4923},{"loc":4926},[1200],"Jrj5Hv13Q19s2Z0RGM4Md5NYQwYZ3eCja8aETEXftdY",{"id":4936,"title":4937,"alternates":6,"author":7,"body":4938,"categories":6,"comments":1126,"cover":6,"date":5557,"description":5558,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":5559,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":86,"path":5560,"readingTime":5561,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":5565,"sitemap":5566,"stem":5567,"table_of_contents":1126,"tags":5568,"__hash__":5569},"page\u002F2024\u002Fmarkdown.md","Writing in Bloggrify: Beyond Basic Markdown",{"type":9,"value":4939,"toc":5538},[4940,4949,4952,4956,4959,4965,5009,5013,5016,5021,5030,5108,5111,5155,5159,5203,5206,5237,5241,5248,5255,5261,5265,5268,5271,5273,5276,5278,5281,5283,5286,5288,5292,5300,5304,5310,5318,5330,5340,5349,5353,5356,5458,5487,5489,5492,5535],[12,4941,4942,4943,4948],{},"Bloggrify is built on ",[22,4944,4947],{"href":4945,"rel":4946},"https:\u002F\u002Fwww.markdownguide.org\u002F",[26],"standard Markdown",". If you're new to Markdown, it's a lightweight markup language with plain text formatting syntax. It's easy to read and write, and it's widely used in documentation, README files, and blogs.",[12,4950,4951],{},"While Bloggrify is built on standard Markdown, it offers much more powerful writing capabilities. Let's explore how you can enhance your content using advanced features.",[30,4953,4955],{"id":4954},"mdc-markdown-components","MDC: Markdown Components",[12,4957,4958],{},"MDC (Markdown Components) allows you to seamlessly integrate Vue components within your Markdown:",[2953,4960,4962],{"type":4961},"tip",[12,4963,4964],{},"This is an info alert box",[4966,4967,4968,4983,4995],"code-group",{},[1443,4969,4971],{"className":2728,"code":4970,"filename":2738,"language":2730,"meta":1118,"style":1118},"npm run dev\n",[1173,4972,4973],{"__ignoreMap":1118},[46,4974,4975,4977,4980],{"class":1452,"line":1453},[46,4976,2738],{"class":2737},[46,4978,4979],{"class":1495}," run",[46,4981,4982],{"class":1495}," dev\n",[1443,4984,4987],{"className":2728,"code":4985,"filename":4986,"language":2730,"meta":1118,"style":1118},"yarn dev\n","yarn",[1173,4988,4989],{"__ignoreMap":1118},[46,4990,4991,4993],{"class":1452,"line":1453},[46,4992,4986],{"class":2737},[46,4994,4982],{"class":1495},[1443,4996,4999],{"className":2728,"code":4997,"filename":4998,"language":2730,"meta":1118,"style":1118},"pnpm run dev\n","pnpm",[1173,5000,5001],{"__ignoreMap":1118},[46,5002,5003,5005,5007],{"class":1452,"line":1453},[46,5004,4998],{"class":2737},[46,5006,4979],{"class":1495},[46,5008,4982],{"class":1495},[30,5010,5012],{"id":5011},"built-in-components","Built-in Components",[12,5014,5015],{},"Bloggrify comes with several pre-built components to enhance your content:",[2953,5017,5018],{"type":2955},[12,5019,5020],{},"Remember to configure your environment variables",[12,5022,5023,5024,5029],{},"Nuxt-content provide code highlighting with ",[22,5025,5028],{"href":5026,"rel":5027},"https:\u002F\u002Fgithub.com\u002Fshikijs\u002Fshiki",[26],"shiki",". You can specify the language of the code block to enable syntax highlighting:\nThis is a paragraph with a code block:",[1443,5031,5035],{"className":5032,"code":5033,"language":5034,"meta":1118,"style":1118},"language-js shiki shiki-themes material-theme-lighter catppuccin-frappe github-dark","var foo = function (bar) {\n  return bar++;\n};\n\nconsole.log(foo(5));\n","js",[1173,5036,5037,5060,5074,5079,5083],{"__ignoreMap":1118},[46,5038,5039,5042,5046,5048,5051,5053,5056,5058],{"class":1452,"line":1453},[46,5040,5041],{"class":1456},"var",[46,5043,5045],{"class":5044},"sTObw"," foo",[46,5047,1478],{"class":1477},[46,5049,5050],{"class":1456}," function",[46,5052,1799],{"class":1460},[46,5054,5055],{"class":1802},"bar",[46,5057,378],{"class":1460},[46,5059,1810],{"class":1460},[46,5061,5062,5065,5068,5071],{"class":1452,"line":1119},[46,5063,5064],{"class":1815},"  return",[46,5066,5067],{"class":1485}," bar",[46,5069,5070],{"class":1477},"++",[46,5072,5073],{"class":1460},";\n",[46,5075,5076],{"class":1452,"line":1124},[46,5077,5078],{"class":1460},"};\n",[46,5080,5081],{"class":1452,"line":1530},[46,5082,1786],{"emptyLinePlaceholder":1131},[46,5084,5085,5088,5090,5093,5095,5098,5100,5103,5106],{"class":1452,"line":1550},[46,5086,5087],{"class":1485},"console",[46,5089,28],{"class":1540},[46,5091,5092],{"class":1481},"log",[46,5094,344],{"class":1485},[46,5096,5097],{"class":1481},"foo",[46,5099,344],{"class":1485},[46,5101,2777],{"class":5102},"smt0P",[46,5104,5105],{"class":1485},"))",[46,5107,5073],{"class":1460},[12,5109,5110],{},"It's also possible to display a code block with a specific file name:",[1443,5112,5115],{"className":5032,"code":5113,"filename":5114,"language":5034,"meta":1118,"style":1118},"  export default () => {\n    console.log('Code block')\n  }\n","file.js",[1173,5116,5117,5131,5151],{"__ignoreMap":1118},[46,5118,5119,5122,5124,5127,5129],{"class":1452,"line":1453},[46,5120,5121],{"class":1815},"  export",[46,5123,2117],{"class":1815},[46,5125,5126],{"class":1460}," ()",[46,5128,1511],{"class":1456},[46,5130,1810],{"class":1460},[46,5132,5133,5136,5138,5140,5142,5144,5147,5149],{"class":1452,"line":1119},[46,5134,5135],{"class":1485},"    console",[46,5137,28],{"class":1540},[46,5139,5092],{"class":1481},[46,5141,344],{"class":1536},[46,5143,1499],{"class":1491},[46,5145,5146],{"class":1495},"Code block",[46,5148,1499],{"class":1491},[46,5150,1553],{"class":1536},[46,5152,5153],{"class":1452,"line":1124},[46,5154,1839],{"class":1460},[30,5156,5158],{"id":5157},"tables","Tables",[5160,5161,5162,5175],"table",{},[5163,5164,5165],"thead",{},[5166,5167,5168,5172],"tr",{},[5169,5170,5171],"th",{},"Option",[5169,5173,5174],{},"Description",[5176,5177,5178,5187,5195],"tbody",{},[5166,5179,5180,5184],{},[5181,5182,5183],"td",{},"data",[5181,5185,5186],{},"path to data files to supply the data that will be passed into templates.",[5166,5188,5189,5192],{},[5181,5190,5191],{},"engine",[5181,5193,5194],{},"engine to be used for processing templates. Handlebars is the default.",[5166,5196,5197,5200],{},[5181,5198,5199],{},"ext",[5181,5201,5202],{},"extension to be used for dest files.",[12,5204,5205],{},"Right aligned columns",[5160,5207,5208,5217],{},[5163,5209,5210],{},[5166,5211,5212,5215],{},[5169,5213,5171],{"align":5214},"right",[5169,5216,5174],{"align":5214},[5176,5218,5219,5225,5231],{},[5166,5220,5221,5223],{},[5181,5222,5183],{"align":5214},[5181,5224,5186],{"align":5214},[5166,5226,5227,5229],{},[5181,5228,5191],{"align":5214},[5181,5230,5194],{"align":5214},[5166,5232,5233,5235],{},[5181,5234,5199],{"align":5214},[5181,5236,5202],{"align":5214},[30,5238,5240],{"id":5239},"links","Links",[12,5242,5243],{},[22,5244,5247],{"href":5245,"rel":5246},"https:\u002F\u002Fwww.google.com",[26],"link text",[12,5249,5250],{},[22,5251,5254],{"href":5245,"rel":5252,"title":5253},[26],"title text!","link with title",[12,5256,5257,5258],{},"Autoconverted link ",[22,5259,5245],{"href":5245,"rel":5260},[26],[30,5262,5264],{"id":5263},"shortcodes","Shortcodes",[12,5266,5267],{},"You can embed external content using shortcodes:",[35,5269,5270],{"id":2535},"YouTube",[2535,5272],{"video-id":2537},[35,5274,5275],{"id":2564},"X",[2564,5277],{"tweet-id":2566},[35,5279,5280],{"id":2616},"Vimeo",[2616,5282],{"video-id":2618},[35,5284,5285],{"id":2590},"Instagram",[2590,5287],{"post-id":2592},[30,5289,5291],{"id":5290},"images","Images",[12,5293,5294,5295,28],{},"This is a paragraph with an image ",[5296,5297],"img",{"alt":5298,"src":5299},"the image is automatically centered on the page and the alt text is displayed below as a caption","\u002Fandroid-chrome-192x192.png",[30,5301,5303],{"id":5302},"emojies","Emojies",[5305,5306,5307],"blockquote",{},[12,5308,5309],{},"Classic markup: 😉 😢 😆 😋",[35,5311,5313],{"id":5312},"footnotes",[22,5314,5317],{"href":5315,"rel":5316},"https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it-footnote",[26],"Footnotes",[12,5319,5320,5321,28],{},"Footnote 1 link",[5322,5323,5324],"sup",{},[22,5325,83],{"href":5326,"ariaDescribedBy":5327,"dataFootnoteRef":1118,"id":5329},"#user-content-fn-first",[5328],"footnote-label","user-content-fnref-first",[12,5331,5332,5333,28],{},"Footnote 2 link",[5322,5334,5335],{},[22,5336,86],{"href":5337,"ariaDescribedBy":5338,"dataFootnoteRef":1118,"id":5339},"#user-content-fn-second",[5328],"user-content-fnref-second",[12,5341,5342,5343,28],{},"Duplicated footnote reference",[5322,5344,5345],{},[22,5346,86],{"href":5337,"ariaDescribedBy":5347,"dataFootnoteRef":1118,"id":5348},[5328],"user-content-fnref-second-2",[30,5350,5352],{"id":5351},"frontmatter","Frontmatter",[12,5354,5355],{},"It also supports frontmatter to add metadata to your markdown files.",[1443,5357,5359],{"className":4478,"code":5358,"language":4480,"meta":1118,"style":1118},"---\npageid: \"2\"\ntitle: \"Use markdown power\"\ndescription: \"Use markdown at its full potential.\"\ndate: \"2024-02-09\"\ntags:\n  - markdown\n  - documentation\ncover: \"doc\u002Fmarkdown.png\"\n---\n",[1173,5360,5361,5365,5378,5391,5404,5418,5426,5434,5441,5454],{"__ignoreMap":1118},[46,5362,5363],{"class":1452,"line":1453},[46,5364,4488],{"class":4487},[46,5366,5367,5370,5372,5374,5376],{"class":1452,"line":1119},[46,5368,5369],{"class":4324},"pageid",[46,5371,1375],{"class":1540},[46,5373,4497],{"class":1491},[46,5375,86],{"class":1495},[46,5377,1733],{"class":1491},[46,5379,5380,5382,5384,5386,5389],{"class":1452,"line":1124},[46,5381,2992],{"class":4324},[46,5383,1375],{"class":1540},[46,5385,4497],{"class":1491},[46,5387,5388],{"class":1495},"Use markdown power",[46,5390,1733],{"class":1491},[46,5392,5393,5395,5397,5399,5402],{"class":1452,"line":1530},[46,5394,4335],{"class":4324},[46,5396,1375],{"class":1540},[46,5398,4497],{"class":1491},[46,5400,5401],{"class":1495},"Use markdown at its full potential.",[46,5403,1733],{"class":1491},[46,5405,5406,5409,5411,5413,5416],{"class":1452,"line":1550},[46,5407,5408],{"class":4324},"date",[46,5410,1375],{"class":1540},[46,5412,4497],{"class":1491},[46,5414,5415],{"class":1495},"2024-02-09",[46,5417,1733],{"class":1491},[46,5419,5420,5423],{"class":1452,"line":1836},[46,5421,5422],{"class":4324},"tags",[46,5424,5425],{"class":1540},":\n",[46,5427,5428,5431],{"class":1452,"line":1842},[46,5429,5430],{"class":1460},"  -",[46,5432,5433],{"class":1495}," markdown\n",[46,5435,5436,5438],{"class":1452,"line":4598},[46,5437,5430],{"class":1460},[46,5439,5440],{"class":1495}," documentation\n",[46,5442,5443,5445,5447,5449,5452],{"class":1452,"line":4604},[46,5444,4520],{"class":4324},[46,5446,1375],{"class":1540},[46,5448,4497],{"class":1491},[46,5450,5451],{"class":1495},"doc\u002Fmarkdown.png",[46,5453,1733],{"class":1491},[46,5455,5456],{"class":1452,"line":4609},[46,5457,4488],{"class":4487},[1162,5459,5460,5465,5472,5477,5482],{},[1165,5461,5462,5464],{},[1173,5463,5369],{}," is mandatory if you want to use the comment system. It is used to identify the article, so it must be unique across your blog.",[1165,5466,5467,1339,5469,5471],{},[1173,5468,2992],{},[1173,5470,4335],{}," are used for SEO and social sharing. It's also used on the index page. Don't forget to fill them.",[1165,5473,5474,5476],{},[1173,5475,5408],{}," is used to sort the articles. Date in the future will not be displayed.",[1165,5478,5479,5481],{},[1173,5480,5422],{}," are only used to display the tags on the article page. It's optional.",[1165,5483,5484,5486],{},[1173,5485,4520],{}," is used to display an image on the index page. It's also used when you share your article on social media. It's optional (it's however better to have one).",[30,5488,1110],{"id":1109},[12,5490,5491],{},"With these features, you can create rich, interactive blog posts while keeping the simplicity of Markdown. Remember, all these features work out of the box - no additional configuration needed!",[5493,5494,5496,5500],"section",{"className":5495,"dataFootnotes":1118},[5312],[30,5497,5317],{"className":5498,"id":5328},[5499],"sr-only",[2054,5501,5502,5519],{},[1165,5503,5505,5506,5509,5511,5512],{"id":5504},"user-content-fn-first","Footnote ",[42,5507,5508],{},"can have markup",[4681,5510],{},"and multiple paragraphs. ",[22,5513,5518],{"href":5514,"ariaLabel":5515,"className":5516,"dataFootnoteBackref":1118},"#user-content-fnref-first","Back to reference 1",[5517],"data-footnote-backref","↩",[1165,5520,5522,5523,2194,5528],{"id":5521},"user-content-fn-second","Footnote text. ",[22,5524,5518],{"href":5525,"ariaLabel":5526,"className":5527,"dataFootnoteBackref":1118},"#user-content-fnref-second","Back to reference 2",[5517],[22,5529,5518,5533],{"href":5530,"ariaLabel":5531,"className":5532,"dataFootnoteBackref":1118},"#user-content-fnref-second-2","Back to reference 2-2",[5517],[5322,5534,86],{},[2001,5536,5537],{},"html pre.shiki code .skPWg, html code.shiki .skPWg{--shiki-light:#9C3EDA;--shiki-default:#CA9EE6;--shiki-dark:#F97583}html pre.shiki code .sTObw, html code.shiki .sTObw{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}html pre.shiki code .srEZA, html code.shiki .srEZA{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#F97583}html pre.shiki code .sdvfp, html code.shiki .sdvfp{--shiki-light:#39ADB5;--shiki-default:#949CBB;--shiki-dark:#E1E4E8}html pre.shiki code .sd0zt, html code.shiki .sd0zt{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sHqub, html code.shiki .sHqub{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#CA9EE6;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .s8bja, html code.shiki .s8bja{--shiki-light:#90A4AE;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .s1BmC, html code.shiki .s1BmC{--shiki-light:#39ADB5;--shiki-default:#81C8BE;--shiki-dark:#E1E4E8}html pre.shiki code .srxfx, html code.shiki .srxfx{--shiki-light:#6182B8;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}html pre.shiki code .smt0P, html code.shiki .smt0P{--shiki-light:#F76D47;--shiki-default:#EF9F76;--shiki-dark:#79B8FF}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 .sHJOX, html code.shiki .sHJOX{--shiki-light:#E53935;--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8}html pre.shiki code .srOHQ, html code.shiki .srOHQ{--shiki-light:#39ADB5;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sw2QF, html code.shiki .sw2QF{--shiki-light:#91B859;--shiki-default:#A6D189;--shiki-dark:#9ECBFF}html pre.shiki code .sIaQ3, html code.shiki .sIaQ3{--shiki-light:#E2931D;--shiki-default:#F4B8E4;--shiki-dark:#B392F0}html pre.shiki code .sjqto, html code.shiki .sjqto{--shiki-light:#E53935;--shiki-default:#8CAAEE;--shiki-dark:#85E89D}html pre.shiki code .sAGAT, html code.shiki .sAGAT{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit}",{"title":1118,"searchDepth":1119,"depth":1119,"links":5539},[5540,5541,5542,5543,5544,5550,5551,5554,5555,5556],{"id":4954,"depth":1119,"text":4955},{"id":5011,"depth":1119,"text":5012},{"id":5157,"depth":1119,"text":5158},{"id":5239,"depth":1119,"text":5240},{"id":5263,"depth":1119,"text":5264,"children":5545},[5546,5547,5548,5549],{"id":2535,"depth":1124,"text":5270},{"id":2564,"depth":1124,"text":5275},{"id":2616,"depth":1124,"text":5280},{"id":2590,"depth":1124,"text":5285},{"id":5290,"depth":1119,"text":5291},{"id":5302,"depth":1119,"text":5303,"children":5552},[5553],{"id":5312,"depth":1124,"text":5317},{"id":5351,"depth":1119,"text":5352},{"id":1109,"depth":1119,"text":1110},{"id":5328,"depth":1119,"text":5317},"2024-02-10","Discover how Bloggrify enhances your writing experience with MDC syntax, Vue components in Markdown, and advanced formatting features",{},"\u002F2024\u002Fmarkdown",{"text":1404,"minutes":5562,"time":5563,"words":5564},2.065,123900,413,{"title":4937,"description":5558},{"loc":5560},"2024\u002Fmarkdown",[1143,2896],"FQd-HS-Zv1C89A8ayzVi2ZGmTGZXNGlcnPIxcqf997E",{"id":5571,"title":5572,"alternates":6,"author":7,"body":5573,"categories":6,"comments":1126,"cover":5746,"date":5747,"description":5748,"draft":1126,"extension":1129,"hidden":1126,"language":6,"layout":6,"links":6,"listed":1126,"meta":5749,"navigation":1131,"nocomments":1126,"notoc":1126,"pageid":83,"path":5750,"readingTime":5751,"redirect_to_domain":6,"redirect_to_full_url":6,"robots":6,"schemaOrg":6,"seo":5756,"sitemap":5757,"stem":5758,"table_of_contents":1126,"tags":5759,"__hash__":5760},"page\u002F2024\u002Flaunching.md","Announcing Bloggrify 1.0: A New Static Blog Generator Built on Nuxt",{"type":9,"value":5574,"toc":5735},[5575,5578,5582,5585,5611,5615,5618,5622,5626,5629,5649,5652,5656,5659,5663,5666,5680,5683,5687,5690,5701,5705,5708,5714,5729,5732],[12,5576,5577],{},"After months of development, we're excited to announce the first stable release of Bloggrify, a static blog generator that prioritizes simplicity without compromising on features.",[30,5579,5581],{"id":5580},"what-is-bloggrify","What is Bloggrify?",[12,5583,5584],{},"Bloggrify is a static blog generator built on top of Nuxt Content that provides everything you need for a modern blog, right out of the box:",[1162,5586,5587,5590,5593,5596,5599,5602,5605,5608],{},[1165,5588,5589],{},"📝 Write in Markdown with full support for MDC syntax",[1165,5591,5592],{},"🔍 Built-in full-text search",[1165,5594,5595],{},"💬 Comments system integration",[1165,5597,5598],{},"📨 Newsletter integration",[1165,5600,5601],{},"📊 Analytics integration",[1165,5603,5604],{},"🎨 Themeable design",[1165,5606,5607],{},"🚀 SEO optimized",[1165,5609,5610],{},"📡 RSS feed built-in",[30,5612,5614],{"id":5613},"why-another-blog-generator","Why Another Blog Generator?",[12,5616,5617],{},"While there are many excellent static site generators available, we kept re-implementing the same features for different blogs. Bloggrify emerged from this experience: it's not just a framework, but a complete solution that brings common blog features together in a cohesive way.\nThe goal is simple: you should be able to focus on writing, not configuring.",[30,5619,5621],{"id":5620},"core-features-in-detail","Core Features in Detail",[35,5623,5625],{"id":5624},"comments-integration","Comments Integration",[12,5627,5628],{},"Out of the box, Bloggrify includes integration with Hyvor Talk for managing comments. Being a static blog generator, we carefully chose Hyvor Talk as our default comments provider for its:",[1162,5630,5631,5634,5637,5640,5643,5646],{},[1165,5632,5633],{},"Quick setup (just add your site ID)",[1165,5635,5636],{},"Clean, modern interface",[1165,5638,5639],{},"Privacy-focused approach",[1165,5641,5642],{},"Spam protection",[1165,5644,5645],{},"Multiple authentication options",[1165,5647,5648],{},"Full theming support",[12,5650,5651],{},"No complex configuration needed - Bloggrify handles the integration automatically while keeping your blog fully static. Planning to add support for other comment providers in future releases.",[35,5653,5655],{"id":5654},"search-that-works-offline","Search that Works Offline",[12,5657,5658],{},"The search is built using local indexing, providing instant results without external services. It works even offline!",[35,5660,5662],{"id":5661},"newsletter-feed-integration","Newsletter & Feed Integration 📡 📨",[12,5664,5665],{},"Bloggrify comes with pre-configured integrations for keeping your readers updated:",[1162,5667,5668,5674],{},[1165,5669,5670,5673],{},[42,5671,5672],{},"RSS Feed",": Built-in RSS feed, ready to be consumed by readers and automation tools",[1165,5675,5676,5679],{},[42,5677,5678],{},"MailerLite",": Turn your RSS feed into a newsletter with automatic RSS-to-email campaigns",[12,5681,5682],{},"Bloggrify recommends the RSS-to-email approach: convert your RSS feed into newsletters and write once, publish everywhere.",[35,5684,5686],{"id":5685},"analytics-integration","Analytics Integration 📊",[12,5688,5689],{},"Bloggrify supports privacy-focused analytics out of the box with multiple provider options:",[1162,5691,5692,5695,5698],{},[1165,5693,5694],{},"Hakanai: Simple blog-focused analytics with reader engagement metrics",[1165,5696,5697],{},"Pirsch: GDPR-compliant website statistics without compromising user privacy",[1165,5699,5700],{},"Fathom: Ethical alternative to Google Analytics with real-time data",[35,5702,5704],{"id":5703},"theming-system","Theming System",[12,5706,5707],{},"Want to customize the look? Bloggrify comes with a powerful theming system. Use one of the existing themes or create your own using Vue components.",[12,5709,5710,5713],{},[42,5711,5712],{},"Try It Out","\nReady to start your blog? Check out:",[1162,5715,5716,5723],{},[1165,5717,5718],{},[22,5719,5722],{"href":5720,"rel":5721},"https:\u002F\u002Fbloggrify.com\u002F",[26],"Documentation",[1165,5724,5725],{},[22,5726,5728],{"href":1372,"rel":5727},[26],"GitHub Repository",[12,5730,5731],{},"Feel free to open issues, contribute, or give a star if you like the project.",[12,5733,5734],{},"Happy blogging!",{"title":1118,"searchDepth":1119,"depth":1119,"links":5736},[5737,5738,5739],{"id":5580,"depth":1119,"text":5581},{"id":5613,"depth":1119,"text":5614},{"id":5620,"depth":1119,"text":5621,"children":5740},[5741,5742,5743,5744,5745],{"id":5624,"depth":1124,"text":5625},{"id":5654,"depth":1124,"text":5655},{"id":5661,"depth":1124,"text":5662},{"id":5685,"depth":1124,"text":5686},{"id":5703,"depth":1124,"text":5704},"\u002Fblog\u002Fbloggrify.png","2024-01-18","Bloggrify is now available! A fast, secure and simple static blog generator that brings all the features you need out of the box, powered by Nuxt-Content and Vue.js",{},"\u002F2024\u002Flaunching",{"text":5752,"minutes":5753,"time":5754,"words":5755},"2 min read",1.83,109800,366,{"title":5572,"description":5748},{"loc":5750},"2024\u002Flaunching",[1412],"lO_W7LMW0SsEb-avZwrn58rH_vI9hAfHTpiu8fC5r5M",[5762,5769,5777,5784,5788,5792],{"title":3047,"path":5763,"stem":3047,"children":5764,"page":1126},"\u002F2024",[5765,5766,5767,5768],{"title":4069,"path":4265,"stem":4273},{"title":5,"path":1133,"stem":1141},{"title":5572,"path":5750,"stem":5758},{"title":4937,"path":5560,"stem":5567},{"title":5770,"path":5771,"stem":5770,"children":5772,"page":1126},"2025","\u002F2025",[5773,5774,5775,5776],{"title":2946,"path":3070,"stem":3077},{"title":2790,"path":2934,"stem":2941},{"title":2506,"path":2778,"stem":2785},{"title":2411,"path":2494,"stem":2501},{"title":5778,"path":5779,"stem":5778,"children":5780,"page":1126},"2026","\u002F2026",[5781,5782,5783],{"title":2030,"path":1211,"stem":2405},{"title":1416,"path":1239,"stem":2023},{"title":1148,"path":1402,"stem":1410},{"title":5785,"path":5786,"stem":5787},"About","\u002Fabout","about",{"title":5789,"path":5790,"stem":5791},"Bloggrify","\u002F","index",{"title":4278,"path":4926,"stem":1200},1784539636525]