Welcome to v2.2.0! The flagship of this release is outbound webhooks — Spliit can now push expense changes to your own integrations in real time — alongside group emoji and colors, self-hosting hardening with SSO-only and SMTP-optional instances, and a round of mobile and PWA polish.
Highlights
- Outbound webhooks: real-time expense events for your own integrations
- Group emoji and colors: give every group its own look
Outbound webhooks: real-time expense events for your own integrations
Spliit no longer ends at the screen: point it at any HTTPS endpoint you own and every expense creation, update, and deletion arrives as a signed event, seconds after it happens. Build the automations you've been missing — a bot that announces new expenses to your group chat, a dashboard that tracks spending live, a sync job that mirrors expenses into your accounting tool.
Each event is signed so you can verify it really came from your instance, deliveries retry automatically with backoff, and everything is manageable from account settings: per-endpoint event selection, delivery history with manual redelivery, test sends, and secret rotation. Full setup, event reference, and signature verification are documented in docs/webhooks.md. Events even carry a personal viewer block — what you paid, what you owe, and your net on each expense — and endpoints can opt into hearing only about expenses you're personally involved in, so noisy group feeds stay quiet.
This one was requested by the community — thanks to @obsilover for proposing it in #98.
Manage endpoints in account settings
Create an endpoint with per-event selection
Test the feature on webhook.site
Group emoji and colors: give every group its own look
Every group can now carry an emoji and a color. Pick both inline when creating or editing a group — a scrollable emoji row, an 18-color palette, and custom emoji or hex color when the presets don't fit. The emoji shows up on a full-height colored rail on the home screen and in the import destination picker, the color tints the card, and on the group page the same color warms the ambient background in both light and dark mode.
Typing or pasting a single emoji into the group name moves it into the emoji field on the spot, with an Undo right there — existing groups get a one-time offer to lift an emoji out of their name, and Spliit Cloud imports prefill the picker from the export while your edits still win.
Pick an emoji and a color right in the group form
Emoji rails and color-tinted cards on the home screen
What's Changed
🚀 Features
- Added outbound webhooks: subscribe any HTTPS endpoint to expense created/updated/deleted events, with signed payloads, a personal
viewerblock, involved-only filtering, automatic retries, delivery history with manual redelivery, test sends, secret rotation, and a Create/Edit/View setup dialog with delete confirmation (e2d992adby @antonio-ivanovski) - Added SSO-only mode and made SMTP optional for self-hosters: set
ENABLE_EMAIL_AUTH=falseto hide password + magic-link sign-in (endpoints reject withEMAIL_AUTH_DISABLED, invite-only signup still passes by pending email match, boot fails early unless an SSO/social provider is configured); withoutSMTP_HOST/EMAIL_FROMno EMAIL-channel notification is planned, sent, or retried, email invitations stay in-app with a delivery warning, notification settings disable the Email option, and push onboarding prompts for push instead of email fallback — fixes #121 (68c7de14by @antonio-ivanovski) - Laid groundwork for future store packaging with no user-visible change yet: app shortcuts (create group, all expenses, account settings), install screenshots, and Digital Asset Links verification (
b7bc3d30by @antonio-ivanovski) - Added group emoji and color: pick both inline in the group form and the import wizard's new-group step (custom emoji and hex included; Spliit Cloud exports prefill the picker and your edits override), shown as emoji rails, color-tinted cards, and a tinted ambient background in light and dark mode, with live title-emoji extraction including Undo and a one-time prompt to move an emoji out of an existing group's name (
70a6febbby @antonio-ivanovski) - Made the instance easier for agents and machines to consume:
agent_authmetadata in OAuth discovery points at dynamic client registration and the/auth.mdconsent flow, and the public static pages (/,/terms,/privacy,/imprint,/sponsor) serve Markdown companions to requests that explicitly accepttext/markdownwhile browsers keep receiving HTML (ef31cebeby @antonio-ivanovski)
🐛 Bug fixes
- Close notification onboarding immediately when enabling push, keep setup running in the background, and reopen only if setup fails (
3dbe326dby @antonio-ivanovski) - Preserved group share-link invites through password, magic-link, SSO, and anonymous sign-in — invited guests can create accounts on invite-only instances and return to the group to accept — while hardening auth return paths so normalized URLs can never become external redirects — fixes #123 (
c87c6ababy @antonio-ivanovski) - Fixed trailing slashes in URL envs (
APP_URL=https://host/flowed intoWEB_ORIGINS/BETTER_AUTH_URL) producing//groups/…invite links and breaking CORS/trusted-origins sign-in: all URL envs are now stripped to their canonical slash-less form with a startup warning — fixes #120 (8288fce3by @antonio-ivanovski) - Polished the PWA install flow: fixed the dialog's split-button layout with shorter copy, and never show the promotion inside the already-installed app in any display mode (
ca15e73bby @antonio-ivanovski) - Fixed toasts rendering inline below the footer; they now float at the top (centered on mobile, top-right on desktop) (
519dd387by @antonio-ivanovski) - Fixed the expenses timeline hiding the "not involving you" toggle when hidden expenses sit at the top of the list; leading hidden expenses are now included on the first page, and groups with no involving expenses show collapsed hidden runs instead of an empty list (
114f33c4by @antonio-ivanovski) - Fixed item prices in expense details and expense cards showing the group currency for converted expenses; stored item amounts are now shown in the expense's own currency — fixes #125 (
9b8edff4by @antonio-ivanovski) - Fixed mobile search drawers staying behind the iOS software keyboard: currency, category, participant, timezone, and language drawers now fit their visible results, grow to a keyboard-aware maximum, and scroll longer lists within the visible viewport, with native Android keyboard resizing as a progressive enhancement — fixes #124 (
00e831fb,0fdaf376by @antonio-ivanovski)
Full Changelog: v2.1.0...v2.2.0
🐳 Docker images for this release
ghcr.io/antonio-ivanovski/spliit-cloud-api:v2.2.0(also available as:latest)ghcr.io/antonio-ivanovski/spliit-cloud-migrate:v2.2.0(also available as:latest)ghcr.io/antonio-ivanovski/spliit-cloud-worker:v2.2.0(also available as:latest)ghcr.io/antonio-ivanovski/spliit-cloud-mcp:v2.2.0(also available as:latest)ghcr.io/antonio-ivanovski/spliit-cloud-web:v2.2.0(also available as:latest)
Pin with
SPLIIT_TAG=v2.2.0or follow stable withSPLIIT_TAG=latest— seecompose.yaml




