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 546bddd4..3674ecfe 100644
Binary files a/pnpm-lock.yaml and b/pnpm-lock.yaml differ