Mini Verbigem — historia zmian
Najnowsze wydania i co się w nich zmieniło.
Strona i webapp (2026-10-12) — Android w Google Play, landing prowadzi do Sklepu
Sekcja „Pobierz aplikację” przestaje obiecywać „wkrótce” na Androida — karta ma żywe CTA do Google Play.
- Karta Androida aktywna (
src/landing/Sections.tsx): pełna krycie zamiast przygaszonej, akcentowy rąbek i ikona, przycisk landing.download.googlePlay prowadzi do https://play.google.com/store/apps/details?id=com.verbigem.app (nowe okno, rel="noreferrer"). Link do historii zmian Androida zostaje pod przyciskiem; iPhone nadal „wkrótce”. - Adres listingu zweryfikowany:
curl → HTTP 200 (2026-10-12). Pakiet com.verbigem.app = applicationId z android/app/build.gradle.kts (versionName 1.0.80). - Teksty przestały mówić „wkrótce” o Androidzie:
landing.download.subtitle i landing.download.android.desc w 17 językach; nowy klucz CTA również × 17. - Usunięty martwy klucz
landing.download.getApk (kanał APK zamknięty 2026-09-24, zero użyć w kodzie). Walidacja i18n: 431 kluczy × 17, zero hardkodów.
Strona i webapp (2026-10-07) — paywall zrównany z Androidem, schemat sharp, deploy bez purge
Ekrany płatności na webie mówią to samo co dialogi w Androidzie, a nowi odwiedzający dostają schemat sharp zamiast calm.
- Nagłówki i podtytuły płatności skopiowane z Androida (
values-*/strings.xml: noads_title, noads_subtitle, topup_dialog_title, topup_dialog_subtitle) w 17 językach. Po polsku: „Usuń reklamy (jednorazowo)", „Jednorazowa przedpłata — ukrywa banner reklamowy na wybrany okres. Bez abonamentu.", „Doładuj portfel", „Saldo na płatne modele online i głos Pro". ProfilePage: pod tytułami kart „Reklamy" i „Portfel" doszły podtytuły (nowe klucze profile.noAdsSubtitle, profile.walletSubtitle); profile.noAdsCta/profile.walletTitle dostały wartości z Androida. Pakiety kwot były identyczne na obu platformach (noAds 1/3/5/10, portfel 3/5/10) — zmieniły się tylko teksty.- Domyślny schemat:
sharp (store.ts), decyzja Milosza. Zapis w persisted store wygrywa z domyślą, więc zmiana dotyczy tylko nowych odwiedzających. - Wzmianki o purge Cloudflare wycięte z dokumentacji (decyzja Milosza: „deploy bez purge"): reguła 5 w
AGENTS.md, docs/strony-statyczne.md, docs/crm-status.md, hint w scripts/copy-dict.mjs. npm run purge:cf zostaje w kodzie jako osobne polecenie; od 2026-09-26 deploy:web nie czyści cache. - i18n: 432 klucze × 17 języków (+2), walidacja paritetu i hardkodów przeszła.
Strona i webapp (2026-10-07) — cennik podzielony na Web i Android
Sekcja Pricing pokazuje dwie pary kart (Web i Android) zamiast jednej z tabulatorami — każda platforma obiecuje tylko to, co faktycznie ma.
- Dwie pary z nagłówkami platformy (🌐 Web / 📱 Android): na desktopie 2×2, na mobile jedna kolumna; bez tabulatorów. Karty
landing.planAndroid.* to pełne kopie tytułów z emoji. - Web Free: nowe punkty o czacie — szyfrowanie E2E (klucze prywatne nie trafiają na nasz serwer) i tłumaczenie własnych wiadomości na język rozmówcy na żądanie (
ChatPage.tsx:604). - Android Free: punkty o pracy bez internetu, modelu Szybki (~440 MB), OCR/historii/glosariuszu z czytaniem na głos z podkreśleniem słów (
SpeechManager.kt:92 → TranslatorScreen.kt:1148) oraz pełnym czacie 1:1: E2E, dyktowanie, tłumaczenie na język rozmówcy i kopia klucza na Dysku Google użytkownika (KeyBackupRepository.kt, appDataFolder). - Podtytuł cennika wyjaśnia: darmowe jest darmowe na obu platformach, Pro jest przedpłacone (10% marży), web w przeglądarce, Android offline.
- Dyktowanie w czacie nie jest obiecywane na webie — STT na webie działa w trybie Rozmowa (
ConversationPage.tsx), nie w czacie. - Drobiazg językowy: „kuratorowane" → „wybrane" w karcie web Pro (PL).
- Nowe klucze i18n (
landing.platform.*, landing.planAndroid.* + przeróbka free.f2/f3, pro.desc, podtytuł) w 17 językach; walidacja paritetu przeszła (430 kluczy × 17).
Strona i webapp (2026-10-07) — SEO, wydajność landinga, uczciwe treści
Landing pobiera o 36% mniej (458 → 292 kB gz), mówi tylko prawdę i jest widoczny dla wyszukiwarek.
- SEO:
robots.txt (świadomie bez wzmianki o panelu /boss — deindeksację robi nagłówek noindex z hostingu) oraz generowany sitemap.xml (86 adresów, hreflang + x-default, asercja istnienia plików; wchodzi w skład gen:static). - Wydajność: strony aplikacji dołączane leniwie (
lazy() + Suspense), słowniki i18n ładowane na żądanie (~9 kB gz na język zamiast 157 kB z góry). Angielski zostaje w bundlu jako kanon i zapasowy słownik. - Liczby zamiast pseudo-metryk: sekcja „Mini Verbigem w liczbach" pokazuje 17 języków interfejsu, E2E w czacie, 0 zdjęć wysyłanych na serwery (OCR lokalnie) i $0 planu darmowego — każdy wskazuje na źródło w kodzie. Formularz zgłoszenia języka otwiera widoczny przycisk „zgłoś nam", nie tajemnicza cyfra.
- Jeden głos CTA: wszędzie „Otwórz tłumacz"; do metatagów trafiła prawdziwa lista 17 języków (wcześniej 6, zaszyta na sztywno) i opis bez przesady o „100+ językach".
- Noscript bez fałszywek: usunięte „nie wyświetla reklam" (aplikacja ma baner) i martwy link do instalatora APK (kanał zamknięty 2026-09-24, dystrybucja idzie do Google Play).
- og-image odchudzone: 372,7 → 75,7 kB (rekompresja do palety PNG w
gen-icons.mjs); podgląd linku w komunikatorach odświeży się dzięki podbitemu ?v=2.
v1.0.732026-09-12) — versionCode 73
Weryfikacja adresu e-mail przy rejestracji (zamknięcie luki).
- Konta zakładane przez e-mail+hasło muszą potwierdzić adres przed wejściem do aplikacji.
- Bramka w nawigacji (
RequireAuth) kieruje niezweryfikowane konto na ekran weryfikacji; Google i telefon ją omijają. - Po kliknięciu linku z maila użytkownik wciska „Sprawdź ponownie" →
reload() → przejście do aplikacji. - 10 nowych stringów
emailVerify.* dodanych w 6 językach (PL, EN, DE, ES, ZH, TR).
v1.0.482026-09-08) — versionCode 49
Status PRO jest teraz wyliczany, a nie zapisany na stałe.
- Konto jest PRO tylko gdy spełniony jest jeden z dwóch warunków: aktywne wykupienie wyłączenia bannera (
noAdsUntil w przyszłości) LUB saldo portfela > 0. - Po wygaśnięciu
noAdsUntil przy zerowym portfelu konto wraca na Free (np. przez billUser po zużyciu kredytów). Zapisane pole plan jest tylko informacyjne. - Silnik „dokładny" (HY-MT) odblokowany dla każdego statusu PRO — także z pustym portfelem (samy noAds). Dla konta Free pozostaje nieaktywny.
- Dotyczy web (
isProAccess) i Androida (UserProfile.isPro).
v1.0.40v1.0.46 (2026-09-06 → 2026-09-08) — versionCode 41–47
Wpisy zbiorcze zrekonstruowane z historii repozytorium (szczegóły per-wersja
dla aplikacji Android są w /android/changelog.html).
- Strona „Co nowego" w 6 językach —
/changelog.html i /android/changelog.html generowane z CHANGELOG.md (PL = kanon) + linki na landing page. Usunięty link do GitHub Releases (repo prywatne). - App Links:
assetlinks.json z autoVerify dla mini.verbigem.com. - Wersjonowanie spójne ze stroną: wersja i URL APK trzymane w
vite.config.ts, landing czyta /updates/version.json; link „Pobierz aplikację" i /download/android wskazują na bieżący plik. APK kopiowany do dist/android/ przy każdym buildzie. - Tłumaczenie online: wybrany model (DeepSeek / Gemini / Claude) przekazywany do OpenRoutera, cennik per-model i rozliczanie wg realnego
usage.cost +10% marży — bez hardkodowanych cen. Dostęp także z własnym kluczem OpenRouter (modele darmowe). - Płatności Paddle: Cloud Function
createCheckout do doładowania portfela; przełącznik środowiska PADDLE_ENV (sandbox / production). Funkcje przeniesione do regionu us-central1 (zgodnie z projektem) — naprawiło błędy płatnych tłumaczeń i doładowań. - Strony prawne: Regulamin / Zwroty / Kontakt + linki w stopce i nagłówki cache.
- Logowanie: natychmiastowe przejście do
/app po Google, splash do pierwszego callbacku auth, działający version-check w sesji z redirectu. - BottomNav: 5 ikon z poprawnymi ścieżkami (prefiks
/app).
v1.0.472026-09-08) — versionCode 48
Płatności Paddle na produkcji (LIVE) + konto PRO po zakupie „Bez reklam".
- „Bez reklam" = przedpłata jednorazowa, nie abonament. Cztery pakiety: $1 · 1 msc, $3 · 3 msc, $5 · 5 msc, $10 · 10 msc. Płacisz raz, nic nie odnawia się samo.
- Po zakupie konto przechodzi na status PRO 💎 — webhook
transaction.completed ustawia teraz również plan: 'pro' (wcześniej tylko noAdsUntil, przez co część funkcji Pro na webie nadal widziała konto jako Free). - Karta statusu konta pokazuje zawsze saldo portfela (również 0.00, gdy portfel nie był doładowany — „Bez reklam" nie dodaje środków) oraz licznik dni do wznowienia reklam.
- Ceny LIVE w katalogu Paddle są wpięte w
src/billing/paddleConfig.ts i w functions/index.js; checkout działa na domenie mini.verbigem.com.
v1.0.392026-09-05) — versionCode 40
Pierwsze oficjalne oznakowanie wersji repozytorium Mini Verbigem (czysty translator z ekosystemu Verbigem — mini.verbigem.com).
Co nowego
- Dwa tryby tłumaczenia
- Tryb lokalny (Rozmowa): dwie osoby, jedno urządzenie, naprzemienne tłumaczenie w obie strony + auto-TTS.
- Tryb zdalny (Czat): wyszukiwanie użytkowników, zaproszenia, czaty 1:1 w czasie rzeczywistym (Firestore
onSnapshot), tłumaczenie przed wysyłką.
- Silniki lokalne (offline, na urządzeniu)
- Szybki: Qwen3-0.6B q4; dokładny: HY-MT1.5-1.8B q4 (WebGPU → WASM fallback).
- Bramka pobrania modelu dokładnie raz, bez nazw modeli w UI.
- Warstwa Pro
- Przełącznik silnika: szybki / dokładny / oba / API online (DeepSeek).
OnlineEngine przez server-side Cloud Function proxy — klucz API poza klientem, licznik tokenów, marża 10%.- OCR: Tesseract.js (Free) + DeepSeek Vision (Pro).
- Płatności Paddle MoR od dnia 1: baner $1/msc (wyłączenie reklam) + portfel prepaid API ($3/$5/$10); webhook fulfillment E2E działa.
- Konto: e-mail/hasło + Google (Firebase Auth), profil (nick, awatar, języki, plan
free/pro, portfel). - Landing page z AuthModal, sekcjami Features/Pricing/Download i dynamicznym URL APK z
/android/version.json. - i18n pl/en (pozostałe 4 języki spadają na EN); wersjonowanie + kill-SW — wymuszone przeładowanie przy starszej wersji.
- Zasada workflow: po każdej większej edycji kodu — aktualizacja README +
git push.