SLOPSHOPPER

prompt-timestamp

Prefixes every prompt you type with the local date and time, visible to you and Claude.

newprompt
A shopper browsing a rack in a slop shop
README

prompt-timestamp

A Claude Code mod that puts the local date and time (month-day, hour:minute) at the front of every prompt you type:

> [10-02 14:03 EDT] fix the bug

The timestamp is part of the prompt text, so it shows in the transcript and Claude reads it too.

What gets stamped

Only prompts a person sent: typed at the terminal, or sent through Remote Control. Background task notifications, scheduled /loop prompts, other plugins, and peer sessions are left alone.

Prerequisites

Claude Code 2.1.287 or later (mods support).

Install

claude plugin marketplace add Vibe-Commit/claude-context-mods
claude plugin install prompt-timestamp@claude-context-mods

To try a local checkout instead: claude --plugin-dir ./prompt-timestamp.

Develop

claude plugin validate ./prompt-timestamp
claude plugin test ./prompt-timestamp

.claude-plugin/types/ is written by Claude Code when the mod loads and is git-ignored. Once it exists, tsc -p ./prompt-timestamp type-checks the mod.

Source 1 files
hooks/register.ts 33 lines
1import type { Register } from 'claude-code'
2
3// Only stamp prompts a person typed: the terminal, or Remote Control.
4const HUMAN_ORIGINS = new Set(['composer', 'bridge'])
5
6export const register: Register = on => {
7  on('prompt.submit', async ($, e, next) => {
8    if (!HUMAN_ORIGINS.has(e.origin.kind) || e.text.trim() === '') {
9      return next(e)
10    }
11
12    const stamp = formatStamp(await $.clock.now())
13
14    return next({ ...e, text: `[${stamp}] ${e.text}` })
15  })
16}
17
18// "10-02 14:03 EDT" in the machine's local time zone.
19export function formatStamp(ms: number): string {
20  const parts = new Intl.DateTimeFormat('en-US', {
21    month: '2-digit',
22    day: '2-digit',
23    hour: '2-digit',
24    minute: '2-digit',
25    hourCycle: 'h23',
26    timeZoneName: 'short',
27  }).formatToParts(new Date(ms))
28  const get = (type: Intl.DateTimeFormatPartTypes) =>
29    parts.find(p => p.type === type)?.value ?? ''
30
31  return `${get('month')}-${get('day')} ${get('hour')}:${get('minute')} ${get('timeZoneName')}`
32}
33