Développeurs
Construireune VieApp.
Une app Web, un manifeste, une archive signée. Les comptes, la synchronisation, les données partagées et les mises à jour, VieCore s’en charge.
Ci-contre, une app qui lit les séances du compte, qu’elles viennent de VieLift ou d’ailleurs, puis ajoute la sienne. Aucune intégration avec VieLift : les deux parlent viecore.fitness.
import { createVieCoreClient } from '@viecore/vieapp-sdk';
import { connectRecords } from '@viecore/viedata-kit';
import { fitnessV2Collections } from '@viecore/fitness-v2';
const viecore = createVieCoreClient();
const { appId } = await viecore.ready();
const data = connectRecords(viecore.records, {
appId,
kind: 'app',
});
const workouts = data.collection(
fitnessV2Collections.workouts,
);
// Les séances du compte, d’où qu’elles viennent.
const { records } = await workouts.list();
// La vôtre, lisible par les apps autorisées.
await workouts.create({
activity: 'running',
performedOn: '2026-10-22',
durationSeconds: 1800,
distanceM: 5000,
});Ce que VieCore fait à votre place
Vous écrivez votre app. Le reste tient en un appel du SDK, ou en rien du tout.
Les comptes et la connexion
Vos utilisateurs ont déjà un compte VieCore. Vous recevez un identifiant stable et un nom, jamais l’e-mail ni le jeton du compte.
viecore.identity.get()Un serveur de synchronisation
VieHub garde les données de votre app sur l’appareil et les synchronise avec le compte quand le réseau revient. Vous n’hébergez rien.
viecore.privateData.sync() · viecore.storageDes données dès le premier jour
Avec l’accord de l’utilisateur, une nouvelle app de sport lit les séances déjà notées dans VieLift. Pas de démarrage à vide.
data.collection(…).list()L’écran des permissions
Vous écrivez la raison de chaque accès dans le manifeste. VieHub l’affiche, recueille la réponse et la rend révocable.
viecore.permissions.list()Installation, mises à jour, retour arrière
VieHub vérifie la signature, installe chaque version à part et revient à la précédente si la nouvelle ne démarre pas.
await viecore.ready()
De l’idée au paquet signé
Quatre étapes, dans cet ordre. Le code de VieHub ne fait jamais partie de votre build.
01Étape
Construire votre interface
React, Vue, Svelte ou JavaScript seul : un bundle Web autonome, aux chemins relatifs, qui fonctionne hors ligne.
02Étape
Déclarer le manifeste
Identifiant, version, point d’entrée, les VieData Libraries que vous parlez, et chaque accès avec sa raison, en clair pour l’utilisateur.
03Étape
Parler une VieData Library
Lisez et écrivez avec @viecore/viedata-kit dans un format commun, comme viecore.fitness. Toute app qui le parle comprend vos données.
04Étape
Empaqueter et signer
Le packager produit une archive .vieapp signée en Ed25519. VieHub la vérifie avant toute installation.
{
"schemaVersion": 1,
"id": "com.exemple.vievotreapp",
"version": "0.1.0",
"name": "VieVotreapp",
"description": "Votre application utilisable hors ligne dans VieHub.",
"publisher": { "id": "com.exemple", "name": "Exemple" },
"universalLink": "https://apps.exemple.com/vievotreapp",
"minimumHostVersion": "0.1.0",
"runtime": {
"type": "installable-web",
"entrypoint": "index.html",
"offline": "full"
},
"libraries": [{ "id": "viecore.fitness", "version": "2.0.0" }],
"permissions": [
{ "id": "viecore.fitness.workouts.read",
"reason": "Afficher vos séances terminées.", "required": true },
{ "id": "viecore.identity.basic.read",
"reason": "Afficher votre nom de compte.", "required": false }
],
"capabilities": { "provides": [], "consumes": [] },
"network": { "allowedDomains": [] }
}Le début du nom est fourni. La suite est à vous.
Le manifeste dit qui vous êtes, ce que votre app lance, quel standard elle parle et pourquoi elle a besoin de chaque accès. La raison s’affiche telle quelle dans VieHub.
Parler viecore.fitness ne donne rien en soi : c’est la permission viecore.fitness.workouts.read qui ouvre la lecture, si l’utilisateur l’accorde. Obligatoire, votre app ne s’ouvre pas sans elle ; facultative, elle s’ouvre et s’adapte.
Par défaut, une VieApp n’a pas de réseau : allowedDomains est vide, et VieHub calcule sa politique de sécurité à partir de cette liste.
Les VieData Libraries
Une VieData Library fixe le format d’un domaine : ses collections, leurs champs, leurs règles. VieHub valide chaque écriture. Deux apps qui la parlent se comprennent, sans intégration écrite pour chaque paire.
- Compatible ne veut pas dire autorisé. Déclarer une bibliothèque ne donne rien : chaque lecture et chaque écriture reste une permission accordée par l’utilisateur.
- Vous ne modifiez que ce que vous avez créé. Une séance appartient à l’app qui l’a enregistrée. Les autres la lisent ; elles ne la réécrivent pas.
- Vos champs à vous, sans casser les autres. Chaque enregistrement garde une extension privée par app, ext[appId], préservée quand une autre app le met à jour.
Versionnées : une app déclare la version qu’elle parle, et une nouvelle version ne casse pas les anciennes. Prévues ensuite : sommeil, productivité, éducation.
| Bibliothèque | Collections | Utilisée par |
|---|---|---|
viecore.fitness1.0 · 2.0 | workouts | VieLift, Bilan d’activité, VieEat |
viecore.body1.0 | measurements, energy-expenditure | VieEat |
viecore.nutrition1.1 | meals, targets, foods | VieEat |
viecore.finance1.0 | transactions, reconciliations | Aucune app pour l’instant |
viecore.gaming1.0 | games, accounts, sessions, achievements, items | Aucune app au catalogue |
viecore.profile1.0 | about, contact, experiences, education, skills, languages, credentials | Aucune app pour l’instant |
Les règles du paquet
Une archive qui enfreint l’une de ces règles est refusée avant l’installation. Mieux vaut les connaître avant le premier build.
Signature Ed25519, empreintes SHA-256, chemins et tailles : VieHub tient chaque archive pour non fiable jusqu’au bout de ces contrôles. Puis un premier lancement d’essai : tant que votre app n’a pas appelé ready(), la version précédente reste en place.
Des chemins relatifs partout : ./assets/app.js, jamais /assets/app.js (base: './' dans Vite).
Aucun script inline, ni eval, ni new Function : tout le JavaScript vient des fichiers du bundle.
Polices et images embarquées dans le bundle : pas de Google Fonts ni de CDN.
Le réseau est fermé par défaut : chaque domaine appelé se déclare dans network.allowedDomains.
Pas d’iframe, ni de formulaire natif, ni de balise <base>.
250 Mio et 10 000 fichiers au plus.
Questions directes
Dois-je utiliser un framework précis ?
Non. Le contrat porte sur le bundle produit, autonome et aux chemins relatifs, et sur son dialogue avec VieHub, pas sur vos outils.
Mon app reçoit-elle le compte de l’utilisateur ?
Non. Elle reçoit une session éphémère, propre à elle. identity.get() renvoie un identifiant opaque et un nom affiché, jamais l’e-mail ni le jeton du compte.
Et si l’utilisateur refuse un accès ?
Un accès obligatoire refusé : VieHub n’ouvre pas l’app et dit pourquoi, et ready() échoue avec PERMISSION_DENIED. Un accès facultatif refusé : permissions.list() vous le dit, à vous de proposer une version réduite.
Mon app peut-elle appeler mon serveur ?
Oui, si vous déclarez son domaine dans network.allowedDomains. Sans déclaration, aucune requête ne sort : VieHub en fait la politique de sécurité de votre app.
Que se passe-t-il hors ligne ?
Une VieApp installée se lance depuis l’appareil. Les écritures attendent le retour du réseau, et network.getStatus() vous dit où vous en êtes.
Comment accéder au SDK aujourd’hui ?
Pas encore en libre accès : les paquets @viecore ne sont pas publiés sur npm, et la Marketplace n’accepte pas encore d’apps extérieures. Cette page le dira dès que ce sera ouvert.
Votre app,lancée par VieHub.
Vérification de signature, installation à part, lancement hors ligne, permissions affichées et retour arrière automatique : ce que VieHub fait pour chaque VieApp.