ArtCraft: 14 phần mềm tự do để sáng tạo, như Photoshop, Premiere, Word hay AutoCAD

🌐 Español · English · Português · Français · Italiano · Deutsch · Nederlands · Polski · Русский · Українська · Türkçe · Ελληνικά · العربية · فارسی · עברית · हिन्दी · বাংলা · தமிழ் · Bahasa Indonesia · Tiếng Việt · ไทย · 中文 · 日本語 · 한국어 · Kiswahili

Câu chuyện: một khoản phí hủy quá nhiều

Câu chuyện lan truyền trên các diễn đàn và mạng xã hội mấy tuần nay là ArtCraft ra đời từ cơn giận: tác giả của nó «bị lừa». Đứng sau dự án là Brandon Thomas, kỹ sư phần mềm ở Atlanta (Mỹ) với mười lăm năm trong nghề, từng viết trên Reddit với tên u/ai_art_is_art. Chữ «lừa đảo» là của cộng đồng; điều ông kể là Adobe đã thu của ông phí hủy gói thuê bao.

«Họ đã thu tôi ‘phí hủy’ nhiều lần và từ đó tôi ghét họ», ông viết trên Reddit. Trên Hacker News, ông nói mình đã mắc vào «mẫu thiết kế đen tối» đó quá nhiều lần: khoản phạt khi rời sớm một gói năm trả theo tháng. Đây không phải lời phàn nàn đơn lẻ: tháng 6/2024, Bộ Tư pháp Mỹ đã kiện Adobe vì che giấu các khoản phí này và gây khó cho việc hủy. Adobe khẳng định điều khoản của họ minh bạch.

Câu trả lời của ông là làm lại các phần mềm và cho đi miễn phí. Với sự trợ giúp của Claude, trí tuệ nhân tạo của Anthropic, và ngôn ngữ Rust, từ cuối tháng 9 đến đầu tháng 10/2026 ông đã đăng lên GitHub bảy ứng dụng đầu tiên — tương đương Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign và Acrobat — và chỉ trong vài tuần đã bổ sung Word, PowerPoint, Excel, AutoCAD, Pro Tools và Figma. Ông khẳng định đây là những bản tái hiện «phòng sạch», làm từ đặc tả công khai của các định dạng tệp, không dùng mã của ai.

Câu nói tóm gọn mọi thứ của ông, «phần mềm đã hết thời», lan khắp thế giới: nếu một người với AI có thể làm lại trong vài tuần những gì mất hàng chục năm, phần mềm trả phí sẽ gặp khó. Cũng có người nghi ngờ: giáo sư Andrés Guadamuz của Đại học Sussex nhắc rằng vẫn chưa rõ quy trình «phòng sạch» ấy có đứng vững khi bị xem xét không, và bao nhiêu mã do ông viết, bao nhiêu do AI. Thomas khẳng định đây không phải «một ánh chớp nhất thời rồi tắt», và đến giờ nhịp phát hành gần như mỗi ngày đang chứng minh ông đúng.

ArtCraft là dự án mã nguồn mở (giấy phép MIT hoặc Apache-2.0) của nhóm storytold, đang viết lại từ đầu, bằng Rust, những công cụ ta dùng hằng ngày để sáng tạo. Đây là các chương trình gốc, nhẹ, không thuê bao, mô phỏng cách hoạt động của những phần mềm thương mại nổi tiếng nhất mà không sao chép mã của chúng. Chúng chạy trên Windows, macOS, Linux và FreeBSD, nhiều cái chạy cả trên trình duyệt, và gần như tuần nào cũng có phiên bản mới. Các tên thương mại được nhắc chỉ để tham khảo: những phần mềm này không liên quan gì đến các thương hiệu đó.

Từng công cụ một

ArtCraft Launcher v0.8.1

Hãy bắt đầu từ đây. Đây là trình cài đặt tất cả các ứng dụng còn lại: hiển thị toàn bộ danh mục, cài mỗi ứng dụng chỉ với một cú nhấp và chọn đúng bản cho máy bạn, kiểm tra tệp không bị hỏng và báo khi có bản cập nhật. Không có gói duy nhất chứa tất cả, nhưng trình khởi chạy này là thứ gần nhất.

PhotoCraft v0.16.0

Trình chỉnh sửa ảnh theo tinh thần Photoshop: lớp, vùng chọn, cọ, điều chỉnh và retouch. Đây là công cụ phổ biến nhất của dự án trên GitHub.

LightCraft v0.14.0

Thư viện ảnh và xử lý RAW không phá hủy kiểu Lightroom: sắp xếp ảnh và chỉnh phơi sáng, màu sắc, cắt cúp mà không bao giờ động đến tệp gốc.

VectorCraft v0.17.0

Minh họa vector như trong Illustrator: đường cong, hình khối, nét và chữ phóng to không giảm chất lượng. Dùng cho logo, biểu tượng và áp phích.

FilmCraft v0.13.0

Trình dựng video phi tuyến, giống Premiere Pro: dòng thời gian nhiều track, cắt ghép, chỉnh màu và âm thanh.

EffectCraft v0.17.0

Đồ họa chuyển động, ghép lớp và hiệu ứng hình ảnh theo hướng After Effects: tiêu đề, hoạt ảnh keyframe và các lớp kết hợp với nhau.

SoundCraft v0.13.1

Trạm âm thanh để thu, chỉnh sửa và phối, lấy cảm hứng từ Pro Tools: nhiều track, cắt, hiệu ứng và bản phối cuối.

DesignCraft v0.13.0

Dàn trang và xuất bản kiểu InDesign: tạp chí, tờ gấp và sách với trang, cột, kiểu chữ và hình ảnh.

FigCraft v0.11.2

Thiết kế giao diện và tạo mẫu thử, như Figma: màn hình ứng dụng và web, thành phần tái sử dụng và bản phác cho thấy một thứ sẽ hoạt động ra sao trước khi được xây dựng.

PdfCraft v0.14.0

Để đọc, sắp xếp và bảo vệ PDF, theo hướng Acrobat: mở, ghi chú, sắp lại trang và lưu tài liệu được bảo vệ.

WordCraft v0.11.0

Trình soạn thảo văn bản giống Word, cho thư, báo cáo và tài liệu có kiểu định dạng, bảng và hình ảnh.

DeckCraft v0.11.1

Bài thuyết trình và trang chiếu kiểu PowerPoint: trang chiếu có chữ, hình ảnh và hình khối để trình chiếu toàn màn hình.

GridCraft v0.12.1

Bảng tính như Excel: công thức, bảng dữ liệu, biểu đồ, sắp xếp hoặc lọc thông tin.

CADCraft v0.13.0

Thiết kế có máy tính hỗ trợ và vẽ kỹ thuật theo hướng AutoCAD: bản vẽ với số đo chính xác, lớp và kích thước.

ArtCraft v0.41.0

Ứng dụng đặt tên cho dự án, và là cái duy nhất đứng riêng: một xưởng tạo hình ảnh và video bằng trí tuệ nhân tạo, dành cho nghệ sĩ, nhà thiết kế và nhà làm phim. Hiện chỉ có cho Windows và Mac.

Lưu giữ tất cả: mã nguồn và tệp thực thi

Nếu bạn thích giữ bản sao mọi thứ (phòng khi một ngày dự án biến mất, hoặc để cài đặt không cần Internet), script Linux này tải mã nguồn của từng công cụ và mọi tệp thực thi của phiên bản mới nhất, xếp vào thư mục theo công cụ và theo hệ điều hành (Windows, macOS, Linux, FreeBSD và web). Giải nén rồi chạy; tham số là thư mục đích, và với PLATFORMS và EXCLUDE bạn chọn tải gì. (Chú thích trong đó bằng tiếng Tây Ban Nha.)

⬇ Tải script (artcraft-mirror.zip)

chmod +x artcraft-mirror.sh
./artcraft-mirror.sh ~/artcraft

PLATFORMS="windows linux" EXCLUDE='riscv64|aarch64' ./artcraft-mirror.sh ~/artcraft
  • Có thể ngắt giữa chừng: nếu bị dừng, chạy lại và nó tiếp tục từ chỗ cũ.
  • Chỉ tải cái mới: khi có phiên bản mới, nó tạo thư mục riêng và không đụng đến các bản cũ.
  • Kiểm tra mọi thứ bằng tổng SHA-256 mà mỗi phiên bản công bố.
  • Tốn nhiều dung lượng: tất cả nền tảng cộng lại khoảng 24 GB mỗi phiên bản; nếu chỉ cần một vài, hãy lọc.
Xem toàn bộ script
#!/usr/bin/env bash
# artcraft-mirror.sh — espejo local de las Craft Apps de ArtCraft (github.com/storytold)
#
# Estructura que genera:
#   <DEST>/<herramienta>/code/<rama>-<herramienta>-AAAAMMDD.zip   (+ .sha con el commit)
#   <DEST>/<herramienta>/release-<versión>/{windows,macos,linux,freebsd,web,otros}/...
#   <DEST>/<herramienta>/release-<versión>/SHA256SUMS.txt
#
# - Reanudable: las descargas van a *.part y continúan con Range (curl -C -).
#   Una release se da por terminada sólo cuando todo se verificó contra SHA256SUMS
#   (queda el marcador .complete). Si se corta, se vuelve a ejecutar y sigue.
# - Incremental: sólo mira la última release de cada herramienta; las carpetas
#   release-* anteriores y los zip de código de días anteriores no se tocan.
# - El código fuente se baja sólo si el commit de la rama principal cambió.
#
# Uso:
#   ./artcraft-mirror.sh [DEST]           (DEST por defecto: carpeta del script)
# Variables opcionales:
#   GITHUB_TOKEN=ghp_...                  sube el límite de la API de 60 a 5000 llamadas/h
#   PLATFORMS="windows linux macos"       sólo estas plataformas (por defecto todas)
#   EXCLUDE='riscv64|aarch64|flatpak'     regex de nombres de archivo a omitir
#   TOOLS="photocraft cadcraft"           sólo estas herramientas
#   EXTRA_TOOLS="anicraft"                añadir repos de storytold no incluidos en el catálogo
#   SKIP_CODE=1 / SKIP_RELEASES=1

set -uo pipefail

OWNER=storytold
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
DEST=${1:-$SCRIPT_DIR}
PLATFORMS=${PLATFORMS:-"windows macos linux freebsd web otros"}
EXCLUDE=${EXCLUDE:-}
TODAY=$(date +%Y%m%d)

# Catálogo de respaldo por si no se puede leer el del launcher
FALLBACK_TOOLS="photocraft vectorcraft filmcraft lightcraft pdfcraft effectcraft designcraft
figcraft wordcraft soundcraft deckcraft cadcraft gridcraft"
# Fuera del catálogo del launcher pero con releases propias
ALWAYS_TOOLS="craft-launcher artcraft"

for bin in curl jq git sha256sum flock; do
    command -v "$bin" >/dev/null || { echo "Falta '$bin'" >&2; exit 1; }
done

mkdir -p "$DEST"
exec 9>"$DEST/.artcraft-mirror.lock"
flock -n 9 || { echo "Ya hay otra ejecución en curso en $DEST" >&2; exit 1; }

log()  { printf '[%s] %s\n' "$(date +%H:%M:%S)" "$*"; }
warn() { printf '[%s] AVISO: %s\n' "$(date +%H:%M:%S)" "$*" >&2; }

api() {
    local auth=()
    [[ -n ${GITHUB_TOKEN:-} ]] && auth=(-H "Authorization: Bearer $GITHUB_TOKEN")
    curl -fsSL --retry 3 -H "Accept: application/vnd.github+json" "${auth[@]}" \
        "https://api.github.com/$1"
}

# Descarga: $1 url, $2 destino final, $3 tamaño esperado.
# Con tamaño conocido continúa el .part (Range); sin él (zip de código, generado
# al vuelo y sin Range) empieza de cero.
fetch() {
    local url=$1 out=$2 size=${3:-} part="$2.part" have resume=()
    mkdir -p "$(dirname "$out")"
    if [[ -n $size && -f $part ]]; then
        have=$(stat -c %s "$part")
        if (( have == size )); then mv -f "$part" "$out"; return 0; fi
        if (( have > size )); then rm -f "$part"; fi
        resume=(-C -)
    else
        rm -f "$part"
    fi
    curl -fL --retry 5 --retry-delay 5 --retry-all-errors "${resume[@]}" \
        --progress-bar -o "$part" "$url" || return 1
    mv -f "$part" "$out"
}

platform_of() {
    case $1 in
        SHA256SUMS*)                              echo . ;;
        *windows*|*.msi|*.exe)                    echo windows ;;
        *macos*|*.dmg|*.app.tar.gz|*universal*)   echo macos ;;
        *freebsd*)                                echo freebsd ;;
        *linux*|*.AppImage*|*.deb|*.rpm|*.flatpak) echo linux ;;
        *-web-*)                                  echo web ;;
        *)                                        echo otros ;;
    esac
}

wanted() {
    local name=$1 plat=$2
    [[ $plat == . ]] && return 0
    [[ " $PLATFORMS " == *" $plat "* ]] || return 1
    [[ -n $EXCLUDE && $name =~ $EXCLUDE ]] && return 1
    return 0
}

tool_list() {
    if [[ -n ${TOOLS:-} ]]; then echo $TOOLS; return; fi
    local cat
    cat=$(curl -fsSL "https://raw.githubusercontent.com/$OWNER/craft-launcher/main/crates/core/src/catalog.rs" 2>/dev/null \
          | grep -oE "\"$OWNER/[a-z0-9-]+\"" | tr -d '"' | cut -d/ -f2 | grep -v '^craft-launcher$' | sort -u)
    [[ -z $cat ]] && { warn "no pude leer el catálogo del launcher; uso la lista interna"; cat=$FALLBACK_TOOLS; }
    echo $cat $ALWAYS_TOOLS ${EXTRA_TOOLS:-} | tr ' ' '\n' | awk 'NF && !seen[$0]++'
}

mirror_code() {
    local tool=$1 dir="$DEST/$1/code" head branch sha last
    head=$(git ls-remote --symref "https://github.com/$OWNER/$tool" HEAD 2>/dev/null) \
        || { warn "$tool: no pude consultar el repositorio"; return 1; }
    branch=$(awk '/^ref:/ {sub("refs/heads/","",$2); print $2}' <<<"$head")
    sha=$(awk '$2=="HEAD" && $1!="ref:" {print $1}' <<<"$head")
    mkdir -p "$dir"

    last=$(ls -1 "$dir"/*.zip.sha 2>/dev/null | sort | tail -1)
    if [[ -n $last && $(<"$last") == "$sha" ]]; then
        log "$tool: código al día ($branch@${sha:0:8})"
        return 0
    fi
    local zip="$dir/$branch-$tool-$TODAY.zip"
    log "$tool: bajando código $branch@${sha:0:8} → $(basename "$zip")"
    # El zip por commit garantiza que el archivo corresponde al sha anotado
    fetch "https://github.com/$OWNER/$tool/archive/$sha.zip" "$zip" || { warn "$tool: falló el zip"; return 1; }
    echo "$sha" > "$zip.sha"
}

verify() { # $1 archivo, $2 SHA256SUMS → 0 ok / 1 mal / 2 sin suma publicada
    local file=$1 sums=$2 expected
    [[ -f $sums ]] || return 2
    expected=$(awk -v n="$(basename "$file")" '{f=$2; sub(/^\*/,"",f)} f==n {print $1}' "$sums")
    [[ -z $expected ]] && return 2
    [[ $(sha256sum "$file" | cut -d' ' -f1) == "$expected" ]]
}

mirror_release() {
    local tool=$1 json tag ver rdir
    json=$(api "repos/$OWNER/$tool/releases/latest") || { warn "$tool: sin releases o límite de API alcanzado"; return 1; }
    tag=$(jq -r .tag_name <<<"$json")
    ver=${tag#"$tool"-}; ver=${ver#v}
    rdir="$DEST/$tool/release-$ver"

    if [[ -f $rdir/.complete && $(<"$rdir/.complete") == "$PLATFORMS|$EXCLUDE" ]]; then
        log "$tool: release $ver ya completa"
        return 0
    fi
    log "$tool: release $ver"
    mkdir -p "$rdir"
    jq -c '{tag_name, name, published_at, html_url, body}' <<<"$json" > "$rdir/release.json"

    local ok=1 name url size plat out sums="$rdir/SHA256SUMS.txt"
    # SHA256SUMS primero para poder verificar el resto
    while IFS=$'\t' read -r name url size; do
        plat=$(platform_of "$name")
        wanted "$name" "$plat" || continue
        if [[ $plat == . ]]; then out="$rdir/$name"; else out="$rdir/$plat/$name"; fi

        if [[ -f $out ]]; then
            verify "$out" "$sums"; case $? in
                0) continue ;;
                2) [[ $(stat -c %s "$out") == "$size" ]] && continue ;;
            esac
            warn "$tool: $name no coincide, se vuelve a bajar"; rm -f "$out"
        fi
        log "  ↓ ${out#"$rdir"/} ($((size / 1048576)) MiB)"
        if ! fetch "$url" "$out" "$size"; then warn "  falló $name"; ok=0; continue; fi
        verify "$out" "$sums"; case $? in
            1) warn "  checksum INCORRECTO: $name (se borra)"; rm -f "$out"; ok=0 ;;
            2) [[ $name != SHA256SUMS* ]] && [[ $(stat -c %s "$out") != "$size" ]] && { warn "  tamaño incorrecto: $name"; rm -f "$out"; ok=0; } ;;
        esac
    done < <(jq -r '.assets | sort_by(.name | startswith("SHA256SUMS") | not)[]
                    | [.name, .browser_download_url, .size] | @tsv' <<<"$json")

    if (( ok )); then echo "$PLATFORMS|$EXCLUDE" > "$rdir/.complete"; log "$tool: release $ver completa ✔"
    else warn "$tool: release $ver incompleta; vuelve a ejecutar el script para continuar"; return 1; fi
}

fail=0
for tool in $(tool_list); do
    echo "──────── $tool"
    [[ -z ${SKIP_CODE:-} ]]     && { mirror_code "$tool"    || fail=1; }
    [[ -z ${SKIP_RELEASES:-} ]] && { mirror_release "$tool" || fail=1; }
done

(( fail )) && { warn "Hubo errores; ejecuta de nuevo para reintentar lo pendiente."; exit 1; }
log "Todo al día en $DEST"

Đây là những phần mềm còn rất non trẻ, gần như tất cả gắn nhãn alpha sớm: hứa hẹn nhiều, nhưng chưa thể thay thế công cụ chuyên nghiệp cho công việc nghiêm túc. Hãy dùng thử, sao lưu tệp của bạn và báo lỗi trên GitHub của họ.

Tài liệu tham khảo