FREE CLAUDE CODE SKILL

PVC Timestamp Hook

Claude Code does not know what time it is. It reads the date when the session starts and reasons from there, so a session left open overnight still thinks it is yesterday. This skill installs one small hook that stamps every prompt with the date, weekday, and time.

v1.0.2 Claude Code Apache 2.0 Git Bash or Python
PVC Timestamp Hook skill art: a clock face with a filled orange slice, with an orange dot

One Hook, One Line

Say "add the time hook to this project". The skill writes one hook into the project's local settings. From then on every prompt carries the current time.

01

Stamps Every Prompt

A UserPromptSubmit hook runs the date command before each message and adds one line to the context: [Current time: 2026-09-04 (Friday) 12:03].

02

Merges, Never Overwrites

If the project already has a settings.local.json, the hook is added next to your existing keys and hooks. Nothing else is touched.

03

Runs Once, Stays Once

A second run on the same project finds the hook and changes nothing. No duplicate stamps, no surprise edits, no questions.

04

Stays Out of Git

The settings file is per machine. The skill adds it to .gitignore when the project is a git repo, so the hook never reaches a commit.

Read SKILL.md

The full skill file, v1.0.2, as published. The GitHub repo holds the same file plus README, LICENSE, NOTICE, REQUIREMENTS, and TRADEMARK.

SKILL.md
---
name: pvc-timestamp-hook
description: Installs a timestamp hook into a target project's .claude/settings.local.json so every prompt in that project arrives stamped with the current date, weekday, and time. Use when asked to "add the time hook", "make this project time-aware", "install timestamps in this project", "put the timestamp thing in another folder", or when Claude keeps not knowing the date or how much time passed between messages. Creates or merges the settings file, adds gitignore coverage, verifies the command, and never touches user-level settings or memory hooks. Needs the date command (Git Bash on Windows) or Python 3 as a fallback.
metadata:
  author: pvc
  version: "1.0.2"
license: Apache-2.0
---

<!-- SPDX-License-Identifier: Apache-2.0 -->

# pvc-timestamp-hook

Makes one project time-aware. Installs a UserPromptSubmit hook that echoes the
current date, weekday, and time into context on every message, so Claude knows
when days pass between conversations without a tool call on every message. Time
only: no memory hooks, no background service, one line of context per prompt.

## When to Use

- A project where Claude should know the real time and date on every prompt
- "Add the time hook here" or "make this folder time-aware"
- "Put the timestamp thing in <folder>"
- Claude in some project keeps reasoning from a stale session-start date

The target is one project folder at a time. Default target: the project the
session is opened in. If the request names another folder, use that folder.

## What This Skill Does Not Do

- Does not install memory hooks of any kind (recall or auto-save). Those are a
  separate, deliberate per-project choice you make by hand
- Does not answer "what time is it" (run `date` for that)
- Does not touch user-level `~/.claude/settings.json` or any existing hook
  entries in the target
- Does not change the terminal UI (that is the `showMessageTimestamps` setting)

## Trigger Examples

Should trigger on:

- "Add the time hook to this project"
- "Make my-website time-aware"
- "Install timestamps in my other repo"
- "Claude never knows the date in my other project, fix that one too"

Should NOT trigger on:

- "What time is it?" (a question, not an install)
- "Give this project the memory hooks" (manual memory opt-in, not this skill)
- "Show timestamps on my messages in the terminal" (UI setting, not a hook)

## The Hook

The exact block this skill installs. `"shell": "bash"` is written out so the
hook never runs in PowerShell, where `date` is an alias of Get-Date and rejects
this format; the format prints the weekday because "how many days passed" is
the whole point.

```json
{
  "hooks": {
    "UserPromptSubmit": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "date \"+[Current time: %Y-%m-%d (%A) %H:%M]\"",
            "shell": "bash"
          }
        ]
      }
    ]
  }
}
```

Every prompt then arrives with a line like:

```
[Current time: 2026-07-25 (Saturday) 10:12]
```

## Install Steps

1. Resolve the target project folder. Default: the current session's project
   root. If the request names a different folder, resolve that path and confirm
   it exists before touching anything.
2. Pipe-test the command in bash before installing: `echo '{}' | date "+[Current time: %Y-%m-%d (%A) %H:%M]"`.
   Expect one bracketed line. If `date` is missing (no Git Bash), use the
   Python fallback command from Resilience below.
3. Check `<target>/.claude/settings.local.json`:
   - Missing: create it containing exactly the hook block above (Path A)
   - Exists and already contains the `[Current time:` command string: change
     nothing (Path C)
   - Exists without it: Read it first, then merge. Keep every existing key.
     Append this hook entry to the existing `UserPromptSubmit` array, or add
     the key if absent (Path B)
4. Validate: `python -m json.tool <file>` (or `python3`). Must parse clean. No
   Python on the machine: read the file back and confirm it is valid JSON
   before continuing.
5. Gitignore: if the target is a git repo, make sure its `.gitignore` covers
   `.claude/settings.local.json` (append the line if missing, on its own line,
   with a newline first when the file does not end in one; create `.gitignore`
   with that line if the repo has none). Not a git repo: skip and say so.
6. Verify: Claude Code usually picks the new file up live; the next message
   arrives stamped. If no stamp appears, start a new Claude Code session
   (reload the VS Code window, or quit and relaunch `claude` in a terminal)
   and check again.

## What To Print

Four shapes. Pick exactly one.

Path A, fresh install:

```
Time hook installed in <target>.
- Created .claude/settings.local.json (JSON validated)
- Added .claude/settings.local.json to .gitignore
Send any message; it should arrive stamped [Current time: ...]. No stamp: start a new Claude Code session.
```

Path B, merged into existing settings:

```
Time hook added to <target>'s existing .claude/settings.local.json.
- Existing keys and hooks untouched, JSON validated
- .gitignore covers the file
Send any message; it should arrive stamped [Current time: ...]. No stamp: start a new Claude Code session.
```

Path C, already installed:

```
<target> already has the time hook; nothing changed.
```

Path D, edit blocked by the permission system:

```
The permission system blocked me from editing hook config. Two options:
1. Switch off auto mode (Shift+Tab cycles the permission modes), tell me to continue, and approve my edit
2. Paste this yourself into <target>/.claude/settings.local.json:
<the full hook block>
Then add .claude/settings.local.json to the project's .gitignore.
```

## Resilience

- Existing settings.local.json fails to parse: stop, show the parse error, do
  not overwrite a broken file. You decide whether to fix or replace it
- Permission classifier blocks the write (it often blocks hook-config edits in
  auto mode; a fresh file usually passes, edits sometimes do not): fall back to
  Path D, never work around the block
- `date` not found (machine without Git Bash): swap the command for
  `python -c "from datetime import datetime; print(datetime.now().strftime('[Current time: %Y-%m-%d (%A) %H:%M]'))"`
  and drop the `"shell"` key; pipe-test that instead, and escape the inner
  double quotes when you write it into the JSON `command` value
- Target folder does not exist or has no project in it: stop and ask for the
  right path, do not create folders
- Re-run on a project that already has the hook: Path C, idempotent, never
  duplicate the entry
- Two stamps on every prompt: the hook also sits in `~/.claude/settings.json`
  or the project's `.claude/settings.json`, which Claude Code merges with this
  file. Remove one copy

## Installation

Place this folder at `<repo>/.claude/skills/pvc-timestamp-hook/` in any project
that should be able to install the hook, in itself or in another folder. Claude
Code picks the skill up in the running session; start a new session if it does
not show. Verify by asking "What skills are available?".

Install in 2 Minutes

Nothing to install but the folder itself. On Windows the hook uses Git Bash for the date command. Without it, the skill installs a Python command instead.

01

Get the Folder

Open the GitHub repo. Click Code, then Download ZIP. Unzip it, open the folders until you see SKILL.md, then rename that folder to pvc-timestamp-hook.

02

Put It in Place

Move the folder to your-project/.claude/skills/pvc-timestamp-hook/. For every project on your machine, use ~/.claude/skills/ instead.

03

Start a New Session

Open Claude Code in that project. Ask "what skills are available?" and check that pvc-timestamp-hook shows up on the list.

04

Say the Words

Type "add the time hook to this project". The skill writes the hook, checks the JSON, and covers the file in .gitignore. Your next message arrives stamped.

Let Claude Install It

Paste this into any Claude Code session. Claude fetches the folder from GitHub and puts it in place.

install-prompt.txt
Install the pvc-timestamp-hook skill for me.

Source: https://github.com/pro-vibe-coding/pvc-timestamp-hook
Target: .claude/skills/pvc-timestamp-hook/ inside this project.
Make the folders if they do not exist.

Steps:
1. Clone the repo into a temp folder with git. If git is missing,
   download the ZIP from the repo page and unzip it instead.
2. Copy these six files from the repo root into the target:
   SKILL.md, README.md, LICENSE, NOTICE, REQUIREMENTS.md, TRADEMARK.md
3. Do not change any file. Keep LICENSE and NOTICE.
4. Delete the temp folder. Show me the full path of the installed folder.

Then tell me to start a new session and say "add the time hook to this project".

Before You Run It

Four things people ask before they add it.

01

One Line Per Prompt

The stamp costs one short line of context per message. No memory hooks, no background service, no tool call each time you ask what day it is.

02

Local Settings Only

The hook goes into .claude/settings.local.json in that one project. It never touches your user-level settings or any hook you already have.

03

Open Source

Apache 2.0. Use it, change it, share it. Keep the LICENSE and NOTICE files. The names Pro Vibe Coding and PVC stay trademarks.

04

Follows GitHub

Version 1.0.2 is the main branch on GitHub right now. The video shows v1.0.1. This site updates when the repo moves.

Want More Free Skills?

Join the Pro Vibe Coding community. Members get every skill first, with updates as they happen, and build real projects together.