ArtCraft: 14 โปรแกรมเสรีสำหรับงานสร้างสรรค์ แบบ Photoshop, Premiere, Word หรือ AutoCAD

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

เรื่องราว: ค่ายกเลิกที่มากเกินไปหนึ่งครั้ง

เรื่องที่แพร่ไปตามฟอรัมและโซเชียลมีเดียช่วงหลายสัปดาห์นี้คือ ArtCraft เกิดจากความโกรธ: ผู้สร้าง «ถูกหลอก» เบื้องหลังโครงการคือ แบรนดอน โทมัส (Brandon Thomas) วิศวกรซอฟต์แวร์จากแอตแลนตา (สหรัฐฯ) ผู้มีประสบการณ์สิบห้าปี ซึ่งเคยเขียนใน Reddit ในชื่อ u/ai_art_is_art คำว่า «หลอกลวง» เป็นคำของผู้คน ส่วนที่เขาเล่าคือ Adobe เรียกเก็บ ค่ายกเลิก การสมัครสมาชิกจากเขา

เขาเขียนใน Reddit ว่า «พวกเขาเรียกเก็บ ‘ค่ายกเลิก’ จากผมหลายครั้ง และผมเกลียดพวกเขามาตั้งแต่นั้น» ส่วนใน Hacker News เขาบอกว่าติดกับดัก «ดาร์กแพตเทิร์น» นี้มาหลายครั้งเกินไป: ค่าปรับเมื่อเลิกแผนรายปีที่จ่ายรายเดือนก่อนกำหนด นี่ไม่ใช่คำร้องเรียนเดี่ยว ๆ: ในเดือนมิถุนายน 2024 กระทรวงยุติธรรมสหรัฐฯ ฟ้อง Adobe ฐานปกปิดค่าธรรมเนียมเหล่านี้และทำให้การยกเลิกยุ่งยาก Adobe ยืนยันว่าเงื่อนไขของตนโปร่งใส

คำตอบของเขาคือสร้างโปรแกรมเหล่านั้นขึ้นใหม่แล้วแจกฟรี ด้วยความช่วยเหลือของ Claude ปัญญาประดิษฐ์ของ Anthropic และภาษา Rust ช่วงปลายเดือนกันยายนถึงต้นเดือนตุลาคม 2026 เขาเผยแพร่เจ็ดแอปแรกบน GitHub — เทียบเท่า Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign และ Acrobat — และภายในไม่กี่สัปดาห์ก็เพิ่ม Word, PowerPoint, Excel, AutoCAD, Pro Tools และ Figma เขายืนยันว่าเป็นการสร้างใหม่แบบ «ห้องสะอาด» จากข้อกำหนดสาธารณะของรูปแบบไฟล์ โดยไม่ใช้โค้ดของใคร

ประโยคที่สรุปทุกอย่างของเขา «ยุคซอฟต์แวร์จบแล้ว» แพร่ไปทั่วโลก: ถ้าคนคนเดียวกับ AI สร้างใหม่ได้ในไม่กี่สัปดาห์ในสิ่งที่ใช้เวลาหลายสิบปี ซอฟต์แวร์แบบเสียเงินก็ลำบาก แต่ก็มีคนสงสัย: ศาสตราจารย์อันเดรส กัวดามุซ แห่งมหาวิทยาลัยซัสเซกซ์ เตือนว่ายังไม่รู้ว่ากระบวนการ «ห้องสะอาด» นี้จะผ่านการตรวจสอบหรือไม่ และโค้ดส่วนไหนเขาเขียนเอง ส่วนไหน AI เขียน โทมัสยืนยันว่านี่ไม่ใช่ «ประกายไฟชั่วครู่ที่จะดับไป» และตอนนี้จังหวะการออกเวอร์ชันที่แทบจะทุกวันก็ยืนยันคำพูดของเขา

ArtCraft เป็นโครงการโอเพนซอร์ส (สัญญาอนุญาต MIT หรือ Apache-2.0) ของทีม storytold ที่กำลังเขียนเครื่องมือสร้างสรรค์ที่เราใช้ทุกวันขึ้นใหม่ตั้งแต่ศูนย์ด้วย Rust เป็นโปรแกรมเนทีฟน้ำหนักเบา ไม่ต้องสมัครสมาชิก เลียนแบบวิธีทำงานของโปรแกรมเชิงพาณิชย์ที่มีชื่อเสียงที่สุดโดยไม่คัดลอกโค้ด ทำงานบน Windows, macOS, Linux และ FreeBSD หลายตัวใช้ในเบราว์เซอร์ได้ด้วย และมีเวอร์ชันใหม่ออกแทบทุกสัปดาห์ ชื่อเชิงพาณิชย์ที่กล่าวถึงเป็นเพียงการอ้างอิง: โปรแกรมเหล่านี้ไม่เกี่ยวข้องกับแบรนด์เหล่านั้น

เครื่องมือทีละตัว

ArtCraft Launcher v0.8.1

เริ่มที่นี่ นี่คือตัวติดตั้งของโปรแกรมอื่นทั้งหมด: แสดงแคตตาล็อกครบ ติดตั้งแต่ละแอปในคลิกเดียวโดยเลือกเวอร์ชันที่เหมาะกับเครื่องคุณ ตรวจว่าไฟล์ไม่เสียหาย และแจ้งเมื่อมีอัปเดต ไม่มีแพ็กเกจเดียวที่รวมทุกอย่าง แต่ตัวเปิดใช้นี้ใกล้เคียงที่สุด

PhotoCraft v0.16.0

โปรแกรมแต่งภาพในแนว Photoshop: เลเยอร์ การเลือก แปรง การปรับแต่ง และรีทัช เป็นเครื่องมือที่ได้รับความนิยมที่สุดของโครงการบน GitHub

LightCraft v0.14.0

คลังภาพและการล้างไฟล์ RAW แบบไม่ทำลายต้นฉบับ สไตล์ Lightroom: จัดระเบียบภาพและปรับแสง สี และการครอปโดยไม่แตะไฟล์ต้นฉบับเลย

VectorCraft v0.17.0

ภาพประกอบเวกเตอร์แบบ Illustrator: เส้นโค้ง รูปทรง เส้น และข้อความที่ขยายได้โดยไม่เสียคุณภาพ เหมาะกับโลโก้ ไอคอน และโปสเตอร์

FilmCraft v0.13.0

โปรแกรมตัดต่อวิดีโอแบบนอนลิเนียร์ คล้าย Premiere Pro: ไทม์ไลน์หลายแทร็ก การตัด แก้สี และเสียง

EffectCraft v0.17.0

โมชันกราฟิก การคอมโพสิต และเอฟเฟกต์ภาพในแนว After Effects: ไตเติล แอนิเมชันคีย์เฟรม และเลเยอร์ที่ผสานกัน

SoundCraft v0.13.1

สถานีเสียงสำหรับอัด ตัดต่อ และมิกซ์ ได้แรงบันดาลใจจาก Pro Tools: หลายแทร็ก การตัด เอฟเฟกต์ และมิกซ์สุดท้าย

DesignCraft v0.13.0

จัดหน้าและงานพิมพ์สไตล์ InDesign: นิตยสาร แผ่นพับ และหนังสือ พร้อมหน้า คอลัมน์ สไตล์ข้อความ และภาพ

FigCraft v0.11.2

ออกแบบอินเทอร์เฟซและต้นแบบ แบบ Figma: หน้าจอแอปและเว็บ คอมโพเนนต์ที่ใช้ซ้ำได้ และม็อกอัปที่แสดงว่าสิ่งหนึ่งจะทำงานอย่างไรก่อนสร้างจริง

PdfCraft v0.14.0

สำหรับอ่าน จัดระเบียบ และป้องกัน PDF ในแนว Acrobat: เปิด ใส่หมายเหตุ เรียงหน้าใหม่ และบันทึกเอกสารที่ป้องกันไว้

WordCraft v0.11.0

โปรแกรมประมวลผลคำคล้าย Word สำหรับจดหมาย รายงาน และเอกสารที่มีสไตล์ ตาราง และภาพ

DeckCraft v0.11.1

งานนำเสนอและสไลด์สไตล์ PowerPoint: สไลด์ที่มีข้อความ ภาพ และรูปทรงสำหรับนำเสนอเต็มจอ

GridCraft v0.12.1

สเปรดชีตแบบ Excel: สูตร ตารางข้อมูล แผนภูมิ และการเรียงหรือกรองข้อมูล

CADCraft v0.13.0

การออกแบบด้วยคอมพิวเตอร์และเขียนแบบเทคนิคในแนว AutoCAD: แบบแปลนที่มีขนาดแม่นยำ เลเยอร์ และการบอกขนาด

ArtCraft v0.41.0

แอปที่เป็นที่มาของชื่อโครงการ และเป็นตัวเดียวที่แยกจากตัวอื่น: สตูดิโอสร้างภาพและวิดีโอด้วยปัญญาประดิษฐ์ สำหรับศิลปิน นักออกแบบ และคนทำภาพยนตร์ ตอนนี้มีเฉพาะ Windows และ Mac

เก็บไว้ทั้งหมด: ซอร์สโค้ดและไฟล์ปฏิบัติการ

ถ้าคุณชอบเก็บสำเนาทุกอย่าง (เผื่อวันหนึ่งโครงการหายไป หรือเพื่อติดตั้งโดยไม่มีอินเทอร์เน็ต) สคริปต์ Linux นี้จะดาวน์โหลด ซอร์สโค้ด ของแต่ละเครื่องมือ และ ไฟล์ปฏิบัติการทั้งหมดของเวอร์ชันล่าสุด จัดเป็นโฟลเดอร์ตามเครื่องมือและระบบ (Windows, macOS, Linux, FreeBSD และเว็บ) แตกไฟล์แล้วรัน อาร์กิวเมนต์คือโฟลเดอร์ปลายทาง และใช้ PLATFORMS กับ EXCLUDE เลือกว่าจะดาวน์โหลดอะไร (คอมเมนต์ในสคริปต์เป็นภาษาสเปน)

⬇ ดาวน์โหลดสคริปต์ (artcraft-mirror.zip)

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

PLATFORMS="windows linux" EXCLUDE='riscv64|aarch64' ./artcraft-mirror.sh ~/artcraft
  • หยุดกลางคันได้: ถ้าหยุดไป ให้รันอีกครั้ง มันจะทำต่อจากจุดเดิม
  • โหลดเฉพาะของใหม่: เมื่อมีเวอร์ชันใหม่ จะสร้างโฟลเดอร์ของมันโดยไม่แตะของเก่า
  • ตรวจสอบทุกอย่าง ด้วยผลรวม SHA-256 ที่แต่ละเวอร์ชันเผยแพร่
  • ใช้พื้นที่มาก: ทุกแพลตฟอร์มรวมกันราว 24 GB ต่อเวอร์ชัน ถ้าต้องการเพียงบางส่วน ให้กรอง
แสดงสคริปต์ทั้งหมด
#!/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"

โปรแกรมเหล่านี้ยังใหม่มาก เกือบทั้งหมดติดป้าย อัลฟ่าระยะแรก: มีอนาคตไกล แต่ยังแทนเครื่องมือมืออาชีพสำหรับงานจริงจังไม่ได้ ลองใช้ดู สำรองไฟล์ของคุณ และรายงานบั๊กบน GitHub ของพวกเขา

แหล่งอ้างอิง