diff --git a/joj3_config_generator/models/repo.py b/joj3_config_generator/models/repo.py
index 06e5379..18adba6 100644
--- a/joj3_config_generator/models/repo.py
+++ b/joj3_config_generator/models/repo.py
@@ -12,20 +12,24 @@ class Files(BaseModel):
 
 class Groups(BaseModel):
     name: List[str] = []
-    max_count: List[int] = []
-    time_period_hour: List[int] = []
+    max_count: List[int] = Field([], alias="max-count")
+    time_period_hour: List[int] = Field([], alias="time-period-hour")
 
 
 class Config(BaseModel):
-    max_size: float = Field(10, ge=0)
+    max_size: float = Field(10, ge=0, alias="max-size")
     files: Files = Files()
-    sandbox_token: str = Field("")
-    max_total_score: int = Field(100)
-    force_skip_health_check_on_test: bool = False
-    force_skip_teapot_on_test: bool = False
+    sandbox_token: str = Field("", alias="sandbox-token")
+    max_total_score: int = Field(100, alias="max-total-score")
+    force_skip_health_check_on_test: bool = Field(
+        False, alias="force-skip-health-check-on-test"
+    )
+    force_skip_teapot_on_test: bool = Field(False, alias="force-skip-teapot-on-test")
     groups: Groups = Groups()
     root: Path = Path(".")
     path: Path = Path("repo.toml")
-    grading_repo_name: str = f"{socket.gethostname().split('-')[0]}-joj"
-    health_check_score: int = Field(0)
-    submitter_in_issue_title: bool = True
+    grading_repo_name: str = Field(
+        f"{socket.gethostname().split('-')[0]}-joj", alias="grading-repo-name"
+    )
+    health_check_score: int = Field(0, alias="health-check-score")
+    submitter_in_issue_title: bool = Field(True, alias="submitter-in-issue-title")
diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py
index e3c06e9..847b8d4 100644
--- a/joj3_config_generator/models/task.py
+++ b/joj3_config_generator/models/task.py
@@ -16,13 +16,13 @@ from joj3_config_generator.models.const import (
 
 
 class ParserResultDetail(BaseModel):
-    cpu_time: bool = True  # Display CPU time
+    cpu_time: bool = Field(True, alias="cpu-time")  # Display CPU time
     time: bool = True  # Display run time
     mem: bool = True  # Display memory usage
     stdout: bool = False  # Display stdout messages
     stderr: bool = False  # Display stderr messages
-    exit_status: bool = True  # Display exit status
-    proc_peak: bool = False  # Display peak process count
+    exit_status: bool = Field(True, alias="exit-status")  # Display exit status
+    proc_peak: bool = Field(False, alias="proc-peak")  # Display peak process count
     error: bool = False  # Display error messages
 
 
@@ -39,7 +39,7 @@ class ParserLog(BaseModel):
 class ParserDummy(BaseModel):
     comment: str = ""
     score: int = 0
-    force_quit: bool = False
+    force_quit: bool = Field(False, alias="force-quit")
 
 
 class ParserKeyword(BaseModel):
@@ -47,19 +47,19 @@ class ParserKeyword(BaseModel):
     weight: List[int] = []
 
 
-class Outputs(BaseModel):
+class ParserDiffOutputs(BaseModel):
     score: int = 0
-    ignore_spaces: bool = True
+    ignore_spaces: bool = Field(True, alias="ignore-spaces")
     hide: bool = False
-    force_quit: bool = False
+    force_quit: bool = Field(False, alias="force-quit")
 
 
 class ParserDiff(BaseModel):
-    output: Outputs = Outputs()
-    default_score: int = DEFAULT_CASE_SCORE
+    output: ParserDiffOutputs = ParserDiffOutputs()
+    default_score: int = Field(DEFAULT_CASE_SCORE, alias="default-score")
 
 
-class Files(BaseModel):
+class StageFiles(BaseModel):
     import_: List[str] = Field([], alias="import")
     export: List[str] = []
 
@@ -105,10 +105,10 @@ class Stage(BaseModel):
     name: str = ""  # Stage name
     env: List[str] = []
     command: str = ""  # Command to run
-    files: Files = Files()
+    files: StageFiles = StageFiles()
     in_: str = Field("", alias="in")
     out_: str = Field("", alias="out")
-    copy_in_cwd: bool = True
+    copy_in_cwd: bool = Field(True, alias="copy-in-cwd")
     score: int = 0
     parsers: List[Parser] = []  # list of parsers
     limit: Limit = Limit()
@@ -147,11 +147,11 @@ class Stage(BaseModel):
 
 
 class Release(BaseModel):
-    end_time: datetime = datetime(
-        1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc
+    end_time: datetime = Field(
+        datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc), alias="end-time"
     )  # timestamp = 0, no end time
-    begin_time: datetime = datetime(
-        1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc
+    begin_time: datetime = Field(
+        datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc), alias="begin-time"
     )  # timestamp = 0, no begin time
 
 
diff --git a/tests/convert/basic/repo.toml b/tests/convert/basic/repo.toml
index 3d13343..8c97ca2 100644
--- a/tests/convert/basic/repo.toml
+++ b/tests/convert/basic/repo.toml
@@ -1,15 +1,15 @@
-grading_repo_name = "ece280-joj"
+grading-repo-name = "ece280-joj"
 
-sandbox_token = "test"
+sandbox-token = "test"
 # reconfigure later
-max_total_score = 100
-max_size = 50.5
+max-total-score = 100
+max-size = 50.5
 
 # for tests
 [groups]
 name = ["joj", "run"]
-max_count = [1000, 1000]
-time_period_hour = [24, 24]
+max-count = [1000, 1000]
+time-period-hour = [24, 24]
 
 [files]
 required = ["README.md", "Changelog.md"]
diff --git a/tests/convert/basic/task.toml b/tests/convert/basic/task.toml
index 3a045fd..c76bcf6 100644
--- a/tests/convert/basic/task.toml
+++ b/tests/convert/basic/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "Compilation"
@@ -15,11 +15,11 @@ score = 1
 # compile parsers
 parsers = [ "result-detail", "result-status" ]
 result-status.comment = "Congratulations! Your code compiled successfully."
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 result-detail.time = false
 result-detail.mem = false
-result-status.force_quit = true
+result-status.force-quit = true
 
 [[stages]]
 name = "[cq] Filelength"
@@ -29,7 +29,7 @@ files.import = [ "tools/filelength" ]
 parsers = [ "keyword", "result-detail" ]
 keyword.keyword = [ "max", "recommended"]
 keyword.weight = [ 20, 10 ]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stdout = true
 result-detail.time = false
 result-detail.mem = false
@@ -43,7 +43,7 @@ limit.stdout = "4m"
 parsers = [ "clangtidy", "result-detail" ]
 clangtidy.keyword = [ "codequality-unchecked-malloc-result", "codequality-no-global-variables", "codequality-no-header-guard", "codequality-no-fflush-stdin", "readability-function-size", "readability-duplicate-include", "readability-identifier-naming", "readability-redundant", "readability-misleading-indentation", "readability-misplaced-array-index", "cppcoreguidelines-init-variables", "bugprone-suspicious-string-compare", "google-global-names-in-headers", "clang-diagnostic", "clang-analyzer", "misc", "performance", "portability" ]
 clangtidy.weight = [ 5, 20, 20, 20, 10, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stdout = true
 result-detail.time = false
 result-detail.mem = false
@@ -56,7 +56,7 @@ limit.stderr = "8m"
 parsers = [ "keyword", "cppcheck", "clangtidy", "result-detail", "cpplint", "result-status", "file", "dummy", "diff" ]
 cppcheck.keyword = ["error", "warning", "portability", "performance", "style"]
 cppcheck.weight = [15, 5, 5, 5, 5]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 result-detail.time = false
 result-detail.mem = false
@@ -69,7 +69,7 @@ limit.stdout = "65m"
 parsers = [ "cpplint", "result-detail" ]
 cpplint.keyword = [ "runtime", "readability", "build" ]
 cpplint.weight = [ 5, 20, 10]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 result-detail.time = false
 result-detail.mem = false
@@ -77,19 +77,19 @@ result-detail.mem = false
 [[stages]]
 name = "[joj] ex2-asan"
 command="./h7/build/ex2-asan -a"
-copy_in_cwd = false
+copy-in-cwd = false
 files.import = [ "h7/build/ex2-asan" ]
 limit.mem = "128m"
 
 parsers = [ "diff", "result-detail" ]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 
 # will be removed as long as the name is fixed
 case0.diff.output.score = 5
 case0.limit.cpu = "0.5s"
 case0.limit.mem = "5m"
-case0.diff.output.ignore_spaces = true
+case0.diff.output.ignore-spaces = true
 #case0.limit.stdout = 8
 #case0.command = "./h7/build/ex2"
 case0.in = "case0.in"
@@ -97,7 +97,7 @@ case0.in = "case0.in"
 case1.diff.output.score = 5
 case1.limit.cpu = "1s"
 case1.limit.mem = "5m"
-case1.diff.output.ignore_spaces = true
+case1.diff.output.ignore-spaces = true
 #case1.limit.stdout = 8
 #case1.command = "./h7/build/ex2"
 case1.in = "case1.in"
diff --git a/tests/convert/clang-tidy/repo.toml b/tests/convert/clang-tidy/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/clang-tidy/repo.toml
+++ b/tests/convert/clang-tidy/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/clang-tidy/task.toml b/tests/convert/clang-tidy/task.toml
index 7c3af22..8e833b3 100644
--- a/tests/convert/clang-tidy/task.toml
+++ b/tests/convert/clang-tidy/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[cq] Clang-tidy"
@@ -13,7 +13,7 @@ limit.stdout = "65m"
 parsers = [ "clangtidy", "result-detail" ]
 clangtidy.keyword = [ "codequality-unchecked-malloc-result", "codequality-no-global-variables", "codequality-no-header-guard", "codequality-no-fflush-stdin", "readability-function-size", "readability-duplicate-include", "readability-identifier-naming", "readability-redundant", "readability-misleading-indentation", "readability-misplaced-array-index", "cppcoreguidelines-init-variables", "bugprone-suspicious-string-compare", "google-global-names-in-headers", "clang-diagnostic", "clang-analyzer", "misc", "performance", "portability" ]
 clangtidy.weight = [ 5, 20, 20, 20, 10, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stdout = true
 result-detail.time = false
 result-detail.mem = false
diff --git a/tests/convert/cppcheck/repo.toml b/tests/convert/cppcheck/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/cppcheck/repo.toml
+++ b/tests/convert/cppcheck/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/cppcheck/task.toml b/tests/convert/cppcheck/task.toml
index a060fcc..8b9cb69 100644
--- a/tests/convert/cppcheck/task.toml
+++ b/tests/convert/cppcheck/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[cq] Cppcheck"
@@ -12,7 +12,7 @@ limit.stderr = "65m"
 parsers = [ "cppcheck", "result-detail" ]
 cppcheck.keyword = ["error", "warning", "portability", "performance", "style"]
 cppcheck.weight = [15, 5, 5, 5, 5]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 result-detail.time = false
 result-detail.mem = false
diff --git a/tests/convert/cpplint/repo.toml b/tests/convert/cpplint/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/cpplint/repo.toml
+++ b/tests/convert/cpplint/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/cpplint/task.toml b/tests/convert/cpplint/task.toml
index b2f0793..b1c03a2 100644
--- a/tests/convert/cpplint/task.toml
+++ b/tests/convert/cpplint/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[cq] Cpplint"
@@ -12,7 +12,7 @@ limit.stdout = "65m"
 parsers = [ "cpplint", "result-detail" ]
 cpplint.keyword = [ "runtime", "readability", "build" ]
 cpplint.weight = [ 5, 20, 10]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 result-detail.time = false
 result-detail.mem = false
diff --git a/tests/convert/diff/repo.toml b/tests/convert/diff/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/diff/repo.toml
+++ b/tests/convert/diff/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/diff/task.toml b/tests/convert/diff/task.toml
index 2b9fcc9..f2f2d7d 100644
--- a/tests/convert/diff/task.toml
+++ b/tests/convert/diff/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[joj] ex2-asan"
@@ -14,22 +14,22 @@ limit.stdout = "10m"
 limit.stderr = "10m"
 
 parsers = [ "diff", "result-detail" ]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stderr = true
 
-diff.default_score = 100
+diff.default-score = 100
 
 case0.diff.output.score = 5
 case0.limit.cpu = "1s"
 case0.limit.mem = "2m"
-case0.diff.output.ignore_spaces = true
+case0.diff.output.ignore-spaces = true
 case0.command = "./h7/build/ex2"
 case0.in = "case0.in"
 
 case1.diff.output.score = 123214122421
 case1.limit.cpu = "2s"
 case1.limit.mem = "4m"
-case1.diff.output.ignore_spaces = true
+case1.diff.output.ignore-spaces = true
 case1.command = "./h7/build/ex2"
 
 case9.diff.output.score = 1232131
diff --git a/tests/convert/elf/repo.toml b/tests/convert/elf/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/elf/repo.toml
+++ b/tests/convert/elf/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/elf/task.toml b/tests/convert/elf/task.toml
index 545c83d..6d5e15c 100644
--- a/tests/convert/elf/task.toml
+++ b/tests/convert/elf/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[cq] elf"
diff --git a/tests/convert/keyword/repo.toml b/tests/convert/keyword/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/keyword/repo.toml
+++ b/tests/convert/keyword/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/keyword/task.toml b/tests/convert/keyword/task.toml
index e35f213..32456f7 100644
--- a/tests/convert/keyword/task.toml
+++ b/tests/convert/keyword/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[cq] Filelength"
@@ -12,7 +12,7 @@ files.import = [ "tools/filelength" ]
 parsers = [ "keyword", "result-detail" ]
 keyword.keyword = [ "max", "recommended"]
 keyword.weight = [ 20, 10 ]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stdout = true
 result-detail.time = false
 result-detail.mem = false
diff --git a/tests/convert/result-detail/repo.toml b/tests/convert/result-detail/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/result-detail/repo.toml
+++ b/tests/convert/result-detail/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/result-detail/task.toml b/tests/convert/result-detail/task.toml
index 3f0eba4..a23e624 100644
--- a/tests/convert/result-detail/task.toml
+++ b/tests/convert/result-detail/task.toml
@@ -1,8 +1,8 @@
 # general task configuration
 task.name = "hw7 ex2" # task name
 
-release.end_time = 2024-12-30 23:59:59+08:00
-release.begin_time = 2024-12-29 23:59:59+08:00
+release.end-time = 2024-12-30 23:59:59+08:00
+release.begin-time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
 name = "[cq] Filelength"
@@ -10,7 +10,7 @@ command = "./tools/filelength 400 300 *.cpp *.h"
 files.import = [ "tools/filelength" ]
 
 parsers = [ "result-detail" ]
-result-detail.exit_status = true
+result-detail.exit-status = true
 result-detail.stdout = true
 result-detail.stderr = true
 result-detail.time = false
diff --git a/tests/convert/unnecessary/repo.toml b/tests/convert/unnecessary/repo.toml
index 2858724..5b8403f 100644
--- a/tests/convert/unnecessary/repo.toml
+++ b/tests/convert/unnecessary/repo.toml
@@ -1,2 +1,2 @@
-force_skip_health_check_on_test = true
-force_skip_teapot_on_test = true
+force-skip-health-check-on-test = true
+force-skip-teapot-on-test = true
diff --git a/tests/convert/unnecessary/task.toml b/tests/convert/unnecessary/task.toml
index 21534d1..48db423 100644
--- a/tests/convert/unnecessary/task.toml
+++ b/tests/convert/unnecessary/task.toml
@@ -7,9 +7,9 @@ command = "./tools/filelength 400 300 *.cpp *.h"
 files.import = ["tools/filelength"]
 
 parsers = ["result-detail"]
-result-detail.cpu_time = true
+result-detail.cpu-time = true
 result-detail.time = true
 result-detail.mem = true
 result-detail.stdout = false
 result-detail.stderr = false
-result-detail.exit_status = true
+result-detail.exit-status = true