AVAX Launcher — Hlavní aplikace¶
Účel¶
Centrální launcher podobný Steamu pro distribuci a správu ekonomických aplikací. Běží jako desktop aplikace (Windows, Linux) a webová aplikace. Každá zakoupená aplikace se stahuje z firemního S3 úložiště (https://s3.avaxis.cz/).
Dvouvrstvá architektura distribuce¶
Distribuce probíhá ve dvou krocích — malý bootstrapper stažený z webu, který si teprve stáhne celou hlavní aplikaci ze S3.
VRSTVA 1: Bootstrapper
• Uživatel stáhne z webu avaxis.cz (hypertextový odkaz na soubor z S3, ~5 MB)
• Obsahuje: Tauri runtime, updater logika, veřejný klíč S3
• UI: splash screen s logem Avaxis + progress bar s detailem MB
• Připojí se na S3, zkontroluje system/main-app/latest.json
• Stáhne hlavní aplikaci do lokálního cache adresáře
• Spustí hlavní aplikaci a ukončí se
VRSTVA 2: Hlavní aplikace (AVAX Main)
• Stažena a uložena lokálně při prvním spuštění
• Obsahuje: celé UI, katalog, chat, sync, offline logiku
• Při každém spuštění bootstrapper zkontroluje update
• Update je vždy povinný — uživatelé musí mít vždy aktuální verzi
Startup flow (každé spuštění)¶
Uživatel spustí Bootstrapper
│
├─ [Online] ─── GET https://s3.avaxis.cz/system/main-app/latest.json
│ │
│ ├─ verze == lokální
│ │ → spusť main app okamžitě
│ │
│ └─ verze > lokální (VŽDY STRIKTNÍ UPDATE)
│ → main app právě běží?
│ │
│ ├─ NE → stáhni update → verifikuj checksum
│ │ → nahraď lokální verzi → spusť novou
│ │
│ └─ ANO → stahuj soubory update na pozadí
│ → po dokončení zobraz popup:
│ ┌──────────────────────────────────┐
│ │ Je dostupná aktualizace v2.1.4 │
│ │ │
│ │ Co je nového: │
│ │ • Oprava tisku sestav │
│ │ • Nový export do ISDOC │
│ │ (jen pokud changelog definován) │
│ │ │
│ │ [Restartovat nyní] [Později] │
│ └──────────────────────────────────┘
│ → "Restartovat nyní"
│ → zavře main app, aplikuje update,
│ spustí novou verzi
│ → "Později"
│ → tray ikona žlutá
│ → notifikace každé 4 hodiny:
│ "Aplikace není aktuální,
│ prosím restartujte aplikaci"
│ → při příštím STARTU update
│ aplikován automaticky
│
└─ [Offline] ── lokální verze existuje?
├─ Ano → spusť (offline JWT ověření)
└─ Ne → zobraz chybu "Nutné připojení pro první spuštění"
Selhání update (fallback)¶
Stahování update selhalo (přerušení, chyba S3):
→ zachovej předchozí verzi beze změny
→ logguj chybu lokálně
→ při příštím startu bootstrapper zkusí update znovu
Checksum nesedí po stažení:
→ smaž stažený soubor
→ zachovej předchozí verzi
→ zobraz chybu "Aktualizace selhala, zkuste znovu"
S3 struktura — bootstrapper a main app¶
s3://avaxis/system/
bootstrapper/
latest.json ← { version, url_win, url_linux, checksum }
win/{version}/avaxis-setup.exe ← veřejně přístupný (odkaz z webu)
linux/{version}/avaxis-setup.sh
main-app/
latest.json ← { version, checksum_win, checksum_linux }
win/{version}/avaxis-main.zip
linux/{version}/avaxis-main.tar.gz
Lokální cache adresáře¶
Windows: %LOCALAPPDATA%\Avaxis\
bootstrapper\ ← bootstrapper samotný
app\{version}\ ← stažená main app
app\current -> app\{ver}\ ← odkaz na aktivní verzi
data\ ← SQLite, temp soubory
Linux: ~/.local/share/avaxis/
app/{version}/
app/current -> app/{ver}/
data/
Platformy¶
| Platforma | Technologie | Offline podpora |
|---|---|---|
| Windows | Tauri 2.0 (Rust + React) | Ano |
| Linux | Tauri 2.0 (Rust + React) | Ano |
| Web | Next.js 15 | Ne (pouze online) |
Technologický stack¶
Desktop — Bootstrapper (Tauri 2.0, minimální)¶
avaxis-bootstrapper/
└── src-tauri/src/
├── main.rs ← splash screen s logem + progress bar
├── updater.rs ← stažení main app ze S3, verifikace checksum
└── launcher.rs ← spuštění main app procesu
Desktop — Hlavní aplikace (Tauri 2.0, plná)¶
avaxis-main/
├── src-tauri/src/
│ ├── main.rs
│ ├── auth.rs ← JWT validace offline
│ ├── downloader.rs ← S3 presigned download
│ ├── installer.rs ← instalace ekonomických aplikací (Win/Linux)
│ ├── sync_agent.rs ← synchronizace dat s S3
│ ├── app_runner.rs ← spouštění nainstalovaných aplikací
│ └── tray.rs ← tray ikona, notifikace
└── src/ (React frontend)
├── pages/
│ ├── Library.tsx ← nainstalované aplikace
│ ├── Store.tsx ← katalog k zakoupení/aktivaci
│ ├── Chat.tsx ← vstup do chat komponenty
│ ├── Settings.tsx ← nastavení + výběr tématu
│ └── Backup.tsx
└── components/
├── AppCard.tsx
├── DownloadProgress.tsx
├── SyncStatus.tsx
└── UpdatePopup.tsx ← popup s changelogem + volba restartu
Web aplikace (Next.js 15)¶
- App Router, SSR pro rychlé načítání
- Sdílené UI komponenty s desktopem (design system)
- WebSocket pro real-time stav a chat
- Bez offline podpory — přihlášení vždy vyžaduje internet
Backend (FastAPI — Python)¶
services/
├── auth/ ← přihlášení, JWT, refresh tokeny, registrace
├── org/ ← firmy, uživatelé, role, oprávnění
├── catalog/ ← správa aplikací a verzí
├── licensing/ ← předplatné, offline JWT
├── sync/ ← presigned URL pro upload/download
├── backup/ ← snapshoty, retention policy
├── chat/ ← zprávy, konverzace, přílohy
├── support/ ← fronta, priorita, agenti
└── admin/ ← správa celé platformy
S3 struktura — přehled¶
s3://avaxis/
├── system/
│ ├── bootstrapper/{version}/ ← instalátor bootstrapperu (web ke stažení)
│ └── main-app/{version}/ ← hlavní aplikace (stahuje bootstrapper)
│
├── apps/
│ ├── catalog/ ← veřejný katalog ekonomických aplikací
│ │ └── {app-slug}/{version}/{platform}/
│ │ ├── installer.exe (.AppImage)
│ │ └── meta.json
│ └── custom/
│ └── {client-id}/{app-slug}/{version}/{platform}/
│
├── users/
│ └── {user-id}/
│ ├── license.jwt ← offline licence cache
│ ├── settings/{app-slug}/ ← záloha nastavení (zdarma)
│ └── data/{app-slug}/ ← klientská data → viz sync-backup.md
│
└── chat/
└── {conversation-id}/
├── messages/{rok}/{měsíc}/{den}/
└── attachments/
Multi-device¶
- Uživatel může mít neomezený počet zařízení (PC, notebook, mobil)
- Každé zařízení má unikátní
device_id(generováno při prvním spuštění) - Offline JWT platí per-device — každé zařízení si drží vlastní kopii
- Sync state je per-device — každé zařízení synchronizuje nezávisle
- Při konfliktu dat mezi zařízeními → viz
sync-backup.md
Offline architektura¶
Lokální SQLite databáze (desktop)¶
avaxis-local.db
├── installed_apps ← nainstalované aplikace + verze + device_id
├── cached_license ← JWT token s expirací
├── theme_config ← aktivní téma (sdíleno všemi komponenty)
├── pending_sync ← operace čekající na upload (offline queue)
└── sync_state ← last_synced, checksums per app per device
Offline licence¶
Při přihlášení (online):
API vydá signed JWT: { user_id, company_id, device_id, apps: [...], exp: +30 dní }
→ uložen lokálně v SQLite
→ záloha na S3: users/{id}/license.jwt
Spuštění offline:
1. Bootstrapper spustí main app lokálně
2. Main app ověří podpis JWT lokálním public key (bundlován v main app)
3. exp > now() → plný přístup
4. exp < now() → varování + grace period 7 dní
5. grace period vypršel → read-only režim, žádné nové instalace/sync
Obnovení online:
→ API automaticky vydá nový JWT pro device_id
Sync manager¶
Při startu main app:
1. Zkontroluje konektivitu (GET /health, timeout 3s)
2. Online → flush pending_sync queue na S3
→ stáhne manifest změn ze serveru
→ obnoví JWT pokud exp < 7 dní
3. Offline → pracuje jen lokálně, loguje změny do pending_sync
Průběžně (online):
→ file watcher na data nainstalovaných aplikací
→ při detekci změny → sync po 30s debounce
Přihlašovací obrazovka¶
První věc kterou uživatel po spuštění main app vidí.
┌──────────────────────────────────────────────┐
│ [Logo AVAX] │
│ │
│ E-mail: [ jan.novak@firma.cz ] │
│ Heslo: [ •••••••••••••••• ] │
│ │
│ ☑ Pamatuj si mě │
│ │
│ [ Přihlásit se ] │
│ │
│ ────────────────────────────────────────── │
│ Nemáte účet? [ Registrace uživatele ] │
│ [ Registrace firmy ] │
└──────────────────────────────────────────────┘
Chování¶
- Pamatuj si mě — automatické přihlášení při každém dalším startu dokud uživatel sám neodhlásí nebo nevymaže data aplikace (bez časového limitu)
- Bez "Pamatuj si mě" — e-mail předvyplněn, heslo prázdné, uživatel zadá ručně
- Registrace uživatele — formulář pro nového zaměstnance do existující firmy:
- Zadá IČO firmy → systém ověří existenci firmy
- Vyplní e-mail, jméno, heslo
- Dostane potvrzovací e-mail → klikne na odkaz → účet aktivován
- Přihlásí se, ale nevidí žádné aplikace ani chat
- Company admin / ředitel / personální mu přidělí přístupy → viz auth-organization.md
- Registrace firmy — formulář pro novou firmu + první uživatel = company admin:
- Zadá IČO, název firmy, adresu, e-mail, heslo
- Potvrdí e-mailem
- Žádost jde ke schválení Avaxis (viz portal-management.md)
- Po schválení → company admin se přihlásí, nastaví firmu
Detailní registrační flow → viz auth-organization.md Schvalování registrací Avaxis → viz portal-management.md
Vizuální design a témata¶
Výchozí téma — Modrá profesionální¶
Téma je sdíleno napříč celou platformou. Chat, zálohy, katalog, všechny komponenty dědí téma z hlavní aplikace — uživatel nastaví jednou, platí všude. Změna tématu se propaguje okamžitě přes Tauri event do všech otevřených komponent.
Primární barva: #1565C0 (tmavá modrá — tlačítka, aktivní prvky)
Sekundární barva: #1E88E5 (střední modrá — akcenty, linky)
Pozadí: #F5F7FA (světle šedá)
Povrch (karty): #FFFFFF (bílá)
Text primární: #1A1A2E (téměř černá)
Text sekundární: #5C6780 (šedá)
Úspěch: #2E7D32 (zelená)
Varování: #F57C00 (oranžová)
Chyba: #C62828 (červená)
Uložení tématu¶
avaxis-local.db → theme_config:
{
"name": "blue-professional",
"primary": "#1565C0",
"secondary": "#1E88E5",
"background": "#F5F7FA",
"surface": "#FFFFFF",
"text_primary": "#1A1A2E",
"text_secondary": "#5C6780"
}
Připravená témata (do budoucna, ne v první verzi)¶
| Název | Popis |
|---|---|
| Blue Professional | Výchozí — modré odstíny |
| Dark | Tmavý režim pro večerní práci |
| Green | Zelené odstíny |
| Custom | Vlastní barvy firmy (firemní branding) |
Tray ikona a notifikace (globální politika)¶
Platí pro main app i všechny nainstalované ekonomické aplikace a komponenty. Chování inspirováno Steamem — zavření okna skryje UI, aplikace zůstane aktivní.
Chování při zavření okna¶
Uživatel klikne X (zavřít okno):
→ Hlavní okno se skryje (nezavře)
→ V tray zůstane ikona AVAX
→ Na pozadí běží dál:
• Sync agent (zálohy nastavení, čekající uploady)
• Chat (příjem zpráv, notifikace)
• Kontrola aktualizací
→ Kliknutí na tray ikonu → okno se znovu zobrazí
→ Pravý klik na tray ikonu → kontextové menu:
┌─────────────────────────┐
│ Otevřít AVAX │
│ ───────────────────── │
│ Chat (3 nepřečtené) │
│ Zálohy: OK │
│ ───────────────────── │
│ Ukončit AVAX │
└─────────────────────────┘
Tray ikona stavy¶
● Zelená — vše aktuální, online, sync OK
● Modrá — synchronizace nebo stahování probíhá
● Žlutá — stažená aktualizace čeká na restart
NEBO nepřečtené zprávy v chatu
● Červená — chyba (offline, selhání sync, expirace licence)
Kombinované stavy (ikonka s odznakem):
Zelená + číslo → počet nepřečtených zpráv v chatu
Žlutá + výkřičník → aktualizace čeká na restart
Notifikace z tray¶
"Aplikace není aktuální, prosím restartujte":
→ aktivuje se když existuje stažená ale neaplikovaná aktualizace
→ platí pro main app i všechny nainstalované aplikace a komponenty
→ opakuje každé 4 hodiny dokud uživatel nerestartuje
→ kliknutí → popup s changelogem + tlačítko Restartovat nyní
Chat notifikace:
→ systémová OS notifikace při nové zprávě
→ zobrazí jméno odesilatele a začátek zprávy
→ kliknutí → otevře okno aplikace na příslušné konverzaci
Code signing¶
Rozhodnutí: Spouštíme bez code signing certifikátu.
- Distribuce přes vlastní web avaxis.cz — ne přes veřejné app store
- Firemní zákazníci (B2B) — IT správci mohou přidat výjimku do Group Policy
- Windows SmartScreen zobrazí varování při první instalaci bootstrapperu → uživatelé budou informováni na webu jak pokračovat
- Přidat EV certifikát lze kdykoli bez změny architektury
Předplatné a plány¶
┌─────────────────┬──────────────────┬─────────────────────┐
│ Basic │ Standard │ Premium │
├─────────────────┼──────────────────┼─────────────────────┤
│ • Přístup k app │ • Basic + │ • Standard + │
│ • Záloha nast. │ • Záloha kl. dat │ • Prioritní support │
│ (zdarma) │ → sync-backup │ │
│ • Multi-device │ • Multi-device │ • Multi-device │
│ (neomezeno) │ (neomezeno) │ (neomezeno) │
└─────────────────┴──────────────────┴─────────────────────┘
Záloha nastavení aplikací je zdarma pro všechny plány. Záloha klientských dat → viz sync-backup.md
Rozhodnuté otázky¶
| Otázka | Rozhodnutí |
|---|---|
| Multi-device limit | Neomezeno — PC, notebook, mobil |
| Retention zálohy nastavení | Posledních 10 snapshotů, zdarma |
| Retention klientských dat | Viz sync-backup.md |
| Code signing | Bez certifikátu v první verzi |
| Distribuce bootstrapperu | avaxis.cz — hypertextový odkaz na soubor z S3 |
| Splash screen bootstrapperu | Logo Avaxis + progress bar s detailem MB |
| Update povinnost | Vždy aktuální verze — blokování není podporováno |
| Update při startu (app neběží) | Striktně provést update před spuštěním |
| Update při běžící aplikaci | Stáhnout na pozadí, popup s changelogem, Restartovat / Później |
| Changelog v update popupu | Zobrazit pokud definován k dané verzi |
| Tray notifikace "prosím restartujte" | Každé 4 hodiny, platí pro všechny komponenty |
| Fallback při selhání update | Zachovat předchozí verzi, zkusit při příštím startu |
| První spuštění | Přihlašovací obrazovka (předvyplněná pokud byl uživatel přihlášen) |
| Pamatuj si mě | Bez časového limitu — platí dokud uživatel sám neodhlásí |
| Registrace uživatele | Potvrzení e-mailem → aktivní, ale bez aplikací dokud admin nepřidělí |
| Registrace firmy | Potvrzení e-mailem + schválení Avaxis (viz portal-management.md) |
| Schvalování registrací Avaxis | V komponentě Správa portálu — lze zapnout auto-schválení |
| Tray chování při zavření okna | Zůstane aktivní v tray, zálohy + chat běží na pozadí |
| Tray kontextové menu | Otevřít, stav chatu, stav záloh, Ukončit |
| Vizuální design | Profesionální modrý design, sdílený přes celou platformu |
| Témata v první verzi | Pouze Blue Professional |
| Témata do budoucna | Dark, Green, Custom (firemní branding) |
| Chat dědí téma | Ano — vše přes Tauri event z hlavní aplikace |
Otevřené otázky¶
Všechny otázky k main-app.md jsou vyřešeny.
Nová komponenta: Správa portálu → viz portal-management.md
Poslední aktualizace: 2026-04-21