Files
sepot/CHANGELOG.md
T
Julius Joska 8780486eae fix(ios): adopt the UIScene life cycle — 1.2.3 (27)
Build 26 was the first one made with the iOS 27 SDK, and UIKit stops apps
without the scene life cycle at launch on iOS 27 (TN3187). The scene
delegate only shows the FlutterEngine that AppDelegate starts with the
process, so a VoIP push in the background still finds the CallKit plugin
and a running Dart isolate when no scene is connected.
2026-10-23 22:28:10 +02:00

22 KiB
Raw Blame History

Changelog

Všechny podstatné změny v aplikaci Šepot. Formát dle Keep a Changelog, verzování dle ajtak standardu.

[Nevydáno]

[1.2.3] – 2026-10-23

Opraveno (iOS, build 27)

  • Na iOS 27 appka hned po spuštění spadla. Build 26 vznikl novým Xcode (SDK iOS 27) a ten u appek bez scénového životního cyklu (UIScene) start zastaví. Appka teď scény používá; Flutter běží od startu procesu, takže příchozí hovor na pozadí dál zazvoní i bez otevřeného okna.

Bezpečnost

  • 24 slov jen po čerstvém ověření. Zálohovací fráze se z odemčené appky ukáže až po zadání PINu (nebo otisku/obličeje, je-li zapnutý). Totéž platí pro export a obnovu zálohy, nastavení nátlakového PINu, prodloužení automatického zámku, vypnutí ochrany obrazovky, zapnutí biometrie a smazání účtu. Kdo vezme odemčený telefon, k frázi se nedostane. V nátlakové relaci se fráze nezobrazí nikdy. Ověření PINu podléhá stejnému zpomalení po chybách jako odemykání.
  • Cizí klíč se jménem kontaktu už nesplyne s kontaktem. Zpráva od neznámého klíče je „žádost o zprávu“ se jménem, které si odesílatel zvolil sám, a s označením „(neznámý)“. Dokud ji nepřijmete, nejde odpovědět, nechodí od vás potvrzení přečtení ani psaní, nezvoní hovory a notifikace neukazuje jméno. Když se jméno plete s existujícím kontaktem (i přes cyrilici, diakritiku nebo neviditelné znaky), ukáže se varování i v chatu skutečného kontaktu.
  • Změna bezpečnostního kódu. Když se pod účtem známého kontaktu objeví jiný klíč, chat ukáže „Bezpečnostní kód kontaktu … se změnil“, ověření kontaktu se zruší a odpověď neodejde na nový klíč. Nový klíč přijde jako samostatná žádost o zprávu.

Opraveno

  • Na iPhonu nechodily budíčky ani hovory na pozadí. Appka relayi vůbec neposlala token pro zprávy (APNs) ani pro hovory (VoIP): nastavení notifikací na iOS skončilo chybou, ta zastavila celou registraci a appka ji tiše spolkla. Registrace u Apple teď proběhne i bez povolených notifikací, token pro hovory jde zvlášť a případné selhání ukáže seznam chatů.

[1.2.2] – 2026-10-11

Opraveno

  • Přečtený chat se dál ukazoval jako nepřečtený. Zpráva, která přišla do otevřeného chatu, zůstala po návratu do seznamu tučně s odznakem; teď se přečte hned, když je chat na obrazovce (a appka v popředí). Stažení přílohy nebo dodatečné doručení už nevrátí přečtenou zprávu mezi nepřečtené.
  • Gesto „odpověď tahem“ při zavírání chatu v ladicím buildu padalo na vytvoření animace nad zrušeným prvkem.
  • Na iPhonu hlásila dlaždice Push v Nastavení chybu (volala UnifiedPush, který existuje jen na Androidu).

Změněno

  • Nová ikona aplikace: Š, které se ve spodní části rozpadá do teček.

[1.2.1] – 2026-10-09

Opraveno

  • Hovory se nedaly přijmout. Příchozí signalizace hovoru se zahazovala dřív, než se dostala k obsluze hovoru; volaný jen „zazvonil“ z budíčku a pak nic.
  • Obrazovka hovoru po zavěšení: avatar a jméno uskakovaly vlevo nahoru.
  • Obnova ze 24 slov na novém telefonu končila nekonečným čekáním — server odmítal už existující identitu. Nové zařízení ji teď převezme podpisem.
  • Tichá ztráta zpráv: úklid mizících zpráv mohl přepsat čerstvě přijatou zprávu; automatický zámek během zpracování zprávy ji mohl nenávratně zahodit; souběžné šifrování pro téhož příjemce dávalo obálky, které druhá strana zahodila. Všechny tři cesty opraveny.
  • Velká fronta po delším výpadku (stovky zpráv) se už neodpojuje v půlce a server ji po osmi pokusech nemaže.
  • Nátlakový PIN otevíral relaci se skutečnou identitou, frází i přístupem ke smazání účtu. Teď je izolovaná: náhodná identita, žádná síť, žádný zásah do klíčů; smazání v ní nechá skutečný účet být.
  • Zvonění z budíčku bez skutečné nabídky končí po 12 s; server budíčky hovoru omezuje na cíl, takže cizí člověk se znalostí adresy telefon nerozezvoní pořád dokola.
  • Dodatečné odeslání z fronty neztrácí anketu ani zmínky; budíček při „připojeno“ bez provozu obnoví spojení.

Bezpečnost

  • Hádání PINu: po pěti chybách prodleva 30 s, dál dvojnásobná až 15 minut.
  • Nátlakový a skutečný PIN se ověřují jednou derivací — čas odemčení neprozradí, který byl zadán.
  • Biometrie jen biometricky (zámek telefonu appku neodemkne); zabezpečení obrazovky je výchozí zapnuté a po odemčení skutečně platí; na iOS klíče nepřecházejí do iCloud Keychain ani záloh; filtr proti dotykům přes překryvná okna.
  • Server: doplňování jednorázových klíčů a rotace podepsaných klíčů (POST /v1/keys), omezení výdeje jednorázových klíčů na adresu, chyby v logu bez adres push endpointů, připnutí DNS u budíčků, globální strop příloh, limity délek, /v1/ready, uvolnění spojení při vypnutí, revize a zdroj v /v1/server-info.

[1.2.0] – 2026-10-01

Nový vzhled

  • Domovská obrazovka s kartami Chaty, Kontakty a Nastavení. Velký nadpis, hledání v chatech i v obsahu zpráv (najde „klic“ i „klíč“), filtry Vše / Nepřečtené / Skupiny, připnuté chaty nahoře.
  • Konverzace s hloubkou. Průsvitná hlavička a pole pro psaní nad jemnou tapetou, zprávy od stejného člověka se skládají do bloků, ve skupině avatar a jméno autora v jeho barvě.
  • Odpověď tahem doprava, řádek „N nových zpráv“ na místě, kde jsi skončil, a tlačítko na nejnovější zprávy s počtem nových.
  • Hledání v konverzaci se zvýrazněním a přeskakováním mezi výsledky; klepnutí na citaci skočí na původní zprávu.
  • Profil kontaktu a skupiny po klepnutí na jméno nebo avatar: ověření, sdílené fotky, společné skupiny, mizící zprávy, ztlumení, blokování; u skupiny členové, přidání lidí, přejmenování a odchod.
  • Fotky přes celou obrazovku s listováním všemi fotkami konverzace.
  • Každý člověk má vlastní barvu avataru — všude stejnou, i po přejmenování.
  • „Přečteno“ je poznat na první pohled — plná pilulka místo modrošedých fajfek, které na korálové bublině skoro nebyly vidět.

Přidáno

  • Hovory a videohovory 1:1, šifrované end-to-end. Tlačítka v hlavičce chatu; telefon zazvoní i se zavřenou aplikací (na iPhonu přes CallKit). Když přímé spojení nejde, hovor šifrovaně přepošle náš server. V chatu zůstane záznam „Hovor · 3:12“ nebo „Zmeškaný hovor“.
  • Rozepsaná zpráva zůstane. Když odejdeš z chatu, text v poli počká, a v seznamu chatů je vidět jako „Koncept: …“.
  • Přeposlání zprávy, fotky, souboru i hlasovky do jiného chatu nebo skupiny (podržet zprávu → Přeposlat).
  • Poznámky pro sebe v kartě Kontakty: chat sám se sebou na odkazy, fotky a poznámky. Zůstává jen v telefonu, šifrovaně, nic nejde na server.
  • @zmínky ve skupinách. Po napsání „@“ se nabídnou členové; zmíněný dostane upozornění, i když má skupinu ztlumenou.
  • Rychlejší přehrávání hlasovek — 1,5× a 2×, rychlost si Šepot pamatuje.
  • Správci skupin. Zakladatel je správce a může udělat správcem i další členy. Odebrat člena, měnit správce a přejmenovat skupinu smí jen správce; každou takovou změnu podepíše svým klíčem a ostatní telefony podpis ověří, takže ji nikdo nemůže podvrhnout ani za správce vydávat. U členů je odznak „Správce“, ostatní vidí akce neaktivní s vysvětlením. Dokud má někdo ve skupině starší verzi Šepotu, přidávat lidi smí dál každý, aby se skupina nerozdělila; se staršími verzemi skupiny fungují jako dosud. Existující skupiny se převedou samy, bez jediné zprávy.
  • Profilová fotka. V Nastavení klepni na svůj avatar. Fotka se ořízne, zmenší a zbaví metadat a tvým kontaktům dorazí šifrovaně s další zprávou; u nich se ukáže všude místo iniciál.
  • Ankety v chatu i ve skupině (plus → Anketa): jedna nebo víc odpovědí, pruhy výsledků a kdo jak hlasoval, hlas jde změnit i zrušit. Starší verze Šepotu uvidí otázku a možnosti jako text.
  • „píše…“ v hlavičce chatu, v seznamu chatů a jako tři tečky pod poslední zprávou. Stejně jako potvrzení přečtení je volitelné (výchozí vypnuto) a oboustranné. Offline protistraně se nic neposílá do fronty ani ji to nebudí — server takové oznámení doručí jen živému spojení.
  • Čas doručení a přečtení. Pod poslední odeslanou zprávou je vidět, kdy dorazila a kdy ji druhá strana přečetla. Po podržení zprávy ukáže „Info o zprávě“ čas odeslání, doručení a přečtení — ve skupině u každého člena zvlášť. Čas přečtení se ukazuje jen lidem, kteří potvrzení přečtení sdílejí oboustranně (výchozí vypnuto).
  • Přidání lidí do skupiny. Do existující skupiny jde nově přidat kontakty z nabídky skupiny nebo ze seznamu členů.

Změněno

  • Notifikace jsou na Androidu zapnuté od začátku. Bez nich systém Šepot na pozadí uspí a zprávy čekají, dokud aplikaci neotevřeš. Kdo má UnifiedPush distributor (např. ntfy), dostane ho; ostatním se zapne budíček přes Google (FCM). Google přitom vidí jen to, že má telefon probudit — ne obsah ani odesílatele. Přepnout či vypnout jde v Nastavení.
  • Dvojitá fajfka ve skupině svítí až ve chvíli, kdy zpráva dorazila všem členům, ne jen prvnímu.

Opraveno

  • Ztlumená skupina dál posílala upozornění. Ztlumení se u skupinové zprávy kontrolovalo v chatu s autorem, ne ve skupině.
  • Odesílané fotky nesly polohu (GPS) a údaje o telefonu. Zpracování fotky před odesláním metadata EXIF nečekaně zachovávalo — v odeslané fotce i v jejím náhledu. Nově se před odesláním vždy odstraní.
  • Zablokovaný kontakt se mohl sám odblokovat, když změnil adresu pro doručování.
  • „Přečteno“ se už nevrací na „doručeno“. Když potvrzení o doručení dorazilo po potvrzení přečtení (typicky po výpadku spojení), zpráva se tvářila jako nepřečtená.
  • Zpráva označená jako neodeslaná se po doručení sama opraví na doručenou.
  • Nastavení ukazovalo starou verzi aplikace. Číslo verze bylo v kódu napsané ručně a při vydání 1.1.1 a 1.1.2 se ho zapomnělo přepsat, takže se všude hlásila 1.1.0 — včetně hlášení zneužití, u kterých pak nešlo dohledat, ze které verze přišla. Verze se nově čte z nainstalovaného balíčku a k hlášení se přikládá i číslo buildu.

[1.1.2] – 2026-08-13

Opraveno

  • Zprávy už nečekají na otevření aplikace. Když mobilní síť tiše zahodila nečinné spojení, Šepot o tom nevěděl: tvářil se připojeně, ale odeslaná zpráva skončila chybou a příchozí nedorazily — a všechny se pak vysypaly naráz po restartu aplikace. Spojení se teď hlídá pravidelným pingem na obou stranách, takže výpadek se pozná a obnoví v řádu sekund.
  • Neodeslaná zpráva se pošle sama. Dosud zůstala označená jako neodeslaná (u příloh dokonce natrvalo na „odesílá se") a poslat znovu ji musel člověk ručně. Nově se po obnovení spojení odešle sama; opakované doručení téže zprávy druhá strana pozná a nezobrazí ji dvakrát.
  • Zprávy, které nešly doručit, se přestaly hromadit. Když se cestou ztratilo potvrzení o doručení, obálka na serveru zůstala a znovu a znovu se posílala, aniž by ji šlo přečíst. Server teď takové zprávy po několika marných pokusech zahodí, místo aby jimi zdržoval doručování ostatních.

Přidáno

  • Upozornění, když nechodí notifikace. Bez nich Android aplikaci na pozadí uspí a zprávy uvidíš, až ji otevřeš. Šepot to teď řekne rovnou v seznamu chatů a nabídne nastavení; hlášku jde odmítnout. Selhání registrace u distributora se už nezamlčí.

[1.1.1] – 2026-07-18

Opraveno

  • Odeslání první zprávy hned po instalaci už neselže. Krátce po založení účtu, než se aplikace stihla připojit k relayi, mohla zpráva spadnout s hláškou „Odeslání selhalo". Nově se v tu chvíli ukáže srozumitelné „Šepot se ještě připojuje — zkus to za chvíli" a připojení proběhne na pozadí.
  • QR kód a odkaz se ukážou až s doručovací adresou. Když sis chtěl ukázat vlastní QR dřív, než se aplikace poprvé připojila, vygeneroval se neúplný odkaz — protistrana pak nemohla poslat první zprávu („Kontakt nemá doručovací adresu"). Nově se místo neúplného kódu ukáže stav připojování a QR se objeví, jakmile je hotové.
  • Neúplný odkaz kontaktu se odmítne při přidání, ne až při prvním odeslání — s jasnou výzvou požádat protistranu o nový odkaz.
  • Zamčení po nečinnosti už neumlčí aplikaci. Po automatickém zamknutí a opětovném odemčení se zprávy zase přijímají i odesílají — dřív mohl messaging zůstat po odemčení vypnutý až do restartu aplikace.
  • Skupinová zpráva se při chybě neodeslání označí jako neodeslaná místo aby zůstala navždy ve stavu „odesílá se".
  • Ošetřeno vzácné zdvojení spojení s relayem při rychlém přepnutí Toru nebo zamčení během připojování.

Změněno

  • Interní úklid závislostí notifikací (odstraněna nepoužívaná větev, která komplikovala sestavení verze pro iOS).

[1.1.0] – 2026-07-13

Přidáno

  • Náhled fotky před odesláním. Vyfocená nebo vybraná fotka už neodchází okamžitě — otevře se náhled, kde jde fotku otočit, kreslit po ní prstem (7 barev, krok zpět), přidat na ni text (tažením se přesouvá, klepnutím upraví) a připojit popisek. Odejde až po klepnutí na Odeslat; zavření náhledu nic nepošle.

Opraveno

  • Nastavení se nevykreslilo — obrazovka místo obsahu ukazovala chybovou hlášku „Tahle obrazovka se nevykreslila". Profilová karta předávala do překladu otisk klíče jako objekt místo textu.
  • Avatar s iniciálami spadl na prázdném jménu nebo jménu s dvojitou mezerou; iniciály se nově skládají po grafémech, takže nerozpůlí emoji.
  • Písma se dodávají v aplikaci (Inter, JetBrains Mono — OFL). Aplikace dřív stahovala fonty za běhu z Google CDN — síťový požadavek na cizí server navíc a binárka odlišná od zveřejněného zdroje.
  • Trvale vadná příchozí zpráva už neotravuje frontu. Zpráva, jejíž obsah nejde po dešifrování zpracovat (poškozená pole od upraveného klienta), se potvrdí a zahodí — dřív se doručovala donekonečna při každém připojení. Nedešifrovatelné obálky fronta dál drží.
  • Příloha s poškozeným náhledem od protistrany shodila vykreslení bubliny; vadný náhled se nově zahodí při příjmu a base64 krypto polí příloh se validuje.
  • Zachycení výměny důvěryhodního kořene relaye (signál MITM) na pozadí — dřív tichá neošetřená výjimka, teď příznak čitelný pro UI.
  • PNG bez průhlednosti (screenshoty, upravené fotky) se posílají jako JPEG — několikanásobně menší přenos; PNG zůstává jen pro obrázky se skutečnou průhledností.

[1.0.0] – 2026-07-11

První ostrá verze. Šepot je od 11. 7. 2026 open source — kompletní zdrojový kód aplikace i serveru je veřejný na gitea.ajtak.it/julius.joska/sepot (zrcadlo github.com/juliusjoska/sepot).

Přidáno

  • Aplikace mluví pěti jazyky: česky, anglicky, německy, rusky a italsky. Jazyk se řídí systémem (neznámé jazyky spadnou na angličtinu), nebo ho přepneš ručně v Nastavení → Obecné. Přeložené jsou i notifikace, chybové hlášky, iOS dialogy oprávnění a chybová obrazovka startu; volba jazyka funguje už na zamykací obrazovce.
  • Připojení přes Tor. Přepínač v Nastavení → Připojení (Android, vyžaduje Orbot): provoz na server jde přes síť Tor a skryje tvou IP adresu. Přepnutí přestaví spojení za běhu, bez restartu aplikace.
  • Skupinové konverzace. Skupinu (až 128 členů) založíš z Kontaktů, posílat do ní jde všechno co do běžného chatu — text, fotky, přílohy, hlasovky, reakce, odpovědi i mizící zprávy. Menu nabízí seznam členů, přejmenování a odchod. Zprávy jsou end-to-end šifrované každému členovi zvlášť, takže platí stejná ochrana jako v běžné konverzaci; server o skupině neví nic.

Opraveno

  • Automatický zámek, změna PINu i nátlakový PIN ověřeny na zařízení.

[0.3.2] – 2026-07-10

Přidáno

  • Smazání účtu maže i server. „Smazat všechna data" nově kromě lokálního wipe odregistruje účet z relaye (DELETE /v1/identity): smaže se registrace identity, záznamy zařízení, distribuční klíče, push token i fronta nedoručených zpráv. Když je zařízení offline, aplikace na to upozorní a zbytek řeší podpora@sepot.cz.

Opraveno

  • iOS: privacy manifest (PrivacyInfo.xcprivacy) je součástí Xcode projektu — konec ručního vkládání při každém buildu (ITMS-91053).
  • iOS: Info.plist měl dvakrát CFBundleDisplayName (jednou bez diakritiky) a povoloval landscape, ačkoli je aplikace zamčená na portrét. Sjednoceno.

[0.3.1] – 2026-07-09

Opraveno

  • Nahlašování už nevybízí k vkládání obsahu zpráv. Formulář dřív nabízel „pokud chceš něco doložit, vlož to do popisu sám“. U hlášení o ohrožení dítěte by to znamenalo, že se k provozovateli dostane materiál, jehož držení je trestné — a k posouzení ho stejně nesmí použít. Nově formulář obsah odmítá a u této kategorie odkazuje na STOPonline.cz a Policii ČR.

[0.3.0] – 2026-07-09

Nahlašování zneužití a standardy ochrany dětí — bez nich Šepot nesmí do obchodů (Google Play UGC policy, Child Safety Standards, App Store 1.2).

Přidáno

  • Nahlášení zneužití — Nastavení → Bezpečnost → Nahlásit zneužití, nebo z menu konverzace. Do teď „nahlásit“ jen zablokovalo kontakt a nikam nedošlo; nově hlášení dorazí provozovateli. Kategorie zahrnují ohrožení dítěte (CSAE), které se řeší přednostně.
  • Standardy ochrany dětí — veřejný dokument na sepot.cz/bezpecnost-deti, odkaz přímo z nastavení.
  • Deklarace exportní compliance (ITSAppUsesNonExemptEncryption) — Šepot používá vlastní E2E šifrování, což se Applu hlásí pravdivě.

Opraveno

  • iOS: bílá obrazovka po spuštění. Nativní knihovna libsignal se na iPhonu nenačetla (framework je v Frameworks/, ale není zalinkovaný, a výchozí loader ho hledal v kořeni .app). Start teď knihovnu načítá přes @rpath a navíc už nikdy neskončí němou plochou — když se šifrovací jádro nespustí, objeví se čitelná chybová obrazovka s textem k odeslání.
  • Verze uvedená v Nastavení → O aplikaci ukazovala pořád 0.1.0.

Poznámka k soukromí

Hlášení neodchází přes relay, ale na webový server sepot.cz — ten se při odeslání dozví IP adresu odesílatele. Aplikace na to upozorňuje ještě před odesláním. Obsah zpráv se neodesílá nikdy; do hlášení jde jen to, co uživatel sám napíše.

[0.2.0] – 2026-07-08

Velká funkční vlna — z E2E základu je plnohodnotný soukromý messenger.

Přidáno

  • Jádro chatu — odpovědi na zprávy, reakce emotikonem, úprava a mazání odeslaných zpráv.
  • Hlasové zprávy — nahrávání mikrofonem přímo v chatu, přehrávání s průběhem. Šifrované per-file, plaintext audio nikdy nejde na disk.
  • Obnova účtu ze zálohovací fráze — 24 slov vrátí tvoji identitu (stejný SEP kód, kontakty tě dál poznají).
  • Šifrované zálohy historie — export/import konverzací; zálohu dešifruje jen tvoje identita.
  • Blokování a nahlášení kontaktu — příchozí zprávy od blokovaného se zahodí.
  • Potvrzení přečtení (volitelné, výchozí vypnuto).
  • Smazat u mě — lokální smazání zprávy vedle „Smazat pro všechny".
  • Zabezpečení obrazovky — blok screenshotů a skrytí obsahu v přepínači aplikací.
  • Nátlakový (decoy) PIN — druhý PIN otevře prázdnou aplikaci; skutečná data zůstanou skrytá.
  • Nativní iOS push (APNs) — bez závislosti na Googlu.

Změněno

  • Sjednocené logo napříč launcherem, splash obrazovkou i uvnitř aplikace.
  • Čistší pole pro psaní — jeden tenký obrys, ikony uvnitř, nižší profil.
  • Bubliny se scalují podle délky zprávy.

Opraveno

  • Doručenky (✓✓) se povýší i u offline příjemce, jakmile si zprávu vyzvedne.
  • Náhledy fotek už neukazují předchozí obrázek (chyba recyklace v seznamu).

Bezpečnost

  • Zálohy i decoy PIN stojí na oddělených šifrovaných databázích a klíčích odvozených z identity.

[0.1.0] – 2026-07-04

První beta.

Přidáno

  • End-to-end šifrované zprávy (libsignal, PQXDH + Double Ratchet, sealed sender) přes vlastní relay (WSS + Tor onion).
  • Fotky a dokumenty — šifrované přílohy.
  • Ověření kontaktu přes safety number a QR.
  • Mizící zprávy s per-konverzace TTL.
  • PIN (Argon2id) a biometrické odemčení, šifrovaná lokální DB (SQLCipher).
  • Push — UnifiedPush (výchozí), FCM (opt-in).
  • Bez telefonního čísla, bez e-mailu, bez reklam.

Verzování

  • versionName 0.MINOR.PATCH v betě → 1.0.0 = veřejné vydání.
  • MINOR = nová várka funkcí / milník (0.2.0 → 0.3.0 → 0.4.0…).
  • PATCH = jen opravy chyb a drobnosti (0.2.1, 0.2.2…).
  • Build number (+N) roste +1 při každém uploadu, nezávisle na versionName, stejný pro iOS i Android. Uživatel ho nevidí.