Chrome extension that adds timestamps to ChatGPT messages and conversations — because time matters.
ChatGPT doesn't show when messages were sent or when conversations were created. TimeGPT fixes that by intercepting API responses and displaying timestamps inline in the UI.
- Message timestamps — Shown on hover alongside the action buttons (Copy, Edit, etc.)
- Sidebar timestamps — Creation date displayed below each conversation title
- Configurable format — Relative (5m ago), 24h, 12h, ISO 8601, or time-only
- Toggle visibility — Enable/disable message and sidebar timestamps independently
- Privacy-first — No data leaves your browser. No external requests. No tracking.
-
Clone the repository:
git clone git@github.com:deviationist/timegpt.git cd timegpt -
Install dependencies and build:
npm install npm run build
-
Load in Chrome:
- Navigate to
chrome://extensions - Enable Developer mode (top right)
- Click Load unpacked
- Select the
timegptproject folder
- Navigate to
-
Open ChatGPT and hover over any message to see timestamps.
- Node.js 18+
- npm
| Command | Description |
|---|---|
npm run build |
Compile TypeScript → dist/ via esbuild |
npm run build:debug |
Build with debug logging enabled |
npm run watch |
Rebuild on file changes |
npm run watch:debug |
Watch mode with debug logging |
npm run typecheck |
Run TypeScript type checking (no emit) |
npm run package |
Build and create timegpt.zip for distribution |
timegpt/
├── src/
│ ├── types.ts # Shared type definitions
│ ├── globals.d.ts # Compile-time constants (e.g. __DEBUG__)
│ ├── interceptor.ts # Fetch interceptor (runs in MAIN world)
│ ├── content.ts # DOM manipulation (runs in ISOLATED world)
│ └── popup.ts # Settings popup
├── dist/ # Compiled JS (gitignored, generated by build)
├── icons/ # Extension icons (16, 48, 128px)
├── manifest.json # Chrome extension manifest (MV3)
├── popup.html # Settings popup HTML
├── styles.css # Timestamp styling
├── build.js # esbuild configuration
├── tsconfig.json # TypeScript config (type checking only)
└── logo.svg # Source logo
TimeGPT uses two content scripts injected into chatgpt.com:
-
Interceptor (
MAINworld,document_start) — Monkey-patcheswindow.fetchto capture responses from:/backend-api/conversation/{id}— extractsmessage.create_timefor each message/backend-api/conversations— extractscreate_timefor the sidebar conversation list
-
Content script (
ISOLATEDworld,document_idle) — Receives timestamp data viapostMessage, matches message IDs to DOM elements ([data-message-id]), and injects<time>elements. UsesMutationObserverto handle dynamically loaded content.
Communication between worlds happens via window.postMessage. The interceptor buffers data in case it arrives before the content script loads, and the content script sends a drain request to retrieve buffered data.
Build with --debug to enable [TimeGPT] console messages:
npm run build:debugDebug logs are compiled out entirely in production builds via esbuild's define feature — no runtime cost.
- Edit files in
src/ - Run
npm run watchfor automatic rebuilds - Reload the extension in
chrome://extensions - Hard-refresh ChatGPT (
Cmd+Shift+R/Ctrl+Shift+R)
- No permissions beyond
storage(used to save your format preference) - Scoped to
chatgpt.comonly — won't run on any other site - Read-only — only reads timestamp metadata from API responses, never message content
- No external requests — everything stays in your browser
- No background processes — nothing runs when ChatGPT isn't open
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Make your changes in
src/ - Run
npm run typecheckto verify types - Run
npm run buildto verify the build - Test by loading the unpacked extension and verifying on ChatGPT
- Commit and push your branch
- Open a pull request
ISC