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.