Custom Source Scripts
Kitpicks lets you add a custom source by providing an ingestion binary — a small executable that generates Markdown. The binary is registered with the reservoir and run periodically so its output appears in your feed alongside regular RSS sources.
Security warning
Your ingestion binary will be run periodically and autonomously with access to your machine. Only drop binaries you trust. Do not install binaries from untrusted sources.
How it works
In the Add Source screen, switch to the
Custom script tab and drop your executable. Kitpicks
registers it with the reservoir, creates a source for it, and
the reservoir runs it on its fetch schedule. Every Markdown file
the binary writes to its outs/ directory becomes a
content item.
If the script's name collides with an existing custom source, the Add Source screen flags the conflict and links you to edit the existing source instead of creating a duplicate.
Updating a script
To update an existing custom source's binary, open its Edit Source screen and re-drop the new executable. The updated binary replaces the script in place, so the source keeps its name and continues to be fetched on the same schedule.
The executable contract
- The binary must be executable (the executable bit is set).
-
It is launched from a fresh temporary directory containing an
outs/folder. -
The
RES_CHANNEL_IDenvironment variable is set to the channel id. -
Extra fetch parameters are passed as
key=valueCLI arguments. -
Write one
.mdfile per item intoouts/. Optional supplementary files go in a same-named subdirectory.
Frontmatter requirements
Each Markdown file's frontmatter should include a
pubDate so the item becomes a Kitpicks entry. A
url is optional — when omitted, the entry links to
the item's own Markdown file (as a file:// link).
The title frontmatter property (or the first
# Heading in the body) is used as the entry title.
Example
A minimal Node script that writes one Markdown file to
outs/:
#!/usr/bin/env node
import { writeFileSync, mkdirSync } from "node:fs";
import { join } from "node:path";
mkdirSync("outs", { recursive: true });
const item = `---
url: https://example.com/weather/2026-09-02
pubDate: 2026-09-02T12:00:00Z
title: Today's Weather
---
Sunny with a high of 72°F.
`;
writeFileSync(join("outs", "weather.md"), item);
See the working example at
res/examples/weather-fetcher.mjs
in the repository.
Agents authoring ingestion binaries can also fetch the guide at skills.md.