🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

cryyer

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

cryyer

Centralized beta tester update system — automated weekly emails with per-product voice powered by LLM drafts

latest
Source
npmnpm
Version
0.1.14
Version published
Maintainers
1
Created
Source

Cryyer

Cryyer

CI Status npm version MIT License Node.js >= 20

Automated weekly email updates for beta testers, with per-product voice powered by LLM-drafted content.

Website: cryyer.dev GitHub: atriumn/cryyer Issues: Report a bug

Cryyer follows a two-stage pipeline:

  • Weekly Draft (cron, Mondays) — gathers GitHub activity (merged PRs, releases, notable commits), generates an email draft via LLM, and creates a GitHub issue for human review.
  • Send on Close — when a draft issue is closed (approved), emails are sent to subscribers via Resend.

Quickstart

mkdir my-updates && cd my-updates
npx cryyer init

The interactive setup walks you through product name, GitHub repo, voice/tone, LLM provider, subscriber store, and API keys — then creates everything you need:

  • products/*.yaml — product configuration
  • .env — API keys and settings
  • subscribers.json — subscriber list (when using JSON store)
  • .gitignore — ignores .env and data files

Then:

npx cryyer check         # validate your setup
npx cryyer run --dry-run  # preview a draft email

When you're ready to run for real:

npx cryyer run          # full pipeline: gather → draft → send

Or run the two stages separately:

npx cryyer draft        # generate drafts → create GitHub issues
npx cryyer send         # send emails when a draft issue is closed

You can also create products/*.yaml files manually — see Product Configuration for all fields, and .env.example for all environment variables.

Subscriber Stores

Set SUBSCRIBER_STORE to choose your backend. Default is supabase.

JSON File (simplest)

SUBSCRIBER_STORE=json
VariableDefaultDescription
SUBSCRIBERS_JSON_PATH./subscribers.jsonPath to subscriber data
EMAIL_LOG_JSON_PATH./email-log.jsonPath to email send log

File format — array of objects with email, optional name, and productIds:

[
  { "email": "alice@example.com", "name": "Alice", "productIds": ["my-app", "other-app"] }
]

Supabase (default)

SUBSCRIBER_STORE=supabase  # or just don't set it
VariableDescription
SUPABASE_URLYour Supabase project URL (https://[project-id].supabase.co)
SUPABASE_SERVICE_KEYSupabase service role key

Expects a beta_testers table with columns: email, name, product, unsubscribed_at.

Google Sheets

SUBSCRIBER_STORE=google-sheets
VariableDescription
GOOGLE_SHEETS_SPREADSHEET_IDThe ID from your spreadsheet URL
GOOGLE_SERVICE_ACCOUNT_EMAILService account email
GOOGLE_PRIVATE_KEYService account private key (PEM format)

Cryyer looks for a sheet tab named after the product ID (e.g. my-app), falling back to the first sheet. Expected columns: email, name (optional), unsubscribed (optional, set to true to exclude).

Email send logging is a no-op with this backend (read-only).

Google Sheets setup walkthrough

1. Enable the Google Sheets API

  • Go to console.cloud.google.com (create a project if you don't have one)
  • Navigate to APIs & Services > Library
  • Search for "Google Sheets API" and click Enable

2. Create a service account

  • Go to APIs & Services > Credentials
  • Click Create Credentials > Service account
  • Name it (e.g. cryyer-sheets-reader) and click Done

3. Generate a key

  • Click the service account you just created
  • Go to the Keys tab
  • Click Add Key > Create new key > JSON
  • Save the downloaded file

4. Set your environment variables

From the downloaded JSON file, grab client_email and private_key:

GOOGLE_SERVICE_ACCOUNT_EMAIL=cryyer-sheets-reader@your-project.iam.gserviceaccount.com
GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIE...\n-----END PRIVATE KEY-----\n"

5. Get the spreadsheet ID

From the spreadsheet URL:

https://docs.google.com/spreadsheets/d/SPREADSHEET_ID_HERE/edit
                                       ^^^^^^^^^^^^^^^^^^^^
GOOGLE_SHEETS_SPREADSHEET_ID=1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms

6. Share the spreadsheet

Share the spreadsheet with your service account email (from step 4) as an Editor (required for add/remove subscriber support; Viewer is sufficient for read-only use).

7. Set up columns

Row 1 should have these headers:

emailnameunsubscribed
alice@example.comAlice
bob@example.comBob
charlie@example.comtrue

Name the sheet tab after your product ID (e.g. my-app), or just use the default first sheet if you have one product.

LLM Providers

Set LLM_PROVIDER to choose your LLM backend. Default is anthropic.

VariableDefaultDescription
LLM_PROVIDERanthropicanthropic, openai, or gemini
LLM_MODELPer-provider defaultOverride the default model
ANTHROPIC_API_KEYRequired when LLM_PROVIDER=anthropic
OPENAI_API_KEYRequired when LLM_PROVIDER=openai
GEMINI_API_KEYRequired when LLM_PROVIDER=gemini

Default models: Anthropic claude-sonnet-4-5-20250514, OpenAI gpt-4o, Gemini gemini-1.5-flash.

Product Configuration

Products are defined as YAML files in products/. Each file represents one product.

FieldRequiredDescription
idYesUnique identifier, also used as GitHub issue label
nameYesDisplay name
voiceYesLLM voice/tone instructions (injected into the draft prompt)
repoYesowner/repo for GitHub activity gathering
emailSubjectTemplateYesSubject line template — use {{weekOf}} for the date
taglineNoProduct tagline
from_nameNoOverride sender name for this product
from_emailNoOverride sender email for this product
reply_toNoReply-to address

GitHub Actions Workflows

weekly-draft.yml

Runs every Monday at 1pm UTC. Gathers GitHub activity and creates draft issues.

Secrets needed: GITHUB_TOKEN, CRYYER_REPO, and the API key for your chosen LLM_PROVIDER.

send-update.yml

Fires when an issue with the draft label is closed. Sends emails to subscribers.

Secrets needed: GITHUB_TOKEN, RESEND_API_KEY, FROM_EMAIL, plus the secrets for your chosen SUBSCRIBER_STORE.

ci.yml

Runs on push/PR to main. Lints, typechecks, and runs tests.

MCP Server

Cryyer includes an MCP server that lets you review, edit, and send drafts conversationally from any MCP client. It also supports subscriber management.

The MCP server uses stdio transport and is available as a separate binary: cryyer-mcp.

Standalone usage

npx cryyer-mcp

Or if installed locally:

pnpm run build   # compiles dist/mcp.js
node dist/mcp.js

Claude Desktop

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "cryyer": {
      "command": "npx",
      "args": ["cryyer-mcp"],
      "env": {
        "GITHUB_TOKEN": "ghp_...",
        "CRYYER_REPO": "owner/repo",
        "CRYYER_ROOT": "/path/to/cryyer",
        "RESEND_API_KEY": "re_...",
        "FROM_EMAIL": "updates@example.com",
        "SUBSCRIBER_STORE": "json",
        "LLM_PROVIDER": "anthropic",
        "ANTHROPIC_API_KEY": "sk-ant-..."
      }
    }
  }
}

Other MCP clients (Cline, Continue, Windsurf, etc.)

Any MCP client that supports stdio transport can use Cryyer. The generic config is:

  • Command: npx cryyer-mcp (or node /path/to/cryyer/dist/mcp.js)
  • Transport: stdio
  • Environment variables: same as above

Only GITHUB_TOKEN and CRYYER_REPO are needed for read-only tools (list_drafts, get_draft). Other env vars are needed for sending, regenerating, and subscriber management.

Debugging

Test the server interactively with the MCP Inspector:

npx @modelcontextprotocol/inspector node dist/mcp.js

All log output goes to stderr (stdout is reserved for JSON-RPC). If something isn't working, check stderr for error messages.

Tools

ToolDescription
list_draftsList open draft issues
get_draftGet full draft content with subscriber count
update_draftSave revised subject + body
send_draftSend emails, close issue, post stats
regenerate_draftRe-gather activity + re-draft via LLM
list_productsShow configured products
list_subscribersShow subscribers for a product
add_subscriberAdd a subscriber to a product
remove_subscriberUnsubscribe someone from a product

Prompt

Use the review_weekly_drafts prompt for the Monday morning review workflow — it walks through each pending draft and asks whether to send, edit, regenerate, or skip.

Development

pnpm install         # install dependencies
pnpm run build       # compile TypeScript
pnpm run init        # interactive product setup + .env scaffolding
pnpm run check       # validate config, tokens, and connections
pnpm run typecheck   # type-check without emitting
pnpm run lint        # ESLint
pnpm test            # run tests (vitest)
pnpm run test:watch  # run tests in watch mode
pnpm run dev         # build + run
pnpm run mcp         # run MCP server

Keywords

email

FAQs

Package last updated on 04 Mar 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts