From c35a3c2ff0649151d9a7fd706e3bcd30754f9afb Mon Sep 17 00:00:00 2001
From: Jon Staab
Date: Tue, 15 Sep 2026 14:08:39 -0700
Subject: [PATCH] Bump version
---
CHANGELOG.md | 23 +++++++++++++++
android/app/build.gradle | 4 +--
docs/feature_matrix.html | 41 ++++++++------------------
ios/App/App.xcodeproj/project.pbxproj | 16 +++++-----
package.json | 26 ++++++++--------
pnpm-lock.yaml | Bin 399969 -> 399969 bytes
6 files changed, 60 insertions(+), 50 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 609cce95..4b02143e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,28 @@
# Changelog
+# 1.10.0
+
+* Replace the home page with a dashboard of unread conversations, space activity and a network feed
+* Redesign the calendar with month, week and agenda views, and add RSVPs
+* Redesign classifieds as a browsable marketplace
+* Rework threads as one continuous list with unread indicators on every board
+* Add slash commands
+* Add read out loud and voice dictation
+* Add a desktop app with Linux, Windows and macOS packaging
+* Add relay data import and export to the hosting panel
+* Add a mute setting for rooms
+* Show NIP-38 statuses and a pinned note on profiles
+* Rework search dialogs
+* Improve link previews, falling back to an inline link when one fails
+* Persist direct messages so history survives relay retention
+* Add an image by upload or url from one dialog, and play audio attachments inline
+* Let space icons be dragged to reorder in the sidebar
+* Open the space menu in a drawer instead of navigating away from the room
+* Fix push notification delivery, taps and badge counts
+* Update welshman library to 0.10.9
+* Performance improvements to feeds, room chat and reactions
+* Add an end-to-end test suite covering the user story catalog
+
# 1.9.1
* Re-work how claims work under the hood
diff --git a/android/app/build.gradle b/android/app/build.gradle
index f8eadebb..593d1662 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId "social.flotilla"
minSdk rootProject.ext.minSdkVersion
targetSdk rootProject.ext.targetSdkVersion
- versionCode 51
- versionName "1.9.1"
+ versionCode 52
+ versionName "1.11.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
diff --git a/docs/feature_matrix.html b/docs/feature_matrix.html
index 579437c8..5e93aa35 100644
--- a/docs/feature_matrix.html
+++ b/docs/feature_matrix.html
@@ -255,13 +255,13 @@ the story catalog in e2e/USER_STORIES.md.
| Monthly calendar view |
-Not implemented |
-The calendar renders a chronological agenda, centered on today or the next event |
+Implemented |
+CalendarMonth.svelte, CalendarWeek.svelte, CalendarAgenda.svelte; month, week and agenda views, remembered per user |
-| RSVP / ticketing |
-Not implemented |
-No attendance or ticket kinds |
+RSVPs |
+Implemented |
+CalendarRsvp.svelte, app/calendar.ts; NIP-52 going, maybe and can't go. No ticketing or paid attendance |
| Event detail with location and host |
@@ -324,11 +324,6 @@ the story catalog in e2e/USER_STORIES.md.
SpaceMemberMenu.svelte, SpaceMembersBanned.svelte; NIP-86 banpubkey / unbanpubkey. US-095 |
-| Allow list |
-Not implemented |
-Only banning is wired up; no allowpubkey path |
-
-
| Member management |
Implemented |
/spaces/[relay]/directory, SpaceMembersAdd.svelte, RoomMembersAdd.svelte. US-022, US-095 |
@@ -345,13 +340,8 @@ the story catalog in e2e/USER_STORIES.md.
| Granular RBAC / role permissions |
-Partial |
-Roles are assignable labels; effective permissions remain relay-level (member/admin), not per-role grants |
-
-
-| Tier entitlements |
-Partial |
-Hosting plans gate Blossom and LiveKit toggles in app/hosting.ts; not a general entitlement system. US-099, US-100 |
+Implemented |
+Roles are assigned in /spaces/[relay]/directory; a relay extension enforces the per-role permissions |
| Reports and content moderation |
@@ -480,8 +470,8 @@ the story catalog in e2e/USER_STORIES.md.
| Branded desktop app |
-Partial |
-electron/, scripts/build-desktop.sh; dev baseline only, no installers, release pipeline or auto-update |
+Implemented |
+electron/, scripts/package-desktop.mjs; pnpm run package:desktop:linux / :windows / :macos |
| PWA / installable web app |
@@ -559,14 +549,9 @@ the story catalog in e2e/USER_STORIES.md.
-| SAML / OIDC / SCIM / Workspace SSO |
-Not implemented |
-No enterprise identity provider integration |
-
-
| Email / OTP sign-in |
-Partial |
-LogInEmail.svelte, LogInOTP.svelte, app/pomade.ts; custodial Pomade flow, enabled only when VITE_POMADE_SIGNERS is set. Out of e2e scope |
+Implemented |
+LogInEmail.svelte, LogInOTP.svelte, app/pomade.ts; custodial Pomade flow, enabled when VITE_POMADE_SIGNERS is set. Out of e2e scope |
| Browser extension sign-in |
@@ -595,8 +580,8 @@ the story catalog in e2e/USER_STORIES.md.
| Data export |
-Not implemented |
-No user-data export; the privacy page only sends diagnostic logs to the developer |
+Implemented |
+hosting/DataTransferModal.svelte, app/hosting.ts; a space's events download as JSONL and re-import into another relay |
| Account deletion |
diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj
index a68a7926..d0660713 100644
--- a/ios/App/App.xcodeproj/project.pbxproj
+++ b/ios/App/App.xcodeproj/project.pbxproj
@@ -350,7 +350,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 42;
+ CURRENT_PROJECT_VERSION = 43;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = NO;
@@ -362,7 +362,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
- MARKETING_VERSION = 1.9.1;
+ MARKETING_VERSION = 1.11.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla.ShareExtension;
@@ -387,7 +387,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 42;
+ CURRENT_PROJECT_VERSION = 43;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = NO;
@@ -399,7 +399,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
- MARKETING_VERSION = 1.9.1;
+ MARKETING_VERSION = 1.11.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla.ShareExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -541,7 +541,7 @@
CODE_SIGN_ENTITLEMENTS = "Flotilla Chat.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 42;
+ CURRENT_PROJECT_VERSION = 43;
INFOPLIST_FILE = App/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
@@ -550,7 +550,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.9.1;
+ MARKETING_VERSION = 1.11.0;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -570,7 +570,7 @@
CODE_SIGN_ENTITLEMENTS = "Flotilla Chat.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 42;
+ CURRENT_PROJECT_VERSION = 43;
INFOPLIST_FILE = App/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
@@ -579,7 +579,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.9.1;
+ MARKETING_VERSION = 1.11.0;
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/package.json b/package.json
index 1766b6ec..40eb22d5 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,9 @@
{
"name": "flotilla",
- "version": "1.9.1",
- "author": {"name": "Jon Staab"},
+ "version": "1.11.0",
+ "author": {
+ "name": "Jon Staab"
+ },
"private": true,
"scripts": {
"dev": "vite dev",
@@ -88,16 +90,16 @@
"@types/throttle-debounce": "^5.0.2",
"@vite-pwa/assets-generator": "^1.0.2",
"@vite-pwa/sveltekit": "^1.1.0",
- "@welshman/app": "^0.10.8",
- "@welshman/content": "^0.10.8",
- "@welshman/domain": "^0.10.8",
- "@welshman/editor": "^0.10.8",
- "@welshman/feeds": "^0.10.8",
- "@welshman/lib": "^0.10.8",
- "@welshman/net": "^0.10.8",
- "@welshman/signer": "^0.10.8",
- "@welshman/store": "^0.10.8",
- "@welshman/util": "^0.10.8",
+ "@welshman/app": "^0.10.9",
+ "@welshman/content": "^0.10.9",
+ "@welshman/domain": "^0.10.9",
+ "@welshman/editor": "^0.10.9",
+ "@welshman/feeds": "^0.10.9",
+ "@welshman/lib": "^0.10.9",
+ "@welshman/net": "^0.10.9",
+ "@welshman/signer": "^0.10.9",
+ "@welshman/store": "^0.10.9",
+ "@welshman/util": "^0.10.9",
"cheerio": "^1.2.0",
"compressorjs-next": "^1.1.2",
"dompurify": "^3.4.13",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 546bddd4b6bed15269ba4e8dce8dc0b4eb6e7f4e..3674ecfe3886b6d2b9f15454659f045290b69c90 100644
GIT binary patch
delta 3664
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