Repository navigation
Releases: ByteSendApp/ByteSend
Releases · ByteSendApp/ByteSend
Release list
v0.9.3 - Random Patches
Added
- Receive on the domain itself: as well as a subdomain like
reply.acme.com, a domain can now receive atanything@acme.com. Because that sends all of the domain's mail to ByteSend, setup shows where its mail goes today (Google Workspace, Microsoft 365 and so on) and asks you to confirm first
Changed
- Homepage: the full pricing section and comparison table are replaced by a short pricing summary linking to
/pricing, and an Explore section linking to receiving, the SMTP relay, the free tools, open source, security and the comparison
v0.9.2: Merge pull request #58 from ByteSendApp/develop
Added
- Pricing page at
/pricing: the plan cards and calculator, plus every plan limit side by side, what's included on every plan, and a pricing FAQ - Compare page at
/compare: the full feature comparison with Resend, SendGrid, Postmark and Amazon SES, when each is the better fit, and how to switch - Receiving page at
/receiving: how receiving works, what people build with it (reply by email, invoice parsing, support inboxes, polling the API) and each plan's allowance - Free DMARC checker at
/tools/dmarc: check any domain's DMARC record, see what's wrong in plain language, and get a record to publish - Free SPF and DKIM checkers at
/tools/spfand/tools/dkim, with a/toolspage listing all three. SPF counts DNS lookups through every include against the limit of 10; DKIM finds keys under common selectors and checks their strength - SMTP relay page at
/smtp: connection settings and ready-to-paste setup for Node, Laravel, Django, Rails and WordPress - Open source page at
/open-source: what the AGPL means for you, how to run ByteSend yourself, and how cloud and self-hosted compare - Security page at
/security: how your account, email and data are protected, who processes your data, and how to report a vulnerability - Receiving in the TypeScript SDK (
bytesend-js0.2.0):bytesend.inbound.list(),get()anddownloadAttachment(), withemail.receivedwebhooks verified and typed throughbytesend.webhooks()
Changed
- The website footer is grouped into Product, Features, Free tools, Resources and Company
Fixed
- The DPA and privacy policy list the same sub-processors: NodeByte Hosting, Amazon Web Services (now including S3 for received email), Stripe and Simple Analytics
v0.9.1: Merge pull request #57 from ByteSendApp/develop
Added
- Receiving on the stats page: emails received, DMARC reports read and the messages they covered over the last 30 days, with a daily chart
- Receiving health check at
/api/health/inboundfor status pages. A test email is sent to a hosted address every 10 minutes, so the check covers the whole receiving path, along with the receipt rule and the processing queue
Fixed
- The website no longer stops responding to taps on phones while the homepage loads. Code samples are now highlighted on the server instead of in the browser
v0.9.0
Added
- Receiving email:
- Every team gets a hosted address that works without DNS changes, with
+tagsto tell senders apart - Receive on a subdomain of your own domain (for example
reply.acme.com) by adding one MX record - New Inbox page with the message, attachments, headers and SPF, DKIM, DMARC, spam and virus results
- New
email.receivedwebhook event, with signed attachment links that last an hour GET /v1/inbound/emailsandGET /v1/inbound/emails/{id}in the API- Replies to email you sent are linked to the original through
inReplyToEmailId - Forwarding rules for an address, a local part or everything
- Monthly allowances on every plan (from 1,000 on Free to 250,000 on Scale); mail is kept for 30 days
- The local SES emulator can deliver test mail to ByteSend
- Every team gets a hosted address that works without DNS changes, with
- DMARC reports:
- Every team gets a report address; add it to your domain's DMARC record and providers' daily reports are read automatically
- New DMARC page: pass rate over time, every server sending as your domains (ByteSend's own traffic marked), and each report in full
- The setup tab shows your current DMARC record and the exact record to publish, keeping your existing policy
- Reports don't count toward your receiving allowance and are kept for 90 days
- Test mode:
- Create test API keys (
bs_test_...) that never send: emails appear in the dashboard marked Test - Deliveries, bounces and complaints are simulated with real webhooks (flagged
"test": true), chosen by the recipient address - Works before your domain is verified, and doesn't touch usage, bounce rates or suppressions
- Create test API keys (
- Email page: every email has its own page at
/emails/<id>with a larger preview (desktop and mobile widths), all recipients, the domain, campaign and API key it came from, its events, and any replies received in your inbox - Set up DNS on Cloudflare: paste a Cloudflare API token on a domain's page and ByteSend adds the records for you. Existing MX, SPF and DMARC records are never overwritten, and the token isn't stored
- Website: the pricing, features and comparison sections now cover receiving, DMARC reports and test mode, and the homepage has a new backdrop drawn from the ByteSend mark
Fixed
- Batch sends now respect an API key's domain restriction
- Pages no longer run off the right edge on phones: cards and sections fit the screen, and long IDs and file names wrap or are shortened
- Moving a domain that receives email to another sending region keeps receiving working: the identity it receives through is kept, and removed when receiving is turned off or the domain is deleted
- Deleting a domain works again when its Amazon SES identity is already gone, shows an error if it fails, and accepts the name typed in any case (phone keyboards capitalise it)
- Verify again on a verified domain now re-checks its DNS straight away, updates the problem banner, and says what it found. Record rows show a problem the DNS monitor found instead of an old "Verified"
- Moving a domain to another region now waits until its MX record points at the new region. Before, a move could finish with the MX still on the old region, which sent bounces and complaints to the wrong place
- Installing the repo with pnpm 9 no longer fails on Prisma Studio's pnpm 8 requirement, so the web tests run in CI again
v0.8.0
Changed
- Redesigned dashboard, admin and website:
- One consistent look throughout: denser tables, clearer page headers, stat strips and status badges with consistent meanings
- Settings now lives in the main sidebar
- A ⌘K search to jump to any page or domain
- Breadcrumbs that show names instead of IDs
- Error and not-found pages that keep you in the app
- New sign-in and account screens
- The email editor shows emails at inbox width on a white page
- The home page shows a live preview of the product instead of an old screenshot
- Pricing cards in USD, GBP or EUR, and a full site footer
- Domains show their sending region by name and their sent volume and bounce rate for the last 30 days
- Unsubscribe and confirm-subscription pages are plainer and unbranded, since your subscribers see them
Added
- Local SES and SNS emulator (
packages/local-ses-sns), ByteSend's own replacement for the upstream image: answers the SES, SNS and STS calls ByteSend makes, verifies every domain straight away, sends real delivery, bounce and complaint events (via SES's simulator addresses or+bounce/+complaint), and shows captured mail at http://localhost:5350. Published asbytesend/local-ses-snswith the other images
Fixed
- Saving a template failed with "ctx is not defined"
- Self-hosted system emails (invites, sign-in) now send from a verified domain; they checked for statuses that don't exist and always used the first domain
pnpm dx:upfailed because theminio/minioandbytesend/local-ses-snsimages don't exist. It now starts only Postgres, Redis and the local SES emulator; RustFS storage and the containerised app are opt-in profiles. Newpnpm dev:localandpnpm dx:migrateuse.env.local, so local development no longer has to run against production
v0.7.0
Added
- Dashboard overview: the dashboard home now opens with a getting-started checklist, sending status (and exactly why sending is limited, when it is), usage against the monthly and daily limits, 7-day bounce and complaint rates against the pause thresholds, domain health and recent emails, above the existing analytics
- Domain DNS monitoring: verified domains are re-checked twice a day, and if their DKIM, SPF or MAIL FROM records change, team admins are emailed (once the problem shows on two checks in a row) and again when it's fixed. The domain page shows the problem while it lasts
- Usage alerts for paid plans: teams on paid plans are told at 80% and 100% of the emails included in their plan, once each per month
- Team notifications work: Discord, Slack, Teams, Telegram and webhook providers now receive events. Previously nothing was ever sent to them. Domain verified/failed, DNS problems, usage alerts and campaign started/completed go to every provider. Per-email events (sent, delivered, bounced, complained, opened, clicked) and contact events are opt-in per provider and capped at 20 per minute per provider, so a busy team can't flood a channel
- Domain age: new sending domains are looked up over RDAP. Domains registered in the last 30 days score higher in spam protection, and admins are alerted when one is added
- Admins can approve a new team's sending early from the team page
- Scale plan: $90/mo with 500,000 emails included, 30 domains and 50 team members, and the lowest overage rates
- Local prices and tax: Checkout shows set prices in pounds and euros for UK and European customers, and can add VAT and sales tax with Stripe Tax (
STRIPE_AUTOMATIC_TAX=true), including VAT number collection for businesses
Changed
- New pricing, now in US dollars: Starter (was Hobby) $5/mo for 25,000 emails, Pro $20/mo for 100,000 and Scale $90/mo for 500,000, with lower overage rates. Existing subscribers keep the price they signed up at
- Free plan now includes 5,000 emails a month and 200 a day (was 12,500 a month and 5,000 a day)
- Lite and Lifetime are no longer sold. Teams already on them keep their plan, limits and price
- New-account limit: free teams can send 50 emails a day during their first 7 days. Paying teams, custom plans and admin-approved teams are exempt
- The admin panel now uses the main sidebar for its sections instead of a second navigation column
- "Analytics" in the sidebar is now "Overview"
- New logo: the Ribbon (an envelope inside a send arrow) is the main logo, and the Send B monogram is the app icon, favicon and team badge. Both are in
public/brand/as SVGs, wordmarks, app icons and avatars
Fixed
- A subscription's plan is read from its Stripe price, so re-seeding Stripe prices can no longer drop an existing subscriber to the free plan
- Changing plan in the Stripe customer portal now moves the overage prices to the new plan too. Previously only the monthly price changed, so extra emails kept being billed at the old plan's rates
- Removed the unused
stripe-integration.ts, which no longer compiled docker/prod/compose.ymland the Docker README pulledbytesend/webandbytesend/smtp, which don't exist; they now use the publishedbytesend/bytesendandbytesend/smtp-proxyimages- The plans docs listed out-of-date limits and prices (including a 100 emails/month free tier, missing Hobby and Lite plans, and annual billing that isn't offered); they now match the plans in the app
- Sheets and dialogs on phones no longer run off the edge of the screen, and tall dialogs scroll instead of overflowing
- The logo in the site header, footer, sidebar, login, profile setup and loading screens is now the crisp vector mark, instead of an image with a dark tile baked in
- Errors from notification provider settings (e.g. "Provider not found", invalid webhook URLs) now reach the dashboard and API with their message instead of an empty error
v0.6.0
Added
- Discord bot auto-roles and event log: new members get the Members role (after accepting the rules) and bots get the Bots role; joins, leaves, member and role changes, bans, deleted, edited and bulk-deleted messages, channels, threads, roles, invites and voice activity are logged to
EVENT_LOG_CHANNEL_ID - Blocklist (Admin → Blocklist) for email addresses, email domains and sending domains. Blocked addresses can't sign up, become an account email or a backup email, and blocked sending domains (and their subdomains) can't be added by any team
- Ban evasion detection: banning a user now opens a dialog that blocks their email addresses (including
+and Gmail dot aliases), optionally blocks their sending domains, and offers to ban related accounts. The users list flags Ban evasion (same mailbox as a banned user) and Possible evasion (same name), and each user page lists related accounts. Unbanning removes what the ban blocked. Users banned before this release have their addresses blocked automatically - Admins get a Discord alert when a blocked sign-up is refused, and when a domain on a shared namespace is added
Security
- Sending domains on dynamic-DNS, tunnel and free-hosting services (DynDNS, No-IP, DuckDNS, ngrok,
github.io,vercel.appand similar) can no longer be added on ByteSend Cloud, and email from such hostnames is held for review - Spam protection recognises phishing phrases in German, French, Spanish, Italian and Dutch, and more impersonated brands (eBay, Kleinanzeigen, European banks and couriers)
Fixed
- Signing in by email with a banned or blocked address now shows why, instead of claiming a sign-in link was sent
v0.5.0
Added
- ByteSend Discord bot (
apps/discord-bot, Go) for the support server:- Presence mirrors status.bytesend.cloud
- Commands:
/docs,/faq,/status,/stats,/linksand/roles - Moderation:
/purge,/warn,/timeout,/untimeout,/kickand/ban, with a mod log; they refuse to act on anyone whose top role is at or above the moderator's - AutoMod for invite links, mass mentions and repeated messages
- Automatic FAQ answers in support channels
- Custom emojis from the application
GET /api/stats(Cloud only): the open stats as JSON, cached for an hour- Discord linked roles: members connect their ByteSend account at
/api/discord/linked-rolesto claim roles based on having an account, being on a paid plan, emails sent, or account age. Enable withDISCORD_LINKED_ROLES_CLIENT_IDandDISCORD_LINKED_ROLES_CLIENT_SECRET
v0.4.4
Added
- Delivery callback diagnostics on Admin → SES regions: per region, the SNS subscription state and endpoint, each configuration set's event destination, when the last callback arrived, and any callbacks rejected for an unknown topic, with a one-click Repair that resubscribes this site's callback URL and re-enables or re-points broken event destinations
Fixed
- Adding an SES region with the full callback URL (as the old "Callback URL" label suggested) no longer produces
/api/ses_callback/api/ses_callback; the field is now labelled "Site URL" and either form is accepted - Sent counts in analytics no longer depend on SES callbacks: an email is counted when ByteSend hands it to SES, so totals stay accurate even if SNS notifications stop arriving
Changed
- Node.js SDK 0.1.4: package metadata points at the new
ByteSendApp/ByteSendrepository, and releases publish from it with provenance
v0.4.3
Added
S3_COMPATIBLE_REGIONsets the storage bucket's region. AWS S3 needs the bucket's real region (e.g.us-east-1); R2 and MinIO keep working with the defaultauto- Python SDK 0.1.3:
client.campaigns.delete(), matching the Node.js and Go SDKs - Go SDK 0.3.3:
ErrorResponsenow includes the HTTPStatusCode
Changed
- ByteSend now lives at github.com/ByteSendApp/ByteSend; docs, READMEs, the site, the status page and package metadata link there
- Go SDK module path is now
github.com/ByteSendApp/ByteSend/packages/go-sdk, matching where the code lives. Update imports fromgithub.com/nodebyteltd/bytesend-go. A new workflow tagspackages/go-sdk/v<version>and publishes to the Go module proxy whenever the SDK version changes onmain - Docker images publish to the GitHub Container Registry under the repository owner's namespace (
ghcr.io/bytesendapp/…) instead of a hard-codedghcr.io/bytesend/…the workflow token couldn't push to - SDK-first docs: the campaigns, campaign personalization, contact books, double opt-in, rate limits and error codes guides now show every example in Node.js, Python and Go, with cURL as a fallback tab, instead of cURL or raw
fetchonly
Fixed
- Changelog links render as links instead of raw Markdown
- Go SDK API errors now carry the real error code and message (e.g.
RATE_LIMITED); previously every API error came back asINTERNAL_SERVER_ERRORwith only the HTTP status text - Docs examples that didn't match the SDKs: the contact books guide read
book.idinstead of the{ data, error }result and calledcontacts.upsertwithout a contact ID, and the error-codes guide usedtry/catchand a PythonAPIErrorclass that don't exist - Open stats shows exact email counts instead of rounded figures that looked inconsistent with the totals beneath them
- Em-dashes removed from site, dashboard, status page and docs copy