diff --git a/README.md b/README.md
index edb58928..d46b87b0 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,14 @@ From here we can conclude:
## Install
-#### Cargo
+### Quick Install (Linux, macOS, Windows)
+```bash
+curl -sSfL https://raw.githubusercontent.com/bootandy/dust/refs/heads/master/install.sh | sh
+```
+
+### Cargo
+
+#### Cargo
- `cargo install du-dust`
diff --git a/install.sh b/install.sh
new file mode 100755
index 00000000..0cd82aa2
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,233 @@
+#!/usr/bin/env bash
+# dust installer script
+# Usage: curl -sSfL https://raw.githubusercontent.com/bootandy/dust/main/install.sh | sh
+
+set -e
+
+REPO="bootandy/dust"
+BINARY_NAME="dust"
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+info() {
+ echo -e "${GREEN}[INFO]${NC} $1"
+}
+
+warn() {
+ echo -e "${YELLOW}[WARN]${NC} $1"
+}
+
+error() {
+ echo -e "${RED}[ERROR]${NC} $1"
+ exit 1
+}
+
+# Detect OS
+detect_os() {
+ case "$(uname -s)" in
+ Linux*) OS="linux" ;;
+ Darwin*) OS="darwin" ;;
+ MINGW*|MSYS*|CYGWIN*) OS="windows" ;;
+ *) error "Unsupported operating system: $(uname -s)" ;;
+ esac
+}
+
+# Detect architecture
+detect_arch() {
+ ARCH=$(uname -m)
+ case "$ARCH" in
+ x86_64|amd64) ARCH="x86_64" ;;
+ aarch64|arm64) ARCH="aarch64" ;;
+ armv7l) ARCH="arm" ;;
+ i686|i386) ARCH="i686" ;;
+ *) error "Unsupported architecture: $ARCH" ;;
+ esac
+}
+
+# Get the latest release version
+get_latest_version() {
+ info "Fetching latest version..."
+
+ # Try using curl
+ if command -v curl >/dev/null 2>&1; then
+ VERSION=$(curl -sSf "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/')
+ # Try using wget
+ elif command -v wget >/dev/null 2>&1; then
+ VERSION=$(wget -qO- "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/')
+ else
+ error "Neither curl nor wget is available. Please install one of them."
+ fi
+
+ if [ -z "$VERSION" ]; then
+ error "Failed to fetch latest version"
+ fi
+
+ info "Latest version: v$VERSION"
+}
+
+# Determine target triple
+get_target() {
+ if [ "$OS" = "linux" ]; then
+ if [ "$ARCH" = "x86_64" ]; then
+ TARGET="x86_64-unknown-linux-musl"
+ elif [ "$ARCH" = "aarch64" ]; then
+ TARGET="aarch64-unknown-linux-musl"
+ elif [ "$ARCH" = "arm" ]; then
+ TARGET="arm-unknown-linux-musleabi"
+ elif [ "$ARCH" = "i686" ]; then
+ TARGET="i686-unknown-linux-musl"
+ else
+ error "Unsupported Linux architecture: $ARCH"
+ fi
+ elif [ "$OS" = "darwin" ]; then
+ if [ "$ARCH" = "x86_64" ]; then
+ TARGET="x86_64-apple-darwin"
+ elif [ "$ARCH" = "aarch64" ]; then
+ # For Apple Silicon, use x86_64 with Rosetta if native build not available
+ TARGET="x86_64-apple-darwin"
+ warn "Using x86_64 binary (will run via Rosetta 2 on Apple Silicon)"
+ else
+ error "Unsupported macOS architecture: $ARCH"
+ fi
+ elif [ "$OS" = "windows" ]; then
+ if [ "$ARCH" = "x86_64" ]; then
+ TARGET="x86_64-pc-windows-msvc"
+ elif [ "$ARCH" = "i686" ]; then
+ TARGET="i686-pc-windows-msvc"
+ else
+ error "Unsupported Windows architecture: $ARCH"
+ fi
+ else
+ error "Unsupported OS: $OS"
+ fi
+
+ info "Target platform: $TARGET"
+}
+
+# Download and extract
+download_and_install() {
+ # Construct download URL
+ if [ "$OS" = "windows" ]; then
+ ARCHIVE_NAME="dust-v${VERSION}-${TARGET}.zip"
+ ARCHIVE_EXT="zip"
+ else
+ ARCHIVE_NAME="dust-v${VERSION}-${TARGET}.tar.gz"
+ ARCHIVE_EXT="tar.gz"
+ fi
+
+ DOWNLOAD_URL="https://github.com/$REPO/releases/download/v${VERSION}/${ARCHIVE_NAME}"
+
+ info "Downloading from: $DOWNLOAD_URL"
+
+ # Create temporary directory
+ TMP_DIR=$(mktemp -d)
+ cd "$TMP_DIR"
+
+ # Download
+ if command -v curl >/dev/null 2>&1; then
+ curl -sSfL "$DOWNLOAD_URL" -o "$ARCHIVE_NAME" || error "Download failed"
+ elif command -v wget >/dev/null 2>&1; then
+ wget -q "$DOWNLOAD_URL" -O "$ARCHIVE_NAME" || error "Download failed"
+ fi
+
+ # Extract
+ info "Extracting archive..."
+ if [ "$ARCHIVE_EXT" = "tar.gz" ]; then
+ tar -xzf "$ARCHIVE_NAME" || error "Extraction failed"
+ elif [ "$ARCHIVE_EXT" = "zip" ]; then
+ unzip -q "$ARCHIVE_NAME" || error "Extraction failed"
+ fi
+
+ # Find the binary (it might be in a subdirectory)
+ if [ "$OS" = "windows" ]; then
+ BINARY_PATH=$(find . -name "${BINARY_NAME}.exe" | head -n 1)
+ else
+ BINARY_PATH=$(find . -name "$BINARY_NAME" -type f | head -n 1)
+ fi
+
+ if [ -z "$BINARY_PATH" ]; then
+ error "Binary not found in archive"
+ fi
+
+ # Determine installation directory
+ if [ -n "$DUST_INSTALL" ]; then
+ INSTALL_DIR="$DUST_INSTALL"
+ elif [ -w "/usr/local/bin" ]; then
+ INSTALL_DIR="/usr/local/bin"
+ elif [ -w "$HOME/.local/bin" ]; then
+ INSTALL_DIR="$HOME/.local/bin"
+ mkdir -p "$INSTALL_DIR"
+ else
+ INSTALL_DIR="$HOME/.local/bin"
+ mkdir -p "$INSTALL_DIR"
+ fi
+
+ # Install binary
+ info "Installing to $INSTALL_DIR..."
+
+ if [ -w "$INSTALL_DIR" ]; then
+ cp "$BINARY_PATH" "$INSTALL_DIR/" || error "Installation failed"
+ chmod +x "$INSTALL_DIR/$BINARY_NAME" || true
+ else
+ # Try with sudo
+ warn "Installing with sudo (requires administrator privileges)..."
+ sudo cp "$BINARY_PATH" "$INSTALL_DIR/" || error "Installation failed"
+ sudo chmod +x "$INSTALL_DIR/$BINARY_NAME" || true
+ fi
+
+ # Clean up
+ cd - > /dev/null
+ rm -rf "$TMP_DIR"
+
+ info "${GREEN}✓${NC} dust v$VERSION installed successfully!"
+
+ # Check if install directory is in PATH
+ case ":$PATH:" in
+ *:$INSTALL_DIR:*)
+ ;;
+ *)
+ warn "⚠️ $INSTALL_DIR is not in your PATH"
+ warn " Add the following to your shell config (~/.bashrc, ~/.zshrc, etc.):"
+ echo ""
+ echo " export PATH=\"$INSTALL_DIR:\$PATH\""
+ echo ""
+ ;;
+ esac
+
+ # Show version
+ if command -v "$BINARY_NAME" >/dev/null 2>&1; then
+ info "Version check:"
+ "$BINARY_NAME" --version || true
+ fi
+}
+
+# Main execution
+main() {
+ info "dust installer"
+ echo ""
+
+ # Check for required tools
+ if ! command -v tar >/dev/null 2>&1 && ! command -v unzip >/dev/null 2>&1; then
+ error "Neither tar nor unzip is available. Please install one of them."
+ fi
+
+ detect_os
+ detect_arch
+ get_latest_version
+ get_target
+ download_and_install
+
+ echo ""
+ info "Installation complete! Try running: ${GREEN}dust${NC}"
+}
+
+# Allow version to be specified via environment variable
+if [ -n "$DUST_VERSION" ]; then
+ VERSION="$DUST_VERSION"
+fi
+
+main