BEROUNOS for AI-native devices

Store and releases

Signed packages, safe installs.

Apps reach a device as signed zips. The system verifies every file, installs beside the old copy, and puts the old state back on any failure.

Apps reach a Beroun device as signed packages. The catalog checks and signs them; the system checks them again, file by file, installs beside the old copy and puts the old state back on any failure. Owners see in plain words what an app asks for before they install it.

The pieces

PieceRole
Catalog and arbiterReceives packages, checks them, signs at approval, and serves the catalog for platform beroun
System sideappinstall and the store routes of the shell: download, verify, install, update, remove with rollback
The Store appA system app with the permission apps.manage: lists All, Installed, Updates, shows a card with what the app asks for, and installs, updates or removes
Packaging toolsScripts that build packages from a commit and publish them
The Store list with filters All, Installed and Updates
The list, with the filters All, Installed and Updates.
An app card showing what the app asks for
An app card: what it asks for, in plain words.

A package

A zip: the app folder with manifest.json at the root, plus a sign.list added by the arbiter at approval.

# sign.list: one line per file, sorted by path, then the signature index.html: 3f1c9a…e0 manifest.json: b72d04…19 icon.svg: 9a60cf…7d ---SIGNATURE--- MEUCIQ…base64 Ed25519 signature over the lines above…

The arbiter's key is made once by the operator. Its public half is built into the system, so a device accepts nothing else.

Package rules

Checked by the arbiter, and again by the system on the device:

  • Format 1, and the beroun field (the lowest OS version) is required.
  • No native programs; no .so, .dll, ELF, PE or Mach-O files; python3 is the only program a service may run.
  • module and privileged services are refused. Service ports are 49000–49999.
  • No links and no ..; size limits apply.
  • The only permission is caroline.ask.
  • system must match whether the id is a system app, and only a platform admin may publish one.
  • required capabilities are checked against the device. A device offers Notification, FileStorage, Network, Microphone and ExternalDisplay.

Install, update, remove

Downloadstore address only Verifysha256 · signature Check filesevery hash · rules Build beside oldthen swap On the launcherno restart Any failure puts the previous state back · a crash half-way is repaired at the next start never a downgrade · a service id or port belonging to another app is refused
The system doesn't trust the download: it checks it twice, installs beside the old copy, and can always go back.
  • Install and update: POST /api/store/install {"app": "<id>"}. The app is on the launcher at once. Its services, endpoints, agents, permissions, big page and Caroline's tools appear without a restart, and return at start.
  • Remove: a store app is closed, its services stop, everything it registered is undone, and its folder, data and saved place are deleted. Files it wrote to the memory card stay.
  • Preinstalled apps are hidden when removed and keep their data. Installing one again restores it from the system without a download. System apps are only updated.
  • Automatic updates: the setting auto_update (on by default). A minute after start and every six hours the shell installs waiting updates, except one that asks for more rights than the installed version, or whose app is open. A notification names each one, and the Store tile shows a badge with their number.
ErrorStatus
offline502
not-found, not-installed404
system403
conflict, not-higher, missing-capability409
bad-signature422
no-key503

Only the Store's page and Caroline may call /api/store/*.

Publishing

To ship a new version of an app: raise version in the manifest, commit, build the package from that commit (never from the working tree), and publish it. The packager adds the beroun field if it is missing, writes <id>-<version>.zip with a listing (name, description, category, icon), and refuses a package that breaks the rules. A version that is already published is refused.

scripts/beroun-pack.py OUT_DIR [app ...] # packages from git HEAD ARBITER=… ADMIN_TOKEN=… scripts/beroun-publish.sh OUT_DIR # the token comes from the environment only

Music, Video, Calculator, Notepad, Files, Communicator, the three games, Settings and Wi-Fi are published at the system's own versions. Apps with native parts or system-owned ports (Browser, Calendar, Clock, Ratatosk, Store) ship with the system.

Versions

  • The OS version appears in Settings > About and GET /api/about. Apps state the minimum OS they need in beroun; one that needs a newer OS than the device has is refused.
  • Pinned Weston and WPE versions are the contract a system image follows.
  • Caroline reaches every device through her own signed release for platform beroun (see Caroline).