Історія: одна плата за скасування — і досить
Історія, що ці тижні ширяє форумами й соцмережами: 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. Він запевняє, що це реалізації «в чистій кімнаті» за відкритими специфікаціями форматів, без чужого коду.
Його фраза «софт скінчився» облетіла світ: якщо одна людина з ШІ може за тижні відтворити те, на що пішли десятиліття, платному софту буде непросто. Є й сумніви: професор Андрес Гуадамус із Сассекського університету нагадує, що досі невідомо, чи витримає цей процес «у чистій кімнаті» перевірку і скільки коду написав він, а скільки ШІ. Томас наполягає, що це не «спалах, який згасне», і поки майже щоденний темп випусків підтверджує його правоту.
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 ГБ на версію; якщо потрібні не всі, скористайтеся фільтром.
Показати скрипт повністю
#!/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