הסיפור: דמי ביטול אחד יותר מדי
הסיפור שמסתובב בשבועות האלה בפורומים וברשתות הוא ש-ArtCraft נולד מכעס: היוצר שלו „עבדו עליו”. מאחורי הפרויקט עומד ברנדון תומאס (Brandon Thomas), מהנדס תוכנה מאטלנטה (ארה״ב) עם חמש־עשרה שנות ניסיון, שכתב ב-Reddit בשם u/ai_art_is_art. המילה „הונאה” היא של הקהל; הוא עצמו מספר ש-Adobe גבתה ממנו את דמי הביטול של המנוי.
„הם גבו ממני את ‚דמי הביטול’ כמה פעמים, ומאז אני שונא אותם”, כתב ב-Reddit. ב-Hacker News אמר שנפל יותר מדי פעמים ב„תבנית האפלה” הזו: הקנס על עזיבה מוקדמת של תוכנית שנתית שמשולמת חודשית. זו לא תלונה בודדת: ביוני 2024 תבע משרד המשפטים האמריקאי את Adobe על הסתרת הדמים האלה והערמת קשיים על הביטול. Adobe טוענת שתנאיה שקופים.
התשובה שלו הייתה לבנות את התוכנות מחדש ולחלק אותן בחינם. בעזרת Claude, הבינה המלאכותית של Anthropic, ושפת Rust, הוא פרסם ב-GitHub בין סוף ספטמבר לתחילת אוקטובר 2026 את שבע האפליקציות הראשונות — המקבילות ל-Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign ו-Acrobat — ותוך שבועות ספורים הוסיף את Word, PowerPoint, Excel, AutoCAD, Pro Tools ו-Figma. לדבריו אלה מימושים „בחדר נקי”, על סמך המפרטים הציבוריים של פורמטי הקבצים, בלי קוד של אף אחד.
המשפט שבו סיכם הכול, „התוכנה נגמרה”, הקיף את העולם: אם אדם אחד עם בינה מלאכותית יכול לבנות מחדש בשבועות מה שלקח עשורים, לתוכנה בתשלום יהיה קשה. יש גם ספקות: פרופ׳ אנדרס גוואדמוס מאוניברסיטת סאסקס מזכיר שעדיין לא ידוע אם תהליך „החדר הנקי” הזה עומד בבדיקה, וכמה מהקוד כתב הוא וכמה הבינה המלאכותית. תומאס מתעקש שזו לא „התלקחות חד־פעמית שתדעך”, ולעת עתה קצב הגרסאות, כמעט יומי, נותן לו צדק.
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 ו-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 שלהן.
מקורות
- GitHub · storytold (todas las Crafting Apps)
- GitHub · ArtCraft Launcher
- GitHub · ArtCraft
- getartcraft.com
- Al Jazeera (14-10-2026) · How AI apps are offering free substitutes for Big Tech software
- Amateur Photographer (08-10-2026) · This home coder got so sick of Adobe he built free, open-source versions of Photoshop, Lightroom and Premiere
- PetaPixel (07-10-2026) · Someone Rebuilt Free, Open-Source Versions of Photoshop, Premiere, and Lightroom Using AI
- Creative Bloq · Someone just rebuilt Adobe Creative Cloud with AI – then gave it away for free
- CineD · ArtCraft Releases Free Open-Source Adobe Alternatives
- Korben · I tested the 12 free clones of Adobe and Microsoft