Port-and-adapter bus
Transport details collect here so AI, commerce, and app packages call stable ports instead of vendor SDKs.
- @nebutra/queuedurable delivery and worker contracts
- @nebutra/cachecache provider boundary
- @nebutra/emailResend, Console transports
- @nebutra/uploadsupload validation and storage handoff
- @nebutra/webhookssignature verification and delivery
- @nebutra/collabtenant-partitioned CRDT rooms
What it owns
- Cache, queue, event-bus, saga, notifications, onboarding, and webhooks
- Search, storage, uploads, SMS, TTS, video compose, and integration vault
- Provider-facing adapters that keep apps from depending on vendor SDKs directly
Where it stops
- Business workflows call integration ports; provider details stay here.
- AI and commerce packages reuse adapters without owning transport code.
How we know it works
- queue, cache, webhook, and search package tests
- background job docs and operational smoke checks
In code
1import { getQueue, createJob } from "@nebutra/queue";
2
3const queue = await getQueue();
4
5await queue.enqueue(
6 createJob("email", "send", {
7 to: "[email protected]",
8 template: "welcome",
9 }, { tenantId: org.id }),
10);Packages
17 packages in packages/integrations.
Self-serve operator dashboards — tenants, billing overrides, feature-flag flips — all gated by @nebutra/permissions.
- user:abc123HIT1.2ms
- org:xyz890MISS18ms
- session:f02HIT0.8ms
Tag-based cache with Redis, Upstash, or in-memory backend. Same get/set/invalidate(tags) for serverless and self-hosted.
Realtime co-editing primitives — Yjs CRDT, WebSocket transport, presence cursors. The piece every multi-user app eventually needs.
Render React Email templates, dispatch through Resend / SES / SMTP. One sendEmail(template, props, recipient) for every transactional flow.
- billing.invoice.paid12 subs
- auth.user.signin8 subs
- inventory.item.updated4 subs
- system.error2 subs
In-process pub/sub with cross-app fanout. Used by audit, billing, and notifications to react to commerce events without circular imports.
Per-tenant credential store for OAuth integrations and API keys — Creem, Gmail OAuth, Notion API. KMS-wrapped, refresh-rotated.
- invoice.paid2m ago
payment received
- user.joined18m ago
new teammate
- alert.triggered1h ago
rate limit hit
Multi-channel notifications — in-app, email, push, SMS, chat — with self-hosted direct dispatchers and recipient-preference resolution.
Multi-step product onboarding with persistence — checklist state per user, branching flows, A/B-friendly step gating.
Message queue — Upstash QStash (serverless), with an in-memory fallback for local dev and tests.
Distributed-transaction primitives — compensating actions, retry/rollback hooks, idempotency keys. WIP; ships behind a flag.
Full-text + vector search — pgvector (Postgres). BM25 keyword search and vector cosine search over your own database, no external search infra.
Transactional SMS + OTP verify — Twilio Verify globally, Aliyun for mainland China — same send(to, template) surface, automatic local-prefix routing.
Lower-tier object storage helpers — list, copy, ACL, signed reads. Sits below @nebutra/uploads when you don't need multipart logic.
“Welcome to Nebutra. Let me show you around.”
Text-to-speech with OpenAI / ElevenLabs / Azure backends. Streamed audio, voice presets, per-tenant rate-limit budgets.
Large-file uploads — S3 / R2 multipart, Tus resumable, presigned URLs. Picks the right strategy by file size automatically.
Programmatic video composition via Remotion. Render reels, social cards, and on-brand product GIFs from a JSON spec.
Outbound webhook delivery — self-hosted custom dispatcher, signed payloads, retry with exponential backoff, subscriber portal for self-serve.