I don’t usually struggle with writing the final paragraph. I struggle with the step before that: deciding what’s actually worth writing about.

Most days I read a lot: incident retrospectives, release notes, architecture posts, LLM experiment threads. The signal is there. It’s just spread across 12 tabs and half a dozen bookmarks I’ll never open again. By the time I sit down to write, the interesting angles are gone.

So I built a pipeline that reads for me, extracts the signal, and hands me structured raw material I can turn into a post in under an hour.

I called it GRIST (Guided Research & Insight Synthesis Tool).


Two commands, on purpose

GRIST does two things and nothing else:

  1. harvest — fetch, filter, analyze, and generate idea structure
  2. compose — pick a structure and generate a first draft

That split is the whole point. Every tool I’ve seen tries to go straight from “input” to “final post.” The output is almost always generic.

The thing nobody talks about is that the bottleneck is knowing which angle to take. Compose before you’ve chosen one and you get average content. Every time.

GRIST forces the separation: harvest first, choose your angle, then compose.


How the pipeline works

In plain English:

  • Fetch RSS sources
  • Run a strict relevance filter (the “Librarian”: rejects hype, listicles, and announcements without technical depth)
  • Enrich selected articles with deeper analysis: thesis, key insights, trade-offs
  • Detect trends across articles
  • Generate Structure Cards with multiple options for insight, take, angle, and hook
  • Compose on demand from a chosen card

Stack is boring on purpose: TypeScript + Node + OpenAI API + markdown/json output. Runs locally with no infra drama.


What the output actually looks like

After npm run harvest, running npm run board gives something like this:

▸ Structure Board
  Loaded 4 cards from latest harvest

[1] The Pulse: Cloudflare takes down half the internet – but shares a great postmortem
    take: Cloudflare's outage teaches a valuable lesson: infrastructure services hold your site hostage...
    insight: Cloudflare's outage affected major services like ChatGPT, Canva, and Spotify...

[2] AI Agent Orchestration is Broken
    take: Running multiple AI agents is like herding cats...
    insight: Context fragmentation disrupts workflow efficiency...

And each structure card in structures.json includes reusable options instead of one rigid answer:

{
  "id": 2,
  "title": "AI Agent Orchestration is Broken",
  "insightOptions": [
    "Context fragmentation breaks continuity when multiple agents are used",
    "Tooling latency compounds when coordination is unclear"
  ],
  "takeOptions": [
    "Most multi-agent stacks fail at context handoff, not model quality",
    "The architecture problem is orchestration, not prompts"
  ],
  "angleOptions": [
    "Operational reliability lens",
    "DX and cognitive load lens"
  ]
}

Each card gives you multiple options for insight, take, angle, and hook. You choose. That judgment is yours to keep.

A rigid “here’s your post” output would remove the part that makes the post worth reading.


Why it’s open source

I use GRIST locally. Which means it has my RSS sources, my context file, my prompt overrides. None of that ships in the public repo.

What does ship:

  • Private local files are git-ignored (context/, sources/, local prompt overrides)
  • Tracked templates (*.example) so setup is fast
  • An init command to bootstrap the local config
  • Contribution, security, and issue templates

Clone it, run npm run init, configure your sources, and you’re running a harvest in under 5 minutes. Tailor the prompts to your own voice. Make the Librarian more or less strict. That’s the point.

Repo: https://github.com/vncsleal/grist


Repo: https://github.com/vncsleal/grist. Open an issue or send a PR if something breaks.