How Cloud Phone Works
Cloud Phone is a remote browser with two key components: a thin client application that renders a proprietary vector graphics language on device, and a sandboxed server running Chrome to translate websites comprised of HTML, CSS, and JavaScript into a vector graphics language. Cloud Phone is based on the Puffin web browser and uses the proprietary Puffin Vector Graphics Language. This greatly reduces the hardware requirements and bandwidth for running the thin client, allowing it to work effectively on devices like budget feature phones.
This three-tiered architecture also means that the Cloud Phone client needs to directly integrate with device hardware running on the Mocor/ ThreadX real time operating system (RTOS), and share that information with the Puffin web server, in order to read certain data like the battery level. Support for new Web APIs that need device integration requires an over-the-air (OTA) update to the Cloud Phone client in order for existing users to benefit from new features.
Here’s a quick look at the Web APIs that are, and are not, supported today on Cloud Phone.
Web API Support
Networking
All requests made by a website occur between the Puffin servers and web servers. As a result, Cloud Phone has strong support for protocols, including:
- XMLHttpRequest (XHR)
- Fetch, including Streams
- WebSockets
- Server-Sent Events
- Beacon
- WebTransport (untested)
- Web Push (unsupported)
WebTransport support hasn’t been confirmed, but likely aligns with the Chromium version corresponding to deployed Puffin servers. Web Push is not available, but support is planned for future Cloud Phone client updates.
Storage
Cloud Phone allows websites to use the most common storage APIs, like:
- LocalStorage
- SessionStorage
- IndexedDB
- CacheStorage
- SharedStorage (untested)
- FileSystem (unsupported)
- Persistent Storage (unsupported)
-
<a download>
(unsupported) -
<input type="file">
(unsupported)
Websites can persist data using LocalStorage or IndexedDB, as well as temporarily store data in memory using SessionStorage. However, there is no ability to download or access local files, or to request permission for Persistent Storage. Additionally, CacheStorage
and other forms of persisted cache are not useful on Cloud Phone because the cache is not persisted across users, or between user sessions.
Computation
Modern websites have access to significant resources to perform computation, and this is true for Cloud Phone as well. Cloud Phone supports:
- WebWorker
- WakeLock
- WebAssembly
- WebGPU (not available)
Rendering
Surprisingly, Cloud Phone supports common rendering APIs. Cloud Phone was designed to render at 15 frames per second (fps), and has been observed as high as 20 fps. However, real-world performance depends on many factors including network conditions, CPU usage, battery charge, and more.
- Canvas
- WebGL
Connectivity
Cloud Phone does not offer access to device hardware for local connectivity or positioning. The following APIs are unsupported on Cloud Phone:
- Geolocation
- Web Bluetooth
- Near Field Communication (NFC)
Moreover, it’s not possible to access information about MediaDevices, device capabilities, or to use WebUSB.
Device Information
The following APIs are available on Cloud Phone, but return values that are either fixed or correspond to the Puffin server, not the client.
- Network Information
- Battery
- Device Memory
Warning: these APIs are present on Cloud Phone, but return incorrect information. For instance, the Battery API always returns level = 1
and charging = true
, and
navigator.deviceMemory
always returns the maximum value of 8
. These data likely correspond to the Puffin server, and not end-user device.
Note: it’s not possible to confirm if the Network Information API works correctly on Cloud Phone because devices running Cloud Phone only support one network type: 4G. Valid values for down/uplink speeds are not returned.
Miscellaneous
Here’s a compatibility list of other Web APIs on Cloud Phone:
- Crypto
- Fullscreen (not relevant)
- Vibrate
- Clipboard
- Selection
- Popover
- WebHID
- Picture-in-Picture (PiP)
- Contacts
- Badging (noop)
- Screen Orientation
- Barcode
- Media Session (available, noop)
- Encrypted Media (available, no key systems)
The
Screen Orientation API is available, but orientation is fixed in portrait-primary and attempts to set an orientation lock throw this error: screen.orientation.lock() is not available on this device.
.
Encrypted Media is also available, but support for Widevine, Primetime, PlayReady is missing. navigator.setAppBadge
is available, but is a no operation (noop). Finally, the Fullscreen API is available but effectively useless since all Cloud Phone widgets run in fullscreen already. Similarly, Picture-in-Picture would not make sense on devices with QQVGA and QVGA screens.
Summary
Cloud Phone is an exciting platform that allows budget feature phone users to access many important services using standard web technology. However, Cloud Phone developers should be aware of which features are and are not supported. Moreover, developers should make use of runtime feature detection to maximize compatibility and support graceful degradation. Finally, it’s always important to validate your widgets on real-world hardware.
Questions?
Join the Community!
- Reddit: r/CloudPhone
- Discord: r/CloudPhone
Cloud Phone is an emerging platform bringing rich experiences to feature phone users around the world. The author is among the earliest Cloud Phone developers, adapting the first podcast app, PodLP, for Cloud Phone. If you are excited about the possibilities and would like to learn how to bring your service to Cloud Phone, contact the author from the About page.