Timestamps
Timestamps, beurtduur en tijdrapporten voor Claude Code en Codex.
Een lang transcript toont niet hoeveel tijd elke beurt of elk commando kostte. Deze plugin maakt de gemeten tijden beschikbaar in timestamps, sessierapporten en modelcontext.
- Bash
- Claude Code
- Codex
- hooks
- jq
GitHub (opent in een nieuw tabblad)README (opent in een nieuw tabblad)Changelog (opent in een nieuw tabblad)
Op deze paginaFunctionaliteit
Functionaliteit
Timestamps zet de tijd en de duur van een beurt bij assistant-berichten in Claude Code. Hooks leggen de tijden vast en geven de agent in Claude Code en Codex meldingen op basis van die metingen. Codex toont geen timestamp bij het bericht.
Een echte Claude Code-sessie, op ware snelheid afgespeeld, opgenomen met de screenshot-tooling van het project zelf.

Twee snelle beurten worden gedimd weergegeven. De derde overschreed de drempel voor trage beurten, dus krijgt de duur een kleur en, met TOOL_TIMING aan, de naam van de tool die de beurt zo lang maakte.
In Claude Code krijgt elk assistant-bericht een timestamp zoals [13:22:13] in je eigen tijdzone, gevolgd door de duur van de beurt, zoals +2m14s, gemeten vanaf het indienen van de prompt tot het afronden van de beurt.
Bij een beurt die een ingestelde drempel overschrijdt, krijgt de duur een andere kleur, zodat je de vertraging beter ziet. Staat TOOL_TIMING aan, dan noemt de timestamp er ook bij welke tool de beurt zo lang maakte: [13:22:13 +2m14s · Bash 1m58s]. Een gat tussen twee berichten krijgt een eigen label, zodat een sessie die je de volgende ochtend hervat nog steeds op volgorde staat, en het eerste bericht na middernacht krijgt de datum erbij.
In beide clients voegen hooks gemeten tijdmeldingen toe aan de modelcontext: prompttijd, lange beurten, trage commando’s, tijd sinds de vorige sessie en de tijdlijn na een compaction. Vastgelegde commandoduren vormen een referentie per project. Meestal trage commando’s staan bij sessiestart in de context.
Bij het sluiten van een sessie volgt een samenvatting:
Session lasted 1h30m over 12 turns, 24m18s of it waiting, 35m00s away.
slowest tools: Bash 41.2s (18 calls), WebFetch 8.1s (1 call), Read 2.0s (37 calls). 2 failedWachten en weg overlappen nooit, dus samen komen ze nooit boven de duur van de sessie uit. De tweede regel verschijnt als TOOL_TIMING aanstaat.
codex exec toont deze samenvatting niet bij het afsluiten. Met HISTORY=on komen de totalen in de sessiegeschiedenis terecht en kun je ze met setup.sh --stats teruglezen.
De zichtbare timestamp is alleen voor de weergave. De timestamp wordt getekend terwijl berichten worden weergegeven, komt nooit in het transcript terecht en bereikt het model nooit. De tijdmeldingen komen apart in de modelcontext terecht als korte system reminders.
Snel starten
Vereist jq en bash, verder niets. Ontbreekt jq, dan meldt de plugin dat één keer en doet daarna niets meer.
In Claude Code:
claude plugin marketplace add https://github.com/AraneaDev/aranea-marketplace
claude plugin install timestamps@araneaIn Codex:
codex plugin marketplace add AraneaDev/timestamps
codex plugin add timestamps@araneaTot 0.0.38 heette de plugin Claude Timestamp (claude-timestamp). Claude Code reserveert namen die met claude- beginnen voor de eigen plugins van Anthropic. Staat de oude nog geïnstalleerd, verwijder die dan eerst met claude plugin uninstall claude-timestamp@aranea, anders verschijnt elke timestamp twee keer. Instellingen en geschiedenis blijven behouden. Het instellingencommando heet nu /timestamps:configure.
Hooks worden bij de start van een sessie geregistreerd, dus de plugin werkt pas in een nieuwe sessie. Codex vraagt je daarnaast één keer de hooks van de plugin te bekijken en te vertrouwen; tot je dat doet, wordt er niets vastgelegd.
De standaardconfiguratie werkt zonder aanpassingen. De melding bij de eerste sessie vermeldt waar je instellingen kunt wijzigen.
Ondersteuning per client
Wat werkt, hangt af van de client die de plugin draait, niet van het model.
| Onderdeel | Claude Code | Codex |
|---|---|---|
| Timestamp, label bij een pauze en kleur bij een trage beurt | ✓ | ✗ |
| Meldingen voor de agent over prompttijd, beurtduur en trage tool calls | ✓ | ✓ |
| Melding bij het hervatten en na een compaction | ✓ | ✓ |
| Commandogeheugen en de melding over trage commando's | ✓ | ✓ |
Tijdlijn van de beurten, sessiegeschiedenis en --stats | ✓ | ✓ |
time-awareness-skill | ✓ | ✓ |
/timestamps:configure-commando | ✓ | ✗ |
Codex heeft geen event om op een bericht te tekenen, dus daar verschijnt geen timestamp, en Codex meet tool calls in hele seconden. De volledige tabel staat in de README.
Voorbeelden

Een vraag over de sessieduur activeert de meegeleverde skill en het sessierapport. Het antwoord gebruikt de gemeten waarden.
Tijdmeldingen in modelcontext
Elke melding is een korte system reminder die een feit noemt en verder niets. Het advies staat op één plek, in de meegeleverde time-awareness-skill, die de agent laadt zodra er een melding binnenkomt of zodra je een vraag over tijd stelt.
| Wanneer | Wat de agent leest |
|---|---|
| Bij elke prompt | Message sent at local time 10:37:21 CEST, after a 3h break |
| Een beurt passeert 15 minuten, en daarna elke 15 minuten | Turn running 15m02s (prompt sent 10:37:21); now 10:52:23 CEST. |
| Eén tool call duurt een minuut of langer | That Bash call took 6m10s (usually 4m02s). |
| Een sessie start na een pauze van een uur of meer | Previous session in this project ended 14h ago (Thu 20:12:05). |
| Na een compaction | Conversation compacted. Session started 09:12:05 (3h04m ago), 41 turns so far, 1h02m of it waiting. |
| Een sessie start in een project met trage commando's | Usually slow in this project: bash tests/run.sh ~4m02s (12 runs). |
De skill maakt van elk daarvan een handeling: na een lange periode het werk weer naast de vraag leggen, een commando dat meestal minuten duurt op de achtergrond draaien, op CI wachten zo lang als CI echt duurt in plaats van elke minuut te kijken, en na een pauze de branch opnieuw controleren. INJECT_CONTEXT=false zet alle meldingen uit en laat de zichtbare timestamp staan.
Een melding kan de agent alleen bereiken als er een hook draait, dus de melding over de duur van de beurt wacht op het volgende resultaat van een tool call. Eén commando van 31 minuten levert één melding op als het klaar is, niet één na 15 minuten en nog een na 30.
Vastgelegde tijdgegevens
De sessietijdlijn bevat de starttijd en duur van elke beurt. Met TOOL_TIMING aan staat ook de langstlopende tool erbij. Commandoduren worden per project opgeslagen onder een korte key zoals npm test of bash tests/run.sh. Die key bestaat uit het programma en hooguit twee gewone argumenten: nooit de volledige commandoregel, tekst tussen aanhalingstekens, een flag, een URL, een host of een pad buiten het project, en nooit wat echo of printf afdrukken.
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --turns
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --commandsBeide nemen ook --json aan; dat is wat de agent leest. COMMAND_MEMORY=off zet het commandogeheugen stil, en wie ~/.claude/claude-timestamp-commands.tsv verwijdert, begint met een leeg geheugen.
Instellen
/timestamps:configure toont wat je nu hebt en biedt een handvol presets aan, elk met een voorbeeld van de resulterende timestamp.

Het commando neemt een verzoek ook direct over, dus /timestamps:configure tokyo, /timestamps:configure no colour en /timestamps:configure 12 hour clock zijn elk in één stap klaar. Wijzigingen gelden vanaf je volgende bericht, want elke hook leest het instellingenbestand bij elke call opnieuw. Alleen het installeren zelf vraagt een nieuwe sessie, want dan worden de hooks geregistreerd. In Codex doen de meegeleverde timestamps-skill en het setupscript hieronder hetzelfde.
Hier draait geen shellscript voor. /timestamps:configure leest schema.json, dat met de plugin meekomt en elke instelling beschrijft, en bewerkt je configuratiebestand rechtstreeks.
Hoe de timestamp eruitziet
MARKER bepaalt waar de timestamp uit bestaat en in welke volgorde. De onderdelen zijn %time, %elapsed, %tool en %date, en een groep tussen accolades verdwijnt zodra elk onderdeel erin leeg is. Zo houdt een beurt zonder duur geen losse haakjes over:
MARKER= levert op
[{%date }%time{ %elapsed}{ · %tool}] [13:22:13 +2m14s · Bash 1m58s]
%time 13:22:13
%time{ %elapsed} 13:22:13 +2m14s
%time{ → %elapsed} 13:22:13 → +2m14sZelf een sjabloon schrijven is optioneel. /timestamps:configure ondersteunt benoemde formaten, en /timestamps:configure no brackets en /timestamps:configure just the clock zetten allebei de bijbehorende MARKER.

De tijd, de duur en de tool krijgen elk hun eigen kleur met TIME_COLOR, ELAPSED_COLOR en TOOL_COLOR. Laat je er een leeg, dan volgt dat onderdeel COLOR. Een trage beurt blijft SLOW_COLOR gebruiken: die wint van ELAPSED_COLOR zodra de beurt over SLOW_AFTER gaat, want die instelling is bedoeld om vertraging zichtbaar te maken.
Vanuit een terminal
Wil je de vragen liever zelf beantwoorden, gebruik dan de interactieve wizard van het setup-script. Deze wizard vereist een echte TTY. Voer het script daarom rechtstreeks in een terminal uit.
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh"
Elke vraag toont de huidige waarde tussen haakjes. Enter behoudt die waarde. De kleurenlijst en de resultaatregel worden getekend door dezelfde code die de echte timestamp tekent, dus een voorbeeld kan niet gaan afwijken van wat je straks ziet.
Het script accepteert ook flags, zodat je meerdere instellingen in één call kunt zetten:
setup.sh --tz=Asia/Tokyo --display=short --color=dim --slow-after=30Elke flag is optioneel. Weggelaten instellingen behouden de huidige waarde.
Instellingen per project
Een project kan eigen instellingen bevatten in .claude/claude-timestamp.conf, als laag over die van jou. Alleen de keys die het noemt worden overschreven, dus een repository kan één ding vastzetten en de rest jouw configuratie laten volgen:
cd een-project
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --project --tz=UTCDat schrijft alleen TZ=UTC. De rest komt nog steeds uit je eigen configuratie. Het bestand wordt gevonden door omhoog te lopen vanaf de map waar het gesprek over gaat, dus het werkt ook vanuit submappen, en het zoeken stopt bij je home-map zodat je eigen configuratie nooit voor een projectconfiguratie wordt aangezien.
Sessietotalen
Vraag in de chat naar sessieduur of wachttijd. Het antwoord gebruikt de totalen uit ~/.claude/claude-timestamp-history.tsv; een terminalcommando is niet nodig.
Voor een overzicht in de terminal draai je het script:
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --session
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --stats
Elke afgeronde sessie wordt aan het geschiedenisbestand toegevoegd, en de oudste vallen af zodra er meer dan HISTORY_LIMIT in staan.
Een regel is vijf getallen en een datum. Dat vertelt hoe lang een sessie duurde en hoeveel daarvan wachttijd was, maar nooit wat de inhoud was. PROJECTS=on legt vast bij welk project een sessie hoorde, TOOL_TIMING=on wat elke tool kostte, en daarmee splitst het overzicht de totalen uit:
by project
timestamps 18h02m 28 sessions
ratio 9h15m 14 sessions
(unnamed) 3h55m 5 sessions
slowest tools
Bash 6h20m (1204 calls)
WebFetch 41m ( 88 calls)Sessies van voor je PROJECTS aanzette tellen gewoon mee, gebundeld onder (unnamed). Twee opties versmallen het overzicht, op datum en op project:
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --stats --since=7d
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --stats --project=timestampsHet bestand bevat alleen tijden: geen berichttekst, geen tool-argumenten en geen paden. Met PROJECTS=on staat de mapnaam van het project erin, nooit het pad erboven, en ook niet de naam van je home-map als je een sessie daarvandaan draait. Met TOOL_TIMING=on staat erin welke tools hoe lang duurden. Allebei staan ze standaard uit, en met HISTORY=off gaat het vastleggen helemaal uit.
Problemen oplossen
Een vraag over ontbrekende timestamps activeert een controle van het feitenbestand en de configuratie tegen schema.json. Het antwoord vermeldt de gevonden instellingen en beperkingen. De meest voorkomende oorzaak is ENABLED=off, makkelijk te zetten en te vergeten omdat het elke hook stilzet zonder spoor op het scherm.
Voor een controle in de terminal draai je doctor:
bash "$CLAUDE_PLUGIN_ROOT/hooks/scripts/setup.sh" --doctor
Die controleert of jq aanwezig is, of de configuratie te lezen is, of een vastgepinde tijdzone op deze machine echt toegepast kan worden en of de state-map beschrijfbaar is, en eindigt met een foutcode als daar iets van misgaat. De controle rapporteert ook of het commandogeheugen beschrijfbaar is en wanneer deze client voor het laatst een timestamp tekende; 'nooit' is normaal tot er een bericht is weergegeven. De uitvoer vermeldt ook of ENABLED aanstaat: de plugin bewust uitzetten is op zichzelf geen probleem, dus die regel alleen laat de controle niet falen, maar het is meestal wel waarom je doctor draaide.
Hoe het werkt
Elke hook schrijft een kleine state-update en stopt zonder de sessie te blokkeren. Drie hooks voegen tijdmeldingen toe aan de modelcontext als aan de ingestelde voorwaarden is voldaan. INJECT_CONTEXT=false schakelt die meldingen uit. De overige gegevens blijven in de clientharness en gebruiken geen modelcontext.
| Hook | Taak |
|---|---|
SessionStart | Controleert jq, ruimt oude state op, voegt context toe over een hervat project, een compaction of trage commando’s |
UserPromptSubmit | Opent de beurt, voegt de lokale tijd toe aan de modelcontext |
MessageDisplay | Tekent de timestamp op de eerste batch van elk bericht (alleen Claude Code) |
PreToolUse | Alleen Codex: noteert wanneer een call begon, omdat Codex geen duur meestuurt |
PostToolUse / PostToolUseFailure | Leggen de call vast, voegen context over trage calls of lange beurten toe en registreren commandoduren |
Stop | Sluit de beurt af en voegt de duur toe aan de tijdlijn, in beide clients |
StopFailure / Interrupt | Claude Code legt een API-fout vast als error; Codex legt een onderbroken beurt vast als interrupted |
SessionEnd | Rapporteert de samenvatting, legt de sessie vast, ruimt het commandogeheugen en de state op |
De duur van een beurt komt van Stop, niet van een gok op basis van welke berichten voorbijkwamen. Dat is het verschil tussen 'het laatste bericht is getekend' en 'Claude is klaar'.
MessageDisplay wordt herhaaldelijk aangeroepen terwijl een bericht binnenstroomt. Alleen de eerste batch krijgt een timestamp; de rest geeft niets terug, wat Claude Code leest als 'toon de originele tekst'. De tekst ongewijzigd teruggeven zou bij elke batch van elk bericht onnodig werk zijn.
Timing-state staat in $TMPDIR/claude-timestamp-<jouw uid>, een paar kleine bestanden per sessie, opgeruimd zodra de sessie eindigt en na zeven dagen sowieso. De uid staat in de naam omdat $TMPDIR op een machine met meerdere gebruikers gedeeld terrein is: de map wordt privé aangemaakt, en een map die aan iemand anders toebehoort wordt geweigerd in plaats van beschreven.
Configuratie
Instellingen staan in ~/.claude/claude-timestamp.conf als KEY=value, getoetst aan een lijst bekende keys en nooit uitgevoerd, dus een verdwaalde regel erin kan niets laten draaien. Beide clients lezen hetzelfde bestand.
| Instelling | Standaard | Wat het doet |
|---|---|---|
ENABLED | on | Hoofdschakelaar; off zet elke hook stil zonder te deïnstalleren |
TZ | machine-lokaal | IANA-naam zoals Europe/Amsterdam, of leeg voor lokale tijd |
DISPLAY_FORMAT | 24h | 24h, short, 12h, iso, of een willekeurige strftime-string |
CONTEXT_FORMAT | 24h | Dezelfde waarden, voor tijdmeldingen in de modelcontext |
COLOR | dim | none, dim, gray, red, green, yellow, blue, magenta, cyan |
MARKER | [{%date }%time{ %elapsed}{ · %tool}] | De opbouw, uit %time, %elapsed, %tool en %date |
TIME_COLOR | leeg | Kleur van %time en %date; leeg volgt COLOR |
ELAPSED_COLOR | leeg | Kleur van %elapsed; SLOW_COLOR wint bij een trage beurt |
TOOL_COLOR | leeg | Kleur van %tool; leeg volgt COLOR |
ELAPSED | on | Toont hoe lang de beurt duurde |
INJECT_CONTEXT | true | Voegt de lokale tijd van elke prompt toe aan de modelcontext; false zet ook alle andere meldingen uit |
HEARTBEAT_AFTER | 900 | Voegt de verstreken beurtduur toe aan de modelcontext, bij het eerste resultaat van een tool call na elke periode; 0 schakelt het uit |
SLOW_TOOL_AFTER | 60 | Voegt context toe wanneer een tool call minstens dit aantal seconden duurt; 0 schakelt het uit |
RESUME_NOTE | on | Voegt de tijd sinds de vorige sessie toe en na een compaction de tijdlijn |
COMMAND_MEMORY | on | Registreert commandoduren per project, en noemt de trage bij de start van een sessie |
SLOW_AFTER | 60 | Kleurt de duur voorbij dit aantal seconden, 0 schakelt het uit |
SLOW_COLOR | yellow | Kleur voor een trage beurt |
IDLE_AFTER | 3600 | Markeert een gat van deze lengte tussen berichten, 0 schakelt het uit |
DATE_ROLLOVER | on | Toont de datum op het eerste bericht na middernacht |
SUMMARY | on | Rapporteert sessietotalen bij het afsluiten |
SUBAGENTS | on | Voorziet ook berichten van subagents van een timestamp, en voegt meldingen over trage calls toe aan subagentcontext |
TOOL_TIMING | off | Timet losse tool calls en noemt de traagste |
HISTORY | on | Legt elke afgeronde sessie vast, voor /timestamps:configure en --stats |
HISTORY_LIMIT | 200 | Hoeveel opgenomen sessies bewaard blijven |
PROJECTS | off | Noteert het project bij elke sessie; de mapnaam, nooit een pad |
NO_COLOR schakelt kleur uit, wat COLOR ook zegt.
Een waarde die de plugin niet kan gebruiken, wordt vervangen door de standaard, en dat gebeurt niet stilzwijgend: de vervanging staat bij de volgende sessiestart en in de uitvoer van --doctor.
De klokformaten leveren 14:03:22 op voor 24h, 14:03 voor short, 2:03 PM voor 12h en 2026-08-19T14:03:22 voor iso. Elke waarde met een % erin wordt als strftime-string behandeld, dus de ontsnappingsroute heeft geen eigen instelling nodig.
Vier instellingen kosten iets per tool call in plaats van één keer per bericht: TOOL_TIMING, HEARTBEAT_AFTER, SLOW_TOOL_AFTER en COMMAND_MEMORY, een paar milliseconden per call zolang er één aanstaat. Staan ze alle vier uit, dan stopt de tool-hook voordat gegevens worden gelezen.
Naast de configuratie schrijft de plugin bij elke sessiestart ~/.claude/claude-timestamp.facts.json. Daarin staat wat je niet uit de configuratie kunt afleiden: of deze machine een tijdzone-database heeft, of de state-map beschrijfbaar is, en welke versie er geïnstalleerd staat. Daarmee kan /timestamps:configure vragen over je installatie beantwoorden zonder iets uit te voeren.
Platformnotities
Getest op Linux, macOS en Windows bij elke push, en op macOS ook onder de bash 3.2 die daar nog standaard meekomt. Git Bash op Windows heeft geen tijdzone-database: date valt daar zonder melding terug op UTC voor elke IANA-naam die niet oplosbaar is. De plugin herkent dit, gebruikt in plaats daarvan lokale tijd, meldt het één keer bij de start van de sessie, en voorkomt dat een niet-ondersteunde zone in de configuratie wordt opgeslagen. UTC en GMT werken nog wel, want die hebben geen database nodig.
In Claude Code timet de plugin tool calls niet zelf: Claude Code meldt hoe lang elke call duurde en de hook leest dat getal af. Codex stuurt geen duur mee, dus daar meet de plugin van het begin tot het eind van de call, in hele seconden.