Files
HoneyOS/IDEAS.md
T
2026-08-24 23:22:31 +02:00

265 lines
12 KiB
Markdown

# Ideen und Reihenfolge
Was noch kommen könnte, in der Reihenfolge, in der es aufeinander aufbaut.
Nichts davon ist beschlossen — beschlossen ist, was im [README](README.md) steht.
Grundsatz für alles hier: **Fundament zuerst, dann ein Widget, dann ausbauen.**
Nicht zehn Fenster auf einmal planen, sondern eines bauen und sehen, ob man
wirklich hinschaut.
---
## 1 · Fundament
Ohne diese Stücke ist alles danach nicht möglich. Reihenfolge nach dem
Verhältnis von Aufwand zu spürbarer Wirkung.
### 1.1 Die Leiste trägt deine Röhre — ✅ erledigt (24.08.2026)
Die Leiste liest ihre Farben nicht mehr fest, sondern aus derselben Antwort, mit
der sie die App-Liste holt. Röhre in HoneyOS auf grün → die Leiste in Aether ist
grün, ohne dass Aether angefasst wird. `glow` und `scanlines` gelten dort ebenso.
**Ging entgegen der ersten Einschätzung auch über Site-Grenzen hinweg.** Ich
hatte notiert, das scheitere daran, dass der Browser die Sitzung nicht mitschickt
— stimmt, aber der Schlüssel für die App-Liste löst es: dieselbe Anfrage bringt
das Aussehen gleich mit. Deshalb liefert `/api/apps` jetzt `{apps, settings}`
statt nur einer Liste.
Offen bleibt: Bei mehreren Nutzern trägt die Leiste die Farbe des
Standardnutzers, weil ihr über die Site-Grenze niemand sagen kann, wer da
gerade schaut.
### 1.2 Systemmenü im Logo
Das `■ HONEYOS` links ist heute nur ein Link zum Schreibtisch. Wie ein
Apfel-Menü gehören darunter: Schreibtisch · Einstellungen · Abmelden. Dann sind
die HoneyOS-Sachen aus jeder App heraus erreichbar, ohne sie zu verlassen.
Die Einstellungen sind derselbe Inhalt wie auf dem Schreibtisch — sie liegen im
Server, also stimmt beides automatisch überein.
### 1.3 App-Schublade mit Symbolen
**Die Idee:** ein Knopf, der eine Übersicht aller Apps aufklappt — mit Symbol.
Die Liste kommt aus HoneyOS. Eine neue App trägt man einmal ein und sie taucht
überall auf, ohne dass eine App angefasst wird.
**Stand:** Die Hälfte steht. `honeybar.js` holt die Liste aus `/api/apps`, bringt
seine Sitzung mit und hat ein Aufklappmenü. Es fehlt die Darstellung als Raster
mit Symbolen — heute sind es Textknöpfe. Bei zwei Apps geht das noch, ab vier
wird es eng, am Handy sofort.
**Der eigentliche Punkt: die Symbole.** Das Pixelraster lebt in `os.js`
(`GLYPHS`), die Leiste kennt es nicht. Zwei Wege:
- **Pixelglyphen teilen** — `GLYPHS` + `glyphSvg()` in eine eigene Datei, die
Desktop und Leiste beide laden. Kein Upload, kein Speicher, passt zum Look.
Nachteil: nur die eingebauten Symbole.
- **Echte Bilder** — pro App eine Bildadresse oder ein Upload in HoneyOS.
Flexibler, aber: Speicher, Größenbegrenzungen, Auslieferung, und der
Retro-Look bekommt bunte Fremdkörper.
→ **Empfehlung: Pixelglyphen teilen.** Bilder später nachrüsten, falls je eine
App dabei ist, für die kein Symbol passt.
### 1.4 CORS in Aether
Damit der Desktop Aether überhaupt etwas fragen darf. Aethers Sitzung ist ein
Cookie, und weil alles unter derselben Domain liegt, schickt der Browser es
schon heute mit — es fehlt allein die Freigabe im Go-Backend
(`Access-Control-Allow-Origin` für `os.…` plus `Allow-Credentials`).
Kleiner Eingriff, aber **die Voraussetzung für jedes Aether-Widget** und
nebenbei auch für die Anmeldeanzeige auf der Kachel.
### 1.5 InkNote: Sitzung zusätzlich als Cookie
InkNote weist sich mit einem Bearer-Token aus, der im localStorage liegt. Der
ist **pro Domain** — von `os.…` aus grundsätzlich unerreichbar, und daran ändert
keine Konfiguration etwas.
Solange das so bleibt, kann HoneyOS **keine InkNote-Daten anzeigen**. Der Weg
wäre, dass InkNote seine Sitzung zusätzlich als `HttpOnly`-Cookie setzt; der
Token-Weg kann daneben bleiben, damit PWA und Offline-Betrieb unangetastet sind.
Erledigt zugleich den Token-Schlüssel (siehe „Offene Entscheidungen").
### 1.6 Widget-Rahmen
Ein Fenstertyp, der einen Inhalt holt, ihn anzeigt und sich benimmt, wenn es
schiefgeht: lädt gerade, nichts da, nicht angemeldet, Fehler. Einmal richtig
gebaut, kostet jedes weitere Widget danach fast nichts.
Muss in **beiden Betriebsarten** funktionieren — im Desktop als Fenster, im
Terminal als Kachel.
## 2 · Erste Widgets
Eines bauen, benutzen, dann entscheiden.
- **Letzte Dateien** (Aether) — die naheliegendste; braucht nur 1.2
- **Speicherplatz** (Aether) — eine Zahl, ein Balken, billig zu bauen
- **Letzte Notizen** (InkNote) — braucht 1.3, kommt also später
### Widgets in der Leiste selbst
Bisher sind Widgets als Fenster auf dem Schreibtisch gedacht. Der Schreibtisch
ist aber die Seite, die man am seltensten offen hat — die Leiste dagegen ist
überall. Naheliegend also: ein Knopf in der Leiste klappt dasselbe Widget als
kleines Feld auf, ohne die App zu verlassen.
Technisch ist das dieselbe Sache wie 1.6, nur ein zweites Zuhause für denselben
Inhalt: Der Rahmen muss dann drei Formen können — Fenster, Kachel, Aufklappfeld.
Das ist beim **Bauen** von 1.6 zu bedenken, hinterher wird es teuer.
**Eine Einschränkung vorweg:** Die Leiste läuft in einer fremden App. Ein
Aether-Widget in der Leiste **von InkNote aus** braucht deshalb dasselbe, was
1.4 für den Schreibtisch regelt, nur für einen weiteren Ursprung. In der App
selbst (Aether-Widget in Aethers eigener Leiste) ist es geschenkt.
→ Anfangen mit **letzte Dateien**. Wenn du danach merkst, dass du morgens
wirklich draufschaust, lohnt der Rest. Wenn nicht, war es ein Abend.
---
## 3 · Ausbau
- Welche Widgets wo liegen, **pro Nutzer im Server** merken — die Einstellungen
liegen ohnehin schon dort, das ist eine Erweiterung, kein Neubau
- Widgets im Terminal-Modus
- Suche über alle Apps hinweg (erst sinnvoll, wenn mehrere APIs angebunden sind)
- Symbole frei auf dem Schreibtisch ablegen statt in einer Spalte
- Fensterpositionen überleben den Moduswechsel
---
## Offene Entscheidungen
### Wie sichtbar darf die Leiste sein?
**Teilweise beantwortet:** „ausblenden" heißt seit dem 24.08. „einklappen" — es
bleibt ein 3 px hoher Strich am oberen Rand stehen, ein Klick holt die Leiste
zurück. Vorher war das eine Einbahnstraße: wer einmal ausgeblendet hatte, kam
nur über die Entwicklerkonsole wieder heran. `?honeybar=1` an der Adresse
funktioniert als Notausgang.
Damit ist der schmale Streifen technisch schon da. Offen bleibt, ob er am Handy
der **Standard** sein soll.
**Der Zwiespalt:** Die App lädt die Leiste bei *jedem* Aufruf nach, also ist sie
immer da — auch wenn man die Cloud einfach direkt öffnet und mit
HoneyOS gerade nichts zu tun hat. 32 px, dauerhaft, in einer App, die man auch
für sich allein benutzt. Am Handy in einer installierten PWA wiegt das schwerer
als am großen Schirm.
Möglichkeiten, von viel nach wenig Platz:
| | Platz | Gefühl |
|---|---|---|
| volle Leiste | 32 px immer | am ehesten „OS" |
| schmaler Streifen, klappt bei Berührung auf | 4 px | immer erreichbar, nie im Weg |
| nur ein Eckknopf | ~0 | praktisch, aber keine Leiste mehr |
| `data-push="none"` (liegt darüber) | 0 im Layout | verdeckt die Kopfzeile der App |
| ganz aus | 0 | schon eingebaut („leiste ausblenden") |
→ **Vorschlag: am Rechner die volle Leiste, am Handy der schmale Streifen.**
Als Einstellung, nicht fest verdrahtet — dann lässt sich die Meinung ändern,
ohne etwas neu zu bauen.
**Wichtig für die Entscheidung:** Das ist keine Einbahnstraße. In den Apps steht
nur ein Ursprung in der `.env`; das Verhalten der Leiste liegt zentral in HoneyOS. Aussehen,
Höhe, Auto-Verstecken, Abschaffen — alles eine Änderung an einer Stelle, ohne
Aether oder InkNote neu zu bauen.
→ **Erst in einer App einbauen, eine Woche benutzen, dann entscheiden.** Nicht
in beide gleichzeitig.
### Token-Schlüssel behalten oder löschen?
**Empfehlung: löschen.** Gründe:
1. Er wirkt nur an einer von zwei Stellen — in der Leiste ja, auf dem Desktop
nie. Das ist schwer zu erklären und noch schwerer zu merken.
2. Er bringt allein die Namensanzeige. Kein Funktionsunterschied.
3. Sobald 1.3 gebaut ist, ist er ohnehin überflüssig.
4. **Scharfe Kante:** Das Feld „Wer-bin-ich" darf auch eine vollständige fremde
Adresse sein. Steht dort etwas Fremdes *und* ein Token-Schlüssel, schickt die
Leiste den InkNote-Token dorthin. Das setzt voraus, dass jemand Angemeldetes
das selbst einträgt — bei einer Ein-Personen-Instanz also kein akuter
Notstand, aber eine Falle, die niemand braucht.
Wird er doch behalten, gehört mindestens eingebaut: **mit Token-Schlüssel nur
relative Pfade zulassen**, damit ein Ausweis nie an einen fremden Ursprung geht.
Drei Zeilen.
### Persönliche Apps je Nutzer?
Heute gilt die App-Liste für alle — bewusst so, siehe „Bewusst nicht geplant".
Denkbar wäre daneben eine kleine eigene Liste je Konto.
**Was dagegen spricht, ist nicht der Aufwand, sondern eine harte Grenze:** Auf
dem Schreibtisch ginge es sofort (dort ist man angemeldet). In der Leiste einer
fremden App ginge es **nicht**, solange HoneyOS auf einer anderen Site liegt als
die App — der Browser schickt die HoneyOS-Sitzung dann nicht mit, und der
Schlüssel für die App-Liste weiß nicht, wer schaut. Die Leiste zeigte also die
gemeinsamen Apps, der Schreibtisch zusätzlich die eigenen. Zwei verschiedene
Listen an zwei Stellen ist schlechter als eine.
**Liegt alles unter derselben Domain** (`os.beispiel.duckdns.org` +
`cloud.beispiel.duckdns.org`), fällt die Grenze weg: die Sitzung wird
mitgeschickt, die Leiste weiß, wer da ist. Seit dem Umzug auf
`os.asianxpolish.duckdns.org` ist genau das der Fall — persönliche Apps sind
damit machbar geworden.
→ **Vorschlag: zurückstellen, bis es mehr als ein Konto gibt.** Bei einer
Person ist „persönlich" und „für alle" dasselbe. Der Weg ist aber offen und
sollte es bleiben: nichts einbauen, was von einer einzigen gemeinsamen Liste
ausgeht.
### Wie weit soll das Aussehen der Leiste einstellbar sein?
Röhre, Leuchten und Scanlines kommen schon aus HoneyOS (1.1). Offen ist, was
darüber hinaus in die Einstellungen gehört: Höhe, Schriftgröße, Position (oben
oder unten), ob der Name der App danebensteht.
**Die Versuchung ist, alles einstellbar zu machen.** Jede Einstellung ist aber
eine Verzweigung, die für immer funktionieren muss. Sinnvoll wäre der Schnitt:
Farbe und Verhalten ja (das ändert man wirklich), Maße nein (die stellt man
einmal ein und nie wieder — dann kann es auch gleich richtig fest stehen).
### Ideen hier oder als Gitea-Issues?
Vorerst hier. Issues erst, wenn etwas konkret als Nächstes drankommt und der
Fortschritt verfolgt werden soll — dann eines pro Punkt, mit Verweis hierher.
---
## Bewusst nicht geplant
Damit es nicht alle paar Monate neu diskutiert wird:
- **Apps in iframes einbetten.** Aether (`X-Frame-Options: DENY`) und InkNote
(`helmet()`) verbieten es beide von sich aus, und das aus gutem Grund. Es
würde Clickjacking-Schutz, PWA-Installierbarkeit und InkNotes Offline-Betrieb
kosten. Widgets zeigen **Daten**, die Apps bleiben in ihrem eigenen Tab.
- **Nichts über die Leiste wird beim Bauen der Apps eingebacken.** Die Adresse
stand einmal fest in Aethers `index.html`. Das war aus zwei Gründen falsch:
Ein fertiges Abbild lässt sich dann nicht über die `.env` umziehen, und der
Service Worker der PWA hält die alte `index.html` im Cache, so dass eine
Änderung selbst nach dem Neubau noch nicht ankommt. Ursprung und Schlüssel
holt sich die App deshalb zur Laufzeit vom eigenen Server und hängt das
Skript selbst ein.
- **Das Skript wird mit `defer` eingebunden.** Ohne wartet der Seitenaufbau der
App darauf. Ist HoneyOS langsam oder aus, dürfte eine Zierleiste den Start von
Aether nicht verzögern.
- **Der Weg aufs Handy bleibt ein normaler Link.** Android öffnet die
installierte PWA, wenn die Adresse in ihren Bereich fällt — das funktioniert
heute und darf nicht durch JavaScript-Navigation oder Rahmen kaputtgemacht
werden.
- **HoneyOS speichert keine Inhalte.** Keine Dateien, keine Notizen, keine
Kopien. Es zeigt, was die Apps hergeben, und hört da auf.
- **Keine Rechteverwaltung.** Die App-Liste gilt für alle Angemeldeten. Für eine
Handvoll eigene Konten gewollt; wäre es je mehr, müsste das neu gedacht werden.