ArtCraft : 14 logiciels libres pour créer, comme Photoshop, Premiere, Word ou AutoCAD

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

L’histoire : des frais de résiliation de trop

L’histoire qui circule ces semaines-ci sur les forums et les réseaux, c’est qu’ArtCraft est né d’une colère : son auteur « s’est fait arnaquer ». Derrière le projet se trouve Brandon Thomas, ingénieur logiciel d’Atlanta (États-Unis) avec quinze ans de métier, qui signait sur Reddit u/ai_art_is_art. Le mot « arnaque » est celui du public ; lui raconte qu’Adobe lui a facturé les frais de résiliation de son abonnement.

« Ils m’ont facturé les “frais de résiliation” à plusieurs reprises et je les déteste depuis », a-t-il écrit sur Reddit. Sur Hacker News, il a dit s’être fait prendre trop souvent par ce « dark pattern » : la pénalité prélevée quand on quitte avant terme un forfait annuel payé au mois. Ce n’est pas une plainte isolée : en juin 2024, le ministère américain de la Justice a poursuivi Adobe pour avoir caché ces frais et compliqué la résiliation. Adobe soutient que ses conditions sont transparentes.

Sa réponse : refaire les logiciels et les offrir. Avec l’aide de Claude, l’intelligence artificielle d’Anthropic, et du langage Rust, il a publié sur GitHub entre fin septembre et début octobre 2026 les sept premières applications — l’équivalent de Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign et Acrobat — puis, en quelques semaines, Word, PowerPoint, Excel, AutoCAD, Pro Tools et Figma. Il affirme qu’il s’agit de réimplémentations « en salle blanche », faites à partir des spécifications publiques des formats, sans le code de personne.

La phrase qui résume tout, « le logiciel, c’est fini », a fait le tour du monde : si une personne avec l’IA peut refaire en quelques semaines ce qui a pris des décennies, le logiciel payant aura du mal. Certains doutent : le professeur Andrés Guadamuz, de l’université du Sussex, rappelle qu’on ne sait pas encore si ce processus « en salle blanche » résiste à l’examen, ni quelle part du code il a écrite et quelle part l’IA. Thomas assure que ce n’est pas « un feu de paille qui va mourir », et pour l’instant le rythme quasi quotidien des versions lui donne raison.

ArtCraft est un projet open source (licence MIT ou Apache-2.0) de l’équipe storytold qui réécrit de zéro, en Rust, les outils que nous utilisons chaque jour pour créer. Ce sont des programmes natifs et légers, sans abonnement, qui imitent le fonctionnement des logiciels commerciaux les plus connus sans copier leur code. Ils tournent sous Windows, macOS, Linux et FreeBSD, beaucoup aussi dans le navigateur, et de nouvelles versions sortent presque chaque semaine. Les noms commerciaux cités ne sont qu’un repère : ces logiciels n’ont aucun lien avec ces marques.

Les outils, un par un

ArtCraft Launcher v0.8.1

Commencez par celui-ci. C’est l’installateur de tous les autres : il affiche le catalogue complet, installe chaque application en un clic en choisissant la bonne version pour votre ordinateur, vérifie que le fichier n’est pas abîmé et prévient quand il y a des mises à jour. Il n’existe pas de paquet unique avec tout, mais ce lanceur s’en approche le plus.

PhotoCraft v0.16.0

L’éditeur d’images, dans l’esprit de Photoshop : calques, sélections, pinceaux, réglages et retouche. C’est l’outil le plus populaire du projet sur GitHub.

LightCraft v0.14.0

Photothèque et développement RAW non destructif, façon Lightroom : vous organisez vos photos et réglez exposition, couleur et recadrage sans jamais toucher au fichier d’origine.

VectorCraft v0.17.0

Illustration vectorielle comme dans Illustrator : courbes, formes, tracés et texte qui s’agrandissent sans perte de qualité. Idéal pour logos, icônes et affiches.

FilmCraft v0.13.0

Montage vidéo non linéaire, proche de Premiere Pro : timeline multipiste, coupes, étalonnage et son.

EffectCraft v0.17.0

Animation graphique, compositing et effets visuels dans la lignée d’After Effects : titres, animation par images clés et calques qui se combinent.

SoundCraft v0.13.1

Station audio pour enregistrer, monter et mixer, inspirée de Pro Tools : plusieurs pistes, coupes, effets et mixage final.

DesignCraft v0.13.0

Mise en page et publication façon InDesign : magazines, brochures et livres avec pages, colonnes, styles de texte et images.

FigCraft v0.11.2

Conception d’interfaces et prototypage, comme Figma : écrans d’applications et de sites, composants réutilisables et maquettes pour montrer comment une chose fonctionnera avant de la programmer.

PdfCraft v0.14.0

Pour lire, organiser et protéger des PDF, dans la lignée d’Acrobat : ouvrir, annoter, réordonner les pages et enregistrer des documents protégés.

WordCraft v0.11.0

Traitement de texte proche de Word, pour lettres, rapports et documents avec styles, tableaux et images.

DeckCraft v0.11.1

Présentations et diaporamas, façon PowerPoint : diapositives avec texte, images et formes à projeter en plein écran.

GridCraft v0.12.1

Tableur comme Excel : formules, tableaux de données, graphiques, tri et filtrage des informations.

CADCraft v0.13.0

Conception assistée par ordinateur et dessin technique, dans la lignée d’AutoCAD : plans aux mesures exactes, calques et cotes.

ArtCraft v0.41.0

L’application qui donne son nom au projet, et la seule à part : un studio pour créer images et vidéos avec l’intelligence artificielle, pensé pour les artistes, designers et cinéastes. Pour l’instant uniquement sous Windows et Mac.

Gardez-les tous : code source et exécutables

Si vous aimez garder une copie de tout (au cas où un projet disparaîtrait un jour, ou pour installer sans Internet), ce script pour Linux télécharge le code source de chaque outil et tous les exécutables de sa dernière version, rangés dans des dossiers par outil et par système (Windows, macOS, Linux, FreeBSD et web). Décompressez-le et lancez-le ; l’argument est le dossier de destination, et PLATFORMS et EXCLUDE choisissent quoi télécharger. (Ses commentaires sont en espagnol.)

⬇ Télécharger le script (artcraft-mirror.zip)

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

PLATFORMS="windows linux" EXCLUDE='riscv64|aarch64' ./artcraft-mirror.sh ~/artcraft
  • On peut l’interrompre : s’il s’arrête, relancez-le et il reprend là où il en était.
  • Il ne télécharge que la nouveauté : à chaque version, il crée son dossier sans toucher aux anciens.
  • Il vérifie tout avec les sommes SHA-256 publiées pour chaque version.
  • Ça prend de la place : toutes les plateformes font environ 24 Go par version ; si seules certaines vous intéressent, filtrez.
Voir le script complet
#!/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"

Ce sont des programmes très jeunes, presque tous marqués alpha précoce : ils promettent beaucoup, mais ne remplacent pas encore les outils professionnels pour un travail sérieux. Essayez-les, gardez une copie de vos fichiers et, si vous trouvez un bug, signalez-le sur leur GitHub.

Références