Motion Advanced
affaan-m/ECC
Advanced motion patterns for React / Next.js — drag & drop, gestures, text animations, SVG path drawing, custom hooks, imperative sequences (useAnimate), loaders, and the full API decision tree.
Comprehensive rules to help you write advanced Trigger.dev tasks
$ npx skills add trycompai/comp --skill trigger-advanced-tasks -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install trycompai/comp trigger-advanced-tasks --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/trycompai/comp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/trigger-advanced-tasks .claude/skills/trigger-advanced-tasks && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "trigger-advanced-tasks" agent skill from https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasks into .claude/skills/trigger-advanced-tasks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "trigger-advanced-tasks", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasksType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add trycompai/comp --skill trigger-advanced-tasks -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install trycompai/comp trigger-advanced-tasks --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trycompai/comp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/trigger-advanced-tasks .agents/skills/trigger-advanced-tasks && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "trigger-advanced-tasks" agent skill from https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasks into .agents/skills/trigger-advanced-tasks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "trigger-advanced-tasks", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add trycompai/comp --skill trigger-advanced-tasks -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install trycompai/comp trigger-advanced-tasks --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trycompai/comp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/trigger-advanced-tasks .cursor/skills/trigger-advanced-tasks && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "trigger-advanced-tasks" agent skill from https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasks into .cursor/skills/trigger-advanced-tasks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "trigger-advanced-tasks", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/trycompai/comp.git --path .agents/skills/trigger-advanced-tasks--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add trycompai/comp --skill trigger-advanced-tasks -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install trycompai/comp trigger-advanced-tasks --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trycompai/comp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/trigger-advanced-tasks .gemini/skills/trigger-advanced-tasks && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "trigger-advanced-tasks" agent skill from https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasks into .gemini/skills/trigger-advanced-tasks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "trigger-advanced-tasks", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install trycompai/comp trigger-advanced-tasksInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add trycompai/comp --skill trigger-advanced-tasks -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/trycompai/comp.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/trigger-advanced-tasks .github/skills/trigger-advanced-tasks && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "trigger-advanced-tasks" agent skill from https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasks into .github/skills/trigger-advanced-tasks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "trigger-advanced-tasks", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add trycompai/comp --skill trigger-advanced-tasks -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install trycompai/comp trigger-advanced-tasks --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trycompai/comp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/trigger-advanced-tasks .opencode/skills/trigger-advanced-tasks && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "trigger-advanced-tasks" agent skill from https://github.com/trycompai/comp/tree/main/.agents/skills/trigger-advanced-tasks into .opencode/skills/trigger-advanced-tasks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "trigger-advanced-tasks", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
trigger-advanced-tasksComprehensive rules to help you write advanced Trigger.dev tasks
Trigger Advanced Tasks is an agent skill from trycompai/comp. Comprehensive rules to help you write advanced Trigger.dev tasks
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: AI Native platform to get companies compliant - Vanta & Drata Alternative. The licence is AGPL-3.0.
Read from SKILL.md and the folder at commit 1bf4d52. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
s3.amazonaws.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Trigger Advanced Tasks loads about 2.9k tokens when it runs. Until then it costs about 22 tokens; SKILL.md has 200 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from trycompai/comp at commit 1bf4d52, republished under its AGPL-3.0 licence (© trycompai). 200 words, ~2,931 tokens.
.claude/skills/trigger-advanced-tasks/SKILL.md (or your agent's skills folder).Source Cursor rule: .cursor/rules/trigger.advanced-tasks.mdc.
Original file scope: **/trigger/**/*.ts.
Original Cursor alwaysApply: false.
Advanced patterns and features for writing tasks
import { task, tags } from '@trigger.dev/sdk';
export const processUser = task({
id: 'process-user',
run: async (payload: { userId: string; orgId: string }, { ctx }) => {
// Add tags during execution
await tags.add(`user_${payload.userId}`);
await tags.add(`org_${payload.orgId}`);
return { processed: true };
},
});
// Trigger with tags
await processUser.trigger(
{ userId: '123', orgId: 'abc' },
{ tags: ['priority', 'user_123', 'org_abc'] }, // Max 10 tags per run
);
// Subscribe to tagged runs
for await (const run of runs.subscribeToRunsWithTag('user_123')) {
console.log(`User task ${run.id}: ${run.status}`);
}Tag Best Practices:
user_123, org_abc, video:456import { task, queue } from '@trigger.dev/sdk';
// Shared queue for related tasks
const emailQueue = queue({
name: 'email-processing',
concurrencyLimit: 5, // Max 5 emails processing simultaneously
});
// Task-level concurrency
export const oneAtATime = task({
id: 'sequential-task',
queue: { concurrencyLimit: 1 }, // Process one at a time
run: async (payload) => {
// Critical section - only one instance runs
},
});
// Per-user concurrency
export const processUserData = task({
id: 'process-user-data',
run: async (payload: { userId: string }) => {
// Override queue with user-specific concurrency
await childTask.trigger(payload, {
queue: {
name: `user-${payload.userId}`,
concurrencyLimit: 2,
},
});
},
});
export const emailTask = task({
id: 'send-email',
queue: emailQueue, // Use shared queue
run: async (payload: { to: string }) => {
// Send email logic
},
});import { task, retry, AbortTaskRunError } from '@trigger.dev/sdk';
export const resilientTask = task({
id: 'resilient-task',
retry: {
maxAttempts: 10,
factor: 1.8, // Exponential backoff multiplier
minTimeoutInMs: 500,
maxTimeoutInMs: 30_000,
randomize: false,
},
catchError: async ({ error, ctx }) => {
// Custom error handling
if (error.code === 'FATAL_ERROR') {
throw new AbortTaskRunError('Cannot retry this error');
}
// Log error details
console.error(`Task ${ctx.task.id} failed:`, error);
// Allow retry by returning nothing
return { retryAt: new Date(Date.now() + 60000) }; // Retry in 1 minute
},
run: async (payload) => {
// Retry specific operations
const result = await retry.onThrow(
async () => {
return await unstableApiCall(payload);
},
{ maxAttempts: 3 },
);
// Conditional HTTP retries
const response = await retry.fetch('https://api.example.com', {
retry: {
maxAttempts: 5,
condition: (response, error) => {
return response?.status === 429 || response?.status >= 500;
},
},
});
return result;
},
});export const heavyTask = task({
id: 'heavy-computation',
machine: { preset: 'large-2x' }, // 8 vCPU, 16 GB RAM
maxDuration: 1800, // 30 minutes timeout
run: async (payload, { ctx }) => {
// Resource-intensive computation
if (ctx.machine.preset === 'large-2x') {
// Use all available cores
return await parallelProcessing(payload);
}
return await standardProcessing(payload);
},
});
// Override machine when triggering
await heavyTask.trigger(payload, {
machine: { preset: 'medium-1x' }, // Override for this run
});Machine Presets:
micro: 0.25 vCPU, 0.25 GB RAMsmall-1x: 0.5 vCPU, 0.5 GB RAM (default)small-2x: 1 vCPU, 1 GB RAMmedium-1x: 1 vCPU, 2 GB RAMmedium-2x: 2 vCPU, 4 GB RAMlarge-1x: 4 vCPU, 8 GB RAMlarge-2x: 8 vCPU, 16 GB RAMimport { task, idempotencyKeys } from '@trigger.dev/sdk';
export const paymentTask = task({
id: 'process-payment',
retry: {
maxAttempts: 3,
},
run: async (payload: { orderId: string; amount: number }) => {
// Automatically scoped to this task run, so if the task is retried, the idempotency key will be the same
const idempotencyKey = await idempotencyKeys.create(`payment-${payload.orderId}`);
// Ensure payment is processed only once
await chargeCustomer.trigger(payload, {
idempotencyKey,
idempotencyKeyTTL: '24h', // Key expires in 24 hours
});
},
});
// Payload-based idempotency
import { createHash } from 'node:crypto';
function createPayloadHash(payload: any): string {
const hash = createHash('sha256');
hash.update(JSON.stringify(payload));
return hash.digest('hex');
}
export const deduplicatedTask = task({
id: 'deduplicated-task',
run: async (payload) => {
const payloadHash = createPayloadHash(payload);
const idempotencyKey = await idempotencyKeys.create(payloadHash);
await processData.trigger(payload, { idempotencyKey });
},
});import { task, metadata } from '@trigger.dev/sdk';
export const batchProcessor = task({
id: 'batch-processor',
run: async (payload: { items: any[] }, { ctx }) => {
const totalItems = payload.items.length;
// Initialize progress metadata
metadata
.set('progress', 0)
.set('totalItems', totalItems)
.set('processedItems', 0)
.set('status', 'starting');
const results = [];
for (let i = 0; i < payload.items.length; i++) {
const item = payload.items[i];
// Process item
const result = await processItem(item);
results.push(result);
// Update progress
const progress = ((i + 1) / totalItems) * 100;
metadata
.set('progress', progress)
.increment('processedItems', 1)
.append('logs', `Processed item ${i + 1}/${totalItems}`)
.set('currentItem', item.id);
}
// Final status
metadata.set('status', 'completed');
return { results, totalProcessed: results.length };
},
});
// Update parent metadata from child task
export const childTask = task({
id: 'child-task',
run: async (payload, { ctx }) => {
// Update parent task metadata
metadata.parent.set('childStatus', 'processing');
metadata.root.increment('childrenCompleted', 1);
return { processed: true };
},
});'use client';
import { useTaskTrigger } from '@trigger.dev/react-hooks';
import type { myTask } from '../trigger/tasks';
function TriggerButton({ accessToken }: { accessToken: string }) {
const { submit, handle, isLoading } = useTaskTrigger<typeof myTask>('my-task', { accessToken });
return (
<button onClick={() => submit({ data: 'from frontend' })} disabled={isLoading}>
Trigger Task
</button>
);
}// For payloads > 512KB (max 10MB)
export const largeDataTask = task({
id: 'large-data-task',
run: async (payload: { dataUrl: string }) => {
// Trigger.dev automatically handles large payloads
// For > 10MB, use external storage
const response = await fetch(payload.dataUrl);
const largeData = await response.json();
return { processed: largeData.length };
},
});
// Best practice: Use presigned URLs for very large files
await largeDataTask.trigger({
dataUrl: 'https://s3.amazonaws.com/bucket/large-file.json?presigned=true',
});await myTask.trigger(payload, {
delay: '2h30m', // Delay execution
ttl: '24h', // Expire if not started within 24 hours
priority: 100, // Higher priority (time offset in seconds)
tags: ['urgent', 'user_123'],
metadata: { source: 'api', version: 'v2' },
queue: {
name: 'priority-queue',
concurrencyLimit: 10,
},
idempotencyKey: 'unique-operation-id',
idempotencyKeyTTL: '1h',
machine: { preset: 'large-1x' },
maxAttempts: 5,
});// Hidden task - not exported, only used internally
const internalProcessor = task({
id: 'internal-processor',
run: async (payload: { data: string }) => {
return { processed: payload.data.toUpperCase() };
},
});
// Public task that uses hidden task
export const publicWorkflow = task({
id: 'public-workflow',
run: async (payload: { input: string }) => {
// Use hidden task internally
const result = await internalProcessor.triggerAndWait({
data: payload.input,
});
if (result.ok) {
return { output: result.output.processed };
}
throw new Error('Internal processing failed');
},
});import { task, logger } from '@trigger.dev/sdk';
export const tracedTask = task({
id: 'traced-task',
run: async (payload, { ctx }) => {
logger.info('Task started', { userId: payload.userId });
// Custom trace with attributes
const user = await logger.trace(
'fetch-user',
async (span) => {
span.setAttribute('user.id', payload.userId);
span.setAttribute('operation', 'database-fetch');
const userData = await database.findUser(payload.userId);
span.setAttribute('user.found', !!userData);
return userData;
},
{ userId: payload.userId },
);
logger.debug('User fetched', { user: user.id });
try {
const result = await processUser(user);
logger.info('Processing completed', { result });
return result;
} catch (error) {
logger.error('Processing failed', {
error: error.message,
userId: payload.userId,
});
throw error;
}
},
});import { logger, task, usage } from '@trigger.dev/sdk';
export const monitoredTask = task({
id: 'monitored-task',
run: async (payload) => {
// Get current run cost
const currentUsage = await usage.getCurrent();
logger.info('Current cost', {
costInCents: currentUsage.costInCents,
durationMs: currentUsage.durationMs,
});
// Measure specific operation
const { result, compute } = await usage.measure(async () => {
return await expensiveOperation(payload);
});
logger.info('Operation cost', {
costInCents: compute.costInCents,
durationMs: compute.durationMs,
});
return result;
},
});// Cancel runs
await runs.cancel('run_123');
// Replay runs with same payload
await runs.replay('run_123');
// Retrieve run with cost details
const run = await runs.retrieve('run_123');
console.log(`Cost: ${run.costInCents} cents, Duration: ${run.durationMs}ms`);Design tasks to be stateless, idempotent, and resilient to failures. Use metadata for state tracking and queues for resource management.
© trycompai, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/trigger-advanced-tasks of trycompai/comp.
Open the folder on GitHubat commit 1bf4d52
Trigger Advanced Tasks next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Trigger Advanced Tasks this skilltrycompai/comp | 2k | — | ~2.9k | Automated safety check: Pass | AGPL-3.0 | |
| Motion Advancedaffaan-m/ECC | 274k | 1 repos | ~4.7k | Automated safety check: Pass | MIT | |
| Git Advanced Workflowswshobson/agents | 40k | 10 repos | ~1.3k | Automated safety check: Pass | MIT | |
| Engineering Advanced Skillsalirezarezvani/claude-skills | 28k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Dataverse Python Advanced Patternsgithub/awesome-copilot | 40k | 1 repos | ~291 | Automated safety check: Pass | MIT | |
| Hunting Advanced Persistent Threatsmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~1.7k | Automated safety check: Pass | Apache-2.0 |
affaan-m/ECC
Advanced motion patterns for React / Next.js — drag & drop, gestures, text animations, SVG path drawing, custom hooks, imperative sequences (useAnimate), loaders, and the full API decision tree.
wshobson/agents
Master advanced Git workflows including rebasing, cherry-picking, bisect, worktrees, and reflog to maintain clean history and recover from any situation.
alirezarezvani/claude-skills
Index of 37 advanced engineering agent skills for Claude Code, Codex, Gemini CLI, Cursor, OpenClaw.
github/awesome-copilot
Generate production code for Dataverse SDK using advanced patterns, error handling, and optimization techniques.
mukul975/Anthropic-Cybersecurity-Skills
Proactively hunts for Advanced Persistent Threat (APT) activity within enterprise environments using hypothesis-driven searches across endpoint telemetry, network logs, and memory artifacts.
mukul975/Anthropic-Cybersecurity-Skills
Performs advanced network recon using Nmap's Scripting Engine (NSE), timing controls, firewall/IDS evasion, and structured output parsing to discover hosts, enumerate service versions, detect…
trycompai/comp
The contract every new or modified API endpoint must follow so it is correct for the public OpenAPI spec, the MCP server (npm @trycompai/mcp-server), the ValidationPipe, and the docs.
trycompai/comp
How to reuse ANY integration check's results in a feature via the universal CheckResultsService (apps/api integration-platform).
trycompai/comp
A skill your agent uses when implementing data fetching, API calls, server/client components, or SWR hooks
trycompai/comp
A skill your agent uses when SDK generation failed or seeing errors.
trycompai/comp
A skill your agent uses when building forms - covers React Hook Form, Zod validation, and form patterns
trycompai/comp
A skill your agent uses when writing TypeScript/React code - covers type safety, component patterns, and file organization
Comprehensive rules to help you write advanced Trigger.dev tasks. Trigger Advanced Tasks is an agent skill from trycompai/comp.
Run `npx skills add trycompai/comp --skill trigger-advanced-tasks -a claude-code`. Or copy the skill folder (.agents/skills/trigger-advanced-tasks in trycompai/comp) into .claude/skills/trigger-advanced-tasks in your project. Claude Code loads it when a task matches its description.
Run `npx skills add trycompai/comp --skill trigger-advanced-tasks -a codex`. Or copy the skill folder (.agents/skills/trigger-advanced-tasks in trycompai/comp) into .agents/skills/trigger-advanced-tasks in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add trycompai/comp --skill trigger-advanced-tasks -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/trigger-advanced-tasks, .gemini/skills/trigger-advanced-tasks, .github/skills/trigger-advanced-tasks and .opencode/skills/trigger-advanced-tasks in your project.
SKILL.md names no scripts, command-line tools or credentials: Trigger Advanced Tasks is instructions for the agent only.
SKILL.md names 1 domain. In commands or code: s3.amazonaws.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Trigger Advanced Tasks is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Trigger Advanced Tasks: Motion Advanced (affaan-m/ECC, 274k stars), Git Advanced Workflows (wshobson/agents, 40k stars), Engineering Advanced Skills (alirezarezvani/claude-skills, 28k stars) and Dataverse Python Advanced Patterns (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
trycompai (a GitHub organization) maintains it in trycompai/comp, which has 2,016 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on October 2, 2026.
Source: trycompai/comp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.