diff --git a/.woodpecker/build-linux.yml b/.woodpecker/build-linux.yml
index 8cdd984..ef4ecfd 100644
--- a/.woodpecker/build-linux.yml
+++ b/.woodpecker/build-linux.yml
@@ -3,28 +3,33 @@ matrix:
     - linux/amd64
     - linux/arm64
 
-platform: ${platform}
-
 labels:
   type: exec
+  platform: ${platform}
 
-pipeline:
+steps:
 - name: publish-linux
   image: bash
   commands:
-  - export VERSION=$([ -z $CI_COMMIT_TAG ] && echo latest || echo $CI_COMMIT_TAG)-$(sed 's#/#-#g' <<< $CI_SYSTEM_ARCH)
+  - 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
     - tag
+    - cron
 
 depends_on:
 - test-linux
\ No newline at end of file
diff --git a/.woodpecker/chart.yaml b/.woodpecker/chart.yaml
index 3204cf5..cfcd3ec 100644
--- a/.woodpecker/chart.yaml
+++ b/.woodpecker/chart.yaml
@@ -1,30 +1,33 @@
-platform: linux/amd64
-
 labels:
   type: exec
+  platform: linux/amd64
 
-pipeline:
+steps:
 - name: generate-chart
-  type: local
   image: bash
   commands:
   - export VERSION=$(sed 's#v##' <<< $CI_COMMIT_TAG)
   - export IMAGE_TAG=$([ ! -z $CI_COMMIT_TAG ] && echo \"$VERSION\" || echo \"canary\")
-  - export APP_VERSION=$([ ! -z $CI_COMMIT_TAG ] && echo $VERSION || echo 1.0.0)
+  - export APP_VERSION=$([ -z $CI_COMMIT_TAG ] && echo $CI_COMMIT_SHA || echo $VERSION)
   - export CHART_VERSION=$([ -z $CI_COMMIT_TAG ] && echo 1.0.0 || echo $VERSION)
   - sed -i "s/imageTag:\ \"canary\"/imageTag:\ $IMAGE_TAG/g" charts/$${CI_REPO_NAME}/values.yaml
   - 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
\ No newline at end of file
+- manifest
diff --git a/.woodpecker/manifest.yml b/.woodpecker/manifest.yml
index 2d5c4e5..19fc70c 100644
--- a/.woodpecker/manifest.yml
+++ b/.woodpecker/manifest.yml
@@ -1,20 +1,21 @@
-platform: linux/amd64
-
 labels:
   type: exec
+  platform: linux/amd64
 
-pipeline:
+steps:
 - name: generate-manifest
   image: bash
   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
     - push
+    - cron
 
 - name: publish-manifest
   image: bash
@@ -27,13 +28,16 @@ pipeline:
     -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
     - push
+    - cron
 
 depends_on:
 - build-linux
diff --git a/.woodpecker/test-linux.yml b/.woodpecker/test-linux.yml
index 313179e..194832f 100644
--- a/.woodpecker/test-linux.yml
+++ b/.woodpecker/test-linux.yml
@@ -3,20 +3,22 @@ matrix:
   - linux/amd64
   - linux/arm64
 
-platform: ${platform}
-
 labels:
   type: exec
+  platform: ${platform}
 
-pipeline:
+steps:
 - name: test-linux
   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 e28771c..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:
@@ -10,12 +10,6 @@ spec:
   - Egress
   egress:
   - to:
-    - namespaceSelector:
-        matchLabels:
-          kubernetes.io/metadata.name: kube-system
-    - podSelector:
-        matchLabels:
-          k8s-app: kube-dns
     ports:
     - protocol: UDP
       port: 53
@@ -47,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 6ec580e..e14ea5d 100644
--- a/rootfs/Dockerfile
+++ b/rootfs/Dockerfile
@@ -1,14 +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 \
-  PODMAN_VERSION="4.7.1" \
-  MC_VERSION="2023.09.20.15.22.31" \
-  CADDY_VERSION="2.7.1" \
-  PACK_VERSION="0.31.0" \
-  GOSU_VERSION="1.16"
+  JQ_VERSION="1.7.1" \
+  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}
@@ -16,8 +18,10 @@ RUN groupadd drycc --gid ${DRYCC_GID} \
 ADD . /
 
 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 87b0e4d..a78d0ee 100755
--- a/rootfs/imagebuilder/build
+++ b/rootfs/imagebuilder/build
@@ -36,6 +36,45 @@ 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 config items i
+    envfile=$1
+    dryccfile=$2
+    if [[ -f "$dryccfile" ]]; then
+        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
+                echo "${items[i]}=${items[i+1]}" >> "${envfile}"
+            done
+        fi
+    fi
+}
+
 CONTAINERS_CONFIG_DIR="${HOME}"/.config/containers
 mkdir -p "${CONTAINERS_CONFIG_DIR}"
 from_registries_file="/etc/imagebuilder/registries.conf"
@@ -54,6 +93,9 @@ if [ -f "${from_auths_file}" ]; then
 fi
 export REGISTRY_AUTH_FILE
 
+# fix: failed to reexec: Permission denied
+podman version>/dev/null 2>&1 || podman version
+# podman service
 podman system service --time 0 &
 
 waiting_process podman
@@ -93,26 +135,38 @@ else
         --tls-verify=false > /dev/null
 fi
 
-# Get image name and image tag
-drycc_app=$(echo "${IMAGE_NAME}" | awk -F '/' '{print $NF}' | awk -F ':' '{print $1}')
-image_tag=$(echo "${IMAGE_NAME}" | awk -F ':' '{print $NF}')
-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
+# create global build-arg
+envfile="${HOME}"/.config/build-arg
+echo "" > "${envfile}"
+if [[ -f .build-arg ]] ; then
+    cat .build-arg >> "${envfile}"
+fi
 
 # Building
 if [[ "${DRYCC_STACK}" == "container" ]] ; then
-    echo "---> Building container"
-    podman_build="podman build . --tag ${IMAGE_NAME} --network host"
-    podman_push="podman push ${IMAGE_NAME} --tls-verify=false"
-    if [[ -f .build-env ]] ; then
-        for build_arg in $( < .build-env )
-        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
     fi
-    $podman_build
-    $podman_push
+    # 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}"
@@ -120,7 +174,12 @@ else
     DOCKER_HOST="unix://$(podman info -f '{{.Host.RemoteSocket.Path}}')"
     readonly DOCKER_HOST
     export DOCKER_HOST
-
+    # Get image name and image tag
+    drycc_app=$(echo "${IMAGE_NAME}" | awk -F '/' '{print $NF}' | awk -F ':' '{print $1}')
+    image_tag=$(echo "${IMAGE_NAME}" | awk -F ':' '{print $NF}')
+    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
     pack_build="pack build ${IMAGE_NAME} \
             --builder ${pack_builder} \
             --lifecycle-image ${pack_builder} \
@@ -131,15 +190,16 @@ else
             --cache-image ${image_cache_name} \
             --tag ${image_latest_name} \
             --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
     if [[ -f .clear-cache ]]; then
         pack_build="$pack_build --clear-cache"
     fi
-    if [[ -f .build-env ]] ; then
-        pack_build="$pack_build --env-file .build-env"
-    fi
     $pack_build
-fi
\ No newline at end of file
+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}"
