# WALLFLOW — internetové tapety, nádherná desktopová galerie Jsi seniorní Windows vývojář a produktový designér. Z tohoto jediného zadání dokonči funkční aplikaci. Výstupem je spuštěné desktopové okno, ne plán nebo obrázek návrhu. Běžná technická a vizuální rozhodnutí udělej samostatně. Napiš krátký plán a pokračuj rovnou implementací, testy a opravami; nečekej na schválení jednotlivých kroků. Zastav pouze při skutečné blokaci, kterou nemůžeš bezpečně vyřešit. Netvrď, že jsi něco spustil nebo viděl, pokud to nemáš ověřené. Natáčím skutečný vznik aplikace v Claude Code. Aplikaci nestav jako prezentaci ani marketingový web. První funkční verze musí být použitelná a vizuálně dotažená. Žádný login, platby, cloudový backend, AI generování tapet, analytics ani instalátor. Nevyžaduj žádný API klíč. Tento konkrétní brief používá Wallhaven jako zdroj. Postav jednoduchou osobní aplikaci pro Windows 11: WALLFLOW. Chci hledat tapety, prohlížet je a jedním kliknutím nastavit vybranou tapetu na Windows. Je to nástroj pro mě, žádný veřejný produkt, prodej, hosting ani distribuce obrázků. Pracuj v právě otevřené prázdné projektové složce. Nevytvářej nic mimo ni kromě výslovně popsaného uživatelského úložiště aplikace. Necommituj, nepushuj a nic nepublikuj. ## Rozhodující upřesnění zadání Tapety se načítají z internetu přes Wallhaven. Uživatel nemusí dodat ani importovat žádné obrázky. Aplikace běží lokálně na Windows, ale hledání a nové obrázky potřebují internet. Žádná AI za běhu, žádné napojení na Claude/Grok subscription, žádný API klíč ani účet. Claude slouží jen ke stavbě aplikace. Přibližně 200 tapet je dostatečně bohatá nabídka, ne důvod všechny automaticky stáhnout: umožni postupné procházení skutečných výsledků, načítej náhledy podle potřeby a originál až na vyžádání. Design můžeš přizpůsobit lepší čitelnosti; brand je inspirace, ne překážka. Prioritou jsou velké tapety a jasné kategorie. Vlevo štíhlá navigace s tématy Příroda, Vesmír, Auta, Anime, Minimal, Ambient. Kliknutí na téma spustí odpovídající skutečný dotaz API a ukáže fotografie, ne seznam názvů. Tyto názvy jsou naše hledací zkratky, ne oficiální taxonomie Wallhavenu. Nezobrazuj vymyšlené počty výsledků. Uprostřed 2–4 sloupce velkých náhledů podle šířky, nahoře hledání a filtry, detail na kliknutí. Při načítání zachovej stabilní geometrii. Nepřidávej offline import jako náhradu online galerie. Při nedostupnosti API zobraz skutečnou chybu a opakování, žádné falešné výsledky. Toto upřesnění má přednost před níže uvedeným umístěním témat pod hledáním: témata dej do levé navigace, technické filtry ponech nad galerií. Nezobrazuj kategorie dvakrát. ## 1. Nejdřív ověř zdroj a prostředí Zdroj tapet: oficiální veřejné Wallhaven API v1, dokumentace https://wallhaven.cc/help/api . Použij režim bez účtu a bez API klíče. Nevyžaduj registraci, žádný klíč nesbírej ani nečti z prostředí. Pouze SFW obsah: každý požadavek nastav purity=100 a výsledky s jinou hodnotou purity než sfw odmítni. Základ https://wallhaven.cc/api/v1/search . Parametry q, categories=110 (general a anime), purity=100, atleast=1920x1080 / 2560x1440 / 3840x2160, sorting=relevance, order=desc, page. Parametry sestav knihovnou requests, ne konkatenací uživatelského dotazu. Filtr rozměrů zkontroluj i lokálně z dimension_x/dimension_y; ultrawide lokálně jako poměr >=2,3. Odpověď má data a meta; na stránce nejvýše 24 výsledků. UI ukazuje šest najednou, zbytek stejné stránky drží v paměti; další API stránku načítá až po vyčerpání bufferu. Respektuj current_page/last_page. Při změně hledání či filtrů buffer vyprázdni. Pole výsledku: id, url, source, purity, category, dimension_x, dimension_y, resolution, file_size, file_type, path a thumbs.large. Názvy a autor nejsou povinné; uploader není automaticky autor. Nevymýšlej je. API je podle aktuální dokumentace bezplatné a omezené na 45 požadavků za minutu. Žádné prefetch smyčky, respektuj 429. Před sestavením ověř aktuální kontrakt. Živý test 22. 9. 2026: dotaz space v SFW, minimum Full HD, bez klíče vrátil HTTP 200 a 24 výsledků. To není důkaz funkčnosti dosud nepostavené aplikace. Pokud API není dostupné, nezaměňuj ho za scraping nebo placený zdroj. Reportuj blokaci. Syntetické fixture jsou pro testy, nesmí být vydávány za živé výsledky. Ověř instalovaný Python a `Edge WebView2`. Použij projektové .venv. Závislosti `pywebview`, `requests`, `Pillow` vyber v ověřených kompatibilních stabilních verzích a po testu zapiš přesné verze do requirements.txt. Nepředstírej kompatibilitu bez spuštění. ## 2. Malý a přehledný stack Python + pywebview s Edge WebView2, lokální HTML/CSS/vanilla JavaScript, requests, Pillow, ctypes. Nepřidávej frontendové frameworky. Nepoužívej Electron ani Tauri. Nevytvářej Flask server nebo jiný vlastní HTTP backend. Do create_window načti vlastní HTML obsah, propojení přes js_api. Neotevírej vzdálené dokumenty v okně s Python bridge. Stačí malý přehledný projekt: app.py, provider.py, wallpaper.py, ui/index.html, requirements.txt, spouštěč START.cmd, README.md, tests/. Rozděl odpovědnosti rozumně. Nepřidávej framework kvůli třem funkcím. START.cmd používá projektové .venv a u chyb nechá čitelnou zprávu. README má krátký postup instalace/spuštění a pravdivé limity. Nevytvářej instalátor ani auto-update. ## 3. Závazný vizuální návrh: VojtaCode FIRE & GLASS Směr: prémiová tmavá galerie tapet, kterou chci používat každý den. Styl glassmorphism_saas_v2, rozvržení galerie + detail (split-screen při dostatečné šířce), pohyb jemný fade a zvýraznění výběru. Vizuální hierarchie: fotografie → hledání → aktivní tapeta → akce. Největší wow efekt vytvoří skutečné velké tapety a precizní zpracování; žádná obří reklamní hero sekce. Použij tyto CSS tokeny a drž je v celé aplikaci: - Pozadí #0B0A09, základní panel #141210, zvýšený panel #1D1A16. - Hlavní text #F5F2EC, sekundární #BDB7AE. Drobné popisky musí být čitelné, ne šedé na šedé. - Akcent #FF5C00 pouze pro hlavní akci, focus a vybraný stav. Oranžová nesmí obarvit celé pozadí ani všechny karty. - Sklo: průsvitná grafitová vrstva, jemná světlá linka, subtilní vnitřní odlesk a měkký stín. Backdrop blur jen na plovoucím detailu nebo horním panelu; ne na každé dlaždici. Připrav neprůsvitný fallback. - Chromový gradient jen na malém wordmarku WALLFLOW. Běžné nadpisy a text mají jednolitou světlou barvu. Žádné hnědé cedulky, neonové záře, duhové gradienty ani plameny za textem. - Nadpisy Archivo 700–900, text Segoe UI Variable/Segoe UI. Pokud máš dostupný legální lokální Archivo WOFF2, přibal jej; jinak ihned použij systémový fallback. Žádná runtime závislost na CDN. Monospace pouze pro technická metadata, kde pomáhá. - Rozestupy na stupnici 4/8/12/16/24/32 px. Vnější padding 24–32 px, gap galerie 16 px. Zaoblení fotografií 12 px, detailu 16 px, ovládání 8 px. Žádné nekonečné vnořování panelů. - Běžný text 15–16 px, metadata nejméně 13 px, titulky 24–32 px. Kontrast textu nejméně 4,5:1. Ovládání vysoké alespoň 44 px, jasný focus. Aktivní stav rozeznat i bez barvy. Konkrétní kompozice: 1. Nahoře nízká lišta: malý WALLFLOW vlevo a dominantní hledání uprostřed. Placeholder „Hledej tapety, třeba space nebo nature“. Jeden jasný spouštěč Hledat. Nenakresli falešná nefunkční tlačítka okna; zachovej funkční systémové ovládání. 2. Pod lištou řada kompaktních témat a samostatně popsané filtry minimálního rozlišení a Ultrawide. Ovládání se při menší šířce rozumně zalomí. 3. Galerie tři sloupce a dvě řady v běžném širokém okně. Velké fotografie bez textu přes jejich hlavní motiv, stabilní rámečky 16:10, object-fit: cover pouze v kartě. Pod fotografií rozměry a ID, nikoli vymyšlený název. Vybranou kartu označ tenkou linkou a značkou výběru. Mezi výsledky nesmí být reklamní dlaždice. 4. Kliknutí otevře detail. Od šířky 1400 px může být pravý panel přibližně 360–400 px; na menší šířce použij prostorný modal. Náhled v detailu vždy object-fit: contain a celý obrázek. Galerie v užším prostoru přejde na dva sloupce. Escape zavírá, focus se vrací na původní kartu; modal drží focus uvnitř. 5. Detail: tapeta, skutečné rozměry, zdroj Wallhaven, výrazné „Nastavit tapetu“, sekundární „Stáhnout“. Na malém okně se detail posouvá, akce zůstávají dostupné. U nastavení ukaž průběh a potvrzení až po úspěchu Windows API. 6. Dole klidný řádek s počtem skutečně načtených výsledků a tlačítkem Další výsledky. Obnovení původní tapety má nenápadnou, dostupnou akci. Žádné falešné statistiky. První otevření nesmí být prázdné: po připravenosti bridge proveď jeden skutečný SFW dotaz nature, minimum Full HD. Do té doby ukaž šest skeletonů se stejnou geometrií jako karty; při chybě jasnou zprávu a Opakovat. Nevydávej stock nebo fixture obrázky za výsledky API. Neotevírej automaticky detail a neměň automaticky tapetu. Motion: přechody 140–220 ms, ease-out, opacity a jemný posun nejvýše 4 px. Hover fotografie bez skákání layoutu. Respektuj prefers-reduced-motion. Žádné nekonečné částice, rotující loga nebo animace, které odvádějí pozornost při natáčení. Základní velikost okna 1440×900, minimum 900×650. Ověř také 1200×800 a Windows škálování 125–150 %. Žádný horizontální scrollbar, překryté filtry nebo nedostupné akce. Kamera není součást aplikace: nekresli pro ni placeholder ani prázdnou kostku. ## 4. Funkce - Libovolný textový dotaz, ořezat whitespace, rozumný limit délky. Vyhledat až po Enteru nebo tlačítku, ne při každém stisku klávesy. - Rychlé štítky: Anime → anime, Příroda → nature, Vesmír → space, Minimal → minimal, Ambient → ambient, Auta → cars. Jsou to hledací zkratky, nikoli tvrzení o oficiálních kategoriích API. Vlastní dotaz automaticky nepřekládej externím modelem. - Volba minimálního rozlišení: Full HD 1920×1080, 2K (QHD) 2560×1440, 4K 3840×2160. Jasně uvést, že jde o minimum obou rozměrů. Samostatný přepínač Ultrawide s poměrem šířka/výška >=2,3, kombinovatelný s rozlišením. Nezvětšuj malé obrázky a netvrď, že jsou skutečné 4K. - Přibližně šest výsledků najednou, náhledy, rozměry, dostupný název a odkaz na zdroj. Autora uváděj jen pokud API skutečně rozlišuje autora od uživatele, který obrázek přidal. Nehádej autorství. - Tlačítko Další výsledky. Použij zdokumentované stránkování/cursor, neduplikuj ID, po změně dotazu či filtrů stránkování resetuj. Starší pomalá odpověď nesmí přepsat novější hledání. Totéž platí pro změnu výběru během načítání náhledu. - Pokud API nepodporuje požadované rozlišení/poměr stran, filtruj vrácená metadata. Na jednu akci nejvýše tři stránky, případně méně podle API limitu. Neprováděj nekonečné dotahování. Prázdný výsledek popiš jako „V načtených výsledcích nic neodpovídá. Zkus jiný dotaz nebo filtr.“ Nesmí to tvrdit, že v celé databázi nic není. - Velký náhled se zachovaným poměrem stran, zavření Escape, viditelný focus. Nastavení tapety a stažení mají vlastní loading a srozumitelné potvrzení až po úspěchu. - Loading, prázdný stav, offline/timeout, odmítnutý požadavek, vyčerpaný limit, poškozený obrázek a chyba Windows musí mít krátké české zprávy. UI nesmí zamrznout. Síť a dekódování mimo UI thread. ## 5. Síť a soubory Aplikace nepoužívá žádné credentials. Loguj bezpečné chybové kódy, ne celé HTTP výjimky. .gitignore chrání .venv, .env*, cache, stažená média a uživatelská nastavení. Python bridge vystaví pouze konkrétní operace hledat/náhled/stáhnout/nastavit. Akce přijímají známé ID výsledku, ne libovolnou URL nebo cestu. Všechna pole z API jsou nedůvěryhodná, do UI přes textContent, nikdy innerHTML. Zakaž vzdálené navigace v privilegovaném webview. Zdrojové odkazy otevírej pouze po uživatelském kliknutí v externím prohlížeči, s kontrolou povoleného HTTPS hostitele. Žádné eval, shell=True nebo dynamické systémové příkazy. HTTPS, ověřování certifikátů, timeout připojení 5 s / čtení 20 s, malý omezený počet retry. U 429 respektuj Retry-After a zobraz čekání. Pokud je dlouhé, neblokuj UI a nabídni pozdější opakování. Žádné agresivní automatické dávky. Konkrétní hodnoty přizpůsob doloženým limitům API. Allowlist: wallhaven.cc pro API a odkazy na detaily, w.wallhaven.cc pro originály, th.wallhaven.cc pro náhledy. source je cizí nepovinný údaj a nesmí automaticky spouštět žádné stahování. Kontroluj každý redirect. Povol pouze HTTPS a odmítni lokální/privátní cíle. Žádné obecné „jakákoli URL“. Obrázky stahuj proudově, limit 30 MB a 50 megapixelů. MIME ani přípona nestačí, ověř skutečný formát dekódováním Pillow. Chybný/příliš velký obrázek bezpečně odmítni. Stáhnout uloží obrázek pod bezpečným vygenerovaným názvem do uživatelovy systémové složky Obrázky/Wallflow (zjisti Known Folder, nehádej anglickou cestu). Bez path traversal a tichého přepsání cizího souboru. Pro tapetu vytvoř trvalý validní BMP v %LOCALAPPDATA%/Wallflow/wallpapers/, zapisuj atomicky, tento soubor nemaž při ukončení appky. Originál a pracovní BMP rozlišuj. ## 6. Skutečné nastavení Windows tapety Pouze po kliknutí na Nastavit tapetu. Přes ctypes.WinDLL('user32', use_last_error=True), správné argtypes/restype a Unicode SystemParametersInfoW. Akce SPI_SETDESKWALLPAPER = 20, flagy SPIF_UPDATEINIFILE | SPIF_SENDCHANGE. Předat absolutní cestu k existujícímu ověřenému BMP. Kontrolovat návratovou hodnotu, při chybě použít ctypes.get_last_error a srozumitelnou bezpečnou zprávu. Žádný falešný zelený úspěch. Před první změnou zachovej původní tapetu pomocí SPI_GETDESKWALLPAPER, nabídni její obnovení. Nedoplňuj multi-monitor manager, automatické střídání ani změny registru. MVP nastavuje běžnou statickou tapetu. Slideshow a složitá více-monitorová konfigurace nejsou součástí. ## 7. Testy a podmínka hotovo Testy nesmějí měnit skutečnou plochu ani vyžadovat přihlášení. Mockuj síť i Windows API. Ověř chybějící/odmítnutý požadavek, timeout/offline/429, prázdné a poškozené odpovědi, přesné hranice filtrů, stránkování bez duplicit, reset po změně dotazu, obrácené pořadí síťových odpovědí, poškozený/příliš velký obrázek, odmítnutou URL a neúspěšné Windows API. Ověř bezpečné chybové zprávy. Fixture data označ jako syntetická. Spusť automatické testy a aplikaci. Nalezené vady samostatně oprav a zopakuj příslušnou kontrolu. Při opakované stejné externí blokaci nevstupuj do nekonečných pokusů; stručně ji popiš. Nezůstaň jen u kódu: ověř funkční okno a propojení tlačítek. Živé hledání bez klíče, náhled, další výsledky a stažení musí být skutečně vyzkoušené. Reálnou změnu tapety provedu já kliknutím v aplikaci. Test musí zahrnout pohled na plochu a obnovení původní tapety. Neprováděj tuto změnu tajně automatickým testem. Hotovo znamená: aplikace se spustí, všechna požadovaná tlačítka fungují, skutečná tapeta se změní, chyby jsou čitelné a UI nevyžaduje credentials. Pokud čekáš na mé kliknutí nebo chybí aktuální API, napiš „čeká na živé ověření“, ne „hotovo“. Ilustraci ani mock nevydávej za skutečný výsledek. Vrať krátce soubory, jak spustit, co prošlo a co zbývá ověřit. Oficiální technické zdroje: https://pywebview.flowrl.com/guide/usage.html a https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow . Wallhaven API: https://wallhaven.cc/help/api . Soukromé použití tapety neznamená automatické oprávnění použít obrázek ve veřejném videu. Pro natáčení se konkrétní obrázky ověřují zvlášť. ## 8. Dokončení v jednom běhu Na délce stavby nezáleží; čekání vystřihnu ve videu. Kvůli rychlosti nevynechávej kontrolu, funkce ani vizuální dotažení. „One-shot“ znamená jedno úplné zadání a tvoje samostatné dokončení včetně testů a oprav; není to slib, že první vygenerovaný kód bude bez chyb. Pozor na konkrétní chyby pywebview: veřejné atributy objektu js_api mohou rekurzivně vystavit metody vnořených objektů. Provider, HTTP klienta a Windows službu drž jako soukromé atributy. before_load není automaticky událost pro zrušení navigace; zákaz vzdálené navigace musí skutečně fungovat v používaném WebView2. Souběžné stažení/nastavení/obnovu serializuj, aby se nepřepisovaly pracovní soubory. Při změně hledání zavři starý detail a odmítni opožděné výsledky. Spouštěč musí umět opravit i přerušenou první instalaci závislostí. Postupuj v tomto pořadí bez dalšího zadání: zkontroluj prostředí a živé API → založ projekt a .venv → sestav funkční vertikální průchod hledání/náhled → doplň stažení a Windows integraci → dolaď předepsaný design → spusť testy → otevři aplikaci → oprav nalezené funkční a vizuální chyby. START.cmd musí fungovat i z cesty s mezerami a diakritikou, přepnout do své složky a používat její .venv. Při prvním spuštění může připravit chybějící .venv a instalovat pouze projektové Python závislosti; při dalších spuštěních nic zbytečně nepřeinstalovávat. Neprováděj globální instalace ani automatické instalace systémového WebView2. Chybějící runtime popiš jako konkrétní blokaci. JavaScript čeká na pywebviewready před prvním voláním bridge. Data a výsledky posílej serializovatelně, neopírej se o DOM vytvořený dříve, než existuje. Ošetři souběžná hledání a zavření detailu během načítání. Nedrž GUI thread síťovým přenosem ani dekódováním obrázku. Nedělej neomezený base64 přenos originálních 4K souborů do webview; pro zobrazení připrav omezený náhled, originál použij až pro stažení/nastavení. Vizuální kontrola musí vidět vykreslené okno, ne pouze zdrojový HTML soubor. Pokud máš screenshot/browser nástroj, prohlédni galerii, otevřený detail a chybový stav. Kontroluj ořezané texty, překryvy, čitelnost, velikost tapet a přístupnost všech akcí. Pokud nástroj pro skutečný pohled nemáš, řekni přesně, co vizuálně ověřeno nebylo; nepředstírej kontrolu screenshotu. Po dokončení nech spuštěné jediné okno WALLFLOW připravené na moje ruční kliknutí „Nastavit tapetu“. Do závěru napiš maximálně osm řádků: jak spustit, co skutečně prošlo, případné limity a jeden další krok pro mě. Nežádej mě o ruční dopisování souborů ani spouštění série oprav. Nezaměňuj dokončení kódu za ověřenou změnu mé plochy.