Přeskočit obsah

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