
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ę.