System zarządzania magazynem garażowym

· 7 min czytania

System magazynowy dla warsztatu: hierarchia lokalizacji i pojemników z QR na wszystkim, publiczna PWA z wyszukiwarką głosową, sklep na Astro karmiony REST API, a nowe ogłoszenia powstają z rozmowy w Claude Code przez MCP.

System magazynowy dla warsztatu: hierarchia lokalizacji i pojemników z QR na wszystkim, publiczna PWA z wyszukiwarką głosową, sklep na Astro karmiony REST API, a nowe ogłoszenia powstają z rozmowy w Claude Code przez MCP.

W skrócie

Problem
Garaż pełen części po kilku autach dawcach, kilka szuflad narzędzi, kilkanaście organizerów materiałów. Bez ewidencji szukanie jednego wspornika to dwadzieścia minut w kartonach.
Co powstało
System magazynowy z podziałem na lokalizacje, pojemniki, części, narzędzia i materiały, wszystko z kodem QR. Do tego mobilna PWA do przeglądania i publiczny sklep na Astro z ogłoszeniami z tych samych danych.
Moja rola
Wszystko: backend w Laravelu i Filamencie, PWA, generowanie i skanowanie QR, REST API dla sklepu, integracja z Claude Code przez MCP.
Co jest w tym ciekawego
Skaner odczytuje kilka kodów naraz, wyszukiwarka głosowa znajduje część bez rąk, a nowe ogłoszenia powstają z rozmowy w Claude Code przez MCP: w jednym wywołaniu asystent zmniejsza zdjęcia, wysyła je na R2, tłumaczy opis na angielski i wystawia ogłoszenie.
Efekt
Część znajduje się przez zeskanowanie pudła, podyktowanie zapytania albo poproszenie asystenta AI, a ogłoszenia sprzedażowe wychodzą z tych samych danych.

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ść.

Filament admin: lista produktów z kolumnami Numer QR, Kategoria, Lokalizacja (kody P3-S2, P0-K2-S2) i Pojemnik oraz przyciskiem Skanuj QR

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.

Skaner PWA: kilka kodów QR w kadrze, wybrany pojemnik KA-16 (C0030) z 3 produktami (lampka wnętrza tylna, lampka do czytania, płytka wzmacniająca)Skaner PWA: pojemnik KA-36 (C0050) zeskanowany z kartonu, panel pokazuje 2 sztuki klamki klapy bagażnikaSkaner PWA: pojemnik KA-38 (C0052) zeskanowany z kartonu, panel pokazuje poduszkę silnika 2.0 TSI

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.
Publiczna PWA: nakładka wyszukiwarki głosowej z pulsującym czerwonym mikrofonem, statusem Słucham... i przyciskiem Anuluj przygaszającym listę produktów w tlePWA mobile: lista produktów z miniaturkami, numerami OE, kodami lokalizacji P2-S2·KA-XX i licznikiem sztukPWA mobile: szczegóły zbiornika płynu hamulcowego z lokalizacją P2-S2·KA-37, kategorią Hamulce, ceną 150 zł i akcją Drukuj etykietę QRPWA mobile: szczegóły chłodnicy oleju DQ250 z lokalizacją P2-S2·KA-35, kategorią Silnik i ceną 300 zł

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.
Filament admin: produkty na sprzedaż w kompaktowych kartach ze zdjęciem, nazwą, numerem OE, ceną w PLN i EUR oraz statusem Dostępny
Formularz edycji produktu z polami w dwóch językach (PL/EN), slugami SEO per locale i przyciskiem Tłumacz PL do EN DeepLModal AI proponuje opis produktu: trzy warianty opisu do wyboru, przyciski Użyj wybranego opisu i Anuluj

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.

Formularz edycji produktu (zakładka Sprzedaż online): przyciski Tłumacz PL do EN (DeepL) i Generuj opis (AI) oraz sekcja POLSKI (PL) z polami nazwy, sluga i opisu. Ta sama ścieżka zapisu, którą przechodzi wywołanie MCP.

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.

Przed i po: kierownica sfotografowana w kartonie na folii bąbelkowej i ta sama kierownica jako packshot na białym tlePanel: Przegląd packshotów z czterema packshotami do przeglądu. Każdy kafelek pokazuje packshot na białym tle obok zdjęcia źródłowego, status Do przeglądu i przyciski Zatwierdź, Odrzuć i ProduktPanel: okno potwierdzenia Zatwierdź jako okładki nad zaznaczonymi packshotami, z przyciskami Anuluj i Potwierdź

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

Filament admin: siatka narzędzi warsztatu w kompaktowych kartach ze zdjęciem, nazwą i stanem (zaciskarki do końcówek kablowych), nad nią przyciski Dodaj, Skanuj QR i EksportujPodgląd narzędzia Podnośnik Autolift UP&DOWN3000 z sekcjami Informacje podstawowe, Magazyn i lokalizacja, Uwagi z linkiem do producenta oraz Załączniki z podpiętą fakturą zakupu PDF

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.
Dashboard panelu Filament na telefonie: topbar z ikonami wyszukiwarki, mikrofonu, skanera QR i powiadomień oraz cztery karty statystyk (liczba produktów, wartość magazynu, liczba kategorii, liczba transakcji)Produkty na sprzedaż na telefonie: kompaktowe karty w dwóch kolumnach z packshotem na białym tle, nazwą, ceną i statusem Dostępny, nad nimi wyszukiwarka i sortowanie, na dole przypięty przycisk Wszystkie produktyFormularz edycji produktu na telefonie: górne zakładki (Podstawowe / Magazyn / Sprzedaż online), pola widoczne w środku, sticky action bar na dole z Zapisz, Anuluj, Skanuj pojemnik i overflow menu

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

Lista transakcji magazynowych z typami Wydanie i Przesunięcie, kolumnami Z lokalizacji / Do lokalizacji oraz polem WykonałWidok historii zmian: paginowana lista audytu z kolumnami ID, opis, typ obiektu, operator, znacznik czasu i akcja Podgląd otwierająca diff zmian

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.

Powrót do portfolio