Skip to content

Installing

Mert Cobanov edited this page Jul 29, 2026 · 3 revisions

Installing

BlackBerry OS 7 installs applications over the air: you open a .jad descriptor in the handset's own browser and it fetches the .jar beside it. There is no cable, no desktop tool, and no signing step.

The quick way

Open this on the handset's browser, over plain HTTP:

http://berryssh.cobanov.run/

Tap the install link. That is the whole procedure.

Serving it yourself

If you would rather host it, or you are building your own:

python3 tools/ota_server.py out

It prints a URL. Open that on the handset over Wi-Fi.

A generic static file server will not work, and the way it fails is the problem. Read the next section before reaching for python3 -m http.server.

Two MIME types, and why a normal server fails

berryssh.jad   text/vnd.sun.j2me.app-descriptor
berryssh.jar   application/java-archive

Serve the descriptor as anything else — text/plain, or the application/octet-stream a generic host guesses — and the browser displays it as text instead of installing it. Nothing says why. It just looks like a page of key-value pairs.

tools/ota_server.py exists solely to get those two headers right.

Plain HTTP is not laziness

An OS 7.1 browser offers TLS 1.0 at best, and its trust store is from 2011. A current CDN refuses TLS 1.0 and 1.1 outright and presents a certificate chained to a root that did not exist when the handset shipped. Neither half can be worked around from the device.

So whatever hostname you serve from must not redirect HTTP to HTTPS. On Cloudflare that means turning off "Always Use HTTPS" for that hostname. On a .dev domain it is hopeless regardless — .dev is an HSTS-preloaded TLD.

This applies only to fetching the installer. Once installed, berryssh does its own cryptography and does not use the browser's TLS for anything.

MIDlet-Jar-Size must be exact

The descriptor states the jar's length. If they disagree by even one byte the install fails silently. build.sh computes it, so this only bites when the two files come from different builds — which is easy to do accidentally through a cache. If you put a CDN in front, serve both no-store; caching a 240-byte descriptor buys nothing and can serve it beside a jar it does not describe.

Upgrading

The version in the descriptor must increase. Install a build whose version equals the installed one and the device refuses it as already installed, and says nothing about versions when it does.

Saved connections survive upgrades. The stored format is versioned and every older layout is still read.

907 Invalid JAR

If you built it yourself and the device says this, the jar was not preverified. See Building from source.

Clone this wiki locally