Go to file
2024-08-27 12:34:48 +10:00
.github/workflows update linter action 2024-07-29 14:51:52 +10:00
adguard-home Update Adguard Home to v0.107.52 (#1212) 2024-07-18 10:35:13 +10:00
affine Update affine to 0.16.1 (#1342) 2024-08-13 11:31:58 +10:00
agora Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
alby-nostr-wallet-connect Remove periods from the end of taglines (#1120) 2024-06-03 18:25:40 -07:00
audiobookshelf Update audiobookshelf to version v2.12.3 (#1329) 2024-08-13 09:29:38 +10:00
autobrr Update autobrr to v1.45.0 (#1377) 2024-08-26 21:07:13 +10:00
back-that-mac-up Finalize Widgets for umbrelOS 1.0 (#1024) 2024-03-18 05:33:27 -07:00
bazarr Update Bazarr to v1.4.3 (#1215) 2024-07-18 11:20:45 +10:00
bitcoin Update Bitcoin Node to v27.0 (#1074) 2024-05-01 17:26:32 -07:00
bitcoin-knots Update Bitcoin Knots to v27.1.knots20240801 (#1295) 2024-08-05 09:21:24 +10:00
bitfeed Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
bleskomat-server Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
blockstream-blind-oracle Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
bluewallet Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
btc-rpc-explorer Update BTC RPC Explorer with RPC Terminal Functionality (#1319) 2024-08-07 20:47:03 +10:00
btcpay-server BTCPay Server hotfix for NBXplorer (#1293) 2024-08-01 21:50:17 +10:00
budibase Update budibase to version 2.31.1 (#1378) 2024-08-27 10:13:39 +10:00
calibre-web Update calibre-web to version 0.6.23 (#1300) 2024-08-07 09:50:47 +10:00
chatbot-ui Update chatbot-ui to 2023.04.20 (#646) 2023-06-23 18:18:42 +07:00
chatpad-ai Update Chatpad AI to commit bb5f4a (#1193) 2024-07-09 13:11:31 +10:00
circuitbreaker Update Circuitbreaker to v0.5.1 (#908) 2023-12-20 13:01:17 -08:00
cloudflared Update Cloudflare Tunnel to 2024.6.1 (web 1.0.2) (#1234) 2024-07-23 13:23:45 +10:00
code-server Update code-server to version v4.92.2 (#1379) 2024-08-27 10:18:14 +10:00
core-lightning Update Core Lightning to v24.05 and RTL(CLN) to v0.15.2 (#1155) 2024-07-09 11:07:27 +10:00
core-lightning-rtl Update Core Lightning to v24.05 and RTL(CLN) to v0.15.2 (#1155) 2024-07-09 11:07:27 +10:00
databag Update Databag to v0.1.15 (#1154) 2024-06-16 16:48:34 -07:00
duplicati App Submission: Duplicati (#1179) 2024-07-31 10:42:11 +10:00
electrs Update Electrs to v0.10.2 (#933) 2024-01-10 17:27:24 -08:00
element Update element to version v1.11.75 (#1380) 2024-08-27 10:25:00 +10:00
elements Update Elements to v23.2.1 (#905) 2023-12-15 11:15:05 -08:00
esphome Update esphome to 2024.8.0 (#1381) 2024-08-27 10:27:34 +10:00
file-browser Update File Browser to 2.30.0 (#1227) 2024-07-22 16:00:45 +10:00
firefly-iii Update firefly-iii to version v6.1.19 (#1250) 2024-07-30 14:13:52 +10:00
firefly-iii-importer Update firefly-iii-importer to version v1.5.4 (#1382) 2024-08-27 10:32:16 +10:00
firefox Update firefox to 128.0.3 (#1343) 2024-08-13 11:37:56 +10:00
freshrss Update freshrss to 1.24.2 (#1383) 2024-08-27 10:35:44 +10:00
frigate Update frigate to version v0.14.0 (#1331) 2024-08-26 20:56:57 +10:00
ghostfolio Update ghostfolio to 2.105.0 (#1384) 2024-08-27 10:44:43 +10:00
gitea Update Gitea to 1.22.1 (#1224) 2024-07-23 14:06:00 +10:00
heimdall Update heimdall to 2.6.1 (#1010) 2024-03-15 16:53:51 +11:00
helipad Update Helipad to v0.2.0 (#1076) 2024-05-06 23:30:52 -07:00
home-assistant Update home-assistant to version 2024.8.3 (#1398) 2024-08-27 12:34:48 +10:00
homebox Update homebox to 0.10.3 (#981) 2024-02-23 11:35:54 -08:00
homebridge Update homebridge to version 1.8.4 (#1344) 2024-08-13 11:54:37 +10:00
immich Update immich to v1.112.1 (#1363) 2024-08-15 14:37:23 +10:00
invidious Update Invidious to 2024.4.26-eda7444 (#1069) 2024-04-29 06:45:21 -07:00
invoice-ninja Update invoice-ninja to version v5.10.26 (#1385) 2024-08-27 10:56:17 +10:00
ipfs-podcasting Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
itchysats Update categories 2023-06-21 14:58:25 +07:00
jackett Update jackett to v0.22.515 (#1386) 2024-08-27 10:58:52 +10:00
jam Update Jam to v0.2.0-patch-20240521 (#1101) 2024-05-22 04:08:04 -07:00
jellyfin Update jellyfin to v10.9.10 (#1387) 2024-08-27 11:06:12 +10:00
jellyseerr Update Jellyseer from 1.7.0 to 1.9.2 (#1218) 2024-07-18 10:34:19 +10:00
just-download App Submission: Just. Download. (#1060) 2024-06-10 18:41:34 -07:00
kollider Update categories 2023-06-21 14:58:25 +07:00
krystal-bull Update categories 2023-06-21 14:58:25 +07:00
libreddit Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
libreoffice Update libreoffice to version 7.6.7 (#1345) 2024-08-13 12:04:20 +10:00
librespeed Update librespeed to 5.4.1 (#1335) 2024-08-13 10:24:59 +10:00
libretranslate Update libretranslate to v1.6.0 (#1263) 2024-07-31 12:44:52 +10:00
lidarr Update lidarr to v2.4.3.4248 (#1264) 2024-07-31 12:31:18 +10:00
lightning Update Lightning Node to v0.18.0-beta (#1159) 2024-06-16 21:14:19 -07:00
lightning-shell Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
lightning-terminal Update Lightning Terminal to v0.13.3-alpha (#1245) 2024-07-30 11:20:08 +10:00
llama-gpt Update LlamaGPT submission link 2023-08-16 21:21:53 +07:00
ln-visualizer App manifest fixes (#1081) 2024-05-20 19:21:50 -07:00
lnbits update to v0.12.2 (#1008) 2024-03-15 16:53:32 +11:00
lndboss disable lndboss and add deprecation notice 2024-05-20 15:46:07 +10:00
lndg Update LNDg to v1.8.0 (#923) 2024-01-09 16:16:18 -08:00
lnmarkets Update LN Markets to v2.0.1 (#964) 2024-02-19 09:47:58 -08:00
lnplus Update categories 2023-06-21 14:58:25 +07:00
maybe Update maybe to version 0.1.0-alpha.14 (#1346) 2024-08-13 12:12:08 +10:00
mealie Update mealie to v1.12.0 (#1388) 2024-08-27 11:17:24 +10:00
memos Update memos to version v0.22.4 (#1266) 2024-07-31 13:04:17 +10:00
mempool Add Mempool 3.0 release notes 2024-08-27 09:46:07 +10:00
metube Update metube to version 2024-08-07 (#1347) 2024-08-13 12:15:03 +10:00
minio Update minio to RELEASE.2024-08-17T01-24-54Z (#1389) 2024-08-27 11:18:56 +10:00
monero App Submission: Monero Node (#690) 2024-06-25 16:10:24 -07:00
morphos App Submission: Morphos server (#1020) 2024-05-10 05:15:37 -07:00
myspeed App Submission: MySpeed (#1103) 2024-06-10 06:19:10 -07:00
n8n Update n8n to n8n@1.55.3 (#1390) 2024-08-27 11:33:12 +10:00
navidrome Update Navidrome to v0.52.5-hotfix (#1303) 2024-08-06 21:14:13 +10:00
nextcloud Update Nextcloud to v29.0.5 (#1369) 2024-08-27 09:13:33 +10:00
nitter Update categories 2023-06-21 14:58:25 +07:00
node-red Update node-red to version 4.0.2 (#1270) 2024-07-31 13:45:31 +10:00
node-red-standalone Update node-red-standalone to version 4.0.2 (#1271) 2024-07-31 13:37:52 +10:00
nolooking Update categories 2023-06-21 14:58:25 +07:00
nostr-relay Finalize Widgets for umbrelOS 1.0 (#1024) 2024-03-18 05:33:27 -07:00
nostrudel App Submission: noStrudel (#901) 2024-02-22 23:09:01 -08:00
ntfy Convert environment variable booleans to strings for umbrelOS 0.5 compatibility (#1176) 2024-06-25 06:26:04 -07:00
nutstash-wallet Remove periods from the end of taglines (#1120) 2024-06-03 18:25:40 -07:00
oak-node Bump Oak Node to v0.3.8 (#780) 2023-10-03 12:07:01 -07:00
octoprint Update octoprint to version 1.10.2 (#1272) 2024-07-31 14:34:15 +10:00
onlyoffice-nextcloud App Submission: ONLYOFFICE Document Server for Nextcloud (#1288) 2024-08-06 13:04:45 +10:00
ordinals Update Ordinals to v0.18.2 (#1057) 2024-04-18 05:59:43 -07:00
overseerr Update Overseer to 1.33.2 (#1077) 2024-05-06 23:46:53 -07:00
paperless Update paperless to v2.11.6 (#1391) 2024-08-27 12:01:10 +10:00
passky-client Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
passky-server Update passky-server to version v8.1.7 (#1312) 2024-08-07 11:49:32 +10:00
peerswap Update PeerSwap to v1.6.7 (#1241) 2024-07-25 13:36:25 +10:00
penpot Update penpot to 2.1.2 (#1367) 2024-08-15 15:28:18 +10:00
photoprism Update photoprism to version 240711-2197af848 (#1313) 2024-08-07 12:01:53 +10:00
pi-hole Update pi-hole to version 2024.07.0 (#1348) 2024-08-13 12:33:32 +10:00
plex Update Plex to v1.40.4 (#1211) 2024-07-16 13:03:30 +10:00
pocketbase Update pocketbase to version v0.22.19 (#1368) 2024-08-15 15:07:35 +10:00
portainer Update portainer to version 2.19.5 (#1276) 2024-07-31 16:01:05 +10:00
prowlarr Update prowlarr to version v1.21.2.4649 (#1277) 2024-07-31 16:06:01 +10:00
public-pool Update public pool (#983) 2024-02-27 17:00:46 +11:00
qbittorrent Update all Servarr apps and download clients to auto-configure (#1194) 2024-07-09 22:26:47 +10:00
radarr Update radarr to v5.9.1.9070 (#1392) 2024-08-27 12:02:35 +10:00
readarr Update readarr to version 0.3.32.2587 (#1349) 2024-08-13 12:37:01 +10:00
remmina Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
ride-the-lightning Update Ride the Lightning to v0.15.2 (#1156) 2024-06-28 04:54:31 -07:00
robosats Update RoboSats to v0.6.0-alpha (#1022) 2024-03-26 15:34:40 -07:00
rotki Update rotki to v1.34.3 (#1393) 2024-08-27 12:07:13 +10:00
sabnzbd Update sabnzbd to version 4.3.3 (#1394) 2024-08-27 12:09:00 +10:00
saifa App Submission: Saifa (#1021) 2024-05-27 21:05:00 -07:00
samba App Submission: Samba (#1161) 2024-07-30 12:24:46 +10:00
samourai-server Update categories 2023-06-21 14:58:25 +07:00
satsale Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
seafile Update seafile to version 11.0.11 (#1354) 2024-08-13 14:07:45 +10:00
simple-torrent Update categories 2023-06-21 14:58:25 +07:00
snapdrop Update snapdrop to version debd13a0 (#1353) 2024-08-13 13:53:58 +10:00
snort Update Snort to v0.2.1 (#1182) 2024-07-02 11:29:43 +10:00
snowflake Update snowflake to v2.7.0 (#849) 2023-11-15 22:20:40 -08:00
sonarr Update sonarr to v4.0.8.1874 (#1280) 2024-07-31 21:41:48 +10:00
sparkkiosk Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
specter-desktop Update Specter Desktop to 2.0.2 (#894) 2024-01-09 14:06:43 -08:00
sphinx-relay Update categories 2023-06-21 14:58:25 +07:00
squeaknode Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
squeakroad Update categories 2023-06-21 14:58:25 +07:00
stirling-pdf Update stirling-pdf to v0.28.3 (#1395) 2024-08-27 12:19:05 +10:00
suredbits-wallet Update categories 2023-06-21 14:58:25 +07:00
synapse Update synapse v1.55.0 (#1357) 2024-08-15 11:38:58 +10:00
syncthing Update syncthing to version v1.27.10 (#1339) 2024-08-13 11:02:43 +10:00
tailscale Update tailscale to version v1.72.1 (#1396) 2024-08-27 12:29:27 +10:00
tallycoin-connect Remove periods from the end of taglines (#1120) 2024-06-03 18:25:40 -07:00
tautulli Update tautulli to v2.14.4 (#1340) 2024-08-13 11:06:52 +10:00
tdex Remove periods from the end of taglines (#1120) 2024-06-03 18:25:40 -07:00
teamspeak temporarily disable TeamSpeak 2024-07-09 20:26:11 +10:00
technitium-dns Update technitium-dns to version 12.2.1 (#1352) 2024-08-13 13:41:39 +10:00
thunderhub Update Thunderhub to v0.13.31 (#1102) 2024-05-23 17:42:39 -07:00
torq Update Torq to v1.5.1 (#956) 2024-02-05 12:31:17 -08:00
transmission Update Transmission to 4.0.6 (#1240) 2024-07-24 22:30:22 +10:00
trilium-notes Update trilium-notes to version v0.63.7 (#1285) 2024-08-01 12:03:40 +10:00
umami Update umami to v2.13.1 (#1397) 2024-08-27 12:29:11 +10:00
uptime-kuma Update Uptime Kuma - whitelist api route in app proxy (#1322) 2024-08-07 21:58:13 +10:00
urbit Update Urbit to 3.1 (#1355) 2024-08-13 14:39:52 +10:00
urbit-bitcoin-connector Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
usocial Add missing release notes keys (#1109) 2024-05-29 17:46:25 -07:00
vaultwarden Update vaultwarden to 1.32.0 (#1341) 2024-08-13 11:24:17 +10:00
vikunja Vikunja update to 0.24.1 (#1230) 2024-08-14 13:17:13 +10:00
watch-your-lan Modify WatchYourLAN tagline 2024-02-23 09:47:11 -08:00
whoogle-search Update whoogle-search to 0.8.4 (#841) 2023-11-14 14:27:33 -08:00
wikijs Update wikijs to version v2.5.303 (#1287) 2024-07-31 22:37:14 +10:00
wireguard Update wireguard to version 14 (#1351) 2024-08-13 13:35:44 +10:00
woofbot Update WoofBot to v0.9.8 (#773) 2023-09-17 21:47:49 -07:00
woofbot-lnd Update WoofBot to v0.9.8 (#773) 2023-09-17 21:47:49 -07:00
yucca Update Yucca tagline and description 2024-07-30 11:57:41 +10:00
README.md update README 2024-06-06 16:14:30 +10:00

Umbrel App Framework

🚨 This is the current workflow for developing and testing an app on umbrelOS 1.0.x. The app framework is under active development and this workflow will change in the future. For testing on umbrelOS 0.5.4, please refer to the previous version of this document.

If you can code in any language, you already know how to develop an app for Umbrel. There is no restriction on the kinds of programming languages, frameworks, or databases that you can use. Apps run inside isolated Docker containers, and the only requirement (for now) is that they should have a web-based UI.

Some server apps might not have a UI at all. In that case, the app should serve a simple web page listing the connection details, QR codes, setup instructions, and anything else needed for the user to connect. The user is never expected to have CLI access on Umbrel.

To keep this document short and easy, we won't go into the app development itself, and will instead focus on packaging and testing an existing app.

Let's jump into action by packaging BTC RPC Explorer, a Node.js based blockchain explorer, for Umbrel.

There are 4 steps:

  1. 🛳 Containerizing the app using Docker
  2. ☂️ Packaging the app for Umbrel
  3. 🛠 Testing the app on Umbrel
    1. Test using a Linux VM on your local machine with Multipass
    2. Testing on a Raspberry Pi or Umbrel Home
  4. 🚀 Submitting the app

1. 🛳  Containerizing the app using Docker

1. Let's start by cloning BTC RPC Explorer on our system:

git clone --branch v2.0.2 https://github.com/janoside/btc-rpc-explorer.git
cd  btc-rpc-explorer

2. Next, we'll create a Dockerfile in the app's directory:

FROM node:12-buster-slim AS builder

WORKDIR /build
COPY . .
RUN apt-get update
RUN apt-get install -y git python3 build-essential
RUN npm ci --production

FROM node:12-buster-slim

USER 1000
WORKDIR /build
COPY --from=builder /build .
EXPOSE 3002
CMD ["npm", "start"]

A good Dockerfile:

  • Uses a lightweight base image - this results in less storage consumption and faster app installs.
  • Uses multi-stage builds for smaller image size.
  • Excludes development files in the final image.
  • Has only one service per container.
  • Doesn't run the service as root.
  • Uses remote assets that are verified against a checksum.
  • Results in deterministic image builds.

3. We're now ready to build the Docker image of BTC RPC Explorer. Umbrel supports both 64-bit ARM and x86 architectures, so we'll use docker buildx to build, tag, and push multi-architecture Docker images of our app to Docker Hub. This way, the same app can be installed on both ARM and x86 devices.

docker buildx build --platform linux/arm64,linux/amd64 --tag getumbrel/btc-rpc-explorer:v2.0.2 --output "type=registry" .

You need to enable "experimental features" in Docker to use docker buildx.


2. ☂️  Packaging the app for Umbrel

1. Let's fork the getumbrel/umbrel-apps repo on GitHub, clone our fork locally, create a new branch for our app, and then switch to it:

git clone https://github.com/<YOUR-GITHUB-USERNAME>/umbrel-apps.git
cd umbrel-apps

2. It's now time to pick an ID for our app. An app ID should only contain lowercase alphabetical characters and dashes, and should be human readable and recognizable. For this app we'll go with btc-rpc-explorer.

We need to create a new subdirectory in the apps directory with the same name as our app ID and move into it:

mkdir btc-rpc-explorer
cd btc-rpc-explorer

3. Within the app's directory, we'll now create the skeleton for our app with the following files:

  • docker-compose.yml - Used to start and stop your app's Docker containers
  • umbrel-app.yml - An app manifest file so that Umbrel knows the name and version of the app
  • exports.sh - A shell script to export environment variables used within docker-compose.yml and share with other installed apps

We'll now create a docker-compose.yml file in this directory to define our application.

New to Docker Compose? It's a simple tool for defining and running Docker applications that can have multiple containers. Follow along with the tutorial, we promise it's not hard if you already understand the basics of Docker.

Let's copy-paste the following docker-compose.yml template into a text editor and modify it according to our app.

version: "3.7"

services:
  app_proxy:
    environment:
      # <app-id>_<web-container-name>_1
      # e.g. 'btc-rpc-explorer_web_1'
      # Note that the '_1' at the end is needed
      APP_HOST: <web-container-dns-name>
      APP_PORT: <web-container-port-number>
  
  web:
    image: <docker-image>:<tag>@sha256:<digest>
    restart: on-failure
    stop_grace_period: 1m
    ports:
      # You do not need to expose the port that your app's web server is listening on if you're using the app_proxy service.
      # This is handled by the APP_HOST and APP_PORT environment variables in the service above.
      #
      # If you need to expose additional ports, you can do so like this, replacing <port> with the port number:
      - <port>:<port>
    volumes:
      # Uncomment to mount your data directories inside
      # the Docker container for storing persistent data
      # - ${APP_DATA_DIR}/foo:/foo
      # - ${APP_DATA_DIR}/bar:/bar
      #
      # Uncomment to mount LND's data directory as read-only
      # inside the Docker container at path /lnd
      # - ${APP_LIGHTNING_NODE_DATA_DIR}:/lnd:ro
      #
      # Uncomment to mount Bitcoin Core's data directory as
      # read-only inside the Docker container at path /bitcoin
      # - ${APP_BITCOIN_DATA_DIR}:/bitcoin:ro
    environment:
      # Pass any environment variables to your app for configuration in the form:
      # VARIABLE_NAME: value
      #
      # Here are all the Umbrel provided variables that you can pass through to
      # your app
      # System level environment variables
      # $DEVICE_HOSTNAME - Umbrel server device hostname (e.g. "umbrel")
      # $DEVICE_DOMAIN_NAME - A .local domain name for the Umbrel server (e.g. "umbrel.local")
      #
      # Tor proxy environment variables
      # $TOR_PROXY_IP - Local IP of Tor proxy
      # $TOR_PROXY_PORT - Port of Tor proxy
      #
      # App specific environment variables
      # $APP_HIDDEN_SERVICE - The address of the Tor hidden service your app will be exposed at
      # $APP_PASSWORD - Unique plain text password that can be used for authentication in your app, shown to the user in the Umbrel UI
      # $APP_SEED - Unique 256 bit long hex string (128 bits of entropy) deterministically derived from user's Umbrel seed and your app's ID
  # If your app has more services, like a database container, you can define those
  # services below:
  # db:
  #   image: <docker-image>:<tag>@sha256:<digest>
  #   ...

Our app manifest YAML file tells Umbrel details about our app such as the name, description, dependencies, port number to access the app, etc.

There are currently two manifest versions: 1 and 1.1. Version 1 is the basic version and is sufficient for most apps. However, if your app requires the use of hooks (scripts that are run at different stages of the app lifecycle), you need to use version 1.1. Hooks allow you to perform custom actions at different stages of the app's lifecycle, such as before the app starts (pre-start), after the app installs (post-install), and more. If your app doesn't need to use hooks, you can stick with manifest version 1.

manifestVersion: 1
id: btc-rpc-explorer
category: finance
name: BTC RPC Explorer
version: "3.3.0"
tagline: Simple, database-free blockchain explorer
description: >-
  BTC RPC Explorer is a full-featured, self-hosted explorer for the
  Bitcoin blockchain. With this explorer, you can explore not just the
  blockchain database, but also explore the functional capabilities of your
  Umbrel.

  It comes with a network summary dashboard, detailed view of blocks, transactions, addresses, along with analysis tools for viewing stats on miner activity, mempool summary, with fee, size, and age breakdowns. You can also search by transaction ID, block hash/height, and addresses.

  It's time to appreciate the "fullness" of your node.  
releaseNotes: >-
  Dark mode is finally here! Easily switch between your preferred mode
  in one click.

  This version also includes lots of minor styling improvements, better
  error handling, and several bugfixes.  
developer: Dan Janosik
website: https://explorer.btc21.org
dependencies:
  - bitcoin
  - electrs
repo: https://github.com/janoside/btc-rpc-explorer
support: https://github.com/janoside/btc-rpc-explorer/discussions
port: 3002
gallery:
  - 1.jpg
  - 2.jpg
  - 3.jpg
path: ""
defaultUsername: ""
defaultPassword: ""
submitter: Umbrel
submission: https://github.com/getumbrel/umbrel/pull/334

The dependencies section within the app manifest gives Umbrel a list of app IDs that must be already installed in order for the user to install BTC RPC Explorer and also function.

The exports.sh shell script is a simple script to export environmental variables that your docker-compose.yml can read. These environment variables are also accessible when other apps start through their docker-compose.yml files. Most applications will not require this feature.

If we (for example) wanted to share BTC RPC Explorer's Address API with other apps; that would look like this:

export APP_BTC_RPC_EXPLORER_ADDRESS_API="electrumx"

4. For our app, we'll update <docker-image> with getumbrel/btc-rpc-explorer, <tag> with v2.0.2, <digest> with f8ba8b97e550f65e5bc935d7516cce7172910e9009f3154a434c7baf55e82a2b, and <port> with 3002. Since BTC RPC Explorer doesn't need to store any persistent data and doesn't require access to Bitcoin Core's or LND's data directories, we can remove the entire volumes block.

The digest is a unique, immutable identifier for the Docker image. This will supersede the tag in the docker-compose.yml file. The reason we want to pull an image by its digest, is that we are guaranteed to get the exact same image every time, and this image will be the same image that was tested and verified to work on umbrelOS. It is important to make sure that this digest is the multi-architecture digest, and not the digest for a specific architecture.

BTC RPC Explorer is an application with a single Docker container, so we don't need to define any other additional services (like a database service, etc) in the compose file.

If BTC RPC Explorer needed to persist some data we would have created a new data directory next to the docker-compose.yml file. We'd then mount the volume - ${APP_DATA_DIR}/data:/data in the docker-compose.yml to make the directory available at /data inside the container.

Updated docker-compose.yml file:

version: "3.7"

services:
  app_proxy:
    environment:
      APP_HOST: btc-rpc-explorer_web_1
      APP_PORT: 8080

  web:
    image: getumbrel/btc-rpc-explorer:v2.0.2@sha256:f8ba8b97e550f65e5bc935d7516cce7172910e9009f3154a434c7baf55e82a2b
    restart: on-failure
    stop_grace_period: 1m
    environment:
      BTCEXP_PORT: 8080

5. Next, let's set the environment variables required by our app to connect to Bitcoin Core, Electrum server, and for app-related configuration (as required by the app).

So the final version of docker-compose.yml would be:

version: "3.7"

services:
  app_proxy:
    environment:
      APP_HOST: btc-rpc-explorer_web_1
      APP_PORT: 8080
      
  web:
    image: getumbrel/btc-rpc-explorer:v2.0.2
    restart: on-failure
    stop_grace_period: 1m
    environment:
      PORT: 8080

      # Bitcoin Core connection details
      BTCEXP_BITCOIND_HOST: $APP_BITCOIN_NODE_IP
      BTCEXP_BITCOIND_PORT: $APP_BITCOIN_RPC_PORT
      BTCEXP_BITCOIND_USER: $APP_BITCOIN_RPC_USER
      BTCEXP_BITCOIND_PASS: $APP_BITCOIN_RPC_PASS

      # Electrum connection details
      BTCEXP_ELECTRUMX_SERVERS: "tcp://$APP_ELECTRS_NODE_IP:$APP_ELECTRS_NODE_PORT"

      # App Config
      BTCEXP_HOST: 0.0.0.0
      DEBUG: "btcexp:*,electrumClient"
      BTCEXP_ADDRESS_API: electrumx
      BTCEXP_SLOW_DEVICE_MODE: "true"
      BTCEXP_NO_INMEMORY_RPC_CACHE: "true"
      BTCEXP_PRIVACY_MODE: "true"
      BTCEXP_NO_RATES: "true"
      BTCEXP_RPC_ALLOWALL: "false"
      BTCEXP_BASIC_AUTH_PASSWORD: ""  

6. We're pretty much done here. The next step is to commit the changes, push it to our fork's branch, and test out the app on Umbrel.

git add .
git commit -m "Add BTC RPC Explorer"
git push

3. 🛠  Testing the app on Umbrel

🚨 This is the current workflow for testing an app on umbrelOS 1.0.x. The app framework is under active development and this workflow will change in the future. For testing on umbrelOS 0.5.4, please refer to the previous version of this document.

3.1 Test using a Linux VM on your local machine with Multipass

It is very easy to spin up a Linux VM on your local machine using Multipass and the pre-configured scripts for creating a production-like umbrelOS environment.

1. Install Multipass

2. Clone the getumbrel/umbrel repo.

From the root of the cloned repo, run the following command to provision a VM with the latest umbrelOS:

npm run vm:provision

Once provisioned, umbrelOS will be accessible at http://umbrel-dev.local.

The VM environment has a slight difference compared to the production environment. Specifically, the main Umbrel data directory is located at ~/umbrel/packages/umbreld/data in the VM environment, whereas in the production environment, it's located at ~/umbrel.

3. The following commands can be used to interact with the VM:

You can run any command on the VM with npm run vm:exec -- <command>. For example:

npm run vm:exec -- sudo journalctl -u umbreld

You can also run trpc commands on the VM with npm run vm:trpc <command>. For example:

npm run vm:trpc apps.install.mutate -- --appId transmission

Alternatively, you can get a shell on the VM with:

npm run vm:shell

You can completely destroy the VM with npm run vm:destroy.

Other useful commands can be found in the package.json file in the root of the cloned repo.

4. This next step will become easier in the future, but for now, we need to manually copy the app directory to the app-store directory in the VM in order to test our app:

multipass transfer -r <path-to-your-forked-repo>/btc-rpc-explorer/ umbrel-dev:/home/ubuntu/umbrel/packages/umbreld/data/app-stores/getumbrel-umbrel-apps-github-53f74447/

5. And finally, it's time to install our app through the homescreen or via the terminal with:

npm run vm:trpc apps.install.mutate -- --appId btc-rpc-explorer

That's it! Our BTC RPC Explorer app should now be accessible at http://umbrel-dev.local:3002

3.2 Testing on a Raspberry Pi or Umbrel Home

You can test your app on a real Raspberry Pi (arm64) or Umbrel Home (x86_64) device. Instructions for installing umbrelOS on a Raspberry Pi can be found here. For Umbrel Home, simply connect the device to your local network and plug it in.

1. After plugging in your device, umbrelOS will be accessible from your browser at http://umbrel.local.

You can SSH into the device with:

ssh umbrel@umbrel.local

(SSH password is the same as your Umbrel's homescreen password)

2. This next step will become easier in the future, but for now, we need to manually copy the app directory (with dotfiles excluded) to the app-store directory on your umbrelOS device in order to test our app:

rsync -av --exclude=".*" <path-to-your-forked-repo>/btc-rpc-explorer umbrel@umbrel.local:/home/umbrel/umbrel/app-stores/getumbrel-umbrel-apps-github-53f74447/

3. We can now install our app through the homescreen or via the terminal with:

umbreld client apps.install.mutate --appId btc-rpc-explorer

The app should now be accessible at http://umbrel.local:3002

4. To uninstall:

umbreld client apps.uninstall.mutate --appId btc-rpc-explorer

When testing your app, make sure to verify that any application state that needs to be persisted is in-fact being persisted in volumes.

A good way to test this is to restart the app with umbreld client apps.restart.mutate --appId <app-id>. If any state is lost, it means that state should be mapped to a persistent volume.

When stopping/starting the app, all data in volumes will be persisted and anything else will be discarded. When uninstalling/installing an app, even persistent data will be discarded.


4. 🚀  Submitting the app

We're now ready to open a pull request on the main getumbrel/umbrel-apps apps repo to submit our app. Let's copy-paste the following markdown for the pull request description, fill it up with the required details, and then open a pull request.

# App Submission

### App name
...

### 256x256 SVG icon
_(Submit an icon with no rounded corners as it will be dynamically rounded with CSS. GitHub doesn't allow uploading SVGs directly, so please upload your icon to an alternate service, like https://svgur.com, and paste the link below.)_
_We will help finalize this icon before the app goes live in the Umbrel App Store._

...

### Gallery images
_(Upload 3 to 5 high-quality gallery images (1440x900px) of your app in PNG format, or just upload 3 to 5 screenshots of your app and we'll help you design the gallery images.)_
_We will help finalize these images before the app goes live in the Umbrel App Store._
...


### I have tested my app on:
- [ ] umbrelOS on a Raspberry Pi
- [ ] umbrelOS on an Umbrel Home
- [ ] umbrelOS on Linux VM

This is where the above information is used when the app goes live in the Umbrel App Store:

image

After you've submitted your app, we'll review your pull request, make some adjustments in the docker-compose.yml file, such as removing any port conflicts with other apps, pinning Docker images to their sha256 digests, assigning unique IP addresses to the containers, etc before merging.

🎉 Congratulations! That's all you need to do to package, test, and submit your app to Umbrel. We can't wait to have you onboard!


Advanced configuration

App Proxy

The Umbrel App Proxy automatically protects an app by requiring the user to enter their Umbrel password (either when they login into the main Web UI or by visiting an app directly e.g. http://umbrel.local:3002)

Disable

There could be cases where you wish to disable this authentication. That can be done by adding this env. var. to the app_proxy Docker Compose service:

PROXY_AUTH_ADD: "false"
Whitelist/blacklist

Some apps host a user facing at the root of their web application and then an API at e.g. /api. And in this case we would like / to be protected by Umbrel and /api protected by the apps existing/inbuilt API token system. This can be achieved by adding this env. var. to the app_proxy Docker Compose service:

PROXY_AUTH_WHITELIST: "/api/*"

Another example could be that the root of the web application (/) should be publically accessible but the admin section be protected by Umbrel. This can be achieved by adding these env. vars. to the app_proxy Docker Compose service:

PROXY_AUTH_WHITELIST: "*"
PROXY_AUTH_BLACKLIST: "/admin/*"

FAQs

  1. How do I push app updates?

    Every time you release a new version of your app, you should build, tag, and push the new Docker images to Docker Hub. Then open a new PR on our main app repo (getumbrel/umbrel-apps) with your up-to-date docker image, and updated version and releaseNotes in your app's umbrel-app.yml file.

  2. I need help with something else

    You can open an issue on GitHub or get in touch with @mayankchhabra, @lukechilds, or @nmfretz on Telegram.