Central registry for Timeplus Custom Table Function (CTF) connectors. Think npm/PyPI for Timeplus data connectors.
- 📦 Package Management - Publish, version, and distribute connectors
- 🔍 Discovery - Search and browse connectors by category, tags, and keywords
- 📥 Easy Installation - Generate ready-to-run SQL for any connector
- 🏷️ Categorization - Source, Sink, and Bidirectional connectors
- ✅ Verification - Verified publisher badges for trusted connectors
The easiest way to run the registry locally:
# Start the registry API (UI is integrated)
docker-compose up -d
# View logs
docker-compose logs -f api
# Stop services
docker-compose down
# Stop and remove data
docker-compose down -vOnce running:
- UI: http://localhost:8000
- API Docs: http://localhost:8000/docs
- Health Check: http://localhost:8000/health
If you prefer to run without Docker:
# 1. Install Python dependencies
pip install -e .
# 2. Set up environment variables (copy and edit .env.example)
cp .env.example .env
# By default, it uses an embedded SQLite database (registry.db)
# 3. Start the server
uvicorn registry.main:app --reloadOnce running, visit:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- Health Check: http://localhost:8000/health
curl -X POST "http://localhost:8000/api/v1/register" \
-H "Content-Type: application/json" \
-d '{
"namespace": "timeplus",
"display_name": "Timeplus",
"email": "gang@timeplus.com",
"password": "Password!"
}'Response:
{
"access_token":"eyJhbGciOiJIUzI1Ni......",
"token_type":"bearer"}curl -X POST "http://localhost:8000/api/v1/login" \
-H "Content-Type: application/json" \
-d '{
"namespace": "timeplus",
"password": "Password!"
}'# Using the sample connector
curl -X POST "http://localhost:8000/api/v1/connectors" \
-H "Authorization: Bearer <your-token>" \
-H "Content-Type: application/x-yaml" \
--data-binary @samples/kafka-json-reader.yaml# Search by keyword
curl "http://localhost:8000/api/v1/connectors?q=kafka"
# Filter by category
curl "http://localhost:8000/api/v1/connectors?category=source"
# Filter by tags
curl "http://localhost:8000/api/v1/connectors?tags=kafka,streaming"
# Combine filters
curl "http://localhost:8000/api/v1/connectors?q=json&category=source&tags=kafka"curl "http://localhost:8000/api/v1/connectors/mycompany/kafka-json-reader"# Get SQL for latest version
curl "http://localhost:8000/api/v1/connectors/mycompany/kafka-json-reader/sql"
# Get SQL for specific version
curl "http://localhost:8000/api/v1/connectors/mycompany/kafka-json-reader/sql?version=1.0.0"
# Get SQL with custom stream name
curl "http://localhost:8000/api/v1/connectors/mycompany/kafka-json-reader/sql?name=my_kafka_stream"# List all tags
curl "http://localhost:8000/api/v1/tags"
# Get category statistics
curl "http://localhost:8000/api/v1/categories"registry/
├── main.py # FastAPI application entry point
├── config.py # Configuration settings
├── database.py # Database connection and session
├── models/ # SQLAlchemy ORM models
├── schemas/ # Pydantic schemas
├── routers/ # API route handlers
├── services/ # Business logic
└── utils/ # Utility functions
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
sqlite+aiosqlite:///./registry.db |
Database connection string |
SECRET_KEY |
(required) | JWT signing key - use a long random string |
DEBUG |
false |
Enable debug mode |
HOST |
0.0.0.0 |
Server bind host |
PORT |
8000 |
Server bind port |
Apache 2.0