# ECMind blue Studio 1.0.0

**URL:** <https://ecm.community/t/ecmind-blue-studio-1-0-0/868>\
**Category:** Produktvorstellungen\
**Tags:** coding, release\
**Created:** [8. September 2026 um 13:37 UTC](https://ecm.community/t/ecmind-blue-studio-1-0-0/868 "2026-09-08T13:37:47Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![rk](https://ecm.community/user_avatar/ecm.community/rk/32/679_2.png) [@rk](https://ecm.community/u/rk)\
**Post date:** [8. September 2026 um 13:37 UTC](https://ecm.community/t/ecmind-blue-studio-1-0-0/868/1 "2026-09-08T13:37:47Z")

</div>

Heute freue ich mich, dass wir das _ECMind blue Studio_ in Version 1.0.0 auf [PyPI.org](http://PyPI.org) veröffentlichen konnten:

[ECMind blue Studio auf pypi.org](https://pypi.org/project/ecmind-blue-studio/1.0.0/)

Das _ECMind blue Studio_ ist eine Weboberfläche, die wir primär für unsere tägliche Arbeit in der Administration und Entwicklung mit für enaio®, sozusagen „für uns selbst“ entwickelt haben. Da dies aber auch für andere nützlich sein könnte, haben wir es kostenlos veröffentlicht.

**Bitte beachtet aber unbedingt, dass die Verwendung von enaio® selbst, inklusive API, von jedem Unternehmen bzw. User in Abstimmung mit OPTIMAL SYSTEMS oder dem enaio®-Vertriebspartner selbstständig zu klären und entsprechend gegenüber OPTIMAL SYSTEMS zu vergüten ist.**

ECMind blue Studio setzt auf den `ecmind-blue-client` auf, bringt alle unten gezeigten Frontend-Bestandteile mit und benötigt keine Internetverbindung. Die Anmeldung erfolgt mit einem DMS-User: Jede Anweisung läuft mit den Rechten dieses Users, nicht mit denen des technischen Kontos.

```auto
pip install ecmind-blue-studio
# .env mit Servern, technischem Konto und Session-Secret füllen
ecmind-blue-studio

```

Voraussetzung sind Python \>= 3.13 und ein technisches Konto mit der Systemrolle „Kontextwechsel“. Der Quellcode liegt unter MIT auf [https://gitlab.ecmind.ch/open/ecmind\_blue\_studio](https://gitlab.ecmind.ch/open/ecmind_blue_studio).

### Abfragen und Schreiben in einer eigenen Sprache

Jeder Tab ist ein Monaco-Editor mit Vervollständigung, Hover und Diagnose über die echte Objektdefinition, `Ctrl+Enter` führt aus. Interne Feldnamen werden ohne Klammern geschrieben, Unterabfragen gehen über die Objekthierarchie, Schreibanweisungen lesen ihr Ergebnis zurück und zeigen es als Tabelle:

```auto
select document Invoice where Status = 'open' and InvoiceDate >= #DATE#-3m order by InvoiceDate desc limit 50
select folder Customer contains (document Invoice where Status = 'overdue')
update document Invoice 4711 set Status = 'paid'
insert document Invoice into 5693 set InvoiceNo = 'R-9', Amount = 12.5 file 'scan.pdf'

```

Ergebnisse gibt es als Tabelle, JSON, JSONL, XML, CSV oder TSV – pro Zeile mit den Icons Detailansicht, Historie, Dokumentenvorschau und Download. Ein Objekttyp, den der angemeldete Benutzer nicht sehen darf, wird vor dem Ausführen markiert, weil das DMS eine solche Abfrage mit einem leeren Ergebnis und ohne jeden Fehler beantwortet.

 ![Abfrage mit Ergebnistabelle](https://ecm.community/uploads/default/original/1X/1539b4d6cdec9a178cc0fe134352f4f069f65f00.jpeg)

### Objektdefinition zum Nachschauen

Der erste feste Tab zeigt, was der Server über sein eigenes Datenmodell weiss: Schränke mit Ordnern, Registern und Dokumenten, jedes Indexfeld mit Datentyp, Datenbankspalte und den Namen in allen konfigurierten Sprachen. Das Filterfeld sucht über alles gleichzeitig, pro Objekttyp öffnen sechs Schaltflächen eine vorbefüllte `select`-, `count`-, `insert`-, `update`-, `upsert`- oder `delete`-Anweisung in einem neuen Tab und die native `asobjdef.xml` gibt es als Download.

 ![Objektdefinition mit Feldern](https://ecm.community/uploads/default/original/1X/ff2b9ac766eeb940b84455dbb33c730b85df7755.png)

### Live-Ansicht von Jobaufrufen

Der zweite feste Tab hört auf den Jobaufruf-Strom der konfigurierten Server, also auf denselben Feed, den der Enterprise Manager anzeigt. Gefiltert wird nach Server, Job, Computer, Anwendung und Benutzer oder auf Fehler reduziert. Ein Klick auf eine Zeile zeigt den Aufruf so, wie ihn der Enterprise Manager schreibt, aber mit dekodierten Base64-Nutzlasten und eingerücktem XML. Jeder Wert im Kopf ist ein Filter auf sich selbst. Der letzte Link öffnet den Aufruf als fertige `execute`-Anweisung in einem neuen Tab.

 ![Jobaufrufe mit dekodiertem Parameter](https://ecm.community/uploads/default/original/1X/76d4b4b15e8188ece7e7118235e98a592d7114ba.png)

### Jeder Serverjob aus dem Editor

`execute` ruft jeden Serverjob direkt auf, mit typisierter Parameterliste. Der Typ kommt aus dem Literal, ein Base64-Parameter wird als Klartext zwischen `'''` geschrieben, damit eine XML-Nutzlast im Editor lesbar bleibt. Eingabedateien kommen aus den Anhängen des Tabs, Antwortdateien stehen mit Vorschau und Download unter dem Ergebnis. Ein Rückgabewert ungleich null ist kein Fehler, sondern die Antwort:

```auto
execute krn.GetServerInfo set Flags = 0, Info = 6
execute dms.GetResultList set Flags = 16, XML = '''<DMSQuery/>''', Encoding = 'UTF-8' as res;
print @res.Count, @res.TotalHits

```

Die Vervollständigung kennt die Jobs, die der Server tatsächlich anbietet, und ergänzt Parameternamen, Typen und Beschreibungen aus der öffentlichen API-Referenz des DMS.

 ![execute mit Antwortdatei](https://ecm.community/uploads/default/original/1X/3e8f63d12f2ba15278780587c5396ef1b59615ca.png)

### Registry und Threads über alle Server

Die Registry gehört einer Servermaschine und zwei Applikationsserver eines Pools können sich über eine Einstellung uneinig sein. Genau das macht diese Anweisungsfamilie sichtbar: Der Server ist eine Spalte jeder Zeile und ohne `on`-Klausel wird jeder konfigurierte Server gefragt. Einträge, deren Name auf `Pwd`, `Password` oder `Secret` enden, zeigen `***` in Ergebnis, Export und Log gleichermassen. Eine Schreibanweisung ist erst persistent, wenn sie auf `save` endet. Dieselbe Logik gilt für `select threads` und `select queues`, dort typisiert mit abgeleiteten Spalten wie der mittleren Jobdauer, und mit `break thread` für einen hängenden Job.

```auto
select registry where name = 'HelpURL'
update registry set 'Security\HelpURL' = 'https://help.example' save
select threads where running = true order by avgjob desc

```

 ![Registry über zwei Server](https://ecm.community/uploads/default/original/1X/66b556f15b098e99f289b8b27b841f579c539b73.png)

### Und sonst

- Sicherheitssystem: `select user`, `insert user`, `add user to group`, `export security group ...`, mit `reload security`, weil eine Rechteänderung erst nach dem Neulesen des Modells wirkt und das System bis dahin keinen Fehler meldet.
- Freies SQL mit DMS-Namen: `sql SELECT {original_filename} FROM {PostDoc} WHERE {Status} = 'done'` geht als `SELECT feld1 FROM object48 WHERE feld4 = 'done'` an die Datenbank. Ersetzt wird nur der Text in den Klammern - und nur durch einen Identifier aus der Definition.
- Konfiguration pro Anmeldung im DMS: Theme, Sprache und gespeicherte Abfragen folgen dem Benutzer in jeden Browser.
- Deutsch und Englisch mit automatischer Erkennung, Dark- und Light-Mode ebenfalls automatisch.

Ein Hinweis: Der Jobaufruf-Monitor, `execute`, die Registry- und die Thread-Anweisungen laufen auf der technischen Verbindung, weil die dahinterliegenden Jobs kein eigenes Rechtemodell haben (können). Der Zugang hängt deshalb an den Systemrollen „DMS: Supervisor“ oder „Administrator: Starten“, serverseitig geprüft, und die Jobparameter werden unmaskiert angezeigt. Dies ist also auch weiterhin besonders zu schützen, wenn das ECMind blue Studio eingesetzt werden soll.

Zu den einzelnen Bereichen folgen in den nächsten Wochen eigene Beiträge, hier ging es erst einmal um den Überblick.

Wie praktisch jede Software steht auch diese auf den Schultern vieler anderer Projekte. Unser Dank geht deshalb unter anderem an [FastAPI](https://fastapi.tiangolo.com/), [Uvicorn](https://www.uvicorn.org/), [Jinja](https://jinja.palletsprojects.com/), [Pydantic](https://docs.pydantic.dev/), [HTMX](https://htmx.org/), [Bootstrap](https://getbootstrap.com), [Monaco Editor](https://microsoft.github.io/monaco-editor/), [Phosphor Icons](https://phosphoricons.com/), [Open Sans](https://fonts.google.com/specimen/Open+Sans), [JetBrains Mono](https://www.jetbrains.com/lp/mono/), [Python](https://www.python.org/) und natürlich insbesondere [OPTIMAL SYSTEMS](https://optimal-systems.com/).

Für Rückfragen stehe ich hier im Forum gerne zur Verfügung.
