// 2026-04-29 · 5 min

remove-bg: usuwanie tła ze zdjęć z natywnego macOS, z poziomu terminala

remove-bg: usuwanie tła ze zdjęć z natywnego macOS, z poziomu terminala

TL;DR

remove-bg to dwucyfrowa liczba linii Swifta, która opakowuje natywny macOS Vision request VNGenerateForegroundInstanceMaskRequest w CLI. Czyli ten sam silnik usuwania tła co Preview/Finder „Usuń tło” — tylko z terminala, w pipeline’ach, w pętli for po folderze. Plus skill do Claude Code, żeby agent sam to wołał, kiedy mówisz „wytnij tło z tego pliku”.

Repo: github.com/stroniarz/remove-bg Licencja: MIT Wymagania: macOS 14+

Problem

Zdjęcia produktowe, mockupy, hero illustrations, ikonki na Slacka — co kilka dni potrzebuję wyciąć obiekt z tła. Klikanie w Preview działa, ale:

  • nie działa w pętli po folderze
  • nie działa z poziomu skryptu publikacyjnego
  • nie działa, kiedy Claude Code prowadzi cały workflow przygotowania assetów

remove.bg API kosztuje, ma rate limit i wysyła wszystko na zewnątrz. Lokalnych modeli (rembg, BiRefNet) używałem — i jakość bywa, ale instalacja Pythona z odpowiednimi wagami za każdym razem to nie jest „one-liner”.

A Apple od macOS 14 ma w systemie model, który robi to lepiej niż większość lokalnych torchowych setupów. Ten sam, który widzisz w Preview, w Finderze, w Photos. Brakowało tylko CLI.

Rozwiązanie: 70 linii Swifta

let request = VNGenerateForegroundInstanceMaskRequest() let handler = VNImageRequestHandler(ciImage: ciImage, options: [:]) try handler.perform([request])

To są trzy kluczowe linie. Reszta to wczytanie obrazka, kompozycja maski na alfę, zapis PNG. Cały skrypt buduje się jednym xcrun swiftc -O remove_bg.swift -o remove-bg — bez zewnętrznych zależności, bez pip install, bez kontenerów.

Użycie:

remove-bg input.jpg output.png

Batch:

mkdir -p out for f in *.jpg; do remove-bg "$f" "out/${f%.jpg}.png"; done

I to jest cała powierzchnia narzędzia. Bo tak naprawdę inteligencja siedzi w Vision frameworku — i Apple ją utrzymuje.

Dlaczego CLI to było warte zachodu

Trzy momenty z ostatniego tygodnia, kiedy remove-bg ratował robotę:

1. Przygotowanie zdjęć produktowych dla klienta. Folder z 40 fotkami ze studia, każda z bałaganem na podłodze, wszystkie potrzebne na białym/transparentnym tle. Zamiast 40 razy klikać w Preview — for f in *.jpg; do remove-bg "$f" "out/${f%.jpg}.png"; done. Cztery sekundy.

2. Hero ilustracja na bloga. Generuję background w heroes/, do tego potrzebuję mockupa terminala wyciętego na alfę. Skript generate-hero.js woła remove-bg w jednym kroku pipeline’u — bez ręcznego rozdzielania faz „wygeneruj background”, „wytnij obiekt”, „połącz”.

3. Claude Code workflow. „Zrób mi hero do posta o NotebookLM” — Claude generuje grafikę, woła remove-bg, wkleja w hero template, daje preview. Zero klikania.

Punkt 3 był punktem zapalnym do napisania skilla do Claude Code.

Skill do Claude Code

W repo jest plik SKILL.md — frontmatter + opis, który Claude Code czyta i decyduje, czy odpalić to narzędzie. Triggery są dwujęzyczne (EN/PL):

Triggers on phrases like “remove background”, “cut out subject”, “isolate product”, “transparent PNG”, and Polish equivalents (“wytnij tło”, “usuń tło”).

Po ./install.sh skill jest symlinkowany do ~/.claude/skills/remove-bg/. W sesji Claude Code wystarczy:

Wytnij tło z ~/Desktop/produkt.jpg.

Claude czyta SKILL.md, wie że ma uruchomić remove-bg input output, robi to, raportuje ścieżkę pliku wynikowego. Bez tłumaczenia za każdym razem „a teraz uruchom to narzędzie z tymi argumentami”.

To jest dla mnie ten moment, kiedy „tool” staje się częścią agenta, a nie kolejnym CLI do zapamiętania.

Co działa, co nie

Działa: – JPG, PNG, HEIC, TIFF, WEBP — wszystko, co Cocoa potrafi zdekodować – Subject z wyraźną krawędzią — produkty, ludzie, zwierzęta, większość obiektów – Batch po folderze – Pipeline’y CI/CD na macOS runnerach

Nie działa albo działa źle: – macOS < 14 — Vision request nie istnieje, exit 3 – Brak wyraźnego foreground subject — pusta maska, output transparentny – Wiele subjectów na jednym zdjęciu — Vision łączy wszystkie w jedną maskę, nie dokładnie izoluje pojedyncze – Bardzo duże obrazy (>50 MP) — Vision potrafi wyrzucić out-of-memory; trzeba downscale’ować przez sips najpierw

Dlaczego nie po prostu „uruchom Preview z Automatorem”

Próbowałem. Automator workflow z Preview działa, ale: – nie integruje się z Claude Code – wolniejszy (uruchamia GUI Preview) – nie jest pipe-friendly — output to plik w Trashu po Quick Action – nie ma kodów wyjścia do skryptów

CLI z exit codes (0 ok / 1 usage / 2 load failed / 3 Vision error) to standard, który skrypty mogą obsłużyć. Plus 70 linii Swifta jest bardzo przejrzyste — całe repo można przeczytać w 2 minuty.

Plan na dalej

  • Wersja z prompt-em (jak Claude Vision API) — żeby móc napisać „wytnij tylko buty, zostaw resztę”. Vision tego natywnie nie ma; trzeba by zhybrydyzować z Apple Intelligence albo zewnętrznym modelem.
  • Dodanie tła — drugi tryb: zamiast usuwać, generować podmiankę tła z prompt-a (Vision + Image Playground od macOS 15).
  • Web wrapper — rzecz jasna nie publiczny, bo wtedy ktoś by go zaczął rate-limit’ować w produkcji; ale wewnętrzny do paneli klienckich, gdzie obrazy lecą po SSH na MacMini, są przerabiane i wracają na S3.

Repo

Całość na MIT: github.com/stroniarz/remove-bg. Issues mile widziane, PR-y też. Jeśli coś nie zadziała na Twoim macOS — interesuje mnie, dlaczego, bo właśnie po to to publikuję.