Skip to main content

lexigram-notification

SMS, push, and email notification delivery with Named DI multi-backend support for the Lexigram Framework.


Overview

lexigram-notification provides a unified notification delivery system with SMS (Twilio), push (FCM, APNS), email (SMTP, SendGrid), and per-user inbox storage. The package is organized into three subpackages: root (SMS/push), mail (email), and inbox (in-app notification storage) — each wired separately via its own module.


Full documentation: docs.lexigram.dev

Install

uv add lexigram-notification

# With SendGrid email
uv add "lexigram-notification[sendgrid]"

# With Twilio SMS
uv add "lexigram-notification[twilio]"

# With APNS push
uv add "lexigram-notification[apns]"

Quick Start

from lexigram.di.module import Module, module
from lexigram.notification import NotificationModule
from lexigram.notification.config import (
    FCMDriverConfig,
    NamedPushConfig,
    NamedSMSConfig,
    NotificationConfig,
    TwilioDriverConfig,
)
from lexigram.notification.mail import MailerModule
from lexigram.notification.mail.config import (
    MailerConfig,
    NamedMailerConfig,
    SMTPDriverConfig,
)
from lexigram.notification.inbox import InboxConfig, InboxModule


@module(
    imports=[
        NotificationModule.configure(
            NotificationConfig(
                sms_backends=[
                    NamedSMSConfig(
                        name="alerts",
                        primary=True,
                        driver="twilio",
                        twilio=TwilioDriverConfig(
                            account_sid="AC...",
                            auth_token="secret",
                            from_number="+15550000000",
                        ),
                    )
                ],
                push_backends=[
                    NamedPushConfig(
                        name="mobile",
                        primary=True,
                        driver="fcm",
                        fcm=FCMDriverConfig(server_key="fcm-key"),
                    )
                ],
            )
        ),
        MailerModule.configure(
            MailerConfig(
                backends=[
                    NamedMailerConfig(
                        name="transactional",
                        primary=True,
                        driver="smtp",
                        from_email="noreply@example.com",
                        smtp=SMTPDriverConfig(host="smtp.example.com", port=587),
                    )
                ]
            )
        ),
        InboxModule.configure(InboxConfig(store_backend="memory")),
    ]
)
class AppModule(Module):
    pass

Configuration

Zero-config usage: Call any .configure() with no arguments to use all defaults.

Option 1 — YAML file

# application.yaml
notification:
  sms_backends: []
  push_backends: []

mailer:
  backends:
    - name: transactional
      primary: true
      driver: smtp
      from_email: "noreply@example.com"
      smtp:
        host: "smtp.example.com"
        port: 587

inbox:
  store_backend: "database"
  retention_days: 30

Option 2 — Profiles + Environment Variables (recommended)

export LEX_NOTIFICATION__ENABLED=true
export LEX_NOTIFICATION__INBOX__STORE_BACKEND=database

Option 3 — Python

from lexigram.notification import NotificationModule
from lexigram.notification.config import NotificationConfig
from lexigram.notification.mail import MailerModule
from lexigram.notification.mail.config import MailerConfig, NamedMailerConfig, SMTPDriverConfig
from lexigram.notification.inbox import InboxModule
from lexigram.notification.inbox.config import InboxConfig

NotificationModule.configure(NotificationConfig())
MailerModule.configure(
    MailerConfig(
        backends=[
            NamedMailerConfig(
                name="transactional",
                primary=True,
                driver="smtp",
                from_email="noreply@example.com",
                smtp=SMTPDriverConfig(host="smtp.example.com", port=587),
            )
        ]
    )
)
InboxModule.configure(InboxConfig(store_backend="database"))

Config reference

Field Default Env var Description
notification.sms_backends [] LEX_NOTIFICATION__SMS_BACKENDS Named SMS backend configs
notification.push_backends [] LEX_NOTIFICATION__PUSH_BACKENDS Named push backend configs
mailer.backends[n].driver LEX_NOTIFICATION__MAILER__BACKENDS__N__DRIVER Mailer driver: smtp, sendgrid
mailer.backends[n].from_email LEX_NOTIFICATION__MAILER__BACKENDS__N__FROM_EMAIL Sender email address
inbox.store_backend "database" LEX_NOTIFICATION__INBOX__STORE_BACKEND Inbox store: database or memory
inbox.retention_days 30 LEX_NOTIFICATION__INBOX__RETENTION_DAYS Days to retain inbox messages
inbox.max_page_size 50 LEX_NOTIFICATION__INBOX__MAX_PAGE_SIZE Max messages returned per page

Module Factory Methods

Method Description
NotificationModule.configure(config) Register SMS and push backends; exports SMSChannelProtocol, PushChannelProtocol
NotificationModule.stub() Empty config — no backends configured
MailerModule.configure(config) Register named mailer backends; exports MailerProtocol
MailerModule.stub(config=None) Empty or caller-supplied config for tests
InboxModule.configure(config) Register InboxStoreProtocol and InboxService
InboxModule.stub() In-memory inbox for tests

Key Features

  • SMS delivery — Twilio backend via TwilioSMS
  • Push delivery — FCM and APNS backends with send_batch() support
  • Email delivery — SMTP (blocking, runs in executor) and SendGrid REST API
  • Retrying mailer — wraps any MailerProtocol with exponential backoff and delivery-store tracking
  • Per-user inbox — SQL or in-memory backend with InboxService (send, get_inbox, mark_read, delete, count_unread)
  • Named DI multi-backend — multiple backends registered via Annotated[QueueProtocol, Named("events")]

Key Source Files

File What it contains
src/lexigram/notification/module.py NotificationModule.configure(), .stub()
src/lexigram/notification/config.py NotificationConfig, NamedSMSConfig, NamedPushConfig
src/lexigram/notification/di/provider.py NotificationProvider
src/lexigram/notification/mail/module.py MailerModule.configure(), .stub()
src/lexigram/notification/mail/config.py MailerConfig, NamedMailerConfig, SMTPDriverConfig
src/lexigram/notification/mail/di/provider.py MailerProvider
src/lexigram/notification/inbox/module.py InboxModule.configure(), .stub()
src/lexigram/notification/inbox/config.py InboxConfig
src/lexigram/notification/inbox/di/provider.py InboxProvider
src/lexigram/notification/inbox/service.py InboxService

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lexigram_notification-0.1.2-py3-none-any.whl (61.3 kB view details)

Uploaded Python 3

File details

Details for the file lexigram_notification-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for lexigram_notification-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 af6d33c5f17acbe88eb5ccf1aeab13d3481b5af6823d8bd77a449e8a97919983
MD5 c7b2ebf3c5db1f9e5bcc6294838ecc26
BLAKE2b-256 657247e1e27de5ea03fb86228c72bf104d1f0c9d2dc6a603b902cfe5bbc6da26

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5009

1 file

0.1.5007

2 files

0.1.5002

2 files

0.1.5001

2 files

0.1.3007

1 file

0.1.3006

1 file

0.1.3005

1 file

0.1.4

2 files

This release

0.1.2 This release

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page