BobPhoneOS 3.0.1 · CSS browser · JS canvas · sélection

BobPhone Dev Docs

L’app mobile c’est BobPhone dans le navigateur — pas un APK. Toute l’UI téléphone tourne sur un canvas, booté comme un vrai OS.

Architecture

bob.xem.yt/bobphone  →  nginx (static + proxy)
                         ├─ /              canvas phone
                         ├─ /devdocs       ces docs
                         ├─ /blockly-appbuilder
                         └─ /api /auth /ws → bobphone-core (Rust)

Boot chain

index.html
  └─ firmware.bios.js          # canvas + DPR, loadScript()
       └─ os/bootloader.js     # bootscreen
            ├─ os/api/*.js     # logger, io, net, graphics, input, esim, apps
            └─ os/kernel.js    # login → lock → home → apps
                 └─ apps/**/*.js

Le téléphone entier est un <canvas id="screen">. Pas de DOM app dans l’écran.

APIs runtime (JavaScript)

BobBIOS

BobBIOS.canvas / .ctx / .W / .H / .base / .loadScript(url)

BobIO — filesystem virtuel (localStorage)

BobIO.writeFile('/apps/monapp/main.js', src)
BobIO.readFile(path)
BobIO.mkdir(path)
BobIO.list(path)
BobIO.readJSON / writeJSON

BobNet

await BobNet.fetchJSON('/api/me')
await BobNet.fetchCors(url)  // mode:'cors' puis fallback /api/browse
BobNet.wsConnect(userId)  // → /bobphone/ws?user=…

BobGfx / BobInput / BobKeyboard

Dessin canvas (clear, roundRect, text, status bar, images, vidéo) + taps en coords 390×844.

BobGfx.loadImage(src) / drawImage(ctx, src, x,y,w,h, {fit,radius})
BobGfx.createVideoPlayer(src) / drawVideoPlayer / handleVideoTap
BobGfx.drawTextField(ctx, x,y,w,h, value, {placeholder, focused})
BobGfx.scrollMax(contentH, viewH) / clipRect / wrapText / contentBottomY(H)
BobInput.makeScroller(() => max)  // borné au contenu, ignore chrome + clavier
BobKeyboard.show({ value, layout:'azerty'|'url'|'num', onChange, onSubmit, multiline })
BobKeyboard.hide() / .height() / .isOpen()

Sur mobile : clavier soft canvas (pas le clavier OS qui casse le layout). L’UI se décale via BobKeyboard.height().

BobEsim

await BobEsim.list()
await BobEsim.check(userId)
await BobEsim.buy(userId, 'bobfree')
await BobEsim.switch(userId, esimId)

BobApps

BobApps.register({
  id: 'hello',
  name: 'Hello',
  emoji: '👋',
  system: false,
  launch() { return { render(ctx){…}, onTap(p){…}, onBack(){…} } }
})

Créer une app JS

Une app = un objet avec au moins render(ctx). Optionnel: onTap, onDrag, onBack, onShow.

// apps/user/hello.js
(function () {
  BobApps.register({
    id: 'hello',
    name: 'Hello',
    emoji: '👋',
    launch: function () {
      return {
        render: function (ctx) {
          BobGfx.clear(ctx, BobBIOS.W, BobBIOS.H);
          BobGfx.text(ctx, 'salut', BobBIOS.W/2, 200, { align: 'center' });
        },
        onTap: function () { BobKernel.goHome(); }
      };
    }
  });
})();

Apps système: system.lock, system.home, settings. User: phone, messages, esimshop.

Upload store: POST /api/apps/upload avec package_js ou package_html (session Discord).

eSIM (plus SIM physique)

On parle d’eSIM maintenant. Opérateurs: Bobfree, Boborange, Bouygues, HessFR, Reef, Bob Telecom. Achat en BobCoin via bob.db.

Aliases /api/sim/* gardés pour compat.

HTTP bobphone-core

Blockly App Builder

Éditeur visuel → génère une app JS BobPhoneOS.

Ouvrir le builder →

Tel: /bobphone/ · Docs: /bobphone/devdocs/ · Builder: /bobphone/blockly-appbuilder/