Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Remove install-time binary download; retire the dead log viewer - #180

Merged
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer
Aug 20, 2026
Merged

Remove install-time binary download; retire the dead log viewer#180
brentrager merged 1 commit into
mainfrom
fix/retire-log-viewer

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

Problem

package.json had "postinstall": "pnpm run log-viewer:bundle". That script downloads

https://github.com/SmooAI/logger/releases/latest/download/smooai-log-viewer-<platform>-<arch>

and chmod 0755s it — on everynpm i @smooai/logger. It is:

  • unpinnedlatest, not the version being installed, so what lands is whatever the newest release happens to carry;
  • unverified — no checksum, no signature;
  • silently fallible — on a non-200 it falls back to cargo build --release, which is a no-op when cargo is absent, so a failed fetch looks like success.

Python did the same from poe build / poe publish (python/scripts/bundle-log-viewer.py).

And the binary being fetched is the deprecated egui viewer. log-viewer/DEPRECATED.md has said since studio-v0.1.0 that it is gone, superseded by SmooAI Observability Studio in SmooAI/observability (desktop/). Meanwhile build-log-viewer.yml still built it for four platforms on every release.

What this does

  • Deletes the postinstall hook and both bundle-log-viewer scripts.
  • Deletes the smooai-log-viewer npm bin + PyPI console script and their wrappers (src/cli/log-viewer.ts, python/src/smooai_logger/cli/).
  • Deletes the log-viewer/ crate source, its Cargo.toml/Cargo.lock/assets, and build-log-viewer.yml; drops log-viewer:* from build/check-all/format/lint/test/typecheck and from the Rust cache workspaces in both workflows.
  • Untracks 97 MB of build artifacts — python/log-viewer/linux-x64/smooai-log-viewer (44 MB), python/log-viewer/darwin-arm64/smooai-log-viewer (42 MB), smooai-logger-3.1.2.tgz (11 MB, stale in a 4.3.0 repo) — and gitignores the patterns.
  • Drops log-viewer/README.md from files (that file never existed) and the unused @oclif/core devDep.

log-viewer/DEPRECATED.md stays as the tombstone; README.md and it are updated to say the crate is now deleted rather than merely superseded. No logging API changes in any language.

Deleting the crate — confirmed

The replacement genuinely covers it: SmooAI/observability has desktop/ with observability-studio-app, observability-studio-client, observability-studio-theme, and the studio-v0.1.0 tag exists. Source stays recoverable via git log -- log-viewer/src.

Bonus finding

The Python console script was dead on arrival independent of all this: find_binary() resolved to <site-packages>/log-viewer/<plat>-<arch>/…, but the bundler wrote to python/log-viewer/ — outside python/src/, so hatchling never included it in the wheel. Any user who ran smooai-log-viewer from PyPI got the "No binary found" error.

Judgment calls

  • minor, not major. Removing a published bin is arguably breaking, but the library API is untouched and the bin launched an app upstream already declared deleted. A major here would also force the Go module path to /v5 immediately, undoing the /v4 fix landing next. Say the word and I'll re-cut it as major.
  • No history rewrite. The 97 MB is removed from HEAD only, so the repo stays heavy to clone (~100 MB of dead blobs in history). A git filter-repo + force-push would fix that but rewrites published refs — your call, not mine.

Verification

pnpm install (no download attempted), pnpm tsdown, tsc --noEmit, go build ./... all clean locally; full multi-language suite runs in PR checks.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

`postinstall` ran `bundle-log-viewer`, which fetched
`releases/latest/download/smooai-log-viewer-<platform>-<arch>` and chmod 0755'd
it on every `npm i @smooai/logger` — unpinned (`latest`, not the installed
version), unverified (no checksum or signature), with a silent `cargo build`
fallback. Python's `poe build`/`poe publish` did the same. The binary was the
egui viewer that `log-viewer/DEPRECATED.md` declared gone as of `studio-v0.1.0`,
superseded by SmooAI Observability Studio in SmooAI/observability (`desktop/`,
crates verified present).
Removes the hook, both bundle scripts, the npm bin and PyPI console script and
their wrappers, the `log-viewer/` crate source, and `build-log-viewer.yml`.
Also untracks 97 MB of build artifacts (`python/log-viewer/*` binaries,
`smooai-logger-3.1.2.tgz`) and gitignores them, drops the phantom
`log-viewer/README.md` from `files`, and drops the unused `@oclif/core` devDep.
The Python console script was dead on arrival anyway: it resolved the binary to
`<site-packages>/log-viewer/...`, but the bundler wrote it to `python/log-viewer/`
— outside `python/src/`, so hatchling never put it in the wheel.
`log-viewer/DEPRECATED.md` stays as the tombstone. Logging APIs unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 13e1028

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerMinor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@brentrager
brentrager merged commit 154ecd1 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/retire-log-viewer branch August 20, 2026 17:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@brentrager