Hello, World

Contents

This is a placeholder post — delete it once you’ve published something real. It’s here so the site has at least one article to render while you’re setting things up, and to show the frontmatter format new posts should follow.

Writing a new post

Copy this file, rename it (the filename becomes the URL, e.g. my-post.md → /post/my-post/), and fill in the frontmatter:

---
title: "Post title"
description: "One or two sentences, used for the excerpt and meta description."
pubDate: 2026-08-25
tags: ["Web Security", "CTF"]
draft: false
---

Only title, description, and pubDate are required. tags defaults to an empty list (shown under “Uncategorized” in the sidebar). Set draft: true while you’re still writing — draft posts never get built or linked anywhere.

Bilingual posts

If a post should also have a translation, add a sibling file whose name ends in .en — this file is the English counterpart of hello-world.md (also readable at the Traditional Chinese version), with lang: "en" in its frontmatter. The two files are paired up automatically by filename (strip the trailing .en to get the shared key): the Traditional Chinese version is the default locale and lives at /post/hello-world/ (no prefix), the English version lives at /en/post/hello-world/. The language switch in the header links straight to a post’s translation when one exists, and falls back to the other language’s article index (with a small notice at the top of the post) when it doesn’t.

Code blocks

Fenced code blocks are syntax-highlighted at build time by Astro’s built-in Shiki integration — no extra dependency, no client-side JavaScript:

def exploit(target):
    # send payload
    r = requests.get(f"{target}/vuln?id=1")
    return r.text

That’s it

Headings (##, ###) automatically show up in the table of contents at the top of the article once you have two or more of them.