Swap providers with zero vendor lock-in. For Django SaaS.
Project description
SwapLayer
The Anti-Vendor-Lock-in Framework for Django
One Interface. Any Provider. Zero Rewrites.
What is SwapLayer?
SwapLayer is a unified infrastructure layer for Django that protects you from vendor lock-in.
Instead of coupling your code directly to Stripe, AWS, or Twilio, you write against one consistent interface and swap providers by changing a single configuration line.
The Problem
# ❌ Tightly coupled - if Stripe fails, you rewrite everything
import stripe
customer = stripe.Customer.create(email='user@example.com')
The Solution
# ✅ Provider-agnostic - swap providers in settings
from swap_layer import get_provider
payments = get_provider('payments')
customer = payments.create_customer(email='user@example.com')
Quick Start
1. Install
SwapLayer has optional dependencies - install only what you need:
# Install with specific providers
pip install swaplayer[stripe] # Just Stripe billing
pip install swaplayer[identity] # Just WorkOS/Auth0
pip install swaplayer[email,sms] # Email + SMS
# Or install everything
pip install swaplayer[all]
Available extras:
stripe- Stripe payment processingidentity- WorkOS/Auth0 OAuth/SSOemail- Enhanced email (django-anymail)sms- Twilio/AWS SNS messagingaws- AWS services (S3, SNS)mcp- AI assistant integrationall- Everything
2. Configure
# settings.py
from swap_layer.settings import SwapLayerSettings
SWAPLAYER = SwapLayerSettings(
email={'provider': 'django'},
payments={'provider': 'stripe', 'stripe': {'secret_key': '...'}},
sms={'provider': 'twilio', 'twilio': {'account_sid': '...'}},
storage={'provider': 'django'},
)
3. Use Anywhere
from swap_layer import get_provider
# Email
get_provider('email').send(to='user@example.com', subject='Hello')
# Payments
get_provider('payments').create_customer(email='user@example.com')
# SMS
get_provider('sms').send(to='+1555555', message='Welcome!')
Features
| Module | Status | Description |
|---|---|---|
| ✅ Production | SMTP, SendGrid, Mailgun, SES | |
| Payments | ✅ Production | Stripe (PayPal planned) |
| SMS | ✅ Production | Twilio, AWS SNS |
| Storage | ✅ Production | S3, Azure, GCS, Local |
| Identity | 🚧 Beta | OAuth/SSO, KYC Verification |
| MCP Server | ✅ Production | AI Assistant Integration |
🤖 AI Assistant Integration
SwapLayer includes an MCP (Model Context Protocol) server that exposes provider management as tools for AI assistants:
# Install with MCP support
pip install 'swaplayer[mcp]'
# Run the MCP server
swaplayer-mcp
AI assistants can now help you:
- Configure and switch providers through conversation
- Send test emails/SMS to verify integrations
- Get provider setup instructions and capabilities
- Inspect your current configuration
Perfect for AI-powered development workflows! → MCP Documentation
📚 Full Documentation
→ docs/ - One doc per module:
- Email - Email providers
- Billing - Payment processing
- SMS - SMS messaging
- Storage - File storage
- Identity Platform - OAuth/SSO
- Identity Verification - KYC
- MCP Server - AI assistant integration
- Architecture - Design patterns
- Contributing - Help improve SwapLayer
Why SwapLayer?
✅ Avoid Vendor Lock-in - Never get trapped by a single provider
✅ Consistent Interface - Same API across all vendors
✅ Type Safe - Pydantic validation catches errors early
✅ Battle Tested - Wraps proven tools (django-storages, django-anymail)
✅ Zero Rewrites - Swap providers with configuration changes only
✅ AI-Powered - Built-in MCP server for AI assistant integration
License
MIT - Because avoiding vendor lock-in should be free.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swaplayer-0.3.0.tar.gz.
File metadata
- Download URL: swaplayer-0.3.0.tar.gz
- Upload date:
- Size: 157.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93f4bb60bb53cdde4f786f18101c7a550bd505f63ac4dcc7a902000eab4e77b6
|
|
| MD5 |
69e20767e24859bfd585cf95f95dc0e0
|
|
| BLAKE2b-256 |
1b8549704ade4d57b9168783adb867ae1e87ffa17647a6362b901233c60a5ef8
|
Provenance
The following attestation bundles were made for swaplayer-0.3.0.tar.gz:
Publisher:
publish.yaml on Tunet-xyz/swap_layer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
swaplayer-0.3.0.tar.gz -
Subject digest:
93f4bb60bb53cdde4f786f18101c7a550bd505f63ac4dcc7a902000eab4e77b6 - Sigstore transparency entry: 1462006443
- Sigstore integration time:
-
Permalink:
Tunet-xyz/swap_layer@8c8498f4d0b8f526c7ab75ac78ce6f1442a2804a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Tunet-xyz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@8c8498f4d0b8f526c7ab75ac78ce6f1442a2804a -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file swaplayer-0.3.0-py3-none-any.whl.
File metadata
- Download URL: swaplayer-0.3.0-py3-none-any.whl
- Upload date:
- Size: 139.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a9d7c639e8f5f459fe038e504da837e01ead22fee6aa0be78108484a0ef60a0
|
|
| MD5 |
13fc04846353dfede26d198e58c24e6a
|
|
| BLAKE2b-256 |
50dbc31325fa6e1286de396d7d6d85cd48982eac383f003a4d3b2c5bb3e3e7a6
|
Provenance
The following attestation bundles were made for swaplayer-0.3.0-py3-none-any.whl:
Publisher:
publish.yaml on Tunet-xyz/swap_layer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
swaplayer-0.3.0-py3-none-any.whl -
Subject digest:
8a9d7c639e8f5f459fe038e504da837e01ead22fee6aa0be78108484a0ef60a0 - Sigstore transparency entry: 1462006459
- Sigstore integration time:
-
Permalink:
Tunet-xyz/swap_layer@8c8498f4d0b8f526c7ab75ac78ce6f1442a2804a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Tunet-xyz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@8c8498f4d0b8f526c7ab75ac78ce6f1442a2804a -
Trigger Event:
workflow_dispatch
-
Statement type: