Skip to content

PondPilot Proxy

PondPilot Proxy enables clients to execute SQL queries against multiple data sources through a unified interface. Each user gets an isolated DuckDB instance running in a Docker container, with queries proxied via the Apache Arrow Flight SQL protocol.

PondPilot Proxy is a multi-tenant data proxy that provides:

  • Per-user isolation — Each user gets their own DuckDB instance in a dedicated Docker container
  • Flight SQL protocol — High-performance columnar data streaming via Apache Arrow
  • Cross-database queries — Join data across PostgreSQL, MySQL, and SQLite in a single query
  • AI integration — Built-in endpoints for chat completions and embeddings
PondPilot Proxy
┌─────────────────────────────────────────────────┐
│ │
HTTP :8080 │ ┌──────────┐ ┌────────────────────────┐ │
──────────────┼─▶│ Router │───▶│ Middleware Pipeline │ │
│ └──────────┘ │ - Auth (JWT) │ │
│ │ - RateLimiter │ │
│ └────────────────────────┘ │
│ │ │
│ ┌──────────────┴──────────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌───────────┐ │
│ │ AI Handlers │ │ Health │ │
│ │ /ai/chat │ │ Endpoints │ │
│ │ /ai/embed │ └───────────┘ │
│ └──────────────┘ │
│ │
gRPC :8081 │ ┌───────────────────────────────────────────┐ │
──────────────┼─▶│ Flight SQL Server │ │
│ │ (JWT Auth via gRPC Interceptors) │ │
│ └───────────────────┬───────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────┐ │
│ │ Container Manager │ │
│ │ - Per-user isolation │ │
│ │ - Idle container reaping │ │
│ │ - Resource limits (CPU, memory) │ │
│ └───────────────────┬───────────────────────┘ │
│ │ │
└──────────────────────┼─────────────────────────┘
┌──────────────────────┼──────────────────────┐
│ Docker Network │ │
│ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Container│ │Container│ │Container│ ... │
│ │ User A │ │ User B │ │ User C │ │
│ │ SQLFlite│ │ SQLFlite│ │ SQLFlite│ │
│ │ DuckDB │ │ DuckDB │ │ DuckDB │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
└───────┼────────────┼────────────┼──────────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│PostgreSQL│ │ MySQL │ │ SQLite │
│ Database │ │ Database │ │ Files │
└──────────┘ └──────────┘ └──────────┘
PortProtocolPurpose
8080HTTPREST API, health checks, AI endpoints
8081gRPCFlight SQL queries

Each user gets a dedicated Docker container running:

  • SQLFlite — Flight SQL server backed by DuckDB
  • DuckDB — With extensions for PostgreSQL, MySQL, SQLite connectivity
  • Pre-attached databases — Configured at container startup

Containers are:

  • Spawned on first request
  • Cached for subsequent requests (~10-50ms latency)
  • Automatically stopped after idle timeout (default: 5 minutes)
LayerMechanism
AuthenticationJWT tokens (required)
Process isolationSeparate container per user
Network isolationContainers on isolated Docker network
Resource limitsCPU and memory limits enforced
PrivilegesNon-root user, capabilities dropped
DatabaseExtensionNotes
PostgreSQLpostgresFull read access with schema support
MySQLmysqlMySQL and MariaDB compatible
SQLitesqliteLocal or remote SQLite files
DuckDBnativeIn-memory and persistent tables
  • PondPilot App — Backend for the PondPilot data exploration tool
  • Cross-database analytics — JOIN across different database systems
  • Data federation — Query microservice databases without tight coupling
  • AI-powered queries — Natural language to SQL with integrated AI endpoints

import { Card, CardGrid } from ‘@astrojs/starlight/components’;

Deploy and connect to your first database.
[Get started →](/proxy/getting-started/)
YAML configuration, environment variables, container settings.
[Configure →](/proxy/configuration/)
Query multiple databases with Flight SQL.
[Learn more →](/proxy/cross-database-queries/)
Docker Compose, production setup, scaling.
[Deploy →](/proxy/deployment/)