Changelog
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Added
- (None yet)
Changed
- (None yet)
Deprecated
- (None yet)
Removed
- (None yet)
Fixed
- (None yet)
Security
- (None yet)
0.1.8 - 2026-02-18
Added
- Demo mode — local sandbox provider for trying NornWeave without email credentials or a real domain:
nornweave api --demoCLI flag for zero-configuration quickstart (no.envfile needed)DemoAdapteremail provider (EMAIL_PROVIDER=demo) with synthetic message IDs, no real deliveryPOST /v1/demo/inboundendpoint to simulate inbound emails for testing andwait_for_replyflows- Auto-creates
demo@demo.nornweave.localinbox on startup - Loopback delivery: emails sent to demo inboxes are automatically delivered back as inbound messages
- Domain defaults to
demo.nornweave.localwhen in demo mode
0.1.7 - 2026-02-09
Added
- Sample Email MCP Agent (
mcp_ai_agents/email_mcp_agent/) demonstrating a customer-support use case with NornWeave’s MCP tools - FAQ entries comparing NornWeave to closed-source alternatives
Changed
- Default database driver to SQLite with auto-table-creation for zero-config quickstart
- SQL-agnostic table creation in ORM for broader database compatibility
Fixed
- Validate
EMAIL_DOMAINat inbox creation, returning HTTP 422 when missing instead of creating inboxes with empty domains - Validate provider credentials in
get_email_provider()dependency, returning a clear HTTP 422 before constructing adapters with missing API keys or hostnames - Surface email send errors with
status="failed"and error details instead of silently suppressing exceptions - Startup warnings when
EMAIL_DOMAINis unset or selected provider is missing required credentials - Comprehensive documentation fixes: quickstart flow,
.env.exampleaccuracy, removed misleadingAuthorization: Bearerheaders from curl examples, addedEMAIL_DOMAINcallouts to provider guides
0.1.6 - 2026-02-07
Added
- Global send rate limiting for outbound email. Two new env vars (
GLOBAL_SEND_RATE_LIMIT_PER_MINUTE,GLOBAL_SEND_RATE_LIMIT_PER_HOUR) cap sends per rolling minute/hour. Exceeding returns HTTP 429 withRetry-Afterheader. In-memory sliding-window counters — no Redis required. - Domain-level allow/blocklist filtering for inbound and outbound email. Four new env vars (
INBOUND_DOMAIN_ALLOWLIST,INBOUND_DOMAIN_BLOCKLIST,OUTBOUND_DOMAIN_ALLOWLIST,OUTBOUND_DOMAIN_BLOCKLIST) accept comma-separated regex patterns. Blocklist takes precedence. Inbound rejections returndomain_blocked; outbound rejections return HTTP 403.
0.1.5 - 2026-02-06
Added
- IMAP/SMTP email provider (
EMAIL_PROVIDER=imap-smtp): send via SMTP and receive via IMAP polling, connecting to any standard mail server (Gmail, Office 365, Fastmail, self-hosted, etc.) without a transactional email account - Shared
ingest_message()function inverdandi/ingest.pyunifying inbound email processing across all providers - RFC 822 email parser (
verdandi/email_parser.py) for parsing raw IMAP messages intoInboundMessageobjects imap_poll_statedatabase table for persistent IMAP UID tracking across restartsPOST /v1/inboxes/{inbox_id}/syncendpoint for on-demand IMAP sync- Configurable IMAP post-fetch behavior:
IMAP_MARK_AS_READandIMAP_DELETE_AFTER_FETCHsettings - Background IMAP poller with exponential backoff reconnect, managed by FastAPI lifespan
0.1.4 - 2026-02-05
Added
- LLM Thread Summaries - Automatic thread summarization using your LLM provider:
- Support for OpenAI, Anthropic, and Google Gemini as summarization backends
- Opt-in via
LLM_PROVIDERenv var (disabled by default) - Summaries update on each new message using Talon-cleaned text (no quoted-reply duplication)
- Customizable summarization prompt via
LLM_SUMMARY_PROMPT - Daily token budget with
LLM_DAILY_TOKEN_LIMITto control costs summaryfield on Thread and ThreadItem in REST API responses- MCP resources include summaries for agent triage workflows
- New optional dependency extras:
pip install nornweave[openai],[anthropic],[gemini], or[llm]for all
- Expanded MessageResponse - API message responses now include all email metadata fields:
subject,from_address,to_addresses,cc_addresses,bcc_addresses,reply_to_addressestext,html,content_clean,timestamp,labels,preview,sizein_reply_to,references,metadata
- Flexible message search - Enhanced
GET /v1/messagesendpoint:- Make
inbox_idoptional, addthread_idfilter - Text search (
qparameter) across subject, body, sender, and attachment filenames - Pagination support with
totalcount in response
- Make
- MCP
list_messagestool - New tool for listing messages with filters - Enhanced
search_emailMCP tool - Now supportsthread_idfilter and returns expanded message data - Attachment storage adapters - Pluggable storage backends for email attachments:
LocalFilesystemStorage- Store attachments on local filesystem (default)DatabaseBlobStorage- Store as BLOBs in PostgreSQL/SQLite databaseS3Storage- Store in AWS S3 or S3-compatible storage (MinIO, DigitalOcean Spaces)GCSStorage- Store in Google Cloud Storage
- Attachment API endpoints - New REST API for attachment management:
GET /v1/attachments- List attachments by message, thread, or inboxGET /v1/attachments/{id}- Get attachment metadata with download URLGET /v1/attachments/{id}/content- Download attachment content (binary or base64)
- Attachment MCP tools - New MCP tools for AI agents:
send_email_with_attachments- Send emails with file attachmentslist_attachments- List attachments for a message, thread, or inboxget_attachment_content- Retrieve attachment content as base64
- Send messages with attachments - API and MCP support for sending emails with attachments (base64 encoded)
- Signed URLs - Secure, time-limited URLs for attachment downloads (local/database storage)
- Presigned URLs - Native cloud provider URLs for S3/GCS storage backends
- MinIO support - S3-compatible storage for development/testing in docker-compose
- PyPI package extras - New installation options:
pip install nornweave[s3]for S3 storage supportpip install nornweave[gcs]for GCS storage support
Changed
- Updated
docker-compose.ymlwith MinIO service for S3-compatible attachment storage testing - Extended database schema with
attachmentstable for metadata storage - Updated component architecture diagrams to include attachment storage
0.1.3 - 2026-02-05
Fixed
- Email provider dependency loading - Lazy-import only the adapter for the configured provider in
get_email_provider, so optional dependencies (e.g.cryptographyfor SendGrid) are not required when using other providers (Mailgun, Resend, SES). Fixes 500 when sending email with Resend when SendGrid’s dependencies were not installed.
0.1.2 - 2026-02-04
Added
- PyPI packaging - NornWeave is now available on PyPI:
- Install with
pip install nornweave(base package with SQLite) - Install with
pip install nornweave[postgres]for PostgreSQL support - Install with
pip install nornweave[mcp]for MCP server support - Install with
pip install nornweave[all]for all features
- Install with
- GitHub Actions workflow for PyPI publishing with trusted publishing (OIDC)
- Installation validation script (
scripts/validate_install.py)
Changed
- Breaking: PostgreSQL dependencies (
asyncpg,psycopg2-binary) moved from base to[postgres]extra- Existing users running PostgreSQL should install with
pip install nornweave[postgres] - Base package now works with SQLite out of the box without PostgreSQL dependencies
- Existing users running PostgreSQL should install with
- Updated Dockerfile to explicitly install
[postgres,mcp]extras - Updated Makefile with new install targets (
install-postgres,install-mcp,install-prod) - Aligned MCP configuration examples across all documentation
0.1.1 - 2026-02-04
Changed
- MCP Server implementation (Huginn & Muninn) for AI agent integration:
- FastMCP-based server with 2 resources and 4 tools
- Resources:
email://inbox/{id}/recent,email://thread/{id} - Tools:
create_inbox,send_email,search_email,wait_for_reply - Support for three transports: stdio (default), SSE, HTTP
- CLI command
nornweave mcpwith transport selection - Registry metadata for Smithery.ai, mcp-get.com, glama.ai
- Full documentation at
web/content/docs/api/mcp.md
- n8n community node (
n8n-nodes-nornweave) for workflow automation:- NornWeave action node with Inbox, Message, Thread, and Search operations
- NornWeave Trigger node for webhook-based workflow triggers
- Support for email events: received, sent, delivered, bounced, opened, clicked
- Declarative-style implementation following n8n best practices
- Full documentation at
web/content/docs/integrations/n8n.md
- Full SendGrid adapter implementation with:
- Email sending via v3 Mail Send API (threading headers, CC/BCC, attachments)
- Inbound Parse webhook parsing with attachment support
- ECDSA webhook signature verification
- SPF/DKIM result extraction
- Resend webhook and sending implementation
- Full AWS SES adapter implementation with:
- Email sending via SES v2 API with Content.Simple (threading headers, CC/BCC, attachments)
- AWS Signature Version 4 authentication
- Inbound email via SNS notifications with MIME parsing
- SNS signature verification using X.509 certificates
- Automatic SNS subscription confirmation
- SPF/DKIM/DMARC verdict extraction from SES receipt
- Updated SES setup guide with SNS-based inbound email configuration
0.1.0 - 2026-02-02
Initial release. See Unreleased for current development.
Added
- Mailgun webhook and sending implementation
- Implemented Yggdrasil: receives the webhook and routes to the appropriate handler
- Implemented Verdandi for message and thread parsing
- Implemented Skuld, basic API
- Implemented Urdr, basic Storage (PSQL and SQLite)
- E2E testing