feat: HoneyOS – Retro-Schreibtisch und Leiste für die eigenen Apps

Statische Oberfläche vor Aether und InkNote: kein Backend, kein Build,
nginx liefert web/ aus. Jede App bleibt ihre eigene PWA auf ihrer eigenen
Domain – HoneyOS ist Startpunkt und Umschalter, kein iframe-Rahmen.

- zwei Betriebsarten aus einem Datenstand: Terminal (Kacheln, Tastatur)
  und Desktop (Symbole, verschiebbare Fenster, Taskleiste)
- honeybar.js als Drop-in für die Apps, rendert im Shadow DOM, damit
  Tailwind und die InkNote-Palette einander nicht in die Quere kommen
- Konfiguration vollständig aus der .env: das Skript in
  /docker-entrypoint.d/ schreibt config.json beim Containerstart
- optionaler _ME-Pfad pro App zeigt an, wer angemeldet ist; ohne CORS
  bleibt die Anzeige leer, ohne dass etwas kaputtgeht

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-24 14:45:55 +02:00
commit 84cc5d619e
17 files changed
+3126

No files matched your search

+79
View File
@@ -0,0 +1,79 @@
#!/bin/sh
# Schreibt config.json aus den Umgebungsvariablen — läuft vor nginx.
#
# Das nginx-Image führt alles in /docker-entrypoint.d/ beim Start aus. Damit
# braucht HoneyOS keinen eigenen Entrypoint und kein Backend: die Konfiguration
# entsteht einmal beim Hochfahren, danach ist es wieder reines Ausliefern.
#
# Ohne HONEYOS_APP_1_URL bleibt die eingebackene config.json unangetastet —
# ein `docker run` ohne .env zeigt also weiter die Standard-Apps.
set -eu
TARGET=/usr/share/nginx/html/config.json
MAX_APPS=12
# Wert einer Variablen holen, deren Name erst zur Laufzeit feststeht.
get() { eval "printf '%s' \"\${$1:-}\""; }
# Für JSON entschärfen: Backslash und Anführungszeichen. Zeilenumbrüche haben
# in diesen Feldern nichts zu suchen und fliegen raus.
esc() { printf '%s' "$1" | tr -d '\n\r' | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g'; }
# Ein Feld nur schreiben, wenn es gesetzt ist — leere Schlüssel wären Lärm.
field() {
[ -n "$2" ] || return 0
printf ',"%s":"%s"' "$1" "$(esc "$2")"
}
if [ -z "$(get HONEYOS_APP_1_URL)" ]; then
echo "honeyos: keine HONEYOS_APP_*-Variablen gesetzt — eingebackene config.json bleibt"
exit 0
fi
if [ ! -w "$(dirname "$TARGET")" ]; then
echo "honeyos: $(dirname "$TARGET") ist nicht beschreibbar (read-only mount?) — config.json bleibt wie sie ist"
exit 0
fi
tmp="${TARGET}.tmp"
{
printf '{'
printf '"user":"%s"' "$(esc "$(get HONEYOS_USER)")"
printf ',"hostname":"%s"' "$(esc "${HONEYOS_HOSTNAME:-honeyos}")"
printf ',"version":"%s"' "$(esc "${HONEYOS_VERSION:-0.1}")"
printf ',"apps":['
n=1
first=1
while [ "$n" -le "$MAX_APPS" ]; do
url=$(get "HONEYOS_APP_${n}_URL")
if [ -z "$url" ]; then
n=$((n + 1))
continue
fi
id=$(get "HONEYOS_APP_${n}_ID")
[ -n "$id" ] || id="app${n}"
name=$(get "HONEYOS_APP_${n}_NAME")
[ -n "$name" ] || name=$(printf '%s' "$id" | tr '[:lower:]' '[:upper:]')
[ "$first" -eq 1 ] || printf ','
first=0
printf '{"id":"%s","name":"%s","url":"%s"' "$(esc "$id")" "$(esc "$name")" "$(esc "$url")"
field subtitle "$(get "HONEYOS_APP_${n}_SUBTITLE")"
field glyph "$(get "HONEYOS_APP_${n}_GLYPH")"
field key "$(get "HONEYOS_APP_${n}_KEY")"
field me "$(get "HONEYOS_APP_${n}_ME")"
field tokenKey "$(get "HONEYOS_APP_${n}_TOKEN_KEY")"
printf '}'
n=$((n + 1))
done
printf ']}'
} > "$tmp"
mv "$tmp" "$TARGET"
count=$(tr -cd '{' < "$TARGET" | wc -c)
echo "honeyos: config.json geschrieben ($((count - 1)) App(s))"