diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index d3259e7..21fd6d8 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -2,7 +2,11 @@
"permissions": {
"allow": [
"Bash(npx tailwindcss:*)",
- "Bash(npm install)"
+ "Bash(npm install)",
+ "Bash(grep -E \"\\\\.\\(html|css|js|yml|json|scss\\)$\")",
+ "Bash(grep:*)",
+ "Bash(wc -l /Users/andrea/Developer/mrandri19.github.io/_posts/*.md)",
+ "Bash(find:*)"
]
}
}
diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml
index de4a208..0920589 100644
--- a/.github/workflows/jekyll.yml
+++ b/.github/workflows/jekyll.yml
@@ -1,56 +1,34 @@
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
-
-# Sample workflow for building and deploying a Jekyll site to GitHub Pages
-name: Deploy Jekyll site to Pages
+name: Deploy Astro site to Pages
on:
- # Runs on pushes targeting the default branch
push:
branches: ["master"]
-
- # Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
-# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
-# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
-# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
- # Build job
build:
runs-on: ubuntu-latest
steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Setup Ruby
- uses: ruby/setup-ruby@v1
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+ - run: npm ci
+ - run: npx astro build
+ - uses: actions/upload-pages-artifact@v3
with:
- ruby-version: '3.1'
- bundler-cache: true
- - name: Setup Pages
- id: pages
- uses: actions/configure-pages@v4
- - name: Build with Jekyll
- # Outputs to the './_site' directory by default
- run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
- env:
- JEKYLL_ENV: production
- - name: Upload artifact
- # Automatically uploads an artifact from the './_site' directory by default
- uses: actions/upload-pages-artifact@v3
+ path: ./dist
- # Deployment job
deploy:
environment:
name: github-pages
diff --git a/.gitignore b/.gitignore
index 1fc9591..79f3090 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
-_site
-.sass-cache
-.jekyll-metadata
+dist/
+.astro/
+node_modules/
.vscode
-node_modules/
\ No newline at end of file
+_site/
diff --git a/404.html b/404.html
deleted file mode 100644
index c472b4e..0000000
--- a/404.html
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: default
----
-
-
-
-
-
404
-
-
Page not found :(
-
The requested page could not be found.
-
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index feff040..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,9 +0,0 @@
-source "https://rubygems.org"
-
-# This is the default theme for new Jekyll sites. You may change this to anything you like.
-gem "minima", "~> 2.5.1"
-
-# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
-# uncomment the line below. To upgrade, run `bundle update github-pages`.
-gem "github-pages", group: :jekyll_plugins
-
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index 39499a2..0000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,287 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- activesupport (6.0.4.4)
- concurrent-ruby (~> 1.0, >= 1.0.2)
- i18n (>= 0.7, < 2)
- minitest (~> 5.1)
- tzinfo (~> 1.1)
- zeitwerk (~> 2.2, >= 2.2.2)
- addressable (2.8.0)
- public_suffix (>= 2.0.2, < 5.0)
- coffee-script (2.4.1)
- coffee-script-source
- execjs
- coffee-script-source (1.11.1)
- colorator (1.1.0)
- commonmarker (0.17.13)
- ruby-enum (~> 0.5)
- concurrent-ruby (1.1.9)
- dnsruby (1.61.7)
- simpleidn (~> 0.1)
- em-websocket (0.5.3)
- eventmachine (>= 0.12.9)
- http_parser.rb (~> 0)
- ethon (0.15.0)
- ffi (>= 1.15.0)
- eventmachine (1.2.7)
- execjs (2.8.1)
- faraday (1.9.3)
- faraday-em_http (~> 1.0)
- faraday-em_synchrony (~> 1.0)
- faraday-excon (~> 1.1)
- faraday-httpclient (~> 1.0)
- faraday-multipart (~> 1.0)
- faraday-net_http (~> 1.0)
- faraday-net_http_persistent (~> 1.0)
- faraday-patron (~> 1.0)
- faraday-rack (~> 1.0)
- faraday-retry (~> 1.0)
- ruby2_keywords (>= 0.0.4)
- faraday-em_http (1.0.0)
- faraday-em_synchrony (1.0.0)
- faraday-excon (1.1.0)
- faraday-httpclient (1.0.1)
- faraday-multipart (1.0.3)
- multipart-post (>= 1.2, < 3)
- faraday-net_http (1.0.1)
- faraday-net_http_persistent (1.2.0)
- faraday-patron (1.0.0)
- faraday-rack (1.0.0)
- faraday-retry (1.0.3)
- ffi (1.15.5)
- forwardable-extended (2.6.0)
- gemoji (3.0.1)
- github-pages (223)
- github-pages-health-check (= 1.17.9)
- jekyll (= 3.9.0)
- jekyll-avatar (= 0.7.0)
- jekyll-coffeescript (= 1.1.1)
- jekyll-commonmark-ghpages (= 0.1.6)
- jekyll-default-layout (= 0.1.4)
- jekyll-feed (= 0.15.1)
- jekyll-gist (= 1.5.0)
- jekyll-github-metadata (= 2.13.0)
- jekyll-include-cache (= 0.2.1)
- jekyll-mentions (= 1.6.0)
- jekyll-optional-front-matter (= 0.3.2)
- jekyll-paginate (= 1.1.0)
- jekyll-readme-index (= 0.3.0)
- jekyll-redirect-from (= 0.16.0)
- jekyll-relative-links (= 0.6.1)
- jekyll-remote-theme (= 0.4.3)
- jekyll-sass-converter (= 1.5.2)
- jekyll-seo-tag (= 2.7.1)
- jekyll-sitemap (= 1.4.0)
- jekyll-swiss (= 1.0.0)
- jekyll-theme-architect (= 0.2.0)
- jekyll-theme-cayman (= 0.2.0)
- jekyll-theme-dinky (= 0.2.0)
- jekyll-theme-hacker (= 0.2.0)
- jekyll-theme-leap-day (= 0.2.0)
- jekyll-theme-merlot (= 0.2.0)
- jekyll-theme-midnight (= 0.2.0)
- jekyll-theme-minimal (= 0.2.0)
- jekyll-theme-modernist (= 0.2.0)
- jekyll-theme-primer (= 0.6.0)
- jekyll-theme-slate (= 0.2.0)
- jekyll-theme-tactile (= 0.2.0)
- jekyll-theme-time-machine (= 0.2.0)
- jekyll-titles-from-headings (= 0.5.3)
- jemoji (= 0.12.0)
- kramdown (= 2.3.1)
- kramdown-parser-gfm (= 1.1.0)
- liquid (= 4.0.3)
- mercenary (~> 0.3)
- minima (= 2.5.1)
- nokogiri (>= 1.12.5, < 2.0)
- rouge (= 3.26.0)
- terminal-table (~> 1.4)
- github-pages-health-check (1.17.9)
- addressable (~> 2.3)
- dnsruby (~> 1.60)
- octokit (~> 4.0)
- public_suffix (>= 3.0, < 5.0)
- typhoeus (~> 1.3)
- html-pipeline (2.14.0)
- activesupport (>= 2)
- nokogiri (>= 1.4)
- http_parser.rb (0.8.0)
- i18n (0.9.5)
- concurrent-ruby (~> 1.0)
- jekyll (3.9.0)
- addressable (~> 2.4)
- colorator (~> 1.0)
- em-websocket (~> 0.5)
- i18n (~> 0.7)
- jekyll-sass-converter (~> 1.0)
- jekyll-watch (~> 2.0)
- kramdown (>= 1.17, < 3)
- liquid (~> 4.0)
- mercenary (~> 0.3.3)
- pathutil (~> 0.9)
- rouge (>= 1.7, < 4)
- safe_yaml (~> 1.0)
- jekyll-avatar (0.7.0)
- jekyll (>= 3.0, < 5.0)
- jekyll-coffeescript (1.1.1)
- coffee-script (~> 2.2)
- coffee-script-source (~> 1.11.1)
- jekyll-commonmark (1.3.1)
- commonmarker (~> 0.14)
- jekyll (>= 3.7, < 5.0)
- jekyll-commonmark-ghpages (0.1.6)
- commonmarker (~> 0.17.6)
- jekyll-commonmark (~> 1.2)
- rouge (>= 2.0, < 4.0)
- jekyll-default-layout (0.1.4)
- jekyll (~> 3.0)
- jekyll-feed (0.15.1)
- jekyll (>= 3.7, < 5.0)
- jekyll-gist (1.5.0)
- octokit (~> 4.2)
- jekyll-github-metadata (2.13.0)
- jekyll (>= 3.4, < 5.0)
- octokit (~> 4.0, != 4.4.0)
- jekyll-include-cache (0.2.1)
- jekyll (>= 3.7, < 5.0)
- jekyll-mentions (1.6.0)
- html-pipeline (~> 2.3)
- jekyll (>= 3.7, < 5.0)
- jekyll-optional-front-matter (0.3.2)
- jekyll (>= 3.0, < 5.0)
- jekyll-paginate (1.1.0)
- jekyll-readme-index (0.3.0)
- jekyll (>= 3.0, < 5.0)
- jekyll-redirect-from (0.16.0)
- jekyll (>= 3.3, < 5.0)
- jekyll-relative-links (0.6.1)
- jekyll (>= 3.3, < 5.0)
- jekyll-remote-theme (0.4.3)
- addressable (~> 2.0)
- jekyll (>= 3.5, < 5.0)
- jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0)
- rubyzip (>= 1.3.0, < 3.0)
- jekyll-sass-converter (1.5.2)
- sass (~> 3.4)
- jekyll-seo-tag (2.7.1)
- jekyll (>= 3.8, < 5.0)
- jekyll-sitemap (1.4.0)
- jekyll (>= 3.7, < 5.0)
- jekyll-swiss (1.0.0)
- jekyll-theme-architect (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-cayman (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-dinky (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-hacker (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-leap-day (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-merlot (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-midnight (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-minimal (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-modernist (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-primer (0.6.0)
- jekyll (> 3.5, < 5.0)
- jekyll-github-metadata (~> 2.9)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-slate (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-tactile (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-theme-time-machine (0.2.0)
- jekyll (> 3.5, < 5.0)
- jekyll-seo-tag (~> 2.0)
- jekyll-titles-from-headings (0.5.3)
- jekyll (>= 3.3, < 5.0)
- jekyll-watch (2.2.1)
- listen (~> 3.0)
- jemoji (0.12.0)
- gemoji (~> 3.0)
- html-pipeline (~> 2.2)
- jekyll (>= 3.0, < 5.0)
- kramdown (2.3.1)
- rexml
- kramdown-parser-gfm (1.1.0)
- kramdown (~> 2.0)
- liquid (4.0.3)
- listen (3.7.0)
- rb-fsevent (~> 0.10, >= 0.10.3)
- rb-inotify (~> 0.9, >= 0.9.10)
- mercenary (0.3.6)
- mini_portile2 (2.8.0)
- minima (2.5.1)
- jekyll (>= 3.5, < 5.0)
- jekyll-feed (~> 0.9)
- jekyll-seo-tag (~> 2.1)
- minitest (5.15.0)
- multipart-post (2.1.1)
- nokogiri (1.13.3)
- mini_portile2 (~> 2.8.0)
- racc (~> 1.4)
- octokit (4.21.0)
- faraday (>= 0.9)
- sawyer (~> 0.8.0, >= 0.5.3)
- pathutil (0.16.2)
- forwardable-extended (~> 2.6)
- public_suffix (4.0.6)
- racc (1.6.0)
- rb-fsevent (0.11.0)
- rb-inotify (0.10.1)
- ffi (~> 1.0)
- rexml (3.2.5)
- rouge (3.26.0)
- ruby-enum (0.9.0)
- i18n
- ruby2_keywords (0.0.5)
- rubyzip (2.3.2)
- safe_yaml (1.0.5)
- sass (3.7.4)
- sass-listen (~> 4.0.0)
- sass-listen (4.0.0)
- rb-fsevent (~> 0.9, >= 0.9.4)
- rb-inotify (~> 0.9, >= 0.9.7)
- sawyer (0.8.2)
- addressable (>= 2.3.5)
- faraday (> 0.8, < 2.0)
- simpleidn (0.2.1)
- unf (~> 0.1.4)
- terminal-table (1.8.0)
- unicode-display_width (~> 1.1, >= 1.1.1)
- thread_safe (0.3.6)
- typhoeus (1.4.0)
- ethon (>= 0.9.0)
- tzinfo (1.2.9)
- thread_safe (~> 0.1)
- unf (0.1.4)
- unf_ext
- unf_ext (0.0.8)
- unicode-display_width (1.8.0)
- zeitwerk (2.5.3)
-
-PLATFORMS
- ruby
-
-DEPENDENCIES
- github-pages
- minima (~> 2.5.1)
-
-BUNDLED WITH
- 2.1.4
diff --git a/README.md b/README.md
index fec3089..2ae7508 100644
--- a/README.md
+++ b/README.md
@@ -2,32 +2,21 @@
## Building
-### Blog
+### Development
```shell
-# Use rvm to install ruby2.7.3 (needed for jekyll 3.9, which is required by github-pages 219)
-rvm install 2.7.3
-# Set ruby2.7.3 as default
-rvm --default 2.7.3
-# Use ruby2.7.3 in this shell
-rvm use 2.7.3
-
-cd mrandri19.github.io
-# Download dependencies described in Gemfile and update Gemfile.lock
-bundle install
-# Serve the website, reloading on changes
-bundle exec jekyll serve --livereload
+npm install
+npm run dev
```
-### Homepage
+### Production build
```shell
-# install tailwindcss (needed only once)
-npm i tailwindcss
-# rebuild the css on changes
-npx tailwindcss -i index-style.css -o index-style.out.css --watch
+npm run build
```
+Output goes to `./dist/`.
+
### Converting notebooks to markdown
```shell
@@ -39,21 +28,3 @@ pandoc \
--extract-media=assets/images/introduction-to-variational-inference \
05-introduction-to-variational-inference.ipynb
```
-
-### Installing ruby and running bundle on ARM64 macs
-
-```shell
-brew install openssl@1.1
-
-export PATH="$(brew --prefix)/opt/openssl@1.1/bin:$PATH"
-export LDFLAGS="-L$(brew --prefix)/opt/openssl@1.1/lib"
-export CPPFLAGS="-I$(brew --prefix)/opt/openssl@1.1/include"
-export PKG_CONFIG_PATH="$(brew --prefix)/opt/openssl@1.1/lib/pkgconfig"
-
-rvm autolibs disable
-
-export RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC
-export optflags="-Wno-error=implicit-function-declaration"
-
-rvm install 2.7.3 --with-openssl-dir=$(brew --prefix)/opt/openssl@1.1
-```
diff --git a/WORK.md b/WORK.md
new file mode 100644
index 0000000..56cae73
--- /dev/null
+++ b/WORK.md
@@ -0,0 +1,81 @@
+# Jekyll → Astro Migration
+
+Executed the migration plan at `.claude/plans/indexed-weaving-wreath.md` on 2026-04-06.
+
+## What was done
+
+### Step 1 — Astro scaffold
+
+- Created `astro.config.mjs` with static output, `build.format: 'file'`, Shiki dual-theme (catppuccin-latte/catppuccin-mocha), remark-math + rehype-katex plugins, and Tailwind integration
+- Created `tailwind.config.mjs` (replaces `tailwind.config.js`) with updated content paths, `darkMode: 'media'`, and `@tailwindcss/typography` plugin
+- Created `tsconfig.json` extending `astro/tsconfigs/strict`
+- Updated `package.json` with Astro and all dependencies (`astro`, `@astrojs/tailwind`, `@astrojs/rss`, `@tailwindcss/typography`, `remark-math`, `rehype-katex`, `katex`)
+- Created `src/content/config.ts` — content collection schema (title, author?, draft?)
+- Created `src/styles/global.css` — Tailwind directives, Source Serif Pro `@font-face`, Shiki dark/light CSS variable overrides
+- Moved assets to `public/`: `assets/images/`, `assets/js/`, `assets/pdf/`, `index-images/`, `Source_Serif_Pro/`, `Source_Sans_Pro/`, favicons, `manifest.json`, `site.webmanifest`, `hes_my_quant.pdf`
+
+### Step 2 — Layouts
+
+- `src/layouts/BaseLayout.astro` — shared HTML shell with title prop, favicons, GA4 analytics, dark mode body classes (`bg-white dark:bg-gray-900`)
+- `src/layouts/PostLayout.astro` — extends BaseLayout; blog header nav (Blog/Homepage links), KaTeX CSS link in head, `` wrapper, post title and formatted date
+
+### Step 3 — Homepage
+
+- `src/pages/index.astro` — identical HTML content to the original `index.html`, using BaseLayout for the shell. Homepage-specific CSS (section margins, clearfix, bullet styling) moved to an Astro `
diff --git a/src/styles/global.css b/src/styles/global.css
new file mode 100644
index 0000000..5cfeee0
--- /dev/null
+++ b/src/styles/global.css
@@ -0,0 +1,27 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@font-face {
+ font-family: "Source Serif Pro";
+ src: url('/Source_Serif_Pro/SourceSerif4-Regular.ttf') format('truetype');
+}
+
+/* Shiki dual-theme: light by default, dark via media query */
+.astro-code,
+.astro-code span {
+ color: var(--shiki-light) !important;
+ background-color: var(--shiki-light-bg) !important;
+ font-style: var(--shiki-light-font-style) !important;
+ font-weight: var(--shiki-light-font-weight) !important;
+}
+
+@media (prefers-color-scheme: dark) {
+ .astro-code,
+ .astro-code span {
+ color: var(--shiki-dark) !important;
+ background-color: var(--shiki-dark-bg) !important;
+ font-style: var(--shiki-dark-font-style) !important;
+ font-weight: var(--shiki-dark-font-weight) !important;
+ }
+}
diff --git a/tailwind.config.js b/tailwind.config.mjs
similarity index 78%
rename from tailwind.config.js
rename to tailwind.config.mjs
index f340f93..c6f42a1 100644
--- a/tailwind.config.js
+++ b/tailwind.config.mjs
@@ -1,9 +1,10 @@
+import typography from '@tailwindcss/typography';
+
const scalingfactor = 1.2;
-module.exports = {
- content: [
- "index.html",
- "index-style.css"
- ],
+
+export default {
+ content: ['./src/**/*.{astro,html,md,mdx}'],
+ darkMode: 'media',
theme: {
extend: {},
fontSize: {
@@ -21,5 +22,5 @@ module.exports = {
'serif': "'Source Serif Pro', serif"
}
},
- plugins: [],
+ plugins: [typography],
}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..bcbf8b5
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,3 @@
+{
+ "extends": "astro/tsconfigs/strict"
+}