Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: CI

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
test-and-package:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v7
- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: 22
- name: Run behavior smoke tests
run: node test/logic-smoke.mjs
- name: Validate repository and store assets
run: node scripts/validate-project.mjs
- name: Build extension package
run: bash scripts/package.sh
- name: Validate clean extension package
run: node scripts/validate-package.mjs
- name: Upload inspected package
uses: actions/upload-artifact@v4
with:
name: gpt-delagger-${{ github.sha }}
path: |
dist/*.zip
dist/*.sha256
if-no-files-found: error
retention-days: 14
45 changes: 45 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Release

on:
push:
tags:
- 'v*'

permissions:
contents: write

jobs:
package-and-release:
runs-on: ubuntu-latest
steps:
- name: Check out tagged source
uses: actions/checkout@v7
- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: 22
- name: Verify tag matches manifest version
shell: bash
run: |
manifest_version="$(node -p "require('./manifest.json').version")"
test "${GITHUB_REF_NAME}" = "v${manifest_version}" || {
echo "Tag ${GITHUB_REF_NAME} does not match manifest v${manifest_version}" >&2
exit 1
}
- name: Run release gates
run: |
node test/logic-smoke.mjs
node scripts/validate-project.mjs
bash scripts/package.sh
node scripts/validate-package.mjs
- name: Publish GitHub release assets
env:
GH_TOKEN: ${{ github.token }}
run: |
version="$(node -p "require('./manifest.json').version")"
gh release create "${GITHUB_REF_NAME}" \
"dist/gpt-delagger-v${version}.zip" \
"dist/gpt-delagger-v${version}.zip.sha256" \
--verify-tag \
--generate-notes \
--title "GPT Delagger ${GITHUB_REF_NAME}"
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

All notable changes to GPT Delagger are documented here.

## [1.6.1] - 2026-07-26

### Added

- A public product and privacy site suitable for GitHub Pages.
- A complete Chrome Web Store listing kit with current screenshots and promotional tiles.
- Automated CI and deterministic, checksum-backed release packaging.

### Changed

- The manifest now links to the public product site and uses a more precise description.
- Installation guidance treats Developer mode as a fallback while the store submission is pending.

[1.6.1]: https://github.com/throwingogo-hub/chatgpt-delagger/releases/tag/v1.6.1

## [1.6.0] - 2026-07-17

### Fixed
Expand Down
25 changes: 25 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Privacy policy

Effective 26 July 2026 for GPT Delagger v1.6.1.

GPT Delagger processes ChatGPT page structure locally so it can hide selected interface elements. It does not record, retain, transmit, sell, or share conversation content or browsing activity. The public version of this policy is available at [throwingogo-hub.github.io/chatgpt-delagger/privacy.html](https://throwingogo-hub.github.io/chatgpt-delagger/privacy.html).

## What the extension accesses

GPT Delagger runs only on `chatgpt.com` and the legacy `chat.openai.com` hostname. On those pages, it examines the page's document structure and visible interface markers to identify old conversation turns, tool-call embeds, and elements selected through Zap mode. This processing occurs entirely in the browser.

## What the extension stores

The Chrome `storage` permission saves and syncs only feature toggles, the number of recent turns to keep visible, and custom CSS selectors authored through Zap mode. The extension does not store prompts, responses, account information, page URLs, or conversation content.

## Collection, transmission, and sharing

GPT Delagger has no analytics, advertising, tracking, telemetry, external API calls, or remote code. It sends no data to the developer or third parties. No user data is sold or shared.

Uninstalling the extension removes its local settings; Chrome may sync settings through the browser profile according to the user's Chrome Sync configuration.

## Contact and limited use

For privacy questions, open an issue without personal information. Report sensitive security issues through [GitHub private vulnerability reporting](https://github.com/throwingogo-hub/chatgpt-delagger/security/advisories/new).

GPT Delagger's use of information is limited to its disclosed, user-facing single purpose. It does not use or transfer information for advertising, creditworthiness, lending, or any unrelated purpose.
18 changes: 14 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
<img src="https://img.shields.io/badge/dependencies-0-2ea44f" alt="Zero dependencies">
</p>
<p>
<a href="#install-in-60-seconds">Install</a> ·
<a href="https://throwingogo-hub.github.io/chatgpt-delagger/">Website</a> ·
<a href="#install-from-github-manual">Install</a> ·
<a href="#what-it-does">Features</a> ·
<a href="#privacy-by-design">Privacy</a> ·
<a href="#development">Contribute</a>
Expand All @@ -21,6 +22,10 @@

![GPT Delagger — long ChatGPT threads without the drag, with the extension control panel](docs/images/hero.png)

<p align="center">
<a href="https://throwingogo-hub.github.io/chatgpt-delagger/"><strong>See how it works →</strong></a>
</p>

> [!IMPORTANT]
> GPT Delagger is an independent, unofficial project. It is not affiliated with or endorsed by OpenAI.

Expand Down Expand Up @@ -57,11 +62,14 @@ That is 111 old turns plus the tool embeds hidden — about **83% fewer elements
> [!NOTE]
> Measured with `test/mock.html` on v1.6.0, counting elements inside a hidden subtree. This fixture demonstrates how much the browser stops rendering; it is not an FPS or latency claim, and hidden elements still occupy memory.

## Install in 60 seconds
## Install from GitHub (manual)

> [!NOTE]
> A Chrome Web Store listing is being prepared but is not published yet. Until it is live, installation requires Chrome or Edge's Developer mode. This manual route is intended for people who are comfortable loading an unpacked extension.

### From a GitHub release

1. Download the latest `gpt-delagger-v*.zip` from [Releases](https://github.com/throwingogo-hub/chatgpt-delagger/releases/latest).
1. Download the latest `gpt-delagger-v*.zip` from [Releases](https://github.com/throwingogo-hub/chatgpt-delagger/releases/latest). You can compare it with the accompanying `.sha256` file.
2. Extract the ZIP to a permanent folder.
3. Open `chrome://extensions` (or `edge://extensions`).
4. Enable **Developer mode**.
Expand Down Expand Up @@ -139,9 +147,11 @@ test/logic-smoke.mjs Zero-dependency regression checks

Contributions are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md), especially if you can provide a minimal DOM fixture for a ChatGPT markup change.

Release tags are packaged automatically. CI runs the zero-dependency smoke suite and checks that the published ZIP contains only the extension runtime files.

## Support the project

If GPT Delagger makes a long conversation usable again, please **star the repository**. Stars help other people discover it. Bug reports, detector fixtures, and small focused pull requests are equally valuable.
If GPT Delagger makes a long conversation usable again, please [**star the repository**](https://github.com/throwingogo-hub/chatgpt-delagger). Stars help other people find it. Bug reports, detector fixtures, and small focused pull requests are equally valuable.

## License

Expand Down
4 changes: 2 additions & 2 deletions content.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
'use strict';

const IS_EXT = typeof chrome !== 'undefined' && !!(chrome.storage && chrome.storage.sync);
const EXT_VERSION = '1.6.0';
const EXT_VERSION = '1.6.1';

const DEFAULTS = {
enabled: true,
Expand Down Expand Up @@ -200,7 +200,7 @@
// ---------------------------------------------------------- keep-newest embed
// With "keep newest tool embed" on, the most recent blocked embed group is
// restored and flagged with data-gptdelag-keep; every older embed stays
// detached. When a newer embed appears, the flag moves to it in the same
// hidden. When a newer embed appears, the flag moves to it in the same
// synchronous pass, so old and new swap before the next paint.
// The flagged elements are tracked here as well as in the attribute. The
// observer pass below runs on every mutation batch, including every streamed
Expand Down
Empty file added docs/.nojekyll
Empty file.
Binary file modified docs/images/hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/icon128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/popup-control-panel.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/social-preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
142 changes: 142 additions & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="GPT Delagger is a privacy-first Chrome extension that hides old ChatGPT turns and heavy tool embeds to reduce browser rendering work in long conversations.">
<meta name="theme-color" content="#0d0f12">
<meta property="og:type" content="website">
<meta property="og:title" content="GPT Delagger — long ChatGPT threads, less rendering work">
<meta property="og:description" content="Reversible chat trimming, tool-embed blocking, and lightweight rendering. Local-only, zero telemetry, storage permission only.">
<meta property="og:url" content="https://throwingogo-hub.github.io/chatgpt-delagger/">
<meta property="og:image" content="https://throwingogo-hub.github.io/chatgpt-delagger/images/social-preview.png">
<meta name="twitter:card" content="summary_large_image">
<title>GPT Delagger — long ChatGPT threads, less rendering work</title>
<link rel="icon" href="images/icon128.png">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
<header class="site-header">
<a class="brand" href="#top" aria-label="GPT Delagger home">
<img src="images/icon128.png" alt="" width="38" height="38">
<span>gpt delagger<span class="signal">.</span></span>
</a>
<nav aria-label="Primary navigation">
<a href="#results">Results</a>
<a href="#privacy">Privacy</a>
<a href="#install">Install</a>
<a href="https://github.com/throwingogo-hub/chatgpt-delagger">GitHub ↗</a>
</nav>
</header>

<main id="main">
<section class="hero" id="top">
<div class="hero-copy">
<p class="eyebrow"><span></span> Chrome extension · Manifest V3</p>
<h1>Keep the conversation.<br><em>Drop the rendering drag.</em></h1>
<p class="lede">GPT Delagger hides older ChatGPT turns and heavy tool UI from layout and paint—without deleting messages or taking React-owned nodes out of the page.</p>
<div class="actions">
<a class="button primary" href="https://github.com/throwingogo-hub/chatgpt-delagger/releases/latest">Download latest release</a>
<a class="button secondary" href="#install">Manual install guide</a>
</div>
<p class="store-status"><span aria-hidden="true"></span><strong>Chrome Web Store:</strong> listing prepared, not published yet</p>
</div>

<div class="instrument" aria-label="GPT Delagger control panel preview">
<div class="instrument-label">live control panel</div>
<img src="images/popup-control-panel.png" alt="GPT Delagger popup showing rendering, trimming, tool-embed, and Zap controls" width="336" height="620">
<div class="readout"><span>scope</span><strong>chatgpt.com only</strong></div>
</div>
</section>

<section class="proof-strip" aria-label="Project qualities">
<div><span>01</span><strong>reversible</strong><small>Drop an attribute to restore hidden UI</small></div>
<div><span>02</span><strong>local-only</strong><small>No analytics or network requests</small></div>
<div><span>03</span><strong>minimal access</strong><small>Chrome storage permission only</small></div>
<div><span>04</span><strong>zero dependencies</strong><small>No remote code or runtime packages</small></div>
</section>

<section class="section results" id="results">
<div class="section-heading">
<p class="eyebrow"><span></span> Measured, not marketed</p>
<h2>Less page to paint.<br>Nothing deleted.</h2>
<p>The included offline fixture has 141 turns. With default settings, GPT Delagger hides 111 older turns plus tool UI, so 693 of 835 thread elements leave layout and paint while staying in the DOM.</p>
</div>
<div class="meter-card">
<div class="meter-top">
<span>fixture elements rendered</span>
<span>v1.6.1</span>
</div>
<div class="number"><strong>142</strong><span>/ 835</span></div>
<div class="meter" aria-label="142 of 835 fixture elements rendered"><span></span></div>
<div class="legend"><span><i class="visible"></i>142 rendered</span><span><i></i>693 hidden</span></div>
<p>This is a controlled rendering-work measurement, not an FPS, latency, memory, or performance guarantee. React still owns and reconciles every node.</p>
</div>
</section>

<section class="section features" id="features">
<article>
<p>TRIM / 01</p>
<h3>Old turns wait behind “show more.”</h3>
<p>Choose how many recent turns stay visible, then reveal older batches or the entire thread at any time.</p>
</article>
<article>
<p>BLOCK / 02</p>
<h3>Heavy tool UI stays out of paint.</h3>
<p>Hide known MCP apps, connector cards, run-status UI, failure fallbacks, and image-generation loading frames.</p>
</article>
<article>
<p>ZAP / 03</p>
<h3>Target the UI the detector misses.</h3>
<p>Point at a stubborn element, widen or narrow the selection, and save a conservative custom hide rule.</p>
</article>
<article>
<p>LIGHT / 04</p>
<h3>Skip off-screen rendering work.</h3>
<p>Use content visibility, remove transitions, and optionally disable backdrop blur on weaker GPUs.</p>
</article>
</section>

<section class="section privacy" id="privacy">
<div class="privacy-copy">
<p class="eyebrow"><span></span> Privacy boundary</p>
<h2>Your conversation stays in your browser.</h2>
<p>The extension inspects ChatGPT’s page structure locally to decide which interface elements to hide. It does not record, retain, transmit, sell, or share conversation content.</p>
<a href="privacy.html">Read the full privacy policy →</a>
</div>
<div class="permission-card">
<div class="permission-head"><span>manifest.json</span><span>access review</span></div>
<code><span>"permissions"</span>: [<strong>"storage"</strong>]</code>
<p>Used only to sync toggles, the trim count, and user-authored custom hide selectors through Chrome.</p>
<hr>
<code><span>"matches"</span>: [<strong>"chatgpt.com/*"</strong>]</code>
<p>The content script runs on ChatGPT only. The legacy chat.openai.com hostname is retained for compatibility.</p>
</div>
</section>

<section class="section install" id="install">
<div class="section-heading">
<p class="eyebrow"><span></span> Manual fallback</p>
<h2>Install from a versioned GitHub release.</h2>
<p>The Chrome Web Store route is not live yet. Today’s install uses Developer mode and is best suited to people comfortable loading unpacked extensions.</p>
</div>
<ol class="steps">
<li><span>01</span><div><strong>Download</strong><p>Get the latest release ZIP and its SHA-256 file.</p></div></li>
<li><span>02</span><div><strong>Extract</strong><p>Unzip it into a permanent folder; Chrome loads that folder directly.</p></div></li>
<li><span>03</span><div><strong>Open extensions</strong><p>Visit <code>chrome://extensions</code> or <code>edge://extensions</code>.</p></div></li>
<li><span>04</span><div><strong>Load unpacked</strong><p>Enable Developer mode, choose Load unpacked, and select the extracted folder.</p></div></li>
</ol>
<div class="actions bottom-actions">
<a class="button primary" href="https://github.com/throwingogo-hub/chatgpt-delagger/releases/latest">Open releases</a>
<a class="button secondary" href="https://github.com/throwingogo-hub/chatgpt-delagger">Star on GitHub</a>
</div>
</section>
</main>

<footer>
<p>GPT Delagger is independent and unofficial. It is not affiliated with or endorsed by OpenAI.</p>
<div><a href="privacy.html">Privacy</a><a href="https://github.com/throwingogo-hub/chatgpt-delagger/issues">Support</a><a href="https://github.com/throwingogo-hub/chatgpt-delagger/blob/main/LICENSE">MIT License</a></div>
</footer>
</body>
</html>
Loading
Loading