Automatic GitHub issue creation + PR fix on runtime errors
Project description
Splat
Automatic GitHub issue creation on application crashes with optional Claude Code auto-fix.
Features
- Zero-config crash reporting - Add two lines, get GitHub issues on errors
- True deduplication - Checks GitHub before creating, works across restarts/instances
- Rich context - Rolling log buffer, framework-specific request context, custom metadata
- Auto-fix ready - One command installs a GitHub Action that uses Claude Code to fix reported bugs
Installation
pip install py-splat
Quick Start
Basic Usage
from splat import Splat
splat = Splat(repo="owner/repo", token="ghp_...")
try:
do_something()
except Exception as e:
await splat.report(e) # async - use in async context
With Context
try:
process_order(user)
except Exception as e:
await splat.report(
e,
context={
"user_id": user.id,
"endpoint": "/checkout",
},
)
Flask Integration
from flask import Flask
from splat.middleware.flask import SplatFlask
app = Flask(__name__)
splat = SplatFlask()
splat.init_app(app, repo="owner/repo", token="ghp_...")
FastAPI Integration
from fastapi import FastAPI
from splat.middleware.fastapi import SplatMiddleware
app = FastAPI()
app.add_middleware(SplatMiddleware, repo="owner/repo", token="ghp_...")
Configuration
Environment Variables
| Variable | Description | Default |
|---|---|---|
SPLAT_GITHUB_TOKEN |
GitHub API token | (required) |
SPLAT_GITHUB_REPO |
Repository (owner/repo) | (required) |
SPLAT_ENABLED |
Enable/disable reporting | true |
SPLAT_LOG_BUFFER_SIZE |
Log buffer capacity | 200 |
SPLAT_LABELS |
Issue labels (comma-separated) | bug,splat |
SPLAT_VERCEL_SECRET |
Vercel webhook verification secret | (optional) |
SPLAT_VERCEL_WEBHOOK_PATH |
Vercel webhook endpoint path | /splat/logs |
SPLAT_VERCEL_LOG_TTL |
Seconds to keep Vercel logs in memory | 60 |
pyproject.toml
[tool.splat]
repo = "owner/repo"
labels = ["bug", "splat", "auto-fix"]
log_buffer_size = 500
Precedence
Configuration is loaded with precedence: Programmatic > pyproject.toml > Environment Variables > Defaults
CLI
# Interactive setup wizard
splat init
# Install auto-fix GitHub Action
splat install-autofix
Auto-Fix with Claude Code
Splat can automatically create PRs to fix reported bugs using Claude Code:
-
Install the auto-fix workflow:
splat install-autofix -
Add
ANTHROPIC_API_KEYto your repository secrets -
Add
auto-fixto your labels:[tool.splat] labels = ["bug", "splat", "auto-fix"]
When an error is reported, Claude Code will analyze the issue, write a failing test, implement a fix, and open a PR.
Vercel Log Integration
Splat can capture Vercel runtime logs via Log Drain webhooks, providing precise logs for each failed request.
Setup
-
Configure your app:
Flask (webhook auto-registered):
from flask import Flask from splat.middleware.flask import SplatFlask app = Flask(__name__) splat = SplatFlask() splat.init_app(app, repo="owner/repo", token="ghp_...") # Automatically registers /splat/logs webhook
FastAPI (manual middleware wrapping to share Splat instance):
from fastapi import FastAPI from splat.middleware.fastapi import SplatMiddleware from splat.webhooks.fastapi import create_webhook_router app = FastAPI() # Add webhook router first middleware = SplatMiddleware(app, repo="owner/repo", token="ghp_...") app.include_router(create_webhook_router(middleware.splat)) # Use middleware.app or wrap app manually if needed
-
Add Log Drain in Vercel:
- Go to your project's Settings → Log Drains
- Create a new Log Drain:
- Delivery format: JSON
- Endpoint:
https://your-app.vercel.app/splat/logs - Sources: Lambda, Edge (runtime logs)
-
(Recommended) Add verification secret:
# Generate a secret export SPLAT_VERCEL_SECRET=$(openssl rand -hex 32) # Add to your environment variables and Vercel Log Drain config
How It Works
- Vercel pushes runtime logs to your
/splat/logsendpoint - Splat stores logs keyed by request ID (from
x-vercel-idheader) - When an error occurs, middleware captures the request ID
splat.report()fetches logs for that specific request- GitHub issue includes the exact logs for the failed request
Logs automatically expire after 60 seconds (configurable via SPLAT_VERCEL_LOG_TTL).
Issue Format
Created issues include:
- Error type, message, file, line, and function
- Full traceback
- Optional context (custom metadata you provide)
- Recent logs (last 200 entries by default)
- Unique signature for deduplication
License
MIT
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 py_splat-0.1.7.tar.gz.
File metadata
- Download URL: py_splat-0.1.7.tar.gz
- Upload date:
- Size: 99.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d86cc934c412439416b68c495fece65dfeaef81dc1a47e126b85da9c43fe240
|
|
| MD5 |
1781706f237361f222cf53e46ce2d83e
|
|
| BLAKE2b-256 |
e744888a3cd8429227eb11986d7adb97e3a4719c9c70fcd874e0a8b69754f59f
|
File details
Details for the file py_splat-0.1.7-py3-none-any.whl.
File metadata
- Download URL: py_splat-0.1.7-py3-none-any.whl
- Upload date:
- Size: 36.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64a597d641a17e9929884fea2b761a9f75732af92cdd1fef978ea196c3b8570e
|
|
| MD5 |
b2dbfdc8a1f2bf89ab1720cffc466c0f
|
|
| BLAKE2b-256 |
d17255efd9a43d6c52c446dfdc2880ecab7e120ed42d0acd2ee08e45a3e5b04b
|