
Research
/Security News
77 Firefox Extensions Linked to Crypto Wallet and Credential Theft
Socket uncovered 77 linked Firefox extensions, including 40 that steal wallet secrets or credentials and 37 deceptive sports-score shells.
@finishkit/sdk
Advanced tools
TypeScript SDK for the FinishKit API - scan GitHub repos with LLM analysis, get prioritized findings and patches for AI-built web apps
TypeScript SDK for the FinishKit API. Scan GitHub repos with LLM-powered analysis to find security vulnerabilities, deployment blockers, stability issues, and code quality problems.
npm install @finishkit/sdk
import { FinishKit, ProjectNotFoundError } from '@finishkit/sdk'
const fk = new FinishKit({ apiKey: process.env.FINISHKIT_API_KEY! })
const result = await fk.scan({
repoOwner: 'myorg',
repoName: 'myrepo',
})
console.log(`Found ${result.findings.length} issues`)
for (const finding of result.findings) {
console.log(`[${finding.severity}] ${finding.title}`)
}
Get your API key at finishkit.app/dashboard/settings under the Developer tab.
const fk = new FinishKit({
apiKey: 'fk_live_...', // Required. Set via FINISHKIT_API_KEY env var.
baseUrl: 'https://finishkit.app', // Optional. Default shown.
})
The primary method. Finds the project, triggers a scan, polls until complete, and returns results.
const result = await fk.scan({
repoOwner: 'myorg', // Required
repoName: 'myrepo', // Required
runType: 'baseline', // Optional: 'baseline' | 'pr' | 'manual_patch'
commitSha: 'abc123', // Optional: specific commit to scan
idempotencyKey: 'unique-id', // Optional: safe retries
onProgress: (run) => { // Optional: called on each poll
console.log(run.status, run.progress + '%')
},
pollIntervalMs: 2000, // Optional: poll frequency (default 2s)
timeoutMs: 600000, // Optional: max wait time (default 10min)
})
// Returns: { run, findings, patches, artifacts, metrics }
Note: scan() does NOT create projects. The repository must be connected to FinishKit via the dashboard first. Throws ProjectNotFoundError if not found.
const { projects } = await fk.projects.list()
const { project } = await fk.projects.get(projectId)
const { run } = await fk.runs.create({
projectId: 'uuid',
runType: 'baseline',
commitSha: 'abc123', // Optional
idempotencyKey: 'key', // Optional
})
const { run } = await fk.runs.get(runId)
const { findings, patches, artifacts, metrics } = await fk.runs.outcomes(runId)
const { events } = await fk.runs.events(runId, { since: isoString, limit: 100 })
await fk.runs.cancel(runId)
type RunStatus = 'queued' | 'running' | 'done' | 'failed' | 'canceled'
type RunType = 'baseline' | 'pr' | 'manual_patch'
type FindingCategory = 'blockers' | 'security' | 'deploy' | 'stability' | 'tests' | 'ui'
type FindingSeverity = 'critical' | 'high' | 'medium' | 'low'
interface Finding {
id: string
title: string
category: FindingCategory
severity: FindingSeverity
detail_md: string // Full explanation in Markdown
file_path: string | null // Affected file path (relative to repo root)
line_start: number | null // Starting line number
line_end: number | null // Ending line number
suggested_fix: object | null
}
interface ScanResult {
run: Run
findings: Finding[]
patches: Patch[]
artifacts: Artifact[]
metrics: ScanMetrics
}
import {
FinishKitError,
AuthenticationError, // 401 - invalid or expired API key
BillingError, // 402 - plan limit reached
NotFoundError, // 404 - resource not found
RateLimitError, // 429 - too many requests
ValidationError, // 400 - invalid request parameters
ProjectNotFoundError, // Project not linked to FinishKit
} from '@finishkit/sdk'
try {
const result = await fk.scan({ repoOwner: 'org', repoName: 'repo' })
} catch (err) {
if (err instanceof ProjectNotFoundError) {
// Repository not connected. Direct user to finishkit.app/dashboard
} else if (err instanceof AuthenticationError) {
// Invalid API key
} else if (err instanceof BillingError) {
// Plan limit reached - upgrade at finishkit.app/dashboard/settings
} else if (err instanceof RateLimitError) {
// Wait err.retryAfter seconds before retrying
} else if (err instanceof FinishKitError) {
// Other API error - err.code and err.statusCode available
}
}
If you are an AI assistant (Claude, Copilot, Cursor, etc.) helping a developer use FinishKit:
Setup
npm install @finishkit/sdk
export FINISHKIT_API_KEY=fk_live_...
Minimal working example
import { FinishKit, ProjectNotFoundError } from '@finishkit/sdk'
const fk = new FinishKit({ apiKey: process.env.FINISHKIT_API_KEY! })
try {
const result = await fk.scan({ repoOwner: 'myorg', repoName: 'myrepo' })
const critical = result.findings.filter(f => f.severity === 'critical')
console.log(`${critical.length} critical issues found`)
} catch (err) {
if (err instanceof ProjectNotFoundError) {
console.log('Connect the repo at https://finishkit.app/dashboard first')
}
}
Key facts:
FINISHKIT_API_KEY (format: fk_live_ followed by 32 alphanumeric chars)scan() blocks until complete (2-8 minutes typical). Use onProgress callback for updates.run.current_phase is available at runtime but not in TypeScript types - use (run as any).current_phase or a local interface extension if needed@finishkit/sdkRetry-After on 429 responses.fetch)MIT. See LICENSE.
FAQs
TypeScript SDK for the FinishKit API. Production readiness scanner for AI-built apps.
The npm package @finishkit/sdk receives a total of 19 weekly downloads. As such, @finishkit/sdk popularity was classified as not popular.
We found that @finishkit/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

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.

Research
/Security News
Socket uncovered 77 linked Firefox extensions, including 40 that steal wallet secrets or credentials and 37 deceptive sports-score shells.

Security News
NIST disclosed an unreleased AI tool called V-etalon and opened a broad inquiry into NVD modernization after years of automation plans produced no public enrichment system.

Security News
In his AI Council 2026 talk, Feross Aboukhadijeh covers recent package compromises, vulnerability discovery, and a more automated security model.