diff --git a/.woodpecker/build-linux.yml b/.woodpecker/build-linux.yml
index 4b74f5c..ef4ecfd 100644
--- a/.woodpecker/build-linux.yml
+++ b/.woodpecker/build-linux.yml
@@ -14,12 +14,17 @@ steps:
   - export VERSION=$([ -z $CI_COMMIT_TAG ] && echo latest || echo $CI_COMMIT_TAG)-$(sed 's#/#-#g' <<< $CI_SYSTEM_PLATFORM)
   - echo $CONTAINER_PASSWORD | podman login $DRYCC_REGISTRY --username $CONTAINER_USERNAME --password-stdin > /dev/null 2>&1
   - make podman-build podman-immutable-push
-  secrets:
-  - codename
-  - dev_registry
-  - drycc_registry
-  - container_username
-  - container_password
+  environment:
+    CODENAME:
+      from_secret: codename
+    DEV_REGISTRY:
+      from_secret: dev_registry
+    DRYCC_REGISTRY:
+      from_secret: drycc_registry
+    CONTAINER_USERNAME:
+      from_secret: container_username
+    CONTAINER_PASSWORD:
+      from_secret: container_password
   when:
     event:
     - push
diff --git a/.woodpecker/chart.yaml b/.woodpecker/chart.yaml
index 5aa7eb3..cfcd3ec 100644
--- a/.woodpecker/chart.yaml
+++ b/.woodpecker/chart.yaml
@@ -14,15 +14,20 @@ steps:
   - helm package -u charts/$${CI_REPO_NAME} --version $CHART_VERSION --app-version $APP_VERSION
   - echo $CONTAINER_PASSWORD | helm registry login $DRYCC_REGISTRY -u $CONTAINER_USERNAME --password-stdin
   - helm push $${CI_REPO_NAME}-$CHART_VERSION.tgz oci://$DRYCC_REGISTRY/$([ -z $CI_COMMIT_TAG ] && echo charts-testing || echo charts)
-  secrets:
-  - dev_registry
-  - drycc_registry
-  - container_username
-  - container_password
+  environment:
+    DEV_REGISTRY:
+      from_secret: dev_registry
+    DRYCC_REGISTRY:
+      from_secret: drycc_registry
+    CONTAINER_USERNAME:
+      from_secret: container_username
+    CONTAINER_PASSWORD:
+      from_secret: container_password
   when:
     event:
     - push
     - tag
+    - cron
 
 depends_on:
 - manifest
diff --git a/.woodpecker/manifest.yml b/.woodpecker/manifest.yml
index d256c0a..19fc70c 100644
--- a/.woodpecker/manifest.yml
+++ b/.woodpecker/manifest.yml
@@ -8,8 +8,9 @@ steps:
   commands:
   - sed -i "s/{{project}}/$${CI_REPO_NAME}/g" .woodpecker/manifest.tmpl
   - sed -i "s/registry.drycc.cc/$${DRYCC_REGISTRY}/g" .woodpecker/manifest.tmpl
-  secrets:
-  - drycc_registry
+  environment:
+    DRYCC_REGISTRY:
+      from_secret: drycc_registry
   when:
     event:
     - tag
@@ -27,9 +28,11 @@ steps:
     -v $(pwd):$(pwd)
     -w $(pwd)
     docker.io/plugins/manifest
-  secrets:
-  - container_username
-  - container_password
+  environment:
+    CONTAINER_USERNAME:
+      from_secret: container_username
+    CONTAINER_PASSWORD:
+      from_secret: container_password
   when:
     event:
     - tag
diff --git a/.woodpecker/test-linux.yml b/.woodpecker/test-linux.yml
index d47ccc5..194832f 100644
--- a/.woodpecker/test-linux.yml
+++ b/.woodpecker/test-linux.yml
@@ -12,10 +12,13 @@ steps:
   image: bash
   commands:
   - make test
-  secrets:
-  - codename
-  - dev_registry
+  environment:
+    CODENAME:
+      from_secret: codename
+    DEV_REGISTRY:
+      from_secret: dev_registry
   when:
     event:
     - push
     - tag
+    - cron
diff --git a/README.md b/README.md
index f1515ac..1702973 100644
--- a/README.md
+++ b/README.md
@@ -7,15 +7,27 @@ For more information about the Drycc Workflow, please visit the main project pag
 
 We welcome your input! If you have feedback, please [submit an issue][issues]. If you'd like to participate in development, please read the "Development" section below and [submit a pull request][prs].
 
-# About
+# Build config
 
 The V3 version of imagebuilder unifies the building model, uses the latest CNCF [buildpack](https://github.com/buildpacks) building program, and also supports the dockerfile format.
 
 You can use `DRYCC_STACK` specifies the construction mode. Currently, you can choose two construction formats: `container` and `buildpack`.
 
-If you want to disable caching during building, you only need to generate a `.clear-cache` file in the root directory of the project.
+## Build arg config
 
-# Development
+In Container Build, build arguments (ARG) a means to pass information into the build process. You can use them to parameterize the build, allowing for more flexible and configurable builds.
+
+It can be configured through `.build-arg`, argument=value to supply to the builder, this configuration file is universal in both container and buildpack scenarios.
+
+## Container config
+
+Normally, in container mode, as long as there is a Dockerfile in the root directory, it is sufficient, but we can use [drycc config path](https://www.drycc.cc/docs/applications/using-dryccpath/) to configure the build process more finely.
+
+## Buildpack config
+
+Add an empty `.clean_cache` file, clear image's associated cache before building.
+
+## Development
 
 The Drycc project welcomes contributions from all developers. The high level process for development matches many other open source projects. See below for an outline.
 
diff --git a/charts/imagebuilder/templates/imagebuilder-networkpolicy.yaml b/charts/imagebuilder/templates/imagebuilder-networkpolicy.yaml
index 6774fe0..767af80 100644
--- a/charts/imagebuilder/templates/imagebuilder-networkpolicy.yaml
+++ b/charts/imagebuilder/templates/imagebuilder-networkpolicy.yaml
@@ -1,7 +1,7 @@
 apiVersion: networking.k8s.io/v1
 kind: NetworkPolicy
 metadata:
-  name: imagebuilder-networkpolicy
+  name: drycc-imagebuilder
 spec:
   podSelector:
     matchLabels:
@@ -41,7 +41,7 @@ spec:
           kubernetes.io/metadata.name: {{ .Release.Name }}
     - podSelector:
         matchLabels:
-          app: drycc-storage-metanode-weed
+          app: drycc-storage
     ports:
     - protocol: TCP
-      port: 8333
+      port: 9000
diff --git a/charts/imagebuilder/values.yaml b/charts/imagebuilder/values.yaml
index a8061c8..60ec3bc 100644
--- a/charts/imagebuilder/values.yaml
+++ b/charts/imagebuilder/values.yaml
@@ -2,7 +2,7 @@ imageOrg: "drycc"
 imagePullPolicy: "Always"
 imageTag: "canary"
 imageRegistry: "registry.drycc.cc"
-codename: bookworm
+codename: trixie
 containerRegistries: |
   unqualified-search-registries = ["registry.drycc.cc"]
   short-name-mode="permissive"
diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile
index b72c99a..e14ea5d 100644
--- a/rootfs/Dockerfile
+++ b/rootfs/Dockerfile
@@ -1,16 +1,16 @@
 ARG CODENAME
 FROM registry.drycc.cc/drycc/base:${CODENAME}
 
-ENV DRYCC_UID=1001 \
+ARG DRYCC_UID=1001 \
   DRYCC_GID=1001 \
   DRYCC_HOME_DIR=/home/drycc \
   JQ_VERSION="1.7.1" \
-  YQ_VERSION="4.44.3" \
-  PODMAN_VERSION="5.2.2" \
-  MC_VERSION="2024.08.26.10.49.58" \
-  CADDY_VERSION="2.8.4" \
-  PACK_VERSION="0.35.1" \
-  GOSU_VERSION="1.17"
+  YQ_VERSION="4.48.1" \
+  PODMAN_VERSION="5.7.0" \
+  RCLONE_VERSION="1.71.2" \
+  CADDY_VERSION="2.10.2" \
+  PACK_VERSION="0.38.2" \
+  GOSU_VERSION="1.19"
 
 RUN groupadd drycc --gid ${DRYCC_GID} \
   && useradd drycc -u ${DRYCC_UID} -g ${DRYCC_GID} -s /bin/bash -m -d ${DRYCC_HOME_DIR}
@@ -21,7 +21,7 @@ RUN install-packages procps psmisc \
   && install-stack jq $JQ_VERSION \
   && install-stack yq $YQ_VERSION \
   && install-stack podman $PODMAN_VERSION \
-  && install-stack mc $MC_VERSION \
+  && install-stack rclone $RCLONE_VERSION \
   && install-stack caddy $CADDY_VERSION \
   && install-stack pack $PACK_VERSION \
   && install-stack gosu $GOSU_VERSION \
diff --git a/rootfs/imagebuilder/build b/rootfs/imagebuilder/build
index a02abd3..a78d0ee 100755
--- a/rootfs/imagebuilder/build
+++ b/rootfs/imagebuilder/build
@@ -36,17 +36,36 @@ function waiting_process {
     done
 }
 
+function podman_publish {
+    local image dockerfile
+    image=$1
+    dockerfile=$2
+
+    podman_build="podman build . -f ${dockerfile} --tag ${image} --network host"
+    podman_push="podman push ${image} --tls-verify=false"
+    # append build arg
+    for build_arg in $( < "${envfile}" )
+    do
+        podman_build="$podman_build --build-arg $build_arg"
+    done
+    # append ptype build arg
+    if [[ -n "$3" ]]; then
+        for build_arg in $( < "${3}" )
+        do
+            podman_build="$podman_build --build-arg $build_arg"
+        done
+    fi
+    # build and push
+    $podman_build
+    $podman_push
+}
+
 function write_build_env {
-    local envfile dryccfile command config items i
+    local envfile dryccfile config items i
     envfile=$1
     dryccfile=$2
-    if [[ -z "$3" ]]; then
-        command=".build.config"
-    else
-        command=".build.config.${3}"
-    fi
     if [[ -f "$dryccfile" ]]; then
-        config=$(cat < "$dryccfile" | yq "$command" -o json)
+        config=$(cat < "$dryccfile" | yq ".build.arg" -o json)
         if [[ $config != null ]]; then
             mapfile -t items < <(echo "$config" | jq -c -r 'to_entries[] | (.key, .value)')
             for ((i=0; i<"${#items[@]}"; i=i+2)); do
@@ -116,50 +135,38 @@ else
         --tls-verify=false > /dev/null
 fi
 
-envfile="${HOME}"/.config/build-env
-dryccfile="drycc.yaml"
-# create build-env
+# create global build-arg
+envfile="${HOME}"/.config/build-arg
 echo "" > "${envfile}"
-if [[ -f .build-env ]] ; then
-    cat .build-env >> "${envfile}"
+if [[ -f .build-arg ]] ; then
+    cat .build-arg >> "${envfile}"
 fi
 
 # Building
 if [[ "${DRYCC_STACK}" == "container" ]] ; then
-    echo "---> Building container"
-    builds=("web" "Dockerfile")
-    if [[ -e "$dryccfile" ]]; then
-        docker=$(cat < "$dryccfile" | yq .build.docker -o json)
-        if [[ $docker != null ]]; then
-            mapfile -t builds < <(echo "$docker" | jq -c -r 'to_entries[] | (.key, .value)')
-        else
-            write_build_env "$envfile" "$dryccfile"
-        fi
-    fi
-    for ((i=0; i<"${#builds[@]}"; i=i+2)); do
-        procfile_type="${builds[i]}"
-        if [[ "${procfile_type}" == "web" ]]; then
-            image="${IMAGE_NAME}"
-        else
-            image="${IMAGE_NAME}"-"${procfile_type}"
-        fi
-        dockerfile="${builds[i+1]}"
-        podman_build="podman build . -f ${dockerfile} --tag ${image} --network host"
-        podman_push="podman push ${image} --tls-verify=false"
-        for build_arg in $( < "${envfile}" )
-        do
-            podman_build="$podman_build --build-arg $build_arg"
-        done
-        typed_envfile="${HOME}/.config/build-env-${procfile_type}"
-        echo "" > "$typed_envfile"
-        write_build_env "$typed_envfile" "$dryccfile" "$procfile_type"
-        for build_arg in $( < "${typed_envfile}" )
-        do
-            podman_build="$podman_build --build-arg $build_arg"
+    if [[ -d ".drycc" ]]; then
+        for dryccfile in $(find .drycc | grep -E '.(yml|yaml)$'); do
+            ptype=$(cat < "$dryccfile" | yq .ptype -o auto)
+            build=$(cat < "$dryccfile" | yq .build -o json)
+            if [[ "$build" != "null" ]]; then
+                dockerfile=$(echo "$build" | jq -r '.docker // "Dockerfile"')
+                if [[ "${ptype}" == "web" ]]; then
+                    image="${IMAGE_NAME}"
+                else
+                    image="${IMAGE_NAME}"-"${ptype}"
+                fi
+                # create ptype build-arg
+                ptype_envfile="${HOME}/.config/build-arg-${ptype}"
+                echo "" > "$ptype_envfile"
+                write_build_env "$ptype_envfile" "$dryccfile"
+                podman_publish "${image}" "${dockerfile}" "${ptype_envfile}"
+            fi
         done
-        $podman_build
-        $podman_push
-    done
+    fi
+    # build default image
+    if [[ -f "Dockerfile" ]] && [[ $(podman images -q "${IMAGE_NAME}") == "" ]]; then
+        podman_publish "${IMAGE_NAME}" "Dockerfile"
+    fi
 else
     echo "---> Building pack"
     echo "---> Using builder ${pack_builder}"
@@ -173,7 +180,6 @@ else
     image_base_name=$(echo "${IMAGE_NAME}" | sed -s "s#:${image_tag}##g")
     image_cache_name="${image_base_name}":cache
     image_latest_name="${image_base_name}":latest
-    write_build_env "$envfile" "$dryccfile"
     pack_build="pack build ${IMAGE_NAME} \
             --builder ${pack_builder} \
             --lifecycle-image ${pack_builder} \
@@ -186,6 +192,9 @@ else
             --default-process web \
             --env-file ${envfile} \
             --network host"
+    # fix(pack): PACK_VOLUME_KEY is unset
+    PACK_VOLUME_KEY=${drycc_app}
+    export PACK_VOLUME_KEY
     if [[ $log_level == "debug" ]] ; then
         pack_build="$pack_build --verbose"
     fi
diff --git a/rootfs/usr/local/bin/get_object b/rootfs/usr/local/bin/get_object
index c6808e9..6f0a3ac 100755
--- a/rootfs/usr/local/bin/get_object
+++ b/rootfs/usr/local/bin/get_object
@@ -1,12 +1,18 @@
 #!/usr/bin/env bash
 
-mc config host add storage \
-  "${DRYCC_STORAGE_ENDPOINT}" \
-  "${DRYCC_STORAGE_ACCESSKEY}" \
-  "${DRYCC_STORAGE_SECRETKEY}" \
-  --lookup "${DRYCC_STORAGE_LOOKUP}" \
-  --api s3v4
+mkdir -p ~/.config/rclone
+touch ~/.config/rclone/rclone.conf
+rclone config create storage s3 \
+  provider=Other \
+  access_key_id="${DRYCC_STORAGE_ACCESSKEY}" \
+  secret_access_key="${DRYCC_STORAGE_SECRETKEY}" \
+  endpoint="${DRYCC_STORAGE_ENDPOINT}" \
+  force_path_style="${DRYCC_STORAGE_PATH_STYLE:-true}" --no-output
 
 GET_PATH=/tmp/app.tgz
 
-mc cp storage/"${DRYCC_STORAGE_BUCKET}/${TAR_PATH}" "${GET_PATH}"
+if ! rclone lsd storage: > /dev/null 2>&1; then
+  sleep 9s
+  echo "waiting for object storage to become ready..."
+fi
+rclone copyto storage:"${DRYCC_STORAGE_BUCKET}/${TAR_PATH}" "${GET_PATH}"
