[{"data":1,"prerenderedAt":1663},["Reactive",2],{"navigation":3,"aAII9Cz3yR":204,"tags-open source":397},[4,192,200],{"title":5,"_path":6,"children":7,"icon":191},"Blog","/posts",[8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188],{"title":9,"_path":10},"Testing your API with REST Client","/posts/testing-your-api-with-rest-client",{"title":12,"_path":13},"HTML templating in Xamarin","/posts/html-templating-in-xamarin",{"title":15,"_path":16},"Goodbye Azure Portal, Welcome Azure CLI","/posts/welcome-azure-cli",{"title":18,"_path":19},"Coming across Gitpod","/posts/gitpod",{"title":21,"_path":22},"Handle token retrieval while querying an API","/posts/delegating-handler",{"title":24,"_path":25},"Clean up your local git branches.","/posts/cleaning-git-branches",{"title":27,"_path":28},"Automate configuration of Teams Tab SSO with PowerShell.","/posts/teams-sso-powershell",{"title":30,"_path":31},"How to do a technology watch? - Part 1","/posts/technology-watch-part1",{"title":33,"_path":34},"How to do a technology watch? - Part 2","/posts/technology-watch-part2",{"title":36,"_path":37},"You almost no longer need Key Vault references for Azure Functions.","/posts/azure-functions-custom-configuration",{"title":39,"_path":40},"How to do a technology watch? - Part 3","/posts/technology-watch-part3",{"title":42,"_path":43},"Forget DevOps, the future is already here!","/posts/devops-future",{"title":45,"_path":46},"Week 9, 2021 - Tips I learned this week","/posts/w09-2021-tips-learned-this-week",{"title":48,"_path":49},"Week 12, 2021 - Tips I learned this week","/posts/w12-2021-tips-learned-this-week",{"title":51,"_path":52},"Week 14, 2021 - Tips I learned this week","/posts/w14-2021-tips-learned-this-week",{"title":54,"_path":55},"Once upon a time in .NET","/posts/once-upon-a-time-in-dotnet",{"title":57,"_path":58},"Install your applications with winget","/posts/winget-import",{"title":60,"_path":61},"Customize your applications when installing them with winget","/posts/winget-override",{"title":63,"_path":64},"Week 22, 2021 - Tips I learned this week","/posts/w22-2021-tips-learned-this-week",{"title":66,"_path":67},"How to connect to an Azure SQL Database from C# using Azure AD","/posts/sqlclient-active-directory-authent",{"title":69,"_path":70},"Producing packages for Windows Package Manager","/posts/wingetcreate",{"title":72,"_path":73},"4 tips about GitHub Actions environment variables and contexts","/posts/github-actions-var-and-context",{"title":75,"_path":76},"AzureWebJobsStorage, the secret you don't need in your Function App.","/posts/azure-functions-without-azurewebjobsstorage",{"title":78,"_path":79},"ASP.NET Core - Lost in configuration","/posts/lost-in-configuration",{"title":81,"_path":82},"Week 39, 2021 - Tips I learned this week","/posts/w39-2021-tips-learned-this-week",{"title":84,"_path":85},"Week 41, 2021 - Tips I learned this week","/posts/w41-2021-tips-learned-this-week",{"title":87,"_path":88},"Migrating and open-sourcing my blog","/posts/migrating-blog",{"title":90,"_path":91},"Week 45, 2021 - Tips I learned this week","/posts/w45-2021-tips-learned-this-week",{"title":93,"_path":94},"Organize your GitHub stars with Astral","/posts/astral",{"title":96,"_path":97},"Pulumi with an Azure Blob Storage backend","/posts/pulumi-azure-backend",{"title":99,"_path":100},"IaC Hot Reload with Pulumi Watch","/posts/pulumi-watch",{"title":102,"_path":103},"Week 2, 2022 - Tips I learned this week","/posts/w02-2022-tips-learned-this-week",{"title":105,"_path":106},"Week 3, 2022 - Tips I learned this week","/posts/w03-2022-tips-learned-this-week",{"title":108,"_path":109},"Week 5, 2022 - Tips I learned this week","/posts/w05-2022-tips-learned-this-week",{"title":111,"_path":112},"How to provision an Azure SQL Database with Active Directory authentication","/posts/sqldatabase-active-directory-authent",{"title":114,"_path":115},"Why will I choose Pulumi over Terraform for my next project?","/posts/pulumi-vs-terraform",{"title":117,"_path":118},"Week 19, 2022 - Tips I learned this week","/posts/w19-2022-tips-learned-this-week",{"title":120,"_path":121},"Week 20, 2022 - Tips I learned this week","/posts/w20-2022-tips-learned-this-week",{"title":123,"_path":124},"Keeping secrets secure when using API Clients","/posts/http-clients-secrets",{"title":126,"_path":127},"What made me want to be a developer?","/posts/be-a-developer",{"title":129,"_path":130},"What can we do when stuck with a programming problem?","/posts/get-unstuck",{"title":132,"_path":133},"How did I automate the setup of my developer Windows laptop?","/posts/automate-developer-machine",{"title":135,"_path":136},"Discussion about API clients","/posts/http-clients",{"title":138,"_path":139},"Week 46, 2022 - Tips I learned this week","/posts/w46-2022-tips-learned-this-week",{"title":141,"_path":142},"When Pulumi met Nuke: a .NET love story","/posts/when-pulumi-met-nuke",{"title":144,"_path":145},"A year of learning and sharing - Dev Retro 2022","/posts/2022-retro",{"title":147,"_path":148},"Perform Dynamic Execution of an npm Package","/posts/pnpm-dlx",{"title":150,"_path":151},"Manage multiple Node.js versions","/posts/pnpm-env",{"title":153,"_path":154},"Introducing the Vue.js CI/CD series","/posts/vuecicd-introduction",{"title":156,"_path":157},"Execute commands using your project dependencies","/posts/pnpm-exec",{"title":159,"_path":160},"Vue.js CI/CD: Continuous Integration","/posts/vuecicd-ci",{"title":162,"_path":163},"Who is using pnpm?","/posts/pnpm-who-is-using",{"title":165,"_path":166},"Create an Azure-Ready GitHub Repository using Pulumi","/posts/azure-ready-github-repository",{"title":168,"_path":169},"Deploying to Azure from Azure DevOps without secrets","/posts/ado-workload-identity-federation",{"title":171,"_path":172},"Effortlessly Configure GitHub Repositories for Azure Deployment via OIDC","/posts/scripting-azure-ready-github-repository",{"title":174,"_path":175},"Playing with the .NET 8 Web API template","/posts/playing-with-dotnet8",{"title":177,"_path":178},"Another year of sharing and learning - Dev Retro 2023","/posts/2023-retro",{"title":180,"_path":181},"Week 4, 2024 - Tips I learned this week","/posts/w04-2024-tips-learned-this-week",{"title":183,"_path":184},"Using dependency injection with Azure .NET SDK","/posts/azure-sdk-di",{"title":186,"_path":187},"Having Fun With IT Event Calendars","/posts/it-event-calendars",{"title":189,"_path":190},"Call your Azure AD B2C protected API with authenticated HTTP requests from your JetBrains IDE","/posts/http-clients-oauth2","i-heroicons-newspaper",{"title":193,"_path":194,"children":195,"icon":199},"Goodies","/goodies",[196],{"title":197,"_path":198},"My Git Cheat Sheet","/goodies/gitcheatsheet","i-heroicons-gift-solid",{"title":201,"_path":202,"icon":203},"About","/about","i-heroicons-user-circle-solid",[205,207,209,211,214,217,220,223,226,229,231,234,237,240,242,244,247,250,253,255,258,261,264,267,270,273,276,279,282,285,287,289,292,294,297,300,303,305,308,310,313,316,319,322,325,327,329,332,335,338,341,344,347,350,353,356,359,361,363,366,369,372,375,377,380,383,385,388,391,394],[206,206],"tooling",[208,208],"vscode",[210,210],"rest",[212,213],"http","HTTP",[215,216],"razor","Razor",[218,219],"xamarin","Xamarin",[221,222],"templating","Templating",[224,225],"azure-cli","Azure CLI",[227,228],"azure","Azure",[230,230],"shell",[232,233],"github","GitHub",[235,236],"asp-net-core","ASP.NET Core",[238,239],"net",".NET",[241,241],"git",[243,243],"nushell",[245,246],"microsoft-teams","Microsoft Teams",[248,249],"powershell","PowerShell",[251,252],"azure-active-directory","Azure Active Directory",[254,254],"learning",[256,257],"azure-functions","Azure Functions",[259,260],"azure-key-vault","Azure Key Vault",[262,263],"configuration","Configuration",[265,266],"devops","DevOps",[268,269],"it","IT",[271,272],"tips-learned-this-week","tips learned this week",[274,275],"windows-terminal","Windows Terminal",[277,278],"azure-pipelines","Azure Pipelines",[280,281],"application-insights","Application Insights",[283,284],"azure-iot","Azure IoT",[286,286],"records",[288,288],"refit",[290,291],"development-box-setup","development box setup",[293,293],"winget",[295,296],"package-manager","package manager",[298,299],"azure-sql-database","Azure SQL Database",[301,302],"azure-sdk","Azure SDK",[304,304],"wingetcreate",[306,307],"github-actions","GitHub Actions",[309,309],"jq",[311,312],"pulumi","Pulumi",[314,315],"iac","IaC",[317,318],"azure-storage","Azure Storage",[320,321],"azure-signalr","Azure SignalR",[323,324],"visio","Visio",[326,326],"csharp",[328,328],"jest",[330,331],"statiq","Statiq",[333,334],"open-source","open source",[336,337],"visual-studio","Visual Studio",[339,340],"vue-js","Vue.js",[342,343],"azure-devops","Azure DevOps",[345,346],"vite","Vite",[348,349],"code-analysis","Code analysis",[351,352],"diagram","Diagram",[354,355],"terraform","Terraform",[357,358],"typescript","TypeScript",[360,360],"thoughts",[362,362],"pnpm",[364,365],"nuke","Nuke",[367,368],"pipelines","Pipelines",[370,371],"cicd","CI/CD",[373,374],"openid-connect","OpenID Connect",[376,376],"security",[378,379],"github-cli","GitHub CLI",[381,382],"microsoft-entra-id","Microsoft Entra ID",[384,384],"advent",[386,387],"finops","FinOps",[389,390],"anglesharp","AngleSharp",[392,393],"oauth2","OAuth2",[395,396],"azure-ad-b2c","Azure AD B2C",[398],{"_path":88,"_dir":399,"_draft":400,"_partial":400,"_locale":401,"title":87,"description":402,"lead":403,"date":404,"badge":405,"image":407,"tags":409,"body":410,"_type":1658,"_id":1659,"_source":1660,"_file":1661,"_extension":1662},"posts",false,"","Today I talk to you about the recent changes I made to my blog when I migrated it to Statiq and open-sourced it.","What changed on my blog - Statiq, GitHub, giscus, and much more.","2021-11-07T00:00:00.000Z",{"label":406},"Tooling",{"src":408},"/images/migration_1.jpg",[331,239,233,307,334],{"type":411,"children":412,"toc":1641},"root",[413,431,438,443,507,512,518,525,530,552,565,645,651,665,670,676,690,703,708,720,734,740,761,774,780,785,791,796,805,810,818,832,841,853,884,890,895,1314,1319,1325,1330,1339,1345,1357,1386,1399,1449,1458,1470,1503,1509,1523,1532,1538,1543,1613,1618,1635],{"type":414,"tag":415,"props":416,"children":417},"element","p",{},[418,421,429],{"type":419,"value":420},"text","Today I talk to you about the recent changes I made to my blog when I migrated it to ",{"type":414,"tag":422,"props":423,"children":427},"a",{"href":424,"rel":425},"https://statiq.dev/",[426],"nofollow",[428],{"type":419,"value":331},{"type":419,"value":430}," and open-sourced it.",{"type":414,"tag":432,"props":433,"children":435},"h2",{"id":434},"some-context",[436],{"type":419,"value":437},"Some context",{"type":414,"tag":415,"props":439,"children":440},{},[441],{"type":419,"value":442},"I initially created my blog in March 2019 using:",{"type":414,"tag":444,"props":445,"children":446},"ul",{},[447,460,472,483,495],{"type":414,"tag":448,"props":449,"children":450},"li",{},[451,458],{"type":414,"tag":422,"props":452,"children":455},{"href":453,"rel":454},"https://github.com/Wyamio/Wyam",[426],[456],{"type":419,"value":457},"Wyam",{"type":419,"value":459}," (a .NET static website generator) to generate the website",{"type":414,"tag":448,"props":461,"children":462},{},[463,470],{"type":414,"tag":422,"props":464,"children":467},{"href":465,"rel":466},"https://azure.microsoft.com/en-us/services/devops/repos/",[426],[468],{"type":419,"value":469},"Azure Repos",{"type":419,"value":471}," to store the source code on a private git repository",{"type":414,"tag":448,"props":473,"children":474},{},[475,481],{"type":414,"tag":422,"props":476,"children":479},{"href":477,"rel":478},"https://azure.microsoft.com/en-us/services/devops/pipelines/",[426],[480],{"type":419,"value":278},{"type":419,"value":482}," to build and deploy the website",{"type":414,"tag":448,"props":484,"children":485},{},[486,493],{"type":414,"tag":422,"props":487,"children":490},{"href":488,"rel":489},"https://www.netlify.com/",[426],[491],{"type":419,"value":492},"Netlify",{"type":419,"value":494}," to host the website",{"type":414,"tag":448,"props":496,"children":497},{},[498,505],{"type":414,"tag":422,"props":499,"children":502},{"href":500,"rel":501},"https://disqus.com/",[426],[503],{"type":419,"value":504},"Disqus",{"type":419,"value":506}," to allow visitors to comment on my articles",{"type":414,"tag":415,"props":508,"children":509},{},[510],{"type":419,"value":511},"A little bit more than 2 years later in October 2021, everything was still working perfectly fine and I could have let everything that way. Yet, I thought some things could be improved and I wanted to change some parts of this stack.",{"type":414,"tag":432,"props":513,"children":515},{"id":514},"migrating-from-wyam-to-statiq",[516],{"type":419,"value":517},"Migrating from Wyam to Statiq",{"type":414,"tag":519,"props":520,"children":522},"h3",{"id":521},"why",[523],{"type":419,"value":524},"Why?",{"type":414,"tag":415,"props":526,"children":527},{},[528],{"type":419,"value":529},"I am convinced that static website generators have a great future and are one of the best solutions for blogs #ThisIsTheWay.",{"type":414,"tag":415,"props":531,"children":532},{},[533,535,541,543,550],{"type":419,"value":534},"Although Wyam was working fine for my blog, it has been \"rebranded and rebooted as ",{"type":414,"tag":422,"props":536,"children":539},{"href":537,"rel":538},"https://www.statiq.dev/",[426],[540],{"type":419,"value":331},{"type":419,"value":542}," with a ton of improvements\" (as you can read on ",{"type":414,"tag":422,"props":544,"children":547},{"href":545,"rel":546},"https://wyam.io/",[426],[548],{"type":419,"value":549},"Wyam website",{"type":419,"value":551},") so it made sense to migrate to use an actively maintained tool.",{"type":414,"tag":415,"props":553,"children":554},{},[555,557,563],{"type":419,"value":556},"I could have migrated to another static website generator (there are so many of them!) but I like using one written in .NET. If I want to customize how my website is generated, I can easily modify the code as it's .NET code. So ",{"type":414,"tag":558,"props":559,"children":561},"code",{"className":560},[],[562],{"type":419,"value":331},{"type":419,"value":564}," is a good choice for me.",{"type":414,"tag":566,"props":567,"children":569},"callout",{"icon":568},"i-heroicons-chat-bubble-left-20-solid",[570,589],{"type":414,"tag":415,"props":571,"children":572},{},[573,575,580,582,587],{"type":419,"value":574},"By the way, in this article when I am talking about ",{"type":414,"tag":558,"props":576,"children":578},{"className":577},[],[579],{"type":419,"value":331},{"type":419,"value":581}," I am talking about the static site generator but technically ",{"type":414,"tag":558,"props":583,"children":585},{"className":584},[],[586],{"type":419,"value":331},{"type":419,"value":588}," is more than that. It is a static generation platform that is divided into 3 parts:",{"type":414,"tag":444,"props":590,"children":591},{},[592,603,619],{"type":414,"tag":448,"props":593,"children":594},{},[595,601],{"type":414,"tag":558,"props":596,"children":598},{"className":597},[],[599],{"type":419,"value":600},"Statiq Framework",{"type":419,"value":602}," ➡ a framework to build a custom static generator application",{"type":414,"tag":448,"props":604,"children":605},{},[606,612,614],{"type":414,"tag":558,"props":607,"children":609},{"className":608},[],[610],{"type":419,"value":611},"Statiq Web",{"type":419,"value":613}," ➡ a static website generation toolkit built on top of ",{"type":414,"tag":558,"props":615,"children":617},{"className":616},[],[618],{"type":419,"value":600},{"type":414,"tag":448,"props":620,"children":621},{},[622,628,630,635,637,643],{"type":414,"tag":558,"props":623,"children":625},{"className":624},[],[626],{"type":419,"value":627},"Statiq Docs",{"type":419,"value":629}," ➡ a toolkit built on top of ",{"type":414,"tag":558,"props":631,"children":633},{"className":632},[],[634],{"type":419,"value":611},{"type":419,"value":636}," to generate a site with .NET API documentation\nYou may not know, but the .NET Foundation website is generated using ",{"type":414,"tag":558,"props":638,"children":640},{"className":639},[],[641],{"type":419,"value":642},"Statiq.Web",{"type":419,"value":644},".",{"type":414,"tag":519,"props":646,"children":648},{"id":647},"how",[649],{"type":419,"value":650},"How?",{"type":414,"tag":415,"props":652,"children":653},{},[654,656,663],{"type":419,"value":655},"Migration was quite easy (some CSS classes to replace and some configuration to change and that was it!). Statiq has a ",{"type":414,"tag":422,"props":657,"children":660},{"href":658,"rel":659},"https://www.statiq.dev/web/porting-from-wyam",[426],[661],{"type":419,"value":662},"page",{"type":419,"value":664}," in its documentation to explain how to do that.",{"type":414,"tag":415,"props":666,"children":667},{},[668],{"type":419,"value":669},"The main difference is that instead of using the Wyam CLI to generate my blog from my articles in markdown and a config file, I now have a .NET console application that I run to do the same.",{"type":414,"tag":519,"props":671,"children":673},{"id":672},"what-changed",[674],{"type":419,"value":675},"What changed?",{"type":414,"tag":415,"props":677,"children":678},{},[679,681,688],{"type":419,"value":680},"Although Statiq is a reboot of Wyam, and a lot has changed internally, my blog is pretty much the same as before. Statiq comes with the theme ",{"type":414,"tag":422,"props":682,"children":685},{"href":683,"rel":684},"https://github.com/statiqdev/CleanBlog",[426],[686],{"type":419,"value":687},"CleanBlog",{"type":419,"value":689}," that I was using before with Wyam so the UI looks the same. However as it uses a more recent version of the theme, the migration brought a few improvements to my blog:",{"type":414,"tag":444,"props":691,"children":692},{},[693,698],{"type":414,"tag":448,"props":694,"children":695},{},[696],{"type":419,"value":697},"there is now a search box to search my blog (everything is indexed so finding an article that might interest you is easier than ever)",{"type":414,"tag":448,"props":699,"children":700},{},[701],{"type":419,"value":702},"the code highlighting is prettier than before",{"type":414,"tag":415,"props":704,"children":705},{},[706],{"type":419,"value":707},"You can see below an example of that:",{"type":414,"tag":415,"props":709,"children":710},{},[711],{"type":414,"tag":712,"props":713,"children":719},"img",{"alt":714,"className":715,"src":718},"Screenshot of the techwatching.dev blog.",[716,717],"rounded-lg","mx-auto","/posts/images/migrating_blog_1.png",[],{"type":414,"tag":415,"props":721,"children":722},{},[723,725,732],{"type":419,"value":724},"I also took the opportunity of migrating my blog to correct a lot of grammar and spelling mistakes there were on my articles. To find the mistakes and correct them I used the free version of ",{"type":414,"tag":422,"props":726,"children":729},{"href":727,"rel":728},"https://www.grammarly.com/",[426],[730],{"type":419,"value":731},"Grammarly",{"type":419,"value":733}," and I was surprised by how good it was. I intend to use it to write my future articles and I strongly recommend it to you. It is especially useful to me as I am not an English native speaker. Of course, I am not saying there will be no mistake in my articles but I should catch most of them with Grammarly.",{"type":414,"tag":432,"props":735,"children":737},{"id":736},"open-sourcing-my-blog",[738],{"type":419,"value":739},"Open-sourcing my blog",{"type":414,"tag":415,"props":741,"children":742},{},[743,745,751,753,760],{"type":419,"value":744},"People interested in creating their blog sometimes ask me what stack I used to build my blog. So I thought open-sourcing my blog would be a great way to answer this question and show exactly how this blog is built. If you are a .NET developer and want to create your blog, I strongly recommend you to use ",{"type":414,"tag":422,"props":746,"children":749},{"href":747,"rel":748},"https://www.statiq.dev/web/",[426],[750],{"type":419,"value":611},{"type":419,"value":752},". You can get started by following the documentation, it is very easy. And now, you have an example of a blog using Statiq that you can look at ",{"type":414,"tag":422,"props":754,"children":757},{"href":755,"rel":756},"https://github.com/techwatching/techwatching.dev",[426],[758],{"type":419,"value":759},"here",{"type":419,"value":644},{"type":414,"tag":415,"props":762,"children":763},{},[764,766,772],{"type":419,"value":765},"I am often a consumer of open source code (as we all are these days) so it feels great to be a contributor this time by sharing the source code of my blog (even if there is currently not much customization). I don't expect many people to look at it but at least it's ",{"type":414,"tag":422,"props":767,"children":769},{"href":755,"rel":768},[426],[770],{"type":419,"value":771},"there",{"type":419,"value":773}," if you care.",{"type":414,"tag":432,"props":775,"children":777},{"id":776},"all-in-on-github",[778],{"type":419,"value":779},"All-in on GitHub",{"type":414,"tag":415,"props":781,"children":782},{},[783],{"type":419,"value":784},"GitHub is one of the best platforms for open source projects. But whether it be for open source or proprietary software, GitHub is above all a great development platform to build, ship, and maintain software. I am more familiar with Azure DevOps which is a great platform too and that I use at work but using GitHub was the opportunity to learn new things. Therefore, I decided to migrate to GitHub for my blog and not only for hosting the code.",{"type":414,"tag":519,"props":786,"children":788},{"id":787},"hosting-the-source-code-of-my-blog",[789],{"type":419,"value":790},"Hosting the source code of my blog",{"type":414,"tag":415,"props":792,"children":793},{},[794],{"type":419,"value":795},"Speaking of hosting the code, here is my new git repository on GitHub:",{"type":414,"tag":415,"props":797,"children":798},{},[799],{"type":414,"tag":712,"props":800,"children":804},{"alt":801,"className":802,"src":803},"Techwatching.dev GitHub repository.",[716,717],"/posts/images/migrating_blog_2.png",[],{"type":414,"tag":415,"props":806,"children":807},{},[808],{"type":419,"value":809},"To move my code to GitHub, I just created a new git repository in GitHub and copy-pasted my code there. Adding GitHub as a new remote of my repository could have been a better way to migrate my code to GitHub while preserving the commit history. However, I did not care about history and took the opportunity to reorganize my code.",{"type":414,"tag":566,"props":811,"children":812},{"icon":568},[813],{"type":414,"tag":415,"props":814,"children":815},{},[816],{"type":419,"value":817},"I know that it is possible to have public projects/git repositories in Azure DevOps so I could have kept my code there, but as I said, moving to GitHub to store my code was a choice.",{"type":414,"tag":415,"props":819,"children":820},{},[821,823,830],{"type":419,"value":822},"And now that my git repository is on GitHub, I can use the ",{"type":414,"tag":422,"props":824,"children":827},{"href":825,"rel":826},"https://docs.github.com/en/codespaces/the-githubdev-web-based-editor",[426],[828],{"type":419,"value":829},"github.dev",{"type":419,"value":831}," web-based editor to modify my repository directly in the browser. How cool is that?",{"type":414,"tag":415,"props":833,"children":834},{},[835],{"type":414,"tag":712,"props":836,"children":840},{"alt":837,"className":838,"src":839},"Blog in github.dev editor.",[716,717],"/posts/images/migrating_blog_3.png",[],{"type":414,"tag":415,"props":842,"children":843},{},[844,846,851],{"type":419,"value":845},"I don't know if I will use ",{"type":414,"tag":558,"props":847,"children":849},{"className":848},[],[850],{"type":419,"value":829},{"type":419,"value":852}," a lot but I like the fact of being able to work on my blog from any computer without having to install anything.",{"type":414,"tag":566,"props":854,"children":856},{"icon":855},"i-heroicons-light-bulb",[857],{"type":414,"tag":415,"props":858,"children":859},{},[860,862,867,869,875,877,882],{"type":419,"value":861},"If you never heard of github.dev, simply go to any GitHub repository in your favorite web browser and press ",{"type":414,"tag":558,"props":863,"children":865},{"className":864},[],[866],{"type":419,"value":644},{"type":419,"value":868}," to open this repository in a vscode-like editor that runs entirely in your browser. You can also replace ",{"type":414,"tag":558,"props":870,"children":872},{"className":871},[],[873],{"type":419,"value":874},"github.com",{"type":419,"value":876}," with ",{"type":414,"tag":558,"props":878,"children":880},{"className":879},[],[881],{"type":419,"value":829},{"type":419,"value":883}," in the URL to open it. It even works on your mobile although I don't find it very convenient.",{"type":414,"tag":519,"props":885,"children":887},{"id":886},"building-and-deploying-my-blog",[888],{"type":419,"value":889},"Building and deploying my blog",{"type":414,"tag":415,"props":891,"children":892},{},[893],{"type":419,"value":894},"Coming from Azure DevOps, moving from Azure Pipelines to GitHub Actions was not a big deal. What changed however is that my pipeline doesn't need to install any specific CLI to build and deploy my blog. Indeed, with Statiq my blog is a .NET console application, so my site can be generated directly with the .NET CLI. Statiq as built-in support for deploying a website on different platforms including Netlify thus my pipeline to generate and deploy my site is quite simple:",{"type":414,"tag":896,"props":897,"children":901},"pre",{"className":898,"code":899,"language":900,"meta":401,"style":401},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Deploy Blog to Netlify\n\non:\n  push:\n    branches: \n      - main\n  schedule:\n  - cron: \"0 5 * * *\"\n\njobs:\n  build:\n    runs-on: windows-latest\n    steps:\n    - uses: actions/checkout@v2\n      with:\n        ref: main\n        submodules: recursive\n    - uses: actions/setup-dotnet@v1\n      with:\n        dotnet-version: '5.0.x'\n    - run: dotnet run -c Release -- deploy\n      env:\n        NetlifySiteId: ${{ secrets.NetlifySiteId }}\n        NetlifyAccessToken: ${{ secrets.NetlifyAccessToken }}\n","yml",[902],{"type":414,"tag":558,"props":903,"children":904},{"__ignoreMap":401},[905,929,939,954,967,986,1000,1013,1046,1054,1067,1080,1098,1111,1134,1147,1164,1182,1203,1215,1243,1265,1278,1296],{"type":414,"tag":906,"props":907,"children":910},"span",{"class":908,"line":909},"line",1,[911,917,923],{"type":414,"tag":906,"props":912,"children":914},{"style":913},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[915],{"type":419,"value":916},"name",{"type":414,"tag":906,"props":918,"children":920},{"style":919},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[921],{"type":419,"value":922},":",{"type":414,"tag":906,"props":924,"children":926},{"style":925},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[927],{"type":419,"value":928}," Deploy Blog to Netlify\n",{"type":414,"tag":906,"props":930,"children":932},{"class":908,"line":931},2,[933],{"type":414,"tag":906,"props":934,"children":936},{"emptyLinePlaceholder":935},true,[937],{"type":419,"value":938},"\n",{"type":414,"tag":906,"props":940,"children":942},{"class":908,"line":941},3,[943,949],{"type":414,"tag":906,"props":944,"children":946},{"style":945},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[947],{"type":419,"value":948},"on",{"type":414,"tag":906,"props":950,"children":951},{"style":919},[952],{"type":419,"value":953},":\n",{"type":414,"tag":906,"props":955,"children":957},{"class":908,"line":956},4,[958,963],{"type":414,"tag":906,"props":959,"children":960},{"style":913},[961],{"type":419,"value":962},"  push",{"type":414,"tag":906,"props":964,"children":965},{"style":919},[966],{"type":419,"value":953},{"type":414,"tag":906,"props":968,"children":970},{"class":908,"line":969},5,[971,976,980],{"type":414,"tag":906,"props":972,"children":973},{"style":913},[974],{"type":419,"value":975},"    branches",{"type":414,"tag":906,"props":977,"children":978},{"style":919},[979],{"type":419,"value":922},{"type":414,"tag":906,"props":981,"children":983},{"style":982},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[984],{"type":419,"value":985}," \n",{"type":414,"tag":906,"props":987,"children":989},{"class":908,"line":988},6,[990,995],{"type":414,"tag":906,"props":991,"children":992},{"style":919},[993],{"type":419,"value":994},"      -",{"type":414,"tag":906,"props":996,"children":997},{"style":925},[998],{"type":419,"value":999}," main\n",{"type":414,"tag":906,"props":1001,"children":1003},{"class":908,"line":1002},7,[1004,1009],{"type":414,"tag":906,"props":1005,"children":1006},{"style":913},[1007],{"type":419,"value":1008},"  schedule",{"type":414,"tag":906,"props":1010,"children":1011},{"style":919},[1012],{"type":419,"value":953},{"type":414,"tag":906,"props":1014,"children":1016},{"class":908,"line":1015},8,[1017,1022,1027,1031,1036,1041],{"type":414,"tag":906,"props":1018,"children":1019},{"style":919},[1020],{"type":419,"value":1021},"  -",{"type":414,"tag":906,"props":1023,"children":1024},{"style":913},[1025],{"type":419,"value":1026}," cron",{"type":414,"tag":906,"props":1028,"children":1029},{"style":919},[1030],{"type":419,"value":922},{"type":414,"tag":906,"props":1032,"children":1033},{"style":919},[1034],{"type":419,"value":1035}," \"",{"type":414,"tag":906,"props":1037,"children":1038},{"style":925},[1039],{"type":419,"value":1040},"0 5 * * *",{"type":414,"tag":906,"props":1042,"children":1043},{"style":919},[1044],{"type":419,"value":1045},"\"\n",{"type":414,"tag":906,"props":1047,"children":1049},{"class":908,"line":1048},9,[1050],{"type":414,"tag":906,"props":1051,"children":1052},{"emptyLinePlaceholder":935},[1053],{"type":419,"value":938},{"type":414,"tag":906,"props":1055,"children":1057},{"class":908,"line":1056},10,[1058,1063],{"type":414,"tag":906,"props":1059,"children":1060},{"style":913},[1061],{"type":419,"value":1062},"jobs",{"type":414,"tag":906,"props":1064,"children":1065},{"style":919},[1066],{"type":419,"value":953},{"type":414,"tag":906,"props":1068,"children":1070},{"class":908,"line":1069},11,[1071,1076],{"type":414,"tag":906,"props":1072,"children":1073},{"style":913},[1074],{"type":419,"value":1075},"  build",{"type":414,"tag":906,"props":1077,"children":1078},{"style":919},[1079],{"type":419,"value":953},{"type":414,"tag":906,"props":1081,"children":1083},{"class":908,"line":1082},12,[1084,1089,1093],{"type":414,"tag":906,"props":1085,"children":1086},{"style":913},[1087],{"type":419,"value":1088},"    runs-on",{"type":414,"tag":906,"props":1090,"children":1091},{"style":919},[1092],{"type":419,"value":922},{"type":414,"tag":906,"props":1094,"children":1095},{"style":925},[1096],{"type":419,"value":1097}," windows-latest\n",{"type":414,"tag":906,"props":1099,"children":1101},{"class":908,"line":1100},13,[1102,1107],{"type":414,"tag":906,"props":1103,"children":1104},{"style":913},[1105],{"type":419,"value":1106},"    steps",{"type":414,"tag":906,"props":1108,"children":1109},{"style":919},[1110],{"type":419,"value":953},{"type":414,"tag":906,"props":1112,"children":1114},{"class":908,"line":1113},14,[1115,1120,1125,1129],{"type":414,"tag":906,"props":1116,"children":1117},{"style":919},[1118],{"type":419,"value":1119},"    -",{"type":414,"tag":906,"props":1121,"children":1122},{"style":913},[1123],{"type":419,"value":1124}," uses",{"type":414,"tag":906,"props":1126,"children":1127},{"style":919},[1128],{"type":419,"value":922},{"type":414,"tag":906,"props":1130,"children":1131},{"style":925},[1132],{"type":419,"value":1133}," actions/checkout@v2\n",{"type":414,"tag":906,"props":1135,"children":1137},{"class":908,"line":1136},15,[1138,1143],{"type":414,"tag":906,"props":1139,"children":1140},{"style":913},[1141],{"type":419,"value":1142},"      with",{"type":414,"tag":906,"props":1144,"children":1145},{"style":919},[1146],{"type":419,"value":953},{"type":414,"tag":906,"props":1148,"children":1150},{"class":908,"line":1149},16,[1151,1156,1160],{"type":414,"tag":906,"props":1152,"children":1153},{"style":913},[1154],{"type":419,"value":1155},"        ref",{"type":414,"tag":906,"props":1157,"children":1158},{"style":919},[1159],{"type":419,"value":922},{"type":414,"tag":906,"props":1161,"children":1162},{"style":925},[1163],{"type":419,"value":999},{"type":414,"tag":906,"props":1165,"children":1167},{"class":908,"line":1166},17,[1168,1173,1177],{"type":414,"tag":906,"props":1169,"children":1170},{"style":913},[1171],{"type":419,"value":1172},"        submodules",{"type":414,"tag":906,"props":1174,"children":1175},{"style":919},[1176],{"type":419,"value":922},{"type":414,"tag":906,"props":1178,"children":1179},{"style":925},[1180],{"type":419,"value":1181}," recursive\n",{"type":414,"tag":906,"props":1183,"children":1185},{"class":908,"line":1184},18,[1186,1190,1194,1198],{"type":414,"tag":906,"props":1187,"children":1188},{"style":919},[1189],{"type":419,"value":1119},{"type":414,"tag":906,"props":1191,"children":1192},{"style":913},[1193],{"type":419,"value":1124},{"type":414,"tag":906,"props":1195,"children":1196},{"style":919},[1197],{"type":419,"value":922},{"type":414,"tag":906,"props":1199,"children":1200},{"style":925},[1201],{"type":419,"value":1202}," actions/setup-dotnet@v1\n",{"type":414,"tag":906,"props":1204,"children":1206},{"class":908,"line":1205},19,[1207,1211],{"type":414,"tag":906,"props":1208,"children":1209},{"style":913},[1210],{"type":419,"value":1142},{"type":414,"tag":906,"props":1212,"children":1213},{"style":919},[1214],{"type":419,"value":953},{"type":414,"tag":906,"props":1216,"children":1218},{"class":908,"line":1217},20,[1219,1224,1228,1233,1238],{"type":414,"tag":906,"props":1220,"children":1221},{"style":913},[1222],{"type":419,"value":1223},"        dotnet-version",{"type":414,"tag":906,"props":1225,"children":1226},{"style":919},[1227],{"type":419,"value":922},{"type":414,"tag":906,"props":1229,"children":1230},{"style":919},[1231],{"type":419,"value":1232}," '",{"type":414,"tag":906,"props":1234,"children":1235},{"style":925},[1236],{"type":419,"value":1237},"5.0.x",{"type":414,"tag":906,"props":1239,"children":1240},{"style":919},[1241],{"type":419,"value":1242},"'\n",{"type":414,"tag":906,"props":1244,"children":1246},{"class":908,"line":1245},21,[1247,1251,1256,1260],{"type":414,"tag":906,"props":1248,"children":1249},{"style":919},[1250],{"type":419,"value":1119},{"type":414,"tag":906,"props":1252,"children":1253},{"style":913},[1254],{"type":419,"value":1255}," run",{"type":414,"tag":906,"props":1257,"children":1258},{"style":919},[1259],{"type":419,"value":922},{"type":414,"tag":906,"props":1261,"children":1262},{"style":925},[1263],{"type":419,"value":1264}," dotnet run -c Release -- deploy\n",{"type":414,"tag":906,"props":1266,"children":1268},{"class":908,"line":1267},22,[1269,1274],{"type":414,"tag":906,"props":1270,"children":1271},{"style":913},[1272],{"type":419,"value":1273},"      env",{"type":414,"tag":906,"props":1275,"children":1276},{"style":919},[1277],{"type":419,"value":953},{"type":414,"tag":906,"props":1279,"children":1281},{"class":908,"line":1280},23,[1282,1287,1291],{"type":414,"tag":906,"props":1283,"children":1284},{"style":913},[1285],{"type":419,"value":1286},"        NetlifySiteId",{"type":414,"tag":906,"props":1288,"children":1289},{"style":919},[1290],{"type":419,"value":922},{"type":414,"tag":906,"props":1292,"children":1293},{"style":925},[1294],{"type":419,"value":1295}," ${{ secrets.NetlifySiteId }}\n",{"type":414,"tag":906,"props":1297,"children":1299},{"class":908,"line":1298},24,[1300,1305,1309],{"type":414,"tag":906,"props":1301,"children":1302},{"style":913},[1303],{"type":419,"value":1304},"        NetlifyAccessToken",{"type":414,"tag":906,"props":1306,"children":1307},{"style":919},[1308],{"type":419,"value":922},{"type":414,"tag":906,"props":1310,"children":1311},{"style":925},[1312],{"type":419,"value":1313}," ${{ secrets.NetlifyAccessToken }}\n",{"type":414,"tag":415,"props":1315,"children":1316},{},[1317],{"type":419,"value":1318},"This pipeline runs every day and each time something is merged on my main branch. This way my website is redeployed when I publish a new article (which generally corresponds to a commit being made on the main branch through the merge of the branch where I was writing the article). This also allows me to finalize an article but publish it at a future date without having to take care of it.",{"type":414,"tag":519,"props":1320,"children":1322},{"id":1321},"hosting-my-website",[1323],{"type":419,"value":1324},"Hosting my website",{"type":414,"tag":415,"props":1326,"children":1327},{},[1328],{"type":419,"value":1329},"This is the only part where I did not really go all-in on GitHub as I did not use GitHub Pages to host my blog, I kept Netlify. I am happy with it, it does the job, costs me nothing, and allows me to have previews of my blog if I want to so there was no reason to change.",{"type":414,"tag":415,"props":1331,"children":1332},{},[1333],{"type":414,"tag":712,"props":1334,"children":1338},{"alt":1335,"className":1336,"src":1337},"Netlify dashboard the blog.",[716,717],"/posts/images/migrating_blog_4.png",[],{"type":414,"tag":519,"props":1340,"children":1342},{"id":1341},"providing-a-comments-system",[1343],{"type":419,"value":1344},"Providing a comments system",{"type":414,"tag":415,"props":1346,"children":1347},{},[1348,1350,1355],{"type":419,"value":1349},"I was previously using the well-known comments system ",{"type":414,"tag":422,"props":1351,"children":1353},{"href":500,"rel":1352},[426],[1354],{"type":419,"value":504},{"type":419,"value":1356}," to let readers of my blog comment on the articles. To be honest, it works well, has a lot of features (moderation, monitoring...), and is used on many blogs. However, I have always found it a bit complex for my needs and was annoyed to \"force\" my readers to create a Disqus account to write comments. So when I read articles of people complaining about Disqus ads, tracking and performance issues I knew it was time to find an alternative.",{"type":414,"tag":415,"props":1358,"children":1359},{},[1360,1362,1369,1371,1377,1379,1384],{"type":419,"value":1361},"And there are many alternatives to Disqus! But one I found very interesting was ",{"type":414,"tag":422,"props":1363,"children":1366},{"href":1364,"rel":1365},"https://utteranc.es/",[426],[1367],{"type":419,"value":1368},"utterances",{"type":419,"value":1370},", a GitHub application that relies on GitHub issues to store blog comments. As the creator of this library explains ",{"type":414,"tag":422,"props":1372,"children":1375},{"href":1373,"rel":1374},"https://danyow.net/using-github-issues-for-blog-comments/",[426],[1376],{"type":419,"value":759},{"type":419,"value":1378},", ",{"type":414,"tag":558,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":419,"value":1368},{"type":419,"value":1385}," served as a POC for the GitHub-based feedback system in Microsoft Docs. I thought using GitHub issues for the comments of my blog was awesome because:",{"type":414,"tag":444,"props":1387,"children":1388},{},[1389,1394],{"type":414,"tag":448,"props":1390,"children":1391},{},[1392],{"type":419,"value":1393},"my readers will not have to create an account to write comments, my readers are developers so they probably already have a GitHub account",{"type":414,"tag":448,"props":1395,"children":1396},{},[1397],{"type":419,"value":1398},"with comments stored as GitHub issues on my GitHub repository, I have everything at the same place (code, pipelines, and comments)",{"type":414,"tag":415,"props":1400,"children":1401},{},[1402,1404,1409,1411,1418,1420,1425,1427,1434,1436,1441,1443,1448],{"type":419,"value":1403},"But you know what? I finally did not choose ",{"type":414,"tag":558,"props":1405,"children":1407},{"className":1406},[],[1408],{"type":419,"value":1368},{"type":419,"value":1410}," as the comments system for my blog 😀. Instead, I chose to use ",{"type":414,"tag":422,"props":1412,"children":1415},{"href":1413,"rel":1414},"https://giscus.app/",[426],[1416],{"type":419,"value":1417},"giscus",{"type":419,"value":1419}," which is similar to ",{"type":414,"tag":558,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":419,"value":1368},{"type":419,"value":1426}," (in fact it is heavily based on it) but stores comments in ",{"type":414,"tag":422,"props":1428,"children":1431},{"href":1429,"rel":1430},"https://docs.github.com/en/discussions",[426],[1432],{"type":419,"value":1433},"GitHub Discussions",{"type":419,"value":1435},". GitHub Discussions did not exist when ",{"type":414,"tag":558,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":419,"value":1368},{"type":419,"value":1442}," was created but I think discussions are a much more appropriate place than GitHub issues to store comments, that's why I chose it. Apart from that, advantages are the same as ",{"type":414,"tag":558,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":419,"value":1368},{"type":419,"value":644},{"type":414,"tag":415,"props":1450,"children":1451},{},[1452],{"type":414,"tag":712,"props":1453,"children":1457},{"alt":1454,"className":1455,"src":1456},"Comment on the blog using discuss.",[716,717],"/posts/images/migrating_blog_5.png",[],{"type":414,"tag":415,"props":1459,"children":1460},{},[1461,1463,1468],{"type":419,"value":1462},"If you don't have a comments system on your blog yet or that your current one does not satisfy you, you should check ",{"type":414,"tag":422,"props":1464,"children":1466},{"href":1413,"rel":1465},[426],[1467],{"type":419,"value":1417},{"type":419,"value":1469},", I am very happy with it.",{"type":414,"tag":566,"props":1471,"children":1472},{"icon":568},[1473],{"type":414,"tag":415,"props":1474,"children":1475},{},[1476,1478,1483,1485,1492,1494,1501],{"type":419,"value":1477},"If you are currently using Disqus and want to migrate to ",{"type":414,"tag":558,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":419,"value":1417},{"type":419,"value":1484}," (while preserving your existing comments), the easiest way I found was to export the Disqus comments in a file, use this ",{"type":414,"tag":422,"props":1486,"children":1489},{"href":1487,"rel":1488},"https://github.com/JuergenGutsch/disqus-to-github-issues",[426],[1490],{"type":419,"value":1491},"tool",{"type":419,"value":1493}," on GitHub to convert them into issues, and manually convert existing issues to discussions on each issue page. You can read this ",{"type":414,"tag":422,"props":1495,"children":1498},{"href":1496,"rel":1497},"https://ljvmiranda921.github.io/notebook/2021/03/26/migrating-from-disqus-to-utterances/",[426],[1499],{"type":419,"value":1500},"blog post",{"type":419,"value":1502}," that partially explains how to do that.",{"type":414,"tag":519,"props":1504,"children":1506},{"id":1505},"managing-my-blog-as-a-project",[1507],{"type":419,"value":1508},"Managing my blog as a project",{"type":414,"tag":415,"props":1510,"children":1511},{},[1512,1514,1521],{"type":419,"value":1513},"My blog is not very hard to manage but there are always things to do or think about: improvements to do, articles to write, ideas to find. Instead of writing that down on my ToDo app or my OneNote as I used to do, I decided to use the ",{"type":414,"tag":422,"props":1515,"children":1518},{"href":1516,"rel":1517},"https://github.com/features/issues/",[426],[1519],{"type":419,"value":1520},"GitHub Issues beta",{"type":419,"value":1522}," that allows you to create a \"project\" with a backlog, boards, and issues that can be categorized with custom fields.",{"type":414,"tag":415,"props":1524,"children":1525},{},[1526],{"type":414,"tag":712,"props":1527,"children":1531},{"alt":1528,"className":1529,"src":1530},"Github project for the blog.",[716,717],"/posts/images/migrating_blog_6.png",[],{"type":414,"tag":432,"props":1533,"children":1535},{"id":1534},"summary",[1536],{"type":419,"value":1537},"Summary",{"type":414,"tag":415,"props":1539,"children":1540},{},[1541],{"type":419,"value":1542},"In this article, I talked to you about what changed on my blog, and what my new stack is:",{"type":414,"tag":444,"props":1544,"children":1545},{},[1546,1556,1567,1577,1588,1604],{"type":414,"tag":448,"props":1547,"children":1548},{},[1549,1554],{"type":414,"tag":422,"props":1550,"children":1552},{"href":747,"rel":1551},[426],[1553],{"type":419,"value":331},{"type":419,"value":1555}," a .NET static website generator to generate the website",{"type":414,"tag":448,"props":1557,"children":1558},{},[1559,1565],{"type":414,"tag":422,"props":1560,"children":1563},{"href":1561,"rel":1562},"https://github.com/",[426],[1564],{"type":419,"value":233},{"type":419,"value":1566}," to store the source code on a public (open source) git repository",{"type":414,"tag":448,"props":1568,"children":1569},{},[1570,1576],{"type":414,"tag":422,"props":1571,"children":1574},{"href":1572,"rel":1573},"https://github.com/features/actions",[426],[1575],{"type":419,"value":307},{"type":419,"value":482},{"type":414,"tag":448,"props":1578,"children":1579},{},[1580,1586],{"type":414,"tag":422,"props":1581,"children":1583},{"href":1516,"rel":1582},[426],[1584],{"type":419,"value":1585},"GitHub Issues (beta)",{"type":419,"value":1587}," to manage my ideas for the blog",{"type":414,"tag":448,"props":1589,"children":1590},{},[1591,1596,1597,1602],{"type":414,"tag":422,"props":1592,"children":1594},{"href":1429,"rel":1593},[426],[1595],{"type":419,"value":1433},{"type":419,"value":876},{"type":414,"tag":422,"props":1598,"children":1600},{"href":1413,"rel":1599},[426],[1601],{"type":419,"value":1417},{"type":419,"value":1603}," to allow visitors to comment my articles",{"type":414,"tag":448,"props":1605,"children":1606},{},[1607,1612],{"type":414,"tag":422,"props":1608,"children":1610},{"href":488,"rel":1609},[426],[1611],{"type":419,"value":492},{"type":419,"value":494},{"type":414,"tag":415,"props":1614,"children":1615},{},[1616],{"type":419,"value":1617},"I like this new stack where most things are centralized in one place: GitHub. I own the content of this blog, but I love that code to generate this blog is open source. There is still plenty of room for improvement on my blog, but I am confident Statiq will help me to continue customizing my blog easily. I hope you liked this article, do not hesitate to comment (you now know how comments work behind the scenes 😀).",{"type":414,"tag":566,"props":1619,"children":1620},{"icon":568},[1621],{"type":414,"tag":415,"props":1622,"children":1623},{},[1624,1626,1633],{"type":419,"value":1625},"If you are reading this article from hashnode or dev.to and not directly on my ",{"type":414,"tag":422,"props":1627,"children":1630},{"href":1628,"rel":1629},"https://techwatching.dev",[426],[1631],{"type":419,"value":1632},"blog",{"type":419,"value":1634},", these changes do not apply to you. But do not worry, I will continue to cross-post my articles on these platforms too which have great communities.",{"type":414,"tag":1636,"props":1637,"children":1638},"style",{},[1639],{"type":419,"value":1640},"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":401,"searchDepth":931,"depth":931,"links":1642},[1643,1644,1649,1650,1657],{"id":434,"depth":931,"text":437},{"id":514,"depth":931,"text":517,"children":1645},[1646,1647,1648],{"id":521,"depth":941,"text":524},{"id":647,"depth":941,"text":650},{"id":672,"depth":941,"text":675},{"id":736,"depth":931,"text":739},{"id":776,"depth":931,"text":779,"children":1651},[1652,1653,1654,1655,1656],{"id":787,"depth":941,"text":790},{"id":886,"depth":941,"text":889},{"id":1321,"depth":941,"text":1324},{"id":1341,"depth":941,"text":1344},{"id":1505,"depth":941,"text":1508},{"id":1534,"depth":931,"text":1537},"markdown","content:1.posts:27.migrating-blog.md","content","1.posts/27.migrating-blog.md","md",1716749600815]