🚩 2.8.0
Eventum 2.8.0 — generator repositories in Studio, project export and import, a log file per component, and per-instance resource accounting.
Released August 29, 2026
Studio connects git repositories that publish ready-made generators and installs one of them as a project, so a new data source no longer starts from an empty configuration. Projects export and import as ZIP archives, the log is split into a file per component, and every running instance reports the processor, threads, disk, network and queue memory it occupies.
Five changes alter how an existing setup behaves:
server.ui_enabledandserver.api_enabledare gone. Deprecated in 2.7.0, they are now rejected as unknown settings — move the value underserver.ui.enabledandserver.api.enabled.- The log files changed. A record goes to
main.log,server.log,server_access.log,mcp.logorgenerator_<id>.logby the part of the application it came from, andserver_error.logis gone. Anything collecting these files needs the new set. - The events queue is bounded in memory. It holds at most
generation.queue.max_event_bytes, 256 MiB by default. The limit is set for the application, overridden per instance, or set tonullto lift it. - Sample mode ignores
batch.delaywhenbatch.sizeis set. Batches are formed by size alone, so a per-batch formatter such asjson-batchwrites larger arrays than before — see Batching. - A secret name is checked when it is written. It must be words of lowercase letters, digits and
_, separated by.— see Naming a secret. Names already in a keyring are left as they are.
🚀 New features
Eventum Studio
- Generator repositories — connect a git repository of ready-made generators and install any entry of its catalog as a project
- Repository discovery — find a repository by searching GitHub for the ones carrying the
eventum-generatorstopic, and connect it from the list - Project export and import — export a project as a ZIP archive and import it as a new project, on the same instance or another one
- Monitoring rebuilt around the running instances — the load chart and the instance table share one search, one set of filters and one selection
- Instance overview — an instance opens on its rates, its totals and what the run costs, which used to be a grid of figures at the foot of the page
- Release highlights — what an upgrade brought opens by itself on the first load after it, and stays reachable from the user menu
- Log channels on the Management page — stream the Main, Server, Access and MCP logs of the application separately
- Download in the project file tree — save a project file to your machine, including generator output too large for the editor to open
- A keyring picker beside password fields — pick a secret from the keyring instead of typing the
${secrets.<name>}reference by hand - Scripts in the scenario data flow diagram — the diagram carries the global keys a
scriptevent plugin reads and writes, beside the templates that do the same - A rebuilt About dialog — the version, the runtime, the host and the build read as one aligned list
- Error details ordered by diagnostic value — the dialog leads with what the server reported, and the raw request and response sit behind one toggle
Core
- A log file per component — a generator writes a log file of its own, down to the traffic its output plugins produce, instead of sharing one with the application
- Per-instance resource accounting — an instance reports the threads, processor time, waiting, disk and network bytes and queue levels it occupies, and Monitoring ranks the running ones by each of them
generation.queue.max_event_bytes— limit the events queue by the memory it holds, not only by the number of batches in itlog.third_party_level— set the level of third-party libraries separately fromlog.level,warningby default- The state of the GIL — the instance information reports whether generators run in parallel, and Management warns when the GIL came back after startup
- The caller of a served request — everything logged while serving a request carries the address of the client that caused it
Generators
- Global state in the
scriptevent plugin — a script reads and writes the same global state a template does, through aglobalskey of its parameters concurrencyin thehttpoutput — cap how many requests the plugin performs at a time, 100 by default
AI agents
- Repository tools — an agent lists the connected repositories, reads the catalog one publishes and installs a generator from it
export_generatorandimport_generator— an agent moves a whole project in or out as a ZIP archive instead of copying it file by fileget_instance_logs— an agent reads any log channel of the application, not just the log of a generator- Resources in
get_generator_stats— the tool carries the same per-instance resource figures the API does
API
- Repository, export and import endpoints — connect repositories and export or import projects over HTTP
🐛 Bug fixes
Eventum Studio
- A page whose code or stylesheet never arrived reloads the document once, instead of dropping Studio on the error screen
- The Studio shell is no longer served from the browser cache, so it cannot outlive an upgrade and ask for files the new build does not carry
- Wide tables scroll inside their own panel on a narrow window, instead of putting their rightmost columns out of reach behind the page scrollbar
- The editor keeps its width while the explorer and the inspector give way, instead of absorbing every bit of narrowing
- The plugin parameters form follows the plugin rather than its position in the list, so deleting one no longer writes its values over another
- Switching off the events-queue memory limit, or batching by
batch.sizeorbatch.delayalone, now reaches the instance: the settings form dropped the value that asks for it, so the choice was never applied and the switch came back on - The instance settings are reread after saving, so the page stops showing the values it held before the write
- An instance registered from outside the workspace names the directory it sits in, instead of linking to a project page that cannot exist
- The projects table no longer re-renders without end when it is opened without an instance filter
- The template editor completes
popamong the state calls it offers - The table sort controls, the instance switches and the delimiter shortcuts carry names a screen reader can announce
Core and API
- A secret named
keys,itemsoraws.getno longer resolves to a method of the collection holding the secrets, for${params.*}as well - What uses a secret counts connected repositories as well as projects, and renaming it repoints every one of them
- Non-ASCII values in a configuration are stored as they were entered, not as
\uXXXXescape sequences - Configurations, templates, samples, time patterns and log files are read and written as UTF-8 whatever the host locale is
- The pipeline backpressure warnings name what actually happened — a cancelled write, or a queue that filled up — instead of blaming the generation rate
- Repeated write timeouts of an output plugin are reported as one line with a running count, in place of one line per cancelled write
- A path that leaves the project directory through a symlink is refused for every file operation
Generators
- A
tcpoutput whose target stopped reading fails the write at once, instead of growing the memory of the application and holding up the shutdown of the instance - A template that acquired the global state lock and never released it no longer freezes every other generator
- A batch written through the
httpoutput under a per-event formatter no longer fires a request per event at once, which used to cancel the write on its timeout and count every event as failed - A
subprocess.runcall runs under a timeout of 30 seconds by default and 300 at most, and fails rather than holding more than 8 MiB of output
⚡ Performance
- A generator catching up — started on a past range, or fallen behind real time — merges the batches whose timestamps are already due up to
batch.size, instead of publishing each of the small batchesbatch.delaycut them into - Starting many instances at once no longer compiles all of their templates at the same moment, so a large scenario comes up without the spike on the host
📝 Other changes
- The body of
POST /preview/{name}/event-plugin/produceis described by a request model of its own and rejects anything else - The preview global state endpoints moved from
/preview/{name}/event-plugin/template/state/globalto/preview/{name}/event-plugin/state/global, since the state they read belongs to every event plugin - The disk figures of the application count the bytes handed to the system calls, the same measure an instance is reported by, so the two can be compared; the application used to count what reached the disk instead