About this site
This site is my digital presence and digital garden in the interwebs.
The blog section contains mainly long-form articles. As I tinker with different technologies, I write down the steps and process I went through to get something working. Therefore they mostly serve the purpose of helping me remember how I did something in case I want to do it again in the future. I also post these in hopes that they may be of help to others trying to solve similar problems.
The knowledge-base contains a collection of wiki articles, snippets, and library. Wiki articles are documents on certain topics. They intend to connect information and knowledge I encounter as part of personal investigations or randomly stumble upon. Snippets are random scripts and code snippets. The library is a list of books I'm currently reading or have read.
The main feed is like a microblog with content ordered in reverse chronological order. It collects in a single place snippets containing notes, photos, videos, and other types of content. The replies feed contains replies and interactions with other pages and supports Webmentions. The feeds take inspiration from IndieWeb posts.
In addition to the feeds, there's also the linkblog which acts as my bookmark / read-it-later service as I find interesting websites. The blogroll contains a collection of blogs I follow and the podroll is a collection of podcasts I listen to.
How this site is built
Just how exactly is this site built?
In a gist, it's static web site built with .NET and hosted on Azure.
Static Site Generator
I built the generator for this website myself. It's a .NET 6 console application built with F#. The application depends on a few libraries:
- Markdig - Parse markdown content.
- Giraffe.ViewEngine - Develop statically typed HTML using F#.
- YamlDotNet - Parse markdown file front-matter formatted in YAML. The front matter provides details such as the publishing date, page title, and post type.
The main tool for developing the static site generator as well as to author posts is Visual Studio Code. It gives me the flexibility of a lightweight text editor for authoring with rich features like built-in markdown preview. At the same time, I can use the debugger and the Ionide extension for writing and debugging F# code.
In cases when I want to quickly make updates, mainly to articles, I use github.dev. I get the same Visual Studio Code editing environment in the browser. Therefore I can author and update content from anywhere.
Although I can manually run the console application to generate the site, I have automated the publishing process using GitHub actions.
The GitHub action performs the following steps.
- Logs in to Azure
- Installs .NET on the build agent
- Builds .NET console application
- Runs .NET console application
- Uploads generated site (mostly HTML files) up to Azure Blob Storage.
- Clears CDN cache and propagates the latest changes.
The code for this website is hosted on GitHub. You can find the source code in the lqdev/luisquintanilla.me repository. Having version control for both authored content as well as the static site generator makes it easy to safely apply new changes as well as roll back changes in case something breaks.
The code is hosted on Azure. Specifically I use Azure Static Web Apps. That service is built on Azure Blob Storage which hosts the static files generated by the static site generator. In addition, I use Azure CDN to distribute my site.
The main form of syndication for content on this site is RSS. I have several feeds that are generally organized based on the type of content. The RSS files are generated as part of the build process by the static site generator.
An additional syndication practice I follow for this site is Publish (on your) Own Site, Syndicate Everywhere (POSSE). I try to have my site be the single source of truth and home for my content. From there, I can share with other applications and services. I use Azure Logic Apps for my main feed to automate syndication to Twitter and Mastodon. The Azure Logic App constantly polls the main feed's RSS for new changes. Then, it posts them on Twitter and Mastodon.
This website accepts Webmentions on all pages. It also sends Webmentions form the Responses feed (replies,reshares,stars,bookmarks).
Webmentions are send as part of the site build and publish process. To help with sending Webmentions, the WebmentionFs library is used.
To accept Webmentions, I have an Azure Functions endpoint which accepts POST requests and stores them in an Azure Tables database. To help with validation and accepting Webmentions, I use the WebmentionFs library. For more details, see Accept Webmentions using F#, Azure Functions, and RSS.