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// 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