BobPhoneOS 3.0.1 · CSS browser · JS canvas · sélection
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.
/bobphone/bob.xem.yt/bobphone → nginx (static + proxy)
├─ / canvas phone
├─ /devdocs ces docs
├─ /blockly-appbuilder
└─ /api /auth /ws → bobphone-core (Rust)
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.
BobBIOS.canvas / .ctx / .W / .H / .base / .loadScript(url)
BobIO.writeFile('/apps/monapp/main.js', src)
BobIO.readFile(path)
BobIO.mkdir(path)
BobIO.list(path)
BobIO.readJSON / writeJSON
await BobNet.fetchJSON('/api/me')
await BobNet.fetchCors(url) // mode:'cors' puis fallback /api/browse
BobNet.wsConnect(userId) // → /bobphone/ws?user=…
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().
await BobEsim.list() await BobEsim.check(userId) await BobEsim.buy(userId, 'bobfree') await BobEsim.switch(userId, esimId)
BobApps.register({
id: 'hello',
name: 'Hello',
emoji: '👋',
system: false,
launch() { return { render(ctx){…}, onTap(p){…}, onBack(){…} } }
})
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).
On parle d’eSIM maintenant. Opérateurs: Bobfree, Boborange, Bouygues, HessFR, Reef, Bob Telecom. Achat en BobCoin via bob.db.
GET /api/esim/listGET /api/esim/check?user=POST /api/esim/buy {user, esim_type}POST /api/esim/switch {user, esim_id}Aliases /api/sim/* gardés pour compat.
GET /api/health — runtime rustGET /api/me — session OAuth2/auth/discord → Discord → callback mc-panel (state bobphone.*)/api/sms/threads, /thread, /send01 02 03 04 05/ws?user=DISCORD_IDÉditeur visuel → génère une app JS BobPhoneOS.
Tel: /bobphone/ · Docs: /bobphone/devdocs/ · Builder: /bobphone/blockly-appbuilder/