Commit Graph
33 Commits
Author SHA1 Message Date
marcandClaude Opus 5 fc4dd12c5e feat!: Token-Schluessel und Wer-bin-ich entfernt, Version 1.0
Beides brachte allein einen Anzeigenamen. Seit der Benutzer als Widget auf dem
Schreibtisch steht, kommt der aus der HoneyOS-Anmeldung — keine App muss mehr
etwas dafuer bereitstellen, und beide Leisten tragen ueberall dasselbe.

Der Token-Schluessel hatte zudem eine scharfe Kante: Zeigte das Feld
Wer-bin-ich auf eine fremde Adresse, ging der Ausweis der App dorthin.

Weg sind damit auch checkAuth, askMe und die Anmeldezeile auf den Kacheln. Alte
honeyos.json-Dateien werden weiter gelesen; die Felder verfallen beim naechsten
Speichern still.

1.0, weil die Bedienung sich aendert und der Stand rund ist: zwei Leisten mit
gleichem Inhalt, Widgets fuer Benutzer und Wetter, die HoneyBar auch in fremden
Apps.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 20:17:18 +02:00
marcandClaude Opus 5 b999a66fed feat(schreibtisch): der Benutzer wird ein Widget, beide Leisten gleich hoch
Die Menueleiste war 34 px hoch, die HoneyBar in den Apps 32 — beim Wechsel sah
man den Sprung. Jetzt beide 32.

Und der Name samt Bild stand rechts in der Menueleiste. Das war das einzige
Stueck, das die HoneyBar in den Apps nicht hat — genau der Unterschied, den man
nicht sehen soll. Er sitzt jetzt als eigenes Widget auf dem Schreibtisch, mit
der Begruessung, die vorher im Systemfenster stand. Beide Leisten tragen damit
ueberall dasselbe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 17:46:05 +02:00
marcandClaude Opus 5 510525e2d0 fix(honeybar): eingeklappt trug der Strich fest verdrahtetes Bernstein
Und einklappen ging nur einmal: mount() haengte seine Zuhoerer selbst an, also
hatte sie doppelt, wer die HoneyBar ueber den Strich zurueckholte. Der Klick
aufs Menue oeffnete und schloss es im selben Zug — der Punkt "honeybar
einklappen" war damit unerreichbar. Das Verdrahten passiert jetzt einmal.

Nachgestellt mit gruener Roehre: Strich gruen, aus- und wieder einklappen
funktioniert beliebig oft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 17:39:31 +02:00
marcandClaude Opus 5 9da6503837 docs: durchgaengig HoneyBar statt Leiste
Der Dienst im Beispiel heisst jetzt einsetzer — er ist nicht die HoneyBar,
er setzt sie ein. Zusammensetzungen wie Menueleiste, Taskleiste und
Statusleiste bleiben, die meinen etwas anderes.

Dazu in IDEAS notiert, dass HoneyBar und Menueleiste zwei getrennte Stilsaetze
sind und schon einmal auseinandergelaufen ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 16:57:01 +02:00
marcandClaude Opus 5 3b7367944b docs: durchgaengig ID statt Kennung
In der Oberflaeche hiess das Feld Kennung, in der Konfiguration id, in der
README beides. Drei Namen fuer dieselbe Sache, und man muss sie beim Eintragen
zusammenbringen — jetzt ueberall ID.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 15:41:05 +02:00
marcandClaude Opus 5 7c8a4b8c9a docs: die zwei Wege zur Leiste sauber getrennt
Weg 1 fuer selbst geschriebene Apps, Weg 2 fuer fertig bezogene — mit dem
Vorher/Nachher an der Compose-Datei der App und dem, was der Einsetzer kostet.

Dabei richtiggestellt, dass Aether und InkNote die Leiste zur Laufzeit laden
statt sie ins HTML zu schreiben; die README beschrieb noch den alten Stand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 15:34:29 +02:00
marcandClaude Opus 5 67d7e1f3a6 fix(beispiel): Uploads nicht am Einsetzer haengen lassen
nginx nimmt ohne client_max_body_size bei 1 MB nichts mehr an. Jede App mit
Dateiupload waere hinter dem Einsetzer kaputt gegangen — und der Fehler haette
wie ein Fehler der App ausgesehen. Nachgemessen: 5 MB gaben 413, danach kam die
Ablehnung von der Ziel-App statt vom Einsetzer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 15:30:51 +02:00
marcandClaude Opus 5 135625ebe7 feat(beispiel): mehrere Apps ueber einen Einsetzer, je mit eigener Kennung
Am Host erkennt nginx, welcher Dienst gemeint ist und welche App das fuer
HoneyOS ist; die Leiste hebt sie dann hervor wie in Aether. Dieselbe Bauart wie
im BentoPDF-Beispiel: Leiste und ihre zwei Abfragen laufen ueber die Adresse
der App, damit deren CSP unangetastet bleibt.

Die beiden .conf-Dateien sind weg — sie standen ein zweites Mal in der
Compose-Datei, und zwei Fassungen derselben Sache laufen auseinander. Heute
schon zweimal passiert.

Geprueft mit zwei Diensten: richtige Kennung je Host, richtige Hervorhebung in
der Leiste, gemeinsame App-Liste, Wetter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 14:24:58 +02:00
marcandClaude Opus 5 8f294e15db feat(beispiel): die Leiste ueber die eigene Adresse der App ausliefern
Marcs BentoPDF-Image (ghcr.io/alam00000/bentopdf-simple) schickt eine strenge
CSP — mit dem Image von Docker Hub, an dem ich zuerst geprueft hatte, war das
nicht zu sehen. Statt fremde Kopfzeilen umzuschreiben, reicht der Einsetzer
jetzt auch /honeybar/ und die zwei Abfragen der Leiste unter seiner eigenen
Adresse durch. Damit ist fuer den Browser alles derselbe Ursprung: CSP
unangetastet, kein CORS, kein COEP, und der Schluessel bleibt auf dem Server.

Durchgereicht wird nur /api/apps und /api/weather, nur lesend. Ein pauschales
/api/ haette die ganze Schnittstelle unter die Adresse der App gehaengt — beim
Ausprobieren hat meine eigene Schreibprobe prompt die App-Liste geleert.

Das Binden auf 127.0.0.1 ist raus: Es passt nur, wenn der Proxy auf demselben
Wirt im Host-Netz laeuft, und nicht fuer Marcs Aufbau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 01:28:12 +02:00
marcandClaude Opus 5 d1cd20586f fix(beispiel): nginx-Konfiguration in die Compose-Datei, keine Bind-Mounts
Fehlt eine der beiden Dateien auf dem Wirt, legt Docker dort wortlos ein
Verzeichnis an und scheitert beim Start mit "not a directory" — beim Einsetzen
ueber eine Oberflaeche eine Falle ohne Nutzen. Als configs mit content traegt
die Compose-Datei alles selbst.

Durchprobiert ohne eine einzige Datei auf dem Wirt: Stapel hoch, HoneyOS
antwortet, richtige data-app, unbekannter Host 404.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 00:45:43 +02:00
marcandClaude Opus 5 fe48f3d98e docs(beispiel): HoneyOS und Einsetzer in einem Stapel, Netz inklusive
Getrennt gepflegt hiesse, bei jeder neuen App an zwei Stellen zu denken. Das
Netz legt der Stapel selbst unter festem Namen an — vorher musste es von Hand
erzeugt werden, und ohne festen Namen hiesse es nach dem Ordner.

Durchprobiert: Stapel hoch, fremde App tritt dem Netz bei, beide Hosts bekommen
die richtige data-app, unbekannter Host 404.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 00:16:08 +02:00
marcandClaude Opus 5 c11d5feafe docs: ein Einsetzer fuer alle Dienste, nicht einer je App
Am Host erkennt nginx den Dienst; eine neue App sind zwei Zeilen. Geprueft mit
zwei Diensten gleichzeitig: richtige data-app je Host, unbekannter Host 404,
WebSocket-Upgrade durchgereicht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 23:31:02 +02:00
marcandClaude Opus 5 607ae13374 docs: fertiges Beispiel — BentoPDF mit Einsetzer davor
Compose und nginx-Konfiguration, genau so durchprobiert. Dazu der Hinweis, dass
der Ursprung in HoneyOS auf den Buchstaben passen muss: localhost und 127.0.0.1
sind fuer den Browser zwei verschiedene.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 20:35:25 +02:00
marcandClaude Opus 5 5dbadf212f fix(leiste): mit Cross-Origin-Resource-Policy ausliefern
Apps, die COEP „require-corp" setzen — alles mit WASM oder SharedArrayBuffer,
etwa BentoPDF — lehnen jede fremde Datei ab, die sich nicht ausdruecklich zur
Einbettung bekennt. Genau das ist der Zweck der Leiste, also sagt sie es jetzt.

Die Alternative waere gewesen, im Proxy das COEP der App zu entfernen. Das
haette ihr die Faehigkeiten genommen, fuer die sie es setzt.

Gefunden beim Einsetzen in BentoPDF hinter einem nginx.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 19:35:21 +02:00
marcandClaude Opus 5 05e56f4cd2 docs: die Leiste per Reverse Proxy in fremde Apps einsetzen
Rezept fuer nginx, geprueft gegen eine App mit gzip und eigener CSP. Die vier
Fallen stehen dabei: Kompression, CSP ersetzen statt ergaenzen, nur HTML
anfassen, Ursprung in HoneyOS eintragen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 19:21:01 +02:00
marcandClaude Opus 5 cce926ab2e fix(schreibtisch): das Wetter ist eine Anzeige, und die Kacheln stehen wieder rechts
Anklickbar war es ein Versprechen, das es nicht hielt: Der Klick fuehrte nur
dorthin, wo ohnehin alles eingestellt wird. Jetzt eine Anzeige mit Hinweistext,
in beiden Leisten.

Die Anordnung war seit dem Wetterfenster kaputt. Das Raster verteilt seine
Bereiche der Reihe nach — das dritte landete neben „system" und schob die
Kacheln in die schmale linke Spalte. Links stehen jetzt die Anzeigen
untereinander, rechts die Apps ueber die volle Hoehe.

Keine neue Faehigkeit, also bleibt die Version bei 0.9.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:35:59 +02:00
marcandClaude Opus 5 2afd299019 docs: wann die Version steigt — und wann nicht
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:33:15 +02:00
marcandClaude Opus 5 99f1ed4a58 fix(wetter): der Schalter „in der Leiste" wirkt auch auf dem Schreibtisch
Die Leiste am oberen Rand von HoneyOS ist nicht honeybar.js, sondern die
Menueleiste des Schreibtischs — anderer Code, gleiches Aussehen. Das Wetter
stand deshalb nur in fremden Apps, waehrend der Schalter dort, wo man ihn
umlegt, nichts zu bewirken schien.

Fuer den, der davorsitzt, ist beides dieselbe Leiste. Ein Schalter, der nur
woanders wirkt, ist nicht zu erklaeren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:31:40 +02:00
marcandClaude Opus 5 4e38ccdec1 feat(wetter): Wetter auf dem Schreibtisch und in der Leiste
Zwei Schalter, unabhaengig voneinander: Schreibtisch, Leiste, beides oder
keins. Die Stadt wird einmal gesucht und mit ihren Koordinaten gespeichert,
sonst suchte jede Abfrage den Ort erneut.

Geholt wird serverseitig und zehn Minuten zwischengespeichert. Der Grund ist
nicht Sparsamkeit: Die Leiste steht auf jeder Seite jeder App, und fragte sie
selbst an, ginge bei jedem Seitenaufruf eine Anfrage samt IP an einen Fremden —
und die CSP jeder App muesste ihn erlauben.

Kein Ort eingestellt oder Dienst nicht erreichbar: 204, und das Symbol bleibt
weg. Eine Zahl von gestern waere schlechter als keine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:12:09 +02:00
marcandClaude Opus 5 52b11efe06 docs(ideen): Wetter neben der Uhr — und warum es das erste Widget sein sollte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 12:57:01 +02:00
marcandClaude Opus 5 7db45f67f0 fix(leiste): die Aussparung des Geraets gehoert der Leiste
Aether und InkNote setzen viewport-fit=cover — als installierte App reicht ihr
Inhalt bis unter die Statusleiste. Eine Leiste, die stur bei 0 anfaengt, liegt
dort unter Uhrzeit und Akkustand. Sie waechst jetzt um env(safe-area-inset-top)
und polstert sich selbst; im Browser ist der Wert null und alles bleibt bei
32 px.

Das Polster der Seite wird dabei nicht mehr ausgerechnet, sondern gerechnet:
env() kennt nur der Browser, und erst beim Anzeigen. Nebenbei behebt das einen
Rundungsfehler beim Ausblenden — der urspruengliche Wert wird jetzt gemerkt
statt zurueckgerechnet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 10:21:25 +02:00
marcandClaude Opus 5 ccae2026a4 docs(ideen): HoneyOS selbst als PWA, und der Umzug unter eine Domain
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 00:16:39 +02:00
marcandClaude Opus 5 304da724e6 docs(ideen): eigene Logos je App, auch in der Leiste, und die Frage der Reihenfolge
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 23:38:36 +02:00
marcandClaude Opus 5 25f2c48667 docs(ideen): Leiste steht nicht mehr im HTML der App
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 23:22:31 +02:00
marcandClaude Opus 5 671d30b865 docs(ideen): Widgets in der Leiste, persönliche Apps, Grenzen des Aussehens
Dazu die Lehre aus der eingebackenen Adresse: nichts über die Leiste gehört in
den Bau der Apps — weder wegen des fertigen Abbilds noch wegen des Caches der
PWA.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 23:22:21 +02:00
marcandClaude Opus 5 b4dcb74404 fix: das Aussehen erreicht die Leiste auch über die Site-Grenze
Marcs Frage: gilt die Einstellung vom Rechner auch für die Leiste am Handy?

Sie hätte es nicht getan, sobald HONEYOS_USER_HEADER gesetzt ist: die
Einstellungen liegen dann unter "proxy:marc", die Leiste fragt aber ohne
Sitzung und landet beim Standardnutzer — dessen Satz ist leer, die Leiste
wäre bernsteinfarben geblieben, während der Schreibtisch grün leuchtet.

SettingsFor() hilft nach: gibt es genau einen Nutzer mit Einstellungen,
gelten dessen. Bei mehreren bleibt es beim Standard, dann ist nicht zu
erraten, wer da schaut.

Nachgestellt mit einem Pixel-7-Profil ohne jedes Cookie: die Leiste kommt
grün an.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 22:47:19 +02:00
marcandClaude Opus 5 5cf210ae97 fix: Version stand an zwei Stellen und lief auseinander
Die Oberfläche zeigte 0.2, während die Images schon 0.4 hiessen: os.js trug
eine eigene Konstante, die ich beim Taggen nie mitgezogen habe.

Jetzt steht sie nur noch in main.go. build.sh liest sie von dort und vergibt
denselben Tag, die Oberfläche holt sie über /api/public und /api/me. Ein Test
schlaegt an, falls je wieder eine zweite Version in os.js auftaucht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 22:45:36 +02:00
marcandClaude Opus 5 5ed4e30179 feat: Leiste trägt die Röhre vom Server, Einklappen ist umkehrbar
Zwei Sachen, die beim Benutzen aufgefallen sind.

- "leiste ausblenden" war eine Einbahnstraße: die Leiste verschwand ganz und
  liess sich nur über die Entwicklerkonsole zurückholen. Jetzt bleibt ein
  3px-Strich stehen, ein Klick darauf holt sie wieder. ?honeybar=1 an der
  Adresse ist der Notausgang, falls der Strich übersehen wird.
- Die Leiste hatte ihre Farben fest eingetragen und blieb bernsteinfarben,
  auch wenn der Schreibtisch auf grün stand. Genau dieser Bruch liess sie wie
  etwas Angeklebtes wirken. /api/apps liefert deshalb jetzt {apps, settings};
  die Leiste setzt Röhre, Glühen und Scanlines danach.

Dass das auch über Site-Grenzen geht, war so nicht erwartet: der Schlüssel
für die App-Liste trägt das Aussehen einfach mit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 22:37:06 +02:00
marcandClaude Opus 5 1c3218939b feat: Betrieb hinter einem Anmelde-Proxy, Schlüssel für die App-Liste
Marc stellt Pangolin davor und will keinen zweiten Anmeldeschirm.

- HONEYOS_PROXY_AUTH=true: HoneyOS prüft nicht mehr selbst, der Start sagt
  deutlich, dass der Container dann nur über den Proxy erreichbar sein darf.
  Mit HONEYOS_USER_HEADER bekommt jeder Name seine eigenen Einstellungen.
- HONEYOS_APPS_KEY schützt /api/apps. Nötig, weil HoneyOS auf einer anderen
  Site liegt als die Apps (duckdns.org steht auf der Public-Suffix-Liste) –
  der Browser schickt die Sitzung dort nicht mit, und der Pfad muss im Proxy
  von der Anmeldung befreit sein.

Beim Durchspielen mit zwei echten Hostnamen fiel ein Loch auf: Ohne eigene
Anmeldung gilt jede Anfrage als angemeldet, also gab der Rückfall auf diese
Prüfung die Liste an jeden heraus – auch ohne oder mit falschem Schlüssel.
Der Rückfall greift jetzt nur noch, wo es wirklich eine Sitzung geben kann.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 22:09:37 +02:00
marcandClaude Opus 5 905b136516 docs: Reihenfolge umgestellt, Sichtbarkeit der Leiste als offene Frage
Die Leiste soll zuerst die serverseitige Röhre übernehmen — kleinster
Eingriff, größte Wirkung fürs "ein System"-Gefühl. Danach Systemmenü im
Logo, dann die App-Schublade mit Symbolen.

Neu als offene Entscheidung: wie sichtbar die Leiste sein darf. Sie ist bei
jedem Aufruf der App da, auch wenn man mit HoneyOS gerade nichts zu tun hat.
Vorschlag steht dabei, ebenso der Hinweis, dass es keine Einbahnstraße ist.

Ausserdem defer an der Script-Zeile in README und Demo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 17:09:58 +02:00
marcandClaude Opus 5 dfc5621f3b docs: IDEAS.md – Reihenfolge für App-Schublade, Widgets und offene Entscheidungen
Nur Notizen, keine Änderung am Verhalten. Hält fest, was aufeinander aufbaut
(Fundament → erstes Widget → Ausbau), welche zwei Entscheidungen offen sind
(Symbole, Token-Schlüssel) und was bewusst nicht geplant ist, damit iframes
und PWA-Weg nicht alle paar Monate neu diskutiert werden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 16:18:05 +02:00
marcandClaude Opus 5 283f9a1850 feat: Backend mit OIDC-Anmeldung, Apps und Einstellungen im Server
Aus der statischen Seite wird ein Go-Binary mit eingebetteter Oberfläche.
Grund: Apps über .env zu pflegen wurde unübersichtlich, und kosmetische
Einstellungen sollen auf jedem Gerät gleich sein.

- Anmeldung über den eigenen OIDC-Anbieter (PocketID), mit PKCE. Ohne
  Anmeldung gibt es nichts zu sehen – auch keine App-Liste.
- Sitzung als signiertes Cookie ohne Gegenstück im Server; Schreibzugriffe
  zusätzlich über ein lesbares CSRF-Cookie abgesichert
- Apps werden in der Oberfläche angelegt und bearbeitet, nicht mehr in der
  .env. Der Server prüft jeden Eintrag und meldet zurück, was er behält.
- Einstellungen liegen je Nutzer im Server; localStorage ist nur noch der
  Vorschuss, damit die Röhre beim Laden nicht in der falschen Farbe blitzt
- die Leiste holt die App-Liste aus /api/apps – freigegeben sind allein die
  Ursprünge, die selbst als App eingetragen sind
- Tests fahren einen echten OIDC-Anbieter hoch und gehen den Anmeldeweg
  einmal ganz durch

Ohne HONEYOS_OIDC_ISSUER läuft alles offen – für die Entwicklung, mit
deutlicher Warnung beim Start.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 15:20:55 +02:00
marcandClaude Opus 5 84cc5d619e 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>
2026-08-24 14:45:55 +02:00