You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Crash grouping worked for Unity only. GameMaker writes [hh:mm:ss] LEVEL: message
lines and a ===== FASTLOGS SESSION marker; the server's parser knew only Unity's [E] +12.345 message and ==== FastLogs session . Every GM log therefore parsed to
zero entries and every GM crash got a null signature, so the Crashes tab was silently
empty while the viewer rendered the same log fine. Both grammars are now parsed, one
crash keeps one signature across engines, and Unity signatures are unchanged (existing
groups do not split). GM logs already stored were stamped "not a crash" at ingest and
the lazy backfill only revisits unknowns, so a one-time migration (user_version=1)
clears that sentinel for GM rows and lets them regroup; Unity rows are untouched.
UI > EnableUI did not disable the UI. It was read in exactly one place - the loop
guard's confirm dialog - so clearing it still constructed the IMGUI overlay, its
settings panel and a toggle gesture polling input every frame. It now withholds both.
Added
FastLogsHeadlessServices: capture, upload, screenshots and clipboard with no overlay
and no gesture, independent of the config asset. FastLogs.SetServicesProvider(new FastLogsHeadlessServices()) is the documented way to run FastLogs as a plain library.
The bundled implementations are public and composable: FastLogsDefaultServices (now
subclassable - override one factory, keep the rest), CapturingLogSource, UnityWebRequestUploader, ScreenshotCapturer, ClipboardService. Previously the UI
classes were public while everything else was internal, so "everything except the UI"
was the one thing you could not assemble.
Contract 1a makes the logText grammar normative (entry lines, session marker, stack
frame shapes) and 7.11-7.12 spell out engine identification. A client writing its own
line format is accepted with a 201 and looks healthy while Crashes, level filters and
session dividers are silently dead - which is what happened to GameMaker.
First captured fixture (server/test/fixtures/) plus a sha256 guard: a real player's
payload now runs through ingest in the test suite. It immediately pinned a contract
fact - the Unity client sends no device.application.engine at all and is labelled
Unity only by the server's fallback, the same fallback that mislabelled GameMaker.
CI guard keeping the declared engine-free files free of direct UnityEngine references.
Changed
BREAKING: the command channel's poll/ack tier now always requires a token. An app
with no token configured could previously be polled and acked by anyone who knew its
id. Registered apps carry a token already and are unaffected.
MCP dereferencing of offloaded results is restricted to the configured origin (SSRF).
Log-store compaction uses a low-watermark: the store was rewritten in full on every
line past the cap (~2 MB of IO and ~16 MB of garbage per line at a 2 MB cap).
Serialized-field reflection is cached per type; component change detection hashes in
place; the IMGUI driver stays disabled unless something is actually on screen.
Sweeper drains its backlog instead of one batch per tick; X-Forwarded-For is no
longer trusted blindly; a file cannot be attached to another app's log.
GameMaker reports send device.application.engine explicitly, so they no longer rely
on the server's version-string heuristic.