Skip to content

Instantly share code, notes, and snippets.

@morgan9e
Created February 13, 2026 03:48
Show Gist options
  • Select an option

  • Save morgan9e/3bc27c4946622dd22a7c6ff954b96ab2 to your computer and use it in GitHub Desktop.

Select an option

Save morgan9e/3bc27c4946622dd22a7c6ff954b96ab2 to your computer and use it in GitHub Desktop.
Flatpak wrapper for multi-profile
#!/bin/bash
set -euo pipefail
PROFILE="default"
usage() {
echo "Usage: flatpak-alt [-p PROFILE] run <app-id> [args...]"
echo " flatpak-alt -p work run org.mozilla.firefox"
exit "${1:-0}"
}
while [[ $# -gt 0 ]]; do
case "$1" in
-p|--profile) PROFILE="$2"; shift 2 ;;
-h|--help) usage 0 ;;
run) shift; break ;;
*) echo "Unknown option: $1" >&2; usage 1 ;;
esac
done
[[ $# -lt 1 ]] && { echo "Missing app ID." >&2; usage 1; }
APP_ID="$1"; shift
[[ "$PROFILE" =~ ^[a-zA-Z0-9_-]+$ ]] || { echo "Invalid profile name: $PROFILE" >&2; exit 1; }
[[ "$PROFILE" == "app" ]] && { echo "Profile name 'app' is reserved" >&2; exit 1; }
# ~/.var/<profile>/app/<app-id>/{cache,config,data}
PROFILE_DIR="${HOME}/.var/${PROFILE}"
ENTRYPOINT="${PROFILE_DIR}/.entrypoint"
mkdir -p "$PROFILE_DIR"
CMD=$(flatpak info -m "$APP_ID" | sed -n 's/^command=//p')
[[ -z "$CMD" ]] && { echo "Could not resolve command for $APP_ID" >&2; exit 1; }
cat > "$ENTRYPOINT" << INNER
#!/bin/bash
set -euo pipefail
APP_DIR="\${_ALT_DIR}/\${FLATPAK_ID}"
export XDG_CACHE_HOME="\${APP_DIR}/cache"
export XDG_DATA_HOME="\${APP_DIR}/data"
export XDG_CONFIG_HOME="\${APP_DIR}/config"
mkdir -p "\$XDG_CACHE_HOME" "\$XDG_DATA_HOME" "\$XDG_CONFIG_HOME"
printf '\e[1;32m[%s] profile=%s → %s\e[0m\n' "\$FLATPAK_ID" "\$_ALT_PROFILE" "\$APP_DIR"
exec ${CMD} "\$@"
INNER
chmod +x "$ENTRYPOINT"
exec flatpak run \
--filesystem="$PROFILE_DIR" \
--env=_ALT_PROFILE="$PROFILE" \
--env=_ALT_DIR="$PROFILE_DIR" \
--command="$ENTRYPOINT" \
"$APP_ID" "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment