VixOS — dokumentace

Jak napsat aplikaci pro VixOS, uložit v ní data (VixStore), zavolat z ní umělou inteligenci (VixAI) a nahrát ji do Vix Store, aby si ji mohli stáhnout ostatní.

Jak vypadá aplikace

Aplikace ve VixOS je jeden HTML soubor — značky, styly i skript pohromadě. Běží v izolovaném rámu (iframe), takže si nemůže rozbít systém, ale dostane od něj dva mosty: VixStore pro ukládání dat na server a VixAI pro volání AI. Nic se neinstaluje a nic se nesestavuje — co napíšeš, to běží.

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  body{font:15px system-ui;background:#0d0d1e;color:#e8e9ff;padding:16px;margin:0}
  button{padding:8px 14px;border-radius:10px;border:0;background:#8b5cf6;color:#fff}
</style>

<h3>Moje první appka</h3>
<button id="add">Přidat záznam</button>
<ul id="list"></ul>

<script>
async function render() {
  const items = await VixStore.list('zaznamy');
  document.getElementById('list').innerHTML =
    items.map(i => '<li>' + i.data.text + '</li>').join('');
}
document.getElementById('add').onclick = async () => {
  await VixStore.add('zaznamy', { text: 'Ahoj ' + new Date().toLocaleTimeString() });
  render();
};
render();
</script>
Proč ukládat přes VixStore a ne do localStorage? Data ve VixStore jsou na serveru: přežijí smazání mezipaměti, jsou na počítači i na telefonu stejná — a hlavně na ně vidí bublina, takže ti do aplikace umí zapisovat hlasem.

Ukládání dat (VixStore)

Data se ukládají do kolekcí — kolekce je prostě pojmenovaný seznam, třeba jidla nebo ukoly. Každá položka dostane vlastní id. Stačí ti čtyři věci: přidat, načíst, upravit, smazat.

// přidat
await VixStore.add('jidla', { nazev: 'Brambory', kcal: 210 });

// načíst všechno
const jidla = await VixStore.list('jidla');
jidla.forEach(j => console.log(j.nazev, j.kcal, j.id));

// upravit a smazat (podle id položky)
await VixStore.update('jidla', id, { nazev: 'Brambory', kcal: 190 });
await VixStore.remove('jidla', id);
Co dostaneš zpátky: položka má svá pole rovnou nahoře — j.nazev, j.kcal — plus j.id, j.ts (čas uložení). Pro jistotu funguje i j.data.nazev.

Jednodušší varianta: VixData

Když ti stačí uložit jeden objekt (nastavení, malý seznam), použij VixData — nemusíš řešit kolekce:

const d = await VixData.get();      // { } při prvním spuštění
d.jidla = d.jidla || [];
d.jidla.push({ nazev: 'Brambory', kcal: 210 });
await VixData.set(d);               // uloženo

Obojí je v pořádku a bublina umí zapisovat do obou. VixStore použij, když čekáš hodně záznamů nebo chceš data sdílet s ostatními.

Sdílená data mezi uživateli

// chat, tabulka výsledků, společný seznam
await VixStore.add('zpravy', { text: 'ahoj' }, { scope: 'shared', room: 'nase-parta' });
const vse = await VixStore.list('zpravy', { scope: 'shared', room: 'nase-parta' });

Umělá inteligence (VixAI)

Jeden řádek a máš v aplikaci AI — na shrnutí, odhad, převod, generování textu.

const odpoved = await VixAI.ask('Kolik kalorií má 200 g brambor?');

// s instrukcí, s internetem, nebo rovnou v JSON
const json = await VixAI.ask('Rozepiš recept na položky', { json: true });
const zpravy = await VixAI.ask('Co je dnes nového v Praze?', { web: true });
VolbaCo dělá
systemjak má odpovídat (styl, jazyk, délka)
websmí si vyhledat aktuální informace
jsonvrátí čistý JSON k dalšímu zpracování

Piš v jakémkoliv jazyce

Nemusíš psát web. Napiš aplikaci ve Flutteru, Reactu, Vue nebo Pythonu tak, jak jsi zvyklý — volej v ní VixStore a VixAI podle ukázek výše. Při nahrávání do Vix Store vybereš 📁 Celá složka projektu a VixOS ji sám přepíše do jednoho souboru, který v systému běží. Funkce, vzhled i logika zůstanou; volání úložiště a AI se namapují na skutečné mosty.

Po převodu si výsledek otevři a proklikej. Když něco nesedí, otevři aplikaci → Upravit aplikaci a řekni prompta („chybí tlačítko pro smazání záznamu“) — přepíše se to.

Widget aplikace (dlaždice na ploše)

Aplikace může mít widget — malou dlaždici, která ukazuje to nejdůležitější přímo na ploše. Stačí do souboru přidat jeden blok:

<template id="vix-widget">
  <div id="w">…</div>
  <script>
    (async () => {
      const jidla = await VixStore.list('diary');     // ta SAMÁ data jako aplikace
      const dnes = jidla.reduce((s, j) => s + (j.kcal || 0), 0);
      document.getElementById('w').textContent = dnes + ' kcal dnes';
    })();
  </script>
</template>

VixOS si toho sám všimne a widget nabídne: na telefonu v galerii widgetů (podržet plochu → +), na počítači jako dlaždici nebo tělo okýnka. Widget čte stejná data jako aplikace, takže se aktualizuje sám.

Nechceš to psát ručně? Otevři aplikaci → Upravit aplikaci a napiš třeba: „přidej widget, kde budou dnešní kalorie a vypitá voda“. Widget se vytvoří sám.

Aby do aplikace uměla psát bublina

Bublina (AI mode) vidí u každé tvojí aplikace její kód, názvy kolekcí a ukázku uložené položky. Díky tomu pozná, kam a v jakém tvaru zapsat, když řekneš „přidej do kalorií brambory“. Aby to fungovalo spolehlivě:

1
Používej výmluvné názvy kolekcí — jidla je lepší než data1.
2
Volej kolekci přímo řetězcem (VixStore.add('jidla', …)), ne přes proměnnou — bublina si ji pak přečte z kódu.
3
Drž stálou strukturu položek; první uložený záznam slouží bublině jako vzor.
4
Načítej data při otevření okna (jako render() výše). Po zápisu bubliny se okno samo překreslí.

Kód aplikace umí měnit i sama bublina — stačí říct „uprav kalorickou appku, ať počítá i bílkoviny“. Návrat zpět: „vrať aplikaci do původní verze“.

Nahrání aplikace do Vix Store

Vix Store je obchod uvnitř VixOS. Ostatní si tvoji aplikaci stáhnou jedním klepnutím a dostanou vlastní kopii — tu si pak můžou u sebe libovolně upravit promptem, aniž by to změnilo tvůj originál.

1
Otevři aplikaci Vix Store → záložka ⬆ Nahrát.
2
Vyber jednu ze svých aplikací (nebo vlož rovnou HTML kód), doplň ikonu a krátký popis.
3
Klepni na Nahrát do obchodu. Hotovo — aplikace je v katalogu.
4
Nahraješ-li později stejný název znovu, vytvoří se nová verze (v2, v3 …). Už stažené kopie zůstanou lidem beze změny.

Nahrát můžeš i aplikaci, kterou jsi napsal jinde — musí to být jeden HTML soubor. Pokud používá vlastní server, počítej s tím, že v rámu platí běžná pravidla prohlížeče (CORS).

Bezpečnost — co aplikace smí a nesmí

Každá aplikace běží v izolovaném rámu. Není to jen doporučení, systém to vynucuje:

Aplikace…Smí?
ukládat data přes VixStore / VixData✅ ano, jen ve svém prostoru
volat AI přes VixAI✅ ano
poslat data na cizí server (fetch, obrázek, WebSocket)❌ blokováno
číst tvoje přihlášení, cookies nebo data jiné aplikace❌ blokováno
sáhnout na okno VixOS okolo sebe❌ blokováno

Když potřebuje aplikace informace z internetu, jde to přes VixAI.ask(…, { web: true }) — požadavek pak jde přes server VixOS, ne z aplikace ven. Rozhraní systému navíc přijímá požadavky jen z VixOS; z cizí stránky je server odmítne.

Vlastní server aplikace

Aplikace ve výchozím stavu nesmí volat ven vůbec nic. Pokud má tvoje aplikace vlastní backend, vyplň při nahrávání do obchodu pole Vlastní server (např. api.mujserver.cz). Systém povolí spojení jen na uvedené domény a uživatel je vidí u aplikace v obchodě ještě před stažením.

// funguje jen když je doména uvedená u aplikace
const r = await fetch('https://api.mujserver.cz/moje-data');
const data = await r.json();

Kombinovat jde obojí: vlastní server pro svoje věci, VixStore pro data, která má vidět i bublina.

Prověření a podpis kódu

Při nahrávání můžeš (a doporučujeme) nechat kód projít bezpečnostním agentem. Ten hledá krádež přihlášení, odesílání dat pryč, falešné přihlašovací formuláře, skrytý kód a podobné věci.

VýsledekCo se stane
čistýaplikace dostane modrou ověřovací hvězdičku a jde stáhnout
výhradyaplikace jde stáhnout, ale bez hvězdičky — nálezy vidí každý v detailu
škodlivýaplikace se nikomu nezobrazí ani nepůjde stáhnout a upozorní se správce

HTTP API (pro pokročilé)

Vše výše jde volat i přímo. Autorizace hlavičkou X-Vix-Token.

EndpointCo dělá
POST /api/widget/store data aplikací: {op, collection, scope, room, id, data, widget_id}, kde op je list|get|add|update|remove|clear
GET /api/store/apps?q=&mine=katalog obchodu
GET /api/store/apps/{id}detail aplikace včetně kódu
POST /api/store/bundlepřevod celé složky projektu na jeden HTML soubor
GET/POST /api/store/devjméno vývojáře (zobrazuje se místo e-mailu)
POST /api/store/publish nahrání: {window_id} nebo {html, name, descr, icon}
POST /api/store/install/{id}stažení = vlastní kopie aplikace
DELETE /api/store/apps/{id}odebrání vlastní aplikace z obchodu
GET /api/custom_windows/{id}/codezdrojový kód aplikace
POST /api/custom_windows/{id}/coderuční uložení kódu
POST /api/ai/edit_widget úprava kódu promptem: {id, prompt}