From 79e1f6cc84f95aba834f4dbb9206781c52379a70 Mon Sep 17 00:00:00 2001
From: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
Date: Fri, 6 Mar 2026 03:48:19 +0700
Subject: [PATCH 1/4] docs: add language curricula guide
---
.../how-to-work-on-language-curricula.mdx | 105 ++++++++++++++++++
src/sidebar.ts | 1 +
2 files changed, 106 insertions(+)
create mode 100644 src/content/docs/how-to-work-on-language-curricula.mdx
diff --git a/src/content/docs/how-to-work-on-language-curricula.mdx b/src/content/docs/how-to-work-on-language-curricula.mdx
new file mode 100644
index 00000000..ae55bb6d
--- /dev/null
+++ b/src/content/docs/how-to-work-on-language-curricula.mdx
@@ -0,0 +1,105 @@
+---
+title: How to Work on Language Curricula
+sidebar:
+ label: Work on Language Curricula
+---
+
+import { Steps } from '@astrojs/starlight/components';
+import { Aside } from '@astrojs/starlight/components';
+
+## Using Challenge Helper Scripts
+
+All commands must be run from the `tools/challenge-helper-scripts` directory. To navigate to this directory, run:
+
+```bash
+cd tools/challenge-helper-scripts
+```
+
+## Creating a New Block
+
+To create a new block, run:
+
+```bash
+pnpm run create-language-block
+```
+
+The script walks you through a series of prompts:
+
+| Prompt | What to provide |
+| ----------------- | ------------------------------------------------------------ |
+| Super block | The super block this block belongs to (e.g., A2 English) |
+| Block label | The type of block: `practice`, `learn`, `quiz`, etc. |
+| Block dashed name | A unique kebab-case identifier for the block |
+| Block title | A human-readable title (defaults to the dashed name) |
+| Help category | The support category for this block's forum posts |
+| Block layout | The visual layout used to display challenges |
+| Chapter | The chapter this block belongs to (you can create a new one) |
+| Module | The module within that chapter (you can create a new one) |
+| Position | Where in the module this block appears (1-based) |
+
+### Block Naming
+
+Block names for language curricula follow an automatic prefix based on the super block and block label. For example, a `learn` block in A2 English gets the prefix `en-a2-learn-`. When prompted, enter only the unique part of the name after the prefix.
+
+
+
+### Creating a New Chapter
+
+Chapters are selected from a list during the block creation flow. If the chapter you need doesn't exist yet:
+
+- Run `pnpm run create-language-block`
+- Choose **-- Create new chapter --** when prompted
+
+You will then be asked for:
+
+| Prompt | What to provide |
+| ------------------- | -------------------------------------------------------- |
+| Chapter dashed name | A unique kebab-case identifier (e.g., `getting-started`) |
+| Chapter title | A human-readable display title (e.g., `Getting Started`) |
+
+The chapter is created and the new block is placed inside it.
+
+### Creating a New Module
+
+Modules are selected from a list scoped to the chosen chapter during the block creation flow. If the module you need doesn't exist yet:
+
+- Run `pnpm run create-language-block`
+- Choose **-- Create new module --** when prompted
+
+You will be asked for:
+
+| Prompt | What to provide |
+| ------------------ | -------------------------------------------------------------------- |
+| Module dashed name | A unique kebab-case identifier (e.g., `greetings-and-introductions`) |
+| Module title | A human-readable display title (e.g., `Greetings and Introductions`) |
+
+## Renaming a Block
+
+The `rename-block` script renames an existing block and updates every file that references it, including the block metadata, the challenge directory, all superblock structures, and the locale intro file.
+
+To rename a block, run:
+
+```bash
+pnpm run rename-block
+```
+
+The script prompts you for:
+
+| Prompt | What to provide |
+| --------------------- | --------------------------------------------------------- |
+| Old block dashed name | The current dashed name of the block (must already exist) |
+| New display name | The new human-readable title for the block |
+| New dashed name | The new kebab-case identifier for the block |
+
+## Publishing New Content
+
+When a chapter, module, or block is created via the script, it is hidden by default, meaning it won't be visible on the production site until you choose to publish it.
+
+When you're ready to publish:
+
+- For blocks, change the `isUpcomingChange` property to `false` in the block's structure file (located in `curriculum/structure/blocks/`).
+- For chapters and modules, remove the `comingSoon` property from the super block structure file (located in `curriculum/structure/superblocks/`).
diff --git a/src/sidebar.ts b/src/sidebar.ts
index 1ba38b58..f457b15b 100644
--- a/src/sidebar.ts
+++ b/src/sidebar.ts
@@ -17,6 +17,7 @@ const sidebar = [
'how-to-work-on-workshops',
'how-to-setup-freecodecamp-mobile-app-locally',
'how-to-work-on-localized-client-webapp',
+ 'how-to-work-on-language-curricula',
'how-to-add-playwright-tests',
'how-to-work-on-the-docs-site',
'how-to-open-a-pull-request',
From 492734cb0ad5ccebc4afe989ebe4040b29025e8c Mon Sep 17 00:00:00 2001
From: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
Date: Mon, 9 Mar 2026 19:29:07 +0700
Subject: [PATCH 2/4] document more scripts and add CJK writing convention
---
.../how-to-work-on-language-curricula.mdx | 202 ++++++++++++++++--
1 file changed, 186 insertions(+), 16 deletions(-)
diff --git a/src/content/docs/how-to-work-on-language-curricula.mdx b/src/content/docs/how-to-work-on-language-curricula.mdx
index ae55bb6d..7e16c70c 100644
--- a/src/content/docs/how-to-work-on-language-curricula.mdx
+++ b/src/content/docs/how-to-work-on-language-curricula.mdx
@@ -7,15 +7,33 @@ sidebar:
import { Steps } from '@astrojs/starlight/components';
import { Aside } from '@astrojs/starlight/components';
-## Using Challenge Helper Scripts
+## Curriculum Structure
-All commands must be run from the `tools/challenge-helper-scripts` directory. To navigate to this directory, run:
+Language curricula follow a five-level hierarchy:
+
+- **Superblock** — The top-level course (e.g., _A2 English for Developers_)
+- **Chapter** — A broad thematic group within a superblock
+- **Module** — A focused topic within a chapter
+- **Block** — A set of tasks covering a specific lesson topic
+- **Task** — An individual challenge within a block (multiple-choice, fill-in-the-blank, quiz, etc.)
+
+For file structure, see [Curriculum File Structure](./curriculum-file-structure.mdx).
+
+## Modifying Curriculum Outer Layer
+
+To add or edit an outer layer (chapter, module, or block), we use the challenge helper scripts.
+
+### Creating a New Block
+
+
To create a new block, run:
@@ -25,21 +43,21 @@ pnpm run create-language-block
The script walks you through a series of prompts:
-| Prompt | What to provide |
-| ----------------- | ------------------------------------------------------------ |
-| Super block | The super block this block belongs to (e.g., A2 English) |
-| Block label | The type of block: `practice`, `learn`, `quiz`, etc. |
-| Block dashed name | A unique kebab-case identifier for the block |
-| Block title | A human-readable title (defaults to the dashed name) |
-| Help category | The support category for this block's forum posts |
-| Block layout | The visual layout used to display challenges |
-| Chapter | The chapter this block belongs to (you can create a new one) |
-| Module | The module within that chapter (you can create a new one) |
-| Position | Where in the module this block appears (1-based) |
+| Prompt | What to provide |
+| ----------------- | ---------------------------------------------------------------------------------------------- |
+| Superblock | The superblock this block belongs to (e.g., A2 English) |
+| Block label | The type of block: `practice`, `learn`, `quiz`, etc. |
+| Block dashed name | A unique kebab-case identifier for the block (e.g., `en-a2-learn-greetings-and-introductions`) |
+| Block title | A human-readable title (e.g., `Greetings and Introductions`) |
+| Help category | The support category for this block's forum posts |
+| Block layout | The visual layout used to display challenges |
+| Chapter | The chapter this block belongs to (you can create a new one) |
+| Module | The module within that chapter (you can create a new one) |
+| Position | Where in the module this block appears (1-based) |
### Block Naming
-Block names for language curricula follow an automatic prefix based on the super block and block label. For example, a `learn` block in A2 English gets the prefix `en-a2-learn-`. When prompted, enter only the unique part of the name after the prefix.
+Block names for language curricula follow an automatic prefix based on the superblock and block label. For example, a `learn` block in A2 English gets the prefix `en-a2-learn-`. When prompted, enter only the unique part of the name after the prefix.