VieCore

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.

app.tsSDK, protocole v1
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.storage
  • Des 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.

  1. 01Étape

    Construire votre interface

    React, Vue, Svelte ou JavaScript seul : un bundle Web autonome, aux chemins relatifs, qui fonctionne hors ligne.

  2. 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.

  3. 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.

  4. 04Étape

    Empaqueter et signer

    Le packager produit une archive .vieapp signée en Ed25519. VieHub la vérifie avant toute installation.

vieapp.manifest.jsonformat v1, champs réels
{
  "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.

VieData Libraries disponibles, leurs collections et les apps qui les utilisent
BibliothèqueCollectionsUtilisée par
viecore.fitness1.0 · 2.0workoutsVieLift, Bilan d’activité, VieEat
viecore.body1.0measurements, energy-expenditureVieEat
viecore.nutrition1.1meals, targets, foodsVieEat
viecore.finance1.0transactions, reconciliationsAucune app pour l’instant
viecore.gaming1.0games, accounts, sessions, achievements, itemsAucune app au catalogue
viecore.profile1.0about, contact, experiences, education, skills, languages, credentialsAucune 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.

  1. Des chemins relatifs partout : ./assets/app.js, jamais /assets/app.js (base: './' dans Vite).

  2. Aucun script inline, ni eval, ni new Function : tout le JavaScript vient des fichiers du bundle.

  3. Polices et images embarquées dans le bundle : pas de Google Fonts ni de CDN.

  4. Le réseau est fermé par défaut : chaque domaine appelé se déclare dans network.allowedDomains.

  5. Pas d’iframe, ni de formulaire natif, ni de balise <base>.

  6. 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.

Documentation complète et accès anticipéLien ou contact à fournir

Ce que VieCore promet à vos utilisateurs