A minimal, fast, light/dark personal blog for Riccardo "Pappol" Parola, built with
Astro and deployed free on GitHub Pages at https://pappol.github.io.
Public to read, only you can edit (you own the repo). Articles are plain Markdown.
- Home (
/) — photo, short bio, social links, 3 most-recent posts, GDPR email signup. - Blog (
/blog) — every article, newest first. - About (
/about). - Privacy (
/privacy) — GDPR-compliant policy for the newsletter. - Plus a custom 404, an RSS feed (
/rss.xml) and a sitemap.
npm install
npm run dev # http://localhost:4321
npm run build # output to ./dist
npm run preview # preview the production buildRequires Node 18+ (Node 20/22 recommended).
- Create the repo on your account, named exactly
Pappol.github.io(a user site → served at the domain root). - Push this folder to the
mainbranch:git init git add . git commit -m "Initial blog" git branch -M main git remote add origin https://github.com/Pappol/Pappol.github.io.git git push -u origin main
- On GitHub: Settings → Pages → Build and deployment → Source = GitHub Actions.
- The included workflow (
.github/workflows/deploy.yml) builds and deploys on every push tomain. First deploy takes ~1–2 min, then the site is live athttps://pappol.github.io.
Create a Markdown file in src/content/blog/, e.g. my-post.md:
---
title: "My post title"
description: "One-line summary used on cards and meta tags."
pubDate: 2026-06-01
tags: ["ai", "data"]
# draft: true # uncomment to hide from the site
---
Your content here…The URL becomes /blog/my-post/. The home page automatically shows the 3 newest.
The <MusicEmbed> component drops a Spotify player into a post, framed to match
the site (your border + radius, auto-following light/dark). To use a component the
post must be MDX — save the file as .mdx instead of .md (everything else
about the frontmatter is identical; existing .md posts are unaffected).
---
title: "Songs I wrote this to"
description: "A short note with a soundtrack."
pubDate: 2026-06-24
---
import MusicEmbed from '../../components/MusicEmbed.astro';
Here's the track that wouldn't leave my head:
<MusicEmbed url="https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT" caption="Bohemian Rhapsody — Queen" />url(required) — any Spotify share link or URI: atrack,album,playlist,artist,show, orepisode. In Spotify, use Share → Copy link.caption(optional) — small line of text under the player.compact(optional, defaulttrue) — slim one-row player; setcompact={false}for the tall artwork + tracklist player.theme(optional, default"auto") —autofollows the site theme; force with"dark"/"light".
- Your photo — drop it in
public/images/and update thesrcinsrc/pages/index.astro(look forprofile-placeholder.svg). Update the About page too. - Home bio —
src/pages/index.astro(hero-bio). - About —
src/pages/about.md(photo + hobbies placeholders). - Privacy policy —
src/pages/privacy.md(set the "Last updated" date; swap the Gmail for a dedicated address if you like).
The signup form is built GDPR-first: an explicit, non-pre-ticked consent checkbox, a link to the privacy policy, and copy that promises double opt-in. Out of the box it runs in demo mode (shows a confirmation, sends nothing).
To go live, use an EU-based, GDPR-friendly provider — MailerLite is recommended (EU company, free tier, easy double opt-in):
- In MailerLite, create a subscribe form with double opt-in ON.
- Copy its POST endpoint into the
ACTIONconstant at the top ofsrc/components/EmailSignup.astro. - Make sure the "Last updated" date and provider name in
src/pages/privacy.mdmatch reality.
aweber.com/permission.htm is AWeber's own anti-spam permission reminder — it is
not a privacy policy you can adopt as your own, and linking to it does not make
you GDPR-compliant. As an EU resident you must publish your own privacy notice (the
one in src/pages/privacy.md) and obtain explicit consent. AWeber is also US-based,
so using it adds an international-data-transfer obligation (Standard Contractual Clauses).
That's why MailerLite (EU) is the simpler, cleaner choice — but if you do use AWeber, the
privacy policy already includes the SCC transfer wording.
The privacy policy is a solid template, not legal advice — give it a final read before publishing.