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í.
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>
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.
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);
// Ve Flutteru píšeš normálně — při nahrání do obchodu
// se projekt automaticky převede do webové podoby.
await VixStore.add('jidla', {'nazev': 'Brambory', 'kcal': 210});
final jidla = await VixStore.list('jidla');
for (final j in jidla) {
print('${j['nazev']} ${j['kcal']}');
}
await VixStore.update('jidla', id, {'nazev': 'Brambory', 'kcal': 190});
await VixStore.remove('jidla', id);
# Python (např. Flet / Streamlit projekt)
await VixStore.add("jidla", {"nazev": "Brambory", "kcal": 210})
jidla = await VixStore.list("jidla")
for j in jidla:
print(j["nazev"], j["kcal"])
await VixStore.update("jidla", id, {"nazev": "Brambory", "kcal": 190})
await VixStore.remove("jidla", id)
type Jidlo = { id?: string; nazev: string; kcal: number };
await VixStore.add('jidla', { nazev: 'Brambory', kcal: 210 } as Jidlo);
const jidla: Jidlo[] = await VixStore.list('jidla');
setState(jidla);
await VixStore.update('jidla', id, { nazev: 'Brambory', kcal: 190 });
await VixStore.remove('jidla', id);
j.nazev, j.kcal —
plus j.id, j.ts (čas uložení). Pro jistotu funguje i j.data.nazev.
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.
// 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' });
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 });
final odpoved = await VixAI.ask('Kolik kalorií má 200 g brambor?');
final json = await VixAI.ask('Rozepiš recept na položky', {'json': true});
final zpravy = await VixAI.ask('Co je dnes nového?', {'web': true});
odpoved = await VixAI.ask("Kolik kalorií má 200 g brambor?")
json_odpoved = await VixAI.ask("Rozepiš recept na položky", {"json": True})
zpravy = await VixAI.ask("Co je dnes nového?", {"web": True})
| Volba | Co dělá |
|---|---|
system | jak má odpovídat (styl, jazyk, délka) |
web | smí si vyhledat aktuální informace |
json | vrátí čistý JSON k dalšímu zpracování |
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.
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.
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ě:
jidla je lepší
než data1.VixStore.add('jidla', …)),
ne přes proměnnou — bublina si ji pak přečte z kódu.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“.
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.
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).
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.
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.
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ýsledek | Co se stane |
|---|---|
| čistý | aplikace dostane modrou ověřovací hvězdičku a jde stáhnout |
| výhrady | aplikace 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 |
Vše výše jde volat i přímo. Autorizace hlavičkou X-Vix-Token.
| Endpoint | Co 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/bundle | převod celé složky projektu na jeden HTML soubor |
GET/POST /api/store/dev | jmé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}/code | zdrojový kód aplikace |
POST /api/custom_windows/{id}/code | ruční uložení kódu |
POST /api/ai/edit_widget |
úprava kódu promptem: {id, prompt} |