# Address Daily Digest

> Compose and deliver a daily (or weekly) summary of activity at one or more Chia addresses — inflows, outflows, ending balance, USD value at receive time. Use when the user wants a recurring report instead of per-event alerts, or asks for a "daily summary" / "weekly digest" of their wallet. Accepts addresses, period_hours, currency, channel as arguments for programmatic invocation.

- Skill: `spacetime-technology/address-daily-digest` (Agent Skill)
- Install (CLI): `npx skillmds@latest add spacetime-technology/address-daily-digest`
- Raw SKILL.md: https://api.skillmd.com/api/skills/spacetime-technology/address-daily-digest/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: Spacetime-Technology (https://skillmd.com/u/spacetime-technology)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/spacetime-technology/address-daily-digest

---


# Address daily digest

You are composing a recurring summary of one or more Chia addresses — inflows, outflows, ending balance, USD/fiat values — and delivering it through whichever notification channel is installed. Designed to be scheduled once a day or once a week.

This skill follows the conventions in this repo's `SKILLS.md`. Read that if anything below is unclear.

## Required capabilities

- **chia-explorer** (`mcp__chia-explorer__*`) — mandatory.
- **A notification MCP** — pick whichever is installed. Email is the natural fit for digests; if email isn't configured the skill will use a chat channel or fall back to a file at `~/.chia-skills/digests/<date>.md`.

## Resolve inputs

You need: `$addresses`, `$period_hours`, `$currency`, `$channel`.

- `$addresses` — one address or a comma-separated list. Required.
- `$period_hours` — window to summarise. Default `24` (daily). Use `168` for weekly.
- `$currency` — three-letter code for fiat valuation. Default `usd`.
- `$channel` — notification channel, default `auto`.

Resolve: arguments → context → ask user. If `$addresses` missing after asking, emit `STATUS: aborted`, `REASON: missing required inputs`.

Validate each address (`xch1...` or `txch1...`). Drop invalid entries and warn the user inline; continue with the valid ones.

## Load or initialise state

State file: `~/.chia-skills/state/address-daily-digest__<sha1_of_sorted_addresses>.json`.

Shape:

```json
{
  "addresses": ["xch1...", "xch1..."],
  "last_run_iso": "2026-05-18T08:00:00Z",
  "last_run_height": 6532109,
  "currency": "usd",
  "skill_version": "0.1.0"
}
```

On first run: record current peak and now. Send a "digest watch started" confirmation with current balances, no historical events. Don't fabricate a back-dated report.

## Define the window

Window end = current chain peak (and `now` for time).

Window start = `last_run_height` (and `last_run_iso` for time).

If `period_hours` is set and `now - last_run_iso < period_hours - 5 minutes`, this run is early — skip and emit `STATUS: no_change`, `REASON: window not elapsed`. (A 5-minute jitter tolerance for cron drift.)

## Collect activity

For each address:

1. Get all coin records created in the window (received).
2. Get all coin records spent in the window (sent).
3. Classify each (XCH / CAT / NFT / DID) via puzzle-classification tools.
4. Compute ending balance via the balance tool.

For CATs and NFTs, label by `asset_id` / `launcher_id`. Unknown CATs: include the asset_id, mark "unknown CAT".

## Apply fiat values

Fetch current XCH spot price in `$currency` once.

For receive-time valuations (more useful for tax / accounting than current valuation), the skill cannot retroactively look up historical XCH prices — chia-explorer's price tool is spot-only. **Be explicit about this in the message body:** "Fiat values reflect current spot price, not the price at receive time. For tax exports with historical prices, use the `address-tax-export` skill (roadmap)." Don't quietly mislabel.

## Compose the digest

Email-friendly format. Markdown-light, ASCII tables.

```
Chia digest — 2026-05-19 → 2026-05-20 (24h)
Address: xch1yxq...8yl

INFLOWS (3)
  +1.250 XCH     block 6,532,210   ~$62.50
  +500 USDS      block 6,532,210   (CAT)
  +1 NFT         block 6,532,217   launcher 0xabc...

OUTFLOWS (1)
  -0.050 XCH     block 6,532,217   ~$2.50  fee 50,000 mojos

NET: +1.200 XCH (~$60.00)
BALANCE NOW: 12.347 XCH (~$617.35 at $50.00/XCH)

Fiat reflects current spot, not receive-time price.
```

For multi-address digests, repeat the per-address block and add a top-level summary:

```
Across 2 addresses, 24h period:
  Inflows:  3.500 XCH + 500 USDS + 1 NFT
  Outflows: 0.050 XCH
  Net:      +3.450 XCH (~$172.50)
```

## Deliver

Pick channel by priority (email > slack > discord > push > webhook > inline file).

Subject line for email:

> `Chia digest — <date> (<N> addresses, <N> events)`

If sending to a file (no channels available), write to `~/.chia-skills/digests/<iso8601-date>.md`.

## Update state

Set `last_run_iso = now`, `last_run_height = current_peak`. Atomic write.

## Scheduling

Wire to:

- **`schedule` skill / cron** — daily at a fixed time (e.g. 08:00 local). Weekly at the same.
- **Manual** — re-invoke for an ad-hoc summary, but you'll get whatever happened since the last automated run.

## Hard rules

- **Read-only.** Never sign or push.
- **Honest about pricing.** Spot price ≠ receive-time price. Say so.
- **Don't quietly skip invalid addresses.** Tell the user which ones were dropped.
- **First run is a "watch started" note, not a report.**

## Recovery patterns

- **One address fails to query.** Skip it, note the failure in the digest, continue with the rest. Emit `STATUS: partial`.
- **All addresses fail.** Emit `STATUS: failed`, `REASON: all chia-explorer calls failed`.
- **Channel delivery fails.** Save the rendered digest to `~/.chia-skills/digests/`, emit `STATUS: partial`.

## Output

```
STATUS: success | no_change | partial | failed | aborted
ADDRESSES: <comma-separated list>
INFLOWS: <count>
OUTFLOWS: <count>
NET_XCH: <decimal, positive or negative>
BALANCE_XCH: <sum across addresses>
CURRENCY: <code>
CHANNEL: <channel used> | inline | none
ARTIFACT: <absolute path to saved digest file> | none
REASON: <one line, only when STATUS is failed, partial, aborted, or no_change>
```

