Claude Morning banner
narze narze

Claude Morning

Development community

Description

Ping Claude every morning with minimum cost

Installation

This entry records only its repository, not the path inside it, so there is no exact command to give. Open the source below and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

README

claude-morning

A lightweight Docker container that runs Claude Code on a daily schedule to keep your Claude subscription session active.

How it works

  • Runs as a persistent container (24/7) via Docker Compose
  • A cron job fires claude -p "ping" at 8AM daily using Haiku (minimal cost)
  • Auth state is persisted in ./data/ so you only log in once
  • Logs timestamp and cost to stdout on each run

Usage

Option A: Pull from GHCR (recommended)

Create a `docker-compose.yml`:

services:
  claude-morning:
    image: ghcr.io/narze/claude-morning:latest
    volumes:
      - claude-data:/root/.claude
    command: daemon
    environment:
      - CLAUDE_MORNING_CRON_SCHEDULE=0 8 * * *
      - TZ=Asia/Bangkok
    restart: unless-stopped

volumes:
  claude-data:

Then:

docker compose up -d
docker compose exec -it claude-morning claude
# log in from within the TUI

Option B: Build from source

git clone https://github.com/narze/claude-morning
cd claude-morning
docker compose build
docker compose up -d
docker compose exec -it claude-morning claude
# log in from within the TUI

Configuration

Environment variable Default Description
CLAUDE_MORNING_CRON_SCHEDULE 0 8 * * * Cron schedule (comma-separated for multiple, e.g. 0 8 * * *,0 20 * * *)
TZ (none/UTC) Timezone (e.g. Asia/Bangkok)

Examples

Run at 6 AM in Tokyo timezone

environment:
  - CLAUDE_MORNING_CRON_SCHEDULE=0 6 * * *
  - TZ=Asia/Tokyo

Useful commands

# Check cron is configured correctly
docker compose exec claude-morning cat /etc/crontabs/root

# Tail the ping log
docker compose exec claude-morning tail -f /var/log/claude-ping.log

# Run ping manually
docker compose exec claude-morning /scripts/ping.sh

# Run ping with full JSON output
dock