SPB Git

spb/tendril Public

Tendril — web ingestion platform (scrape/crawl/map/search) on macOS Apple Silicon: WebKit fidelity, authenticated pages, deterministic testable extraction. A self-hosted Firecrawl alternative.

JavaScript 82.6% TypeScript 11.8% HTML 5.3%
1.3 KB · 45 lines typescript
Raw Blame History
1// author: simon-pierre boucher <contact@spboucher.ai>2import { z } from "zod";34export const OutputFormatSchema = z.enum([5  "markdown",6  "html",7  "rawHtml",8  "links",9  "screenshot",10  "structured",11  "extract",12]);1314export const ScrapeRequestSchema = z15  .object({16    url: z.string().url(),17    formats: z.array(OutputFormatSchema).default(["markdown"]),18    tier: z.enum(["auto", "http", "webkit", "safari"]).default("auto"),19    onlyMainContent: z.boolean().default(true),20    includeTags: z.array(z.string()).optional(),21    excludeTags: z.array(z.string()).optional(),22    waitFor: z.number().int().min(0).max(60_000).default(0),23    timeout: z.number().int().min(1_000).max(120_000).default(30_000),24    maxAge: z.number().int().min(0).default(0),25    headers: z.record(z.string()).optional(),26    maxBytes: z.number().int().min(1).optional(),27    respectRobots: z.boolean().default(true),28  })29  .strict();3031export type ScrapeRequest = z.infer<typeof ScrapeRequestSchema>;3233export const MapRequestSchema = z34  .object({35    url: z.string().url(),36    search: z.string().optional(),37    limit: z.number().int().min(1).max(50_000).default(5_000),38    includeSubdomains: z.boolean().default(false),39    sitemapOnly: z.boolean().default(false),40    ignoreSitemap: z.boolean().default(false),41  })42  .strict();4344export type MapRequest = z.infer<typeof MapRequestSchema>;45