felipefialho.com
My personal website and blog, writing about front-end since 2013.
Posts are written in Portuguese, with some translated to English under /en/. The site is static, fast and mostly plain HTML and CSS.
Stack
- Astro 7 with TypeScript and plain CSS
- Markdown processed by Sätteri, with local plugins in
src/plugins(embeds, image attributes, external links, heading anchors, reading time, in-article ads) - Pagefind for search
- Build-time Open Graph cards with satori and sharp
- LGPD consent banner with Consent Mode v2: Google Analytics 4 loads only after consent, AdSense is lazy-loaded and personalized only with consent
- Netlify for hosting, with the Image CDN serving legacy post images
Getting Started
Requires the Node.js version in .nvmrc and pnpm.
# install dependencies
$ pnpm install
Run the project
$ pnpm dev
Tasks
pnpm dev: start the dev serverpnpm build: type-check, build todistand index the site for searchpnpm preview: serve the production build locallypnpm lint: lint scripts and stylespnpm lint:fix: fix lint errors automatically
dist. Run pnpm build && pnpm preview to try it.
Writing a post
Create a file at content/posts/YYYY-MM-DD-slug.md, or a folder at content/posts/YYYY-MM-DD-slug/index.md to keep images next to the post. The URL drops the date prefix, so both become /blog/slug/.
---
title: Post title
date: 2026-10-01
description: One sentence used in listings and meta tags.
tags: [css, front-end]
draft: false
---
tagsanddraftare optional,draftdefaults tofalse- English translations go in
content/posts-en/with the same frontmatter plustranslationOf:
Fonts
Mona Sans is the only typeface, subset to Latin with its variable axes pinned. To regenerate src/assets/fonts, run scripts/subset-fonts.sh. It needs fonttools and brotli (pip install fonttools brotli).
License
Source code: MIT, see LICENSE.
Posts, pages and their images in content/: © Felipe Fialho, all rights reserved, see content/LICENSE.md.