Personal blog and portfolio built with Astro, based on the Astro Micro theme. Content is written in Markdown/MDX and deployed automatically on push to main.
Live site: https://maujogue.fr
npm install
npm run devOpen http://localhost:4321 to preview locally. The dev server hot-reloads when you edit content or source files.
Other useful commands:
| Command | Description |
|---|---|
npm run dev |
Start the local dev server |
npm run build |
Type-check and build the static site to dist/ |
npm run preview |
Serve the production build locally |
-
Create a new folder under
src/content/blog/with anindex.md(orindex.mdx) file inside it. The folder name becomes the post URL slug.src/content/blog/My new post/index.md → https://maujogue.fr/blog/My new post -
Add frontmatter at the top of the file:
--- title: "Post title" description: "Short summary shown in listings and SEO" date: 2026-07-03 tags: ["tag-one", "tag-two"] # optional draft: false # set to true to hide from the site ---
-
Write your content below the frontmatter in Markdown. Headings (
##,###…) automatically generate a table of contents on the post page. -
Preview locally with
npm run dev, then commit and push (see Deploying).
Tips:
- Set
draft: trueto work on a post without publishing it. Drafts are excluded from the blog index, homepage, RSS feed, and search index. - Tags appear on the post and link to
/tags/<tag>. They also show up in the tag cloud on the blog page. - You can use
.mdxinstead of.mdif you need React/JSX components in a post.
Edit src/data/now.ts: set month ("YYYY-MM", shown as "octobre 2026" / "October 2026") and edit the items. Each item has a label and a text in fr and en, plus an optional href (e.g. "/tags/hackathon"; the /en prefix is added automatically).
Add an object to TIMELINE in src/data/timeline.ts, at its chronological place, oldest first (usually the end). The page shows them reversed, newest first:
{
date: { fr: "janv. 2027", en: "Jan 2027" },
what: { fr: "…", en: "…" },
takeaway: { fr: "…", en: "…" },
win: true, // optional: hackathon win, shows 🏆
href: "/tags/hackathon", // optional: links the "what" line
},Projects are currently unpublished: the entries are
draft: trueand the pages live insrc/pages/[...lang]/_projects/(Astro skips folders starting with_). To bring them back, rename the folder toprojects, setdraft: false, and add the link back inHeader.astro.
-
Create a folder under
src/content/projects/with anindex.mdfile:src/content/projects/my-project/index.md → https://maujogue.fr/projects/my-project -
Add frontmatter:
--- title: "Project name" description: "One-line summary" date: 2026-07-03 repoURL: "https://github.com/maujogue/my-project" # optional demoURL: "https://demo.example.com" # optional draft: false ---
-
Write the project write-up in Markdown below the frontmatter.
Projects appear on the homepage (most recent first) and on /projects. repoURL and demoURL render as links on the project page when provided.
This is the main settings file. Edit it to change:
- Site identity:
SITE.TITLE,SITE.DESCRIPTION,SITE.EMAIL - Homepage limits:
NUM_POSTS_ON_HOMEPAGE,NUM_PROJECTS_ON_HOMEPAGE - Page titles/descriptions:
HOME,BLOG,PROJECTS - Social links:
SOCIALSarray (GitHub, LinkedIn, etc.)
Set the canonical URL used for the sitemap, RSS feed, and Open Graph tags:
site: "https://maujogue.fr",The "Hey! 🔬" section and "Let's Connect" copy live here. Update the paragraphs to change what visitors read on the landing page.
Defines the required/optional frontmatter fields for blog posts and projects. Only edit this if you want to add new metadata fields (e.g. author, image).
Deployment is fully automated via GitHub Actions (.github/workflows/deploy.yml).
Workflow: push to main → build → rsync dist/ to your server over SSH.
git add .
git commit -m "Add post: Why starting is hard"
git push origin mainGitHub Actions will build and deploy within a few minutes. You can also trigger a manual deploy from the Actions tab → Deploy Astro to Server → Run workflow.
These must be configured in your repo settings (Settings → Secrets and variables → Actions):
| Secret | Description |
|---|---|
SSH_PRIVATE_KEY |
Private key for SSH access to the deploy server |
DEPLOY_HOST |
Server hostname or IP |
DEPLOY_USER |
SSH username |
DEPLOY_PATH |
Remote directory where dist/ is synced (e.g. /var/www/maujogue.fr) |
SSH_PORT |
(optional) SSH port, defaults to 22 |
NODE_VERSION |
(optional) Node.js version, defaults to 20 |
To build locally and inspect the output before pushing:
npm run build
npm run preview # serve dist/ at http://localhost:4321src/
├── consts.ts # Site settings, social links
├── content/
│ ├── blog/ # Blog posts (one folder per post)
│ └── projects/ # Project write-ups
├── pages/
│ ├── index.astro # Homepage
│ ├── blog/ # Blog listing & post pages
│ └── projects/ # Projects listing & detail pages
└── components/ # Reusable UI (header, footer, etc.)
- Search — powered by Pagefind, built automatically at
npm run build. Use the search button in the header. - RSS feed — available at
/rss.xml - Sitemap — generated automatically for SEO
- Dark/light mode — follows system preference, toggle in the footer
- Reading time — shown on blog posts and projects
- Table of contents — auto-generated from headings on long posts
- Tags — filter posts by tag at
/tags/<tag>
- Use
>for blockquotes,```for code blocks (with syntax highlighting), and standard Markdown for everything else. - Images go in
public/and are referenced as/image-name.pngin your Markdown. - Folder names with spaces work fine (e.g.
Why starting is hard) but kebab-case (why-starting-is-hard) produces cleaner URLs.
Built on Astro Micro, a fork of Astro Nano. See the Micro changelog for upstream feature details.