Bundled apps are listed in apps/apps.json. Additional drop-in apps are
self-contained folders (a manifest plus their files) that live in your user-data
folder — %APPDATA%\bedrock-panel\apps by default (see Storage location below) — so
they survive app updates. The easiest way to add one is Settings → Drop-In Apps → Browse…
and install from the app repository.
In the editor, + App adds an app page: pick the app and set its options, and
Bedrock Panel loads it full-screen on the panel with no hand-typed URLs.
Included apps:
- GitHub — a first-party repository, read-only Issues, and GitHub Actions panel with pull-request checks, workflow runs, jobs, steps, and confirmed rerun/cancel/dispatch controls. It signs in through GitHub OAuth Device Flow; tokens remain encrypted in the main process and are never exposed to the panel page.
- Flip Clock — split-flap animation, 12/24-hour, optional seconds, and a corner date/day. (12-hour shows a single hour card with an AM/PM badge; 24-hour shows two hour cards.) Follows the global light/dark theme and accent. Ships enabled by default (12-hour).
- World Clock — the time in several places at once. Two modes: US time zones (Pacific / Mountain / Central / Eastern) or a pick of 2–6 world cities; each shown as a digital readout or an analog face. Options include 12/24-hour, optional seconds (with a second hand on the analog faces), and a per-city label override (e.g. pick London but label it Edinburgh), and Auto-order by time zone — lay the cities out west → east by GMT offset instead of the order you picked them in. DST-correct via the system's time-zone database; follows the global light/dark theme and accent.
- Time Zone Converter — for "can you meet at 4:30 my time?". Same two modes as the World Clock: US time zones (PDT/PST … EDT/EST, the abbreviation in effect today bold) or a pick of 2–6 world cities (city name over its GMT offset, with the same per-city label override and Auto-order by time zone). Each zone gets an editable time — set one by spinning the inline drum picker (hour/minute/AM-PM wheels), typing, or scrolling, and the rest convert automatically. Sticky: keeps the last-set times across restarts and never snaps to the current time (that's the World Clock's job). 12/24-hour option.
- Music controller — now-playing + transport + a programmable app grid.
- System monitor — live CPU/GPU/RAM/disk/network/battery gauges.
- AI Voice — one voice+text app with a per-page Backend picker: a real Claude Code, Codex, or Copilot agent session on the panel (type or talk, watch replies stream, approve/deny actions from the touchscreen, tap the knob to start/stop), or plain chat against your Open WebUI server or any OpenAI-compatible API (OpenAI, DeepSeek, OpenRouter, LiteLLM/Ollama — your own key). Add multiple pages with different backends; each keeps its own session and settings.
- Meeting — one-tap mute/video/accept/decline/leave for Zoom and Teams, no keyboard or mouse.
- Microsoft 365 — an installable community drop-in with a read-only dashboard: your profile, live presence, and upcoming calendar entries pulled from Microsoft Graph after you choose Connect in that app page's editor settings (or on its disconnected panel), plus up to eight configurable app shortcuts (Teams, Outlook, Word, Excel, PowerPoint, OneNote, OneDrive, Microsoft 365) that either focus an already-open window or launch it, and a one-tap Join meeting for the current/next event. Meeting links follow the configured Teams header app's Open with mode: web, desktop, or desktop with web fallback.
- Home Assistant Dashboard — pick a Lovelace dashboard from your HA server in a dropdown, no hand-typed URLs. Requires Use Home Assistant in Settings → Auth; hidden from the App picker otherwise. Uses your global HA token so login persists. (See the full HA guide for entity tiles + icons.)
- Screensaver — built-in animated scenes (Waves, Starfield, Lava lamp, Fireflies, Flurry — drawn live, no media files) or your own photos and videos (separate folders; slideshow or scrapbook collage). Optional idle auto-start: after N quiet minutes the panel switches to it by itself, and any touch or knob input returns you to exactly the page you left.
- Keyboard Shortcuts — a live cheat-sheet, three columns: System (the auto-rotation toggle hotkey, if set), Pages (every page's own jump-to hotkey), and Custom — a free-text list of shortcut/description pairs for other programs, edited right on the app's own App tab in the editor (same spot as any app's options) with a + Add another shortcut row-adder, same as the World Clock's city picks. That list is shared across every page running the app, not per-page — edit it from any one of them and every other instance shows the update. Updates live on the panel — no restart needed after adding a page hotkey or editing the custom list.
A drop-in app is a self-contained folder. Install one from a GitHub app repository with
Settings → Drop-In Apps → Browse…, or place the folder by hand in your
drop-in apps folder (%APPDATA%\bedrock-panel\apps by default — see Storage location
below):
%APPDATA%\bedrock-panel\apps\
my-app\
app.json
index.html
style.css
app.js
Bedrock Panel only discovers drop-in apps from that user-data folder — not from the bundled install directory — so an update never wipes them out.
The manifest can be named app.json or manifest.json:
{
"id": "my-app",
"name": "My App",
"entry": "index.html",
"served": false,
"options": []
}Rules:
idmust start with a lowercase letter or digit and then use only lowercase letters, digits,_, or-.entrymust be a relative file path inside the app folder and must not contain...- Duplicate ids are skipped; bundled
apps/apps.jsonentries win. optionsuses the same schema as bundled apps. The editor stores each option on the app page and passes non-secret values to the app at launch.
After adding or editing a folder app, click Refresh beside the App dropdown in the editor to reload manifests.
The editor's Settings → Drop-In Apps tab manages app folders for you:
- App repositories — one or more GitHub folders serving an
index.jsoncatalog plus app.zips. Browse… lists a repository's apps; Install downloads and unzips one into your drop-in folder — you're warned first if the app bundles executable code (aservermodule or programs/scripts). Onlygithub.comrepositories are accepted. Enable Allow multiple drop-in app repositories (Advanced) to add more than one source. - Check for updates — per repository, or Check all for updates across every installed app; compares the catalog version against what's installed and offers to update.
- Export — zip an installed drop-in app to share it.
- Delete — remove an app's folder.
- Refresh — re-scan for changes.
- Community apps ↗ — the default source: the community-apps repository. See Community apps for installing and submitting.
Storage location (Advanced) — drop-in apps live in %APPDATA%\bedrock-panel\apps by default
(switchable to %LOCALAPPDATA%\bedrock-panel\apps). This is the only place Bedrock Panel looks for
drop-in apps, and it survives app updates — unlike the install folder, which an update
overwrites. Switching the location moves where new imports land; move any existing app folders
across yourself if you change it.
- Static (
"served": false) — Bedrock Panel loadsentrydirectly viafile://from the app folder. Options are passed in the URL hash:index.html#color=red. Static apps are best for self-contained HTML/CSS/JS. - Served (
"served": true) — Bedrock Panel serves the app folder on the local loopback server athttp://127.0.0.1:<port>/apps/<id>/<entry>. Options are passed as normal query parameters:index.html?color=red. Use this for apps that need same-originfetch, browser APIs that require HTTP, or multiple static assets served through the same origin.
Served drop-in apps can also declare host-side helpers:
{
"server": "server.js",
"proxy": {
"methods": ["GET"],
"verifySslOption": "verifySsl",
"allow": [{ "option": "host" }]
}
}serverloads a local Node module from the app folder. It should exporthandle(action, context). The page calls it with/app-api/<action>."serverAutoStart": trueloads the server module at host startup (and after install/update) instead of on the first/app-apicall — use it when the module runs background work like schedules. Leave it off for plain request/response servers.context.optionscontains the active app options, including options marked"serverOnly": trueand secret options."serverOnly": truekeeps an option out of the page URL while still making it available to the server adapter and/app-proxy/config./app-proxy?url=...is available only to the requesting app page and only for URLs allowed by the app manifest.{ "option": "host" }allows requests to the configured host origin, including LAN devices.context.host.getHaAuth()returns the shared Home Assistant credentials from Settings → Auth ({ url, token, useHa }), so an HA app doesn't ask the user to re-enter them. Server modules only — never hand the token to your page.
See docs/app-template/ for a minimal starting point.
The bedrock-panel-drop-in-app
skill in community-apps/skills/ guides Claude through scaffolding,
modifying, or migrating a drop-in app. Drop it into your
.claude/skills/ folder (or invoke it with /skill) and Claude will
follow the manifest contract, keep edits inside apps/<app-id>/, and
prefer the generic /app-proxy / /app-api capabilities over
host-specific routes.
Two kinds of bundled app:
- Static (
file://) — drop an HTML file inapps/that reads its settings from the URL hash (e.g.…/myapp.html#color=red) — a?querydoesn't survive afile://load — and add an entry toapps/apps.jsondescribing its options. The Flip Clock is one. - Served (
"served": true) — for apps that need live host data, a same-originfetch, or an embedded launcher grid. Bedrock Panel serves these over a loopback HTTP server athttp://127.0.0.1:<port>/<id>, so they get real?queryparams and a secure context (needed for things like the microphone). The Music controller and Open WebUI app use this. A served app can also carry its own editable tile grid ("grid"in its manifest entry) — the "grid embedded in an app" capability.
