ChatGPT UI Cleaner

Clean up ChatGPT interface by hiding/showing sidebar, header, and other UI elements

Size

5.6 KB

Version

1.0.1

Created

Oct 19, 2025

Updated

4 days ago

1// ==UserScript==
2// @name		ChatGPT UI Cleaner
3// @description		Clean up ChatGPT interface by hiding/showing sidebar, header, and other UI elements
4// @version		1.0.1
5// @match		https://*.chatgpt.com/*
6// @icon		https://cdn.oaistatic.com/assets/favicon-l4nq08hd.svg
7// ==/UserScript==
8(function() {
9    'use strict';
10
11    console.log('ChatGPT UI Cleaner initialized');
12
13    // State management
14    let uiState = {
15        sidebarHidden: false,
16        headerHidden: false,
17        footerHidden: false
18    };
19
20    // Load saved state
21    async function loadState() {
22        const savedState = await GM.getValue('uiCleanerState', null);
23        if (savedState) {
24            uiState = JSON.parse(savedState);
25            console.log('Loaded UI state:', uiState);
26        }
27    }
28
29    // Save state
30    async function saveState() {
31        await GM.setValue('uiCleanerState', JSON.stringify(uiState));
32        console.log('Saved UI state:', uiState);
33    }
34
35    // Apply UI changes
36    function applyUIChanges() {
37        // Hide/show sidebar
38        const sidebar = document.querySelector('div[id="stage-slideover-sidebar"]');
39        if (sidebar) {
40            sidebar.style.display = uiState.sidebarHidden ? 'none' : '';
41        }
42
43        // Hide/show header
44        const header = document.querySelector('header[id="page-header"]');
45        if (header) {
46            header.style.display = uiState.headerHidden ? 'none' : '';
47        }
48
49        // Hide/show footer (profile section)
50        const footer = document.querySelector('div.sticky.bottom-0');
51        if (footer) {
52            footer.style.display = uiState.footerHidden ? 'none' : '';
53        }
54
55        // Adjust main content area when sidebar is hidden
56        const mainContent = document.querySelector('main');
57        if (mainContent && uiState.sidebarHidden) {
58            mainContent.style.marginLeft = '0';
59        } else if (mainContent) {
60            mainContent.style.marginLeft = '';
61        }
62    }
63
64    // Create control panel
65    function createControlPanel() {
66        const panel = document.createElement('div');
67        panel.id = 'ui-cleaner-panel';
68        panel.innerHTML = `
69            <div style="display: flex; flex-direction: column; gap: 8px;">
70                <div style="font-weight: 600; margin-bottom: 4px; color: #fff;">UI Cleaner</div>
71                <label style="display: flex; align-items: center; gap: 8px; cursor: pointer; color: #fff;">
72                    <input type="checkbox" id="toggle-sidebar" ${uiState.sidebarHidden ? 'checked' : ''}>
73                    <span>Hide Sidebar</span>
74                </label>
75                <label style="display: flex; align-items: center; gap: 8px; cursor: pointer; color: #fff;">
76                    <input type="checkbox" id="toggle-header" ${uiState.headerHidden ? 'checked' : ''}>
77                    <span>Hide Header</span>
78                </label>
79                <label style="display: flex; align-items: center; gap: 8px; cursor: pointer; color: #fff;">
80                    <input type="checkbox" id="toggle-footer" ${uiState.footerHidden ? 'checked' : ''}>
81                    <span>Hide Footer</span>
82                </label>
83            </div>
84        `;
85
86        TM_addStyle(`
87            #ui-cleaner-panel {
88                position: fixed;
89                top: 20px;
90                right: 20px;
91                background: rgba(0, 0, 0, 0.85);
92                backdrop-filter: blur(10px);
93                padding: 16px;
94                border-radius: 12px;
95                z-index: 10000;
96                box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
97                font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
98                font-size: 14px;
99                min-width: 200px;
100            }
101
102            #ui-cleaner-panel input[type="checkbox"] {
103                width: 16px;
104                height: 16px;
105                cursor: pointer;
106            }
107
108            #ui-cleaner-panel label:hover {
109                opacity: 0.8;
110            }
111        `);
112
113        document.body.appendChild(panel);
114
115        // Add event listeners
116        document.getElementById('toggle-sidebar').addEventListener('change', async (e) => {
117            uiState.sidebarHidden = e.target.checked;
118            await saveState();
119            applyUIChanges();
120        });
121
122        document.getElementById('toggle-header').addEventListener('change', async (e) => {
123            uiState.headerHidden = e.target.checked;
124            await saveState();
125            applyUIChanges();
126        });
127
128        document.getElementById('toggle-footer').addEventListener('change', async (e) => {
129            uiState.footerHidden = e.target.checked;
130            await saveState();
131            applyUIChanges();
132        });
133
134        console.log('Control panel created');
135    }
136
137    // Observe DOM changes to reapply settings
138    function observeDOM() {
139        const observer = new MutationObserver(() => {
140            applyUIChanges();
141        });
142
143        observer.observe(document.body, {
144            childList: true,
145            subtree: true
146        });
147    }
148
149    // Initialize
150    async function init() {
151        await loadState();
152        
153        // Wait for page to be ready
154        if (document.readyState === 'loading') {
155            document.addEventListener('DOMContentLoaded', () => {
156                setTimeout(() => {
157                    createControlPanel();
158                    applyUIChanges();
159                    observeDOM();
160                }, 1000);
161            });
162        } else {
163            setTimeout(() => {
164                createControlPanel();
165                applyUIChanges();
166                observeDOM();
167            }, 1000);
168        }
169    }
170
171    init();
172})();
ChatGPT UI Cleaner | Robomonkey