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. Διαβεβαιώνει ότι είναι υλοποιήσεις «καθαρού δωματίου», με βάση τις δημόσιες προδιαγραφές των μορφών αρχείων, χωρίς κώδικα κανενός.

Η φράση του «το λογισμικό τελείωσε» έκανε τον γύρο του κόσμου: αν ένας άνθρωπος με ΤΝ μπορεί να ξαναφτιάξει σε εβδομάδες ό,τι πήρε δεκαετίες, το επί πληρωμή λογισμικό θα δυσκολευτεί. Υπάρχουν αμφιβολίες: ο καθηγητής Andrés Guadamuz του Πανεπιστημίου του Sussex θυμίζει ότι δεν ξέρουμε ακόμη αν αυτή η διαδικασία «καθαρού δωματίου» αντέχει σε έλεγχο, ούτε πόσο κώδικα έγραψε εκείνος και πόσο η ΤΝ. Ο Thomas επιμένει ότι δεν είναι «μια φωτοβολίδα που θα σβήσει», και προς το παρόν ο σχεδόν καθημερινός ρυθμός εκδόσεων τον δικαιώνει.

Το 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.

Κρατήστε τα όλα: πηγαίος κώδικας και εκτελέσιμα

Αν σας αρέσει να έχετε αντίγραφο από όλα (μήπως κάποτε εξαφανιστεί ένα έργο, ή για εγκατάσταση χωρίς Internet), αυτό το σενάριο για Linux κατεβάζει τον πηγαίο κώδικα κάθε εργαλείου και όλα τα εκτελέσιμα της τελευταίας έκδοσης, ταξινομημένα σε φακέλους ανά εργαλείο και σύστημα (Windows, macOS, Linux, FreeBSD και web). Αποσυμπιέστε το και εκτελέστε το· το όρισμα είναι ο φάκελος προορισμού, και με 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 τους.

Αναφορές