W skrócie
O projekcie
System magazynowy dla warsztatu, który obraca częściami zdemontowanymi z aut dawców (głównie VW Polo 6R), a do tego trzyma narzędzia i materiały eksploatacyjne. Klient potrzebował jednego źródła prawdy dla całego stanu: gdzie co leży, co jest na sprzedaż i co już zeszło. Zaprojektowałem i zbudowałem system od podstaw: panel w Laravelu z Filamentem, Livewire do reaktywnych fragmentów, PWA na telefon do pracy w warsztacie i sklep na Astro, do którego trafiają części wystawione na sprzedaż.
Wyzwanie
Kilka lat na hobbystycznym remontowaniu i sprzedawaniu Volkswagenów zamieniło garaż w składowisko: setki produktów w obrocie, regały pojemników, do tego narzędzia i chemia warsztatowa. Do rozwiązania było kilka konkretnych problemów:
- Nic nie da się znaleźć. Każdy komponent, który wchodzi do garażu, ląduje w pudle. Pudła są w regałach, regały są w garażu. Żeby znaleźć jeden wspornik, trzeba było otworzyć całe stosy kartonów, bo nic nigdzie nie było spisane. Prosty ruch, jak sprawdzenie „czy mam jeszcze tę drugą klamkę klapy bagażnika”, zabierał kwadranse.
- Ta sama rzecz kupowana dwa razy. Bez ewidencji zdarzało się kupić drugi taki sam pilnik czy filtr, bo pierwszego nie dało się namierzyć w pół godziny. Straty finansowe wynikały nie z drogich zakupów, tylko z ich duplikowania.
- Część leżała w kartonie zamiast wracać do obiegu. Sporo wymontowanych elementów nadaje się do sprzedaży, ale ręczne wystawianie każdego ogłoszenia (zdjęcia, opis, tłumaczenie na angielski dla zagranicznych klientów, wgranie na hosting, przeliczenie ceny na euro) trwało tak długo, że kartony rosły, a sprzedaż stała.
- Brak historii. „Co ja z tym zrobiłem w zeszłym miesiącu?”, „gdzie ostatnio widziałem ten wtyk?” i „czy sprzedałem już ten drugi silniczek nagrzewnicy?” to pytania, na które nikt nie umiał odpowiedzieć.
- Praca musi być mobilna. Garaż nie ma biurka ani laptopa. Wszystkie decyzje trzeba móc podjąć z telefonu, z rękawiczek, jednym palcem, przy oleju na ekranie.
Cele
- Wiedzieć, gdzie jest każda część, narzędzie i materiał, do centymetra: która półka, które pudło.
- Znajdować cokolwiek w kilka sekund z telefonu, brudnymi rękami, z warsztatu.
- Wystawiać ogłoszenia szybko: minuty zamiast godzin, z tłumaczeniem na angielski w cenie.
- Dzielić uprawnienia, gdyby ktoś kiedyś miał pomagać.
- Widzieć historię: co zostało dodane, przesunięte albo sprzedane i przez kogo.
Jak to rozwiązałem
Znajdź każdą część zeskanowaniem pudła
Hierarchia trzypoziomowa: lokalizacja (regał, uchwyt ścienny, miejsce na podłodze) trzyma pojemniki (pudła, kuwety, organizery), a te trzymają przedmioty (części, narzędzia, materiały). Każdy poziom ma własny kod QR z prefiksem: L dla lokalizacji, C dla pojemnika, M dla materiału, T dla narzędzia i sam numer dla produktu. Skanowanie etykiety otwiera właściwy widok, a wystarczy naprowadzić kadr na pudło z regału, żeby zobaczyć jego zawartość.

Skaner obsługuje kilka kodów w jednym kadrze naraz. Jeśli w kadrze znajdzie się półka z rzędem pudeł, PWA pokazuje listę rozpoznanych kontenerów, a tapnięcie w któryś otwiera jego skład.
Wyszukaj bez rąk, głosem
Publiczna PWA to lżejsza wersja interfejsu, przeznaczona do szybkich zapytań z telefonu bez logowania. Ma widoki listy, kompaktu i galerii, filtrowanie po kategorii, pojemniku i statusie magazynowym, plus dwie rzeczy, które ratują sytuację, gdy ręce są brudne:
- Głosowe wyszukiwanie. Użytkownik przytrzymuje mikrofon, mówi numer OE albo nazwę części, puszcza. Wyszukiwarka bierze transkrypcję z przeglądarkowego SpeechRecognition i filtruje listę.
- Skanowanie QR z każdego widoku. Aparat siedzi w topbarze, żeby nie trzeba było najpierw wchodzić w wyszukiwarkę, a potem uruchamiać skaner.
Sprzedaj to, czego nie używasz
Każdy produkt ma przełącznik „Na sprzedaż”. Włączony wypycha go na osobny publiczny sklep na Astro, który konsumuje REST API magazynu z piętnastominutowym cache. Ten cache czyszczą hooki modelu Eloquent przy każdym zapisie, więc API oddaje świeże dane od razu, a nie dopiero po kwadransie. Formularz sprzedaży dokłada to, czego wymaga cross-border e-commerce:
- Dwujęzyczny opis (PL i EN) z automatycznym tłumaczeniem przez DeepL: piszę po polsku, angielski dolatuje przy zapisie.
- Ceny w PLN i EUR z automatycznym przeliczaniem po kursie NBP.
- Status sprzedaży: dostępny, zarezerwowany, sprzedany.
- Generator opisów AI, który proponuje kilka wariantów do wyboru zamiast zmuszać do pisania od zera.
- SEO slugi per język i unikalne QR na etykiety wysyłkowe.

Wystaw ogłoszenie z rozmowy z asystentem
W erze asystentów AI zarządzanie z terminala bywa dużo szybsze niż klikanie po panelu. Otwarcie formularza produktu, wgranie zdjęć po jednym, wpisanie ceny, wybór kategorii, tłumaczenie opisu i publikacja to sporo klikania na jedno ogłoszenie. Napisanie tego samego jako zdania w Claude Code („wystaw folder C:/foto/lampa jako lampę przednią z Golfa VII, kategoria oświetlenie”) sprowadza to do kilku sekund pisania i chwili czekania na miniaturki. Zamiast siedzieć nad panelem, mogę patrzeć w klawiaturę i myśleć nad opisem, a resztę robi asystent.
Przez MCP (Model Context Protocol) Claude Code ma dostęp do tych samych zapisów co panel: tworzenie i aktualizację ogłoszeń oraz audyt i porządkowanie nazw w całym katalogu.
Przy wystawianiu ogłoszenia asystent uruchamia lokalną komendę Artisan, która zmniejsza każde zdjęcie do rozmiaru wystarczającego pod sklep, wysyła je prosto na Cloudflare R2 przez presigned URL-e, potem woła API tworzące ogłoszenie z numerem OE, ceną i polskim opisem. DeepL zamienia opis na angielski przy zapisie.
Tak samo działa porządkowanie nazw. Asystent znajduje powtarzające się etykiety QR, tytuły-zaślepki i brakujące tłumaczenia, a potem pokazuje listę poprawek do zatwierdzenia. Jedno „posprzątaj nazwy części” w czacie zastępuje godziny klikania po formularzach.

Token MCP niesie uprawnienia użytkownika z panelu, więc sesja Claude Code nie zrobi nic, czego jej właściciel nie zrobiłby w przeglądarce. Każde wywołanie MCP wpada w ten sam audit log co edycja z panelu, więc ogłoszenie zrodzone w czacie i ogłoszenie z formularza wyglądają w historii identycznie.
Packshoty bez grafika
Części fotografuje się tam, gdzie akurat leżą: w kartonie, na trawniku, na posadzce warsztatu. Żeby sklep wyglądał spójnie, system sam robi z tych zdjęć packshoty, czyli zdjęcia samej części na białym tle, i ustawia je jako okładki ogłoszeń. Nie trzeba do tego grafika ani edytora zdjęć, wystarczy przejrzeć gotowe packshoty w panelu i je zatwierdzić. Dokładniej opisuję to w osobnym wpisie: Packshoty na białym tle w ComfyUI, bez Photoshopa.



Narzędzia i materiały pod kontrolą
Poza częściami samochodowymi system trzyma narzędzia (klucze, elektronarzędzia, przyrządy pomiarowe) i materiały eksploatacyjne (kleje, płyny, chemikalia) ze śledzeniem dat ważności i alertami o niskim stanie. Do każdego wpisu można podpiąć PDF-y: instrukcje obsługi, faktury zakupu, karty gwarancyjne (przygotowane wcześniej w moim darmowym edytorze PDF online).
Zrób to z telefonu
Garaż jest miejscem, w którym edycje robi się z telefonu w brudnych rękawiczkach, więc każdy formularz Filamenta (Produkt, Narzędzie, Materiał) ma mobilny wariant do obsługi jedną ręką:
- Zakładki zamiast niekończącego się scrolla (Podstawowe, Magazyn, Sprzedaż online), z ID w breadcrumbie.
- Pasek akcji przypięty na dole z Zapisz, Anuluj i Skanuj pojemnik. Unosi się nad klawiaturą na iOS-ie i Androidzie.
- Skaner QR w topbarze, dostępny z każdej strony, żeby zeskanowany kod otwierał właściwy rekord z dowolnego widoku.
- Składana wyszukiwarka: na mobile zwija się do ikonki, a po tapnięciu otwiera się jako pełnoekranowy panel.
Śledź każdą zmianę
Dwa poziomy śledzenia zdarzeń: transakcje magazynowe (przyjęcie, wydanie, przesunięcie) rejestrują ruchy ilościowe z automatyczną aktualizacją stanów, a pełna historia zmian trzyma na każdym modelu diff zmienionych pól z nazwą operatora i czytelnym polskim opisem. Zapisy z jednego requestu są grupowane w jeden wpis, więc submit formularza produkuje jedną pozycję w audycie, a nie kilkanaście.
Efekty
- Każda część jest do znalezienia w kilka sekund. Wystarczy zeskanować pudło, wpisać numer OE albo podyktować nazwę, żeby zobaczyć, co i gdzie jest. Kwadranse szukania zamieniły się w chwilę z aparatem telefonu.
- Zero duplikatów. Ewidencja jest jedyną prawdą, więc nie kupuje się drugi raz czegoś, co już się ma. Wystarczy jedno zapytanie w wyszukiwarce, żeby to sprawdzić.
- Ogłoszenia idą do klienta, nie do kartonu. Wystawienie części na sprzedaż zajmuje minuty zamiast godzin, a angielski opis dolatuje automatycznie, więc próg dla klientów zza granicy przestał być problemem.
- Zarządzanie z klawiatury. Przez MCP Claude Code ma dostęp do tych samych zapisów co panel, więc rutynowe zadania (nowe ogłoszenia, porządki w nazwach, aktualizacje statusów) robi się z rozmowy w terminalu, bez otwierania przeglądarki.
- Jednolity wygląd sklepu. Okładki na białym tle powstają automatycznie, bez grafika.
- Mobilny warsztat. Wszystko, co obsługuje panel, obsługuje też telefon. Formularze z zakładkami, przypięty pasek akcji i skaner QR w topbarze pozwalają pracować z warsztatu, brudnymi rękami, jednym palcem.
- Pełny audyt. Historia zmian pokazuje, kto, kiedy i co zmodyfikował, więc pytania w stylu „co ja z tym zrobiłem” mają odpowiedź.
Wykorzystane technologie
Laravel + FilamentPHP + Livewire
Backend na modelach Eloquent, panel administracyjny i reaktywne fragmenty UI (skanowanie QR, dynamiczne formularze).
PWA + Web Speech API
Publiczny frontend z wyszukiwarką głosową i kamerowym skanerem QR.
Astro + REST API
Statyczny sklep karmiony feedem z magazynu, cache 15 minut.
Cloudflare R2
Zdjęcia produktów wysyłane od klienta przez presigned URL, bez pośrednictwa backendu.
DeepL
Automatyczne tłumaczenie polskich opisów na angielski przy zapisie.
Integracja MCP
Model Context Protocol pozwala Claude Code wystawiać ogłoszenia i porządkować nazwy z tymi samymi uprawnieniami co panel.
ComfyUI + BiRefNet
Packshoty wycinane na komputerze w warsztacie: sama część na białym tle, sprawdzana w panelu, zanim zostanie okładką.
Kontrola dostępu oparta na rolach
Historia zmian każdej edycji plus role i uprawnienia wspólne dla panelu i MCP.

























