# A SQLite extension for the crazy ones who believe anything can be a database Pandora is a SQLite extension that turns APIs into virtual tables, mostly by ignoring best practices. It is a love letter to SQLite, HTTP, and bad ideas that compile cleanly. No SDKs. No Python. No Javascript. Just pure, vintage SQL chaos: ``` SELECT identifier, title FROM linear_issues WHERE team_key IN (βMADβ, βETLβ) AND priority <= 2 ORDER BY updated_at DESC LIMIT 1; +ββββ+βββββββββββββββββββ+ | identifier | title | +ββββ+βββββββββββββββββββ+ | MAD-5823 | Remove whitespace on the right due to missing nav bar | +ββββ+βββββββββββββββββββ+ ``` ```β¦
# A SQLite extension for the crazy ones who believe anything can be a database Pandora is a SQLite extension that turns APIs into virtual tables, mostly by ignoring best practices. It is a love letter to SQLite, HTTP, and bad ideas that compile cleanly. No SDKs. No Python. No Javascript. Just pure, vintage SQL chaos: ``` SELECT identifier, title FROM linear_issues WHERE team_key IN (βMADβ, βETLβ) AND priority <= 2 ORDER BY updated_at DESC LIMIT 1; +ββββ+βββββββββββββββββββ+ | identifier | title | +ββββ+βββββββββββββββββββ+ | MAD-5823 | Remove whitespace on the right due to missing nav bar | +ββββ+βββββββββββββββββββ+ ``` ``` SELECT text FROM gpt WHERE input = βSummarize this mess succinctlyβ AND model = βgpt-4o-miniβ AND max_output_tokens = 64; +βββββββββββββββββββββββββββββββ+ | text | +βββββββββββββββββββββββββββββββ+ | Of course! Please provide the content you would like me to s | | ummarize. | +βββββββββββββββββββββββββββββββ+ ``` And it works. Which means the universe has failed another sanity check. ## What it actually is - A shared library you LOAD into SQLite. - A built-in HTTP client that respects rate limits and retries - A LuaJIT brain that translates queries into GraphQL and JSON payloads. - Predicate pushdown across HTTP It is small. It is weird. It is a bad influence. It is gloriously, irredeemably perfect. ## Why it exists Because we have spent decades turning databases into services and services into databases, and it was time to collapse the distinction for fun. Because every other tool was too normal. Because it reframes βintegrationβ as declarative query planning rather than glue code. ## Things People Havenβt Said (But Will) Pandora is not for normal people. It is for the kind of person who uses sqlite3 as a spreadsheet or a diary. It is for people who think βI could build that with SQLβ and mean it. See what people havenβt said: > βI sleep great knowing SELECT can call external services.β > β DevOps, lying professionally > βSecurity loves it. They havenβt said that, but they will, once we let them talk again.β > β Product manager, optimistic > βWe use SQLite as our app server now. It is fine; the app was a query anyway.β > β Tech lead, existentially compromised > βI canβt tell if it is a database or a personality test.β > β Intern, 12 minutes into onboarding > βNothing failed; everything succeeded too much.β > β Postmortem title, Q4 ## Demo Buckle your seatbelt Dorothy, because Kansas is going bye-bye, the join is doing something very evil, and I promise you are going to love it: ``` sqlite> WITH src AS ( SELECT i.identifier, i.title, i.description, printf( βYou are a helpful comedian. Write a short dad joke (<= 15 words) inspired by this Linear ticket. Title: %s Description: %sβ, i.title, substr(i.description, 1, 800) ) AS prompt FROM ext.linear_issues AS i WHERE team_key = βETLβ LIMIT 1 ) SELECT g.text AS joke FROM src AS s JOIN gpt AS g ON g.input = s.prompt AND g.model = βgpt-5β; +βββββββββββββββββββββββββββββββ+ | joke | +βββββββββββββββββββββββββββββββ+ | Rotated keys, but BYOB kept partying with the old ones. | | Support called last call. | +βββββββββββββββββββββββββββββββ+ ``` Congratulations, you just built an AI-augmented dashboard entirely in SQL. You are both impressed and uncomfortable. Your join strategy is now technically machine learning. Good luckβand may your SELECT * never hit rate limits.