Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,45 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

## [1.9.2] - 2026-05-08

### Added

- **Google Workspace Gateway** — Full OAuth 2.0 integration with automatic token refresh. Connect once, unlock 4 Google output destinations:
- **Google Sheets** — Append task results as rows to any spreadsheet
- **Gmail** — Send results from your connected Gmail account with subject templates
- **Google Docs** — Auto-create documents with full agent output, optional folder targeting
- **Google Calendar** — Create review events scheduled 1 hour after task completion
- **OAuth Edge Functions** — `google-oauth-start` and `google-oauth-callback` for secure token exchange
- **GoogleConnectionBanner** — Inline connect/disconnect UI with status indicator inside config forms
- **Notion Output Route** — Create pages in a Notion database with structured task results
- **GitHub Issues Output Route** — Create GitHub issues with label and assignee support
- **Email (Resend) Output Route** — Managed email delivery with HTML templates
- **SMTP Email Output Route** — Self-hosted email via nodemailer with full SMTP configuration
- **Linear Output Route** — Create issues via GraphQL with automatic team label resolution
- **Serverless Cron Evaluation** — `cron-evaluate` Edge Function replaces always-on task runner for trigger evaluation:
- pg_cron schedules evaluation every 30 minutes via pg_net
- Full catch-up logic (48h lookback) for missed triggers
- Optional task runner wake ping via `TASK_RUNNER_URL` webhook
- Railway no longer needs to run 24/7 for cron triggers
- **Canvas Logic Nodes** — Conditional (If-Else) and HTTP Request nodes on the visual workflow canvas with editable forms and conditional branching edges
- **Cron Trigger Catch-Up** — Missed cron firings (up to 48h) are retroactively evaluated on runner startup
- **Human-Readable Cron Labels** — All trigger UIs display friendly labels (e.g. "Every weekday at 9:00 AM")
- **Stale Model Validation** — Agent UI flags deprecated or removed model IDs with a warning badge
- **Docker Research Crew** — Docker Compose edition for research-focused agent workflows

### Fixed

- **Dependency Vulnerabilities** — Resolved HIGH and moderate severity npm audit findings
- **Canvas Logic Connections** — Logic nodes can now be connected, persisted, and edited in the flow
- **Canvas Bypass Edges** — Suppressed duplicate bypass edges when logic nodes are connected
- **ESLint Compliance** — Resolved `no-unnecessary-condition`, `no-non-null-assertion`, and `no-floating-promises` lint errors

### Documentation

- **Output Routes** updated with Notion, GitHub Issues, Email, SMTP, Linear, and all 4 Google destinations
- Changelog updated with 1.9.2 release

## [1.9.1] - 2026-04-23

### Added
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ Each client gets their own workspace. Custom agents built around their tools and

- ⚡ **Zapier** — Connect CrewForm to 7,000+ apps. Trigger agents from Gmail, Slack, forms, or schedules
- 📡 **Messaging Channels** — Trigger agents from Discord, Slack, Telegram, and Email
- 📤 **Output Routes** — Deliver results to Discord channels, Slack, webhooks, MS Teams, and more
- 📤 **Output Routes** — 16 destinations: Slack, Discord, Telegram, Teams, Asana, Trello, Notion, GitHub, Email, SMTP, Linear, Google Sheets, Gmail, Google Docs, Google Calendar, and HTTP webhooks
- 📈 **Advanced Analytics** — Charts, CSV export, prompt history with diffs *(Pro)*
- 💬 **Chat Widget** — Embed agents on any website *(Pro)*
- 📋 **Audit Logs** — Full audit trail with Datadog/Splunk streaming *(Enterprise)*
Expand Down Expand Up @@ -423,8 +423,8 @@ CrewForm uses an **open-core** model: a free Community Edition under AGPL-3.0 an
│ └──────────────┘ └──────────────┘ └───────────────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ Integrations │
│ Channels (Discord · Slack · Telegram · Email) · Output Routes
│ Zapier (7,000+ apps) · Webhooks · Chat Widget · REST API
│ Channels (Discord · Slack · Telegram · Email) · Output Routes (16)
│ Zapier (7,000+ apps) · Google Workspace · Webhooks · REST API │
├──────────────────────────────────────────────────────────────────┤
│ Observability │
│ OpenTelemetry · Langfuse · Datadog · Jaeger │
Expand Down
38 changes: 38 additions & 0 deletions docs/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,44 @@ All notable changes to CrewForm will be documented here.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [1.9.2] — 2026-05-08

### Added

- **Google Workspace Gateway** — OAuth 2.0 integration with 4 output destinations: Google Sheets (row append), Gmail (send from your account), Google Docs (auto-create documents), Google Calendar (create review events)
- **Notion Output Route** — Create pages in a Notion database with task results
- **GitHub Issues Output Route** — Create issues with labels and assignees
- **Email (Resend) Output Route** — Managed email delivery with HTML templates
- **SMTP Email Output Route** — Self-hosted email via nodemailer
- **Linear Output Route** — Create issues via GraphQL with team label resolution
- **Serverless Cron Evaluation** — Edge Function + pg_cron replaces always-on task runner for trigger scheduling (runs every 30 min)
- **Canvas Logic Nodes** — Conditional (If-Else) and HTTP Request nodes with branching edges
- **Human-Readable Cron Labels** — Friendly labels like "Every weekday at 9:00 AM" across all UIs
- **Stale Model Validation** — Warning badge on deprecated model IDs
- **Docker Research Crew** — Compose edition for research workflows

### Fixed

- Dependency vulnerabilities, canvas logic connections, bypass edge suppression, ESLint compliance

### Documentation

- Output Routes docs updated with 9 new destination types
- Total output destinations: **16** (HTTP, Slack, Discord, Telegram, Teams, Asana, Trello, Notion, GitHub, Email, SMTP, Linear, Google Sheets, Gmail, Google Docs, Google Calendar)

## [1.9.1] — 2026-04-23

### Added

- **7-Day Team Trial** — Every new signup gets full Team-tier access for 7 days with dashboard trial banner
- **Coolify Deployment Guide** — Step-by-step docs for Coolify v4 deployment
- **Cloudflare Turnstile** — Bot protection on login and signup forms

### Fixed

- Trial feature gating with `useEELicense` hook fallback
- Auth callback PKCE timeout handling

## [1.9.0] — 2026-04-22

### Added
Expand Down
184 changes: 184 additions & 0 deletions docs/output-routes.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ Supported destinations:
| [Microsoft Teams](#microsoft-teams) | Incoming Webhook — Adaptive Card |
| [Asana](#asana) | Creates a task in a project via Personal Access Token |
| [Trello](#trello) | Creates or updates a card on a board via API Key + Token |
| [Notion](#notion) | Creates a page in a database via Integration Token |
| [GitHub Issues](#github-issues) | Creates an issue in a repository via Personal Access Token |
| [Email (Resend)](#email-resend) | Sends HTML email via Resend API |
| [SMTP Email](#smtp-email) | Sends email via custom SMTP server (nodemailer) |
| [Linear](#linear) | Creates an issue via GraphQL API with team label resolution |
| [Google Sheets](#google-sheets) | Appends rows to a spreadsheet via OAuth 2.0 |
| [Gmail](#gmail) | Sends email from your connected Google account via OAuth 2.0 |
| [Google Docs](#google-docs) | Creates a document in Google Drive via OAuth 2.0 |
| [Google Calendar](#google-calendar) | Creates a review event via OAuth 2.0 |

---

Expand Down Expand Up @@ -376,3 +385,178 @@ Logs are retained for 30 days.
If you self-host CrewForm, no extra environment variables are needed for output routes — all credentials are stored in the database per-route. The task runner reads them at delivery time.

See the [Self-Hosting Guide](./self-hosting.md) for general environment setup.

---

## Notion

Creates a new page in a Notion database when a CrewForm task or team run completes or fails.

### Setup

1. Go to [notion.so/my-integrations](https://www.notion.so/my-integrations) → **New Integration**
2. Give it a name (e.g. "CrewForm") and select your workspace
3. Copy the **Internal Integration Token** (starts with `ntn_...`)
4. In Notion, open the target database → **⋯ → Connections → Add connection** → select your integration

### Configuration

| Field | Required | Description |
|-------|----------|-------------|
| **Integration Token** | ✅ | Notion Internal Integration Token |
| **Database ID** | ✅ | ID from the database URL: `notion.so/<DATABASE_ID>?v=...` |

### Page Format

Each delivery creates a Notion page with:
- **Title:** `[CrewForm] <task title> — <status>`
- **Content:** Event type, agent details, timestamp, and full result as text blocks

---

## GitHub Issues

Creates an issue in a GitHub repository when a CrewForm task or team run completes or fails.

### Setup

1. Go to [github.com/settings/tokens](https://github.com/settings/tokens) → **Generate new token (classic)**
2. Select the `repo` scope
3. Copy the **Personal Access Token**

### Configuration

| Field | Required | Description |
|-------|----------|-------------|
| **Personal Access Token** | ✅ | GitHub PAT with `repo` scope |
| **Repository** | ✅ | Format: `owner/repo` (e.g. `CrewForm/crewform`) |
| **Labels** | Optional | Comma-separated labels to apply (e.g. `ai-output, review`) |
| **Assignees** | Optional | Comma-separated GitHub usernames to assign |

### Issue Format

- **Title:** `[CrewForm] <task title> — <status>`
- **Body:** Event type, agent details, timestamp, and full result in Markdown

---

## Email (Resend)

Sends a styled HTML email via the [Resend](https://resend.com) API. Ideal for managed email delivery without configuring an SMTP server.

### Setup

1. Sign up at [resend.com](https://resend.com) and verify a sending domain
2. Go to **API Keys** → create a new key
3. Copy the **API Key**

### Configuration

| Field | Required | Description |
|-------|----------|-------------|
| **API Key** | ✅ | Resend API key |
| **From Email** | ✅ | Verified sender address (e.g. `alerts@yourdomain.com`) |
| **To Email(s)** | ✅ | Comma-separated recipient addresses |
| **Subject Template** | Optional | Supports `{{title}}`, `{{status}}`, `{{agent}}` placeholders |

---

## SMTP Email

Sends email via any SMTP server using [nodemailer](https://nodemailer.com). Use this for self-hosted email or providers like Gmail SMTP, SendGrid, Mailgun, etc.

### Configuration

| Field | Required | Description |
|-------|----------|-------------|
| **SMTP Host** | ✅ | SMTP server hostname (e.g. `smtp.gmail.com`) |
| **SMTP Port** | ✅ | Port number (typically `587` for TLS, `465` for SSL) |
| **Username** | ✅ | SMTP authentication username |
| **Password** | ✅ | SMTP authentication password or app password |
| **From Email** | ✅ | Sender email address |
| **To Email(s)** | ✅ | Comma-separated recipient addresses |
| **Subject Template** | Optional | Supports `{{title}}`, `{{status}}`, `{{agent}}` placeholders |

> **Gmail SMTP:** Use an App Password (not your regular password). Go to Google Account → Security → 2-Step Verification → App passwords.

---

## Linear

Creates an issue in Linear when a CrewForm task or team run completes or fails. Uses the Linear GraphQL API.

### Setup

1. Go to [linear.app/settings/api](https://linear.app/settings/api) → **Personal API keys** → create a key
2. Copy the **API Key**
3. Find your **Team Key** (the short prefix like `ENG`, `OPS` visible in issue IDs)

### Configuration

| Field | Required | Description |
|-------|----------|-------------|
| **API Key** | ✅ | Linear Personal API key |
| **Team Key** | ✅ | Team identifier (e.g. `ENG`) |
| **Labels** | Optional | Comma-separated label names (matched against existing team labels) |

### Issue Format

- **Title:** `[CrewForm] <task title> — <status>`
- **Description:** Full result in Markdown with agent and event metadata

---

## Google Workspace

Google destinations use **OAuth 2.0** — you connect your Google account once per workspace, and CrewForm handles token refresh automatically.

### Setup (One-Time)

1. When creating a Google output route, click **Connect Google** in the configuration form
2. Sign in with your Google account and grant the requested permissions
3. CrewForm stores encrypted OAuth tokens — no API keys needed

> **Self-Hosted:** You must configure a Google Cloud project with OAuth credentials. Set `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` on both Supabase Edge Functions and the task runner. See the [Self-Hosting Guide](./self-hosting.md) for details.

### Google Sheets

Appends task results as new rows in a Google Spreadsheet.

| Field | Required | Description |
|-------|----------|-------------|
| **Spreadsheet ID** | ✅ | ID from the spreadsheet URL: `docs.google.com/spreadsheets/d/<ID>/edit` |
| **Sheet Name** | Optional | Target sheet tab (defaults to first sheet) |

Each delivery appends a row with: Timestamp, Event, Task Title, Agent, Status, Result.

### Gmail

Sends an email from your connected Google account.

| Field | Required | Description |
|-------|----------|-------------|
| **To Email(s)** | ✅ | Comma-separated recipient addresses |
| **Subject Template** | Optional | Supports `{{title}}`, `{{status}}`, `{{agent}}` placeholders |

Emails are sent as the authenticated Google user with a styled HTML template.

### Google Docs

Creates a new Google Document with the full agent output.

| Field | Required | Description |
|-------|----------|-------------|
| **Drive Folder ID** | Optional | Target folder from URL: `drive.google.com/drive/folders/<ID>`. Defaults to root. |

Each delivery creates a document named `[CrewForm] <task title> — <timestamp>` with the full result.

### Google Calendar

Creates a review event on your Google Calendar.

| Field | Required | Description |
|-------|----------|-------------|
| **Calendar ID** | Optional | Defaults to `primary`. Use a specific calendar ID for custom calendars. |
| **Duration (minutes)** | Optional | Event duration in minutes (default: 30) |

Events are scheduled 1 hour after task completion with the task title and result in the description.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "crewform",
"private": true,
"version": "1.9.1",
"version": "1.9.2",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
2 changes: 1 addition & 1 deletion task-runner/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "task-runner",
"version": "1.6.0",
"version": "1.7.0",
"description": "",
"main": "index.js",
"scripts": {
Expand Down
Loading