# 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.