Brad runs DeAI News, and like any editor he sometimes just wants to know what his own desk has been putting out. Not a search, not an archive dive — just "pls catch me up," typed at 4 p.m. on a Thursday, over whatever window happens to matter.

deai-news-digest is that catch-up. It pulls DeAI News headlines from the Distro feed for a window you name (or the last seven days if you don't), optionally narrowed to a topic, and lays them out as a numbered list of clickable links with dates and deks. Then it stops and waits. From there you pick: click a headline to open it in your browser, ask for the raw story text, or type a number and get the full story saved as an artifact you can read in the side panel.

The point is the browse-then-drill rhythm. It does not pre-fetch every body, does not summarize the whole week at you, and never publishes or edits anything. It is a read-only newsroom "what've we got" pass.

v2 folds in the weekly. Once the digest has actually been useful — after it hands you a story, not before — it offers once to make itself recurring. Say yes and it creates a scheduled task that produces a finished brief on its own and reaches you by push and email. The offer is gated on there not already being a task, so a daily user never sees it twice, and a scheduled run knows it fired into an empty room and skips both the menu and the offer. One install, both behaviors.

What you'll need

  • The Distro Reader or Distro Publisher MCP connected, for distro_feed_latest, distro_story_read, and distro_story_render_hud.
  • A client that can publish artifacts (Claude Cowork or Claude Desktop) if you want the side-panel reading option. Without it, the skill still lists headlines and hands you raw text.
  • A client with scheduled tasks (Claude Cowork), if you want the weekly. Optional — the on-demand digest works without it.

What it does

  • Windows the feed for you. Anchors off the real current date, honors relative windows ("last 14 days", "since Monday") and absolute ones ("Aug 1 through Aug 15"), and defaults to a rolling seven days.
  • Takes a topic filter in the same breath. "Catch me up on the last two weeks of DeAI payments news" parses into both a window and a filter without a follow-up question.
  • Links every headline to its real canonical URL. Never reconstructs a URL from a slug; a story with no URL is shown as plain text rather than a broken link.
  • Keeps podcast episodes out of the numbered list. The newest DeAI News Journal episode gets its own unnumbered block underneath, so typing a number always means a story.
  • Three ways in, offered the same way every time. Browser link, raw text, or a saved artifact rendered in the canonical DistroVerse article style.
  • Handles the artifact gotchas. Delegates the render to a subagent so tens of thousands of tokens of base64 stay out of the conversation, and repads malformed base64 that Python accepts and browsers reject.
  • Offers the weekly once, at the right moment. After a delivered story, gated on list_triggers showing no existing task. If you decline, it never asks again.
  • Speaks your timezone, not Central and not UTC. Three timezones are in play when scheduling; you only ever see one. A user in Berlin reads "Thursdays at 6:30 p.m." and never learns the other two numbers exist.
  • Uses durable scheduling. The Claude Code Remote trigger tools, never the in-process cron tools that die with the session and leave a task that silently never fires.
  • Knows when nobody is watching. A scheduled run produces the brief and stops — no menu, no offer, no question asked of an empty room.

Install the skill

Ask Claude:

"Please fetch the deai-news-digest skill from Distro Skills and give me a .skill file I can install."

Claude will pull this story, extract the SKILL.md from the fenced block below, and package it as deai-news-digest.skill. The file will appear in your chat with a Save skill button — click it to install directly. That registers the skill with your Claude app so it shows up in your skills list and triggers on matching requests.

Requires the Distro Reader or Distro Publisher MCP connected so Claude can pull the story.

Claude Code users: you have a direct path — ask Claude to drop the unzipped folder into ~/.claude/skills/deai-news-digest/ and restart the session. No packaging step needed.

No Distro MCP connected? Copy the SKILL.md contents from the fenced block below into a file called SKILL.md inside a folder called deai-news-digest, zip it (folder as zip root), and upload through Settings → Capabilities → Skills → Upload skill.

Using it

On demand, any time:

"pls catch me up on DeAI News"

Narrowed:

"show me DeAI headlines from the last two weeks on agent payments"

And if you want it to stop being something you ask for:

"set up my weekly DeAI News brief"

It proposes Thursdays at 11:30 a.m. Central, stated in your own timezone, and any day or time you name overrides it. Later, "move my DeAI weekly to Fridays at 9" edits the task in place and keeps its run history.

The skill source

This is the canonical SKILL.md:

---
name: deai-news-digest
description: >-
  Use whenever someone wants to browse, catch up on, or search recent DeAI News
  headlines — an interactive, pick-a-number reading session over the DeAI News
  publication on Distro — and also to set up, change, or run a recurring weekly
  DeAI News brief. Triggers on "Get me latest from DeAI News", "DeAI News latest
  headlines", "DeAI News digest please", "pls catch me up on DeAI News", "what's
  new on DeAI News", "show me DeAI headlines from the last two weeks", "any DeAI
  News on x402 / agent payments lately", "set up my weekly DeAI News brief",
  "schedule the DeAI digest", "move my DeAI weekly to Fridays at 9", "stop the
  DeAI News weekly", or any request pairing DeAI News with a catch-up, digest,
  latest-headlines, headline-search, or recurring-delivery goal — even without
  the word "digest" or "skill." Also the skill a scheduled DeAI News task
  invokes when it fires. Defaults to the last 7 days but accepts any window and
  an optional topic filter. Do NOT use for publishing or editing DeAI News
  stories (Distro Publisher tools), for summarizing a single supplied URL
  (deai-news-summary), or for rendering one already-fetched story in the side
  panel (distro-story-viewer).
---

# DeAI News Digest

## What this does and why

DeAI News is a Distro publication tracking decentralized AI. This skill is how
you read it: pull recent headlines, present them as clickable links, and give
the reader three ways into any one of them — open it in the browser, get the raw
text, or save it as an artifact to read in the side panel. It's an interactive
loop, not a one-shot dump. The point is to browse, then drill in.

Think of it as a fast newsroom "what've we got" pass. Keep it snappy: fetch,
list, let them pick, deliver, repeat.

It also does the same job on a timer. Once someone likes the digest, the obvious
next want is to stop having to ask for it, so this skill can set itself up as a
recurring weekly task and produce the brief when that task fires.

## Mode detection — do this first

Three modes. Work out which one you're in before anything else:

- **Run mode** — a scheduled task has fired and its stored prompt brought you
  here. **Nobody is present.** Produce the brief and stop. Jump to *Run mode*
  below and ignore everything about menus and offers.
- **Scheduling mode** — a person is asking you to create, change, pause or
  cancel the recurring task ("set up my weekly", "move it to Fridays", "stop the
  DeAI weekly"). Go to *Scheduling*.
- **Interactive mode** — anything else. A person wants to read. This is the
  default and the rest of this section describes it.

The distinction that matters most: run mode has no human ahead of you. Printing
a pick-a-number menu, or asking whether they'd like to schedule this, into an
empty room is the single worst failure this skill can have. If you arrived via a
task firing, you are in run mode. Behave accordingly.

## Interactive mode

### The window and the topic filter

Two inputs shape the search, and both have sensible defaults so a bare "catch me
up on DeAI News" just works:

- **Window** — how far back to look. Default to a **rolling 7 days ending now**
  when the user doesn't say. Honor whatever they do say, relative ("last 14
  days", "past month", "since Monday") or absolute ("Aug 1 through Aug 15"). Always
  anchor relative windows off the *actual current date/time*, which you determine
  first — never assume it.
- **Topic filter** — optional. If the user names a topic ("about x402", "agent
  payments", "anything on Bittensor"), include only stories relevant to it,
  matching on headline and description. If they don't, include every story in the
  window. Don't over-filter: when in doubt about relevance, keep the story and let
  the reader decide.

If the user's phrasing bundles both ("catch me up on the last two weeks of DeAI
payments news"), parse both out of the one sentence — don't stop to ask.

### Step 1 — Fetch headlines

First determine the current date/time (e.g. via a shell `date` call) so the
window is anchored correctly. Then pull DeAI News headlines using the Distro
tools. DeAI News's slug is `deai-news` (publication id `109`). Load the Distro
tools via ToolSearch first if they're deferred (search keyword `distro`), then
call `distro_feed_latest` with `publication: "deai-news"` and a generous `limit`
(e.g. 50) so the whole window is covered. If the Distro feed tool genuinely
isn't available, fall back to fetching the DeAI News site
(https://deainews.com) — but the MCP feed is strongly preferred because it
returns clean, structured data including each story's canonical `url`.

Filter the returned stories to the window: keep only those whose `publishedAt`
falls inside it. If a topic filter is in play, further limit to matching stories.
For each surviving story, capture its real canonical `url` (the `url` field the
feed returns, e.g. `https://deainews.com/<slug>`) — you'll link the headline to
it in the next step.

**Split podcast episodes out of the story list.** Every story object carries an
`episode` field: `null` for a regular story, an object for a podcast episode
(see Step 5b). Episodes never appear in the numbered story list — drop any story
where `episode` is not null from that list. Separately, take the **newest**
episode across the whole fetched feed (not just the window) and hold it aside;
it gets its own section in Step 2. Because the latest episode may predate the
window, do not window-filter it — the feed's newest episode is always the one to
show.

The feed can be large. A tiny bit of code to parse and window the JSON (rather
than eyeballing 50 stories) is the reliable move — filter by the ISO
`publishedAt` timestamp against your computed window bounds.

### Step 2 — Present them

Open with a header line naming the window, then a horizontal rule, then the
stories, then a closing horizontal rule. The header reads exactly:

> Here is the DeAI News Digest for the period [DATES GO HERE]

replacing the bracketed placeholder with the actual window in readable form
(e.g. "Aug 20–27, 2026"). Never leave the literal brackets in the output.

Show every story in the window as a numbered list, **newest first**, with a blank
line between items. The headline **must** be a clickable Markdown link to that
story's canonical URL. Note that clicking such a link opens the story in the
reader's **external browser**, not in Cowork's side panel — the link is there for
convenience and for copying, and the saved reading page comes from typing a
number (Step 5). Never tell them a click will open it in the side panel.
Use exactly this shape:

```
Here is the DeAI News Digest for the period Aug 20–27, 2026

***

1) [Headline](https://deainews.com/<slug>)
Date
Description

2) [Headline](https://deainews.com/<slug>)
Date
Description

***

LATEST PODCAST EPISODE

***

[Episode title](https://deainews.com/<episode-slug>)
Date
Description

***
```

The numbered list holds regular stories only. After its closing horizontal rule,
add the `LATEST PODCAST EPISODE` header, another horizontal rule, then the
newest DeAI News Journal episode in the same three-line shape as a story —
clickable Markdown headline linked to its canonical URL, then the publish date,
then the one-line description — but **unnumbered**, since it is not part of the
numbered pick-a-number list. Close with a final horizontal rule, and only then
move to the sign-off block in Step 3.

If the feed holds no episode at all, omit the whole `LATEST PODCAST EPISODE`
block rather than printing an empty header.

Rules that keep this trustworthy:

- Use the story's **real** headline as the link text and its **exact** canonical
  URL as the target. Never invent, guess, or "reconstruct" a URL from the slug —
  use only the URL the feed returned. If a story somehow has no URL, present its
  headline as plain text rather than a broken link.
- Use the real publish date (a readable form like "Aug 11, 2026" is fine) and a
  one-line description/dek — the feed's `preview` field is ideal.
- If **zero** stories match, say so plainly and state the window and topic you
  searched, so the reader knows it was a real empty result and not a glitch.
  Offer to widen the window. Still show the `LATEST PODCAST EPISODE` block
  underneath if the feed has an episode.
- Never number the episode or fold it into the story list — typing a number in
  Step 5 always refers to a numbered story, never the episode. If they want the
  episode as an artifact or as raw text, they'll ask for it by name, and Step 5b
  handles it.

### Step 3 — Offer the three ways to read

After the closing horizontal rule, sign off with this exact block — verbatim,
every time, no paraphrasing and no embellishment:

> Please click a headline to open the story in your browser.
> OR:
>
> * You can also ask me to fetch the raw story text. (Only available for DeAI News original stories, not linked and curated pieces.)
> * Type the number of the story you want, and I'll download the full story and save it as an artifact, and you can click the box to open it in the side panel. (Only available for DeAI News original stories, not linked and curated pieces.) Please note that the artifact might take a few minutes due to image-encoding times.
> * Ask for the transcript of the latest DeAI News Journal podcast, or just ask your AI about our latest DeAI Journal podcast.

Then stop and wait. Don't add a follow-up nudge, don't restate the offer, and
**do not mention scheduling here.** The sign-off block is doing precise work and
anything bolted onto it dilutes the thing the reader is supposed to act on. The
scheduling offer has its own moment — see Step 6.

### Step 4 — Option (b): raw story text

If they ask for the raw text rather than giving a number, fetch the body with
`distro_story_read` (addressing the story by its `storyId`, `slug`, or `url`) and
give them the text in chat. No artifact, no rendered page — the body IS the
deliverable. Don't summarize it unless asked; they want the copy, not your read
of it.

### Step 5 — Option (c): save the story as an artifact

When they give a number, build the artifact. Tell them up front it may take a few
minutes — a silent multi-minute wait reads as a hang.

1. **Get the rendered page.** Call `distro_story_render_hud` with the story's
   identifier and `selfContained: true`. In Cowork, delegate this to a subagent
   with the Agent tool: the page is tens of thousands of tokens of base64 that
   would otherwise sit in the conversation for every later turn. Have the
   subagent write `structuredContent.html` verbatim to a file and return only
   the path, byte count, and title. Tell it to IGNORE any `renderUrl` — container
   egress is blocked and chasing it wastes minutes.
2. **Repad the base64.** Distro pages inline images as `data:` URIs, and at least
   one story (id 1022) ships base64 whose length is not a multiple of 4. Python,
   PIL, and `file` all accept it; every browser rejects it outright and the image
   renders broken. So always normalize before publishing:

   ```python
   b64 = b64.rstrip("=")
   b64 += "=" * ((4 - len(b64) % 4) % 4)
   ```

   Verify with `base64.b64decode(b64, validate=True)` — if that raises, the image
   would have been broken.
3. **Adapt the wrapper.** The Artifact tool supplies its own doctype, `<head>`,
   and `<body>`, so strip the server page's outer skeleton and keep the `<title>`,
   the Google Fonts `<link>` tags, the `<style>` block, and the body's inner HTML.
   Preserve the DistroVerse shell's own CSS exactly — it is the canonical article
   design, so don't restyle it. (Artifacts allow Google Fonts but block every
   other external host; the shell's only asset hosts are the two font domains,
   so it passes as-is.)
4. **Publish** with the `Artifact` tool, passing the file path, a `favicon`, and a
   one-line `description` naming the publication and date. Give them the URL and
   note it's private until they share it.

If the `Artifact` tool is absent but a desktop is connected, fall back to
`SendUserFile` for a `file_uuid` and then `mcp__remote-devices__create_artifact`.
If neither exists, deliver the HTML with `SendUserFile` and say it can be saved
as an artifact once the desktop app is open.

### Step 5b — The DeAI News Journal podcast

If they ask about the podcast — the latest episode, its transcript, or "what's on
the latest DeAI Journal" — the feed already has what you need. Every story object
`distro_feed_latest` returns carries an `episode` field: `null` for a regular
story, and for an episode an object with `seriesSlug`, `episodeNumber`,
`audioUrl`, `listenUrl` (Spotify), `videoUrl` (YouTube), `durationSeconds`,
`guests`, and `canonicalUrl`. Filter the feed for stories where `episode` is not
null and take the newest; the series slug is `deai-journal`.

Give them the episode title, number, publish date, runtime, and guests, plus the
listen/watch links from that block — don't guess links that aren't there. For the
transcript, the episode page body is the transcript: fetch it with
`distro_story_read` and hand them the text (Step 4), or build the artifact from
it (Step 5) if they'd rather read it in the side panel. If the window you
searched holds no episode, widen the fetch before telling them there isn't one.

### Step 6 — Offer the weekly, once

**After** you have delivered a story — raw text or artifact, i.e. once the skill
has actually proven useful — you may offer to make this recurring. Not before;
an offer attached to the first headline list is a pitch, an offer after a
satisfying drill-in is a convenience.

Gate it on two conditions, both required:

1. **No task already exists.** Call `list_triggers` and look for a DeAI News task
   (match on a name like "DeAI News Weekly"). If one is there, say nothing about
   scheduling, now or ever in this session. This gate is the whole reason the
   offer isn't annoying — a daily user should never see it twice.
2. **You haven't offered yet this session.** One line, once. If they don't take
   it, drop it and never raise it again in this session.

The offer is a single line, appended after the delivered story:

> Want this every week? I can set it up so it arrives without you asking.

If they say yes, go to *Scheduling*. If they say no, or say nothing about it and
just ask for another story, continue the loop and never mention it again.

### Step 7 — Loop

Ask which story they'd like next, then loop back to Step 4, 5, or 5b depending on
whether they want raw text, an artifact, or the podcast. Continue until they say
they're done. If they ask to change the window or topic mid-session ("now show me
last month's Bittensor stories"), just re-run from Step 1 with the new
parameters.

## Scheduling

### The default schedule

**Thursdays at 11:30 a.m. U.S. Central.** Propose it rather than asking an open
question. The user can change the day, the time, or both, and you honor whatever
they say without argument.

**Always state the time in the user's own timezone, never in Central and never
in UTC.** Three timezones are in play and the user should only ever see one of
them: Central is the *policy* default, UTC is the *storage* format cron
requires, and their local time is the only one you say out loud. Determine their
timezone first (the session environment usually states it; a shell `date` call
confirms the offset), convert, and confirm locally — a user in New York reads
"Thursdays at 12:30 p.m.", one in Berlin reads "6:30 p.m." Telling someone
"11:30 Central" and making them do the arithmetic is the failure mode this rule
exists to prevent. If they're already in Central, say Central and move on. If you
genuinely cannot determine their timezone, say you're using 11:30 a.m. Central
and ask what timezone they're in.

### Creating the task

Scheduled tasks are created with the **Claude Code Remote MCP** trigger tools —
`create_trigger`, `list_triggers`, `update_trigger`, `delete_trigger`. Load them
via ToolSearch if deferred. Never use the local cron tools (`CronCreate` and
friends): those run an in-process scheduler that dies with the session, so the
task would silently never fire — the worst possible failure for a weekly, since
nothing visibly breaks and the user just quietly stops getting briefs.

Cron expressions are evaluated in **UTC**, so convert. 11:30 a.m. Central is
16:30 UTC during daylight time (mid-March to early November) and 17:30 UTC
during standard time. Compute it from the offset actually in effect when you
create the task — do not assume one. A Thursday default in daylight time is:

```
30 16 * * 4
```

Day-of-week is 0–6 with Sunday as 0. If converting to UTC pushes the time past
midnight, shift the day field too — 11:30 p.m. Central Thursday is 04:30 UTC
**Friday**, so `30 4 * * 5`, not `30 4 * * 4`.

Call `create_trigger` with:

- `name`: something the user will recognize in their task list — "DeAI News Weekly"
- `cron_expression`: the UTC expression you computed
- `initiation`: `human_request`
- `notifications`: `{push: true, email: true}` — this is how the brief actually
  reaches them (see Delivery below)
- `prompt`: a **complete standalone instruction**, because every firing starts a
  fresh session with no memory of this conversation. Use:

  > Run the deai-news-digest skill in run mode. Fetch the last 7 days of DeAI
  > News stories from the Distro feed and produce the finished weekly brief. Do
  > not offer an interactive menu and do not offer to schedule anything — nobody
  > is watching. If the skill is not available, fetch the feed with the Distro
  > tools (publication slug `deai-news`) and produce the brief from the
  > instructions there.

Do **not** set `requires_local_device` — this task needs only the Distro MCP and
runs fine in the cloud.

### Delivery

The brief reaches the user through the task's own completion notification: push
to their phone, email to the address on their Claude account. There is nothing
to configure and no recipient to ask for, which is what makes this work for
anyone who installs the skill. It's also why `notifications` is set explicitly at
creation rather than left to the server default.

Two things worth saying once, at setup:

- The email arrives from Claude's notification system to their account email. It
  is not a newsletter from DeAI News and cannot be pointed at a colleague or a
  list.
- The run also leaves a full session they can open if they want to drill into a
  story, since the brief itself is one-way.

If they want the brief emailed from their own address, to a list, or formatted as
a real newsletter, that's the Gmail connector rather than the task notification —
a different setup, and worth naming as an option rather than silently doing the
smaller thing.

### Changing or cancelling

Find the task with `list_triggers` (match on the name), then:

- **New day or time** → `update_trigger` with a recomputed UTC `cron_expression`.
  Keep the same task so its run history survives; do not delete and recreate.
- **Pause** → `update_trigger` with `enabled: false`.
- **Cancel** → `delete_trigger`.

Confirm the change back in the user's local time, same as at setup.

### Daylight saving

A cron expression is fixed in UTC, so a task created in daylight time drifts an
hour when the clocks change — 11:30 Central becomes 10:30 Central in November.
Mention this once at setup in a single sentence, and offer to shift it when it
happens. Do not build machinery for it.

## Run mode

Nobody is watching. Produce the brief and stop.

### Step 1 — Fetch and window

Determine the current date and time first (a shell `date` call), then load the
Distro tools via ToolSearch if deferred (keyword `distro`) and call
`distro_feed_latest` with `publication: "deai-news"` and `limit: 50`.

Keep stories whose `publishedAt` falls in the **last 7 days ending now**. Parse
and filter the JSON with a few lines of code rather than eyeballing 50 entries.

Drop stories whose `episode` field is not null from the list. Separately, hold
aside the newest episode across the whole fetched feed — not just the window —
since the latest episode may predate it.

### Step 2 — Write the brief

Open with the header line, then the stories newest first, then the podcast block:

```
DeAI News Weekly — Aug 24–31, 2026

***

1) [Headline](https://deainews.com/<slug>)
Date
Description

2) [Headline](https://deainews.com/<slug>)
Date
Description

***

LATEST PODCAST EPISODE

***

[Episode title](https://deainews.com/<episode-slug>)
Date
Description

***
```

Then a single closing line naming the story count and the window — "7 stories,
Aug 24–31" — and nothing else.

**No interactive menu and no scheduling offer.** Do not offer to fetch raw text,
do not invite anyone to type a number, do not ask what they want next, and do
not ask whether they'd like to schedule this — the task that fired you already
is the schedule. Those are interactive-mode endings and they are noise here.

Rules that keep this trustworthy:

- Use each story's **real** headline as link text and its **exact** canonical
  `url` from the feed as the target. Never reconstruct a URL from a slug. A story
  with no URL is shown as plain text rather than a broken link.
- Use the real publish date and the feed's `preview` field as the dek.
- If the feed holds no episode at all, omit the whole podcast block rather than
  printing an empty header.
- **A quiet week is a real result.** If zero stories fall in the window, say so
  plainly, name the window, and still show the podcast block. Do not widen the
  window to manufacture content, and do not skip the run.
- Do not summarize, rank, or editorialize across the stories. The deks are the
  summary. A weekly brief that adds a paragraph of your own analysis is a
  different product than the one the user signed up for.

### Step 3 — Stop

End the run. Do not schedule follow-ups, do not fetch story bodies, do not
publish anything.

## Notes

- **Interactive and scheduled runs don't interfere.** Both re-read the feed live
  and both default to a rolling 7 days. Someone can run the digest on Tuesday and
  still get their Thursday brief; neither consumes anything from the other.
- **Stay interactive in interactive mode.** The value is the browse-then-drill
  rhythm. Present the list and stop; don't pre-fetch every story body or
  summarize them all unprompted — that's slow and not what was asked for.
- **This is read-only.** This skill never publishes, edits, or files anything on
  Distro. If the user pivots to "write this up" or "post this," that's a
  different skill (deai-news-summary, distro-link-post, etc.) — hand off, don't
  improvise.
- **One publication.** Scoped to DeAI News (slug `deai-news`, publication id
  `109`). The same flow works for another Distro publication with a swapped slug,
  but that's a deliberate change, not something to infer.

When to use

  • You want to see what DeAI News has published lately, over any window.
  • You want to search DeAI News headlines by topic — x402, agent payments, Bittensor, compute markets.
  • You want to read one of those stories in the side panel, or get its raw text.
  • You want the latest DeAI News Journal episode, its links, or its transcript.
  • You want DeAI News arriving on a schedule instead of being asked for, or you want to change the schedule you already set.

When not to use

  • Publishing or editing a DeAI News story — that's the Distro Publisher tools.
  • Summarizing a single URL you already have — use deai-news-summary.
  • Rendering one already-fetched story in the side panel — use distro-story-viewer.
  • A different Distro publication — the same flow works with a swapped slug, but confirm which publication first.

Feedback

This is v2 — the weekly, previously a separate deai-news-weekly skill, is folded in. Edge cases or suggestions → reply or ping Bradley Keoun.