[{"data":1,"prerenderedAt":1503},["Reactive",2],{"navigation":3,"/posts/migrating-blog":204,"/posts/migrating-blog-surround":1475},[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",{"_path":88,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":87,"description":208,"lead":209,"date":210,"badge":211,"image":213,"tags":215,"body":221,"_type":1470,"_id":1471,"_source":1472,"_file":1473,"_extension":1474},"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":212},"Tooling",{"src":214},"/images/migration_1.jpg",[216,217,218,219,220],"Statiq",".NET","GitHub","GitHub Actions","open source",{"type":222,"children":223,"toc":1453},"root",[224,242,249,254,319,324,330,337,342,364,377,457,463,477,482,488,502,515,520,532,546,552,573,586,592,597,603,608,617,622,630,644,653,665,696,702,707,1126,1131,1137,1142,1151,1157,1169,1198,1211,1261,1270,1282,1315,1321,1335,1344,1350,1355,1425,1430,1447],{"type":225,"tag":226,"props":227,"children":228},"element","p",{},[229,232,240],{"type":230,"value":231},"text","Today I talk to you about the recent changes I made to my blog when I migrated it to ",{"type":225,"tag":233,"props":234,"children":238},"a",{"href":235,"rel":236},"https://statiq.dev/",[237],"nofollow",[239],{"type":230,"value":216},{"type":230,"value":241}," and open-sourced it.",{"type":225,"tag":243,"props":244,"children":246},"h2",{"id":245},"some-context",[247],{"type":230,"value":248},"Some context",{"type":225,"tag":226,"props":250,"children":251},{},[252],{"type":230,"value":253},"I initially created my blog in March 2019 using:",{"type":225,"tag":255,"props":256,"children":257},"ul",{},[258,271,283,295,307],{"type":225,"tag":259,"props":260,"children":261},"li",{},[262,269],{"type":225,"tag":233,"props":263,"children":266},{"href":264,"rel":265},"https://github.com/Wyamio/Wyam",[237],[267],{"type":230,"value":268},"Wyam",{"type":230,"value":270}," (a .NET static website generator) to generate the website",{"type":225,"tag":259,"props":272,"children":273},{},[274,281],{"type":225,"tag":233,"props":275,"children":278},{"href":276,"rel":277},"https://azure.microsoft.com/en-us/services/devops/repos/",[237],[279],{"type":230,"value":280},"Azure Repos",{"type":230,"value":282}," to store the source code on a private git repository",{"type":225,"tag":259,"props":284,"children":285},{},[286,293],{"type":225,"tag":233,"props":287,"children":290},{"href":288,"rel":289},"https://azure.microsoft.com/en-us/services/devops/pipelines/",[237],[291],{"type":230,"value":292},"Azure Pipelines",{"type":230,"value":294}," to build and deploy the website",{"type":225,"tag":259,"props":296,"children":297},{},[298,305],{"type":225,"tag":233,"props":299,"children":302},{"href":300,"rel":301},"https://www.netlify.com/",[237],[303],{"type":230,"value":304},"Netlify",{"type":230,"value":306}," to host the website",{"type":225,"tag":259,"props":308,"children":309},{},[310,317],{"type":225,"tag":233,"props":311,"children":314},{"href":312,"rel":313},"https://disqus.com/",[237],[315],{"type":230,"value":316},"Disqus",{"type":230,"value":318}," to allow visitors to comment on my articles",{"type":225,"tag":226,"props":320,"children":321},{},[322],{"type":230,"value":323},"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":225,"tag":243,"props":325,"children":327},{"id":326},"migrating-from-wyam-to-statiq",[328],{"type":230,"value":329},"Migrating from Wyam to Statiq",{"type":225,"tag":331,"props":332,"children":334},"h3",{"id":333},"why",[335],{"type":230,"value":336},"Why?",{"type":225,"tag":226,"props":338,"children":339},{},[340],{"type":230,"value":341},"I am convinced that static website generators have a great future and are one of the best solutions for blogs #ThisIsTheWay.",{"type":225,"tag":226,"props":343,"children":344},{},[345,347,353,355,362],{"type":230,"value":346},"Although Wyam was working fine for my blog, it has been \"rebranded and rebooted as ",{"type":225,"tag":233,"props":348,"children":351},{"href":349,"rel":350},"https://www.statiq.dev/",[237],[352],{"type":230,"value":216},{"type":230,"value":354}," with a ton of improvements\" (as you can read on ",{"type":225,"tag":233,"props":356,"children":359},{"href":357,"rel":358},"https://wyam.io/",[237],[360],{"type":230,"value":361},"Wyam website",{"type":230,"value":363},") so it made sense to migrate to use an actively maintained tool.",{"type":225,"tag":226,"props":365,"children":366},{},[367,369,375],{"type":230,"value":368},"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":225,"tag":370,"props":371,"children":373},"code",{"className":372},[],[374],{"type":230,"value":216},{"type":230,"value":376}," is a good choice for me.",{"type":225,"tag":378,"props":379,"children":381},"callout",{"icon":380},"i-heroicons-chat-bubble-left-20-solid",[382,401],{"type":225,"tag":226,"props":383,"children":384},{},[385,387,392,394,399],{"type":230,"value":386},"By the way, in this article when I am talking about ",{"type":225,"tag":370,"props":388,"children":390},{"className":389},[],[391],{"type":230,"value":216},{"type":230,"value":393}," I am talking about the static site generator but technically ",{"type":225,"tag":370,"props":395,"children":397},{"className":396},[],[398],{"type":230,"value":216},{"type":230,"value":400}," is more than that. It is a static generation platform that is divided into 3 parts:",{"type":225,"tag":255,"props":402,"children":403},{},[404,415,431],{"type":225,"tag":259,"props":405,"children":406},{},[407,413],{"type":225,"tag":370,"props":408,"children":410},{"className":409},[],[411],{"type":230,"value":412},"Statiq Framework",{"type":230,"value":414}," ➡ a framework to build a custom static generator application",{"type":225,"tag":259,"props":416,"children":417},{},[418,424,426],{"type":225,"tag":370,"props":419,"children":421},{"className":420},[],[422],{"type":230,"value":423},"Statiq Web",{"type":230,"value":425}," ➡ a static website generation toolkit built on top of ",{"type":225,"tag":370,"props":427,"children":429},{"className":428},[],[430],{"type":230,"value":412},{"type":225,"tag":259,"props":432,"children":433},{},[434,440,442,447,449,455],{"type":225,"tag":370,"props":435,"children":437},{"className":436},[],[438],{"type":230,"value":439},"Statiq Docs",{"type":230,"value":441}," ➡ a toolkit built on top of ",{"type":225,"tag":370,"props":443,"children":445},{"className":444},[],[446],{"type":230,"value":423},{"type":230,"value":448}," to generate a site with .NET API documentation\nYou may not know, but the .NET Foundation website is generated using ",{"type":225,"tag":370,"props":450,"children":452},{"className":451},[],[453],{"type":230,"value":454},"Statiq.Web",{"type":230,"value":456},".",{"type":225,"tag":331,"props":458,"children":460},{"id":459},"how",[461],{"type":230,"value":462},"How?",{"type":225,"tag":226,"props":464,"children":465},{},[466,468,475],{"type":230,"value":467},"Migration was quite easy (some CSS classes to replace and some configuration to change and that was it!). Statiq has a ",{"type":225,"tag":233,"props":469,"children":472},{"href":470,"rel":471},"https://www.statiq.dev/web/porting-from-wyam",[237],[473],{"type":230,"value":474},"page",{"type":230,"value":476}," in its documentation to explain how to do that.",{"type":225,"tag":226,"props":478,"children":479},{},[480],{"type":230,"value":481},"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":225,"tag":331,"props":483,"children":485},{"id":484},"what-changed",[486],{"type":230,"value":487},"What changed?",{"type":225,"tag":226,"props":489,"children":490},{},[491,493,500],{"type":230,"value":492},"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":225,"tag":233,"props":494,"children":497},{"href":495,"rel":496},"https://github.com/statiqdev/CleanBlog",[237],[498],{"type":230,"value":499},"CleanBlog",{"type":230,"value":501}," 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":225,"tag":255,"props":503,"children":504},{},[505,510],{"type":225,"tag":259,"props":506,"children":507},{},[508],{"type":230,"value":509},"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":225,"tag":259,"props":511,"children":512},{},[513],{"type":230,"value":514},"the code highlighting is prettier than before",{"type":225,"tag":226,"props":516,"children":517},{},[518],{"type":230,"value":519},"You can see below an example of that:",{"type":225,"tag":226,"props":521,"children":522},{},[523],{"type":225,"tag":524,"props":525,"children":531},"img",{"alt":526,"className":527,"src":530},"Screenshot of the techwatching.dev blog.",[528,529],"rounded-lg","mx-auto","/posts/images/migrating_blog_1.png",[],{"type":225,"tag":226,"props":533,"children":534},{},[535,537,544],{"type":230,"value":536},"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":225,"tag":233,"props":538,"children":541},{"href":539,"rel":540},"https://www.grammarly.com/",[237],[542],{"type":230,"value":543},"Grammarly",{"type":230,"value":545}," 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":225,"tag":243,"props":547,"children":549},{"id":548},"open-sourcing-my-blog",[550],{"type":230,"value":551},"Open-sourcing my blog",{"type":225,"tag":226,"props":553,"children":554},{},[555,557,563,565,572],{"type":230,"value":556},"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":225,"tag":233,"props":558,"children":561},{"href":559,"rel":560},"https://www.statiq.dev/web/",[237],[562],{"type":230,"value":423},{"type":230,"value":564},". 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":225,"tag":233,"props":566,"children":569},{"href":567,"rel":568},"https://github.com/techwatching/techwatching.dev",[237],[570],{"type":230,"value":571},"here",{"type":230,"value":456},{"type":225,"tag":226,"props":574,"children":575},{},[576,578,584],{"type":230,"value":577},"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":225,"tag":233,"props":579,"children":581},{"href":567,"rel":580},[237],[582],{"type":230,"value":583},"there",{"type":230,"value":585}," if you care.",{"type":225,"tag":243,"props":587,"children":589},{"id":588},"all-in-on-github",[590],{"type":230,"value":591},"All-in on GitHub",{"type":225,"tag":226,"props":593,"children":594},{},[595],{"type":230,"value":596},"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":225,"tag":331,"props":598,"children":600},{"id":599},"hosting-the-source-code-of-my-blog",[601],{"type":230,"value":602},"Hosting the source code of my blog",{"type":225,"tag":226,"props":604,"children":605},{},[606],{"type":230,"value":607},"Speaking of hosting the code, here is my new git repository on GitHub:",{"type":225,"tag":226,"props":609,"children":610},{},[611],{"type":225,"tag":524,"props":612,"children":616},{"alt":613,"className":614,"src":615},"Techwatching.dev GitHub repository.",[528,529],"/posts/images/migrating_blog_2.png",[],{"type":225,"tag":226,"props":618,"children":619},{},[620],{"type":230,"value":621},"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":225,"tag":378,"props":623,"children":624},{"icon":380},[625],{"type":225,"tag":226,"props":626,"children":627},{},[628],{"type":230,"value":629},"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":225,"tag":226,"props":631,"children":632},{},[633,635,642],{"type":230,"value":634},"And now that my git repository is on GitHub, I can use the ",{"type":225,"tag":233,"props":636,"children":639},{"href":637,"rel":638},"https://docs.github.com/en/codespaces/the-githubdev-web-based-editor",[237],[640],{"type":230,"value":641},"github.dev",{"type":230,"value":643}," web-based editor to modify my repository directly in the browser. How cool is that?",{"type":225,"tag":226,"props":645,"children":646},{},[647],{"type":225,"tag":524,"props":648,"children":652},{"alt":649,"className":650,"src":651},"Blog in github.dev editor.",[528,529],"/posts/images/migrating_blog_3.png",[],{"type":225,"tag":226,"props":654,"children":655},{},[656,658,663],{"type":230,"value":657},"I don't know if I will use ",{"type":225,"tag":370,"props":659,"children":661},{"className":660},[],[662],{"type":230,"value":641},{"type":230,"value":664}," a lot but I like the fact of being able to work on my blog from any computer without having to install anything.",{"type":225,"tag":378,"props":666,"children":668},{"icon":667},"i-heroicons-light-bulb",[669],{"type":225,"tag":226,"props":670,"children":671},{},[672,674,679,681,687,689,694],{"type":230,"value":673},"If you never heard of github.dev, simply go to any GitHub repository in your favorite web browser and press ",{"type":225,"tag":370,"props":675,"children":677},{"className":676},[],[678],{"type":230,"value":456},{"type":230,"value":680}," to open this repository in a vscode-like editor that runs entirely in your browser. You can also replace ",{"type":225,"tag":370,"props":682,"children":684},{"className":683},[],[685],{"type":230,"value":686},"github.com",{"type":230,"value":688}," with ",{"type":225,"tag":370,"props":690,"children":692},{"className":691},[],[693],{"type":230,"value":641},{"type":230,"value":695}," in the URL to open it. It even works on your mobile although I don't find it very convenient.",{"type":225,"tag":331,"props":697,"children":699},{"id":698},"building-and-deploying-my-blog",[700],{"type":230,"value":701},"Building and deploying my blog",{"type":225,"tag":226,"props":703,"children":704},{},[705],{"type":230,"value":706},"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":225,"tag":708,"props":709,"children":713},"pre",{"className":710,"code":711,"language":712,"meta":207,"style":207},"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",[714],{"type":225,"tag":370,"props":715,"children":716},{"__ignoreMap":207},[717,741,751,766,779,798,812,825,858,866,879,892,910,923,946,959,976,994,1015,1027,1055,1077,1090,1108],{"type":225,"tag":718,"props":719,"children":722},"span",{"class":720,"line":721},"line",1,[723,729,735],{"type":225,"tag":718,"props":724,"children":726},{"style":725},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[727],{"type":230,"value":728},"name",{"type":225,"tag":718,"props":730,"children":732},{"style":731},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[733],{"type":230,"value":734},":",{"type":225,"tag":718,"props":736,"children":738},{"style":737},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[739],{"type":230,"value":740}," Deploy Blog to Netlify\n",{"type":225,"tag":718,"props":742,"children":744},{"class":720,"line":743},2,[745],{"type":225,"tag":718,"props":746,"children":748},{"emptyLinePlaceholder":747},true,[749],{"type":230,"value":750},"\n",{"type":225,"tag":718,"props":752,"children":754},{"class":720,"line":753},3,[755,761],{"type":225,"tag":718,"props":756,"children":758},{"style":757},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[759],{"type":230,"value":760},"on",{"type":225,"tag":718,"props":762,"children":763},{"style":731},[764],{"type":230,"value":765},":\n",{"type":225,"tag":718,"props":767,"children":769},{"class":720,"line":768},4,[770,775],{"type":225,"tag":718,"props":771,"children":772},{"style":725},[773],{"type":230,"value":774},"  push",{"type":225,"tag":718,"props":776,"children":777},{"style":731},[778],{"type":230,"value":765},{"type":225,"tag":718,"props":780,"children":782},{"class":720,"line":781},5,[783,788,792],{"type":225,"tag":718,"props":784,"children":785},{"style":725},[786],{"type":230,"value":787},"    branches",{"type":225,"tag":718,"props":789,"children":790},{"style":731},[791],{"type":230,"value":734},{"type":225,"tag":718,"props":793,"children":795},{"style":794},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[796],{"type":230,"value":797}," \n",{"type":225,"tag":718,"props":799,"children":801},{"class":720,"line":800},6,[802,807],{"type":225,"tag":718,"props":803,"children":804},{"style":731},[805],{"type":230,"value":806},"      -",{"type":225,"tag":718,"props":808,"children":809},{"style":737},[810],{"type":230,"value":811}," main\n",{"type":225,"tag":718,"props":813,"children":815},{"class":720,"line":814},7,[816,821],{"type":225,"tag":718,"props":817,"children":818},{"style":725},[819],{"type":230,"value":820},"  schedule",{"type":225,"tag":718,"props":822,"children":823},{"style":731},[824],{"type":230,"value":765},{"type":225,"tag":718,"props":826,"children":828},{"class":720,"line":827},8,[829,834,839,843,848,853],{"type":225,"tag":718,"props":830,"children":831},{"style":731},[832],{"type":230,"value":833},"  -",{"type":225,"tag":718,"props":835,"children":836},{"style":725},[837],{"type":230,"value":838}," cron",{"type":225,"tag":718,"props":840,"children":841},{"style":731},[842],{"type":230,"value":734},{"type":225,"tag":718,"props":844,"children":845},{"style":731},[846],{"type":230,"value":847}," \"",{"type":225,"tag":718,"props":849,"children":850},{"style":737},[851],{"type":230,"value":852},"0 5 * * *",{"type":225,"tag":718,"props":854,"children":855},{"style":731},[856],{"type":230,"value":857},"\"\n",{"type":225,"tag":718,"props":859,"children":861},{"class":720,"line":860},9,[862],{"type":225,"tag":718,"props":863,"children":864},{"emptyLinePlaceholder":747},[865],{"type":230,"value":750},{"type":225,"tag":718,"props":867,"children":869},{"class":720,"line":868},10,[870,875],{"type":225,"tag":718,"props":871,"children":872},{"style":725},[873],{"type":230,"value":874},"jobs",{"type":225,"tag":718,"props":876,"children":877},{"style":731},[878],{"type":230,"value":765},{"type":225,"tag":718,"props":880,"children":882},{"class":720,"line":881},11,[883,888],{"type":225,"tag":718,"props":884,"children":885},{"style":725},[886],{"type":230,"value":887},"  build",{"type":225,"tag":718,"props":889,"children":890},{"style":731},[891],{"type":230,"value":765},{"type":225,"tag":718,"props":893,"children":895},{"class":720,"line":894},12,[896,901,905],{"type":225,"tag":718,"props":897,"children":898},{"style":725},[899],{"type":230,"value":900},"    runs-on",{"type":225,"tag":718,"props":902,"children":903},{"style":731},[904],{"type":230,"value":734},{"type":225,"tag":718,"props":906,"children":907},{"style":737},[908],{"type":230,"value":909}," windows-latest\n",{"type":225,"tag":718,"props":911,"children":913},{"class":720,"line":912},13,[914,919],{"type":225,"tag":718,"props":915,"children":916},{"style":725},[917],{"type":230,"value":918},"    steps",{"type":225,"tag":718,"props":920,"children":921},{"style":731},[922],{"type":230,"value":765},{"type":225,"tag":718,"props":924,"children":926},{"class":720,"line":925},14,[927,932,937,941],{"type":225,"tag":718,"props":928,"children":929},{"style":731},[930],{"type":230,"value":931},"    -",{"type":225,"tag":718,"props":933,"children":934},{"style":725},[935],{"type":230,"value":936}," uses",{"type":225,"tag":718,"props":938,"children":939},{"style":731},[940],{"type":230,"value":734},{"type":225,"tag":718,"props":942,"children":943},{"style":737},[944],{"type":230,"value":945}," actions/checkout@v2\n",{"type":225,"tag":718,"props":947,"children":949},{"class":720,"line":948},15,[950,955],{"type":225,"tag":718,"props":951,"children":952},{"style":725},[953],{"type":230,"value":954},"      with",{"type":225,"tag":718,"props":956,"children":957},{"style":731},[958],{"type":230,"value":765},{"type":225,"tag":718,"props":960,"children":962},{"class":720,"line":961},16,[963,968,972],{"type":225,"tag":718,"props":964,"children":965},{"style":725},[966],{"type":230,"value":967},"        ref",{"type":225,"tag":718,"props":969,"children":970},{"style":731},[971],{"type":230,"value":734},{"type":225,"tag":718,"props":973,"children":974},{"style":737},[975],{"type":230,"value":811},{"type":225,"tag":718,"props":977,"children":979},{"class":720,"line":978},17,[980,985,989],{"type":225,"tag":718,"props":981,"children":982},{"style":725},[983],{"type":230,"value":984},"        submodules",{"type":225,"tag":718,"props":986,"children":987},{"style":731},[988],{"type":230,"value":734},{"type":225,"tag":718,"props":990,"children":991},{"style":737},[992],{"type":230,"value":993}," recursive\n",{"type":225,"tag":718,"props":995,"children":997},{"class":720,"line":996},18,[998,1002,1006,1010],{"type":225,"tag":718,"props":999,"children":1000},{"style":731},[1001],{"type":230,"value":931},{"type":225,"tag":718,"props":1003,"children":1004},{"style":725},[1005],{"type":230,"value":936},{"type":225,"tag":718,"props":1007,"children":1008},{"style":731},[1009],{"type":230,"value":734},{"type":225,"tag":718,"props":1011,"children":1012},{"style":737},[1013],{"type":230,"value":1014}," actions/setup-dotnet@v1\n",{"type":225,"tag":718,"props":1016,"children":1018},{"class":720,"line":1017},19,[1019,1023],{"type":225,"tag":718,"props":1020,"children":1021},{"style":725},[1022],{"type":230,"value":954},{"type":225,"tag":718,"props":1024,"children":1025},{"style":731},[1026],{"type":230,"value":765},{"type":225,"tag":718,"props":1028,"children":1030},{"class":720,"line":1029},20,[1031,1036,1040,1045,1050],{"type":225,"tag":718,"props":1032,"children":1033},{"style":725},[1034],{"type":230,"value":1035},"        dotnet-version",{"type":225,"tag":718,"props":1037,"children":1038},{"style":731},[1039],{"type":230,"value":734},{"type":225,"tag":718,"props":1041,"children":1042},{"style":731},[1043],{"type":230,"value":1044}," '",{"type":225,"tag":718,"props":1046,"children":1047},{"style":737},[1048],{"type":230,"value":1049},"5.0.x",{"type":225,"tag":718,"props":1051,"children":1052},{"style":731},[1053],{"type":230,"value":1054},"'\n",{"type":225,"tag":718,"props":1056,"children":1058},{"class":720,"line":1057},21,[1059,1063,1068,1072],{"type":225,"tag":718,"props":1060,"children":1061},{"style":731},[1062],{"type":230,"value":931},{"type":225,"tag":718,"props":1064,"children":1065},{"style":725},[1066],{"type":230,"value":1067}," run",{"type":225,"tag":718,"props":1069,"children":1070},{"style":731},[1071],{"type":230,"value":734},{"type":225,"tag":718,"props":1073,"children":1074},{"style":737},[1075],{"type":230,"value":1076}," dotnet run -c Release -- deploy\n",{"type":225,"tag":718,"props":1078,"children":1080},{"class":720,"line":1079},22,[1081,1086],{"type":225,"tag":718,"props":1082,"children":1083},{"style":725},[1084],{"type":230,"value":1085},"      env",{"type":225,"tag":718,"props":1087,"children":1088},{"style":731},[1089],{"type":230,"value":765},{"type":225,"tag":718,"props":1091,"children":1093},{"class":720,"line":1092},23,[1094,1099,1103],{"type":225,"tag":718,"props":1095,"children":1096},{"style":725},[1097],{"type":230,"value":1098},"        NetlifySiteId",{"type":225,"tag":718,"props":1100,"children":1101},{"style":731},[1102],{"type":230,"value":734},{"type":225,"tag":718,"props":1104,"children":1105},{"style":737},[1106],{"type":230,"value":1107}," ${{ secrets.NetlifySiteId }}\n",{"type":225,"tag":718,"props":1109,"children":1111},{"class":720,"line":1110},24,[1112,1117,1121],{"type":225,"tag":718,"props":1113,"children":1114},{"style":725},[1115],{"type":230,"value":1116},"        NetlifyAccessToken",{"type":225,"tag":718,"props":1118,"children":1119},{"style":731},[1120],{"type":230,"value":734},{"type":225,"tag":718,"props":1122,"children":1123},{"style":737},[1124],{"type":230,"value":1125}," ${{ secrets.NetlifyAccessToken }}\n",{"type":225,"tag":226,"props":1127,"children":1128},{},[1129],{"type":230,"value":1130},"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":225,"tag":331,"props":1132,"children":1134},{"id":1133},"hosting-my-website",[1135],{"type":230,"value":1136},"Hosting my website",{"type":225,"tag":226,"props":1138,"children":1139},{},[1140],{"type":230,"value":1141},"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":225,"tag":226,"props":1143,"children":1144},{},[1145],{"type":225,"tag":524,"props":1146,"children":1150},{"alt":1147,"className":1148,"src":1149},"Netlify dashboard the blog.",[528,529],"/posts/images/migrating_blog_4.png",[],{"type":225,"tag":331,"props":1152,"children":1154},{"id":1153},"providing-a-comments-system",[1155],{"type":230,"value":1156},"Providing a comments system",{"type":225,"tag":226,"props":1158,"children":1159},{},[1160,1162,1167],{"type":230,"value":1161},"I was previously using the well-known comments system ",{"type":225,"tag":233,"props":1163,"children":1165},{"href":312,"rel":1164},[237],[1166],{"type":230,"value":316},{"type":230,"value":1168}," 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":225,"tag":226,"props":1170,"children":1171},{},[1172,1174,1181,1183,1189,1191,1196],{"type":230,"value":1173},"And there are many alternatives to Disqus! But one I found very interesting was ",{"type":225,"tag":233,"props":1175,"children":1178},{"href":1176,"rel":1177},"https://utteranc.es/",[237],[1179],{"type":230,"value":1180},"utterances",{"type":230,"value":1182},", a GitHub application that relies on GitHub issues to store blog comments. As the creator of this library explains ",{"type":225,"tag":233,"props":1184,"children":1187},{"href":1185,"rel":1186},"https://danyow.net/using-github-issues-for-blog-comments/",[237],[1188],{"type":230,"value":571},{"type":230,"value":1190},", ",{"type":225,"tag":370,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":230,"value":1180},{"type":230,"value":1197}," 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":225,"tag":255,"props":1199,"children":1200},{},[1201,1206],{"type":225,"tag":259,"props":1202,"children":1203},{},[1204],{"type":230,"value":1205},"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":225,"tag":259,"props":1207,"children":1208},{},[1209],{"type":230,"value":1210},"with comments stored as GitHub issues on my GitHub repository, I have everything at the same place (code, pipelines, and comments)",{"type":225,"tag":226,"props":1212,"children":1213},{},[1214,1216,1221,1223,1230,1232,1237,1239,1246,1248,1253,1255,1260],{"type":230,"value":1215},"But you know what? I finally did not choose ",{"type":225,"tag":370,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":230,"value":1180},{"type":230,"value":1222}," as the comments system for my blog 😀. Instead, I chose to use ",{"type":225,"tag":233,"props":1224,"children":1227},{"href":1225,"rel":1226},"https://giscus.app/",[237],[1228],{"type":230,"value":1229},"giscus",{"type":230,"value":1231}," which is similar to ",{"type":225,"tag":370,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":230,"value":1180},{"type":230,"value":1238}," (in fact it is heavily based on it) but stores comments in ",{"type":225,"tag":233,"props":1240,"children":1243},{"href":1241,"rel":1242},"https://docs.github.com/en/discussions",[237],[1244],{"type":230,"value":1245},"GitHub Discussions",{"type":230,"value":1247},". GitHub Discussions did not exist when ",{"type":225,"tag":370,"props":1249,"children":1251},{"className":1250},[],[1252],{"type":230,"value":1180},{"type":230,"value":1254}," 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":225,"tag":370,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":230,"value":1180},{"type":230,"value":456},{"type":225,"tag":226,"props":1262,"children":1263},{},[1264],{"type":225,"tag":524,"props":1265,"children":1269},{"alt":1266,"className":1267,"src":1268},"Comment on the blog using discuss.",[528,529],"/posts/images/migrating_blog_5.png",[],{"type":225,"tag":226,"props":1271,"children":1272},{},[1273,1275,1280],{"type":230,"value":1274},"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":225,"tag":233,"props":1276,"children":1278},{"href":1225,"rel":1277},[237],[1279],{"type":230,"value":1229},{"type":230,"value":1281},", I am very happy with it.",{"type":225,"tag":378,"props":1283,"children":1284},{"icon":380},[1285],{"type":225,"tag":226,"props":1286,"children":1287},{},[1288,1290,1295,1297,1304,1306,1313],{"type":230,"value":1289},"If you are currently using Disqus and want to migrate to ",{"type":225,"tag":370,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":230,"value":1229},{"type":230,"value":1296}," (while preserving your existing comments), the easiest way I found was to export the Disqus comments in a file, use this ",{"type":225,"tag":233,"props":1298,"children":1301},{"href":1299,"rel":1300},"https://github.com/JuergenGutsch/disqus-to-github-issues",[237],[1302],{"type":230,"value":1303},"tool",{"type":230,"value":1305}," on GitHub to convert them into issues, and manually convert existing issues to discussions on each issue page. You can read this ",{"type":225,"tag":233,"props":1307,"children":1310},{"href":1308,"rel":1309},"https://ljvmiranda921.github.io/notebook/2021/03/26/migrating-from-disqus-to-utterances/",[237],[1311],{"type":230,"value":1312},"blog post",{"type":230,"value":1314}," that partially explains how to do that.",{"type":225,"tag":331,"props":1316,"children":1318},{"id":1317},"managing-my-blog-as-a-project",[1319],{"type":230,"value":1320},"Managing my blog as a project",{"type":225,"tag":226,"props":1322,"children":1323},{},[1324,1326,1333],{"type":230,"value":1325},"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":225,"tag":233,"props":1327,"children":1330},{"href":1328,"rel":1329},"https://github.com/features/issues/",[237],[1331],{"type":230,"value":1332},"GitHub Issues beta",{"type":230,"value":1334}," that allows you to create a \"project\" with a backlog, boards, and issues that can be categorized with custom fields.",{"type":225,"tag":226,"props":1336,"children":1337},{},[1338],{"type":225,"tag":524,"props":1339,"children":1343},{"alt":1340,"className":1341,"src":1342},"Github project for the blog.",[528,529],"/posts/images/migrating_blog_6.png",[],{"type":225,"tag":243,"props":1345,"children":1347},{"id":1346},"summary",[1348],{"type":230,"value":1349},"Summary",{"type":225,"tag":226,"props":1351,"children":1352},{},[1353],{"type":230,"value":1354},"In this article, I talked to you about what changed on my blog, and what my new stack is:",{"type":225,"tag":255,"props":1356,"children":1357},{},[1358,1368,1379,1389,1400,1416],{"type":225,"tag":259,"props":1359,"children":1360},{},[1361,1366],{"type":225,"tag":233,"props":1362,"children":1364},{"href":559,"rel":1363},[237],[1365],{"type":230,"value":216},{"type":230,"value":1367}," a .NET static website generator to generate the website",{"type":225,"tag":259,"props":1369,"children":1370},{},[1371,1377],{"type":225,"tag":233,"props":1372,"children":1375},{"href":1373,"rel":1374},"https://github.com/",[237],[1376],{"type":230,"value":218},{"type":230,"value":1378}," to store the source code on a public (open source) git repository",{"type":225,"tag":259,"props":1380,"children":1381},{},[1382,1388],{"type":225,"tag":233,"props":1383,"children":1386},{"href":1384,"rel":1385},"https://github.com/features/actions",[237],[1387],{"type":230,"value":219},{"type":230,"value":294},{"type":225,"tag":259,"props":1390,"children":1391},{},[1392,1398],{"type":225,"tag":233,"props":1393,"children":1395},{"href":1328,"rel":1394},[237],[1396],{"type":230,"value":1397},"GitHub Issues (beta)",{"type":230,"value":1399}," to manage my ideas for the blog",{"type":225,"tag":259,"props":1401,"children":1402},{},[1403,1408,1409,1414],{"type":225,"tag":233,"props":1404,"children":1406},{"href":1241,"rel":1405},[237],[1407],{"type":230,"value":1245},{"type":230,"value":688},{"type":225,"tag":233,"props":1410,"children":1412},{"href":1225,"rel":1411},[237],[1413],{"type":230,"value":1229},{"type":230,"value":1415}," to allow visitors to comment my articles",{"type":225,"tag":259,"props":1417,"children":1418},{},[1419,1424],{"type":225,"tag":233,"props":1420,"children":1422},{"href":300,"rel":1421},[237],[1423],{"type":230,"value":304},{"type":230,"value":306},{"type":225,"tag":226,"props":1426,"children":1427},{},[1428],{"type":230,"value":1429},"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":225,"tag":378,"props":1431,"children":1432},{"icon":380},[1433],{"type":225,"tag":226,"props":1434,"children":1435},{},[1436,1438,1445],{"type":230,"value":1437},"If you are reading this article from hashnode or dev.to and not directly on my ",{"type":225,"tag":233,"props":1439,"children":1442},{"href":1440,"rel":1441},"https://techwatching.dev",[237],[1443],{"type":230,"value":1444},"blog",{"type":230,"value":1446},", 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":225,"tag":1448,"props":1449,"children":1450},"style",{},[1451],{"type":230,"value":1452},"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":207,"searchDepth":743,"depth":743,"links":1454},[1455,1456,1461,1462,1469],{"id":245,"depth":743,"text":248},{"id":326,"depth":743,"text":329,"children":1457},[1458,1459,1460],{"id":333,"depth":753,"text":336},{"id":459,"depth":753,"text":462},{"id":484,"depth":753,"text":487},{"id":548,"depth":743,"text":551},{"id":588,"depth":743,"text":591,"children":1463},[1464,1465,1466,1467,1468],{"id":599,"depth":753,"text":602},{"id":698,"depth":753,"text":701},{"id":1133,"depth":753,"text":1136},{"id":1153,"depth":753,"text":1156},{"id":1317,"depth":753,"text":1320},{"id":1346,"depth":743,"text":1349},"markdown","content:1.posts:27.migrating-blog.md","content","1.posts/27.migrating-blog.md","md",[1476,1491],{"_path":91,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":90,"description":1477,"lead":1478,"date":1479,"image":1480,"badge":1482,"tags":1484,"_type":1470,"_id":1489,"_source":1472,"_file":1490,"_extension":1474},"Vue Devtools, Visual Studio themes, Git tips, and .NET Conf replays.","A bit of tooling and a bit of git.","2021-11-14T00:00:00.000Z",{"src":1481},"/images/surface_1.jpg",{"label":1483},"Tips",[1485,1486,1487,1488],"tips learned this week","Visual Studio","Vue.js","git","content:1.posts:28.w45-2021-tips-learned-this-week.md","1.posts/28.w45-2021-tips-learned-this-week.md",{"_path":85,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":84,"description":1492,"lead":1493,"date":1494,"image":1495,"badge":1496,"tags":1497,"_type":1470,"_id":1501,"_source":1472,"_file":1502,"_extension":1474},"This week I worked mainly in vs code to do some web development so tips will mostly be about vscode.","vscode, vscode Jest extension, csharp attributes for nullables.","2021-10-18T00:00:00.000Z",{"src":1481},{"label":1483},[1485,1498,1499,1500],"vscode","csharp","jest","content:1.posts:26.w41-2021-tips-learned-this-week.md","1.posts/26.w41-2021-tips-learned-this-week.md",1716749601609]