Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b2ad3f3
Add initial Vercel plugin dataStreams and dashboards
andrewmumblebee Jun 16, 2026
77b85f6
Remove unused listDeployments dataStream
andrewmumblebee Jun 16, 2026
c2f595c
Vercel plugin review comments
andrewmumblebee Jun 18, 2026
1da1f9c
update plugin author
andrewmumblebee Jun 18, 2026
a48c409
Ensure scopes and object types match new sourceTypes
andrewmumblebee Jun 18, 2026
a183bb0
Remove Vercel cost data stream
andrewmumblebee Jun 19, 2026
d312f4e
shift overview tiles up
andrewmumblebee Jun 19, 2026
189cf4e
Add team error handling
andrewmumblebee Jun 19, 2026
b12c5f7
slight text tweak
andrewmumblebee Jun 19, 2026
accc3ba
Add codeowners for vercel
andrewmumblebee Jun 24, 2026
a93e89d
Update Vercel readme
andrewmumblebee Jun 19, 2026
7f0ba71
Remove need for user to add teamId
andrewmumblebee Jun 19, 2026
a402b01
Token could belong to multiple teams
andrewmumblebee Jun 19, 2026
caa95be
Add status colors to bar chart on deployment oob dashboard
andrewmumblebee Jun 19, 2026
a83929e
Clean up Vercel tags and descriptions
andrewmumblebee Jun 19, 2026
19195d2
change deployments ordering
andrewmumblebee Jun 19, 2026
4b43045
title case dashboards
andrewmumblebee Jun 19, 2026
e3b701d
remove orphaned cost script
andrewmumblebee Jun 19, 2026
b7aca2d
remove cost from description
andrewmumblebee Jun 19, 2026
3dc61a2
Claude review fixes
andrewmumblebee Jun 19, 2026
fb0478b
Vercel claude review tweaks
andrewmumblebee Jun 19, 2026
7832970
remove unwrap as not needed
andrewmumblebee Jun 19, 2026
965757c
By -> by
andrewmumblebee Jun 19, 2026
4d2cdfc
Remove teams comment about non-indexed objects
andrewmumblebee Jun 22, 2026
ed4ca40
remove monitorOld reference
andrewmumblebee Jun 23, 2026
8149bb1
fix codeowners fallback superseding any defined authors
andrewmumblebee Jun 23, 2026
0e17a6b
hide email by default in teamMembers
andrewmumblebee Jun 23, 2026
0e92241
up activity limit to 1000
andrewmumblebee Jun 23, 2026
08f7d17
shift activity dashboard tiles
andrewmumblebee Jun 23, 2026
b047e06
update Vercel readme
andrewmumblebee Jun 23, 2026
d9791dc
deployments filtering was not working
andrewmumblebee Jun 23, 2026
817a305
bump up activity limit
andrewmumblebee Jun 24, 2026
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
6 changes: 4 additions & 2 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
/LICENSE @squaredup/community-moderators
/.github/* @squaredup/community-moderators

# Fallback – if a plugin has no specified author
plugins/* @squaredup/community-moderators

# Request review from original author
plugins/AutoTask/* @TimWheeler-SQUP
plugins/DattoRMM/* @TimWheeler-SQUP
Expand All @@ -25,7 +28,6 @@ plugins/UniFi/* @adamkinniburgh
plugins/UptimeRobot/* @kieranlangton
plugins/WorldCup2026/* @TimWheeler-SQUP
plugins/Algolia/* @andrewmumblebee
plugins/Vercel/* @andrewmumblebee
Comment thread
coderabbitai[bot] marked this conversation as resolved.


# Fallback – if a plugin has no specified author
plugins/* @squaredup/community-moderators
11 changes: 11 additions & 0 deletions plugins/Vercel/v1/configValidation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"steps": [
{
"displayName": "Authenticate",
"dataStream": { "name": "currentUser" },
"required": true,
"error": "Could not authenticate with Vercel. Check that your API token is valid and has not expired.",
"success": "Connected to Vercel successfully."
}
]
}
23 changes: 23 additions & 0 deletions plugins/Vercel/v1/custom_types.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[
{
"name": "Project",
"sourceType": "Project",
"icon": "rocket",
"singular": "Project",
"plural": "Projects"
},
{
"name": "Domain",
"sourceType": "Domain",
"icon": "globe",
"singular": "Domain",
"plural": "Domains"
},
{
"name": "Team",
"sourceType": "Team",
"icon": "people-group",
"singular": "Team",
"plural": "Teams"
}
]
Comment thread
claude[bot] marked this conversation as resolved.
43 changes: 43 additions & 0 deletions plugins/Vercel/v1/dataStreams/activity.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"name": "activity",
"displayName": "Activity",
"description": "Vercel account or team activity feed, one row per audit-style event",
"tags": ["Activity"],
"baseDataSourceName": "httpRequestUnscoped",
"config": {
"httpMethod": "get",
"endpointPath": "v3/events",
"pathToData": "events",
"expandInnerObjects": true,
"getArgs": [
{ "key": "since", "value": "{{timeframe.start}}" },
{ "key": "until", "value": "{{timeframe.end}}" },
Comment thread
clarkd marked this conversation as resolved.
{ "key": "limit", "value": "5000" }
],
"paging": {
"mode": "none"
}
},
"matches": "none",
"metadata": [
{ "name": "id", "displayName": "ID", "role": "id", "visible": false },
{ "name": "type", "displayName": "Type" },
{ "name": "text", "displayName": "Summary", "role": "label" },
{
"name": "actor",
"displayName": "Actor",
"computed": true,
"valueExpression": "{{ $['user.username'] || $['user.email'] || $['userId'] }}"
},
{ "name": "user.username", "displayName": "User", "visible": false },
{ "name": "user.email", "displayName": "Email", "visible": false },
{ "name": "userId", "displayName": "User ID", "visible": false },
{
"name": "createdAt",
"displayName": "Created",
"shape": "date",
"role": "timestamp"
}
],
"timeframes": true
}
21 changes: 21 additions & 0 deletions plugins/Vercel/v1/dataStreams/currentUser.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "currentUser",
"displayName": "Current User",
"description": "Returns the authenticated Vercel user. Used to validate the connection",
Comment thread
clarkd marked this conversation as resolved.
"tags": ["User"],
"baseDataSourceName": "httpRequestUnscoped",
"config": {
"httpMethod": "get",
"endpointPath": "v2/user",
"postRequestScript": "currentUser.js"
},
"matches": "none",
"metadata": [
{ "name": "id", "displayName": "ID", "visible": false },
{ "name": "username", "displayName": "Username", "role": "label" },
{ "name": "name", "displayName": "Name" },
{ "name": "email", "displayName": "Email" }
],
"timeframes": false,
"visibility": { "type": "hidden" }
}
97 changes: 97 additions & 0 deletions plugins/Vercel/v1/dataStreams/deployments.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
{
"name": "deployments",
"displayName": "Deployments",
"description": "Vercel deployments across the account or a selected project, one row per deployment",
"tags": ["Deployments"],
"baseDataSourceName": "httpRequestUnscoped",
"providesPluginDiagnostics": true,
"config": {
"httpMethod": "get",
"endpointPath": "v7/deployments",
"postRequestScript": "deployments.js",
"getArgs": [
{ "key": "since", "value": "{{timeframe.unixStart * 1000}}" },
{ "key": "projectIds", "value": "{{ project?.map(p => p.rawId) }}" }
],
"paging": {
"mode": "token",
"pageSize": {
"realm": "queryArg",
"path": "limit",
"value": "100"
},
"in": { "realm": "payload", "path": "pagination.next" },
"out": { "realm": "queryArg", "path": "until" }
}
},
"matches": "none",
"ui": [
{
"type": "objects",
"name": "project",
"label": "Project (optional)",
"matches": {
"sourceType": { "type": "equals", "value": "Project" }
}
}
],
"metadata": [
{
"name": "uid",
"displayName": "ID",
"role": "value",
"visible": false
},
{ "name": "name", "displayName": "Name", "role": "label" },
{
"name": "state",
"displayName": "State",
"shape": [
"state",
{
"map": {
"success": ["READY"],
"error": ["ERROR", "CANCELED"],
"warning": ["BUILDING", "QUEUED", "INITIALIZING"],
"unknown": ["DELETED"]
}
}
]
},
{ "name": "target", "displayName": "Target" },
{ "name": "projectId", "displayName": "Project ID", "visible": false },
{
"name": "created",
"displayName": "Created",
"shape": "date",
"role": "timestamp"
},
{ "name": "url", "displayName": "URL", "shape": "url" },
{
"name": "inspectorUrl",
"displayName": "Inspector URL",
"shape": "url"
},
{ "name": "creator", "displayName": "Creator" },
{
"name": "ready",
"displayName": "Ready",
"shape": "date",
"role": "timestamp"
},
{
"name": "buildingAt",
"displayName": "Building At",
"shape": "date",
"role": "timestamp"
},
{
"name": "createdAt",
"displayName": "Created At",
"shape": "date",
"role": "timestamp"
},
{ "pattern": ".*" }
],
"timeframes": true
}
30 changes: 30 additions & 0 deletions plugins/Vercel/v1/dataStreams/domainConfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "domainConfig",
"displayName": "Domain Config",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
"description": "Configuration health for a single Vercel domain",
"tags": ["Domain"],
"baseDataSourceName": "httpRequestScopedSingle",
"config": {
"httpMethod": "get",
"endpointPath": "v6/domains/{{object.name}}/config"
},
"matches": { "sourceType": { "type": "equals", "value": "Domain" } },
"metadata": [
{
"name": "misconfigured",
"displayName": "Misconfigured",
"shape": "boolean"
},
{
"name": "serviceType",
"displayName": "Service Type",
"shape": "string"
},
{
"name": "configuredBy",
"displayName": "Configured By",
"shape": "string"
}
],
"timeframes": false
Comment thread
clarkd marked this conversation as resolved.
}
34 changes: 34 additions & 0 deletions plugins/Vercel/v1/dataStreams/domains.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "domains",
"displayName": "Domains",
"description": "Lists Vercel custom domains in the configured account or team",
"tags": ["Domain"],
"baseDataSourceName": "httpRequestUnscoped",
"config": {
"httpMethod": "get",
"endpointPath": "v5/domains",
"pathToData": "domains",
"paging": {
"mode": "token",
"pageSize": {
"realm": "queryArg",
"path": "limit",
"value": "100"
},
"in": { "realm": "payload", "path": "pagination.next" },
"out": { "realm": "queryArg", "path": "until" }
}
},
"matches": "none",
"metadata": [
{ "name": "id", "displayName": "ID", "visible": false },
{ "name": "name", "displayName": "Domain", "role": "label" },
{ "name": "verified", "displayName": "Verified" },
{ "name": "serviceType", "displayName": "Service Type" },
{ "name": "expiresAt", "displayName": "Expires", "shape": "date" },
{ "name": "boughtAt", "displayName": "Bought", "shape": "date" },
{ "name": "renew", "displayName": "Auto-renew" },
{ "name": "createdAt", "displayName": "Created", "shape": "date" }
Comment thread
clarkd marked this conversation as resolved.
],
"timeframes": false
}
69 changes: 69 additions & 0 deletions plugins/Vercel/v1/dataStreams/firewallEvents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{
"name": "firewallEvents",
"displayName": "Firewall Events",
Comment thread
clarkd marked this conversation as resolved.
"description": "Per-action firewall event counts over the timeframe for a single Vercel project",
"tags": ["Security", "Firewall"],
"baseDataSourceName": "httpRequestScopedSingle",
"config": {
"httpMethod": "get",
"endpointPath": "v1/security/firewall/events",
"getArgs": [
{ "key": "projectId", "value": "{{object.rawId}}" },
{
"key": "startTimestamp",
"value": "{{timeframe.unixStart * 1000}}"
},
{ "key": "endTimestamp", "value": "{{timeframe.unixEnd * 1000}}" }
],
"pathToData": "actions"
},
"matches": {
"sourceType": { "type": "equals", "value": "Project" }
},
"metadata": [
{
"name": "startTime",
"displayName": "Time",
"shape": "date",
"role": "timestamp"
},
{
"name": "action",
"displayName": "Action",
"shape": "string",
"role": "label"
},
{
"name": "count",
"displayName": "Count",
"shape": "number",
"role": "value"
},
{
"name": "host",
"displayName": "Host",
"shape": "string"
},
{
"name": "public_ip",
"displayName": "Public IP",
"shape": "string"
},
{
"name": "action_type",
"displayName": "Action Category",
"shape": "string",
"visible": false
},
{
"name": "isActive",
"displayName": "Active",
"shape": "boolean",
"visible": false
},
{
"pattern": ".*"
}
],
"timeframes": true
}
36 changes: 36 additions & 0 deletions plugins/Vercel/v1/dataStreams/projectInfo.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"name": "projectInfo",
"displayName": "Project Info",
"description": "Per-project detail (framework, Node version, timestamps, git repo) for a single Vercel project",
"tags": ["Project"],
"baseDataSourceName": "httpRequestScopedSingle",
"config": {
"httpMethod": "get",
"endpointPath": "v9/projects/{{object.rawId}}",
"expandInnerObjects": true
},
"matches": { "sourceType": { "type": "equals", "value": "Project" } },
"metadata": [
{
"name": "name",
"displayName": "Name",
"shape": "string",
"role": "label"
},
{ "name": "framework", "displayName": "Framework", "shape": "string" },
{
"name": "nodeVersion",
"displayName": "Node Version",
"shape": "string"
},
{ "name": "createdAt", "displayName": "Created", "shape": "date" },
{ "name": "updatedAt", "displayName": "Updated", "shape": "date" },
{ "name": "link.repo", "displayName": "Git Repo", "shape": "string" },
{
"name": "link.type",
"displayName": "Git Provider",
"shape": "string"
}
],
"timeframes": false
Comment thread
clarkd marked this conversation as resolved.
}
Loading
Loading