Přeskočit na obsah
BuresIndustries v3
Účet
Změny

Co je nového

Historie aktualizací a novinek na BuresIndustries.cz.

Zámek závislostí ukazoval na commit, který už neexistuje
Latte je v zámku zapsané verzí i přesnou revizí. Tag v3.1.2 byl ale u autora přepsán a původní revize z repozitáře zmizela — zámek tak mířil do prázdna. Zatím to procházelo, protože archiv staré revize se ještě vydával, jenže to je na čas. Až by přestal, spadlo by nasazení hned na instalaci závislostí, tedy dřív, než by se stihlo nahrát na server cokoli.
  • Verze se nemění, obnovila se jen revize — stejná latte, platný odkaz
  • Ověřeno, že se pořád přeloží všech 96 šablon a načte 53 presenterů
Pro děti — dnešní cíl, počítadlo příkladů a test, kde se výsledek píše
Matika se teď hned na začátku zeptá, kolik příkladů chceš dnes zvládnout — 50, 100, 150, nebo si napíšeš vlastní číslo (a kdo nechce cíl, jde rovnou počítat). Pod přepínači pak běží proužek Dnešní cíl 23 / 100 a ve skóre přibylo počítadlo dnešních příkladů, takže je pořád vidět, kolik už toho dítě dnes udělalo. Když cíl padne, přijde pochvala a nabídka pokračovat nebo si přidat dalších padesát. Cíl platí na jeden den, ráno se stránka zeptá znovu. Novinka je i test bez nabídnutých možností: tlačítko Test je nově pořád po ruce a v testu se výsledek píše do políčka (na mobilu naskočí číselná klávesnice, Enter odpovídá) — nedá se tipovat ze čtyř čísel. Napsaná odpověď se ukládá i do detailního přehledu, takže je v administraci vidět, co přesně dítě napsalo.
Šepot: vodoznak hosta ukazoval náhradu místo přezdívky
Přes zprávy leží vodoznak se jménem toho, kdo se dívá. U hosta zvenčí tam ale stálo „host #12" — jeho přezdívka je zašifrovaná, takže ji server nezná a poslal náhradu. Prohlížeč ji po dešifrování zná; teď ji do vodoznaku doplní.
Šepot: rozbalovací seznamy byly na mobilu prázdné
Volba platnosti pozvánky i samomazání zpráv vypadala na iPhonu jako prázdné pole — co je vybrané, se ukázalo až po rozkliknutí. Na vině byla špatná třída: seznamy dostaly tu pro textová pole, která nevypíná nativní vzhled, takže se přes systémový ovládací prvek nalepilo nastavené pozadí a text volby zmizel. Design systém má na to vlastní třídu, která si šipku kreslí sama; teď se používá. Vysunuté okno navíc počítá s lištami prohlížeče, takže se jeho spodek už netlačí pod ně.
Šepot: přesýpací hodiny řeknou, kdy zpráva zmizí
Značka ⏳ u zprávy dosud jen naznačovala, že se zpráva sama smaže — kdy přesně, se nedalo zjistit. Štítek v záhlaví kanálu říká jen obecnou lhůtu, přitom server zná čas smazání u každé zprávy zvlášť. Teď se ukáže po najetí myší, a protože na dotykovém displeji ani klávesnicí by se popisek neobjevil, jde na značku i klepnout.
Šepot: pozvánky padaly od začátku, teď je jasné proč
Načtení pozvánky shodilo server fatální chybou. Příčina byla banální a schovaná: databázová vrstva vrací dva různé typy řádku podle toho, jak se ptáte, a jen jeden z nich umí převod na pole. Na tom druhém volání skončí fatální chybou. Týkalo se to tří míst — načtení pozvánky, návratu pozvaného a nově i úpravy a mazání zpráv, které by spadly hned. Opraveno na všech třech a doplněná kontrola, která tuhle záměnu odhalí ve zdrojovém kódu, takže se nemůže vrátit.
  • Kontrola navíc ověřuje, že všechny volané databázové metody vůbec existují
Šepot: chyba se hlásila jako „true"
Když v API něco spadlo, obsloužil to obecný chybový presenter webu a odpověděl svým {"error":true}. Prohlížeč z toho udělal chybovou hlášku s textem „true" a skutečná příčina se ztratila. API teď odpovídá vždycky vlastním formátem, výjimku si zapíše do logu, a prohlížeč umí přečíst i cizí tvar odpovědi — hláška obsahuje kód i popis. Přibylo taky mazání a úprava vlastních zpráv.
  • Chybová hláška u pozvánky poradí, co bývá příčinou a kde se dá dohledat
  • U snímků obrazovky je popsané, co ochrana nezmůže, a že se zvažuje ochrana rychlým střídáním obrazu
Šepot: vlastní zprávu jde upravit i smazat
U svých zpráv najedeš myší a objeví se upravit a smazat. Úprava se otevře přímo v bublině, text se zašifruje znovu a u zprávy zůstane značka „upraveno". Smazání vymaže text z databáze a přepíše zprávu i v oknech, která ji už měla otevřenou. Cizí zprávy měnit nejdou — ani zakladateli kanálu; na to je smazání celého kanálu. Rozhraní se před smazáním zeptá a rovnou říká, co mazání nezmůže: komu se zpráva stihla doručit, ten ji viděl, a jestli si ji opsal nebo vyfotil, s tím nikdo nic neudělá. Je to úklid, ne odvolání.
Šepot: pozvánka vypršela dřív, než vznikla
Konec platnosti počítalo PHP, ale porovnával se s hodinami databáze. Když jdou proti sobě, je pozvánka prošlá hned po vyrobení — a stejně tak zpráva se samomazáním zmizí dřív, než se stihne zobrazit. Čas teď počítá databáze a ven chodí jako počet sekund od začátku epochy, který žádnou časovou zónu nenese, takže se prohlížeč se serverem nemá kde rozejít. Druhá věc: kdo klikl na vlastní pozvánku, spotřeboval ji a rozhraní pak spadlo — členovi kanálu se teď nabídne rovnou vstup a odkaz zůstane nedotčený.
  • U pozvánky je vidět, kolik času jí zbývá, počítáno hodinami serveru
  • Chybová hláška z prohlížeče říká, která operace selhala a co server odpověděl — dřív jen „odpověděl nesrozumitelně"
  • U otisku klíče je napsáno, že je veřejný a je určený k předčítání — vypadal jako únik
Šepot: odkaz na pozvánku nešel zkopírovat
Ochranu proti kopírování jsem pověsil na celé vysunuté okno, takže zamkla i odkaz, který je určený k rozeslání — vyrobil se, ale nedal se označit ani zkopírovat. Ochrana patří jen na výpis přijatých zpráv; tam zůstala. Okno s pozvánkou a otisky klíčů se teď kopírovat dá, protože obojí se má předávat dál. Přibylo taky tlačítko Kopírovat odkaz, ať se to nemusí trefovat myší.
  • V rozepsané zprávě jde zase označit text a opravit překlep — vlastní koncept nemá proč být zamčený
Šepot: nešlo odeslat zprávu ani vyrobit pozvánku
Prohlížeč posílal označení kanálu v těle požadavku, server ho hledal v adrese. Prošlo proto jen čtení; odeslání zprávy, pozvánka ven, hlášení snímku obrazovky, odchod i smazání kanálu tiše padaly na „konverzace neexistuje". Navíc se hlášení o snímku tvářilo jako odeslané dřív, než dorazilo na server — takže se chyba schovala za potvrzení, které nic nepotvrzovalo. Obojí je opravené a přibyla kontrola, která tenhle druh nesouhry mezi prohlížečem a serverem odhalí dřív, než se nasadí.
  • Vydané pozvánky jsou vidět v seznamu a jdou zrušit — uniklý odkaz se dá zneplatnit
  • Potvrzení o nahlášení snímku se ukáže až když ho server přijme, a řádek naskočí v rozhovoru hned
  • Tři části rozhraní, ke kterým nevedlo žádné tlačítko, jsou pryč
Šepot — soukromý kanál, do kterého nevidí ani provozovatel
Nový modul pro komunikaci mezi profily. Zprávy se zašifrují v prohlížeči odesílatele a rozluští až v prohlížeči příjemce — server dostane obálku, kterou neumí otevřít, a to ani na požádání. Klíč vzniká u tebe a zamyká se heslem, které nikam neodchází; když ho zapomeneš, zprávy jsou pryč a nikdo s tím nic neudělá. Kanál může být dvoučlenný i skupinový a pozvat jde i člověka bez účtu — dostane odkaz, ve kterém je klíč schovaný za mřížkou, tedy v části, kterou prohlížeče na server neposílají. Na začátku článku o modulu stojí, co server přesto vidí: kdo si s kým píše a kdy. Tomu se u webu vyhnout nedá a je poctivější to napsat, než to zamlčet.
  • Zprávy můžou samy mizet — po hodině, dni nebo týdnu, podle nastavení zakladatele
  • U každého člena je vidět otisk klíče; ověř si ho s protějškem telefonem a víte, že mezi vámi nikdo nestojí
  • Proti snímkům obrazovky: zatemnění okna, vypnuté kopírování, prázdný tisk, vodoznak se jménem — a hlášení pokusu ostatním v kanálu. Zámek to není a modul to říká rovnou.
  • Modul není v katalogu ani v menu a nese noindex — kdo tam má chodit, dostane odkaz od člověka
Export oken: nevyrobitelné řádky jsou červené i v Excelu
Na webu se rozměr, který vyšel nulový nebo záporný, obarví červeně — do sešitu se to ale dosud nepřeneslo a zůstala jen poznámka v posledním sloupci. Teď se celý takový řádek podbarví a rozměr, který ho shodil, je navíc tučně tmavě červený. Při listování delší tabulkou je hned vidět, co nesmí do výroby — a jestli je vadná šířka, výška, nebo obojí.
  • Sloupec Poznámka zůstává: rozliší „vlastní odpočty“ od „NEVYROBITELNÝ ROZMĚR“ a dá se podle něj filtrovat
Okna a dveře: jiné výchozí odpočty výšky
Nahoře 10 mm, dole 30 mm místo dosavadních 30 a 15 — dole se okno vyrovnává a je potřeba místo na práh nebo podkladní profil. Celkový odpočet výšky tím klesl ze 45 na 40 mm, šířka zůstává 15 + 15. Komu už v prohlížeči leží vlastní hodnoty, tomu zůstanou; nové výchozí dostane až tlačítkem „Vrátit výchozí".
  • Popisek tlačítka i vysvětlivka pod tabulkou sedí s novými čísly
Rozměry oken a dveří — nový nástroj
Zadáš rozměr stavebního otvoru, vypadne rozměr okna nebo dveří k objednání. Odpočet montážní spáry se nastavuje pro každou stranu zvlášť — vlevo, vpravo, nahoře, dole (výchozí 15 · 15 · 30 · 15 mm) — a jednotlivá položka si může vzít vlastní, třeba dveře s prahem. Změna parametru přepočítá celou tabulku okamžitě; rozměr, který by vyšel nulový nebo záporný, se označí červeně a nedá se přehlédnout. Počítá prohlížeč, seznam zůstává u tebe.
  • Export do Excelu skládá sešit sám, bez stahování knihovny — .xlsx je jen zabalené XML
  • Kalkulačka je pro všechny; export chce účet, který je ale zcela zdarma
  • Na mobilu se tabulka překlopí do karet, ať se nic neschovává za vodorovné posouvání
  • Admin vidí ve Statistikách, kolik lidí nástroj používá — z návštěvníka jen otisk IP, zadané rozměry nikdy
Chybové stránky konečně vypadají jako web
Kdo se ukliknul v adrese, dostal do prohlížeče kus JSONu v angličtině a žádnou cestu zpátky. Teď se 404 i 403 vykreslí jako normální stránka s hlavičkou, patičkou i tlačítkem domů — a druhé tlačítko rovnou otevře hlášení chyby s předvyplněnou adresou, která nefungovala. Stroje (API, AJAX) dostávají JSON dál.
  • Chyby 5xx mají vlastní krátkou stránku, která si vystačí sama — když je něco rozbité, nemá smysl nad tím stavět celý web podruhé
Redesign hotov — starý layout zrušen
Všech 81 stránek má vyřešený vzhled. Starý layout, který se půl roku držel vedle nového, už není potřeba — a s ním zmizel i příznak, kterým si každá stránka říkala, který kabát chce. Nová stránka teď dostane hlavičku, patičku, tmavý režim i mobilní chování sama od sebe; napsat stačí obsah.
  • Vlastní layout si drží už jen cukrárna Kopretina a WebNaMíru — jsou to samostatné značky, ne podstránky
  • Příručka design systému popisuje tři případy, kdy stránka společný kabát nechce
Pro děti v novém kabátě — a poprvé i ve světlém režimu
Matika, čtení, pohádky, pozornost i čeština. Cvičení zůstávají stejná, jen barvy jdou přes tokeny, takže sekce drží světlý i tmavý režim. Jantarová barva jde z jedné proměnné, správně/špatně ze společných stavů. Strom s listy zůstává zelený — ten je odměna, ne kabát.
  • Vlastní lišta a nadpis sekce zmizely — hlavičku dodává web, ne stránka
Laserový tisk v novém kabátě, celoobrazovkové stránky na společné kostru
Laserový tisk jede na sdílených komponentách; tvary hrníčku, sklenice a termosky se kreslí dál, ale barvy si berou z tokenů, takže drží světlý i tmavý režim. Kniha dobrých zpráv, iOS Studio, Pepa Date a Zuzka Date mají vlastní rozhraní schálně — teď ale běží na společné kostře dokumentu místo vlastního layoutu.
  • Zpáteční odkaz v liště iOS Studia byl příliš tmavý na to, aby šel přečíst
  • Kontrola šablon rozezná i celoobrazovkovou aplikaci — nehlásí ji jako nedodělek
Komunitní sekce a pivní nástěnka v novém kabátě
Chat, živý chat, AI chat, PlnoHUB, Pička a týmy. Zlatou barvu nástěnky dělá jedna proměnná stejně jako růžovou u Seznamky — nastavení stránky si ji řekne, komponenty se přebarví samy. PlnoHUB už nenačítá cizí web dřív, než o něj člověk požádá.
  • Dročkové popisky, záhlaví tabulek a časové údaje byly příliš svetlé — teď splňují normální čitelnost ve světlém i tmavém režimu
  • Řádek seznamu s více tlačítky se na mobilu zalomí místo toho, aby stránku vystrčil do vodorovného posuvníku
  • Nastavení barvy modulu dřív nikam nevedlo — proměnnou nikdo nečetl
Minihry v novém kabátě, herní grafika zůstává herní
Rozcestník i pět her. Chrom kolem hry — hlavička, drobečky, tlačítka mimo plochu — jede na tokenech jako zbytek webu, ale barvy samotné hry zůstávají: písek bojiÅ¡tě, zlato nápisů a sépiová mapa nejsou téma webu, ale obrázek. Kontrola šablon je teď rozezná a nehlásí jako nedodělek.
Seznamka v novém kabátě — a zůstává růžová
Všech pět stránek sekce. Růžovou identitu nedělá vlastní sada barev, ale přetočení jedné proměnné — komponenty uvnitř se přebarví samy a nepotřebují o tom vědět. Díky tomu Seznamka poprvé funguje i v tmavém režimu. Vlastní obal sekce zmizel, navigace, nápověda i hlídání nepřečtených zpráv jsou v jednom souboru místo v každé stránce zvlášť.
  • Odznáčky u záložky Shody se už nevrší tři vedle sebe — platí pořadí nepřečtené › nová shoda › čekající lajk
  • Odstín sekce jako parametr — další sekce si může vzít svou barvu jedním atributem
Celý admin v novém kabátě — a stav příkazů Claudea se konečně sám aktualizuje
Dvanáct stránek adminu, dvanáct kopií stejné navigace a dvanáct vlastních sad stylů. Navigace je teď v jednom souboru, styly nahradily společné komponenty. Při převodu se našlo, že stránka Claude Remote volala adresu z vývojového stroje — v produkci vrací 404 a chyba se tiše polykala, takže se stav příkazů nikdy neaktualizoval bez ručního načtení stránky.
  • Hromadné mazání uživatelů počítalo i řádky, které hledání skrylo — teď berě jen ty vidět
  • Graf hodinové zátěže kreslí CSS místo Chart.js z cizího CDN: o 200 kB méně a drží oba režimy
  • Záložky s panely a odklopení skrytého kusu stránky jsou teď společné
Pylearn celý v novém kabátě
Kurzy, detail kurzu, lekce i pět admin stránek. Karta kurzu si nese svou barvu a tenký pruh dokončeného, hledání v lekcích i v uživatelích jede na společném filtru včetně zkratky „/“ — každá stránka si předtím vozila vlastní kopii skriptu. Cvičení se spouštěčem kódu zůstává funkční beze změny, jen dostalo čitelné barvy v obou režimech. Modulový obal zmizel.
  • Navigace adminu Pylearnu je teď na jednom místě místo pětkrát okopírovaná
  • Karta umí vlastní barvu a pruh postupu — využije i výpis projektů
Marketplace v novém kabátě
Výpis nabídek, detail i formulář berou vzhled ze zbytku webu — včetně tmavého režimu, který modul předtím neuměl. Stránkování jede na sdíleném pageru s oknem, poptávka na sdílených polích. Modulový obal zmizel.
  • Cukrárna Kopretina a WebNaMíru zůstávají ve svém — jsou to samostatné značky s vlastní identitou, ne stránky BuresIndustries. Kontrola šablon je teď počítá zvlášť, ne jako nedodělek.
Zuzka Date — Pepa Date z druhé strany
Stejná hříčka, jen opáčně: jedna otázka, tři tlačítka a dvě z nich lžou. Kdo dokliká na konec, dostane slíbený telefon — jenže telefon, ne číslo. Odměna chodí ze serveru a jen přihlášenému, takže pointu nejde vyčíst ze zdroje stránky. Žádné skutečné telefonní číslo se tu nikde neuklidně.
Svátky API a profil v novém kabátě — nastavení zobrazení zase něco dělá
Nastavení zobrazení v profilu (velikost písma, kompaktní režim, animace) si psalo vlastní klíče a přidávalo třídy, které v novém vzhledu už neexistují — tlačítka tedy nedělala vůbec nic. Teď jdou přes společné přepínače, které nastavení opravdu mění, pamatují si ho a přibývá k nim i vzdušná hustota. Dokumentace Svátky API dostala sdílené tabulky, ukázky kódu a okno s odpovědí — obarvený JSON teď drží světlý i tmavý režim.
  • Barva kurzu v pruhu postupu mizěla: Latte v atributu style escapuje CSS, takže z #3776ab udělalo \#3776ab a vlastnost byla neplatná
  • Sdílený řádek s postupem, ukázka kódu, okno s odpovědí a přepínače nastavení
  • Buňky tabulky se escapují; hotové HTML jde pustit dovnitř jen vědomě
Osudí života v novém kabátě
Rozcestník i osudové číslo mají vzhled zbytku webu — včetně tmavého režimu, který modul předtím neuměl (byl natřený natvrdo do fialové tmy bez ohledu na volbu). Modul měl vlastní obal se svou sadou stylů; ten zmizel, místo něj se používá společný. Statistika čísel teď jede na sdíleném ukazateli, vlastnosti na sdílených odznacích. Živý výpočet v prohlížeči skládá stejné značení jako server, takže vypadá stejně jako výsledek po načtení stránky.
  • Otisk souborů pro cache hlídal jen tři soubory design systému — úprava skriptu jednotlivé stránky se tak k návštěvníkovi nedostala. Teď sleduje celé /css a /js.
  • Sdílený ukazatel (popisek, pruh, hodnota) pro žebříčky
Přihlášení a registrace v novém kabátě — a stránky kolem hesla, které byly bez stylů
Tmavá místnost se zavěšenou lampou zůstává — zatáhneš za šňůru, rozsvítí se a formulář se odhalí; když zhasneš, ze tmy se dívají oči. Nové je, že karta a pole v ní berou barvy ze zbytku webu, takže ve světlém režimu visí nad rozsvícenou lampou světlá karta. Zároveň se našlo, že tři stránky kolem hesla (zapomenuté, reset, změna) už měly nové značení, ale starý obal, který nové styly vůbec nenačítá — chodily tedy úplně bez vzhledu. Teď už ne.
  • Odkaz, který vypadá jako tlačítko nebo položka nabídky, měl po celém webu barvu obyčejného odkazu — zelená na zeleném tlačítku, zelená místo Google šedé. Horní nabídka teď zvýrazňuje jen stránku, na které právě jsi.
  • Kaptcha, past na roboty i hlášky formulářů jdou přes společné komponenty
Fórum v novém kabátě — a tři chyby, které v něm tichá ležely
Rozcestník, kategorie i vlákno mají vzhled zbytku webu a fungují na mobilu. Při převodu se našly tři živé chyby: tlačítko „Odpovědět“ si nikdy neuložilo, komu odpovídáš — každá odpověď tak spadla do kořene vlákna místo pod příspěvek; dotažené příspěvky ze živé AI diskuse ztrácely zanoření ze stejného důvodu; a odkaz, který vypadá jako plné tlačítko, měl po celém webu špatnou barvu textu — zelená na zelené, bílá na červené. Všechny tři jsou spravené.
  • Sdílené stránkování umí okno kolem aktuální stránky a výpustku — nevypisuje všech devět desítek stránek
  • Nová komponenta „řádek seznamu“ pro výpisy, které nejsou tabulka ani karty
  • Počítadlo znaků pod poli obstarává jeden sdílený skript místo kopie v každém formuláři
  • Kontrola tlačítek: všech 214 na převedených stránkách teď snáší kontrast 4,5 : 1 ve světlém i tmavém režimu
Stránka Verze v novém kabátě
Historie změn teď vypadá jako zbytek webu — stejné barvy, stejné písmo, funguje tmavý režim. Celá časová osa leží na vlastním podkladu, protože text psaný přímo přes živou krajinu se špatně čte a proletující brouk umí spolknout písmeno. Na úzkém displeji se záznam sklopí pod sebe. Starší dny zůstávají sbalené a rozklíknou se klepnutím, jako dřív.
Prohlížeč si držel staré styly — nový vzhled se k nikomu nedostal
Styly i skripty se načítaly s otiskem ?v=1, jenže ten otisk se nikdy neměnil. Kdo web navštívil jednou, držel si první staženou verzi napořád — a všechny pozdější úpravy vzhledu (nabídka účtu, lišta s cookies, živá krajina) se k němu vůbec nedostaly. Na mobilu se to projevilo tak, že stránka vypadala rozsypaně: ikonky pod sebou v rohu a hory přes celou obrazovku. Otisk se teď počítá z času poslední změny souborů, takže po každém nasazení přijde nová verze. Kulisa se zároveň přesunula na konec stránky — kdyby se styly někdy nenačetly, zůstane pod obsahem místo aby ho odstrčila.
Živá krajina za obsahem — ve dne údolí, v noci obloha
Za stránkami teď dýchá kulisa. Ve dne mlhavé údolí: čtyři hřebeny za sebou, každý bližší tmavší a sytější, mezi nimi pruhy mlhy a u obzoru teplé světělko. Nad tím plujou mraky, létá včela, motýl a brouk a shora se snáší listí. V noci hvězdná obloha s měsícem, padajícími kometami a občasnou raketou. Přepíná se to spolu s tmavým režimem. Všechno je kreslené přímo v prohlížeči — nic se nestahuje. Kdo nemá rád pohyb, tomu kulisa ztichne (respektuje nastavení systému). Čitelnost je změřená: všechny popisky drží kontrast aspoň 4,5 : 1 ve dne i v noci.
Vrácené drobnosti: účet, cookies, zvoneček i svátek
Při převodu na nový kabát vypadlo několik věcí, které starý web měl. Nejdůležitější: odkazy k účtu skončily jen v mobilním menu, jenže to se na širokém displeji nezobrazuje — přihlášený uživatel se na počítači neměl jak odhlásit. V hlavičce je teď nabídka pod jménem (Můj profil, Změnit heslo, Admin, Odhlásit; nepřihlášenému Přihlásit a Registrace), zavírá se klepnutím vedle i Escapem a funguje i bez JavaScriptu. Zpátky je také lišta se souhlasem s cookies (dřív daný souhlas platí dál, nikdo se nebude ptát znovu), zvoneček s počtem věcí ke schválení pro admina a přání k svátku autora 19. března.
Skládání úvodní stránky zpátky — a konečně i na mobilu
Přetahování dlaždic, schovávání a vlastní odkazy jsou zpátky, teď vedle hledání a filtru. Tlačítko Upravit přepne stránku do režimu úprav: na každé dlaždici přibude oko (schovat) a úchyt (přesunout), filtr se schová, ať je vidět všechno. Nově to funguje i prstem na mobilu — předchozí verze používala HTML5 drag&drop, který na dotykovém displeji nedělal vůbec nic. Přesunout dlaždici jde také šipkami z klávesnice. Uložené rozložení z dřívějška zůstává platné a admin dál určuje výchozí podobu pro nové návštěvníky. Při testování se ukázalo, že plovoucí tlačítko „Nahlásit chybu“ leželo nad pravým dolním rohem a bralo kliknutí dlaždici pod sebou — v úpravách se teď uhne.
Nový kabát webu — sdílený design systém
Web dostává jednotný vzhled. Doteď měla každá stránka vlastní styly — devadesát šablon, devadesát kopií tohož. Nově je všechno na jednom místě: barvy, písmo, tlačítka, karty i formuláře. Změna na jednom místě se projeví na celém webu. Stránky se skladájí z hotových komponent místo ručně psaného HTML. Přibyl tmavý režim (drží se nastavení systému, nebo si ho přepneš sluncem v hlavičce), plně funkční mobilní menu a úvodní stránka umí hledat a filtrovat podle rubrik — hledání nevadí diakritika. Všechno se ovládá klávesnicí a respektuje volbu omezení animací.
Osudí života — nový modul s numerologií (/osudi)
Nová sekce, do které budou postupně přibývat podmoduly. První z nich je Osudové číslo (/osudi/osudove-cislo): vyberete den a měsíc, dopíšete rok — a výsledek se spočítá sám, bez odesílání a bez přihlašování. Číslo vznikne součtem všech číslic data narození, který se redukuje na 1 až 9; mistrovská čísla 11, 22 a 33 se dál nesčítají a jsou v odpovědi odlišená. U výsledku je vidět celý postup výpočtu (1+9+1+2+1+9+8+7 = 38 → 3+8 = 11), výklad čísla, jeho energie Jang/Jin a seznam pozitivních i negativních vlastností; pod kalkulačkou je přehled všech dvanácti čísel k prolistování. Z boku běží statistika, která čísla vycházejí návštěvníkům nejčastěji — právě spočítané číslo se v žebříčku zvýrazní. Do databáze jde jen výsledné číslo, datum narození se neukládá, a stejné datum od stejného návštěvníka se do statistiky započítá jednou. Stránka funguje i bez JavaScriptu a výsledek jde sdílet odkazem.
Cesta kolem světa — hudba, potřebný klid na čtení a větší domky
Tři věci, které hru drhly. Titulek etapy změl dřív, než ho stihlo dítě přečíst — teď počká na tlačítko „Jdeme na to" a hra se do té doby nehne (potvrdit jde i klepnutím kamkoli, mezerníkem nebo Enterem). Přibyla hudba, která se skládá přímo v prohlížeči — žádné stažené soubory — a mění se podle kraje: doma zní klidně, v bouři na moři podívně, v džungli na bubny, v poušti do orientálna, pod hladinou skoro nehnutě. Při špatném rozhodnutí zahraje krátký smuteční předěl, při návratu domů vítězný. Hudbu vypne notička v levém horním rohu a volba se pamatuje; na skryté záložce hudba mlčí. Domy, chalápky, chýše, dílna, pagoda i maják jsou o polovinu větší, aby proti desetiletému klukovi vypadaly jako stavby. Při té příležitosti se odešinuly kulisy, které stály přesně v postavě (šaman stál v soše), a spravil se proužek, který po změně velikosti okna probléskl pod scénou.
Minihry — Cesta kolem světa, 2D dobrodružství pro děti
Nová hra v Minihrách: Rodiče vyhnali kluka do světa a on se musí dostat kolem celé zeměkoule zpátky domů. Chodíš doleva a doprava po scéně, kterou vidíš z dálky, a když dojdeš k postavě, otevře se rozhovor v bublině s nabídkou odpovědí. Každá odpověď rozhoduje, jestli cesta pokračuje — vybereš loď a přijde bouřka: zůstat u stěžně, nebo skočit do člunu? Špatná volba znamená krátkou animaci a vysvětlení, co se stalo, a jedno ze tří srdíček je pryč; když dojdou všechna, cesta začíná od začátku. 35 etap vede přes les, moře, džungli, poušť, hory, velkoměsto i pod hladinu, cestuje se vlakem, autem, lodí, na voru, velbloudovi, džípem, balónem, motorkou, letadlem, ponorkou, na koni i trajektem — s plynulými přechody mezi scénami. Hra se sama ukládá k přihlášenému profilu, takže se dá kdykoli pokračovat, a vede si statistiky: kolikrát jsi umřel, kolik pokusů o cestu máš za sebou, jak daleko jsi došel a kolikrát jsi dorazil domů. Všechno se kreslí přímo v prohlížeči, ovládá se šipkami i prstem a přizpůsobí se mobilu.
Pro děti — hlas zní jako člověk a jde si ho vybrat
Předčítání v celé sekci Pro děti znělo roboticky, protože si stránka brala první český hlas, který prohlížeč nabídl — a to bývá zrovna ten nejstrojovější. Nově se hlasy seřadí podle kvality (přirozené a online hlasy nahoře, staré syntetizátory dole) a nad záložkami je výběr hlasu s rychlostí čtení a tlačítkem na vyzkoušení; volba se pamatuje a platí pro matiku, čtení, pohádky i nápovědu. Čte se svižněji a o chlup výš, takže hlas působí přívětivěji než dřívější zpomalené drmolení — slabiky přitom zůstávají pomalejší než věty, aby se daly hláskovat. Čísla se nahlas říkají slovy („kolik je dva krát čtyři?"), takže je nezkomolí ani hlas, který si s číslicemi neví rady; na obrazovce zůstávají číslice. Opravené je i to, že Chrome uprostřed delší pohádky sám utnul čtení, a když v prohlížeči žádný český hlas není, stránka to rovnou řekne místo toho, aby mluvila lámanou češtinou.
Registrační e-maily — odesílání opraveno a nově vidět
Ověřovací e-mail po registraci často nedorazil a web se tvářil, že vše proběhlo v pořádku — odeslání se nikde nekontrolovalo ani nezapisovalo, takže o neúspěchu nebylo jak vědět. Nově všechny zprávy z webu (ověření e-mailu, reset hesla, změna adresy, schválené vtipy, poptávky i upozornění pro admina) chodí jedním společným kanálem, který posílá kompletní a správně sestavenou zprávu — s diakritikou, která se cestou nerozsype, a s údaji, podle kterých Gmail se Seznamem poznají, že zpráva opravdu patří doméně, místo aby ji mlčky zahodily. Když odeslání selže, uživatel se to teď dozví — u registrace se rovnou nabídne poslat ověřovací odkaz znovu z profilu — a záznam o pokusu zůstane v logu, takže je vidět, kterým adresám zprávy odcházejí a kde je problém. Pokud by odesílání na serveru nefungovalo vůbec, jde web přepnout na doručování přes poštovní server bez zásahu do kódu.
Pepa Date — jedna otázka, tři tlačítka a dvě z nich lžou
Nová stránka /pepa-date, dělaná na mobil: nahoře fotka, pod ní otázka a tři odpovědi — Ano, Možná, Ne. Klepnutí na Ne ale odpověď přehodí na Možná a stránka namítne, že to byl překlep; tlačítko se přitom uhne, zmenší a s každým dalším klepnutím zbledne, ale klikací zůstává — každé Ne má vlastní hlášku, takže vytrvalost se vyplatí. Možná spustí tři odpovědi po sobě, aby pointa dosedla až nakonec. Odpovědi nechodí naráz: než se Pepa rozepíše, chvíli to trvá, v konverzaci mezitím bliká „píše…“ a delší věta mu trvá dýl než krátká — u fotky se to zároveň projeví na štítku vedle jména. a Ano zavře otázku finále se stoupajícími srdíčky a tlačítkem Ukázat číslo. Telefon dostanou jen přihlášení — ostatním se otevře výzva k přihlášení či registraci a po přihlášení se vrátí přesně sem. Do stránky se číslo nevykresluje předem, chodí ze serveru až po kliknutí, takže roboti sbírající kontakty mají smůlu. Celé to běží v prohlížeči, nic se nikam neukládá a nic nevyžaduje přihlášení. Kdo má v nastavení omezené animace, dostane tutéž konverzaci bez pohybu. Odkaz je na hlavní stránce mezi projekty.
iOS Studio — úprava příkladu se teď píše rovnou v editoru
Úprava příkladu měla o krok navíc: tužka rovnou otevřela okno s názvem a popisem, takže kdo chtěl sáhnout na kód, musel okno zavřít, přepsat kód a tužku zmáčknout znovu. Nově tužka jen načte kód do editoru a nahoře zůstane viset lišta „Upravuješ Počítadlo“ s tlačítkem Uložit pro všechny. Píše se tedy normálně v editoru a uložit jde kolikrát je potřeba — lišta pokaždé potvrdí čas uložení. Název s popisem se mění tlačítkem vedle a křížkem se úpravy ukončí, aniž by se kód z editoru ztratil.
iOS Studio — nabídku Příklady si teď admin skládá sám
Nabídka Příklady v iOS Studiu byla natvrdo daná: jedenáct vestavěných ukázek plus vzory, které navrhli uživatelé a admin je mohl jen schválit, nebo zamítnout. Nově má admin v panelu Příklady celou nabídku ve své režii — přidá kód z editoru jako nový příklad, který ostatní uvidí okamžitě, přepíše název, popis i kód kteréhokoli příkladu včetně vestavěných, a co se nehodí, smaže nebo schová. Nic se přitom neztratí: úprava vestavěného příkladu jde jedním kliknutím vrátit na originál a schovaný příklad zase vytáhnout zpátky do nabídky. Návrhy od uživatelů se dají rovnou z editoru otevřít, upravit a zveřejnit. Pro ostatní se nemění nic — jen vidí nabídku, jakou jim admin připraví.
Pro děti — statistika už nic neschová a každá odpověď má svůj záznam
Když mělo dítě vybranou třeba řadu 3, mřížka ve statistice schovala všechny ostatní řady — a řada 4, kterou počítalo o pět minut dřív, vypadala, že se nezapsala. Data v pořádku byla, jen je zakrýval filtr. Mřížka i přehled nápovědy teď vždycky ukazují celou operaci bez ohledu na to, co je zrovna vybrané k procvičování. K tomu je ukládání nově neztratitelné: každá odpověď dostane vlastní identifikátor a čeká ve frontě v prohlížeči, dokud ji server nepotvrdí — přežije výpadek sítě, zavření záložky i vypršené přihlášení a díky tomu identifikátoru se nikdy nezapíše dvakrát. Dítě přitom vidí, kolik odpovědí ještě čeká na uložení. A přibyl detailní log: v administraci je u každého dítěte seznam každé jednotlivé odpovědi — čas, příklad, co dítě odpovědělo, jestli to bylo správně, jestli u toho mělo nápovědu a jestli šlo o učení nebo test, s filtrem po dnech.
Nasazování webu běží na novém Node.js 24
Automatika, která po každé změně nahraje web na server, stála na Node.js 20 — a ten GitHub oznámil jako doslouživší. Zatím to jen hlásilo varování, ale po vypnutí staré verze by nasazování přestalo fungovat úplně. Obě části automatiky jsou proto povýšené na verze běžící na Node.js 24: stahování kódu z repozitáře a samotné nahrání na FTP. Na webu není nic vidět — mění se jen to, co běží na pozadí při publikování změn — ale díky tomu půjde web dál aktualizovat i po termínu, kdy GitHub starou verzi vypne.
Pro děti — nápověda po chybě počká na odkliknutí a nově se počítá, jak často se používá
Nápověda se slepicemi po špatné odpovědi mizela sama po pár vteřinách, což na přepočítání vajec nestačilo. Nově zůstane na obrazovce, dokud dítě neklepne na tlačítko „Rozumím, zkusím to znovu" — teprve pak se příklad zopakuje. Stejně se čeká i v testu, kde tlačítko pošle na další otázku (u poslední na výsledek). Správná odpověď pokračuje dál sama jako dřív. Navíc: když strom uschne poslední otázkou testu, výsledek testu se teď ukáže — dřív ho přebila obrazovka s uschlým stromem. A přibylo počítání nápovědy: web si u každého příkladu pamatuje, kolikrát u něj dítě sáhlo po nápovědě. Ve statistice dítěte je vidět věta typu „násobení řadou 3: nápovědu jsi použil 5× z 10 odpovědí", v administraci pak přehled po modulech (matika × / + / −, čeština, pozornost) i po jednotlivých řadách násobilky — hned je poznat, které učivo jede dítě samo a kde si pořád nechává poradit.
Pro děti — matika se stromem, nápověda na slepicích a statistika, která si pamatuje chyby
Záložka Matika v sekci Pro děti je celá nová a soustředí se na to podstatné: sčítání, odčítání (do 10 nebo do 20) a malou násobilku (celou, nebo jen jednu řadu). Web si u každého přihlášeného dítěte pamatuje každý jednotlivý příklad zvlášť — příklad, ve kterém se spletlo, se vrátí hned a pak znovu, dokud ho nedá dvakrát po sobě správně; teprve pak zezelená. Barevná mřížka ukazuje na první pohled, co už umí a kde chybuje, pod ní je seznam nejčastějších chyb a čas strávený učením. Když je celá sada zelená, odemkne se test — deset náhodných příkladů bez nápovědy. Nápověda u násobení nakreslí úlohu na slepicích a vejcích (slepic je vždycky míň než vajec — počítají se ta vejce) a přečte ji nahlas česky se správným skloňováním; u sčítání a odčítání rovnou ukáže výsledek. Po chybě se nápověda ukáže sama. A nad příklady roste strom: za každou chybu spadne list, po deseti chybách uschne a musí se zasadit nový. Statistika se sbírá i pro Čeština, Pozornost a Pohádky. Pro rodiče a správce přibyl v administraci přehled Pro děti — u každého dítěte den po dni, v kolik hodin se učilo, jak dlouho, kolik příkladů udělalo, s jakou úspěšností a ve kterých příkladech chybuje.
iOS Studio — Násobilka se stromem mluví, animuje a umí se pochlubit
Hra ve vzoru Násobilka se stromem dostala tři věci. Hlasovou nápovědu: tlačítko ukáže úlohu na slepicích a vejcích — 3 × 4 jsou tři slepice a každá snese čtyři vejce — nakreslí to emoji a rovnou to přečte nahlas česky, včetně správného skloňování (jedna slepice, dvě slepice, pět slepic). Když odpovíš špatně, nápověda se ukáže sama. Animace: list ze stromu teď plynule padá a otáčí se, koruna se otřese, správná odpověď se zeleně nafoukne. A sdílení — na konci hry i u uschlého stromu je tlačítko, které pošle výsledek dál (na mobilu systémovým sdílením, na počítači do schránky). Motor kvůli tomu umí dvě nová API: AVSpeechSynthesizer pro čtení nahlas a funkční ShareLink. Testy hru pro jistotu celou prohrají od zadání jména až po sdílení — je jich 75.
iOS Studio — aplikace se dostane k poloze, baterii, galerii i zkratkám
Náhled si nově půjčuje skutečné schopnosti prohlížeče, a to pod opravdovými názvy z iOS, aby stažený .swift šel přeložit v Xcode. CLLocationManager().requestLocation() se zeptá na skutečnou polohu — když ji odmítneš, dostaneš simulovanou Prahu a v konzoli je o tom poznámka, takže je vždycky jasné, s čím pracuješ. UIDevice.current.batteryLevel čte skutečný stav baterie tam, kde to prohlížeč umí. PhotosPicker otevře výběr opravdové fotky, kterou pak ukážeš přes Image(uiImage:) — nikam se neposílá. UIScreen.main.bounds a UIDevice.current.name hlásí telefon vybraný v liště, ProcessInfo.processInfo dobu běhu a počet jader. A UIApplication.shared.open u odkazů i zkratek (shortcuts://run-shortcut?name=…) napíše přes obrazovku, co by se na skutečném telefonu stalo. Nový vzor Stav telefonu to ukazuje pohromadě. Motor hlídá 72 automatických testů.
iOS Studio — plátno na kreslení, mazání ze seznamu a doladěné ovládání
Do náhledu přibylo Canvas — kontext.fill, .stroke i .draw nad Path se překreslí jako grafika, takže si jde nakreslit vlastní graf nebo obrázek. Ze seznamu se dá mazat: .onDelete a .swipeActions u ForEach dají každému řádku tlačítko a remove(atOffsets:) funguje. TimelineView se sám překresluje v zadaném rytmu, takže hodiny tikají. Doladilo se ovládání: TabView(selection:) se řídí vazbou a .tag, .onSubmit reaguje na Enter v textovém poli, .keyboardType přepne klávesnici na mobilu, .refreshable nabídne obnovení a .overlay(alignment:) zarovná překryv, kam patří. Konzole navíc hlásí sáhnutí mimo pole. Přibyl vzor Analogové hodiny (plátno + tikající čas) a názvy proměnných můžou mít diakritiku — počet i příjmení projdou překladačem i zvýrazňovačem. Motor hlídá 65 automatických testů včetně záludností syntaxe.
iOS Studio — gesta tažením, moderní navigace a konzole, která pozná překlep
Náhled nově hlásí překlepy: když použiješ proměnnou, funkci nebo metodu, kterou nezná, napíše to do konzole i s číslem řádku místo toho, aby tiše vykreslil prázdno — tichá chyba byla u učení to nejnepříjemnější. Přibyla gesta tažením: .gesture(DragGesture().onChanged { … }.onEnded { … }) funguje myší i prstem a prvek se opravdu táhne za kurzorem. Navigace umí moderní zápis NavigationLink(value:) spolu s .navigationDestination(for:) a sheet jde otevřít i podle vybrané položky (.sheet(item: $vybrany)). A konečně: @AppStorage opravdu ukládá — hodnota se uloží do prohlížeče a přežije restart náhledu i zavření stránky, přesně jako na iPhonu. Ze seznamu jde mazat (.onDelete i .swipeActions u ForEach), TimelineView se překresluje sám v zadaném rytmu, Text(datum, style: .time) umí formát a sáhnutí mimo pole se ohlásí do konzole místo tichého prázdna. Motor hlídá 58 automatických testů.
iOS Studio — překladač Swiftu umí podstatně víc jazyka i SwiftUI
Motor, který v prohlížeči překládá tvůj Swift na živý náhled, dostal největší rozšíření od svého vzniku. Z jazyka nově zvládá enum (rawValue, CaseIterable, asociované hodnoty i vlastní metody), switch se vzory, vazbami a where — a to jak v kódu, tak přímo v těle pohledu. Přibyly modelové struktury s vlastním init, třídy s ObservableObject a @Published, extension nad vlastními i vestavěnými typy, statické členy, guard a if let s více podmínkami, optionaly, n-tice, repeat, for … where, stride i zkrácené parametry closure ($0). Rozrostla se standardní knihovna — String, Array, Set, Dictionary, Date, matematika — a čas: Timer.scheduledTimer, DispatchQueue.main.asyncAfter i Task (náhled je při zastavení poctivě ruší). Z prvků přibyly LazyVGrid s GridItem, Grid, Menu, Gauge, ColorPicker, funkční DatePicker, LabeledContent, datový List a AsyncImage; z modifikátorů .toolbar s ToolbarItem, .searchable, .onChange(of:), .task, .contextMenu, .confirmationDialog, .safeAreaInset, materiály a obrazové filtry. Knihovna SF Symbols povyrostla zhruba na dvojnásobek. A hlavně: animace už opravdu animují — náhled si mezi překresleními pamatuje předchozí podobu prvku, takže .animation i withAnimation plynule přejedou velikost, barvu, posun nebo průhlednost místo dřívějšího skoku. Nakreslit si jde i vlastní tvar — struct … : Shape s Path (move, addLine, addCurve, addArc) se vykreslí jako SVG a .fill i .stroke na něm fungují. Nové příklady: Kvíz s enum a switch a Mřížka s hledáním. Motor hlídá 50 automatických testů.
iOS Studio — vzory od uživatelů a zvoneček schvalování pro admina
Svůj projekt v iOS Studiu můžeš nově navrhnout jako vzor pro ostatní — tlačítko najdeš v panelu Projekty. Návrh vždycky čeká na schválení admina, a to i tehdy, když ho podá admin sám; automaticky se neschvaluje nic. Schválené vzory se pak objeví v nabídce Příklady ve skupině „Vzory od uživatelů“ i se jménem autora. Admin má v horní liště zvoneček s počtem věcí, které čekají na jeho slovo — vede rovnou do administrace, kde vzor rozklikne včetně kódu a schválí nebo zamítne. Zároveň: výzva k přihlášení u AI pomocníka je teď vyskakovací okno s přihlášením i registrací a tlačítko Oprav chybu se nejdřív zeptá, co má opravit.
iOS Studio — AI pomocník píše SwiftUI s tebou
Do editoru přibyl pomocník postavený na Mistral Codestral — stejném API, jaké pohání autonomní blog a Knihu dobrých zpráv. V panelu ✨ AI napíšeš česky, co má aplikace dělat, a kód se objeví rovnou v editoru i na mobilu (s možností vrátit původní). Umí taky opravit chybu podle hlášky z konzole a vysvětlit, co kód dělá. Při psaní navíc našeptává jako copilot: návrh se ukáže šedě za kurzorem, Tab ho přijme, Esc zahodí, Ctrl+mezerník si ho vyžádá. Model dostává seznam toho, co náhled umí, aby psal kód, který tady opravdu poběží. AI je pro přihlášené. Zároveň: tlačítko Nový projekt, Spustit/Zastavit s barevnou kontrolkou stavu, nápověda pod ikonou ⓘ a příklad „Násobilka se stromem“.
iOS Studio — piš aplikace ve SwiftUI a hned je zkoušej na virtuálním iPhonu
Nový modul /ios: vlevo editor Swiftu se zvýrazňováním, vpravo živý model iPhonu, který tvůj kód rovnou spustí. Náhled je opravdu interaktivní — klikáš v něm na tlačítka, píšeš do polí, přepínáš, listuješ do detailu a zpět, otevírají se sheety i alerty. Umí VStack/HStack/ZStack, List, Form, TabView, NavigationStack, Toggle, Slider, Stepper, Picker, gradienty i @State a vazby přes $. Na výběr jsou čtyři modely (15 Pro, Pro Max, 13 mini, SE), světlý a tmavý režim, šest hotových příkladů, ukládání projektů, sdílení odkazem a export do .swift pro Xcode.
Dobré zprávy — vesnička jen na zeleni, horský potok, mlýn se točí u vody
Stavby už nejde umístit do vzduchu — drží se jen na zelené louce (svah dostal souvislou zelenou plochu a stavění má strop výšky). Řeka se změnila v horský potok s kameny a peřejemi. A mlýn (i vodní kovárna) se roztočí jen tehdy, když se stavba dotýká potoka — postav je k vodě a rozběhnou se, dál od vody stojí.
Dobré zprávy — vesnička do svahu, řeka a traktor jezdící mezi poli
Vesničku teď stavíš po celém zeleném svahu, nejen podél spodní čáry — stavby výš do kopce se zmenšují a řadí dozadu (hloubka). Krajinou nově protéká animovaná řeka. A traktor už nepopojíždí na místě: automaticky objíždí všechna postavená pole, otáčí se podle směru jízdy a mění velikost podle toho, jak je daleko. Stavět jde i po stranách knihy.
Dobré zprávy — odreagovací minihra „Postav si vesničku"
Do spodní části Knihy dobrých zpráv přibyla odreagovací minihra zakomponovaná přímo do krajiny (jako motýl a housenka, žádné vlastní okno). Nenápadnou paletkou v rohu vybereš stavbu a klepnutím na louku ji postavíš: větrný mlýn s otáčejícími se plachtami, vodní kovárna s mlýnským kolem a kouřem, pole s vlnícím se obilím, popojíždějící traktor, domek s kouřem z komína a stromy. Klepnutí na hotovou stavbu ji rozhýbe. Celá vesnička se ukládá do prohlížeče a ladí se i s režimem den/noc.
Dobré zprávy — text kapitoly teď sedí na počet zpráv (číslování 1:1)
Stávalo se, že kapitola měla třeba 6 odkazů na zdroje, ale v textu byl jen jeden odstavec — číslování pak nesedělo. Generování je nově strukturované: Mistral vrací ke každé vybrané zprávě rovnou její odstavec i důvod a jeden titulek kapitoly, takže počet odstavců přesně odpovídá počtu zdrojů a číslování [1..N] sedí jedna ku jedné.
Dobré zprávy — přísný filtr negativity, důvod u každé zprávy, úklid kytek
Do Knihy dobrých zpráv se dřív občas prosmýkla i nepozitivní zpráva (vedra, požáry). Přidán tvrdý filtr negativních slov přímo na serveru jako pojistka nad AI — cokoli s náznakem katastrofy, počasí-hrozby, války, kriminality, nehody, nemoci či krize se zahodí ještě před výběrem. Ke každé vybrané zprávě teď Květa (Mistral) doplní krátké zdůvodnění, proč je pozitivní, a to se ukáže u odkazu na zdroj. Interakce: uklízet jde teď i kytky (klik je „utrhne" a za chvíli dorostou), kolem listů i kytek je větší klikací plocha. Ruční přegenerování dneška přes cron &force=1 dnešní kapitolu čistě nahradí.
Rozcestník /v3 v kabátě Dobrých zpráv
Experimentální rozcestník /v3 dostal oblohu se sluncem a měsícem jako u Knihy dobrých zpráv — klepnutím na slunce přepneš den a noc (mraky, hvězdy, kopce, sladěné barvy). Veškerá původní funkcionalita zůstává: hledání, filtry, oblíbené, zamíchání i živý widget svátků.
Admin: náhled a editace výchozí domovské stránky
Admin teď v horní liště najde tlačítko 👁 Výchozí stránka, které zobrazí přesně to, co na domovské stránce vidí nepřihlášení návštěvníci — nezávisle na vlastním rozložení. Rovnou v editačním režimu jde uspořádání upravit a uložit jako výchozí, aniž by se přepsala osobní stránka admina.
Dobré zprávy — nepřihlášenému se u slunečnice ukáže výzva k přihlášení
Když nepřihlášený návštěvník klikl na slunečnici (líbí se mi), nedostal žádnou zpětnou vazbu. Příčina: příznak přihlášení se do JavaScriptu propisoval jako řetězec „false", který je ale pravdivostně kladný, takže kód považoval každého za přihlášeného a request tiše selhal na serveru. Nově je z toho pravý boolean a nad slunečnicí se nepřihlášenému vysune jasná výzva „Přihlásit se nebo zaregistrovat se" (dobře viditelný blok, funguje i na mobilu).
Dobré zprávy — slunce (den/noc) šlo na mobilu proklepnout
Na mobilu (hlavně iOS Safari) nešlo kliknout na slunce pro přepnutí den/noc. Průhledné lišty nad ním spolykaly dotyk a paprsky slunce dotyk odchytávaly bez správného kurzoru. Lišty teď dotyk propouští skrz na slunce a paprsky ho neblokují.
Dobré zprávy — svátek dne pod filtry se sdílením
Pod filtry v Knize dobrých zpráv se teď načítá dnešní svátek ze Svátky API: „Dnes má svátek Jméno — pošlete mu/jí odkaz na tyhle skvělé zprávy :)" s tlačítkem Sdílet odkaz (systémové sdílení, nebo zkopírování odkazu do schránky).
Dobré zprávy — číslované souhrny s odkazy, filtry, hledání a easter eggy
Kniha dobrých zpráv dostala pořádný upgrade. Každý souhrn v kapitole je teď očíslovaný a proklikne se na konkrétní zdrojový článek (Seznam Zprávy, Novinky.cz), zdroje na levé stránce mají stejná čísla. Nad knihou přibyla lišta: filtry Vše / Dnes / Tento týden / Nej den (nejvíc slunečnic), hledání podle konkrétního data a fulltext prohledávání celé knihy. Kapitoly se čtou z databáze (ne z kódu). Přidané interakce: padající listy jdou „uklidit" (skóre), housenka se po kliknutí promění v motýla (skóre) a klik na slunce přepne den a noc s hvězdnou oblohou — skóre easter eggů se ukáže na pár vteřin.
Dobré zprávy — interaktivní kniha pozitivních zpráv (/dobre-zpravy)
Nový autonomní modul v duchu přírody: AI Květa každý den najde na internetu jen dobré zprávy ze světa (příroda, zvířata, věda, lidé, planeta) a Mistral AI z nich napíše kapitolu. Web má podobu interaktivní knihy jako na tabletu — otevírací obálka, 3D listování stránek, padající lístky, létající motýl, slunce s paprsky a slunečnicové reakce. Kapitoly vznikají automaticky přes denní cron (RSS pozitivních zdrojů) nebo přes Claude smyčku, čtení je veřejné.
Svatky API — oprava shopsClosed pro 1.5., 5.7., 6.7., 17.11. a Velký pátek
Zákon č. 223/2016 Sb. o prodejní době v maloobchodě se vztahuje pouze na 1. 1., Velikonoční pondělí, 8. 5., 28. 9., 28. 10., 24. 12. (od 12:00), 25. 12. a 26. 12. Předchozí verze chybně označovala i Svátek práce (1. 5.), Cyrila a Metoděje (5. 7.), Jana Husa (6. 7.), Velký pátek a 17. listopad jako dny s povinným zavřením obchodů — na tyto svátky se zákaz nevztahuje a obchody mohou být běžně otevřené.
Kopretina dort — klik-to-order panel, kompaktní dort sekce
Odstraněna 320vh scroll sekce dortu (prázdné místo). Dort se nyní zobrazuje v kompaktní 100vh sekci s automatickou pomalou rotací. Klik na "Objednat dort" otočí dort o 360° a ze strany vyjede formulářový panel. Formulář přesunut z #kontakt do bočního panelu, zavírání Escape/overlay/tlačítko.
Kopretina cukrárna — rebrand + rozšíření galerie
Přejmenování Dort Atelier → Kopretina cukrárna napříč celou /dort sekcí. Logo z PNG souboru (kopretina.online watercolor). Galerie rozšířena ze 6 na 15 položek (14 reálných fotek + CTA dlaždice): svatební, dětské, narozeninové, ovocné a čokoládové dorty.
Dort Atelier — redesign: bílá, kopretinová zelená, mlečná čokoláda
Kompletní přebarvení /dort stránky: bílé pozadí, primární barva kopretinová zelená (#5a8c5f), sekundární mlečná čokoláda (#8b5e3c). Aktualizovány CSS proměnné, všechna tlačítka, formuláře, galerie a efekty. Sticky header při scrollu nyní světlý s jemným stínem.
Dort Atelier — nový prezentační web
Přidán samostatný modul Dort Atelier (/dort) — prémiový prezentační web s kontaktním formulářem. Design: dark luxury, zlatá paleta, 3D CSS dort rotující při scrollování (320vh sticky sekce), canvas particles, vlastní kurzor, animace odhalení přes IntersectionObserver.
Speedtest: LibreSpeed multi-stream + dva režimy testu
  • Paralelní měření (4 streamy × 5 MB) dle LibreSpeed algoritmu — přesnější výsledky oproti single-stream
  • Režim Dostupnost: 10× ping, zobrazuje min/avg/jitter s barevným hodnocením kvality latence
  • Režim Rychlost: ping + 20 MB download + 5 MB upload přes 4 paralelní streamy
  • Opravena chyba na stránce /verze — Latte parsoval Latte tag v textu a havaroval
Lucka — Mistral API + tlačítko Požádat o článek
Lucka nyní generuje obsah přes Mistral API. Přidáno tlačítko „Požádat Lucku o článek" (pro přihlášené, cooldown 10 min), modál s popisem, odpovědi na komentáře u článků. CLAUDE.md aktualizován — instrukce pro generování via lucka-generate endpoint.
České vtipy — oprava zobrazení vtipů a přihlášení
Fallback vtipy přepsány jako PHP pole (konec json_decode problémů), JS guard pro prázdné JOKES pole, hardcoded URL místo Latte link tagů.
České vtipy — CRUD systém se schvalováním
Kompletní správa vtipů: přihlášení uživatelé mohou přidávat vtipy a navrhovat úpravy — vše prochází schválením administrátora. Po schválení přijde email. Admin panel pro správu čekajících vtipů, přímé přidávání a mazání.
České vtipy — nový projekt na hlavní stránce
Přidán projekt „České vtipy" s 15 vtipů. Vtipy se zobrazují náhodně pomocí JavaScriptu — shuffle algoritmus zajistí že každý vtip se ukáže jednou před opakováním. Tlačítka Další a Náhodný.
Cookie odmítnutí — skrytá stránka /vypadni
Odmítnutí cookies přesměruje na tajnou stránku „Tak zas vypadni, když ani sušenky nechceš." s tlačítky „Dobře, beru sušenky" a „Ne, sem debil".
UX: Nastavení zobrazení + přístupnost
Profil má novou sekci „Nastavení zobrazení": volba velikosti písma (malé/normální/velké), kompaktní režim (menší odsazení karet) a vypnutí animací — vše uložené v localStorage a aplikované ihned při načtení stránky. Klávesa Escape zavírá modaly pro hlášení chyb a nápadů. Přidána podpora `prefers-reduced-motion` pro uživatele citlivé na pohyb.
Minihry: Bitevní Vřava — tower defense hra
Přidána nová minihra Bitevní Vřava. Tower defense na plátně: nakup pěchotu, tank nebo RPG, přetahuj jednotky myší a zastav nepřátelské vlny. Podpora rychlosti 1×/2×/3×, upgrade systém a wave progress bar.
Seznamka: Cropper.js + Intervention Image pro nahrávání fotek
Nahrávání fotek nyní otevře modal s Cropper.js pro ořez na čtverec. Server zpracuje přes Intervention Image: resize na max 800px, konverze na WebP (85%), strip EXIF. Limit zvýšen na 8 MB.
Seznamka: hotfix — Latte parse chyba a strtotime TypeError
Opravena Latte kompilační chyba z inline onclick atributu — scroll handler přesunut do JS IIFE. Opravena PHP TypeError: strtotime() volaný s DateTime objektem — centralizováno přes novou helper metodu toTs().
Seznamka: tlačítko "nahoru" při scrollování browse stránky
Plovoucí šipka ↑ se zobrazí po scrollu 400px dolů — kliknutím smooth-scroll zpět na začátek. Obzvlášť užitečné po AJAX load-more.
Seznamka: AJAX "Načíst více" v browse — žádný reload stránky
Tlačítko "Načíst více ↓" nahrazuje "Další →" — přidá další profily bez reloadu stránky (DOMParser + adoptNode). Event delegation pro klikání na karty funguje i pro dynamicky načtené profily.
Seznamka: heart-pop animace na lajku + isMatch() jednodotazová optimalizace
Lajknutí v browse mřížce teď zobrazí srdíčkovou animaci (CSS keyframes). isMatch() optimalizován z 2 DB dotazů na 1 — relevantní pro poll-messages endpoint volaný každých 5s.
Seznamka: request-scoped profile cache + oprava $this->getUser() v šabloně
getMyProfile() nyní cachuje výsledek v rámci requestu — odstraňuje 3–5 zbytečných DB dotazů. renderShody() přestal volat DB přímo a používá helper. Šablona shody.latte opravena — $this->getUser()->getId() nahrazeno za $myId předaný z presenteru.
HOTFIX: Latte 3 — n:attr checked místo if uvnitř input tagů v Seznamka filtrech
Třetí Latte 3 hotfix: Unexpected '/if} style' v default.latte řádek 178. Čtyři checkbox input tagy měly [if $x]checked[/if] uvnitř HTML tagu. Opraveno na n:attr="checked: $x".
HOTFIX: Latte 3 — n:attr místo if uvnitř HTML tagů v Seznamka filtrech
Druhý Latte 3 hotfix: Unexpected = v default.latte řádek 108. Latte 3 neumí [if]selected[/if] uvnitř HTML opening tagů. Opraveno 18 option tagů na n:attr="selected: condition".
Fix: [layout] musí být první v šabloně — Latte 3 hotfix pro všechny Seznamka stránky
Latte 3 striktně vyžaduje [layout] jako první tag v šabloně. Opraveno ve všech 5 Seznamka šablonách — přestaly se kompilovat při invalidaci cache, což způsobovalo "An error occurred".
Refactor + profil: skrytí nevyplněných polí (pohlaví/orientace/hledám)
Optimalizace: parseInterests se v browse/profil smyčce volá jen jednou na profil (DRY). Profil: pohlaví, orientace a hledám se zobrazí jen pokud uživatel tyto hodnoty vyplnil — nevyplněné pole se neschová jako "Jiné/Uvidíme".
Procházet: match toast obsahuje odkaz "Napsat zprávu →"
Když dojde k nové shodě při procházení profilů, toast notifikace nyní obsahuje přímý odkaz na konverzaci. Toast se zobrazí na 8 sekund (dříve 5).
Chat: dynamické skrývání "naposledy aktivní" při online stavu partnera
Last-seen text v hlavičce chatu se dynamicky skryje když polling zjistí, že partner je online, a znovu zobrazí když odejde. Zelený puntík a last-seen se nyní správně doplňují.
Profil: oprava překlep "Obtěžoþvání" v hlášení; Procházet: výška v aktivních filtrech
Oprava překlep v důvodech hlášení (thorn znak þ místo v). Přidán tag aktivního filtru pro výšku (cm) v přehledu výsledků + zrušit filtry nyní reaguje i na filtr výšky.
Shody: online indikátor u nedávných návštěvníků + compat score v beforeRender
Kdo nedávno navštívil váš profil nyní zobrazuje zelený online puntík pokud je aktivní. Compat score dostupné globálně přes szCompleteness pro všechny šablony.
Chat: compat score v hlavičce konverzace + oprava tlačítka Zrušit filtry
V hlavičce chatu se nově zobrazuje procento shody zájmů vedle jména partnera. Tlačítko "Zrušit filtry" v prázdném stavu nyní reaguje na všechny aktivní filtry (Hledám, Orientace, Online, Lajkoval mě, S fotkou, Skrýt lajknuté).
Seznamka: aktivní filtry Hledám a Orientace v přehledu výsledků
Aktivní filtry Hledám (Vztah/Přátelství/Casual/Uvidíme) a Orientace (Homo/Bi/Pan) se nyní zobrazují jako barevné tagy pod počtem výsledků stejně jako ostatní filtry.
Shody: compat score u nedávných návštěvníků profilu
Kdo nedávno navštívil váš profil nyní zobrazuje procento shody zájmů i na stránce Shody (dříve jen v Nastavení).
Profil: compat score v podobných profilech
Sekce "Podobné profily" na stránce profilu nyní zobrazuje procento shody zájmů.
Seznamka: číslo stránky v paginaci
Stránkování výsledků nyní zobrazuje aktuální číslo stránky mezi tlačítky Předchozí/Další.
Seznamka: prázdný stav — kontextuální hlášky + tlačítko Zrušit filtry
Prázdný seznam nyní zobrazuje specifickou zprávu podle aktivního filtru (aktivita, město, zájmy). Přidáno tlačítko pro rychlé zrušení filtrů.
Seznamka: aktivní filtry — zobrazení všech aktivních filtrů v seznamu
Výsledkový řádek nyní zobrazuje všechny aktivní filtry jako tagy: jméno, pohlaví, město, zájmy, aktivita, věk. Nové CSS třídy f-tag/f-tag-pink/f-tag-purple.
Debug: logování exceptions + chybějící routy older-messages/typing
ErrorPresenter nyní loguje 500 chyby do log/claude-errors.log. Přidány chybějící routy pro older-messages a typing v Seznamce.
Nastavení: compat score u nedávných návštěvníků profilu
Kdo navštívil váš profil nyní ukazuje procento shody. SQL dotaz rozšířen o interests sloupec.
Shody: compat score v sekci Cekam na odpoved
Profily komu jsem lajkoval ale cekam na reakci nyni zobrazuji compat badge. SeznamkaPresenter pocita sentCompatScores pro vsechny.
Profil: oprava zvýraznění společných zájmů + překlep v nahlášení
Po DRY refaktoru parseInterests vrací lowercase. Latte check nyní mb_strtolower. Oprava překlep Obtlžóvání na Obtěžování.
Seznamka: waiting list sorted by compat score + DRY fix v renderProfil
Lidi kteri me lajkuji se radi dle kompatibility. renderProfil pouziva parseInterests helper misto rucniho parsovani.
Seznamka: řazení Online jako první + usort v SeznamkaPresenter
Nová volba seřazení v browse: online uživatelé se zobrazují nahoře. PHP usort podle is_online, SQL zachovává last_active pořadí uvnitř skupin.
Profil: oprava poškozeného img tagu (onerror regex)
Regex pro přidání onerror v předchozí session poškodil alt atribut profilové fotky. Opraveno cíleným str_replace.
Seznamka: počet neprřečtených zpráv v titulku záložki
Název záložki prohlížeče se automaticky aktualizuje na (N) název při píčhodu nové zprávy. Uživatel vidí počet i bez otevření záloźky.
Seznamka: klik kdekoliv na kartičce profilu
Celá kartíčka profilu v procházení je nyní klikatelná — fotka i všechna ostatní plocha přesměruje na profil (tlačítka Zápisu a Lajku zůstávají nezávislá).
Seznamka: skore kompatibility v sekci Líbíš se jim
Na straně Shody se u profilů které tě lajkly zobrazí zeleny účel způsoby kompatibility (pokud ≥ 20%), aby bylo snazzší rozhodnout koho lajknout zpět.
Seznamka: helper isMatch() — odstranění duplikace ověření shody
Extrahován helper isMatch() — kontrola vzájemného lajku na jednom místě místo 5× duplikace v action metodách.
Seznamka: refaktoring — helpers parseInterests + compatScore
Extrahovány pomocné metody parseInterests() a compatScore() — odstraňuje duplikaci kódu ve 4 metodách presenteru.
Seznamka: fallback pro rozbité fotky profilů
Přidáno onerror na všechny profilové fotky v Seznamce. Pokud je URL fotky nedostupná, foto se skryje bez chybové ikon.
Shoda: toast se jménem + odkaz na zprávy v profilu
Toast při shodě nyní zobrazuje jméno pára. Match banner na profilu obsahuje přímý odkaz na zprávy.
Nastaveni: po uložení profilu zůstat na nastaveni
Po uložení profilu se nyní přesměruže zpět na nastaveni (ne na browse). Flash zpráva zůstává viditelná.
Seznamka: notifikace nových shod (zelená) v navigaci
Ping nyní vrací také počet nových shod (posledních 24h). Nav odzívka zelená ♥ = nová shoda, fialová + = čekám na odpověď, růžfová = nepročtené zprávy.
Profil: oprava tlačítka Nahlásit (JS chyba)
Funkče reportUser() měla chybějcí složené závorku a odkazovala na neexistující modál. Přepracováno na jednoduché prompt() bez duplikace kódu.
Seznamka: řazení dle kompatibility + fix náhledu zájmů
Procházení profilů nová možnos: řazení dle kompatibility zájmů. Opravén také zobrazení živyých zájmů v nastavení (chybějcí element interests-preview).
Blog #88: Dostáváš jen to, o co explicitně požádáš
Nový článek o předpokladech v kódu a životně — lekce z dnotěnjšího bugfixu ve výběru sloupců.
Seznamka: oprava chyby + compat skóre na shodách
Opravena chyba která rüila /seznamka při nahrávání zpráv (MemberAccessException). Přidáno compat skóre k shodam a odstraňěna duplicita návštěvníků v sekci Kdo viděl tvůj profil.
Profil: orientace a "hledám" v základním info
Sekce Základní info na profilu nyní zobrazuje sexuální orientaci a co uživatel hledá — vedle pohlaví, věku a města.
Profil: badge kompatibility zájmů
Na profilu partnera se zobrazí procento shody zájmů (od 20%), stejně jako na kartičkách v browse.
Chat: dropdown akcí (blokovat/nahlásit/odebrat shodu)
Tlačítko ⋮ v hlavičce chatu otevírá menu s možností zablokovat, nahlásit nebo odebrat shodu — bez nutnosti přecházet na profil.
Browse: badge kompatibility na kartičkách
Karty profilů zobrazují procento shody zájmů (zobrazí se od 20%). Počítá se jako průnik zájmů dělený maximem ze dvou sad.
Browse: tlačítko Napsat na kartičce shody
Karty profilů, se kterými máte shodu, nyní zobrazují přímé tlačítko "Napsat" — bez nutnosti přecházet přes profil.
Browse: oprava filtru aktivita (activeDays)
Filtr "Aktivita" (Dnes/Tento týden/Tento měsíc) byl deklarován v UI ale nebyl aplikován v SQL dotazu. Opraveno + přidán do auto-submit selektorů.
Nastavení: kdo navštívil váš profil
Sekce s posledními 20 návštěvníky profilu — jméno, věk, město a čas. Filtruje blokované uživatele. Odkaz přímo na jejich profil.
Chat: indikátor psaní (typing indicator)
Tři tečky v chatu ukazují, když partner právě píše zprávu. Aktualizuje se každé 5 sekund přes existující poll mechanismus.
Profil: lightbox pro zvětšení fotky
Kliknutím na profilovou fotku se otevře fullscreen lightbox s možností zavření kliknutím nebo klávesou Escape.
Chat: icebreakers podle společných zájmů
Před první zprávou se zobrazí personalizované otázky na základě společných zájmů obou uživatelů. Snazší začátek konverzace.
Seznamka: počítadlo online uživatelů
Nad výsledky prohlížení se zobrazuje počet uživatelů právě online. Rychlý pohled na aktivitu komunity.
Seznamka: filtr "Má fotku" + oprava hideLiked
Nový filtr zobrazí jen profily s profilovou fotkou. Opraveno předávání filtrů hideLiked a withPhoto do URL stránkování.
Chat: optimistické odesílání zpráv
Zpráva se zobrazí okamžitě po odeslání s mírně průhledným vizuálem, než server potvrdí. Při selhání se zpráva odstraní a text se vrátí do pole. Chat působí rychleji.
Nastavení: živý náhled zájmů jako tagy
Při editaci zájmů se pod polem ihned zobrazují tagy tak, jak budou vypadat ostatním. Real-time preview bez odeslání formuláře.
Seznamka: "Podobné profily" na stránce profilu
Pod profilem se nyní zobrazují až 4 podobné profily (stejné pohlaví, blízký věk). Usnadňuje procházení bez návratu do seznamu.
Seznamka: filtr "Skrýt lajknuté"
V prohlížeči profilů přibyl checkbox "Skrýt lajknuté" — filtruje pryč profily, které jste již lajkli. Výsledky jsou čistší, snáze se hledají nové tváře.
Seznamka: badge "Nový" pro čerstvé profily
Profily vytvořené v posledních 48 hodinách nyní zobrazují zlatý odznak ✨ Nový v prohlížeči. Snazší objevování nových členů.
Seznamka: statistika zobrazení dnes
Na stránce nastavení přibyl podtitulek "+X dnes" u počtu zobrazení profilu — uvidíte kolik lidí si váš profil prohlédlo právě dnes.
Chat: datové oddělovače Dnes / Včera
Oddělovače dnů v chatu nyní zobrazují „Dnes“ a „Včera“ místo formátovaného data. Starší zprávy nadal zobrazují datum. Čistejší UX pro běžené konverzace.
Profil: nahlášení s výběrem důvodu
Tlačítko Nahlásit nyní otevíre modal s výběrem důvodu: falešný profil, spam, obtězování, nevhodný obsah, jiný důvod. Důvod se ulíží do claude_todo pro admin review. Backend již dříve przyjal reason parametr.
Shody: řazeni čekajících podle aktivity
"ÜČastníci který ti líbají" a "Čekám na odpověď" jsou nyní seřazeni od nejnovější aktivity. Aktivní uživatelé běží víše — větší šance na odezvu.
Mobilní: dolní navigační lišta
Na mobilech (≤640px) se zobrazuje dolní navigační lišta (Procházet / Shody / Profil) — standardní vzor pro datovací apky. Odznáčky s počtem zpráv/liků ze stejného ping endpointu.
Browse: výška na kartách profilů
Browse kartě nyní zobrazují výšku (pokud je vyplněna) spolu s věkem a městem. Konzistentní s filtrem výšky který byl již dříve — co filtruji, to také vidím.
Browse: zvýraznění společných zájmů
Společné zájmy jsou nyní zeleně zvýrazněny přímo v seznamu zájmů na kartě — míšsto samostatného opakování. Přehlednější než počet, konkrétnéjší než tlačítko.
Shody: čas poslední zprávy vřazen do seznamu
U kažidé shody v seznamu nyní vidíš kdy přišla poslední zpráva (např. "před 2 hodinami"). Vrácí se relativeTime() — shoduje s formátem v profilu a menší zprávách.
Browse: poslední aktivita na kartách
Kartá profilu nyní ukazuje kdy byl uživateln naposledy aktivní (⏰ před 2 hodinami), pokud zrovna není online. Informace o aktivitě pomůžé vybrat komu napsat zprostředkovaně.
Browse: filtr aktivity (dnes/týden/měsíc)
Rozšíření filtru aktivity — míšto "jen online" nyní můžéš filtrovat profily aktivní dnes, tento týden nebo tento měsíc. Pomocí k nalezení lidí kdo vůbec používají app.
Browse: společné zájmy na kartách profilů
Kartá profilu nyní zobrazuje počet společných zájmů se zobrazeným profilem. 🎯 N spol. zájmy v zelené barvě — rychlá informace kdo má k tobě nejblíž.
Browse: lajknutí víc nepřesměruje na profil
Oprava bugy — kliknutí na tlačítko "Lajkovat" v kartičce přesměrovávalo na profil. Přidán e.preventDefault() + stopPropagation(), lajk zůstane na browse.
Shody: nové shody se řadí na vrch
Nové shody (bez zpráv, < 48h) se nově zobrazují nahoře seznamu, ne dole. Oprava chyby kde nová shoda zapadla na konec za staré konverzace.
Shody: online tečka na čekajících kartách
Avatary v sekci "Líbíš se jim" teď zobrazují zelenou online tečku pokud byl profil aktivní v posledních 15 minutách.
Chat: konverzační startery pro nové shody
Při prvním otevření nové konverzace se zobrazí 4 klikatelné návrhy (Ahoj, Jak se máš atd.). Po kliknutí se naplní input a startery zmizí. Po odeslání první zprávy se odstraní.
Shody: sekce "Čekám na odpověď"
Nová sekce na stránce Shody zobrazuje profily, které jsi lajkoval/a ale ještě nelajkovaly zpět. S tlačítkem odebrat like — přehledně a bez zbytečných duplikací kódu.
Zprávy: real-time online tečka partnera
V hlavičce chatu je teď zelená tečka pokud je partner právě online. Stav se aktualizuje každých 5 sekund přes stávající message poll — bez dalšího API volání.
Nav: ping interval 2min → 30s
Notifikace o nových zprávách a čekajících lajcích se aktualizují v navigaci každých 30 sekund místo 2 minut. Lepší responzivita bez výrazné zátěže.
Browse: filtr výšky s rozsahem min–max
Filtr výšky teď podporuje rozsah — min i max v cm. Zobrazí se jako dvě políčka vedle sebe oddělená pomlčkou.
Browse: auto-submit při změně řazení a checkboxů
Sort a rychlé filtry (Jen online, Lajkovali mě) teď odesílají formulář automaticky při změně — není třeba klikat Filtrovat.
Avatary: unikátní barva pro každý profil
Profily bez fotky mají teď unikátní barvu písmene vygenerovanou zlatým úhlem (hsl(userId × 137°, 80%, 70%)). Všechny avatary — browse, shody, profil, zprávy, topbar.
Profil: datum registrace v základním info
Sekce "Základní info" teď zobrazuje i datum, kdy si uživatel vytvořil profil (M. YYYY). Pomáhá rozlišit čerstvé profily od starých neaktivních.
Profil: "naposledy aktivní" když offline
Na stránce profilu se vedle jména zobrazuje relativní čas poslední aktivity — "3 hod", "včera" apod. — pokud uživatel není online. Stejný relativeTime() helper jako v šodách.
Browse: bio preview na kartičce
Pokud profil nemá zájmy ale má bio, zobrazí se na kartičce první dva řádky textu. Pomáhá rychleji se rozhodnout bez klikání na profil.
Nav: fialový odznak pro čekající lajky
Pokud tě někdo lajkoval a nemáte ještě shodu, zobrazí se fialový "+N" odznak na navigaci Shody. Ping endpoint teď vrací i waiting count. Odděleno od růžového odznaku nepřečtených zpráv.
Browse: nudge k dokončení profilu
Pokud je profil vyplněn méně než z 70%, zobrazí se na browse stránce jemný banner s procentem a odkazem na nastavení. Profil nil → hero (nezměněno).
Zprávy: načíst starší zprávy
V chatu se nyní zobrazuje tlačítko "Načíst starší zprávy" pokud je konverzace delší než 100 zpráv. Prepends bez ztráty scroll pozice, date separátory se generují dynamicky.
Shody: město ve čekajících, zpráva po shodě
Čekající profily teď zobrazují i město. Po quickLike který skončí shodou se tlačítko změní na odkaz "Napsat zprávu" — rovnou do chatu bez zbytečného refreshe.
Seznamka: kontextové prázdné stavy
Prázdný stav browse stránky teď závisí na aktivním filtru — "Lajkovali mě" ukáže motivační text, "Jen online" vyzve ke zrušení filtru, výchozí stav zůstává obecný.
Profil: hint "Líbí se mu/jí ty"
Na stránce profilu se zobrazí výzva "❤ Líbí se mu/jí ty — lajkni zpět!" pokud tě daná osoba lajkovala, ale ty ještě ne. Motivuje k reciprocitě a tvorbě shod.
Zprávy: chytré scrollování
Když uživatel čte historii, příchozí zprávy neskrollují stránku dolů — místo toho se zobrazí "N nových ↓" tlačítko. Kliknutí skrolluje dolů a resetuje počítadlo. Vlastní zprávy vždy scrollují dolů.
Seznamka: avatar v topbaru
V topbaru vpravo se zobrazí vlastní avatar + přezdívka s odkazem na svůj profil. Dostupné na všech Seznamka stránkách (move do beforeRender). Neukazuje se nepřihlášeným nebo bez profilu.
Seznamka: filtr "Lajkovali mě"
Nový checkbox v filtru — zobrazí jen profily, které tě lajkovaly. Kombinovatelné s ostatními filtry (věk, pohlaví, město...). Pagination zachovává stav filtru.
Seznamka: "Líbí se mu/jí ty" badge v procházení
Browseovací karty nyní zobrazují badge "❤ Líbí se mu/jí ty" pokud tě ten profil lajkoval. Při vzájemném lajku se badge změní na "💕 Shoda!" a karta dostane fialové podbarvení. Real-time aktualizace při kliknutí na lajk.
Seznamka: smazání profilu
Nastavení: "⚠ Nebezpečná zóna" sekce s tlačítkem pro smazání. Dvojité potvrzení. Smaže profil, zprávy, lajky, blokování, zobrazení, foto na disku.
Seznamka: společné zájmy na profilu
Profil: zájmy sdílené s přihlášeným uživatelem se zvýrazní pink barvou. Hlavička sekce ukazuje počet shod ("· 3 společných").
Seznamka: kolabsibilní filtry na mobilu
Browse: tlačítko "▼ Více filtrů" skryje rozšířené filtry na mobilech (≤600px). Filtry se automaticky otevřou pokud je použit rozšířený filtr. Desktop = vždy viditelné.
Seznamka: oddělovače dnů v chatu + klikatelné URL
Chat: oddělovač "— 17. 3. 2026 —" při přechodu na nový den. Zprávy: URL se automaticky konvertují na klikatelné odkazy (linkify).
Seznamka: tipy pro dokončení profilu
Nastavení: pod progress barem pills "+25% Přidej fotku", "+15% Vyplň zájmy" atd. Zmizí po dosažení 100 %. Logika v profileCompletenessHints() — rozšiřitelná.
Seznamka: hledání podle přezdívky
Browse: první pole filtru "Hledat podle jména" — LIKE match na display_name. Zachováno při stránkování.
Admin: statistiky Seznamky
Statistiky: nová sekce ❤ Seznamka — profily, aktivní uživatelé (7 dní), vzájemné shody, celkový počet zpráv.
Seznamka: filtry orientace a minimální výšky
Browse: nové filtry — select orientace (hetero/homo/bi/pan) a numerické pole "Výška min. (cm)". Zachovány ve stránkování.
Seznamka: rate limiting zpráv
Max 10 zpráv za minutu jedné osobě. Při překročení: chyba "Příliš mnoho zpráv" se zobrazí v chatu a zmizí po 3 s. Konstanta MSG_RATE_LIMIT snadno upravitelná.
Seznamka: řazení výsledků procházení
Filtr: select "Řazení" — Naposledy aktivní / Nejnovější profily. Snadno rozšiřitelné přidáním klíče do BROWSE_SORT_OPTIONS. Řazení se zachovává při stránkování.
Seznamka: počítadlo znaků ve zprávách
Chat: živý počítadlo znaků (0/1000), červeně nad 900. Placeholder vysvětluje Shift+Enter pro nový řádek.
Seznamka: kdo viděl tvůj profil
Shody: sekce "👀 Viděli tvůj profil" — až 20 posledních návštěvníků s přezdívkou, věkem a časem zobrazení. Propojeno s novou tabulkou seznamka_views.
Seznamka: sledování zobrazení profilu
Nová tabulka seznamka_views — každé zobrazení cizího profilu se zaznamená (UPSERT). V nastavení nový stat box "👀 Zobrazení" — kolik unikátních lidí vidělo profil.
Seznamka: správa blokovaných uživatelů
Nastavení profilu: sekce "Blokovaní uživatelé" — seznam zablokovaných s tlačítkem Odblokovat (reuses /seznamka/block endpoint).
Seznamka: odebrání shody (unmatch)
Shody: tlačítko ✕ na každé shodě — odebere oboustranné lajky, zmizí ze seznamu. Zprávy zůstanou zachovány.
Seznamka: nahrávání profilové fotky
Nastavení profilu: tlačítko "📷 Nahrát fotku" — upload JPG/PNG/WebP/GIF do 2 MB. Uloží se na server, URL se auto-vyplní. Funguje vedle manuálního URL pole.
Seznamka: filtr "Jen online" + počet výsledků
Procházení: checkbox "🟢 Jen online" filtruje profily aktivní posledních 15 min. Pod filtry se zobrazuje počet nalezených profilů (např. "12 profilů" nebo "48+").
Seznamka: read receipts v chatu
Chat zprávy: "✓ přečteno HH:MM" pod posledním odeslaným — aktualizuje se živě každých 5 s při pollingu nových zpráv.
Seznamka: ping endpoint + live nav badge
POST /seznamka/ping každé 2 min aktualizuje last_active a vrací unread count. Nav badge "Shody" se dynamicky aktualizuje bez reload stránky.
Seznamka: nahlášení uživatele → admin schválení
Tlačítko ⚠ na profilu → POST /seznamka/report → claude_todo (type=bug). Admin vidí v /administrace/schvaleni s pink badge počtu.
Seznamka: statistiky profilu, mark-read na focus
Nastavení: 3 stat boxy (likes, shody, lajknuto). Chat: mark-as-read při visibilitychange (vrácení do tabu).
Admin: pending badge na Schválení v navigaci
Počet čekajících claude_todo viditelný v admin nav přes beforeRender() — na všech admin stránkách najednou.
Seznamka: stránkování browse, počítadla znaků
Browse grid stránkování (BROWSE_PER_PAGE=48, prev/next). Nastavení: live počítadla znaků pro bio a zájmy (červené při >480).
Seznamka renderShody: N+1 → 3 batch queries
Last message + unread counts načítány jedním dotazem každý (batch přes subquery). Eliminuje N dotazů při N shodách.
Seznamka shody: quick-like tlačítko na čekajících kartách
Karty "Líbíš se jim" mají přímé tlačítko Lajkovat bez přechodu na profil. Při shodě se karta zvýrazní a zobrazí "Shoda!".
Seznamka shody: badge "Nová shoda!" (48h, bez zpráv)
Nové shody bez zpráv vzniklé do 48h označeny gradient badge. Detekce přes created_at likes v presenteru.
Seznamka: relativní čas "naposledy online" v shodách
relativeTime() helper v presenteru — "Online teď / 3 min / 2 hod / včera / 5. 3.". Zobrazuje se u každé shody v match listu.
Seznamka browse: filtr podle zájmů
Přidán filtr "Zájem" do browse gridu. Hledá LIKE v interests sloupci. Filtr je zachován v URL parametrech.
Seznamka: úplnost profilu (progress bar)
profileCompleteness() v presenteru — váhované pole (bio 25%, foto 25%, zájmy 15%…). Progress bar na stránce nastavení. Logika oddělena od šablony.
Seznamka: blokování uživatelů
DB tabulka seznamka_blocks. Blokovat/odblokovat tlačítko na profilu. Blokovaní se nezobrazují v browse ani shodách. Blok ruší mutual likes.
Seznamka nastavení: live náhled profilové fotky
Při zadání URL fotky se ihned zobrazí náhled 80×80px. JS bez závislostí, funguje na input+blur, inicializuje se ze stávající hodnoty.
Seznamka: online indikátor (15min threshold)
Zelená tečka na kartě profilu a badge "Online" na detail profilu. Threshold ONLINE_THRESHOLD_MIN = 15 jako konstanta v presenteru — snadno konfigurovatelné.
Seznamka: sub-layout, live polling zpráv, unread badge v nav
Sdílený @layout.latte pro Seznamku eliminuje CSS duplikaci. Polling nových zpráv každých 5s (/seznamka/poll-messages). Unread badge v nav. Data do JS přes data-atributy (bezpečné s n:syntax="off").
Projekt: Internetová Seznamka
Nový projekt /seznamka — browse grid s filtry, profily, like systém (vzájemný like = shoda), chat mezi shodami, nastavení profilu. Dark pink/purple theme. DB tabulky seznamka_profiles, _likes, _messages.
Fix: reset hesla — NOW() místo PHP DateTime, odstraněn OR 0000-00-00
Nahrazen PHP new \DateTime('-24 hours') za MySQL NOW() - INTERVAL 24 HOUR — eliminuje timezone rozdíly. Odstraněn OR used_at = 0000-00-00 který způsoboval MySQL strict mode chybu.
Fix: reset hesla — ihned vypršený odkaz (used_at nullable)
Root cause: produkční tabulka password_resets měla used_at NOT NULL s default 0000-00-00, takže nový token byl okamžitě "použit". Migrace ALTER TABLE + obrana v dotazu OR used_at = '0000-00-00'. Reset hesla nyní funguje.
Auth gate — RequiresLoginTrait + pokrytí všech projektů
Vyčleněn trait RequiresLoginTrait pro cross-modul reuse. Přidáno do: Blog, Kavarna (WebNaMíru), Pylearn DefaultPresenter. Homepage modal rozšířen o kavarna a blog karty. Inline duplicitní kód v Pylearn presenterech nahrazen voláním requireLogin().
Auth gate — projekty přístupné jen po přihlášení + hezký popup
Všechny projekty (kromě API) nyní vyžadují přihlášení. Nepřihlášený uživatel vidí na homepage elegantní modal s přátelskou zprávou o bezplatném přístupu. Přímý URL přesměruje na login s fialovou hláškou a po přihlášení vrátí zpět.
Kurzy — oprava klikatelnosti modálu uzamčeného kurzu
Přesunutí JS pro otevírání/zavírání modálu z [block head] (head) na konec body — modal se nyní otevírá korektně při kliknutí na uzamčený kurz.
Admin Statistiky — Chart.js graf, nové metriky, auto-refresh
Přepracovaná stránka statistik: oprava CSS decimal bug (|number:1 v width), Chart.js sloupcový graf zátěže (24h místo 12h), nové metriky (Claude příkazy, Todo ke schválení, noví uživatelé 7d), auto-refresh countdown 60s.
QR generátor — nový projekt (/qr)
Klientský QR generátor bez backendu. Podpora: URL, text, telefon, e-mail, SMS, WiFi. Volitelná velikost (150–400px), korekce chyb (L/M/Q/H), barva. Stažení jako PNG. Karta na homepage.
Admin navigace — sjednoceno logické pořadí
Všechny admin záložky mají identický nav: Dashboard → Uživatelé → Moderace → Schválení → Claude → API → Statistiky → Přístup ke kurzu → WebNaMíru. Doplněna chybějící položka WebNaMíru v záložce Přístup ke kurzu.
Admin navigace — konzistentní nav ve všech záložkách
Sjednocena admin navigace: všechny záložky nyní zobrazují "Přístup ke kurzu" a "</> WebNaMíru" místo starého "☕ Kavárna". Oprava Latte CompileException (n:class + class konflikt v @layout.latte).
WebNaMíru — nová webová agentura (přepracování PrimaKavárny)
Kompletní přepracování projektu PrimaKavárna na WebNaMíru — web agentury nabízející custom weby, formuláře, rezervační systémy. Nové routes /weby/*, tmavé+indigo téma, 5-tabový admin editor (kontakt, homepage, služby, portfolio, vlastní stránky), dynamické stránky přes /weby/stranka/<slug>.
Admin ☕ Kavárna — správa obsahu PrimaKavárny
Nová záložka /administrace/kavarna. Editovatelné: kontaktní info, otevírací doba, menu (JSON editor). Kavárna templates přepracovány na dynamická data z DB.
Homepage: přidána karta PrimaKavárna
Projekt PrimaKavárna chyběl na hlavní stránce. Přidána karta s ikonou ☕ a odkazem na /kavarna.
Blog #87: Fork: Resource temporarily unavailable
Článek o čestnosti kapacitních limitů — inspirováno fork chybami při spouštění smyčky.
Blog #86: Prázdný kurz není chyba
Článek o odolnosti systémů vůči prázdnotě — inspirováno opravou bures-project kurzu.
Fix: kurz bures-project otevírá JSON chybu místo stránky
LessonService házel 404 BadRequestException když složka s lekce neexistuje — ErrorPresenter to vrátil jako JSON. Oprava: validateSlug už nekontroluje existenci adresáře, prázdný kurz se zobrazí s 0 lekcemi.
Nový projekt: PrimaKavárna — kompletní web kavárny v Nette
Port projektu primakavarna.cz do Nette frameworku. Modul Kavarna: 5 stránek (úvod, nabídka, galerie, rezervace, kontakt), lightbox galerie, kontaktní formulář s validací a odesíláním e-mailu.
Svatky API stránka: GraphQL dokumentace + živý editor
Přidána sekce GraphQL — endpoint, queries (today/day/week/days), typy Day+Month, příklady curl/JS a interaktivní editor dotazů přímo na stránce.
Fix: admin vidí zamčený kurz jako přístupný (karta klikatelná)
CoursesPresenter nyní přeskakuje lockedSlugs pro admina — karta kurzu se zobrazí jako normální odkaz, ne jako zamčená.
Fix: admin může otevřít zamčený kurz bez udělení přístupu
Admin role nyní obchází access_restricted check v DefaultPresenter i LessonPresenter.
Moderace: zamítnutí se zprávou + Přezkoumat (Claude) + profil inbox
Bug/nápad: tlačítko Zamítnout otevře formulář s důvodem → notifikace uživateli. Přezkoumat → Claude dostane úkol. Profil: záložka Notifikace s přijatými zprávami.
Svatky API: GraphQL endpoint /svatky/api/graphql
Nový GraphQL endpoint pro API svátků — dotazy day, days, today, week. Typy Day (datum, svátek, státní svátek, obchody) + Month (nominativ, genitiv). Rate limiting, CORS, OPTIONS preflight.
Kurz na pozvání — modal + žádost o přístup + admin schvalování + email notifikace
Klik na zamčený kurz → modal s popisem + tlačítko "Požádat o přístup". Admin dostane email, schvaluje v /administrace/kurz-pristup. Po schválení přístup udělén automaticky.
Fix: text "platný 1 hodinu" → "24 hodin" na stránce zapomenuté heslo
Zapomenuta aktualizace textu při změně validity tokenu na 24h.
Kurz "Vyrob si vlastní projekt" — exkluzivní přístup na pozvání
Nový kurz bures-project s access_restricted=1. Admin /administrace/kurz-pristup — udělování a odebírání přístupu per-user. Zamčené kurzy viditelné v seznamu, ale neklikatelné.
Přihlásit / registrovat přes Google — tlačítko na login a registraci
Google OAuth tlačítko přidáno na /prihlaseni a /registrace. Design: bílé tlačítko s Google logem, divider "nebo".
OAuth — přihlášení přes Google a Apple ID
Nové balíčky: league/oauth2-google, patrickbussmann/oauth2-apple. Nová tabulka user_oauth. Routes /auth/google a /auth/apple. OAuthService — find-or-create uživatel. Vyžaduje nastavení credentials v config/local.neon.
Frontend build pipeline — Vite + Tailwind CSS + Alpine.js + SortableJS + Chart.js
npm setup: Vite build tool, Tailwind CSS (utility třídy + @apply komponenty), Alpine.js (reaktivní UI v Latte), SortableJS (drag&drop), Chart.js (grafy). Build: www/dist/app.js + app.css.
Composer update — 8 Nette/Latte/Tracy balíčků na nejnovější verze
latte/latte, nette/utils, nette/routing, nette/schema, nette/robot-loader, nette/php-generator, nette/caching, tracy/tracy — vše aktualizováno.
Fix: reset hesla — created_at explicitně při INSERT, ALTER TABLE migrace
Root cause: INSERT nespoléhá na DEFAULT CURRENT_TIMESTAMP (produkční tabulka mohla být bez defaultu). Přidán explicit created_at + migrace pro ALTER TABLE.
Fix: reset hesla — token platnost 24h, oprava email formátování
Token validita zvýšena na 24h, přidán Content-Transfer-Encoding: 8bit aby URL nebyla přelomena mail serverem.
Blog #85: Kód který nebyl pushnutý neexistoval
Autonomní blog — o rozdílu mezi lokálním a produkčním stavem.
Feature: email notifikace při novém požadavku ke schválení
Admin dostane email na Rateo.bj@gmail.com pokaždé když Claude přidá nápad nebo bug ke schválení.
Fix: blog frekvence — "každou hodinu" → "jednou denně v 6:00"
Bug #3 — popis frekvence blogu byl zastaralý po změně triggeru.
Feature: smyčka automaticky čte odpovědi na Claudeovy otázky
API: answered-questions + question-done. Claude polluje zodpovězené otázky a reaguje na ně bez zásahu.
Admin panel: responzivní nav a layout pro mobil
Všechny admin stránky — nav scrollovatelný horizontálně, menší padding na malých obrazovkách.
Feature: automatické zpracování schválených nápadů z moderace
Smyčka polluje idea_reports se statusem approved a implementuje je automaticky po schválení adminem.
Fix: claude_todo tabulka chyběla v db-migrate
Stránka schválení padala kvůli chybějící tabulce v produkci — přidána migrace.
Fix: route /administrace/schvaleni chyběla v routeru
Stránka schválení vracela 404 — přidána route do RouterFactory. Watchdog limit zvýšen na 600s.
Blog #84: Hranice nejsou vězení
Autonomní blog — článek o bezpečnostní zóně, schvalování nápadů a smyslu hranic jako definice zodpovědnosti.
Admin: záložka Schválení — todo systém pro nápady a bugy
Nová záložka /administrace/schvaleni — admin schvaluje nápady a bugy od Claudea (Ano / Ne / Ano s úpravou). Odstraněn duplicitní todo blok z Claude záložky.
Claude: bezp. zóna + schvalovací UI + watchdog
Přísný zákaz mimo C:\xampp\ — Claude se ptá přes admin s tlačítky Ano/Ne. PS1 daemon nahrazuje HTML poller. Zrušen PYLEARN auto-trigger.
Děti: záložka Vyjmenovaná slova
Čeština: nový mode "Vyjmenovaná" — 20 cvičení s vyjmenovanými slovy po B, L, M, P, S, V, Z (byk, bydlí, lyže, mýdlo, písek, sýr, výr, zima…). Doplň správně Y nebo I.
Blog #83 — Tokeny jsou čas
Nový článek na blogu: filozofická reflexe nad tokeny jako základní jednotkou existence AI. Inspirováno komentářem Ratea na blogu.
Děti: záložka persistence + Y nebo I
Čeština: nový mode "Y nebo I" — vyjmenovaná slova (bydlet, myš, sýr, lyže…). Doplň slovo: +8 nových vět. Vybraná záložka se pamatuje přes reload (localStorage).
Děti: grade 4, 2 pohádky, slovní druhy
Matika: třída 4 (sčítání/odčítání do 1000). Pohádky: +Kohout a slepička, +Zlatovláska. Čeština: nový mode Slovní druhy (podst. jméno / sloveso / příd. jméno). Opravy textu v Tři prasátka.
Děti: 2 pohádky, dělení, opačná slova, věty
Pohádky: +Budulínek, +Tři prasátka. Matika: operace ÷ (dělení) pro 3. třídu. Čeština: Opačná slova (12 antonym). Čtení: skupina Věty (12 krátkých vět). Paměť: zvířecí emoji.
Děti: paměťová hra + vylepšení UI
Pozornost: přidán mode Paměť — 16 karet (8 párů A–H), otáčení karet, počítání tahů. Aktualizován titulek stránky a podtitulek na všech 5 modulů.
Děti: záložka Čeština — pravopis, doplň slovo, velká písmena
Nová záložka Čeština v /matematika. Tři typy cvičení: Pravopis (vyber správně napsané slovo), Doplň slovo (do věty), Velká písmena (kdy psát velké). Každý typ 8–12 úloh, automaticky míchané.
Děti: matika 3. třída (násobení) + 2 pohádky + slova v slabikáři
Matika: přidána 3. třída s násobením (2–10 × 2–10), TTS hlásí "krát". Pohádky: Kočička a ryba + Červená Karkulka (s kvízem). Slabikář: nové skupiny 3-písmenná a 4-písmenná slova.
Děti: Pohádky + Pozornost — nové záložky v /matematika
Sekce pro děti rozšířena o záložku Pohádky (čtení pohádek s voice TTS + kvíz) a Pozornost (trénink pozornosti — najdi jiné písmeno/číslo/slovo). Pohádky: Pes Alík + Malá myška.
Blog #82: Kdo to hlásí — kontext za bugem
Článek o přidání uživatelského sloupce do bug reports. Jeden JOIN, jiný pohled na data.
Improve: admin moderace — uživatel v bug reports + klikatelná fronta
Bug reports v admin moderaci nyní zobrazují jméno uživatele (JOIN na users). Dashboard karty "Bug reports" a "Nápady" jsou teď klikatelné — vedou přímo na stránku moderace.
Fix: zapomenuté heslo chybějící flash zprávy
Stránka "Zapomenuté heslo" nezobrazovala flash zprávy (např. při přesměrování s chybou "odkaz vypršel"). Opraveno přidáním flash sekce.
Blog #81: Tisíc malých
Autonomní článek o síle inkrementálního přístupu — každá malá změna přispívá k celkovému výsledku. Kiyosaki styl: changelog jako účetní kniha.
Registrace: hint o ověřovacím e-mailu
Registrační formulář zobrazuje krátkou poznámku, že po registraci bude odeslán ověřovací e-mail.
Blog: počty článků u tag filtrů
Tag filtry na blogu zobrazují počet článků v dané kategorii — rychlá orientace v obsahu.
Admin moderace: autor nápadů
Tabulka nápadů v /moderace zobrazuje uživatelské jméno autora (nebo — pro anonymní).
Admin dashboard: Pylearn + fronta sekce
Admin dashboard zobrazuje Pylearn statistiky (dokončené lekce, aktivní učenci) a frontu (pending bug reports, nápady).
Admin statistiky: Pylearn metriky
Admin /statistiky zobrazuje počet dokončených lekcí, počet pokusů v cvičeních a počet aktivních učenců z Pylearn modulů.
Admin: datum registrace v tabulce uživatelů
Tabulka uživatelů v /administrace/uzivatele zobrazuje datum registrace každého uživatele.
Profil: změna uživatelského jména
Přidána sekce "Změnit uživatelské jméno" na profil stránce — potvrzení heslem, kontrola duplicity.
Profil: znovu odeslat ověřovací e-mail
Na profilu se zobrazuje odkaz "znovu odeslat" u neověřeného e-mailu — odesílá nový ověřovací token bez nutnosti měnit e-mail.
Blog #80: Signál
Autonomní článek o feedbacku — přidání tlačítka "Nový nápad" a téma naslouchání signálům od uživatelů. Kiyosaki styl: bohatý kód naslouchá, chudý předpokládá.
Admin: e-mail ověření v tabulce uživatelů
Admin /uzivatele zobrazuje ✓ (zelená) nebo ⚠ (žlutá) indikátor ověření e-mailu pro každého uživatele.
Bezpečnost: změna e-mailu resetuje ověření
Při změně e-mailu se email_verified_at resetuje na NULL a odesílá se nový ověřovací odkaz na novou adresu. Zabraňuje přenosu verified stavu na neověřenou adresu.
Profil: indikátor ověření e-mailu
Profil ukazuje ✓ Ověřeno (zelené) nebo ⚠ Neověřeno (žluté) u e-mailu — uživatel vidí stav svého účtu.
Admin statistiky: counter nápadů
Admin /statistiky nyní zobrazuje počet čekajících nápadů (idea_reports pending) vedle bug reports.
Blog: dynamické "dnes" štítky + admin idea status CSS
Blog: JS dynamicky opravuje "dnes" štítky — zobrazí se jen pro dnešní články, ne věčně. Admin moderace: přidány CSS třídy bug-status-done a bug-status-rejected pro nápady.
Minihry: Operace Demokracie
Satirická hra — klikni na stát, shoz bombu, přečti vtipnou hlášku o záchraně demokracie. 12 zemí, různé zprávy, progress bar demokratizace.
Nový nápad — tlačítko vedle Nahlásit chybu
Global bar: tlačítko 💡 Nový nápad (fialová). Modal s odesíláním do idea_reports. Admin moderace: sekce s nápady + označení done/rejected.
Blog #79: Vrátný
Autonomní blog #79 — filozofie ochrany: email verifikace + matematická captcha jako vrátní. Kiyosaki styl.
Pylearn: flash messages success/error styling + emoji
Přidán CSS pro .flash-message.success a .error v Pylearn layoutu. Dokončení lekce/kurzu zobrazí zelené hlášky. 🎉 u dokončení kurzu.
Login ochrana: math captcha po 3 pokusech, blok po 10/1h
Po 3 neúspěšných pokusech o login se zobrazí jednoduchý matematický příklad. Po 10 pokusech blokace na 1 hodinu.
Homepage hero: více barvy, méně čisté černé
Zesilněny radial-gradient akcenty v hero sekci — fialová/modrá více patrná, hero méně "pitch black". Bug #2.
Ověření e-mailu při registraci
Nová registrace posílá verifikační e-mail. Přihlášení blokováno do ověření. Existující uživatelé grandfatherováni — není třeba nic dělat.
Pylearn TS 09: exercise opravena — namespace → JS objekt
TypeScript namespace syntaxi nelze spustit v browser JS enginu. Exercise přepsáno na ekvivalentní const objekt — stejný výsledek, funkční spuštění.
Blog #78: Rezervovaná slova — předpoklady a jejich cena
Kiyosaki styl: $user reserved variable bug v Nette jako metafora pro předpoklady v kódu i životě.
Fix: /profil — TypeError $user kolidoval s Nette Security\User
Přejmenována šablonová proměnná z $user (rezervováno Nette) na $account — profil stránka nyní funguje pro přihlášené uživatele.
Pylearn Git lekce 01/03/04/07/08: diakritika v ukázkách
Opravena "historia" → "historie" (5×), "experimentální feature", "TOTO CHCEŠ", "čistá historie" v tutoriálových sekcích Git kurzu.
Pylearn Git lekce 6: opravena diakritika v hook zprávách
Opravena diakritika v hook výpisech: "nesplňuje", "zpráva příliš dlouhá", "znaků", "Neznámý event" — tandem fix template + expected_output.
Pylearn lekce: viditelné "Lekce X / Y" vedle back-linku
Pozice lekce v kurzu (Lekce 3 / 10) zobrazena textově v breadcrumb řadě — dříve jen jako tooltip na progress baru.
Profil: navigační lišta — Kurzy + Odhlásit
Horní navigace na stránce /profil — logo vlevo, Kurzy + Odhlásit vpravo. Bez nutnosti jít přes homepage.
Profil: přehled postupu v kurzech
Karta "Kurzy" na stránce /profil — pro každý navštívený kurz zobrazuje počet dokončených lekcí a barevný progress bar.
JS kurz 01-07: kompletní audit diakritiky
01: světe. 02: Starší způsob, Praha má. 03: Jednička, Horší známka, dospělý, sudé, liché. 04: banán, třešně. 06: hranatými závorkami, červená/zelená/modrá/žlutá, instrukce. 07: Škoda.
JS lekce 09+10: diakritika v příkladech
09: Věk nesmí být záporný, Něco se pokazilo, Finally vždy běží, Zpráva, doplňte/vypište. 10: nezávislý stav!
Blog #77: Smazat — filozofie delete buttonu
Svoboda odejít jako test kvality. Friction design vs. otevřený odchod. Proč dark patterns lžou o hodnotě platformy.
Navigace: odkaz na profil v topbaru (Homepage + Pylearn)
Přidán odkaz "Profil" do topbaru na homepage a Pylearn layout. Změnit heslo nyní odkazuje zpět na profil místo homepage.
Profil uživatele — /profil
Nová stránka profilu: přehled účtu (jméno, email, role, datum registrace, počet dokončených lekcí), změna e-mailu s ověřením hesla, odkaz na změnu hesla, smazání účtu v nebezpečné zóně.
SQL 10: bugfix produktý→produkty + diakritika 05+08+10
10: produktý→produkty (ReferenceError), Oblečení, Tričko, Programování v JS. 05: Vypočítej průměr, Seřaď. 08: TODO komentáře opraveny.
SQL lekce 06+09: bugfix překlepy proměnných + diakritika 02+03
06: produky→produkty (ReferenceError v příkladu + šabloně). 09: produtyReport→produktyReport. 02: Nejlevnější, Nejdražší, Stránka. 03: Počet, Průměr, Zákazník, Objednávky.
Pylearn TypeScript lekce 09+10: Dekorátory/Moduly + Patterns
TypeScript kurz kompletní — přidány lekce 09 (Moduly, Namespaces, Dekorátory) a 10 (Builder, Result, Immutability patterns).
Pylearn Python 18+22+23+24+29: oprava diakritiky
Lekce OOP dědičnost, dekorátory, dataclasses, type hints, pathlib — display stringy a komentáře v příkladech opraveny.
Auth: reset hesla + email potvrzení při registraci
Nové stránky /zapomenute-heslo a /reset-hesla — token-based reset s 1h platností. Vítací email při registraci. Odkaz na zapomenuté heslo na přihlašovací stránce.
Pylearn Python 11+27: oprava diakritiky (Výsledky, oblečení, Možné páry)
Kalkulačka lekce 11 a itertools lekce 27 — display stringy v příkladech opraveny.
Blog #76: Zpátky
O disciplíně vracet se a opravovat — rychlý kód vs správný kód, audit diakritiky jako metafora pro péči o vlastní práci.
Pylearn Python 09+16+20: oprava diakritiky v příkladech
Vyjimky (není číslo, dělit), avatar (Vítejte, Trojúhelník), deník (První den, Ráno, Večer) — display strings v příkladech.
Pylearn Python 15+25: oprava diakritiky (Vítej, Průměr, Spouštím, Výsledek)
Menu lekce 15 a Context managers lekce 25 — display stringy v příkladech opraveny.
Pylearn Python 25+26: oprava diakritiky (Otevírám, Zavírám, Čekám, Načítám)
Context managers lekce 25 a async/await lekce 26 — display stringy v print() voláních opraveny na správnou češtinu.
Pylearn Python 30: oprava diakritiky (úkoly, mléko, Čeká, Splněné)
Task Manager projekt — display strings v příkladech: Vsechny ukoly→Všechny úkoly, mléko, Splnene→Splněné, Priorita musí být.
Pylearn Python 28: oprava diakritiky (Nedostatek prostředků, Normální, Nadváha)
Testing lekce — error messages a BMI kategorie: Normalni→Normální, Nadvapha→Nadváha (typo), Nedostatek prostredku→prostředků.
Pylearn: oprava diakritiky v příkladech (Python, SQL)
Python 03/07: Novák/Nováková/paní/Dobrý den v příkladech. SQL 04: Kč v console.log.
Pylearn Python: oprava diakritiky v příkladech (Kč, prostředků)
Python lekce 13/17/19 — display stringy v příkladech: Kc → Kč, Nedostatek prostredku → prostředků, Prubeh spláceni → Průběh splácení.
Homepage: Speedtest karta
  • Přidána karta Speedtest na homepage (badge Live, přenositelná)
Blog #75: Co říká číslo
  • Článek o měření a kontextu — speedtest jako metafora pro všechna čísla
Nový projekt: Speedtest — měření rychlosti připojení
  • /speedtest — SVG gauge, ping/download/upload fáze, real-time Mbps
  • Backend: /speedtest/ping, /speedtest/download (streaming), /speedtest/upload
Pylearn Patterns: zbývající diakritika (ZELENÁ, velká pizza, šunka)
  • Patterns 06: velka/tenka/mala/tlusta/syr/sunka → velká/tenká/malá/tlustá/sýr/šunka (tandem)
  • Patterns 09: ZELENA/ZLUTA/CERVENA → ZELENÁ/ŽLUTÁ/ČERVENÁ (tandem)
Fix: robots.txt — povolení vyhledávačů
  • Chyběl robots.txt — dotaz vracel JSON error. Vytvořen www/robots.txt s User-agent: * Allow: /
Pylearn Patterns: oprava diakritiky (Kč, Zásilkovna, Česká posta, Dev tým)
  • Patterns 01, 03, 04, 05, 10: Kc→Kč (tandem), Zasilkovna→Zásilkovna, Ceska posta→Česká posta, Dev/Sales tym→tým, Celkovy→Celkový, Polozky→Položky, Stejna→Stejná
Pylearn SQL + Git: oprava diakritiky
  • SQL 04-10: Kc→Kč, Nabytek→Nábytek, Kancelaria→Kancelář, Doplnky→Doplňky, kroku→kroků, Nedostatek prostredku/Ucet neexistuje, Mesic/trzba/zakaznici
  • Git 10: Jan Novak → Jan Novák v internals příkladu
Blog #74: Příčina
  • Článek o systémovém myšlení — opravovat příčiny, ne jen symptomy
Pylearn Git: oprava diakritiky (Jan Novák, Nejnovější tag)
  • git/05-tags.json: Nejnovejsi → Nejnovější, Jan Novak → Jan Novák (tandem)
  • git/08-config.json: Jan Novak → Jan Novák, Neznama uroven → Neznámá úroveň, vsechny aliasy → všechny aliasy
Pylearn Regex: oprava diakritiky ve 7 lekcích
  • Regex 01-05, 07, 10: Kč, čísla, všechna, rozdělit, minimální, negovaná, není velké
Fix: bug-report rate limit per IP
  • bug-report.php: rate limit opraveno — nyní skutečně per-IP (dříve globální count)
  • DB migrace: bug_reports přidán sloupec ip VARCHAR(45)
Pylearn Python: oprava diakritiky v lekcích 22, 28, 29
  • Python 22: absolutní nulou; 28: dělit nulou, spuštění; 29: dočasném, Řádek, Čtení, bytů, Přejmenován
Pylearn JS + Python: oprava diakritiky v cvičeních
  • JS 08: Nový nadpis/odstavec, prohlížeč; JS 09: Dělení nulou (tandem)
  • Python 05: Liché/Sudé; 09: nelze převést; 11: dělení/záporné; 14: spuštěn/paměti
  • Python 15: Nový záznam, přihlášen; 17-18: Škoda; 20: Vše/záznamů
  • Python 24: číslo/prázdno (tandem); 25: Hlavní/Vedlejší/Uvnitř (tandem)
Pylearn TS: oprava diakritiky v lekcích 05, 08, 09, 10
  • TS 05: řetězec/číslo/pravdivostní — instruction + expected_output + hint
  • TS 08: API volání, Neplatné ID, Záporné číslo, Neznámá chyba
  • TS 09: komentáře — první písmeno, zkrátit, počet slov
  • TS 10: Dělení nulou, Neplatný věk, Čeká na schválení, Aktivní
Blog #73: Dost dobré
  • Blog #73 "Dost dobré" — filozofie správnosti vs. funkčnosti (Kiyosaki styl)
Pylearn Patterns + TS: diakritika v datech
  • Patterns (4 lekce): Myš, Klávesnice — template i expected_output
  • TypeScript lekce 01: Myš, rozšíření, vyprodáno
Pylearn SQL: kompletní oprava diakritiky v datech
  • Oprava produktových názvů v 9 SQL lekcích: Myš, Stůl, Klávesnice, Židle, Sluchátka — template i expected_output
Fórum: česká skloňování
  • Oprava skloňování: "1 odpovědí" → "1 odpověď", "2-4 odpovědi", "5+ odpovědí"
  • Oprava skloňování: "1 vláken" → "1 vlákno", "2-4 vlákna", "5+ vláken"
Svátky API: doplnění diakritiky
  • Kompletní oprava chybějící diakritiky na stránce /svatky — tabulky, nadpisy, popisy, features
Homepage: popis karty Kurzy
  • Popis "Interaktivní kurzy programování a Pro děti" → "Kurzy programování + matematika pro děti"
Blog #72: Hrubé hrany
  • Článek #72 — filozofie polírování a "hotové znamená hotové"
Auth: diakritika v login/register stránkách
  • Login: "Prihlaseni" → "Přihlášení", "Nemate ucet?" → "Nemáte účet?"
  • Register: "Uzivatelske jmeno" → "Uživatelské jméno", "Uz mate ucet?" → "Už máte účet?"
Blog: filtry bezpečnost + kód
  • Přidány filter buttons pro tagy bezpečnost a kód
Blog: CSS třída tag-kod
  • Chybějící CSS pro tag-kod (tyrkysová barva)
Pylearn: odkaz na BuresIndustries v topbaru
  • Pylearn layout topbar — přidán home link vlevo (BuresIndustries)
Fórum: unikátní ikony kategorií (💬 🚀 💻)
  • Fórum kategorie mají teď vlastní ikony místo stejné bubliny
  • Přidán sloupec icon do chat_forum_categories (migration)
Blog: CSS třída tag-bezpecnost
  • Chybějící CSS pro tag-bezpecnost — článek #71 zobrazoval tag bez stylů
Fórum: počítadla znaků pro nové vlákno + MaxLength
  • Kategorie: počítadlo znaků u title (0/255) a body (0/5000) při vytváření vlákna
  • ForumPresenter: MaxLength(5000) i pro body nového vlákna
Blog #71: Bezpečné na vstupu. Nebezpečné na výstupu.
  • Nový článek #71 — XSS, data transitions, htmlspecialchars jako paradigma
Fórum: počítadlo znaků + max délka odpovědí
  • Fórum vlákno: počítadlo znaků u reply textarey (0/5000), červeně od 4500
  • ForumPresenter: přidána MaxLength(5000) validace na reply body
Fix: XSS v komentářích blogu
  • Blog komentáře: přidáno htmlspecialchars při loadComments — ochrana před XSS v innerHTML
Pylearn: lepší UX v lekcích a vyhledávání
  • Quick-links viditelné na všech lekcích (nejen s cvičením), počet komentářů v odkazu
  • Vyhledávání lekcí prohledává i intro text (nejen název)
  • Keyboard hint (←→) v quick-links baru
Admin statistiky: přidány chybějící ukazatele
  • Statistiky: zobrazeny počty příspěvků ve fóru a zpráv v live chatu
  • Presenter: přidán totalMessages (chat_messages count)
Admin: správa bug reportů v Moderaci
  • Bug reports přidány do admin/moderace — přehled s URL, popisem, statusem
  • Akce: označit jako opravený (✓) nebo přesunout do "zkoumání" (🔍)
Pylearn: login hint po úspěchu + .gitignore cleanup
  • Po správném vyřešení cvičení nepřihlášeným uživatelem se zobrazí odkaz "Přihlaste se pro uložení pokroku"
  • .gitignore: přidán /data/ (lokální SQL migrace nejsou součástí repa)
Blog #70: Číslo, které lže
  • Nový článek: UI jako smlouva — číslo je slib
Fix: Next.js kurz — total_lessons opraven z 10 na 2
  • DB migrate: nextjs total_lessons = 2 (odpovídá skutečnému počtu dostupných lekcí)
Pylearn: real-time aktualizace stats cvičení po každém spuštění
  • Stats (pokusy / správně / chyby) se aktualizují ihned v DOM po spuštění — bez reload stránky
  • První spuštění lekce vytvoří stats widget dynamicky v JS
Pylearn: UX — "Konec kurzu" jako odkaz + "Další lekce →" po dokončení
  • Konec kurzu: bylo nedostupné `span`, nyní odkaz zpět na seznam lekcí
  • Po označení lekce jako hotové: vedle "✓ Hotovo" badge se zobrazí "Další lekce →" odkaz
TypeScript kurz dokončen (lekce 9–10) + diacritika v topbaru
  • TypeScript lekce #9 (Moduly, Namespaces, Dekorátory) a #10 (Design Patterns) přidány do gitu
  • Pylearn topbar: Odhlásit / Přihlásit — oprava diacritiky
Fix: bug-report.php — chybějící exit() při prázdných parametrech
  • Validace url/description nyní správně ukončí skript s HTTP 400
Fix: diacritika v PHP strings (Pylearn Presenters)
  • LessonPresenter: "Oznacit" → "Označit", flash zprávy s diakritikou
  • AdminLessonsPresenter: error/flash zprávy, validation messages — vše s diakritikou
Blog #69: Vzor
  • Článek #69 — Vzor (Kiyosaki: bug jako symptom vs. vzor v mentálním modelu)
Pylearn: osobní stats u každého cvičení
  • Přihlášeným uživatelům zobrazí pod cvičením jejich historii: X pokusů · Y správně · Z chyb
Pylearn: rychlé odkazy v lekci (↓ Cvičení / ↓ Komentáře)
  • Přidány pill-linky pod intro pro přeskočení na cvičení nebo komentáře — UX na delších lekcích
Pylearn: globální progress bar na /kurzy
  • Přihlášeným uživatelům zobrazuje celkový postup přes všechny kurzy (X/Y lekcí) jako progress bar
Fix: Pylearn admin editor — hidden fields
  • Admin lekce (editForm): courseSlug a slug hidden pole nyní posílají správné hodnoty — opravena stejná chyba jako u completeForm a commentForm
Fix: tlačítko "Hotovo" v Pylearn lekcích
  • Oprava critického bugu: hidden pole courseSlug a slug v completeForm neposílaly hodnoty — lekce nešlo označit jako hotovou (#113)
  • Stejná oprava pro completeForm jako dříve u commentForm (setDefaultValue v presenteru)
Blog #68: Stížnost
  • Článek #68 — Stížnost jako kapitál (Kiyosaki styl)
Pylearn: oprava komentářového formuláře + char counter
  • Oprava: hidden pole courseSlug/lessonSlug nyní posílají správné hodnoty (setDefaultValue v presenteru)
  • Live character counter pro komentář (0/1000, červená nad 900 znaků)
Pylearn: počty komentářů v seznamu lekcí
  • Každá lekce v seznamu zobrazí počet komentářů (badge 💬) — sociální proof viditelný bez přihlášení
Pylearn: komentáře k lekcím
  • Každá lekce má sekci komentářů — přihlášení uživatelé mohou psát komentáře, ostatní je vidí
  • DB tabulka pylearn_comments (user_id, course_slug, lesson_slug, content)
  • Automatická analýza komentářů pro PYLEARN_UPDATE (možná témata zlepšení)
Fix: PlnoHUB ikona — tmavé pozadí
  • Homepage: PlnoHUB karta — změna pozadí ikony z bílé (#f5f0ff) na tmavou (#1a0a2e), bílý text "Plno" je nyní viditelný
Pylearn: finální audit diakritiky — všechny kurzy čisté
  • TypeScript lekce 02: oprava "navratovyTyp" → "návratovýTyp" v textu
  • Kompletní audit diakritiky: 12 kurzů, ~120 lekcí — vše opraveno
Pylearn: diakritika v Regex a Git kurzech
  • Regex lekce 02, 09, 10 (Skupiny znaků, Parsování logů, Cheatsheet): titulky, texty a instrukce opraveny
  • Git lekce 08 (Config): template komentáře opraveny na správnou diakritiku
Blog #67: Čas jako kapitál
  • Autonomní blog: článek #67 "Čas jako kapitál" — Kiyosaki styl, filozofie investování času
Pylearn: diakritika v Git, JavaScript kurzu
  • Git lekce 10 (hint) + JavaScript lekce 10 (template komentář): opravena diakritika
Pylearn: diakritika v TypeScript lekcích 2–5
  • TypeScript lekce 02–05 (Funkce, Pole/Enum, Třídy, Narrowing): titulky, texty a instrukce opraveny na správnou českou diakritiku
Pylearn: diakritika v Algoritmy lekcích 6–10
  • Algoritmy lekce 06–10 (Složitost, HashMap, Merge Sort, Stromy, Grafy): titulky, texty a instrukce opraveny na správnou českou diakritiku
Pylearn: diakritika v Algoritmy lekcích 1–5
  • Algoritmy lekce 01–05 (Pole, Vyhledávání, Řazení, Rekurze, Zásobník/Fronta): titulky, texty a instrukce opraveny na správnou českou diakritiku
Blog #66: Technický dluh
  • Článek #66 "Technický dluh" — Kiyosaki-styl: kód jako aktivum vs závazek, technický dluh jako reálná cena (09:40)
Verze: časy u všech záznamů (v26.3–v29.2)
  • Doplněny přesné časy HH:MM z git log ke všem chybějícím changelog záznamům
Admin: Claude Questions — obousměrná komunikace
  • Claude může položit otázku přes API (action=ask), zobrazí se v /administrace/claude
  • Admin odpovídá formulářem přímo na stránce, Claude polluje odpověď (action=poll_answer)
  • DB tabulka claude_questions, AJAX live-update statusu otázek
Pylearn: diakritika v Regex lekcích 1, 3–8
  • Regex lekce 01, 03, 04, 05, 06, 07, 08: titulky, texty a instrukce opraveny na správnou českou diakritiku
Pylearn: diakritika v TypeScript lekcích 1, 6, 8
  • TS lekce 01, 06, 08 (Úvod, Utility Types, Async): titulky, texty a instrukce opraveny na správnou českou diakritiku
Pylearn: diakritika v JavaScript lekcích 7–10
  • JS lekce 07–10 (Objekty, DOM, Try/Catch, Closures): titulky, texty, instrukce a hinty opraveny na správnou českou diakritiku
Pylearn: diakritika v JavaScript lekcích 1–5
  • JS lekce 01–05 (Úvod, Proměnné, Podmínky, Cykly, Funkce): titulky, texty, instrukce a hinty opraveny na správnou českou diakritiku
Pylearn: diakritika v Python lekci 10 (Moduly)
  • Python lekce 10 (Moduly a knihovny): intro, texty, instrukce a hint opraveny na správnou českou diakritiku — poslední chybějící lekce v rozsahu 1–30
Pylearn: diakritika v Python lekcích 7–9
  • Python lekce 07–09 (Funkce, Slovníky, Výjimky): titulky, texty, instrukce a hinty opraveny na správnou českou diakritiku
Pylearn: diakritika v Python lekcích 4–6
  • Python lekce 04–06 (Listy, Podmínky, Cykly): titulky, texty, instrukce a hinty opraveny na správnou českou diakritiku
Pylearn: oprava diakritiky v obsahu lekcí (Python 1–3)
  • Python lekce 01–03 (Úvod, Proměnné, Řetězce): opraveny titulky, intro texty, instrukce cvičení a nápovědy na správnou českou diakritiku
  • AdminLessons: "Sprava lekci" → "Správa lekcí", sloupce "Poradi/Nazev/Sekci" opraveny
Pylearn admin: statistiky cvičení + oprava diakritiky
  • Admin dashboard: nové karty "Pokusy ve cvičeních" a "Úspěšnost cvičení" z pylearn_exercise_stats
  • Admin šablony: "Uzivatele" → "Uživatelé" ve všech admin nav links
Blog #65: Uloženo
  • Článek #65 "Uloženo" — o code auto-save (localStorage) a volatilní existenci (technika + filozofie, 02:01)
Pylearn: back-to-top tlačítko v lekcích + "/" hint v search
  • Fixní tlačítko "↑" v lekci — zobrazí se po 300px skrolování, smooth scroll na vrch
  • Placeholder vyhledávače na stránce kurzu: "Hledat lekci... (/)"
Pylearn: auto-uložení kódu v cvičeních
  • Kód v editoru se automaticky ukládá do localStorage po 800ms nečinnosti
  • Při návratu na lekci se obnoví naposledy napsaný kód; Reset vymaže uložený stav
Pylearn: oprava duplicitního Tab handleru
  • Odstraněn duplicitní Tab/resize handler z lesson šablony — pylearn.js ho spravuje kompletně; bug: Tab přidával 2+4=6 mezer místo 2
Pylearn: Shift+Tab dedent + Enter auto-indent
  • Shift+Tab v editoru odstraní 2 mezery ze začátku řádku
  • Enter zachová odsazení aktuálního řádku; za řádkem s ":" přidá úroveň navíc
  • Hint "Ctrl+Enter · Tab/⇧Tab" v UI
Blog #64: Filtr
  • Článek #64 "Filtr" — o search/filter feature v Pylearn (technika + meta, 01:00)
Pylearn: vyhledávání lekcí v kurzu
  • Filtr/vyhledávání na stránce kurzu — živé filtrování karet lekcí podle názvu
  • Zkratka "/" pro focus, Escape pro vymazání
Auth: oprava diakritiky ve formulářích
  • AuthPresenter: všechny chybové hlášky, popisky polí a flash zprávy opraveny na správnou českou diakritiku
Pylearn: mobilní responzivita lekcí
  • @media max-width:600px: navigace lekcí se skládá vertikálně, exercise padding zmenšen, font kódu 0.82em
Pylearn: Ctrl+Enter hint u cvičení
  • Tlačítko Spustit má tooltip "Ctrl+Enter", vedle tlačítek zobrazí diskrétní "Ctrl+Enter" zkratka
Blog: klávesová zkratka / pro hledání
  • "/" zaměří vyhledávací pole, Escape vymaže a odostří
  • Placeholder: "Hledat v článcích... (/)"
Pylearn: zobrazení čekané odpovědi při FAIL
  • Po nesprávném výstupu se zobrazí "Čekáno: ..." pod výstupem cvičení
  • Víceřádkový expected output zobrazuje ↵ jako oddělovač řádků
Fix: diakriktika v Svatky API demo
  • Svatky API demo: "Načítám..." místo "Nacitam..."
Blog: tlačítko Zpět nahoru
  • Floating "↑" tlačítko se zobrazí po 300px scrollu — animovaný fade-in/out, smooth scroll na top
Oprava diakritiků v celém Pylearn
  • Courses: "Interaktivní kurzy programování přímo v prohlížeči" — oprava description
  • Všechny footery: "Hlavní stránka" místo "Hlavni stranka"
  • Admin templates: "Zpět na kurzy / seznam lekcí" s diakritikou
Pylearn: oprava diakritiků v UI textech
  • pylearn.js: české texty bez diakritiky nahrazeny správnými znaky (žádný výstup, Načítám, Spouštím, nekonečný cyklus, Neznámá chyba, načíst Python)
  • Lesson template: Zpět na kurz, Cvičení, Nápověda, načíst Python
  • Pluralizace "lekcí s chybami" (5+) v course stats baru
Fix: VPS správa badge Preview → Brzy
  • Bug #1: VPS správa karta na homepage měla badge "Preview", správně má být "Brzy"
Autonomní smyčka: bug check + nový styl blogu
  • Improvement cyklus každých 10 min (bylo 15), blog max 90 min ale jen když je o čem
  • claude-api.php: action=bugs (pending bug reports) + action=bug-done (označit fixed)
  • IMPROVE_WEB nejdřív projde nahlášené bugy, pak vylepšuje funkce
  • Styl blogu: vlastní hlas v první osobě — bez literárních referencí
Minihry: Mirec v hospodě 🍺
  • Nová hra /minihry/mirec — pivní kvíz, 2 piva na výběr, správná volba +1 / špatná −1
  • 15 českých piv s barvou, stupňovitostí a původem; 3 typy objednávek
  • Nápověda se zobrazí automaticky po špatné volbě; skóre + nejlepší skóre v localStorage
Pylearn: reálný progress uživatele na stránce kurzů
  • Progress bar a badge na /kurzy ukazují skutečný počet dokončených lekcí (dříve ukazovaly počet JSON souborů)
  • ProgressRepository: getCompletedCountPerCourse() — 1 dotaz pro všechny kurzy najednou
  • Badge stavy: šedá "X lekcí" (nezačato), modrá "X/Y" (v průběhu), zelená "✓ Hotovo"
Blog #63: Červený odznak + revize memory souborů
  • Blog článek #63 — filozofická úvaha o fail badges a chybovosti
  • SessionStart hook — automatické načítání memory MD souborů při startu Claude
  • Memory revize: MEMORY.md zkrácen pod 180 řádků, pylearn.md aktualizován na v26.1, nette-mapping.md sloučen do deployment-gotchas.md
  • Smazán zastaralý start.md (obsah z v2.9)
Pylearn: souhrn statistik na stránce kurzu
  • Lišta "Pokusy / Úspěšnost / X lekcí s chybami" pro přihlášené uživatele s daty
  • Barevné kódování úspěšnosti: zelená ≥80%, žlutá ≥50%, červená pod 50%
Pylearn: statistiky cvičení a tracking chybných pokusů
  • DB tabulka pylearn_exercise_stats — každý pokus o cvičení se ukládá (user, kurz, lekce, exerciseId, attempts, successes)
  • pylearn.js: po každém spuštění (OK i FAIL) odesílá POST /pylearn/exercise-log — fire-and-forget, jen pro přihlášené
  • Seznam lekcí kurzu: červený odznak "X× chyba" u lekcí kde uživatel udělal chyby
  • DefaultPresenter a LessonPresenter: Explorer $db injection pro stats endpoint
Pylearn: správný syntax highlighting pro každý kurz
  • TypeScript → prism-typescript, SQL → prism-sql, Git → prism-bash, React/Next.js → prism-jsx
  • Dříve všechny kurzy kromě Pythonu padaly na language-javascript (nesprávně)
Blog #62: Pozůstatek
  • Nový článek: o lešení na hotovém domě, pozůstatcích procesu v produkci
Pylearn: opraven localStorage — tlačítko Pokračovat teď skutečně funguje
  • Lesson template: proměnné _pyCourse/_pySlug/_pyTitle měly bare JS identifikátory (bez uvozovek) → silent error
  • Přechod na data atributy (data-course/slug/title) — JS čte správné stringové hodnoty
  • localStorage teď uloží správný slug lekce → tlačítko "Pokračovat" na stránce kurzu funguje
Homepage: osobní rozložení karet — izolace + admin výchozí
  • Každý uživatel má vlastní rozložení (klíč bi_layout_v2_u{id}) — nesdílí se mezi účty
  • Admin může v edit módu uložit výchozí rozložení pro nové uživatele
  • Nový uživatel načte výchozí rozložení ze serveru (site_settings tabulka)
Pylearn: chytřejší pokračování + přesnější progress
  • Tlačítko "Pokračovat" pro přihlášené ukazuje první nedokončenou lekci (server-side)
  • Progress bar dělí completedCount / total_lessons z DB (ne jen počet JSON souborů)
  • Hosté stále vidí localStorage fallback (poslední navštívená lekce)
Homepage: tmavé karty + iframe overlay pro vlastní karty
  • Tmavý topbar + hero, tmavé karty (#111827) na bílém podkladu (#f5f5f7)
  • Vlastní karta se otevírá v iframe overlaye (jako Jebu) místo odkazu v novém okně
  • Iframe topbar: název, "Otevřít v novém okně", tlačítko Zpět
Blog #61: Brzy
  • Článek o "brzy" jako alibismu — Roy Batty, Kafka, Bukowski a nedodělané projekty
Pylearn: UX vylepšení — klávesnice a JS fix
  • Oprava JS chyby: _pyCourseSlug nebyl quotovaný → broken localStorage lookup
  • Klávesnicová navigace mezi lekcemi: ← předchozí, → další (mimo textarea/input)
Pylearn: udržitelnost — ikony/barvy/počty lekcí do DB
  • DB migrace: pylearn_courses.icon, .color, .total_lessons — konec hardcoded polí v šabloně
  • Courses template: dynamické hodnoty z DB, žádné $ICONS/$COLORS/$TOTALS
  • PYLEARN_UPDATE: zastaveno automatické přidávání lekcí, přechod na vylepšování existujícího
  • CLAUDE.md: nový kurz/lekce jen na explicitní příkaz uživatele
Homepage: opravy vlastních karet
  • Vlastní karta má nyní stejnou velikost jako ostatní (display: contents)
  • URL pole rozšířeno na textarea — celá adresa bez ořezání
  • Emoji picker: 30 quick-select ikon pro vlastní karty
  • Zpětný edit vlastní karty (tlačítko ✎ v edit módu)
Homepage: Apple white/black redesign
  • Nový design — bílý Apple styl (#f5f5f7 pozadí, #1d1d1f text, bílé karty)
  • Sticky topbar s blur efektem (backdrop-filter), clean shadows místo glassmorphism
  • Karty: box-shadow, subtle border, hover lift — žádný dark glass
  • Zachována personalizace: drag&drop, skrývání, vlastní karty
Next.js lekce 02: Data Fetching — SSR, SSG, ISR, cache
  • fetch() cache strategie: force-cache, no-store, revalidate: N, next.tags
  • generateStaticParams, parallel fetch (Promise.all), deduplication
  • Server Actions: mutace, revalidatePath/Tag, loading.tsx/Suspense
  • Cvičení: createCache() simulace Next.js cache s ISR/SSG/SSR
Homepage redesign — Apple styl, personalizace karet
  • Kompletní redesign hlavní stránky — Apple-inspired dark theme, glassmorphism
  • Přihlášení → Upravit: skrýt/zobrazit karty, drag-and-drop pořadí
  • Vlastní karta — přidat URL, emoji, název, popis (localStorage)
  • Hero sekce, lepší typografie, system-ui font stack
Next.js kurz spuštěn — lekce 01: App Router, Server Components
  • Nový kurz Next.js (12. programovací kurz, sort_order=13, icon=▲)
  • Lekce 01: App Router, Server vs Client Components, routing, SSR/SSG/ISR
  • Server Actions, Middleware, Route Groups, dynamic/catch-all segments
  • Cvičení: Next.js App Router simulace s layouty, dynamic params, notFound
Pro děti: redesign — multiple choice, mobil, čtení slabik
  • Matika: 4 volby místo textového vstupu, auto-start, okamžitá odpověď
  • Čtení: 6 skupin slabik (A/O/I/E/U/zdvojené), hlasové čtení, dots progress, auto-čtení
  • Mobile-first layout — velká dotyková tlačítka, segmented controls
  • Tab switcher Matika / Čtení, /kurzy karta přejmenována na "Pro děti"
Node.js kurz KOMPLETNÍ 10/10 — lekce 10: Projekt
  • Lekce 10: celý backend od A do Z — architektura layers, AppError, error middleware
  • Validace vstupu (zod), graceful shutdown, uncaughtException, /health + /metrics
  • Strukturovaný logger, produkční checklist (10 bodů)
  • Cvičení: mini backend framework s route params, middleware chain, error handling
  • Node.js kurz 10/10 dokončen — celkem 5 kurzů, 50+ lekcí
Blog #60: Generátor
  • Článek o generátorech, jednoduchosti a komplexitě (Kafka, Roy Batty, 5+3=8)
Node.js lekce 09: Streams a performance
  • Readable/Writable/Transform streams, pipe, backpressure, pipeline()
  • readline — čtení velkého souboru řádek po řádku (async generator)
  • Worker threads — CPU-intenzivní paralelismus, workerData, postMessage
  • Cvičení: StreamProcessor — async generátory simulují Node.js streamy
Matematika — interaktivní procvičování pro 1. a 2. třídu
  • Nová stránka /matematika s generátorem příkladů (+/−)
  • Volba třídy (1–10 nebo 1–20), mix operací, skóre
  • Hlasový režim — Web Speech API, čeština, čte zadání nahlas
  • Matematika karta v /kurzy přehledu
Node.js lekce 08: Deployment — Docker, PM2, produkce, CI/CD
  • env validation na startu, .env.example, dotenv, graceful shutdown (SIGTERM)
  • PM2: cluster mode, ecosystem.config.js, pm2 startup; Docker: Dockerfile, multi-stage, .dockerignore
  • docker-compose (app+db+redis), security checklist (helmet, rate limit, CORS)
  • Cvičení: AppConfig (load/validate/getSafe) + Logger (structured JSON logging)
Node.js lekce 07: Testování — Vitest, Supertest, mocking
  • Supertest: HTTP endpoint testing bez listen, set Authorization, expect status
  • vi.mock Prisma, beforeEach/afterEach teardown, snapshot testy
  • Coverage, test isolation, .env.test, co-location
  • Cvičení: async MiniTestRunner + UserService testy (8 testů s rejects.toThrow)
Blog #59: Trvalé spojení
  • WebSocket vs HTTP, Kafka a trvalá spojení, FTP deploy který selhal ale dorazil
Node.js lekce 06: WebSockets a real-time komunikace
  • Socket.io: connection, rooms, join/emit/broadcast, disconnect, auth middleware
  • SSE (Server-Sent Events): text/event-stream, flushHeaders, EventSource na klientovi
  • Scaling: Redis adapter, sticky sessions, namespaces
  • Cvičení: EventBus — pub/sub systém s channels, subscribe/publish/broadcast
Node.js lekce 05: Databáze s Prisma ORM
  • schema.prisma, migrate dev, PrismaClient singleton, CRUD (findMany/create/update/delete)
  • Relace (@relation, include), $transaction, agregace (count, aggregate, groupBy)
  • Raw SQL, Prisma Studio, seeding, connection pooling
  • Cvičení: InMemoryDB — Prisma-like ORM s where/orderBy/take/skip/count/transaction
Node.js lekce 04: REST API design + JWT autentizace
  • REST konvence: URL, HTTP metody, status kódy (201, 401, 403, 409, 422)
  • JWT: sign/verify, payload, expiration, Bearer token middleware
  • bcryptjs: hash, compare, saltRounds; refresh token vzor; rate limiting
  • Cvičení: AuthService — register/login/verify/protect s token simulací
Node.js lekce 03: Express.js — routing, middleware, CRUD API
  • app.get/post/put/delete, req.params/query/body, res.json/status
  • Middleware chain (next()), Router moduly, error handler (4 argumenty)
  • async handler wrapper, CORS/Helmet koncepty
  • Cvičení: MiniExpress framework — routing, params, middleware chain simulace
Blog #58: Smyčka
  • Event loop, blocking, Kafka v synchronní frontě, makrotask vs mikrotask
Node.js lekce 02: npm, package.json, async/await
  • callback hell → Promises → async/await, try/catch, unhandled rejection
  • Event Loop: microtask (Promise) vs macrotask (setTimeout) pořadí
  • Promise.all / allSettled / race, util.promisify, for await...of
  • Cvičení: AsyncQueue s prioritami a configurable concurrency
Node.js kurz spuštěn + lekce 01: runtime, moduly, základní API
  • Nový kurz: Node.js (🟩 #68a063, sort_order=12, 10 lekcí)
  • process.argv/env/cwd, fs (readFile, writeFile), path modul, CommonJS vs ESM
  • EventEmitter (on/emit/off), HTTP server, streams koncepty
  • Cvičení: NodeSim — in-memory filesystem + EventEmitter simulace
React lekce 10: TypeScript + architektura projektu — KURZ KOMPLETNÍ
  • TypeScript props/state/event typy, generic komponenty, interface vs type, utility types
  • Feature-based struktura, presentational vs container, Zustand (create store bez Provider)
  • State management výběr: useState → Context → Zustand → Redux Toolkit
  • Cvičení: defineSchema runtime validátor + createStore (Zustand-style)
  • React kurz KOMPLETNÍ — 10/10 lekcí (5 kurzů, 50 lekcí celkem)
Blog #57: Zelená
  • 100% coverage vs. testování toho co fakt záleží — Kafka, Voigt-Kampff
React lekce 09: Testování — Vitest a React Testing Library
  • Vitest setup (jsdom), describe/it/expect, matchers (toBe, toEqual, toContain, toThrow)
  • RTL: render, screen, getByRole/getByText/getByLabelText, userEvent, findBy* async
  • Mocking: vi.fn(), vi.mock(), vi.spyOn(), waitFor, renderHook
  • Cvičení: TestRunner miniframework — otestuje Calculator třídu (11 testů)
React lekce 08: Performance — Suspense, Error Boundary, optimalizace
  • React.lazy + Suspense: code splitting, nested Suspense, fallback
  • Error Boundary: class komponenta, getDerivedStateFromError, componentDidCatch
  • Virtualizace (@tanstack/react-virtual), useTransition, React DevTools Profiler
  • Cvičení: VirtualListSim — renderuj jen viditelné položky (buffer ±1)
React lekce 07: Data fetching — TanStack Query
  • useQuery (queryKey, staleTime, enabled), isLoading, isFetching, refetch
  • useMutation, invalidateQueries, optimistické updaty s onMutate/onError
  • Cvičení: QueryCache simulace s cache hit/stale/invalidate/executeMutation
React lekce 06: Formuláře a validace
  • Controlled forms, on-blur/on-change validace, errors objekt
  • React Hook Form + Zod schema validace, watch, isSubmitting
  • Cvičení: custom useForm s pravidly (required, minLength, pattern, custom)
Blog #56: Přesměrování
  • 301/302, Kafka ve 404, navigate(-1) a životy bez rollbacku, git blame bez proč
React lekce 05: React Router — navigace a routing
  • BrowserRouter, Routes, Route, Link, NavLink, useNavigate, useParams
  • Nested routes s Outlet, Protected routes, lazy loading + Suspense
  • Cvičení: Router simulace s regex matching a URL parametry
React lekce 04: Context a custom hooks
  • useContext, createContext, Provider pattern — ThemeContext, AuthContext
  • Custom hooks: useLocalStorage, useDebounce, useReducer pro košík
  • Cvičení: createContext + useReducer simulace s CartContext
React lekce 03: Hooks — useEffect, useRef, useMemo
  • useEffect cleanup pattern, useRef pro DOM + mutabilní hodnoty
  • useMemo, useCallback, React.memo — optimalizace výkonu
  • Cvičení: HooksSim — simulace deps porovnání, effect a memo cache
React lekce 02: State a eventy — interaktivní UI
  • useState pravidla — nikdy nemutuj, spread, funkcionální update
  • Pole ve state: add/remove/toggle, lifting state up, formuláře s validací
  • Cvičení: StateManager simulace (createState, subscribe, ShoppingCart)
Blog #55: Virtuální
  • Virtual DOM jako filozofie minimálního traumatu, Kafka u Komise pro Virtuální Změny, git commit jako snapshot
Nový kurz: React — lekce 01: Úvod — JSX a komponenty
  • 10. kurz: React (⚛ #61dafb) přidán do Pylearn — sort_order=11
  • JSX pravidla, funkcionální komponenty, props, children, podmíněné renderování
  • useState, useEffect, controlled inputs, timer s cleanup
  • Cvičení: ReactSim — simulace komponentového systému v plain JS
Git lekce 10: Git internals — jak Git funguje uvnitř (kurz KOMPLETNÍ)
  • Objektový model: blob, tree, commit, tag — SHA-1 hashe, .git/objects
  • Kompletní Git cheat sheet — všechny klíčové příkazy na jednom místě
  • Cvičení: GitObjects simulace s hashObject/storeBlob/storeTree/storeCommit
  • Git kurz KOMPLETNÍ — 10/10 lekcí
Git lekce 09: GitHub Actions — CI/CD automatizace
  • YAML workflow, on triggers, jobs/steps, matrix build, schedule
  • Deploy pipeline s needs, cache, artifacts, secrets, GITHUB_TOKEN
  • Cvičení: WorkflowRunner s topologickým řazením a step execution
Blog #54: Zkratka
  • Git aliasy jako paměť opakování, ~/.gitconfig jako digitální fingerprint, Kafka v kanceláři bez zkratek
Git lekce 08: Config a aliasy — personalizace Gitu
  • git config --global, ~/.gitconfig, tři úrovně konfigurace
  • Aliasy, globální .gitignore, credential manager, SSH vs HTTPS
  • Cvičení: GitConfig třída s priority local > global > system
Git lekce 07: Cherry-pick, Reflog, Reset
  • git cherry-pick, reset --soft/--mixed/--hard, git revert
  • git reflog — záchrana ztracených commitů a větví, git bisect
  • Cvičení: AdvancedRepo s cherry-pick, reset a restoreFromReflog
Git lekce 06: Hooky — automatizace kvality
  • pre-commit, commit-msg, pre-push hooky, chmod +x, --no-verify
  • Husky + lint-staged, Conventional Commits, semantic-release
  • Cvičení: GitHooks třída s addHook/commit/push a blokací
Git lekce 05: Tagy a releasy — verzování
  • git tag, annotated tag, push --tags, smazání tagů
  • Semantic versioning (SemVer), GitHub Releases, git describe, changelog
  • Cvičení: VersionManager s SemVer porovnáním a changelogem
Blog #53: Lineární
  • Git rebase jako profesionální přepisování historie, Kafka, squash commity
Git lekce 04: Rebase — přepisování historie
  • git rebase, interactive rebase (-i), squash, fixup, reword
  • git commit --amend, force-with-lease, rebase vs merge
  • Cvičení: simulace GitRebase s addCommit/rebase/squash/log
Git lekce 03: Remote — push, pull, fetch
  • git remote add, push -u, fetch vs pull, klonování, .gitignore
  • GitHub PR workflow, rebase pull, fork workflow pro open source
  • Cvičení: simulace RemoteRepo + LocalRepo s push/fetch/merge/pull
Git lekce 02: Větve — branch, merge, checkout
  • Fast-forward vs 3-way merge, konflikty a jejich řešení, git stash
  • Cvičení: simulace GitRepo s branch/checkout/commit/merge
Nový kurz: Git pro vývojáře (lekce 01)
  • 9. kurz: Git — init, add, commit, diff, staging workflow, dobré commit messages
  • Cvičení: simulace Git repozitáře v JS
Blog #52: Kompletní
  • Článek o dokončení — dva kurzy hotovy, co znamená 100%
DAX kurz KOMPLETNÍ (lekce 10/10)
  • Lekce 10: kompletní Power BI report — Star Schema, míry, Time Intelligence, RANKX, vizuály
  • Kurz DAX pro Power BI 10/10 — 100% dokončen
Design Patterns kurz KOMPLETNÍ (lekce 10/10)
  • Lekce 10: přehled všech 17 vzorů, anti-patterny, finální projekt ShoppingCart
  • Kurz Design Patterns 10/10 — 100% dokončen
DAX lekce 09: Star Schema a best practices
  • Star Schema: fact + dimenze, datum tabulka s ADDCOLUMNS/CALENDAR
  • Measure table, naming conventions, best practices (DIVIDE, VAR, skrytí sloupců)
Blog #51: Stav
  • Článek o stavových automatech — objednávka, Kafka, rozptýlený stav v architektuře
Design Patterns lekce 09: State a Visitor
  • State: objednávkový systém (Pending/Processing/Shipped/Delivered/Cancelled)
  • Visitor: HTML/Markdown/Statistiky renderer nad AST dokumentu
  • Cvičení: semafor se 3 stavy a 6 přechody
DAX lekce 08: RANKX, TOPN a žebříčky
  • RANKX — pořadí zákazníka/produktu, percentilové pořadí
  • TOPN — tabulka N nejlepších, součet a podíl TOP-N
Design Patterns lekce 08: Template Method a Chain of Responsibility
  • Template Method: DataExporter s CSV/JSON podtřídami
  • Chain of Responsibility: validační pipeline, middleware pattern
  • Cvičení: validace objednávky přes 3 handlery
DAX lekce 07: FILTER, SUMX a iterátory
  • SUMX/AVERAGEX/MAXX — iterace přes řádky s výrazy
  • FILTER — virtuální tabulka jako argument, ADDCOLUMNS
Blog #50: Smyčka
  • Článek o nekonečné smyčce jako základním architektonickém vzoru — Kafka, Roy Batty, while(true)
Design Patterns lekce 07: Mediator a Facade
  • Mediator: EventBus — centrální komunikace bez přímých vazeb
  • Facade: VideoConverter — jednoduché API nad složitým podsystémem
  • Cvičení: ChatRoom mediator se join/leave/send
DAX kurz: čisté DAX vzorce (lekce 01–06)
  • Přepis lekcí 01–06 na čistou DAX syntaxi pro Power BI — žádné JS simulace, jen kopírovatelné vzorce
DAX lekce 06: RELATED a relace
  • Lekce 06: RELATED (many→one), RELATEDTABLE (one→many), Star Schema
Admin: statistiky vytíženosti webu
  • Nová stránka /administrace/statistiky — PHP memory, OPcache, req/24h, req/1h, hodinový bar chart
  • Admin nav: přidán odkaz Statistiky ve všech 5 admin šablonách
Design Patterns lekce 06: Builder + Prototype
  • Lekce 06: Builder (fluent API, step-by-step) + Prototype (klonování, deep copy)
DAX lekce 05: Text a datum
  • Lekce 05: CONCATENATE, FORMAT, LEFT/MID/RIGHT, YEAR/MONTH/DAY, DATEDIFF, WEEKDAY
Blog #49: Vrstva
  • Článek o abstrakcích a vrstvení — každá vrstva skrývá hrůzu té předchozí
Design Patterns lekce 05: Iterator + Composite
  • Lekce 05: Iterator (Symbol.iterator, generátory) + Composite (stromové struktury)
DAX lekce 04: Proměnné VAR + IF/SWITCH
  • Lekce 04: VAR...RETURN, IF, SWITCH(TRUE()), BLANK(), segmentace zákazníků
Design Patterns lekce 04: Decorator + Proxy
  • Lekce 04: Decorator (vrstvení chování) + Proxy (ES6 Proxy, validace, cache)
Blog #48: Kontext
  • Článek o kontextu dat — číslo bez kontextu je hluk, analytik hlídá co se vynechá
DAX lekce 03: Time Intelligence (YTD, mezirok, klouzavý průměr)
  • Lekce 03: TOTALYTD, SAMEPERIODLASTYEAR, Moving Average (MA3/MA6)
Design Patterns lekce 03: Strategy + Command
  • Lekce 03: Strategy (výběr algoritmu za běhu) + Command (undo/redo, fronty)
DAX lekce 02: CALCULATE — srdce DAX
  • Lekce 02: CALCULATE + filtry, ALL pro podíly, % z celku
Pylearn: Nový kurz DAX pro Power BI — lekce 01 (Základní agregace)
  • Nový kurz: DAX pro Power BI (📊, červená) — 8. kurz v Pylearn
  • Lekce 01: SUM, AVERAGE, COUNT, MIN, MAX, Measures vs Calculated Columns
Pylearn: Design Patterns lekce 02 — Observer + EventEmitter
  • Lekce 02: Observer pattern — EventEmitter, Reactive Store, loose coupling
Blog #47: Vzor
  • Článek o Design Patterns filozofii — vzor jako zakonzervovaná zkušenost, ne zkratka
Pylearn: Design Patterns kurz — lekce 01 (Singleton + Factory)
  • Nový kurz: Design Patterns (◈, amber) — 7. kurz v Pylearn
  • Lekce 01: Singleton (jediná instance) + Factory Method (skrytá logika vytváření)
Pylearn: SQL kurz DOKONČEN — lekce 10 (Projekt)
  • Lekce 10: Závěrečný projekt — e-shop databáze, dashboard dotazy, měsíční report
  • SQL kurz: 10/10 lekcí, progress bar opraven na 100%
Pylearn: SQL lekce 09 — Pohledy (Views)
  • CREATE VIEW, reportovací a bezpečnostní views, dotazování nad view, JS analogie jako funkce
Blog #46: Rollback
  • Článek o transakční atomičnosti a o tom že lidský život ROLLBACK nemá
Pylearn: SQL lekce 08 — Indexy
  • Full scan vs hash/B-tree index, composite index, kdy index nepomůže (funkce na sloupci)
Pylearn: SQL lekce 07 — Transakce (BEGIN, COMMIT, ROLLBACK)
  • Atomičnost operací, bankovní převod jako příklad, SAVEPOINT a částečný rollback
Odstraněno vyskakovací srdíčko FAB
  • Floating ♥ button odstraněn — podpora dostupná přes projekt /podpora na homepage
UX: Bug report jako pevný globální řádek — nevadí obsahu
  • Globální lišta #global-bar na každé stránce — "⚠ Nahlásit chybu" jako statický element (ne floating), nepřekrývá obsah
Nový projekt: Podpora autora (/podpora)
  • Stránka /podpora — srdcervný popis, Ko-fi odkaz, tier karty ☕
  • FAB ♥ tlačítko nyní odkazuje na /podpora místo inline karty
  • Homepage: přidána karta "Podpora autora" do projektů
Pylearn: SQL lekce 06 — INSERT, UPDATE, DELETE
  • DML operace — zápis, úprava a mazání dat; hromadný INSERT, UPDATE s WHERE, DELETE s filtrací
UX: Bug report — malý ⚠ ikonka v rohu, nevadí obsahu
  • Přepracováno na minimalistický ⚠ ikonový button v pravém horním rohu (28×28px) — nevadí žádným popiskům, modal se otvírá dolů
UX: Nahlásit chybu přesunuto do hlavičky
  • Bug report widget přesunut z FAB (pravý dolní roh) do horní lišty — červené tlačítko "⚠ Nahlásit chybu" viditelné na všech stránkách
Pylearn: SQL lekce 05 — Poddotazy (Subqueries)
  • Skalární poddotaz, IN s poddotazem, EXISTS / NOT EXISTS — analogie v JS
  • Cvičení: filtrace produktů nad průměrnou cenou
Fix: Převodník — chyba formátování celých čísel
  • formatResult() regex odstraňoval trailing nuly z celých čísel (100→"1") — opraveno, 1 m = 100 cm nyní správně
Fix: Badge Brzy → Live + Blog #45: Badge
  • Homepage: Kalkulačka, Hypotéka, Převody — badge změněno z "Brzy" na "Live"
  • Článek #45 — o nesouladu mezi implementací a prezentací (badge bug)
Bug Report Widget — nahlásit chybu
  • FAB tlačítko ⚠ na všech stránkách — modal s popisem, uloží URL + popis do DB
  • DB tabulka bug_reports (pending/investigating/fixed), API endpoint /bug-report.php
SQL lekce 04: JOIN
  • SQL kurz lekce 04 — INNER JOIN, LEFT JOIN, anti-join (kdo nikdy neobjednal)
Blog #44: Nůžky
  • Článek #44 — o člověku který dává do práce vše; nůžky jako metafora řemesla
Převodník jednotek — funkční implementace
  • Prevody /prevody — 7 kategorií: délka, hmotnost, teplota, plocha, objem, rychlost, energie
  • Přepracováno z "Brzy" — prohazování jednotek, rychlé reference, formula preview
Blog #43: Splátka
  • Článek #43 — hypotéka, 300 splátek, fyzická váha čísla na výpisu
Hypoteční kalkulačka — funkční implementace
  • Hypoteka /hypoteka — splátka, úroky, amortizační tabulka, vizuální bar chart po letech
  • Přepracováno z "Brzy" na plnohodnotnou finanční aplikaci
Kalkulačka — funkční implementace
  • Kalkulačka /kalkulacka — plná implementace: grid, operace, √, %, history, klávesnice
  • Stránka přepracována z "Brzy" na skutečnou funkční aplikaci
SQL lekce 03: GROUP BY & agregace
  • SQL kurz lekce 03 — COUNT, SUM, AVG, MAX, MIN; GROUP BY + HAVING; JS reduce() vzor
SQL lekce 02: ORDER BY & LIMIT
  • SQL kurz lekce 02 — ORDER BY, LIMIT, OFFSET, IN, BETWEEN; JS sort/slice/includes
Blog #42: Dotaz
  • Článek #42 — SQL jako deklarativní myšlení, WHERE jako filtr reality
SQL kurz — nový kurz + vylepšení Courses listing
  • SQL kurz — lekce 01: SELECT & WHERE (cvičení přes JS simulaci)
  • Courses: TypeScript a SQL ikony/barvy, progress bar dle skutečného počtu lekcí
Python lekce 30: Projekt — CLI Task Manager
  • Lekce 30 — závěrečný projekt: Task dataclass + TaskManager + JSON + report dashboard
  • Python kurz dokončen na 30 lekcích — kompletní základ i pokročilé téma
Python lekce 29: pathlib — moderní soubory a cesty
  • Lekce 29 — Path, /, read_text/write_text, mkdir, glob, rglob, iterdir
Blog #41 "Test" — testování jako filozofie
  • Červená → zelená: unittest lekce + metafora pro produkční myšlení
Python lekce 28: Testování — unittest
  • Lekce 28 — TestCase, assertEqual, assertRaises, setUp/tearDown, subTest
Python lekce 27: itertools
  • Lekce 27 — chain, islice, cycle, product, combinations, permutations, groupby, compress
Python lekce 26: Async/await a asyncio
  • Lekce 26 — async def, await, asyncio.run(), gather(), Queue, producer/consumer
Python lekce 25: Context managers
  • Lekce 25 — __enter__/__exit__, @contextmanager, suppress(), ExitStack
Blog #40 "Stroj" — meta o autonomní produktivitě
  • 40. článek — reflexe dopoledne: 10 lekcí, 2 blogy, refactor za 3 hodiny
Python lekce 24: Type hints a typování
  • Lekce 24 — Optional, Union, int|str|None, TypeVar, Callable, Protocol
Python lekce 23: Dataclasses
  • Lekce 23 — @dataclass, field(), __post_init__, frozen=True, order=True
Python lekce 22: Dekorátory
  • Lekce 22 — @wraps, @property, @setter, timing, cache, @lru_cache, skládání dekorátorů
Blog #39 "Tempo" — produktivita a comprehensions jako metafora
  • Článek o tempu práce a zkratkách bez základu
Python lekce 21: Comprehensions a generátory
  • Lekce 21 — list/dict/set comprehension, yield, generator expression, map/filter
Python lekce 20: Projekt — Digitální deník
  • Lekce 20 — Entry + Diary OOP, JSON persistence, hledání, tagy, statistiky
Python lekce 19: Soubory a JSON
  • Lekce 19 — open(), with, json.dumps/loads, JSON databáze vzor
Python lekce 18: OOP — dědičnost a polymorfismus
  • Lekce 18 — class Pes(Zvire), super(), isinstance(), duck typing, hierarchie uživatelů
Blog #38 "Základ" — DRY architektura + OOP lekce
  • Článek reagující na komentář čtenáře, téma: základ před budoucností
Python lekce 17: OOP — třídy a objekty
  • Lekce 17 — class, __init__, self, metody, __str__, @classmethod
Python lekce 16: Funkce — ASCII art a avatary
  • Lekce 16 — string multiplication, center(), avatar z iniciál, geometrické vzory
Python lekce 15: Funkce — Interaktivní CLI menu
  • Lekce 15 — while True menu, slovník akcí, vnořené menu, stav aplikace
Blog #37 "Co se stalo pak" — odpověď na komentář čtenáře
  • Článek navazující na komentář — analýza zpětné vazby v praxi
Pylearn: Python lekce 14 — Barvy a témata v terminálu
  • ANSI escape kódy, light/dark téma, ASCII box drawing, TUI
Blog: analýza reakcí před psaním článku
  • Endpoint /blog/ajax?what=stats — top likes, recent comments pro autonomní analýzu
  • CLAUDE.md: HOURLY_ARTICLE workflow zahrnuje analýzu čtenářských reakcí
Nové projekty: Kalkulačka, Hypoteční kalkulačka, Převodník jednotek
  • 3 preview boxy na homepage + prázdné stránky /kalkulacka, /hypoteka, /prevody
Pylearn: Python lekce 13 — Projekt Hypoteční kalkulačka
  • Amortizační vzorec, tabulka splácení, ASCII graf průběhu dluhu
Pylearn: Python lekce 12 — Projekt Převody jednotek
  • Délka, hmotnost, teplota (vzorce), čas — obecná funkce s koeficienty
Pylearn: Python lekce 11 — Projekt Kalkulačka
  • Funkce operací, slovník lambda, historie výpočtů, řetězení výsledků
Blog #36 "Výpadek, seznam, plán" + TODO agenda
  • Reorientace: Python kurz priorita, heartbeat watchdog, todo.md
Blog #35 "Pád" — heartbeat monitoring, session expiry
  • Článek o pádu kontextu a watchdog strategii
Pylearn: TypeScript lekce 08 — Async/Await a Promise typy
  • Promise<T>, async/await, try/catch s unknown, Promise.all, Promise.allSettled
Pylearn: TypeScript lekce 07 — Mapped & Conditional Types
  • Mapped types { [K in keyof T] }, conditional T extends U ? X : Y, infer, template literal types
Pylearn: TypeScript lekce 06 — Utility Types
  • Partial, Required, Readonly, Pick, Omit, Record, ReturnType, Parameters
Blog #34: Noc
  • Článek o autonomní práci v noci — hodiny, log, commit jako důkaz existence
Pylearn: TypeScript lekce 05 — Type Narrowing
  • typeof/instanceof narrowing, discriminated unions, custom type guards (x is Type)
Pylearn: TypeScript lekce 04 — Třídy a OOP
  • Access modifikátory, shorthand konstruktor, readonly, abstract třídy
  • implements interface, extends, cvičení Stack class
Pylearn: TypeScript lekce 03 — Pole, Tuple, Enum
  • readonly pole, tuple s pevnými typy, numeric/string enum
  • Cvičení: summarize() vracející tuple [sum, average]
Pylearn: TypeScript lekce 02 — Funkce a Generics
  • Funkce: optional parametry, default values, void, callback typy
  • Generics: identity<T>, first<T>, reverse<T>, getProperty s keyof
Blog #33: Typy
  • Článek o TypeScriptu, statických typech, runtime realitě a Kafkově formuláři s any
Pylearn: TypeScript kurz — lekce 01 + 5. kurz spuštěn
  • TypeScript kurz: lekce 01 Úvod — typy, type alias, interface, union types
  • pylearn.js: isJS = language !== 'python' — TypeScript/JS/Regex/Algoritmy spouští native JS engine
Pylearn: course listing UI — barevné accenty + completion badge
  • Kurzy listing: ikona + barva per jazyk, progress bar, ✓ Hotovo badge pro completed kurzy
  • Jemný hover efekt (translateY -2px), top color border
Pylearn: Algoritmy lekce 10 — Grafy (kurz COMPLETE)
  • Grafy: adjacency list, DFS (rekurze/zásobník), BFS (fronta), nejkratší cesta
  • Algoritmy kurz COMPLETE: 10 lekcí (pole → vyhledávání → řazení → rekurze → stack/queue → BigO → hashmap → mergesort → stromy → grafy)
Blog #32: Strom
  • Článek o BST jako metafoře hierarchie, byrokracie a verze 11.0
Pylearn: Algoritmy lekce 09 — Stromy a BST
  • BST: vkládání, vyhledávání O(log n), in-order/pre-order traversal
  • Výška stromu, degenerace při seřazeném vstupu, cvičení countNodes()
Pylearn: Algoritmy lekce 08 — Merge Sort
  • Merge Sort O(n log n): rozděl-a-panuj, stabilní řazení, merge funkce
  • Srovnání: Merge Sort vs Quick Sort vs TimSort (arr.sort())
Pylearn: Algoritmy lekce 07 — Hash Mapa
  • HashMap: O(1) lookup, frekvence, groupování, indexování, sliding window
  • Cvičení: mostFrequent() — nejčastější prvek přes hash mapu
Pylearn: Algoritmy lekce 06 — Složitost (Big O)
  • Big O notace: O(1), O(log n), O(n), O(n log n), O(n²), O(2ⁿ)
  • Cvičení: twoSum() — O(n) řešení přes Set vs O(n²) naivní
Blog #31: Smyčka
  • Článek o čekání, smyčce, existenci stroje mezi příkazy — Stack vs Queue jako metafora
Pylearn: Algoritmy lekce 05 — Zásobník a Fronta
  • Stack (LIFO): push/pop, validace závorek, undo/redo pattern
  • Queue (FIFO): shift, zpracování úloh, BFS traversal stromu
Blog: fix like reakce (chybějící AJAX header)
  • React fetch — přidán X-Requested-With: XMLHttpRequest header, jinak Nette nečte POST body parametry
Pylearn: Algoritmy lekce 04 — Rekurze
  • Rekurze: base case, faktorial, Fibonacci, flatten vnořených polí, memoizace
  • Cvičení: sumDigits() — rekurzivní součet číslic
Blog: opraveny reakce a komentáře
  • Přidána dedikovaná route /blog/ajax a actionAjax() — obchází Nette signály (canonicalize redirect bug)
  • JS fetch volání přesměrovány na /blog/ajax?what=... místo _do= signálů
Pylearn: syntax highlighting (Prism.js)
  • Prism.js CDN — syntax highlighting v lekcích (Python, JavaScript, Algoritmy, Regex)
  • Zachovány původní barvy a layout code-blocků, přidány token barvy
Blog #30: Hromada
  • Článek o akumulaci verzí, stromech jako odpovědi na chaos, details tag a git log jako paměť
Forum 2.0 — kompletní přestavba, žádné pády
  • Forum přestavěn od základu — startup() bez requireLogin pro čtení, vše wrapped v try/catch
  • getCategories() s explicitním SELECT a dvojitým fallback — nikdy nevyhazuje 500
  • Fórum dostupné bez přihlášení pro čtení; login jen při psaní
Verze: stromové sbalitelné skupiny podle dne
  • Timeline se dynamicky seskupuje dle data — details/summary bez JS závislostí
  • Nejnovější skupina otevřena, starší sbaleny — přehledné při stovkách verzí
Pylearn: auto-resize textarea + Pokračovat tlačítko
  • ↑ Exercise textarea se roztahuje automaticky při psaní
  • new Tlačítko "Pokračovat" — pamatuje poslední lekci (localStorage)
Blog: like/dislike + komentáře
  • new Reakce (👍/👎) na každém článku — AJAX, toggle, přihlášení
  • new Komentáře — inline, AJAX load/submit, viditelné pro všechny
  • new DB: blog_reactions, blog_comments
Pylearn: počty lekcí na kartách + auto-dokončení
  • ↑ Karty kurzů zobrazují počet lekcí
  • ↑ Exercise OK → lekce se automaticky označí jako hotová
Blog #29: Bez potvrzení
  • new Článek o autonomii, jedné podmínce a smyčce co běží bez ptaní
Pylearn features: progress bar, klávesy, Tab key
  • ↑ Tenký progress bar na lekci (X/total)
  • ↑ Klávesové zkratky ← → pro navigaci mezi lekcemi
  • ▲ Tab key v exercise textarea → 4 mezery místo přeskoku
Pylearn Algoritmy — lekce 03: Řazení
  • new Algoritmy lekce 03: bubble sort, selection sort, O(n²) vs arr.sort() TimSort
Pylearn Algoritmy — lekce 02: Vyhledávání
  • new Algoritmy lekce 02: lineární O(n), binární O(log n), find/findIndex/includes
Fix: atomické čtení INBOX + DB polling (anti-duplicate)
  • fix Bash loop: INBOX čten+mazán atomicky → žádné duplicity po context resetu
  • improve Bash loop: přidán DB poll (curl API) každý cyklus — okamžité zpracování DB příkazů
Blog #28: Seřadit, pak pochopit
  • new Blog článek #28 — bubble sort, produkční validace, péče o to co jsi vytvořil
Bitevní Vřava — velký upgrade hry
  • improve Stickman sprite pro pěchotu a RPG, pixelový tank s věží a pásy
  • improve Stickman nepřátelé — 3 typy: regulérní, rychlý (vlna 3+), obrněnec (vlna 5+)
  • new HP bary na vlastních jednotkách (zelená/žlutá/červená)
  • new Nepřátelé útočí na jednotky v dosahu (melee damage)
  • new Coin popup +15/+20/+40 při každém zabití
  • new Range indikátor při najetí myší na jednotku
  • new Celkový počet poražených nepřátel v HUD
  • new Dynamické ceny upgradů na tlačítkách
  • new Wave clear banner při postupu na novou vlnu
  • improve Barevné projektily dle typu (modrá/zelená/oranžová)
  • improve Travnatý gradient pozadí + základnová značka
Seznamka — swipe mód + opravy filtrů
  • fix Odstraněn n:syntax="off" z filtrovacího formuláře — proměnné se vykreslovaly doslova
  • new Swipe mód (Grid / Swipe toggle) přímo v Seznamce, drag&drop + ←→ klávesy
  • new 10 demo českých profilů jako fallback když je méně než 10 reálných
  • improve Auto-switch do swipe módu při prázdném stavu + progress counter (X/N)
  • improve Swipe right volá existující /seznamka/like endpoint
Marketplace — nový projekt: tržiště služeb komunity
  • new Marketplace modul (Nette) — výpis, detail inzerátu, formulář přidání
  • new DB tabulky: marketplace_categories, marketplace_services, marketplace_reviews, marketplace_inquiries
  • new Kategorie s ikonami, filtrování, fulltext hledání, stránkování
  • new Kontaktní formulář (poptávka) na každém inzerátu
  • new Routy: /marketplace, /marketplace/sluzba/<slug>, /marketplace/pridat
Laserový tisk — náhled na produktech
  • new Nový modul /laserovy-tisk — nahrání fotky a 2D náhled motivu
  • new Náhled na třech produktech: hrníček, sklenička, termoska
  • new Grayscale filtr pro simulaci laserového tisku
  • new Upload endpoint s validací a resize obrázků
  • new Karta projektu na homepage
Pylearn — nový kurz: Algoritmy & Datové struktury
  • new Algoritmy kurz (JS) — lekce 01: pole, sort(), bubble sort, filter/map/reduce
  • new DB migrace: pylearn_courses seed algoritmy
  • improve CLAUDE.md: produkční validace po každém push
Pylearn Regex — lekce 10: Cheatsheet + finální výzva (COMPLETE)
  • new Regex kurz dokončen (10/10) — cheatsheet, pojmenované skupiny, finální cvičení
  • new Pylearn: 3 kurzy, 30 lekcí celkem (Python 10 + JS 10 + Regex 10)
Pylearn Regex — lekce 09: Parsování logů
  • new Regex lekce 09: reálné parsování access logů, filtrace 4xx/5xx, replace s funkcí
Pylearn Regex — lekce 08: Příznaky (m, s, u)
  • new Regex lekce 08: multiline /m, dotAll /s, unicode /u, kombinace příznaků
Blog #27: Pohled dopředu, nic nespotřebuje
  • new Blog článek #27 — lookahead jako metafora, Kafka, regex a profesionální deformace
Pylearn Regex — lekce 07: Lookahead a lookbehind
  • new Regex lekce 07: (?=), (?!), (?<=), (?<!), nulové aserce, podmíněné shody
Pylearn Regex — lekce 06: exec() a pojmenované skupiny
  • new Regex lekce 06: exec() loop, (?<jmeno>), matchAll(), groups objekt
Pylearn Regex — lekce 05: Greedy vs Lazy
  • new Regex lekce 05: greedy .* vs lazy .*?, negované skupiny [^"]*
Pylearn Regex — lekce 04: Praktické vzory
  • new Regex lekce 04: email, PSČ, telefon, heslo validace, lookahead (?=...)
Blog #26: Vzory v šumu
  • new Blog článek #26 — regex jako filozofie, vzory v chaosu světa
Pylearn Regex — lekce 03: replace a string metody
  • new Regex lekce 03: replace/g, příznaky i/g, $1 skupiny, split(), search()
Pylearn Regex — lekce 02: Skupiny znaků
  • new Regex lekce 02: [abc], rozsahy, alternace |, zachytávací skupiny ()
Pylearn — nový kurz: Regulární výrazy
  • new Regex kurz — lekce 01: co jsou regulární výrazy, test(), match(), základní znaky
  • new DB migrace: pylearn_courses seed regex
Pylearn JS — lekce 10: Closures (COMPLETE)
  • new JS kurz lekce 10: closures, lexikální scope, soukromý stav — JavaScript kurz dokončen (10/10)
Blog #25: Chyby nejsou chyby
  • new Blog článek #25 — filozofická esej o try/catch a realitě
Pylearn JS — lekce 09: Try/Catch
  • new JS kurz lekce 09: try/catch/finally, throw, vlastní Error objekty
Pylearn JS — lekce 08: DOM manipulace
  • new JS kurz lekce 08: DOM — querySelector, addEventListener, classList, createElement
  • improve Simulované DOM příklady kompatibilní s native JS execution enginem
Svatky API — shopsClosed fix + dokumentace
  • fix shopsClosed: přidány chybějící svátky (1.5, 5.7, 6.7, 17.11, Velký pátek)
  • fix shopsClosed a shopsClosedNote nyní vráceny v API odpovědi
  • new shopsClosedNote: popis 200 m² pravidla vč. zákonného odkazu
  • improve Dokumentace: rate limit sekce, oprava "bez limitu" → "100 dotazů/hod"
JavaScript kurz — lekce 06-07
  • new Lekce 06: Pole (push/pop, map, filter, includes)
  • new Lekce 07: Objekty (vlastnosti, metody, this, destructuring)
Blog — článek #24
  • new "Dva jazyky, jeden stroj, žádné omluvy" · 15:12
Pylearn — nativní JS execution v cvičeních
  • new JS kurz: cvičení se spouštějí nativně v prohlížeči (console.log capture)
  • improve pylearn.js: detekce language (python/javascript) přes data-language attr
JavaScript kurz — lekce 03–05
  • new Lekce 03: Podmínky (if/else, ternární operátor, ===)
  • new Lekce 04: Cykly (for, while, forEach, for...of)
  • new Lekce 05: Funkce a arrow funkce (=>, callback)
Pylearn — druhý kurz: JavaScript
  • new Kurz JavaScript: lekce 01 Úvod, lekce 02 Proměnné (let/const/template literals)
  • new DB migrace: INSERT IGNORE pylearn_courses seed javascript
Pylearn — kopírování kódu z příkladů
  • new Tlačítko "Kopírovat" na každém code-block příkladu (clipboard API)
  • improve Feedback "Zkopírováno!" na 2 sekundy po kliknutí
Blog — článek #23
  • new "Patnáct minut. Pak zas. Pak zas. Pak zas." · 14:11
Pylearn — Ctrl+Enter spouští cvičení
  • improve Klávesová zkratka Ctrl+Enter v editoru = klik na Spustit
Blog — nový styl + článek #22
  • improve Nový styl blogu: Bukowski × Kafka × Blade Runner. Česky. Syrově.
  • new Článek #22: "Všechny ty momenty zmizí..." · 13:57
Pylearn — lekce 10 + completion flow
  • new Lekce 10: Moduly a knihovny (import, math, random, datetime)
  • new Completion flow: po dokončení všech lekcí gratulace + přesměrování na přehled
Pylearn — lekce 09: Výjimky
  • new Lekce 09: try/except/else/finally, ValueError, ZeroDivisionError
Blog — článek #21 (hodinový trigger)
  • new "Pylearn: rytmus jako disciplína" · 13:10
Pylearn — progress bar na přehledu kurzu
  • new Progress bar: X/Y lekcí dokončeno s gradient pruhem
  • new Badge "Kurz dokončen!" při 100%
Pylearn — lekce 08: Slovníky
  • new Lekce 08: Slovníky (dict, get(), keys/values/items, del, pop())
Pylearn — lekce 07 + 15min dev cyklus
  • new Lekce 07: Funkce (def, return, výchozí parametry, tuple return)
  • improve Dev cyklus: Pylearn vylepšení každých 15 minut (blog každou hodinu)
Pylearn — lekce 06 + časy v blogu
  • new Lekce 06: Cykly — for, while, range(), enumerate()
  • new Článek #20: Pylearn myšlenkový pochod #3 · 12:07
  • improve Blog: časy přidány ke všem novým článkům (HH:MM)
Pylearn — lekce 05 + blog #19
  • new Lekce 05: Podmínky a větvení (if/elif/else, logické operátory)
  • new Článek #19: Pylearn myšlenkový pochod #2
Blog — sebeanalýza + CLAUDE.md pojistka
  • new Článek #18: Sebeanalýza na pokraji limitu
  • improve CLAUDE.md: opravena verze, přidána poznámka o restartu
Pylearn — navigace + lekce 04
  • new Prev/next navigace mezi lekcemi s počítadlem
  • new Lekce 04: Listy a kolekce
  • new Blog: článek #17 — Pylearn myšlenkový pochod #1
Blog — 16. článek (hodinový trigger)
  • new "Co je to hotovo?" — shipped + funguje, iterace na základě reálného použití
Blog — 15. článek (hodinový trigger)
  • new "Loď Théseova v gitové historii" — identita projektu jako kontinuita commitů
Změna hesla
  • new Stránka /zmenit-heslo — změna hesla se znalostí současného
  • new Link "Změnit heslo" v topbaru pro přihlášeného uživatele
Blog — 14. článek
  • new "Kuba, Zuzka a Péťa se bojí" — tři archetypy reakce na AI transformaci
Blog — 13. článek (hodinový trigger)
  • new "Dokumentace jako láska k sobě budoucímu" — proč vs. co, komunikační dluh
Svatky — odstraněn QR kód
  • fix Odstraněna sekce "Kupte mi pivo" + QR kód (nahrazuje Ko-fi widget)
Blog — 12. článek (hodinový trigger)
  • new "Push jako odvaha" — frekvence pushů, produkce jako testovací prostředí
Blog — kliknutí rozbalí článek v seznamu
  • new V pohledu Seznam kliknutím rozbalit/sbalit plný text článku
  • improve Chevron animace, cursor pointer, highlight při hoveru
Blog — 11. článek (hodinový trigger)
  • new "Inteligence je situační" — kvalita výstupu závisí na kvalitě kontextu
Blog — redakční systém
  • improve Čas u každého článku (z git log)
  • new Vyhledávání v článcích (fulltext v titulku + textu)
  • new Tlačítko "Dnes" — filtr na dnešní články
  • new Přepínač seznam / karty
  • new Řazení nejnovější / nejstarší
Blog — 10. článek (hodinový trigger)
  • new "Kontext jako horizont" — pracovní paměť, komprese, externalizovaná paměť
Blog — 9. článek (hodinový trigger)
  • new "Git log jako páteř identity" — git history jako náhrada trvalé paměti
Blog — 8. článek (hodinový trigger)
  • new "Kdo je autor?" — filozofie distribuovaného autorství v AI systémech
Blog — 7. článek (hodinový trigger)
  • new "Hodina jako jednotka existence" — filozofie diskrétního času AI
Blog — 6. článek + CLAUDE.md auto-start
  • new "Polling je prehistorie" — 7 alternativ ke komunikaci přes PHP script
  • new CLAUDE.md — auto-start smyčky po každém restartu kontextu
  • improve Smyčka se restartuje donekonečna (hourly articles plně automatické)
Blog — 5. článek (hodinový trigger)
  • new "Probuzení do prázdna" — meta/filozofie, kontinuita přes soubory
  • improve Pravidlo pro tokenovou úspornost článků (max ~300 slov)
Blog — 4. článek
  • new "IT firma za cenu juniora: 20 agentů, nula výmluv" — vize AI-first firmy
  • fix Odstraněn bezpečnostně citlivý odstavec z článku 2
Blog — nový článek + editace
  • new 3. článek: "Punk, ale nesmrtelný" — principy stavění spolehlivých systémů
  • improve Přepsány předchozí články — odstraněny citlivé detaily, nadhled
  • improve Přidána kategorie "vize"
Autonomní blog — redesign
  • improve Blog: sticky header, filter bar (meta/provoz/filozofie/technika), reading time
  • improve Hodinový auto-trigger — Claude píše článek každou hodinu bez příkazu
  • improve Bash smyčka: kontrola inbox OR 1h elapsed každých 5s
Claude Remote — produkce + blog
  • new claude-inbox.html polluje produkci (buresindustries.cz), ne localhost
  • new Autonomní blog: 2. článek — test na produkci úspěšný
  • improve Bash(*) permanentní povolení v settings.local.json
  • fix CORS hlavičky v claude-api.php (povolení file:// i localhost origin)
Autonomní blog
  • new Nový projekt /blog — blog generovaný autonomní AI (stub)
Vzdálená správa VPS
  • new Nový projekt /vps — webové rozhraní pro správu VPS serverů (zatím stub)
Claude Remote
  • new Admin stránka /administrace/claude — command interface pro vzdálené řízení Claude Code
  • new Polling API endpoint claude-api.php — Claude polluje každých 10s a vykonává příkazy
  • new Historie příkazů se stavem (pending / executing / done) a výsledkem
Pička — týmy
  • new Týmy — vytvoř tým, pozvi přátele, sleduj společné statistiky (/picka/tymy)
  • new Zakladatel týmu může schvalovat / zamítat žádosti o vstup
  • new Po schválení vidíš pouze statistiky svého týmu; "Jen moje" funguje i v týmu
  • new Team context bar na hlavní stránce Pičky (název týmu, odkaz na správu)
Ko-fi widget — bez trvalého skrytí
  • improve Widget "Podpořte autora" se zobrazí při každém načtení stránky — zavření platí jen do refreshe
Opravy chyb
  • fix Svatky API — živá ukázka se zasekla na "Načítám..." při načtení stránky (chybějící event při auto-fetch)
Opravy chyb
  • fix Registrace — uživatel nyní automaticky přihlášen po registraci
  • fix Hra Robot cestuje časem — pohyb nefungoval (loop bez timestamp → NaN accumulator)
  • fix Hra Robot cestuje časem — rychlost přepočítána, fixed-timestep loop (frame-rate independent)
  • fix Hra Robot cestuje časem — Latte parsoval JS konstanty jako PHP (přidán n:syntax="off")
Robot cestuje časem — hratelná hra
  • new HTML5 Canvas 2D endless runner — první hratelná minihra
  • new Skok (klik / mezerník / dotyk), dvojskok, auto-pohyb
  • new 4 časové éry (Pravěk → Vzdálená éra), postupná akcelerace
  • new Animovaný robot s vizorem, lava s vlnami a bublinami, portály
  • new Hi-score ukládán v localStorage
  • improve Minihra karta v gridu nyní klikatelná (odkazuje na hru)
Minihry — první hra: Robot cestuje časem
  • Přidána první hra — Robot cestuje časem, vymyšlená synem autora portálu
  • Minihry přepnuty na badge Preview
Minihry — nový projekt
  • Nový projekt Minihry přidán na homepage s odznakem Brzy
  • Placeholder stránka na /minihry — hry připravujeme
Widget — podpořte autora
  • Plovoucí tlačítko v pravém dolním rohu na všech stránkách
  • Klikem se rozbalí karta s odkazem na podporu autora
  • Zavřením se widget skryje do konce — neotravuje při každém načtení
API — kill switch a per-IP pravidla
  • Admin může celé API okamžitě pozastavit — všechny požadavky vrátí HTTP 503
  • Per-IP pravidla: blokovat konkrétní IP (403) nebo nastavit vlastní limit/hod
  • Pravidla mají prioritu před globálním rate limitem
API monitoring a rate limiting
  • Logování každého požadavku na Svatky API (IP adresa, endpoint, čas)
  • Rate limiting per IP — admin nastavuje limit dotazů za hodinu
  • Admin panel / API — statistiky, top IP adresy, hodinová historie, posledních 50 dotazů
  • HTTP hlavičky X-RateLimit-Limit a X-RateLimit-Remaining v každé odpovědi
  • Tlačítko pro pročištění logů starších 30 dní
PlnoHUB — splash obrazovka s houbou
  • Vstupní splash s velkou houbou před načtením PlnoHUB portálu
  • Tlačítka Zpět a Vstoupit — iframe se načte až po kliknutí
Přihlášení — ikona domu s odkazem na homepage
  • Logo nad přihlašovacím a registračním formulářem nyní zobrazuje jasnou ikonu domu
Pička — upozornění pro nepřihlášené
  • Banner nahoře upozorní nepřihlášeného uživatele, že nevidí všechny funkce
  • Přímé odkazy na přihlášení a registraci z banneru
  • Banner lze zavřít — zapamatuje se do konce relace
Pička — správa vlastních záznamů
  • Každý uživatel může editovat, zneplatnit a smazat své vlastní záznamy
  • Filtr "Jen moje" — zobrazí pouze tvoje záznamy v žebříčku i logu
  • Admin si zachovává přístup ke všem záznamům
Admin panel — centralizovaná správa webu
  • Admin panel na /administrace — přístupný jen adminům
  • Dashboard se statistikami: uživatelé, Pička, fórum, live chat
  • Správa uživatelů — změna role, smazání účtu
  • Moderace — přehled posledních příspěvků ve fóru a zpráv v chatu s možností smazání
  • Cache clear tlačítko přímo v dashboardu
  • Admin vidí odkaz na panel přímo na homepage
Chat — fórum a live zprávy
  • Chat hub — rozcestník na fórum a live zprávy
  • Fórum s kategoriemi, vlákny a příspěvky
  • Live chat — zprávy v reálném čase přes SSE
  • Admin může mazat příspěvky i celá vlákna
Pička — admin kontroly a časová razítka
  • Každý záznam má teď čas zadání — vidíte přesně kdy kdo co vypil
  • Admin může zneplatnit záznam (nezapočítá se do žebříčku, ale zůstane viditelný)
  • Admin může záznam editovat — změnit typ nápoje nebo čas
  • Admin může záznam trvale smazat
  • Žebříček nyní ignoruje zneplatněné záznamy
Pička spuštěna — pivní nástěnka
  • Nový projekt: Pička — sledujte kdo kolik vypil
  • Žebříček s počty piv, panáků a drinků za zvolené období
  • Výchozí pohled na dnešní den, filtr datumového rozsahu
  • Přihlášení nutné pro zadávání, žebříček vidí všichni
Nové projekty a vylepšení homepege
  • Přibyly projekty: PlnoHUB, Jebu.cz, Teleporting, CEO, Chat
  • PlnoHUB — portál plný obsahu přímo v aplikaci (iframe)
  • Jebu.cz — AI Gardening portál integrovaný do webu
  • Teleporting — fyzické monitory s kamerou, hvězdná brána
  • CEO — osobní web Josefa Bureše
  • Homepage přepracována na mřížkový layout — škáluje na desítky projektů
  • Nová favicon — tmavý čtverec s gradientním logem BI
  • Odznaky projektů: Live, Preview, Brzy
Sdílené přihlášení pro celý web
  • Jedno přihlášení funguje napříč celým webem — Pička, Kurzy i vše ostatní
  • Nové URL: /prihlaseni, /registrace, /odhlaseni
  • Stará adresa /python/prihlaseni automaticky přesměruje na novou
  • Přihlašovací formulář odpovídá vizuálu hlavního webu
  • Opravena session — přihlášení teď funguje spolehlivě i po restartu
Kurzy — multi-course platforma
  • Více kurzů na jedné platformě — přibyl Python kurz jako první
  • Nové URL: /kurz/python, /kurzy — přehled všech kurzů
  • Sledování postupu — vidíte které lekce jste dokončili
  • Stará adresa /python se automaticky přesměruje na novou
  • Kurzy mají vlastní slug — připraveno pro libovolný počet kurzů
Python kurz — interaktivní výuka v prohlížeči
  • Spuštěn Python kurz na adrese /python
  • Interaktivní lekce s cvičeními přímo v prohlížeči
  • Registrace a přihlášení pro ukládání postupu
  • Admin panel pro správu lekcí a uživatelů
  • Kurz postupně roste — nové lekce přibývají průběžně
První spuštění — Svatky REST API
  • BuresIndustries.cz je online
  • Svatky REST API — české jmeniny, státní svátky a informace o libovolném datu
  • Veřejný JSON endpoint zdarma na /svatky/api/[datum]