Skip to content

Unshell 2.4.3: popup rebuilt around the page, new name and icon - #8

Merged
dekrezz merged 42 commits into
mainfrom
unshell
Oct 21, 2026
Merged

dekrezz merged 42 commits into
mainfrom
unshell

Conversation

@dekrezz

@dekrezz dekrezz commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Renamed to Unshell. The extension, packages, docs, licence line and download filenames now say Unshell; the repository is dekrezz/Unshell. Internal identifiers (JS globals, storage keys, port names, the add-on ID) are unchanged, so saved settings survive.
  • The popup is restructured, not reskinned.
    • A page card names what is about to be copied: the host's initial, the host, a mode label (Page, Chat · ChatGPT, Telegram, N tabs) and the title.
    • Below it, one heavy key copies. A row of equal keys holds Save .md, the opposite scope for this copy (Full page or Main content) and Selection. They used to sit behind a caret menu.
    • Links, Images, Tables and Metadata are switches on the card, driving the same Formatting checkboxes.
    • The Telegram limits move onto the card. Selected tabs are listed by name.
    • The outcome of a copy (status and token count) lands on the card's foot.
  • Settings are grouped into Copy, Sites, Research, Interface and About.
  • New icon and mark: a shell opened at the corner, stroked with the spectrum.
  • Dark-theme fix: colour aliases declared only on :root kept their light values inside .dark-theme (ink-on-dark Telegram segments and settings hints).
  • Settings are rows on one card per section (name left, switch / segments / menu right); a site's own options open only while its mode is on.
  • Research: one way to start (the sheet's heavy key; the go arrow steps aside while the plan is up), DuckDuckGo named as where the question goes, the result as a file card. The glow under the key was the field's scroll fade over the sheet.
  • Site icon on the page card: Chrome's favicon cache (favicon permission, Chrome package only), the tab's reported icon in Firefox; the initial when there is none.
  • Chat exchange limit is a segment row on the card; the seven-item menu ran under the research bar. Copy page is a key.
  • No native tooltips: title attributes that repeated a button's label are gone; icon-only buttons carry aria-label.
  • Site icon in Firefox: Firefox's favIconUrl is intermittently empty (bug 1417721), so the popup also asks the page which icon it declares (getPageIcon) and tries that.
  • No sideways movement: the main view and settings can no longer be dragged left or right (it moved under a held pointer and under text being selected), and settings cross-fade in place instead of sliding.
  • Version 2.4.3 (2.4.1 was taken on AMO by an interrupted upload of an earlier build).

This branch starts from the 2.3.0 build (v2.3.0 = e58e799), which merges #2–#7. Merging this PR merges those too.

Test first

Commit Contents Expected CI
c4f7f5e test: research downloads are unshell-research-… red (research.js still writes scrapllm-research-)
4e39f2d download filenames renamed green
856b17a test: every :root alias of a dark-overridden token is declared on .dark-theme red (five aliases)
17df224 aliases declared on the theme classes green
436cd84 test: site icon from Chrome's favicon cache / Firefox's tab icon, none on browser pages red (page-icon.js missing)
708cc57 page-icon.js and the page card's icon green
1e6e51f test: the page's declared icon (rel=icon → apple-touch-icon → /favicon.ico) is tried when the browser has none red (candidates, declaredIcon missing)
44776e4 declared-icon fallback via the content script green

CI

Actions jobs on this account are not starting (billing), so none of these runs has executed. Re-run them in order once billing is fixed.

Not verified

The popup was checked by rendering popup.html headless in Firefox against a stubbed extension API, in every mode and both themes. It has not been checked as an installed extension against live pages, and keyboard focus rings could not be captured headless.

Changes:

- Popup redesign: restyled interface set in Geist and Geist Mono, bundled with the extension
- Popup preloads both fonts so it does not paint in a fallback typeface first
- In-page notifications use a dark translucent surface, muted status colours and Geist when it is installed
- Chrome, Firefox and source packages include the assets/ directory (fonts and particle halo)
Changes:

- Version 2.3.0
Changes:

- README is restructured as a guided start page: what it is, build and load steps, then a contents list and reference sections
- Privacy and permissions are now one section that lists every network call and every manifest permission
- Credits and license name the original LLMFeeder project and the bundled libraries
Changes:

- Build Validation fails when a package is missing a file from extension/: the source package must hold every file, the Chrome and Firefox packages every script, page and stylesheet
- Expected to fail on this commit alone: the source package lacks discord.js, github.js, telegram.js and youtube.js
Changes:

- The source package includes the GitHub, YouTube, Discord and Telegram extractors, which it had been shipping without
Changes:

- Tests for Copy Chat and Copy page on Google AI Mode, written from the requirements before the fix. The fixtures are reconstructed from the extractor's model and two exporters' class names, not captured from a live page
- Expected to fail on this commit, R1 (both tests): a question asked twice ("continue") is kept once, because turns are keyed by their question text; the scroll-walk test gets three exchanges instead of four
- Expected to fail, R2 (both tests): a heading with no label, "Python: which library reads TOML?", loses "Python:", because anything before a colon in the first 24 characters is taken for the label
- Expected to fail, R3: formulas come out as base64 images (block) or not at all (inline, hidden from screen readers) instead of LaTeX
- Expected to fail, R4 (both tests): the empty AI Mode home /search?udm=50 is offered as a conversation, and /ai?q= and /aimode?q= are not
- Expected to fail, R5 (four extractor tests): a thread URL with nothing readable returns null, so Copy Chat scrapes the page with the generic chat reader, copying the page returns null, and a question with no answer is copied as a lone question
- Expected to fail, R5 (three content-script tests): the popup is shown "An error occurred during conversion." instead of the extractor's sentence, and an ordinary Google search page is refused with "No AI Mode answer could be extracted from this page" instead of being converted
- Expected to fail, R6: a saved thread is cited as https://www.google.com/search?udm=50&q= with an empty q
- Expected to pass on this commit: the four R7 guards (answer sections stay in their answer, a chip becomes its label, the rail, feedback, disclaimer and prompt box are left out, the copy holds every exchange and names Google AI Mode)
Changes:

- Copy Chat on Google AI Mode keeps a question asked twice ("continue", then "continue" again) as two exchanges with their own answers, in order, including while the thread is scrolled and turns are unmounted
- Google's "You said:" label is cut only where the page proves it is one, so a question such as "Python: which library reads TOML?" keeps its "Python:" with or without the label
- Formulas are copied as LaTeX: $…$ inline and a $$ block on its own lines, written verbatim, including a formula that ends the answer
- The Copy Chat button appears on a saved AI Mode thread and on the /ai and /aimode entry points, and no longer on the empty AI Mode home
- An AI Mode thread that cannot be read stops with a sentence naming Google AI Mode and what was missing (no question or answer column, or no answer text), in the popup itself, instead of copying whatever the generic reader found or showing "An error occurred during conversion."
- Copying an ordinary Google search page, or any other page on a Google host that is not an AI Mode thread, converts it as a page again instead of failing with "No AI Mode answer could be extracted from this page"
- A saved thread is cited by its thread id (mtid), never as a search with an empty q=, and the mstk session token is left out of the citation
Changes:

- AGENTS.md describes the reconciled Google AI Mode extractor: the route guard (udm=50 plus q or mtid, /ai and /aimode), the label rule, turns matched on question and answer, formulas as LaTeX, the errors it throws, and what the cited address keeps
- AGENTS.md says how an extractor's own error message reaches the popup (an Error with verbatim: true); the popup otherwise shows the generic failure
Changes:

- Tests: Gemini is read as Gemini, and only Google Search hosts count as AI Mode
- Tests: an AI Mode answer that ends in a numbered list, a bulleted list or a code block keeps all of it, while the disclaimer after it is still dropped
- Expected to fail on this commit, R8: the AI Mode host pattern matches every google.com subdomain and is listed before Gemini, so gemini.google.com, Docs and Gmail all resolve to google-ai
- Expected to fail, R9 (all three): the closing-label trim removes the last item of a short list in the page, and the line trim removes numbered items and every line of a closing code block
Changes:

- Gemini conversations are copied by the Gemini reader again: the AI Mode entry now claims Google Search hosts only, not every google.com subdomain
- Docs, Gmail and other Google products are no longer taken for AI Mode
- An AI Mode answer that ends in a list keeps its last item, and one that ends in a code block or a numbered list keeps all of it; the closing disclaimer is still dropped
Changes:

- Build Validation fails when the Firefox package declares an add-on ID other than the one in extension/manifest.json, or when scripts/build.sh restates the ID
- Expected to fail on this commit alone: scripts/build.sh writes its own copy of the gecko block, ID included
Changes:

- Firefox add-on ID is scrapllm@dekrezz.dev: the add-on is signed under a new AMO account, which cannot sign the old ID
- The Firefox package keeps the gecko block from extension/manifest.json instead of a second copy in scripts/build.sh, so the ID is declared once
# Conflicts:
#	.github/workflows/pr-validation.yml
Changes:

- Popup restructured around the page being copied: a card at the top names the host, the title and the mode (page, chat, Telegram, merged tabs), and the outcome of a copy lands on its foot with the token count
- One heavy key copies the page; Save .md, the opposite scope (Full page or Main content) and Selection are a row of equal keys under it instead of a hidden caret menu
- Links, Images, Tables and Metadata are switches on the card, the same settings as in Formatting, one tap away
- The Telegram limits sit on the card, and several selected tabs are listed by name before they are merged
- The particle halo and its empty field are gone; a spectrum line runs along the card while a copy is being made
- Settings are grouped into Copy, Sites, Research, Interface and About instead of one list in the order features shipped
- The header shows the Unshell mark and name, readable in the dark theme
Changes:

- New Unshell icon: a shell opened at the corner, stroked with the spectrum, its kernel showing, on an ink tile
Changes:

- README, AGENTS.md, REVIEWERS.md, the licence line and the issue templates call the project Unshell, formerly ScrapLLM, at github.com/dekrezz/Unshell
Changes:

- The extension is named Unshell in the browser and the stores
- Packages are Unshell-Chrome, Unshell-Firefox and Unshell-Source, and CI checks and attaches those names
Changes:

- Notes and errors inside copied Markdown say Unshell settings, not ScrapLLM settings
- The developer test pages carry the new name
Changes:

- Test: a research download is named unshell-research-<topic>-<date>.md
- Expected to fail on this commit alone: research.js still names it scrapllm-research-
Changes:

- Downloads are named unshell-…: single pages fall back to unshell.md, merged tabs to unshell-merged-<date>.md, ZIP exports to unshell-export-<date>-<n>tabs.zip, research to unshell-research-<topic>-<date>.md
- Console messages from the popup start with Unshell
Changes:

- AGENTS.md describes the restructured popup: the page card, the mode attribute, the key row, the recipe chips and the settings sections
Changes:

- README opens with screenshots of the popup, light after a copy and dark on a chat
Changes:

- Version 2.4.0
Changes:

- Test: every :root colour token that refers to a token the dark theme overrides is declared on .dark-theme as well
- Expected to fail on this commit alone: --label-primary, --dark-gray, --text-secondary, --light-gray and --setting-hover are declared on :root only
Changes:

- Dark theme: the selected Telegram segment and the hints under settings are light text again, not ink on the dark field
Changes:

- Settings are rows on one card per section: the name on the left, a switch, a segmented choice or a menu on the right, the explanation under the name
- A site's own options (Reddit sort, GitHub tree, YouTube comments, Discord and X limits) open under its row only while that site's mode is on
- Research: Research & download is the heavy ink key and the go arrow in the field steps aside while the plan is up, so there is one way to start instead of two; the plan names DuckDuckGo as where the question goes
- Research result is a card: an MD tile, the file name, its tokens and how many sources made it
- The glow under the sheet's key is gone: it was the field's scroll fade lying over the sheet
Changes:

- Test: the page card's site icon comes from Chrome's favicon cache by page address, from the icon Firefox reports for the tab, and is absent on browser pages and tabs with no icon
- Expected to fail on this commit alone: extension/page-icon.js does not exist yet
Changes:

- The page card shows the site's own icon instead of its initial: in Chrome from the browser's favicon cache, with no request; in Firefox from the icon Firefox reports for the tab
- A browser page, or a tab with no icon, keeps the initial
- Chrome asks for the favicon permission; the Firefox package leaves it out, and the README lists it
Changes:

- README screenshots show the site icon on the page card
Changes:

- Version 2.4.1
Changes:

- Chat: how many exchanges to copy is a row of segments on the page card (1, 3, 5, 10, 25, All) instead of a menu that had more items than the popup had room for and ran under the research bar
- Chat: Copy page is a key beside Save .md
- No native tooltips: buttons no longer carry a title that repeated their label over them; icon-only buttons are named for screen readers instead
Changes:

- Version 2.4.2 (2.4.1 was taken on AMO by an interrupted upload of an earlier build)
@dekrezz dekrezz changed the title Unshell 2.4.0: popup rebuilt around the page, new name and icon Unshell 2.4.2: popup rebuilt around the page, new name and icon Oct 21, 2026
Changes:

- Test: when the browser has no icon for the tab, or its icon will not draw, the icon the page declares is tried next: rel=icon, then apple-touch-icon, then /favicon.ico at the page origin
- Expected to fail on this commit alone: page-icon.js has no candidates() or declaredIcon() yet
Changes:

- The site icon shows up in Firefox when Firefox has no icon for the tab (its favIconUrl is intermittently empty): the popup asks the page which icon it declares, rel=icon, then apple-touch-icon, then /favicon.ico, and tries that next
- An icon that fails to draw falls through to the next one before the tile keeps the initial
Changes:

- The popup no longer slides sideways: dragging the main view or settings left or right is gone, so holding the mouse or selecting text to copy it leaves the window where it is
- Opening and closing settings is a cross-fade in place instead of a slide
Changes:

- Version 2.4.3
@dekrezz dekrezz changed the title Unshell 2.4.2: popup rebuilt around the page, new name and icon Unshell 2.4.3: popup rebuilt around the page, new name and icon Oct 21, 2026
Changes:

- The site icon shows: its tile follows the browser's colour scheme, because the browser hands over the icon variant drawn for its own tab strip (a white ChatGPT logo on a dark system), which vanished on the white tile in both popup themes
- The page card is a plain current-page lockup: the icon, then the title over the address (host and path); the PAGE / CHAT badge is gone, since the key below already says what is copied
- On a chat the card keeps the Links, Images, Tables and Metadata switches beside the exchange limit
Changes:

- Version 2.4.4
@dekrezz
dekrezz merged commit 1a94008 into main Oct 21, 2026
0 of 2 checks passed
Sign up for free to 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