Beroun is a small set of cooperating processes. Window management stays in Weston, the interface is HTML in a WPE WebKit view, and everything the system can do is behind one daemon. This page is the map; the next pages go into each part.
Layers
| Layer | What it is | Responsibility |
|---|---|---|
| Frontends | HTML/JS pages: the launcher, apps, Caroline's views | Everything the owner sees and touches |
| Shell daemon | shelld, Python | Starts and tracks apps, serves pages, owns every API of the system |
| Services | Backends declared in manifests | Work that outlives an app's window, with memory and priority rules |
| Caroline | A privileged service and her views | The assistant, started and watched by the system |
| Native helpers | Small C programs | A browser host on WPE, the talking-head renderer, splash screens |
| Window system | Weston 14 | Windows and the screen. The HTML shell only asks shelld to start a program and shows what it started |
| Hardware interface | One interface per concern | Input, power, clock, network, audio, vibration, display, storage, memory (see Targets) |
Processes
| Process | Role |
|---|---|
| Weston | The compositor: the screen, windows, XWayland for X11 programs |
shelld | One HTTP server (default port 8765) with a WebSocket for input and per-page channels |
cog | WPE web views: the launcher's shared window, and every app with a window of its own |
| Services | Declared in manifests; started, measured and stopped by the service manager |
| Native helpers | ic-browser (the Browser), ic-face-view (Caroline's talking head), ic-screen (splash screens) |
| Target daemons | Power, swap and temp-directory watchers; see Targets |
The stack
Weston 14 with its desktop shell, WPE WebKit 2.52 (libwpe 1.16, wpebackend-fdo 1.16, cog 0.18), Python for the daemon and services, C for native helpers, and GStreamer for media. Versions are pinned in one file, and a target's image uses the same ones, so a page behaves identically everywhere.
Repository layout
Paths are relative to the root of the OS source tree.
| Path | Content |
|---|---|
runtime/ | The shell daemon and its modules: manifests, services, system API, notifications, clock, network, installer, agents, A2A, Caroline, speech |
web-shell/ | The launcher, platform.js, the on-screen keyboard, focus helpers, translations in i18n/ |
apps/ | The apps that ship with the system, one folder with a manifest.json each |
system/ | The system's own views: Caroline's chat, voice view and wizard, the external-screen splash; plus the system services list |
caroline/ | Caroline, pinned as a separate repository and treated as upstream |
caroline-overlay/ | Code that runs inside her process without changing her checkout |
native/ | The C helpers |
config/ | Extra launchables, the button map, weston.ini, pinned versions |
Where data lives
Beroun keeps system data, app data and the owner's files apart.
| What | Where | Notes |
|---|---|---|
| Logs and process ids | The state directory | shell.log, app-<id>.log, a log per daemon |
| System data | The data directory | The launcher database behind Platform.state, settings, sign-in, agent journals, Caroline's workspace |
| Installed apps | The apps directory | Writable. Apps that ship with the system are read-only |
| Data of store apps | <data>/apps/<id>/ | Removed with the app |
| The owner's files | The memory card | The root every app sees. The file API cannot reach anything outside it |
| Account | One credentials file | Shared with Caroline, so the system and the assistant sign in once |
Principles
Caroline is the system, not an app
Her views live in system/. Her backend is never stopped for memory, runs while the device sleeps and may take the window. No app can be privileged.
One manifest format
Apps and system views are described the same way. Unknown fields are errors.
The manifest is the approval
What an app declares is what it may do. Nobody clicks a dialog; what is not declared is not given.
Apps keep their place
A shared-window app saves its state when it closes and returns to it.
One interface to hardware
Everything that touches a device is behind a single interface, so a target supplies its own backend.
A tool for every call
Every API route has a Caroline tool. A test fails if a route has none.
A small input model
Apps get the cursor, A and B. The rest belongs to the system.
Memory is a budget
Services declare memory_mb and priority. Over the limit, the lowest priority stops first.
