Pomysł — banalna sytuacja w garażu
Sierpień 2025. Sprzątam szufladę w garażu, w której od lat zalegają stare telefony. Trzy sztuki. Wszystkie sprawne, wszystkie z Androidem, wszystkie z gniazdami SIM, GPS-em, mikrofonami i akcelerometrami.
I ta jedna myśl: „Ten Samsung A20 ma więcej mocy obliczeniowej niż laptopy, na których pisałem doktorat. A leży tu od 3 lat".
Druga myśl: „Mam też auto, które stoi pod blokiem. Bez alarmu, bez monitoringu, bez niczego. Bo dedykowany tracker GPS kosztuje 300-500 zł i wymaga abonamentu".
Trzecia myśl: „Zaraz, czemu by tych dwóch rzeczy nie połączyć?"
To wszystko. Cała geneza LocaCar. Bez głębokich analiz rynku, bez badania konkurencji, bez biznesplanu. Pomysł zrodzony przy szufladzie, w piątkowe popołudnie.
Następnego dnia (sobota) usiadłem do laptopa i zacząłem prototyp.
Pierwszy POC — weekend i HTML w przeglądarce
Pierwsza wersja LocaCar nie była aplikacją. Była stroną HTML.
Konkretnie: prosty plik index.html otwarty w przeglądarce starego Samsunga. Korzystający z natywnego API geolokalizacji (navigator.geolocation) i wysyłający koordynaty co 30 sekund na mój domowy serwer (Symfony, który już miałem postawiony pod inny projekt).
Działało. W garażu, na podjeździe, w drodze do sklepu. Telefon w aucie, otwarta przeglądarka, koordynaty lecą na serwer, mogę zobaczyć w czasie rzeczywistym, gdzie auto stoi.
Spędziłem 2 dni weekendu testując ten POC w realnych warunkach. Wniosek: technicznie da się. Pomysł nie jest absurdalny.
W poniedziałek wieczorem rozpisałem na kartce, czego brakuje, żeby z prototypu zrobić coś użytecznego. Lista miała 47 punktów.
Wtedy popełniłem pierwszy duży błąd.
Błąd #1 — Wybrałem React Native
Po POC stanąłem przed wyborem stosu technologicznego. Native Android (Kotlin)? Flutter? React Native? Cordova? PWA?
Wybrałem Expo / React Native. Z dwóch powodów:
- Znałem React z innych projektów (krzywa nauki = niska)
- Obietnica „write once, run on iOS too" — wydawało mi się, że dam radę zrobić jednocześnie wersję na iPhone'a
Pierwszy powód był dobry. Drugi okazał się iluzją.
Bo w trakcie budowy okazało się, że:
- Background services na Androidzie wymagają natywnego kodu (Java/Kotlin) — nie da się wszystkiego przez React Native
- Dostęp do akcelerometru w trybie tła to natywne moduły
- Optymalizacja baterii? Natywne moduły
- Push notifications z konkretnymi parametrami? Natywne moduły
Po 2 miesiącach okazało się, że 40% mojego kodu to natywny Android (Java + Kotlin), 60% to React Native. iOS — nawet nie tknięty.
Czy zmieniłbym decyzję dziś? Pewnie tak — gdybym mógł cofnąć czas, poszedłbym w czysty Native Android. Dał wymierną szybkość, znacznie mniej kombinowania z bibliotekami i dokładnie taką samą krzywą iOS-ową na później (i tak natywną).
Dlaczego zostałem przy React Native? Bo cena migracji teraz (przepisanie kodu od zera) jest wyższa niż koszt utrzymania obecnej hybrydowej architektury. Będę żyć z tym wyborem. Może rok, może dwa lata. Potem zobaczymy.
To pierwsza ważna lekcja solo-developera: nie ma idealnych decyzji. Są tylko wystarczająco dobre decyzje + cierpliwość, żeby z nimi żyć.
Najtrudniejsze 3 momenty
Moment 1: Optymalizacja baterii Androida (3 tygodnie)
Tutaj się dowiedziałem, że Android nie istnieje. Istnieje 11 różnych Androidów, w zależności od producenta telefonu i ROM-u.
Xiaomi MIUI? Aplikacja w tle żyje 30 minut, potem killowana. Trzeba w ustawieniach systemowych ręcznie odblokować autostart, ręcznie ustawić "no battery optimization", ręcznie dodać do białej listy MIUI.
Samsung One UI? Inny menedżer baterii, inna konfiguracja, inne ścieżki.
Realme/Oppo? Trzeci system optymalizacji.
Huawei? Czwarty.
Spędziłem 3 tygodnie pisząc:
- Detektor producenta telefonu i wersji ROM
- Wewnętrzny przewodnik konfiguracji dla każdego brand'u (z screenshotami!)
- Mechanizm sprawdzający, czy aplikacja faktycznie działa w tle, i alert dla użytkownika, jeśli nie
- Foreground service z persistent notification (żeby Android wiedział, że to świadomy, "ważny" proces)
Lekcja: to, co w jednym Androidzie działa za pierwszym podejściem, w innym wymaga 4 ekranów ustawień systemowych. Solo-developer mobile musi myśleć o tym jak o 11 osobnych systemach operacyjnych, nie jednym Androidzie.
Moment 2: WebSocket reconnection (2 tygodnie)
Architektura LocaCar opiera się na komunikacji w czasie rzeczywistym między telefonem-czujnikiem (w aucie) a telefonem-managerem (u właściciela). Wybrałem Socket.IO + Redis.
Wszystko działa pięknie — dopóki połączenie jest stabilne.
Co się dzieje, gdy:
- Telefon w aucie traci sygnał LTE (parking podziemny)?
- Przełącza się między WiFi domowym a LTE w drodze?
- WebSocket disconnects po godzinie idle (bez aktywności)?
- Backend się restartuje przy deploymentach?
W każdym z tych scenariuszy aplikacja powinna automatycznie przywrócić połączenie + odtworzyć zdarzenia, które zaszły w trakcie disconnect + nie zalewać serwera retries, jeśli backend faktycznie pada.
To jest mała inżynierska piekło. Spędziłem 2 tygodnie na exponential backoff, kolejkowaniu lokalnym (SQLite), idempotency keys, sequence numbers do detekcji utraconych eventów. Wszystkie te rzeczy znałem teoretycznie. W praktyce — zaimplementowanie ich tak, żeby działały w 100 różnych scenariuszach edge-case... to jest co innego.
Lekcja: real-time to nie jest problem techniczny. To jest problem filozoficzny. „Co znaczy 'czas rzeczywisty', gdy sieć jest zawodna?" Każdy solo-developer mobile prędzej czy później musi sobie odpowiedzieć na to pytanie.
Moment 3: Foreground service na różnych ROM-ach (4 tygodnie)
Najdłuższy z tych trzech momentów. Powiązany z pierwszym (optymalizacja baterii), ale dotyczył konkretniej utrzymania ciągłej pracy aplikacji w godzinę 0:00 do godziny 23:59, dzień po dniu, niezależnie od tego, co Android próbuje z tym zrobić.
Foreground service to mechanizm Androidowy, który mówi: „ta aplikacja jest świadomie uruchomiona przez użytkownika, ma persistent notification, nie wolno jej zabić". W teorii.
W praktyce każdy producent ma własne reguły, kiedy mimo wszystko zabija foreground service. Różne wersje Androida mają różne limity. Niektóre ROM-y mają „agresywne oszczędzanie baterii", które omija system Android i działa na poziomie ROM-u.
4 tygodnie iteracji:
- Persistent notification z konkretnym priorytetem
- WakeLock z timeoutami
- Restart self z BroadcastReceiver po BOOT_COMPLETED
- Periodic AlarmManager jako safety net
- Native heartbeat co 60 sekund z eskalacją alertów
Aplikacja dziś działa stabilnie na ~95% testowanych konfiguracji. Te 5%, gdzie wciąż się zdarzają problemy — to pole walki na kolejne miesiące.
Lekcja: mobile development to nie jest „co napisałeś". To jest „w ilu warunkach to działa, mimo że nie powinno".
Czemu nie szukam inwestora
To pytanie dostaję regularnie, więc krótko i konkretnie.
Trzy powody:
1. Nie ma jeszcze czego sprzedawać inwestorowi. Mam działającą betę. Mam pierwszych testerów. Mam 0 zł przychodu. Mam 0 zł reklam. Każdy szanujący się inwestor zapyta: „pokaż mi traction". Nie mam co pokazać. Pieniądze przed traction = przedwczesna optymalizacja kapitałowa.
2. Solo-projekt = wolność produktowa. Mogę dziś zdecydować, że robię tryb „Młody kierowca" zamiast iOS. Albo odwrotnie. Bez nikogo, kto powie „nie, ten kwartał skupiamy się na onboardingu fleet customers, bo to obiecaliśmy w deck-u". Wolność jest dla mnie bardziej wartościowa niż przyspieszenie kosztem nieswojej drogi.
3. Małe ambicje są w porządku. Nie wszystko musi być unicornem. LocaCar może być rentownym małym biznesem dla 10-50 tys. użytkowników, na poziomie ~5-10 zł miesięcznie. To jest dla mnie satysfakcjonujący cel. Inwestor zwykle nie chce takich celów — bo z perspektywy funduszu to nie jest atrakcyjny exit.
Czy to się może zmienić? Tak. Jeśli za rok okaże się, że produkt rośnie wykładniczo i potrzebuję zespołu 10 osób, żeby obsłużyć skalę — wtedy rozmowa z inwestorem ma sens. Ale dziś? Solo + wolny czas + minimalny burn = optymalna sytuacja.
Czemu beta zamiast „od razu sprzedaż"
Tutaj odpowiedź jest jeszcze prostsza.
Bo aplikacja, która kosztuje pieniądze, podlega innym oczekiwaniom. Płacący użytkownik ma prawo żądać. Tester bety — daje feedback i wybacza błędy.
Beta pozwala mi:
- Iterować szybko bez stresu „zwracam pieniądze"
- Zbierać feedback od ludzi, którzy są skłonni go dawać (testerzy są bardziej zaangażowani niż klienci)
- Testować różne hipotezy produktowe bez narzutu „lock-in z poprzednią ofertą"
- Budować społeczność ludzi, którzy są emocjonalnie zainwestowani w sukces projektu
Sprzedaż przyjdzie. W lipcu pierwsze plany płatne. Ale podstawową bazą zawsze będą ludzie, którzy weszli przed monetyzacją. Im się należy lifetime premium — i to nie marketingowy chwyt, tylko uczciwa rekompensata za ryzyko, które wzięli na siebie.
Roadmapa najbliższego kwartału
Skoro już szczerze, to do końca:
Maj 2026: stabilizacja bety + cel 30 nowych testerów. Główny focus techniczny: detekcja akustyczna (analiza dźwięku w aucie — to nasza realna przewaga nad dedykowanymi trackerami).
Czerwiec 2026: wersja iOS. Albo jako React Native (ryzykowne, bo natywne moduły będą wymagały przepisania), albo jako oddzielna aplikacja w Swift (wolniej, ale czysto). Decyzja jeszcze nie podjęta.
Lipiec 2026: pierwsze plany płatne. Trzy poziomy: free (1 pojazd, podstawowe alerty), Standard (~5 zł/mc, 3 pojazdy, pełna historia), Premium (~9 zł/mc, 5+ pojazdów, ML detection, raporty PDF).
Q3 2026: aktywna sprzedaż. Płatne reklamy, partnerstwa z ubezpieczycielami, obecność na branżowych imprezach (motoryzacyjnych, IoT).
To jest plan. Może się zmienić w ciągu miesiąca. Solo-projekt to taki właśnie ma luksus.
Co bym zrobił inaczej, gdybym zaczynał dziś
3 rzeczy:
1. Zacząłbym pisać publicznie wcześniej. Pierwsze 6 miesięcy budowałem w ciszy. Bez bloga, bez postów, bez nikogo, kto by widział, co robię. To było marnowanie czasu — feedback, networking, motywacja społeczności to są kluczowe składniki sukcesu solo-projektu. Dziś zacząłbym budować in-public od dnia pierwszego.
2. Pierwszy tester po 2 tygodniach, nie po 3 miesiącach. Każdy dzień bez testera to dzień, w którym budujesz coś, czego być może nikt nie potrzebuje. Nawet jeśli aplikacja jest „brzydka" — pokaż ją. Brzydka aplikacja z feedbackiem > piękna aplikacja w pojedynkę.
3. Mniej funkcji, więcej szlifu. Dziś LocaCar ma 23 funkcje. Z tego ~6 jest faktycznie używanych przez większość testerów. Reszta to kod, który muszę utrzymywać, dokumentować, debugować. Gdybym zaczynał od nowa — zrobiłbym 5 funkcji, ale każdą dopracowaną. Reszta — tylko po request-cie od użytkowników.
Ostatnia myśl
Nie wiem, czy LocaCar odniesie sukces. Nie wiem, czy w lipcu znajdą się chętni na płatne plany. Nie wiem, czy za rok będę pisać o LocaCar jako sukcesie, czy jako ciekawej lekcji.
Wiem natomiast jedno: jest mi z tym dobrze. Praca po godzinach nad własnym projektem, gdzie mogę wszystko, jest formą wolności, której zazdroszczę sam sobie sprzed 12 miesięcy.
Jeśli czytasz ten artykuł i też budujesz coś sam — wiedz, że nie jesteś sam. Solo-developerzy to nie jest mała grupa. Większość po prostu nie pisze o tym publicznie.
Może warto to zmienić.
Podziękowania
Za doczytanie do tego miejsca — dzięki. Za każdy komentarz, polubienie, udostępnienie — podwójne dzięki. Za każdą rejestrację na becie — potrójne.
LocaCar nie jest moim zarobkiem. Jest moim ulubionym hobby, które może kiedyś stanie się czymś więcej. Ale nawet jeśli nie stanie się — i tak wygrałem, bo nauczyłem się więcej w te 8 miesięcy niż w 5 ostatnich latach pracy etatowej.
Zaproszenie do bety: locacar.ovh/beta. Bez karty kredytowej, bez zobowiązań, dożywotnia subskrypcja premium za feedback.
Następny artykuł na blogu LocaCar — sobota 9.05: „Optymalizacja baterii w aplikacjach mobilnych — 8 tygodni walki z Androidem". Wracamy do tematów technicznych. Subskrybuj newsletter na locacar.ovh, żeby nie ominąć.
Komentarze, własne historie solo-projektów, pytania, krytyka — wszystko mile widziane. Kontakt@locacar.ovh albo bezpośrednio pod artykułem.
Komentarze 0
Brak komentarzy