{
    "schema": "eupdate-package-specification-v1",
    "author": "PB <pavel.bartos.pb@gmail.com>",
    "project_id": "15b70c7d025661ed",
    "software_id": "eloader",
    "software": "eLoader",
    "module": null,
    "release_id": "dec0f1e3cbac95880c52edcd7ed716f2",
    "version": "1.3.0",
    "release_date": "2026-09-12",
    "published_at": "2026-09-12T19:28:36+00:00",
    "bytes": 1146927,
    "sha256": "3d3b76ed68f1f98d06324393fd4115ba73b2952f71d2e1764a4a576c8ebca42f",
    "file_count": 234,
    "languages": {
        "PHP": {
            "bytes": 672294,
            "files": 111
        },
        "CSS": {
            "bytes": 18296,
            "files": 1
        },
        "HTML": {
            "bytes": 17429,
            "files": 66
        },
        "JavaScript": {
            "bytes": 3741,
            "files": 1
        },
        "SQL": {
            "bytes": 1036,
            "files": 1
        }
    },
    "installation_url": "https://update.estudium.eu/package.php?software_id=eloader&version=1.3.0",
    "update_url": "https://update.estudium.eu/package.php?software_id=eloader",
    "install_json": {
        "software": "eLoader",
        "software_id": "eloader",
        "version": "1.3.0",
        "release_date": "2026-09-12",
        "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-12T19:28:36+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"
            ]
        },
        "project": {
            "website": ""
        },
        "homepage": ""
    },
    "readme": "# eLoader 1.3.0\n\nAutor programu: **PB <pavel.bartos.pb@gmail.com>** — shodně s eUpdate. Vydání: 12. 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## 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`.\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. SQLite není pro nový provoz jádra potřeba. 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.3.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\nZ projektu zkopírujte instalační odkaz. Pro tento identifikátor bude jeho tvar:\n\n```text\nhttps://update.estudium.eu/package.php?software_id=eloader\n```\n\nJde o očekávaný odkaz **po publikování**, nikoli o potvrzení, že projekt už na serveru existuje. Balíček zde nebyl publikován na váš produkční eUpdate. Připravený klient používá skutečný kontrakt `eupdate-installation-v1` z eUpdate 1.7.8.\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** nastavte odkaz na projekt `eloader` v eUpdate. U neveřejného projektu doplňte SecretID.\n2. Zapněte autoupdate a nastavte čas kontroly; předvolba je **03:30 v Europe/Prague**.\n3. Do cronu konkrétního 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\nCron kontroluje plán každých pět minut; stažení a aktualizaci provede nejvýše jednou denně po zvoleném čase. Bez cronu automatické aktualizace neběží. Výchozí stav je vypnuto, dokud správce nenastaví publikovaný zdroj. Samostatná ruční kontrola je dostupná tlačítkem.\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 současně vypne autoupdate jádra i Composeru. Aktualizace, která neprojde kontrolou, se neaktivuje. Verze 1.3.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## 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í → Vzhled** vyberte **Academic Blue · modrý** nebo **B-W · světlý černobílý**. 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/` a `html/b-w/`. Obě 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 kulatý ovladač 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, profil, aplikace a moduly, aktualizace, nastavení, mail templater, superadmini a provozní záznamy. Na stránkách jádra je viditelná; při otevření aplikace se schová a znovu ji vyvolá kolečko. Na úzkém displeji lze řádek tlačítek posunout vodorovně. 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 v této verzi sám neprovádí registraci/licenční check-in; povolení musí již existovat v 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 STARTTLS a implicitní TLS. SMS brána používá HTTPS POST JSON `{\"to\":\"+420...\",\"message\":\"...\"}` a Bearer token; očekává HTTP 2xx. Pro poskytovatele s jiným protokolem je potřeba 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.",
    "download_url": "https://update.estudium.eu/download.php?project=15b70c7d025661ed&release=dec0f1e3cbac95880c52edcd7ed716f2",
    "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
}