{
    "schema": "eupdate-package-specification-v1",
    "author": "PB <pavel.bartos.pb@gmail.com>",
    "project_id": "15b70c7d025661ed",
    "software_id": "eloader",
    "software": "eLoader",
    "module": null,
    "release_id": "0c35193b4ae6df96ab6d5e56f86a96d6",
    "version": "1.22.0",
    "release_date": "2026-09-16",
    "published_at": "2026-09-16T15:42:30+00:00",
    "bytes": 49357852,
    "sha256": "5e08ee54850691d4da9fca31c6d143a7fcd24bd1b8b27ff061c95b80ec1b6636",
    "file_count": 1620,
    "languages": {
        "PHP": {
            "bytes": 5183664,
            "files": 728
        },
        "HTML": {
            "bytes": 213323,
            "files": 259
        },
        "Python": {
            "bytes": 59799,
            "files": 4
        },
        "CSS": {
            "bytes": 56967,
            "files": 3
        },
        "JavaScript": {
            "bytes": 20608,
            "files": 2
        },
        "SQL": {
            "bytes": 1036,
            "files": 1
        },
        "Shell": {
            "bytes": 134,
            "files": 1
        }
    },
    "installation_url": "https://update.estudium.eu/package.php?software_id=eloader&version=1.22.0",
    "update_url": "https://update.estudium.eu/package.php?software_id=eloader",
    "install_json": {
        "software": "eLoader",
        "software_id": "eloader",
        "version": "1.22.0",
        "release_date": "2026-09-16",
        "description": {
            "cs": "Společné prostředí pro aplikace: přihlášení, oprávnění, instalace aplikací a modulů, eUpdate autoupdate a CZ/EN mail templater. JSON úložiště jádra a automatické aktualizace knihoven přes Composer.",
            "en": "Shared application environment: sign-in, permissions, application and module installation, eUpdate autoupdate and CZ/EN mail templater. JSON core storage and automatic Composer dependency updates."
        },
        "author": {
            "name": "PB",
            "email": "pavel.bartos.pb@gmail.com",
            "website": ""
        },
        "compatibility": {
            "os_types": [
                "source"
            ],
            "os_versions": [],
            "distribution_ids": [],
            "distributions": [],
            "native_windows_supported": false,
            "native_macos_supported": false,
            "any_linux_distribution": false
        },
        "documentation": {
            "readme": "README.md"
        },
        "archive_metadata": {
            "working_directory": ".",
            "publisher": "dcf6d41fbcdf0e16",
            "updated_at": "2026-09-16T15:42:30+00:00",
            "application_author": "PB <pavel.bartos.pb@gmail.com>"
        },
        "installation": {
            "web_root": "public",
            "commands": {
                "linux": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "windows": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "macos": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "other": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "source": {
                    "command": null,
                    "supported": false,
                    "mode": "manual"
                }
            }
        },
        "license": "custom",
        "license_custom": "eLoader: Copyright (c) 2026 PB. All rights reserved. Bundled third-party libraries retain their original licenses; see THIRD-PARTY.md.",
        "package": {
            "type": "release",
            "target": "hosting"
        },
        "requirements": {
            "php": ">=8.2 <9.0"
        },
        "eloader": {
            "api": 1,
            "data_schema": 1,
            "launcher_api": 1,
            "persistent_paths": [
                "var"
            ],
            "core_update": "atomic-private-release-pointer",
            "auto_update_endpoint": "https://update.estudium.eu/package.php?software_id=eloader",
            "storage": "json",
            "storage_schema": 1,
            "composer_autoupdate": {
                "enabled_by_default": true,
                "time": "03:45",
                "activation": "private-release-pointer",
                "constraints": "composer.json",
                "scripts": false,
                "plugins": false
            },
            "app_directory": "../app",
            "app_layout_version": 2,
            "html_themes": [
                "academic-blue",
                "b-w",
                "ea"
            ],
            "auto_update_project": "https://update.estudium.eu/pavel852/eloader",
            "checkin": {
                "schema": "eupdate-checkin-v1",
                "endpoint": "/check/",
                "enabled_by_default": true,
                "interval_hours": 24,
                "includes": [
                    "applications",
                    "modules"
                ]
            },
            "shared_messaging": [
                "email",
                "sms",
                "signal",
                "whatsapp",
                "custom-gateways"
            ],
            "centrallog": {
                "storage": "sqlite",
                "path": "var/sendlog.sqlite",
                "schema": 2,
                "retention_days_default": 30
            },
            "shared_databases": {
                "mysql": "pdo_mysql",
                "pgsql": "pdo_pgsql",
                "couchdb": "curl"
            },
            "shared_shell": [
                "workspace",
                "navigation",
                "submenu",
                "header",
                "footer"
            ],
            "database_assignment_sources": [
                "installed",
                "eupdate-saved"
            ]
        },
        "project": {
            "website": ""
        },
        "homepage": ""
    },
    "readme": "# eLoader 1.22.0\n\n## Odkazy eUpdate a nabídka modulů\n\n- **Aplikace a moduly → Instalovat z eUpdate:** lze vložit instalační odkaz nebo odkaz `download.php?project=…&module=…&secret_id=…`. U neveřejného modulu vyberte jeho nainstalovanou rodičovskou aplikaci (např. isEDU). eLoader přes metadata dohledá identifikátor modulu, rozpozná typ a uloží stabilní instalační zdroj. Při veřejném rodiči jej může zjistit automaticky z katalogu. Pro neveřejnou samostatnou aplikaci bez zjistitelného názvu projektu použijte instalační odkaz `package.php?software_id=…`.\n- **SecretID** z URL se převede do šifrovaného úložiště a při komunikaci se předává hlavičkou `X-Project-Secret`. V uložené URL ani v rozhraní nezůstává. Uvedete-li jiný klíč současně v odkazu i poli SecretID, formulář oznámí rozpor. Prázdné pole při úpravě stejného zdroje zachovává uložený klíč.\n- Po uložení stiskněte **Ověřit verzi**, následně instalaci spusťte a potvrďte v náhledu. Odkazy s konkrétním vydáním se ukládají jako zdroje dalších kompatibilních verzí. Samotné uložení odkazu nebo výběr v katalogu nespouští ZIP ani nemění databázi aplikace.\n- **Dostupné moduly aplikací:** u nainstalované aplikace je odkaz do nabídky modulů. Seznam se po otevření načte automaticky, podle aplikace, PHP a verze eLoaderu. Ukazuje popis, poslední kompatibilní verzi, datum, nainstalovanou verzi a režim zdarma/licence. Tlačítko **Vybrat modul** založí zdroj pro obvyklé ověření a instalaci.\n- Veřejný katalog eUpdate nezveřejňuje soukromé moduly. Soukromý modul přidejte jednou vlastním odkazem a SecretID; uložený zdroj se potom zobrazí také v přehledu aplikace. Klíč aplikace se nepředává jiným modulům. Placený modul potřebuje vlastní přístupové údaje nebo licenci.\n- Katalog se načítá samostatným požadavkem až po zobrazení stránky, s cache 15 minut a tlačítkem obnovení. Vzdálený požadavek neblokuje PHP relaci. Při výpadku zůstane ruční zadání odkazu i poslední získaný seznam dostupný.\n- Opraveno rozlišení interního ID eUpdate, identifikátoru modulu v ZIPu a názvu rodiče v publikovaném manifestu. Ověření zachovává kontrolu rodiče, typu, verze, velikosti a SHA-256 před aktivací.\n\nPro tuto opravu aktualizujte pouze eLoader přes **Aktualizace → Nahrát ZIP jádra**. isEDU 0.3.7 a Document Server 0.1.1 jsou kompatibilní. Nastavení, účty, MySQL a nainstalované aplikace zůstávají zachované. Nic se automaticky nepublikuje na eUpdate ani nenasazuje na produkci.\n\n# 1.21.0\n\nSdílené mPDF 8.3.1 a QR; centrální služba pro explicitně publikovaná PDF a veřejný katalog bez workspace. Kontroly instalačních závislostí modulu.\n\n# eLoader 1.20.1\n\n## Oprava v 1.20.1\n\nOpravené popisky na obrazovce **Vyberte účet**. Obecné CSS pro zadávání PINu omylem skrývalo také záhlaví formulářů s názvem aplikace, rolí, ID a stavem účtu. Skrývání se nyní vztahuje pouze na duplicitní záhlaví samotného ověřovacího formuláře PINu. Výběr zobrazuje například **eLoader · Superadmin**, **isEDU · Student** a **isEDU · Lektor / učitel**, včetně ID; dlouhé popisky se zalamují.\n\nStačí aktualizovat eLoader a znovu otevřít přihlášení. isEDU 0.3.5 zůstává kompatibilní; změna nevyžaduje databázovou migraci ani import. Verze v URL společného CSS se mění na 1.20.1, aby prohlížeč načetl opravený styl.\n\n## Nové v 1.20.0\n\n- **Nastavení → Prostředí → Řádků na stránku:** společná hodnota, výchozí **100**, povolený rozsah 1–1000. Používají ji tabulky eLoaderu, CentralLog, auditní události, jazykový editor a isEDU 0.3.5. SDK poskytuje `Context::pageSize()`. Velikost importních dávek ani exporty se tím nemění.\n- **Přihlašování → Zdroje účtů:** stav přihlášení aplikací, přiřazení MySQL, přepínače pověření a ověření ID/e-mailu/telefonu bez odeslání PINu. Diagnostiku může používat pouze správce eLoaderu; neposkytuje nové přihlášení ani nemění jeho relaci.\n- Aplikace může v instalačním manifestu deklarovat výchozí nativní přihlášení přes `login.json`. isEDU 0.3.5 tuto deklaraci obsahuje, takže chybějící samostatné pověření již nevyřadí její aktivní účty z hledání. **Výslovně uložené vypnutí správcem má přednost.** Přidělení databáze zůstává povinné; emailové SSO se automaticky nepovoluje. Náhled instalace tuto deklaraci zobrazí.\n\nNejdříve aktualizujte eLoader, potom isEDU na 0.3.5. Pokud je v přehledu zdrojů u isEDU „Vypnuto · Nastaveno správcem“, povolte přihlašování právě tam. Proveďte kontrolu ID `2007` nebo svého e-mailu; uvidíte přesně nalezené účty. Pro běžné přihlášení a výběr role používejte hlavní formulář PINu. Nouzové heslo nadále přihlašuje pouze správce eLoaderu.\n\n## Opravy v 1.19.1\n\n- Opravená cílová adresa uploadu, pokud formulář obsahuje skryté pole `action`. Průběh uploadu nyní používá skutečnou adresu formuláře. Aplikační JSON požadavky dostanou konkrétní chybu i při neplatném CSRF, vypršení přihlášení nebo překročení PHP POST limitu.\n- Běžné přihlášení PINem vždy hledá ve všech pověřených zdrojích. Shodné ID, e-mail či telefon nabídne výběr účtu; starý odkaz s předvolenou aplikací ani odeslaný filtr jej neomezí. Formulář vypisuje prohledávané zdroje.\n- Workspace se na přihlašovacích obrazovkách ani nepřihlášeným uživatelům nevykresluje. Odhlášení vede přímo na nový login; návrat uloženou stránkou prohlížeče znovu ověří relaci.\n\nNejdříve aktualizujte eLoader na 1.19.1, potom isEDU na 0.3.4 a znovu otevřete stránku importu. Databázové schéma se nemění. Pro výběr student/učitel používejte hlavní formulář PINu. Nouzové heslo je výslovně určeno pouze správci eLoaderu.\n\nPokud isEDU není mezi vypsanými zdroji přihlášení, v **Aplikace a moduly → Nainstalované aplikace → isEDU → Pověření k přihlašování** povolte **Pověřit aplikaci přihlašováním** a ověřte její přiřazení MySQL. Dříve zakázané zdroje aktualizace sama nepovoluje.\n\nAutor programu: **PB <pavel.bartos.pb@gmail.com>** — shodně s eUpdate. Vydání: 16. 9. 2026.\n\nSpolečné prostředí pro instalaci a spouštění aplikací. Obsahuje CZ/EN rozhraní, výsuvnou levou nabídku, společné přihlášení, správu superadminů, SMTP/SMS, mail templater a instalaci/aktualizaci aplikací i modulů ze ZIPu nebo z eUpdate. Jádro má vlastní automatické aktualizace z eUpdate.\n\n## Nové v 1.19.0\n\n- Přihlášení rozlišuje neexistující, neaktivní a aktivní účet. Shodný e-mail, telefon nebo ID ve více aplikacích či v přímých tabulkách nabídne jako samostatné účty. PIN se odešle až po výběru.\n- isEDU rozlišuje přihlášení jako student a jako lektor/učitel. Nový student s `active=0` nejdříve dostane upozornění a samostatné tlačítko k ověření a aktivaci. Aktivní profily mají `active=1` a povolené přihlášení.\n- Výběr i PIN se vážou na konkrétní identitu, její ověřovací kontakty a přidělenou databázi. Po změně účtu nebo spojení je nutné zahájit přihlášení znovu. Rozpracované přihlášení ze starší verze vyžaduje nový PIN; uložené denní PINy bez vazby se při novém odeslání obnoví.\n- Společný JavaScript poskytuje skutečný průběh multipart uploadu; isEDU 0.3.3 jej využívá pro SQLite. Procenta a MiB patří přenosu, následuje samostatná kontrola a náhled k ručnímu importu.\n\nInstalujte nejdříve tento eLoader, potom isEDU 0.3.3. Podrobnosti: [přihlášení](docs/MYSQL-LOGIN.md), [SDK](docs/SDK.md). Aktualizace nevyžaduje změnu JSON datového schématu jádra.\n\n## Oprava v 1.18.2\n\nDiagnostický ZIP obsahuje také posledních nejvýše 1 000 aplikačních událostí z CentralLogu. Runtime doplňuje skutečné PHP limity nahrávání a stav dočasného adresáře. Pokud CentralLog nelze přečíst, zbývající diagnostika se stáhne s výslovným označením této chyby. Obsah odeslaných zpráv se do diagnostických událostí nepřidává.\n\n## Novinky v 1.18.1\n\nNastavení má v hlavním i aplikačním menu systémové kolečko a pravé zarovnání. Společný drag & drop mohou používat také aplikace, například import SQLite v isEDU 0.2.2. [SDK](docs/SDK.md)\n\n## Novinky v 1.18.0\n\n- U každého databázového spojení jsou checkboxy aplikací, včetně uložených zdrojů v **Aplikace a moduly → Instalovat z eUpdate**. Připravená vazba začne fungovat až po instalaci aplikace. Jedna aplikace má jedno spojení pro každý typ databáze. Pokročilý formulář pro vlastní název databáze zůstává dostupný.\n- Menu a submenu aktivní aplikace vykresluje eLoader, společně s workspace, hlavičkou a patičkou. SDK přijímá jen položky povolené aktuálnímu uživateli. isEDU 0.2.1 tuto možnost používá.\n- Tlačítka aplikací ve workspace jsou užší, respektují šířku panelu a zalamují dlouhé názvy.\n- **Odinstalovat** nejdříve zobrazí aplikaci, její moduly a přesné MySQL tabulky. Po potvrzení ID aplikace zálohuje tabulky a odstraní pouze její prefix. Kód a lokální data přesune mimo aktivní aplikace do soukromé zálohy. CentralLog zůstává zachovaný. [Podrobnosti a obnova](docs/UNINSTALL.md).\n\nNejdříve aktualizujte eLoader, potom isEDU. Databázové schéma isEDU zůstává ve verzi 2; import je stále pouze ruční. Opravy localhost, diagnostiky MySQL a ZIP aktualizací z 1.17.2 jsou zachované.\n\n## Oprava v 1.17.2\n\n- Menší tlačítka aplikací ve workspace (výchozí minimální výška 28 px) s přirozeným zalomením delších názvů a zachovaným rámečkem/animacemi.\n- U aplikace s deklarovaným centrálním MySQL připojením, například isEDU, se chybějící přiřazení řeší přímo při otevření: výběr profilu → **Otestovat, přiřadit a pokračovat**. Jeden dostupný profil je předvybraný, přístup vzniká až potvrzením a úspěšným testem.\n- Nepřiřazené aplikace jsou vidět také v přehledu databází. [Postup pro isEDU](docs/APP-DATABASE.cz.md).\n\n## Oprava v 1.17.1\n\n- Nové MySQL/MariaDB profily začínají s **localhost + Automaticky dle PHP**; uložené profily se nemění.\n- Chyba MariaDB **1130** má vlastní CZ/EN vysvětlení včetně nastavení lokálního spojení v eWebu. Původní kód, SQLSTATE a očištěná odpověď serveru zůstávají i v záznamu `database.test.failed`.\n- Doplněná nápověda rozdílu `localhost` / `127.0.0.1` a metod připojení. [Postup při chybě 1130](docs/DATABASE-1130.cz.md).\n- Konfiguraci spojení upravuje správce výslovně; instalace této opravy nepřepíná hostitele ani nepřiděluje databázová oprávnění.\n\n## Novinky v 1.17.0\n\n- **Aktualizace → Aktualizace eLoaderu:** přetažení ZIPu nebo výběr souboru, následné prověření a samostatné potvrzení aktualizace jádra. Není potřeba uložený eUpdate odkaz. [Postup](docs/ZIP-UPDATE.cz.md).\n- Zobrazení názvu a velikosti, srozumitelné chyby výběru, verze před/po aktualizaci a návrat bez instalace. Všechny tři vzhledy, oddělené CZ/EN soubory.\n- Vychází z přiložené **1.16.0**; zachovává přímé zdroje přihlášení `login.json` schématu 2 a `Context::theme()`.\n\n## Novinky v 1.15.0\n\n- **Databázová připojení:** název databáze se ukládá přímo s účtem a používá se při testu. U každého řádku je **Odstranit spojení**, u přiřazení aplikaci **Odstranit přiřazení**. Výmaz konfigurace neprovádí žádný příkaz na databázovém serveru.\n- **MySQL/MariaDB:** výslovná volba TCP nebo Unix socketu, automatický výchozí port při změně typu a konkrétní diagnóza chyb ovladače, přístupu, názvu databáze, sítě či TLS. [Postup a návod](docs/DATABASES.cz.md).\n- **Aplikace a moduly → Instalovat z eUpdate:** tabulka trvale uložených zdrojů s odkazem a šifrovaným secretID. **Ověřit verzi → Instalovat / Aktualizovat**, přehled instalované a dostupné verze, úprava nebo odstranění zdroje. [Návod](docs/INSTALLATION-SOURCES.cz.md).\n\n## Novinky v 1.14.0\n\n- Kořenový `login.json` aplikace deklaruje tabulky, sloupce a podmínky přihlášení. Používá již existující centrálně přidělenou databázi MySQL/MariaDB a ověřování PINů eLoaderu.\n- SDK doplňuje `databaseConfigured()`, `packageInfo()` a `moduleInfo()` pro první zprovoznění a správu modulů isEDU. Existující Composer, CentralLog, databázové profily včetně PostgreSQL/CouchDB a jejich nastavení zůstávají zachované.\n- Podrobnosti: [MYSQL-LOGIN.md](docs/MYSQL-LOGIN.md).\n\n## Novinky v 1.13.0\n\n- **Nastavení → Composer a knihovny:** verze Composeru, skutečně instalované balíčky, jejich verze, datum vydání a známé datum instalace/změny. Kontrola, aktualizace všech nebo jednoho balíčku, přidání knihovny a automatické aktualizace. Požadavky vyřizuje hostingový cron v izolované kopii. [Návod](docs/COMPOSER.cz.md).\n- **Diagnostika → CentralLog:** původní Sendlog rozšířený o obecné události aplikací, závažnost a filtr kategorie. Historie zpráv, hledání, řazení, počet dní a samostatný výmaz zůstávají zachované. [Návod a SDK](docs/CENTRALLOG.cz.md).\n- **Nastavení → Databázová připojení:** centrální účty MariaDB/MySQL, PostgreSQL a CouchDB, přidělení databáze jednotlivým aplikacím a **Testovat spojení u každého účtu**. Výsledek včetně identity testujícího je v CentralLogu. Údaje založené v eWebu vyplní superadmin; eLoader je automaticky nezískává. [Nastavení a SDK](docs/DATABASES.cz.md).\n\n## Novinky v 1.12.0\n\n- **Nastavení → Sendlog – odeslané zprávy:** samostatný SQLite přehled odesílání e-mailu, SMS, Signalu, WhatsApp a vlastních bran, včetně aplikací, modulů, testovacích tlačítek a přihlašovacích PINů.\n- Záznam obsahuje čas, ID a jméno odesílajícího uživatele, zdroj účtu, aplikaci, příjemce, kanál, poskytovatele, druh zprávy, šablonu/jazyk, předmět, běžný text a výsledek s odpovědí služby. PIN ani jeho tělo se neukládají.\n- Hledání, kombinované filtry uživatele/aplikace/kanálu/výsledku/dat, řazení oběma směry a stránky po 50 záznamech. Uchování 1–3650 dní, výchozí 30; samostatný potvrzený výmaz.\n- Nový požadavek: **PHP `pdo_sqlite` pro web i cron**. Účty a nastavení jádra zůstávají v JSON; nový soubor je privátní `var/sendlog.sqlite`. Existující aktualizace databázi zachová. Podrobnosti: [SENDLOG.cz.md](docs/SENDLOG.cz.md).\n\n## Novinky v 1.11.0\n\n- **EA · Evropská akademie** je třetí volitelný vzhled podle dodané modrožluté předlohy: tmavě modré záhlaví a hlavní panely, teplé žluté akcenty, zaoblené karty a světlé pracovní plochy. Vyberte jej v **Nastavení → Prostředí a vzhled**. Má vlastní složku `html/ea/` se stejnými názvy HTML souborů jako další vzhledy; zpracování zůstává přes `tmpl_open()`. Logo je nadále volitelné.\n- **Uspořádání stránek ve všech třech vzhledech:** souhrnné boxy, seskupené formuláře, tabulky aplikací a superadminů, testovací panel vedle nastavení brány, menší formulářové akce, rozbalovací technické podrobnosti a přehlednější profil. Logy mají hledání, filtr oblasti/chyb a stránkování. Po chybě formulář znovu zobrazí běžné vyplněné hodnoty, ale ne hesla.\n- **Zprávy → Doručování e-mailů:** posledních 50 pokusů, dohledávací štítek `el-…`, server, doména příjemce, stav a rozbalovací odpověď SMTP. Podklady až pro 100 pokusů lze stáhnout jako JSON. Přehled čte stávající logy; po jejich výmazu se také vyprázdní.\n- **SMTP oprava a diagnostika:** návrat `false` se už nemůže zapsat jako úspěšné odeslání. Log nově rozlišuje fázi selhání, uchovává parametry vyjednaného TLS a délky HTML/textové části bez jejich obsahu. Převzetí SMTP se výslovně nezaměňuje za konečné doručení. Existující profily a hesla se zachovávají; při otevření SMTP se zobrazí aktivní profil, nový přidáte samostatnou volbou.\n\n**Stav hlášeného nedoručení:** analyzovaný export obsahuje tři přijetí zprávy serverem Boldem s `250 Ok`, bez chyby SMTP. Příčina následného nedoručení v něm není uvedená. Nový přehled poskytne štítky pro dohledání v účtu poskytovatele; podrobnosti jsou v [SMTP-DIAGNOSIS.cz.md](docs/SMTP-DIAGNOSIS.cz.md). Nelze tvrdit, že aktualizace sama vyřeší případnou blokaci nebo odmítnutí po převzetí.\n\nPřehled jednotlivých úprav: [UX-REVIEW.cz.md](docs/UX-REVIEW.cz.md). Ověření: [VALIDATION.md](VALIDATION.md).\n\n## Novinky v 1.10.0\n\n- **Signal nahradil Viber:** vlastní nastavení, zapnutí na loginu, samostatné CZ/EN šablony a tlačítko Otestovat. Přes HTTPS bránu signal-cli-rest-api se posílá skutečný PIN eLoaderu; log obsahuje stav a redigovanou odpověď serveru. Postup a konfigurace Docker/Nginx jsou v [tools/signal-gateway/README.cz.md](tools/signal-gateway/README.cz.md). Samostatnou službu a propojení účtu je potřeba zprovoznit na serveru.\n- **Volitelné logo:** Nastavení → Logo přihlášení. PNG, JPEG nebo WebP do 2 MiB; logo lze odebrat. Bez loga se přihlášení zobrazí jako dosud. Ukládá se do privátního `var/login-logo.json` a zůstává zachované při aktualizaci.\n- **Společné zprávy pro aplikace a moduly:** SDK `Context::messages()`, `mail()`, `sms()` a `signal()` využívá stejné poskytovatele jako eLoader. Přihlašovací PIN lze doručit i přes WhatsApp. Kontroluje se oprávnění kanálu a všechny pokusy se v logu přiřazují aplikaci. Aplikace nepřidávají vlastní SMTP/API konfiguraci. Podrobnosti a příklady: [SDK](docs/SDK.md).\n- **Workspace:** rámeček po vysunutí, zaoblené rohy, vrstvený stín, plynulejší otevření, světelný přechod a postupné zobrazení položek. Zachované zavření klávesou Escape, práce s fokusem a omezení pohybu.\n\nViber není v novém rozhraní ani v odesílání. Stará privátní konfigurace zůstává neaktivní pro případ návratu na původní vydání; nepřevádí se na Signal. Změny jiných přihlašovacích metod zůstávají zachované.\n\n## Menu a přihlašování\n\n| Hlavní nabídka | Podnabídka |\n| --- | --- |\n| Přehled | Dostupné aplikace |\n| Aplikace a moduly | Nainstalované aplikace, Nahrát ZIP, Instalovat z eUpdate |\n| Přihlašování | Způsoby přihlášení, PIN a relace, Superadministrátoři |\n| Zprávy | E-mail / SMTP, Doručování e-mailů, SMS, Signal, WhatsApp, E-mailové šablony, Šablony SMS a Signal, Vlastní brány |\n| Aktualizace | eLoader, Check-in do eUpdate, Plánovač / cron |\n| Nastavení | Prostředí a vzhled, Logo přihlášení, Composer a knihovny, Databázová připojení, Jazyky a překlady, Přidat jazyk |\n| Diagnostika | Události a doručování, CentralLog, Historie check-inů, PHP a prostředí, Odesílání logů do eWeb, Stažení a výmaz logů |\n| Můj profil | Vlastní kontakt, ID, jazyk a záchranné heslo superadministrátora |\n\nKaždé podmenu zobrazí vybraný panel. E-mailový editor má výběr šablony a jazyka uvnitř panelu; editor překladů vlastní výběr jazyka. Obě lišty se zalamují a horní cesta odpovídá aktivní sekci, například **eLoader | Zprávy | Signal**. Původní adresy `?page=settings&panel=smtp`, `…&panel=channels` a další zůstávají funkční.\n\n**Přihlašování → Způsoby přihlášení** obsahuje jednotlivé přepínače e-mailu, SMS, Signalu, WhatsAppu a všech uložených vlastních bran. Nabídka existuje i před konfigurací a uvádí její stav. Na loginu jsou pouze povolené metody s připraveným poskytovatelem; stav „nastaveno“ vychází z uložených údajů, nikoli z ověření účtu u poskytovatele. U e-mailu je potřeba aktivní SMTP profil. Je-li e-mail dostupný, zůstává výchozí. Vypnutí blokuje i přímé nové žádosti o PIN a nemaže přístupové údaje. Platné PINy a existující relace zůstávají podle původní doby platnosti.\n\nTlačítkem Otestovat lze ověřit uloženého poskytovatele i před zapnutím metody na loginu. Záchranné heslo superadministrátora zůstává dostupné, také při vypnutí všech metod PIN. Původní nastavení e-mailu/SMS a zapnutých bran se převezmou.\n\nNávody: [Signal a další kanály](docs/PIN-CHANNELS.cz.md), [WhatsApp](docs/WHATSAPP.md). Změny ověřeny v [VALIDATION.md](VALIDATION.md).\n\n## SMTP, SMS, logy a panely\n\n- **Zprávy → E-mail / SMTP**: formulář přidává pojmenované profily do tabulky pod ním. První profil se aktivuje automaticky; další aktivujte tlačítkem **Používat pro odesílání**. Aktivní je právě jeden. Odkaz **Upravit SMTP** načte konkrétní profil. Původní nastavení se při aktualizaci převede včetně šifrovaného hesla.\n- **Zprávy → SMS**: přímé **BulkGate transakční API v1** s Application ID/token a volbou typu i hodnoty odesílatele. Podporuje gSystem, gShort, gText, gMobile, gPush, gOwn a gProfile. Zachován vlastní HTTPS adaptér. **Přímé SMS.cz není implementováno: chybí ověřená dokumentace jeho API pro odesílání.**\n- **Diagnostika → Odesílání logů do eWeb**: zapněte předávání, zadejte HTTPS adresu přijímajícího eWebu a hostname instalace. Cron nabídne připojení; v eWebu schvalte odpovídající ID a otisk. Tlačítko **Odeslat nabídku / čekající logy** provede stejný krok ručně. Předávání je při první instalaci vypnuté.\n- **Provozní záznamy**: zaznamenávají SMTP pokusy/výsledky/chyby, SMS a ostatní auditní události. Submenu **Poslední 3 check-iny** zobrazuje skutečné odesílané obsahy včetně stavu a počtu pokusů. Opakovaný pokus aktualizuje tentýž záznam. Starší reporty před 1.6.0 se nevytvářejí zpětně.\n- **Stažení a výmaz**: ZIP obsahuje všechny dosud uchované události a tři check-iny. Výmaz s potvrzovacím políčkem smaže místní události, historii i čekající frontu do eWebu. Již přijaté vzdálené kopie a dřívější zálohy se tím nemažou.\n- Druhá lišta **přepíná samostatné panely** pomocí `?page=settings&panel=smtp` apod. Ostatní panely se na stránce nevykreslují. Totéž platí pro aktualizace, balíčky, logy a přidání jazyka. Horní lišta zobrazuje cestu, například **eLoader | Zprávy | E-mail / SMTP**. Obě nabídky se dále zalamují.\n\nPodrobné nastavení a protokoly: [DELIVERY-LOGS.md](docs/DELIVERY-LOGS.md). Přehled ověření: [VALIDATION.md](VALIDATION.md).\n\n## Další ovládání\n\n- Jazyk rozhraní přepnete také URL parametrem `?lang=en`, `?lang=cs` nebo `?lang=cz`. Funguje i spolu s `page` a dalšími parametry. Volba platí pro relaci a nemění výchozí jazyk profilu. Neznámý jazyk se ignoruje. Přidané jazyky jsou dostupné stejným způsobem i v horním přepínači.\n- Na přihlášení jsou přes celou šířku formuláře přepínací tlačítka. E-mail je předvolený; SMS se objeví s nastavenou a zapnutou bránou, WhatsApp a další kanály s odpovídajícím adaptérem. Odstraněn popisek „Doručení PINu“ a úvodní věta pod nadpisem.\n- **Přihlašování → Způsoby přihlášení** řídí nabídku všech metod. Poskytovatele nastavíte v menu Zprávy. Nativní WhatsApp používá Twilio, vlastní HTTPS brány mají samostatný panel a protokol `to` / `message`.\n- V panelu **Aktualizace → eLoader** jsou nahoře obě tlačítka **Zkontrolovat aktualizace** a **Aktualizovat**. Bez uloženého zdroje mají vysvětlení a jsou neaktivní. Po uložení zdroje je dostupná kontrola; aktualizace se zpřístupní pro nalezené novější vydání.\n- Hlavní menu se zalamuje do dalších řádků. Submenu je ve druhé liště s menšími zaoblenými tlačítky a také se zalamuje. Výška lišt se přizpůsobí obsahu; zůstávají pod pevnou 30px horní lištou. Nastavení ve workspace otevírá menší zaoblený čtverec se vystředěnou ikonou.\n\n### Editor jazyků\n\nSuperadmin otevře **Nastavení → Jazyky a překlady**. Vybere jazyk v panelu editoru, vyhledá klíč nebo text a uloží změny na zobrazené stránce (nejvýše 40 textů). Formulář **Přidat jazyk** vyžaduje kód, název a zdrojový jazyk, jehož texty zkopíruje. Překlady nového jazyka doplníte v editoru. Kód může být například `de`, `fr` nebo `en-gb`.\n\nDodané katalogy zůstávají oddělené v `lang/cz.json` a `lang/en.json`. Úpravy a nové jazyky se ukládají do trvalých `var/lang/<kód>.json` (čeština `var/lang/cz.json`) a přežijí aktualizaci jádra i Composeru. Nové texty přidané pozdějším vydáním mají výchozí překlad, i když soukromá úprava ještě neexistuje. Editor kontroluje původní proměnné ve složených závorkách a odmítne přepsání mezitím změněného katalogu.\n\n### Proměnné v e-mailových šablonách\n\nVlevo od editoru je sloupec dostupných proměnných: `{name}`, `{pin}`, `{expires}`, `{app_name}`, `{site_name}`, `{site_url}`, `{message}` a `{action_url}`. Najeďte myší nebo přejděte klávesnicí na tlačítko pro popis. Proměnnou lze přetáhnout do předmětu, HTML či textu nebo kliknutím vložit na uloženou pozici kurzoru. Vkládá se doslovná symbolika; skutečné údaje se doplní při odeslání.\n\nTyp e-mailu vybírá druhá lišta a jazyk samostatný přepínač **Jazyk e-mailové šablony**. Nový jazyk může mít vlastní soubory v `var/mail/`; do první úpravy používá anglickou výchozí šablonu. Parametr `mail_lang` volí jazyk šablony, zatímco `lang` přepíná společné rozhraní. Před náhledem uložené šablony proveďte uložení.\n\n## Požadavky\n\n- PHP **8.2–8.x**, Linux, PHP CLI a PHP-FPM pod stejným uživatelem hostingu.\n- Rozšíření: `zip`, `curl`, `mbstring`, `dom`, `openssl`, `sodium`, `tokenizer`, `ctype`, `phar`, `iconv`, `pdo_sqlite`.\n- Povolené `proc_open` pro oddělenou kontrolu nového vydání. Knihovny jsou přibalené; na produkci není potřeba spouštět Composer.\n- HTTPS. Zapisovatelná soukromá složka pro stav aplikace; veřejný kořen pouze `public/`.\n- Pro upload nastavte `upload_max_filesize=64M`, `post_max_size=70M`, `memory_limit=256M` a odpovídající limit Nginxu. Instalátor omezuje ZIP na 64 MiB a rozbalený obsah na 128 MiB.\n- Jádro používá soukromý `var/core.json` se zámkem a atomickými zápisy. Od 1.12.0 používá samostatný sendlog SQLite a vyžaduje `pdo_sqlite` při běžném provozu. Jednorázový převod staré instalace vyžaduje `pdo_sqlite`; ukázková Demo Notes používá vlastní SQLite. Databáze připojených aplikací jsou samostatné.\n\n## Nejrychlejší instalace do eWebu\n\nBalíček nejprve rozbalte **mimo veřejnou webovou složku**, například do pracovního adresáře doménového uživatele. Následující příkazy spouštějte pod uživatelem konkrétního hostingu.\n\nMáte-li doménový adresář s existujícími složkami `web/` a `private/`, použijte:\n\n```bash\nphp bin/install-hosting.php /cesta/k/adresari-domeny https://vase-domena.cz\n```\n\nVeřejná složka `web/` musí být prázdná. Instalátor existující web nepřepíše. Kód uloží do `private/eloader/`, trvalá data do `private/eloader/var/` a do `web/index.php` vloží veřejný vstup. Aplikace a jejich moduly patří do `private/app/`, vedle sourozenecké složky `private/eloader/`. Příkaz vypíše počáteční přístup a přesný příkaz pro cron.\n\nOtevřete doménu a rozbalte **Záchranné přihlášení superadmina**. Počáteční login je **`admin`**, heslo **`admin`**. První přihlášení otevře povinné dokončení profilu: předvyplněné jméno Pavel Bartoš, e-mail pavel.bartos.pb@gmail.com a login admin. Údaje můžete změnit; telefon doplňte v mezinárodním formátu pro SMS. Nové záchranné heslo musí mít nejméně **11 znaků**. Dokud počáteční heslo nezměníte, administrace zůstane na profilu. Existující účty se při aktualizaci nepřepisují ani nevracejí na admin:admin.\n\nBěžné přihlašování probíhá **PINem přes e-mail nebo SMS**. Nastavte SMTP/SMS a v **Mail templateru** ověřte doručování. Heslo je záchranný přístup pouze pro superadmina. Profil později otevřete kliknutím na jméno v horní liště nebo přes **Můj profil**.\n\n### Jiný hosting nebo přímé nasazení původního ZIPu\n\nZachovejte **celý obsah ZIPu**, nastavte document root na jeho `public/` a spusťte:\n\n```bash\nphp bin/console.php init https://vase-domena.cz\n```\n\nObsah distribučního ZIPu patří do složky `eloader/`. Inicializace vytvoří `eloader/var/` a sourozeneckou složku `app/`, tedy relativně k jádru `../app/`. Rodičovský soukromý adresář musí umožňovat její vytvoření. ZIP zůstává přímo použitelný pro eUpdate, s install.json v kořeni. Při přímém nasazení se nová instalace inicializuje i automaticky při první návštěvě domény. CLI umožní základní HTTPS adresu zadat výslovně. Alternativní umístění určuje `ELOADER_DATA`; pak musí mít PHP-FPM i cron stejnou hodnotu. Samotné zkopírování obsahu `public/` nestačí, protože jádro a knihovny musí zůstat dostupné mimo webový kořen.\n\n## Publikování v eUpdate 1.7.8+\n\nNahrajte distribuční ZIP jako hlavní program projektu **eLoader**, identifikátor **`eloader`**. Kořen archivu obsahuje připravený `install.json`:\n\n| Nastavení | Hodnota |\n| --- | --- |\n| Autor | PB, pavel.bartos.pb@gmail.com |\n| Verze | 1.7.0 |\n| `package.type` | `release` |\n| `package.target` | `hosting` |\n| `installation.web_root` | `public` |\n| `archive_metadata.working_directory` | `.` |\n| OS | Zdrojový kód / nezávislé na OS |\n| PHP | `>=8.2 <9.0` |\n| Licence jádra | Vlastní; text v `LICENSE` |\n\nDo nastavení aktualizací lze vložit přímo adresu projektu:\n\n```text\nhttps://update.estudium.eu/pavel852/eloader\n```\n\nKlient přijímá projektový odkaz i `https://update.estudium.eu/package.php?software_id=eloader`. Projektové odkazy převádí na metadata `package.php` podle globálně jedinečného software_id; u jádra vždy vyhledává nejnovější kompatibilní vydání. Dodání ZIPu samo nepublikuje vydání 1.7.0 do produkčního eUpdate.\n\nPrvotní automatické nasazení z rozhraní eWebu vyžaduje, aby jeho hostingový instalátor zachoval celý zdrojový strom a nastavil správný veřejný kořen. Pokud jeho export kopíruje jen `public/`, použijte výše uvedený `install-hosting.php`. Tento balíček nemění program eWeb.\n\n## Automatické aktualizace eLoaderu\n\n1. V **Aktualizace eLoaderu** uložte `https://update.estudium.eu/pavel852/eloader`. U neveřejného projektu doplňte SecretID.\n2. Uložení zapne automatické kontroly. Předvolba je každou **hodinu**; lze zvolit 15 minut, 1 hodinu, 6 hodin nebo 24 hodin. První kontrola proběhne při nejbližším cronu, případně tlačítkem **Zkontrolovat aktualizace**.\n3. Novou verzi nainstalujete tlačítkem **Aktualizovat**. Volba **Autoinstall** dovolí instalaci automaticky při kontrole; předvolba je nezaškrtnuto. U starého nastavení se zachová dosavadní povolení automatické instalace.\n4. Do cronu hostingu vložte přesný příkaz z rozhraní, například:\n\n```cron\n*/5 * * * * /usr/bin/php /cesta/k/adresari-domeny/private/eloader/bin/console.php cron\n```\n\nPoužívá se stejný cron jako pro Composer. Bez cronu neběží automatické kontroly ani check-in. Uložení formuláře nečeká na síť. Kontrola načte pouze metadata, ZIP se stáhne teprve při instalaci. Ruční instalace znovu ověří, že vydání i SHA-256 odpovídají zkontrolované nabídce. Změněné vydání vyžaduje novou kontrolu. Prázdný uložený zdroj kontroly vypne. Výsledek a poslední běh cronu jsou viditelné v rozhraní.\n\nOvěřuje se instalační cíl, identita, vyšší verze, PHP, závislosti aplikací, velikost a SHA-256, bezpečný obsah ZIPu a kontrola PHP v odděleném procesu. Nový kód vznikne v soukromém adresáři; aktivuje se atomickou změnou ukazatele. Neprovádí se příkazový skript z `installation.commands`.\n\nZůstává předchozí kód, dva konzistentní JSON snímky jádra a veškerá trvalá data. Tlačítko návratu jádra vypne autoinstall a automatické aktualizace Composeru; kontroly nových verzí mohou pokračovat. Aktualizace, která neprojde kontrolou, se neaktivuje. Verze 1.6.0 zachovává SDK/data API 1 a launcher API 1; formát úložiště jádra je `json`, `storage_schema: 1`. Návrat k vydání, které rozumí pouze SQLite, je odmítnut. Destruktivní migrační háky odmítá.\n\nNávrat přes CLI:\n\n```bash\nphp bin/console.php rollback eloader\n```\n\nVydání jádra běží pod stejným uživatelem hostingu. Výchozí veřejný vstup a `bootstrap.php` tvoří stabilní launcher; aktualizace jeho rozhraní nebo datového schématu vyžaduje samostatně připravené vydání. Starší adresáře vydání jsou uchovány; průběžně sledujte volné místo. Pro více uzlů/cluster tato verze nemá distribuovaný instalační zámek.\n\n## Check-in do eUpdate\n\nVýchozí stav je zapnuto. Při nejbližším cronu se odešle check-in do `/check/` nastaveného serveru eUpdate. Další se odesílá po 24 hodinách nebo po změně verze jádra či inventáře aplikací/modulů. Náhled obsahu, poslední výsledek, vypínač a ruční zařazení do fronty jsou v **Aktualizace eLoaderu**.\n\nObsahuje stabilní ID instalace, doménu, verzi eLoaderu/PHP/php-templates a instalované aplikace i moduly s verzemi a stavem zapnuto/vypnuto. Neobsahuje účty, kontakty, hesla, aplikační data ani místní cesty. Ověřovací klíč se posílá pouze v hlavičce `X-Checkin-API-Key` a lokálně se ukládá šifrovaně. Opakovaný pokus po chybě používá stejné ID hlášení, aby se záznam nezdvojil. Výpadek přijímače má odstupňované opakování a neblokuje kontrolu aktualizací.\n\n```bash\nphp bin/console.php checkin:preview\nphp bin/console.php checkin:send\n```\n\n`checkin:send` je výslovné ruční odeslání i při vypnuté automatice. Stav licence „pending“ neznamená chybu přijetí check-inu. Neměňte identitu ani šifrovací klíč stávající instalace.\n\n## Samostatné CZ/EN a jazyk profilu\n\nTexty společného rozhraní jsou v **`lang/cz.json`** a **`lang/en.json`** se stejnými klíči. Oba HTML vzhledy používají tyto katalogy; texty se neduplikují do HTML ani do JavaScriptu. Načítání HTML a e-mailových šablon nadále používá `tmpl_open(...)`. E-mailové šablony mají samostatné soubory `resources/mail/*.cs.json` a `*.en.json`; vlastní uložené úpravy zůstávají ve `var/mail/`.\n\nKaždý přihlášený uživatel i superadmin otevře **Můj profil** kliknutím na jméno v horní liště a uloží **Výchozí jazyk**. Volba se použije ihned, při dalším přihlášení a pro přihlašovací e-mail. Horní přepínač CZ/EN mění jazyk aktuální relace. Preference běžného účtu je oddělená podle zdrojové aplikace a ID účtu; shodný e-mail v jiné aplikaci ji nesdílí. Neuděluje administrační práva. Bez vlastní volby se použije jazyk účtu z aplikace, u superadmina výchozí jazyk prostředí. V HTML, relaci a SDK zůstává standardní kód češtiny `cs`, který se mapuje na soubor `cz.json`.\n\n## Převod existujícího eLoaderu na JSON\n\nPři prvním spuštění 1.1.0 se existující `core.sqlite` automaticky převede na `core.json`. Účty, ID, hashe hesel, SMTP/SMS tajemství, PINy, pověření aplikací, balíčky i audit zůstanou zachovány. Nastavení identity a šifrovací klíč nadále patří do `config.json`; relace zůstávají standardními PHP soubory v `sessions/`.\n\nMigrace vytváří samostatný snímek `backups/legacy-sqlite-*.json`. Původní SQLite ponechá čitelnou a zablokuje v ní další zápisy, aby dobíhající stará verze nevytvářela odlišný stav. Poškozený JSON se nikdy automaticky nenahradí prázdnými daty. Obnova přerušené migrace používá připravený soubor a uložený SHA-256.\n\nPo aktualizaci lze migraci vyvolat i přes CLI:\n\n```bash\nphp bin/console.php storage:migrate\n```\n\nBěžný rollback je určen pro vydání podporující JSON. Návrat na 1.0.0 po migraci by vyžadoval plánovanou obnovu celé předmigrační zálohy a ztratil by novější změny; automatický návrat na SQLite je proto blokován.\n\n## Automatické aktualizace knihoven přes Composer\n\n**Ve výchozím nastavení zapnuté, denně v 03:45** podle časového pásma eLoaderu. Platí i pro migrované instalace bez uložené volby. Běží ve stejném pětiminutovém cronu jako eUpdate. V **Aktualizace eLoaderu → Composer** lze automatiku vypnout, změnit čas a naplánovat ruční aktualizaci na příští cron. Stav posledního běhu a verze knihoven jsou na stejné stránce. Vypnutí aktualizací jádra nevypíná Composer.\n\nComposer je přibalený v `tools/composer.phar`. Aktualizuje závislosti v rozsahu `composer.json`: php-templates `^2.6.1`, latex `^3.3`, PHPMailer `^6.12`; hlavní verze knihoven tedy automaticky nepřeskakuje. `composer.lock` obsahuje přesné verze tohoto distribučního vydání. Samotný nástroj Composer se obměňuje s vydáním eLoaderu.\n\nAktualizace běží v soukromé pracovní kopii s vypnutými skripty a pluginy. Ověří požadavky aplikací, PHP syntaxi, Composer autoload a renderování šablon. Po kontrole aktivuje nové vydání atomickým ukazatelem a ponechá předchozí kopii. Při chybě zůstávají běžící knihovny i data zachovány. Kvůli načítání PHP tříd se Composer po právě dokončené aktualizaci jádra spustí až při dalším cronu.\n\n```bash\nphp bin/console.php composer:check   # vyřeší a otestuje knihovny, bez aktivace\nphp bin/console.php composer:update  # vyřeší, otestuje a aktivuje knihovny\n```\n\nWebové tlačítko pouze zařadí práci do cronu, takže nečeká na síťové operace Composeru v PHP-FPM. Hosting potřebuje odchozí HTTPS k Packagistu a distribučním archivům GitHubu a dostatek místa na pracovní kopii. Cron musí být skutečně nastaven; samotné zapnutí volby jej na serveru nevytvoří.\n\n## Přihlašování a oprávnění\n\n- V eLoaderu lze zadat **e-mail, login nebo ID** (u superadmina také uložený telefon) a zvolit zdroj účtu. Automatické hledání používá eLoader a pověřené nainstalované aplikace. Při více shodách vyžaduje konkrétní zdroj.\n- Společné prostředí vede vlastní **superadminy**. Běžné účty a jejich role/práva zůstávají u příslušných aplikací.\n- Aplikaci musí superadmin v **Aplikace a moduly → Přihlášení a pověření** výslovně pověřit přihlašováním. Instalace sama toto pověření neuděluje.\n- Přihlášení lze zahájit přímo pro pověřenou aplikaci odkazem `/?page=login&app=identifikator`. Vlastní přihlašovací obrazovka aplikace může vést na stejný společný vstup; nemá nastavovat relaci sama.\n- Běžný účet musí být aktivní, mít přidělenou roli a oprávnění `app.access` nebo `*`. Vstup do aplikace a její operace kontrolují aktuální práva na serveru.\n- Sdílené přihlášení podle ověřeného e-mailu je samostatná volba superadmina pro každou aplikaci. Ve druhé aplikaci musí existovat aktivní účet s vlastními právy. Shodný login či číselné ID účty nespojují.\n- Superadmin má přístup do celého prostředí a aplikací. Aplikační role se na superadmina eLoaderu nepovyšuje.\n- PIN má výchozí délku **4 číslice**, je stejný do konce kalendářního dne podle nastaveného časového pásma. Lze změnit délku i časovou platnost. PINy jsou chráněné proti hádání; záznamy neobsahují jejich otevřené hodnoty.\n- Relace platí výchozích **24 hodin od přihlášení**. Prodloužení nenastává při každém kliknutí. Změna délky se projeví u nových přihlášení.\n\n## Vzhled a workspace\n\nV **Nastavení → Prostředí a vzhled** vyberte **Academic Blue · modrý**, **B-W · světlý černobílý** nebo **EA · Evropská akademie**. Výběr ihned ukáže barevný náhled; tlačítkem Uložit jej nastavíte pro prostředí. Starší volby Academy a Mono se načtou jako odpovídající nové vzhledy.\n\nHTML šablony aktuálního jádra jsou rozdělené do `html/academic-blue/`, `html/b-w/` a `html/ea/`. Všechny tři složky obsahují stejnou sadu názvů HTML souborů, včetně layout.html, login.html, profile.html a eloader-menu.html. Render vybírá soubory podle uloženého vzhledu a používá `tmpl_open(...)`. Složka templates/ už není součástí nového jádra. CSS a JavaScript zůstávají v resources/assets/; e-mailové šablony samostatně v resources/mail/ a var/mail/.\n\nWorkspace slouží k **přepínání mezi dostupnými aplikacemi**. Na levém okraji zůstává půlkruhová bublina se třemi čárkami, pulzováním a animovaným vysunutím nabídky šířky 154 px. Dole má superadmin čtvercový ovladač se zaoblenými rohy s ozubeným kolem. Ten zavře workspace a vyvolá menu eLoaderu pod horní lištou, aniž opustí právě otevřenou aplikaci.\n\nNabídka eLoaderu má vodorovná menutlačítka: přehled, aplikace a moduly, přihlašování, zprávy, aktualizace, nastavení, diagnostika a můj profil. Na stránkách jádra je viditelná; při otevření aplikace se schová a znovu ji vyvolá ovladač nastavení. Tlačítka se na úzkém displeji zalamují do dalších řádků; submenu má vlastní druhou lištu. Křížek nebo Escape nabídku zavře. Základní horní lišta je vysoká **30 px** a zůstává pevně nahoře i při posouvání. Klávesnice a omezení animací jsou podporované.\n\n## Aplikace a moduly\n\nV **Aplikace a moduly** přetáhněte ZIP nebo vložte instalační odkaz z eUpdate. Nejprve se zobrazí kontrola balíčku; až poté potvrďte důvěru vydavateli a instalaci. Všechen instalovaný PHP kód běží s právy uživatele hostingu; aplikace nejsou bezpečnostně izolované kontejnery.\n\nSkutečný kód se ukládá do `app/<aplikace>/releases/<verze-hash>/`; moduly do `app/<aplikace>/modules/<modul>/releases/<verze-hash>/`. `app/` je na stejné úrovni jako `eloader/`, na eWeb hostingu tedy `private/app/`. Zůstává tam i při aktualizaci jádra nebo Composeru. Cesta je uložená jako `app_root` v `var/config.json`. Trvalá data zůstávají ve `var/app-data/<aplikace>/`.\n\nPři prvním přechodu na 1.3.0 se dosavadní aplikace i historie návratů zkopírují ze staré `eloader/app/` (nebo starších `var/releases/`) do sourozenecké `app/`. Po ověření všech kopií se v jediné JSON transakci přepnou cesty. Původní kopie zůstanou zachované. Dostupnost místa a právo zápisu do `app/` jsou podmínkou převodu.\n\nAplikace potřebuje eLoader SDK vstup; obyčejná samostatná PHP aplikace se přejmenováním cíle nestane integrovanou aplikací. Přiložený `hosting-example-app-1.2.0.zip` posloužil jako vzor hostingového manifestu, nikoli jako nativní eLoader aplikace.\n\n- `examples/demo-notes-1.0.0.zip`: ukázková aplikace, účty viewer/editor, oddělená data a práva.\n- `examples/demo-summary-1.0.0.zip`: modul pro tuto aplikaci.\n- Zdrojové podoby ukázek jsou také v `examples/`.\n\nPostup: nainstalujte Demo Notes, jako superadmin je otevřete a vytvořte zkušební účet. Pověřte aplikaci přihlašováním. Nastavte SMTP a vyzkoušejte PIN e-mailem, loginem i ID. Pak přidejte Demo Summary. Žádné zkušební účty se automaticky nevytvářejí.\n\nPro placený modul lze použít SecretID nebo údaje už schválené licencované identity eUpdate: Server ID, hostname a check-in API klíč. Při požadavku se používají hlavičky `X-Project-Secret`, `X-Server-ID`, `X-Server-Hostname`, `X-Server-Checkin-Key`. eLoader odesílá vlastní check-in, ale přijetí hlášení samo neuděluje licenci k placenému modulu. Licenci schvaluje správce eUpdate.\n\n## Mail templater CZ/EN\n\nObsahuje zvlášť český a anglický předmět, HTML a textovou variantu pro PIN, uvítání a oznámení. Uložené šablony mají náhled a test odeslání přes SMTP. Před náhledem upravenou šablonu uložte. HTML editor odstraní aktivní obsah a nepovolené atributy. PIN šablona musí mít `{pin}` v HTML i textu.\n\nProměnné: `{name}`, `{pin}`, `{expires}`, `{app_name}`, `{site_name}`, `{site_url}`, `{message}`, `{action_url}`.\n\nŠablony UI i e-mailů používají **`tmpl_open(...)`** z publikované Composer verze `pavel852/php-templates` **2.6.1**. Dynamické hodnoty pro HTML se escapují. Přibalená knihovna pochází z Composeru bez lokálních změn.\n\nSMTP podporuje více uložených profilů, jeden aktivní, STARTTLS a implicitní TLS. BulkGate má přímý klient transakčního API v1 s kontrolou `data.status=accepted` a ID zprávy. Vlastní SMS brána používá HTTPS POST JSON `{\"to\":\"+420...\",\"message\":\"...\"}` a volitelný Bearer token; očekává HTTP 2xx. Pro jiné protokoly je potřeba dokumentovaný adaptér.\n\n## Provoz a další dokumentace\n\n- `docs/SDK.md`: kontrakt aplikací, rolí a modulů.\n- `docs/OPERATIONS.md`: soubory, zálohy, aktualizace a obnova přístupu.\n- `VALIDATION.md`: provedené kontroly a hranice ověření.\n- `README.en.md`: English quick start.\n\nPřed ostrým použitím ověřte doručování na vaší SMTP/SMS bráně a jeden instalační/aktualizační cyklus na testovací doméně s vaší verzí eWebu a eUpdate.\n\n\nVydání 1.16.0 vychází z 1.15.0 a doplňuje pouze přímé zdroje identit (`login.json` schema 2) a předání vzhledu aplikacím. Postup aktualizace eLoaderu se nemění. isEDU 0.2.0 vyžaduje tento doplněk; svou MySQL migraci potvrdíte samostatně v isEDU.",
    "download_url": "https://update.estudium.eu/download.php?project=15b70c7d025661ed&release=0c35193b4ae6df96ab6d5e56f86a96d6",
    "package_target": "hosting",
    "requirements": {
        "php": ">=8.2 <9.0"
    },
    "license": {
        "id": "custom",
        "name": "Vlastní",
        "custom_text": "eLoader: Copyright (c) 2026 PB. All rights reserved. Bundled third-party libraries retain their original licenses; see THIRD-PARTY.md."
    },
    "deployment": {
        "archive_root": ".",
        "web_root": "public"
    },
    "project_type": "application",
    "hosting": null
}