Replaces the all-or-nothing "Errors only" collapse with a contextual
fold: ±25 entries around every error stay visible, and runs of
non-error entries with no nearby error collapse into a fold bar.
Each fold bar is draggable. Vertical pointer drag on the bar reveals
or re-hides lines from the top of the hidden range, ~6 px per line.
A click without drag reveals the next 25 lines. When the run is
fully revealed, the bar removes itself. Buttons / scroll behaviour
are unchanged; the existing "X errors" toggle in the header is the
entry point and still un-collapses everything on second click.
Visual: foldable bars get a faint horizontal hatch (suggesting
compressed content), an ns-resize cursor, and a hover/dragging
state that intensifies the hatch toward --accent. The grip-lines
icon flanks the line-count to call out the affordance.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Buffers large pastes outside the textarea to prevent the
multi-second UI freeze that happens when megabytes of text get
committed to a <textarea> in one shot. Threshold 256 KB; first 50
lines + a banner render into the textarea, full content uploads
on Save.
Pasting (or drag-loading, or file-uploading) several MB of text into
the <textarea> would lock up the browser for seconds while it laid
out millions of characters. The bottleneck is the textarea itself,
not the filter pipeline (filters only run on Save).
Hold above-threshold (256 KB) content in a JS-side `bufferedContent`
variable and render only the first 50 lines + a banner into the
textarea. The Save path uses `bufferedContent` when set, so the
upload sees the full content. The textarea becomes read-only while
the buffer is active; user-typed input invalidates the buffer
automatically (the textarea is the source of truth in normal mode).
A new `loadContent(text)` helper is the single entry point: it
chooses textarea vs. buffer based on length. All call sites
(clipboard read, paste-event for text, file load, text drop) route
through it. Threshold is 256 KB (above which textarea rendering
visibly stutters); preview is 50 lines (enough to recognise the log
without choking the renderer).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bumps codex to v0.3.0 and aligns iblogs's save-time PII filter
chain with codex's ProjectZomboidRedactor. Removes the redundant
in-tree IPv4Filter / IPv6Filter chain entries (codex now handles
IPs end-to-end including port suffixes). Adds PZ-specific Steam
ID / player-name / coordinate scrubbing the prior chain never had.
Bumps the codex constraint from ^0.2.0 to ^0.3.0 to pull the PZ-B42
parser fix and the IP-redaction passes added in the codex v0.3.0
release. Wires codex's ProjectZomboidRedactor into the save-time
Filter chain via a thin ProjectZomboidRedactorFilter wrapper, and
removes the now-redundant IPv4Filter / IPv6Filter chain entries:
- Codex's IPv4 / IPv6 redaction is generic-applicable (not PZ-only)
and superior to the prior in-tree filters because it consumes the
port suffix together with the address; previously only the IP was
scrubbed, leaving e.g. ":27015" visible.
- Codex additionally redacts PZ-specific PII the prior filters never
touched (Steam IDs, player names, world coordinates).
- The IPv4Filter and IPv6Filter source files are retained on disk
for easy restore from history if a future paste type proves
unsuitable for codex-driven IP scrubbing.
UsernameFilter (OS-path username scrubbing — different concern from
PZ player names) and AccessTokenFilter remain untouched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Required so Composer can resolve VCS-based dependencies (e.g. forked codex packages) at build time.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous bullet credited aternosorg/codex-minecraft as the
analysis engine; that dependency was dropped in the codex-swap commit.
Updates the link to point at the in-tree indifferentketchup/codex repo
on Gitea while preserving an attribution back to the upstream codex
that iblogs is built on. The footer credit (Aternos / mclogs) remains
the load-bearing attribution per the manual-fork rules.
Drops aternos/codex (and its codex-minecraft / codex-hytale satellites)
plus aternos/sherlock from composer.json. Adds indifferentketchup/codex
pinned to ^0.2.0, sourced via a Composer vcs repository pointing at the
Gitea-hosted ik-codex repo. composer.lock regenerated against the new
dep tree.
Re-points the seven Aternos\Codex\* import sites in src/ to their
IndifferentKetchup\Codex\* equivalents:
- src/Log.php (5 imports)
- src/Api/Response/CodexLogResponse.php (1 import)
- src/Printer/Printer.php (5 imports)
- src/Detective.php (rewritten — see below)
Stubs three sites that depend on Minecraft-specific code with no
analogue in IndifferentKetchup\Codex:
- src/Detective.php no longer extends the Aternos Detective with
Minecraft + Hytale satellites. Instead it extends our codex's
Detective and registers ProjectZomboidDetective, which itself
pre-registers all 11 PZ log subclasses.
- src/Data/Deobfuscator.php is reduced to a no-op shell. mclogs used
aternos/sherlock to fetch Mojang/Yarn obfuscation maps and
deobfuscate Vanilla / Fabric stack traces. Project Zomboid uses no
such mapping scheme; the deobfuscator returns null until iblogs
supports Minecraft logs again. Class signature preserved so callers
in src/Log.php and elsewhere don't break.
- src/Printer/FormatModification.php no longer extends the Minecraft
section-sign-code translator. It extends IndifferentKetchup\Codex's
Modification base class with a pass-through modify() implementation.
The format-* CSS color classes are retained for any future game's
own format-code scheme to reuse.
Updates composer.json metadata: description rewritten to drop the
"Minecraft" framing, authors entry replaced with indifferentketchup /
samkintop@gmail.com.
Verification:
composer update --ignore-platform-req=ext-frankenphp \
--ignore-platform-req=ext-mongodb
-> resolves cleanly: 1 install (indifferentketchup/codex 0.2.0),
4 removals (the aternos/* set).
php -l on every touched file -> no syntax errors.
Autoload smoke test -> Detective registers 11 PZ log classes;
Printer instantiates; FormatModification stub returns input
unchanged.
example.config.json: legal contact, imprint, privacy URLs swapped to
indifferentketchup.com placeholders; abuse address changed to
samkintop@gmail.com (matches the codex package's author entry);
frontend.name placeholder changed from "mclo.gs" to "iblogs.example".
UI templates: tagline replaced with "Built for game-server logs"
(header.php), meta description rewritten to drop Minecraft & Hytale
framing (start.php), api-docs.php's example "Minecraft version" labels
updated to "Engine version" with a 42.16.3 sample value matching the
codex PZ EngineVersionInformation output shape.
CSS comment "Minecraft Format Colors" tagged as legacy mclogs syntax
palette (the underlying color classes survive untouched — they may
still be useful for highlighting log content).
Footer attribution credit linking back to upstream mclogs and Aternos
is intentionally preserved per the manual-fork rules.
Frontend palette (#5cb85c green accent, etc.) and short-domain choice
remain placeholder values; revisit when iblogs branding is finalised.
Two file renames (docker/mclogs.ini -> docker/iblogs.ini,
web/public/css/mclogs.css -> web/public/css/iblogs.css) plus the
internal references that pointed at them (Dockerfile COPY directive,
the linux user name in the container).
Also catches the runtime identifier renames: env-var prefix MCLOGS_*
-> IBLOGS_* (compose files), browser cookie name MCLOGS_SETTINGS ->
IBLOGS_SETTINGS (web/public/js/log.js), production image tag
ghcr.io/aternosorg/mclogs:2 -> ghcr.io/indifferentketchup/iblogs:2,
and the README walk-through with the new branding.
example.config.json branding strings (legal contact, mclo.gs frontend
name) and visible UI text (taglines, meta descriptions) are deferred
to a separate branding commit.
Bulk substitution across all PHP files in src/, build.php, worker.php,
and web/frontend/. Updates composer.json's package name and PSR-4
autoload root accordingly. Casing matches the existing
IndifferentKetchup\Codex package's namespace convention (capital K).
Strictly a namespace rename. Aternos\Codex\* imports remain in place;
those get re-pointed in a follow-up commit when the codex Composer
dependency itself is swapped. Filename renames (docker/mclogs.ini,
web/public/css/mclogs.css), README walk-through, env-var prefix changes,
and visible-text branding land in subsequent commits.