diff --git a/cmd/joj3/conf/conf.go b/cmd/joj3/conf/conf.go
index 9c3cd13..a8fe35f 100644
--- a/cmd/joj3/conf/conf.go
+++ b/cmd/joj3/conf/conf.go
@@ -144,18 +144,19 @@ func parseConventionalCommit(commit string) (*ConventionalCommit, error) {
 	return cc, nil
 }
 
-func ParseConfFile(path string) (conf Conf, err error) {
+func ParseConfFile(path string) (conf *Conf, err error) {
+	conf = new(Conf)
 	d := &multiconfig.DefaultLoader{}
 	d.Loader = multiconfig.MultiLoader(
 		&multiconfig.TagLoader{},
 		&multiconfig.JSONLoader{Path: path},
 	)
 	d.Validator = multiconfig.MultiValidator(&multiconfig.RequiredValidator{})
-	if err = d.Load(&conf); err != nil {
+	if err = d.Load(conf); err != nil {
 		slog.Error("parse stages conf", "error", err)
 		return
 	}
-	if err = d.Validate(&conf); err != nil {
+	if err = d.Validate(conf); err != nil {
 		slog.Error("validate stages conf", "error", err)
 		return
 	}
diff --git a/cmd/joj3/stage/main.go b/cmd/joj3/stage/main.go
index 33fd449..ad57132 100644
--- a/cmd/joj3/stage/main.go
+++ b/cmd/joj3/stage/main.go
@@ -13,7 +13,7 @@ import (
 	"github.com/jinzhu/copier"
 )
 
-func generateStages(conf conf.Conf, group string) ([]stage.Stage, error) {
+func generateStages(conf *conf.Conf, group string) ([]stage.Stage, error) {
 	stages := []stage.Stage{}
 	existNames := map[string]bool{}
 	for _, s := range conf.Stage.Stages {
@@ -81,7 +81,7 @@ func outputResult(outputPath string, results []stage.StageResult) error {
 		append(content, []byte("\n")...), 0o600)
 }
 
-func Run(conf conf.Conf, group string) error {
+func Run(conf *conf.Conf, group string) error {
 	executors.InitWithConf(
 		conf.Stage.SandboxExecServer,
 		conf.Stage.SandboxToken,
diff --git a/cmd/joj3/teapot/main.go b/cmd/joj3/teapot/main.go
index 3fb6003..2c032a5 100644
--- a/cmd/joj3/teapot/main.go
+++ b/cmd/joj3/teapot/main.go
@@ -11,7 +11,7 @@ import (
 	"github.com/joint-online-judge/JOJ3/cmd/joj3/conf"
 )
 
-func Run(conf conf.Conf) error {
+func Run(conf *conf.Conf) error {
 	actions := os.Getenv("GITHUB_ACTIONS")
 	if actions != "true" {
 		slog.Info("teapot exit", "GITHUB_ACTIONS", actions)