This is a complete SaaS application that allows users to create their own AI-powered inbound filter for cold pitches, requests, and opportunities.
Users describe the types of emails they receive, and Kredd generates a structured intake flow with relevant questions for senders to answer. Each submission is then scored, summarized, and ranked against the user’s criteria, helping them quickly identify the opportunities worth reviewing.
Instead of forcing high-volume inbound through a normal email inbox, Kredd gives users a dedicated front door: a unique shareable link they can place in their bio, email signature, website, or social profiles. People can still reach them, but every pitch arrives in a consistent, structured format with AI-generated relevance analysis.
Kredd is designed for anyone who receives more inbound than they can reasonably handle, including podcast hosts, literary agents, creators, investors, executives, advisors, recruiters, and other high-signal professionals. The goal is not to block opportunity, but to make good opportunities easier to find.
Tell Kredd what pitches you receive — AI generates smart filter questions automatically.

Drop it in your LinkedIn, email signature, or website — anyone can pitch you through it.

Every submission is scored, summarized, and surfaced with follow-up suggestions.
- Install Docker and Docker Compose
- Create a
.envfile in the root directory of the repository. This is used to store deployment-specific environment variables. Populate it with the environment variables from the below table. - Start all services with
docker compose up. If you've made code changes, make sure to include the--buildparameter. - Visit
http://localhostfor a local installation of Kredd.
Following Twelve-Factor App principles, Kredd configuration is stored in environment variables.
| Variable | Default | Description |
|---|---|---|
KREDD_CERTBOT_DOMAIN |
None | Domain name to issue a Let's Encrypt certificate for (e.g. kredd.io). Leave unset for HTTP-only local development. |
KREDD_CERTBOT_EMAIL |
None | Email address for Let's Encrypt certificate registration. When set alongside KREDD_CERTBOT_DOMAIN, HTTPS is enabled automatically. |
KREDD_CLAUDE_API_KEY |
None | API key for the Anthropic Claude API. If left empty, LLM-based relevance reasoning is skipped. |
KREDD_CLAUDE_MODEL |
claude-haiku-4-5-20251001 |
Claude model used to generate outreach fit reasoning. |
KREDD_DB_NAME |
kredd |
Name of the database used by the application. |
KREDD_DB_USER |
kredd |
Database username for authentication. |
KREDD_DB_PASSWORD |
add-a-long-password-here |
Password for the database user. |
KREDD_DJANGO_DEBUG |
true |
Enables or disables Django debug mode (should be false in production). |
KREDD_DJANGO_SECRET_KEY |
add-a-different-long-password-here |
Secret key used by Django for cryptographic signing. |
KREDD_GMAIL_ADDRESS |
hello@kredd.io |
Email address to use with Gmail's SMTP server. |
KREDD_GMAIL_APP_PASSWORD |
None | Application key for Gmail SMTP authentication. If left empty, no email notifications are sent. |
KREDD_GMAIL_PORT |
587 |
Port to use for SMTP authentication. For SSL, use 465. For TLS, use 587. |
KREDD_GMAIL_SMTP_HOST |
smtp.gmail.com |
SMTP server hostname used to send outgoing email. |
KREDD_MAX_ATTACHMENT_BYTES |
10485760 (10MB) |
Maximum size (in bytes) per outreach attachment. |
KREDD_MINIO_ACCESS_KEY |
kredd_minio |
Access key (username) for MinIO object storage. |
KREDD_MINIO_SECRET_KEY |
add-a-different-long-password-here |
Secret key (password) for MinIO access. |
KREDD_MINIO_BUCKET |
attachments |
Name of the MinIO bucket used to store uploaded attachments. |
KREDD_RABBITMQ_URL |
amqp://guest:guest@rabbitmq:5672/ |
Connection URL for the RabbitMQ message broker. |
KREDD_PASSWORD_RESET_TTL_SECONDS |
86400 (24h) |
Lifetime of a password reset token, in seconds. |
KREDD_SEMANTIC_SIMILARITY_MODEL |
/app/ml_models/stsb-TinyBERT-L4 |
Model to use for semantic similarity cross encoding. Either a path to directory within the worker container, or a name of the model. If a name is provided, the worker container will attempt to download the model as the service starts. |
KREDD_SITE_URL |
http://127.0.0.1 |
Base URL where the application is hosted. |
The Kredd application requires a number of different services to run. Each one has precise responsibilities. The service definitions are in docker-compose.yml.
| Service | Description |
|---|---|
db |
MySQL database service that stores all persistent application data. It uses a Docker volume (db_data) for durability and includes a healthcheck to ensure readiness before dependent services start. |
rabbitmq |
Message broker used for handling asynchronous tasks and background job queues. Ensures reliable communication between the API and worker services. |
minio |
Object storage service compatible with S3 APIs, used to store file uploads and attachments. Data is persisted via the minio_data volume. |
migrate |
One-off service that runs Django database migrations (manage.py migrate) to set up or update the database schema before the application starts. |
api |
Main Django backend service that exposes the application’s API, handles requests, and coordinates with the database, message broker, and object storage. |
worker |
Background worker service that processes asynchronous jobs (i.e., via RabbitMQ), such as sending emails or handling long-running ML tasks. |
nginx-public |
Frontend web server that serves static assets and acts as a reverse proxy to the API service. In production (when KREDD_CERTBOT_DOMAIN is set), automatically obtains a Let's Encrypt certificate and serves traffic over HTTPS on port 443, redirecting HTTP. |
nginx-spa |
Nginx, only visible on the internal network, that serves the single page React application. This is seperate to the public facing nginx instance, so that we can enable maintenance mode, dedeploy the SPA, and users don't hit internal server errors during redeployment. |
First install Ruff:
sudo snap install ruffThen, configure git to use the .githooks directory. This will trigger the pre-commit formatting hook to run on git commit.
git config core.hooksPath .githooksThe simplest way to do this, is to use a Python environment outside of Docker.
- Create and activate a virtual environment:
$ python3 -m venv env
$ . env/bin/activate- Install the Python requirements into your virtual environment:
$ pip install -r requirements- Generate the migrations
python manage.py makemigrations
