ArtCraft: সৃজনশীল কাজের জন্য ১৪টি মুক্ত প্রোগ্রাম, 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-এ বলেন, তিনি বহুবার এই «ডার্ক প্যাটার্ন»-এ ধরা পড়েছেন: মাসে মাসে দেওয়া বার্ষিক প্ল্যান আগেভাগে ছাড়লে যে জরিমানা লাগে। এটা একক অভিযোগ নয়: ২০২৪-এর জুনে মার্কিন বিচার বিভাগ এই ফি লুকানো ও বাতিল কঠিন করার জন্য Adobe-এর বিরুদ্ধে মামলা করে। Adobe বলে, তাদের শর্ত স্বচ্ছ।

তাঁর জবাব ছিল প্রোগ্রামগুলো নতুন করে বানিয়ে বিনামূল্যে দিয়ে দেওয়া। Anthropic-এর কৃত্রিম বুদ্ধিমত্তা Claude আর Rust ভাষার সাহায্যে, ২০২৬-এর সেপ্টেম্বরের শেষ থেকে অক্টোবরের শুরুর মধ্যে তিনি GitHub-এ প্রথম সাতটি অ্যাপ প্রকাশ করেন — Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign ও Acrobat-এর সমতুল্য — আর কয়েক সপ্তাহে যোগ করেন Word, PowerPoint, Excel, AutoCAD, Pro Tools ও Figma। তাঁর দাবি, এগুলো «ক্লিন-রুম» পুনর্নির্মাণ, ফাইল ফরম্যাটের প্রকাশ্য বিবরণ থেকে তৈরি, কারও কোড ছাড়া।

সব কিছুর সারকথা তাঁর বাক্য, «সফটওয়্যারের যুগ শেষ», সারা বিশ্বে ছড়িয়েছে: একজন মানুষ AI নিয়ে যদি কয়েক সপ্তাহে সেটা বানাতে পারেন যাতে দশক লেগেছিল, তবে পেইড সফটওয়্যার বিপদে। সন্দেহও আছে: সাসেক্স বিশ্ববিদ্যালয়ের অধ্যাপক আন্দ্রেস গুয়াদামুস মনে করিয়ে দেন, এই «ক্লিন-রুম» প্রক্রিয়া যাচাইয়ে টিকবে কি না, আর কতটা কোড তিনি আর কতটা AI লিখেছে, তা এখনো জানা নেই। টমাস জোর দিয়ে বলেন এটা «নিভে যাওয়া এককালীন ঝলক» নয়, আর এখন পর্যন্ত প্রায় প্রতিদিনের নতুন সংস্করণ তাঁকেই ঠিক প্রমাণ করছে।

ArtCraft হলো storytold দলের একটি ওপেন সোর্স প্রকল্প (MIT বা Apache-2.0 লাইসেন্স), যা প্রতিদিনের সৃজনশীল কাজের টুলগুলো Rust-এ শূন্য থেকে নতুন করে লিখছে। এগুলো নেটিভ, হালকা প্রোগ্রাম, সাবস্ক্রিপশন ছাড়া, যা সবচেয়ে পরিচিত বাণিজ্যিক প্রোগ্রামগুলোর কাজের ধরন অনুকরণ করে কিন্তু তাদের কোড নকল করে না। এগুলো চলে Windows, macOS, Linux ও FreeBSD-এ, অনেকগুলো ব্রাউজারেও, আর প্রায় প্রতি সপ্তাহে নতুন সংস্করণ আসে। বাণিজ্যিক নামগুলো শুধু বোঝার সুবিধার জন্য: এই প্রোগ্রামগুলোর সেই ব্র্যান্ডগুলোর সঙ্গে কোনো সম্পর্ক নেই।

টুলগুলো, একে একে

ArtCraft Launcher v0.8.1

এখান থেকে শুরু করুন। এটি বাকি সবগুলোর ইনস্টলার: পুরো ক্যাটালগ দেখায়, আপনার কম্পিউটারের উপযুক্ত সংস্করণ বেছে প্রতিটি অ্যাপ এক ক্লিকে ইনস্টল করে, ফাইল ঠিক আছে কি না যাচাই করে, আর আপডেট এলে জানায়। সব একসঙ্গে একটি প্যাকেজ নেই, তবে এই লঞ্চারই তার সবচেয়ে কাছাকাছি।

PhotoCraft v0.16.0

Photoshop-এর ধাঁচে ছবি সম্পাদক: লেয়ার, সিলেকশন, ব্রাশ, সমন্বয় ও রিটাচিং। GitHub-এ এটি প্রকল্পের সবচেয়ে জনপ্রিয় টুল।

LightCraft v0.14.0

Lightroom-এর ধরনে ছবির লাইব্রেরি ও নন-ডেস্ট্রাক্টিভ RAW ডেভেলপমেন্ট: ছবি গুছিয়ে রাখুন আর এক্সপোজার, রং ও ক্রপ ঠিক করুন, মূল ফাইল না ছুঁয়েই।

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

Acrobat-এর ধারায় PDF পড়া, গোছানো ও সুরক্ষিত করার জন্য: খোলা, টীকা যোগ, পৃষ্ঠার ক্রম বদল ও সুরক্ষিত নথি সংরক্ষণ।

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 যোগফল দিয়ে।
  • অনেক জায়গা নেয়: সব প্ল্যাটফর্ম মিলিয়ে প্রতি সংস্করণে প্রায় ২৪ 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-এ জানান।

তথ্যসূত্র