github antonio-ivanovski/spliit-cloud v2.2.0

latest release: v2.2.1
2 hours ago

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

Webhooks section in account settings with an enabled endpoint and its subscribed events

Create an endpoint with per-event selection

Create webhook dialog with name, endpoint URL, enabled toggle, event selection, and involved-only filter

Test the feature on webhook.site

Signed Spliit event arriving at webhook.site, showing the signature headers and JSON payload

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

Create a group form with the Group emoji row and the Group color palette, airplane emoji and red color selected

Emoji rails and color-tinted cards on the home screen

Group card on the home screen showing the airplane emoji on a red-tinted rail

What's Changed

🚀 Features

  • Added outbound webhooks: subscribe any HTTPS endpoint to expense created/updated/deleted events, with signed payloads, a personal viewer block, involved-only filtering, automatic retries, delivery history with manual redelivery, test sends, secret rotation, and a Create/Edit/View setup dialog with delete confirmation (e2d992ad by @antonio-ivanovski)
  • Added SSO-only mode and made SMTP optional for self-hosters: set ENABLE_EMAIL_AUTH=false to hide password + magic-link sign-in (endpoints reject with EMAIL_AUTH_DISABLED, invite-only signup still passes by pending email match, boot fails early unless an SSO/social provider is configured); without SMTP_HOST/EMAIL_FROM no 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 (68c7de14 by @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 (b7bc3d30 by @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 (70a6febb by @antonio-ivanovski)
  • Made the instance easier for agents and machines to consume: agent_auth metadata in OAuth discovery points at dynamic client registration and the /auth.md consent flow, and the public static pages (/, /terms, /privacy, /imprint, /sponsor) serve Markdown companions to requests that explicitly accept text/markdown while browsers keep receiving HTML (ef31cebe by @antonio-ivanovski)

🐛 Bug fixes

  • Close notification onboarding immediately when enabling push, keep setup running in the background, and reopen only if setup fails (3dbe326d by @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 (c87c6aba by @antonio-ivanovski)
  • Fixed trailing slashes in URL envs (APP_URL=https://host/ flowed into WEB_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 (8288fce3 by @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 (ca15e73b by @antonio-ivanovski)
  • Fixed toasts rendering inline below the footer; they now float at the top (centered on mobile, top-right on desktop) (519dd387 by @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 (114f33c4 by @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 (9b8edff4 by @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, 0fdaf376 by @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.0 or follow stable with SPLIIT_TAG=latest — see compose.yaml

Don't miss a new spliit-cloud release

NewReleases is sending notifications on new releases.