From 6e508afc8bb26accefcd3d9df804883e267709d1 Mon Sep 17 00:00:00 2001 From: Jamie Ruderman Date: Tue, 21 Oct 2025 18:31:50 -0700 Subject: [PATCH 1/5] chore(android): upgrade gradle plugin to 8.13.0 --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 4bd6375d9..670d4e0b8 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.12.1' + classpath 'com.android.tools.build:gradle:8.13.0' classpath 'com.google.gms:google-services:4.4.0' // NOTE: Do not place your application dependencies here; they belong From db2f6f99c57dead3f4eaf12b2ce40f246c84a60f Mon Sep 17 00:00:00 2001 From: Jamie Ruderman Date: Tue, 21 Oct 2025 18:31:51 -0700 Subject: [PATCH 2/5] feat(android): hide billing and subscription features on Android --- frontend/src/components/AvatarMenu.tsx | 4 +- .../src/components/EventList/EventList.tsx | 12 ++-- frontend/src/pages/AccountPage.tsx | 15 +++-- frontend/src/routers/Router.tsx | 64 +++++++++---------- 4 files changed, 48 insertions(+), 47 deletions(-) diff --git a/frontend/src/components/AvatarMenu.tsx b/frontend/src/components/AvatarMenu.tsx index 14a5dd351..dd6f43280 100644 --- a/frontend/src/components/AvatarMenu.tsx +++ b/frontend/src/components/AvatarMenu.tsx @@ -98,9 +98,7 @@ export const AvatarMenu: React.FC = () => { to="/account" badge={licenseIndicator} onClick={handleClose} - > - {browser.isAndroid && } - + /> = ({ device }) => { await dispatch.logs.fetch({ allowedDays, deviceId: device?.id }) } - const showPlanUpgradeNotice = Boolean(planUpgrade && !fetching && !fetchingMore && !browser.isAndroid) + const showPlanUpgradeNotice = Boolean(planUpgrade && !fetching && !fetchingMore) return ( <> @@ -41,9 +41,11 @@ export const EventList: React.FC = ({ device }) => { - Upgrade - + + + } > Plan upgrade required to view logs past {humanizeDays(logLimit?.value)}. diff --git a/frontend/src/pages/AccountPage.tsx b/frontend/src/pages/AccountPage.tsx index c003688c1..71445c0a6 100644 --- a/frontend/src/pages/AccountPage.tsx +++ b/frontend/src/pages/AccountPage.tsx @@ -4,6 +4,7 @@ import { List, Typography, Tooltip, ButtonBase } from '@mui/material' import { ListItemLocation } from '../components/ListItemLocation' import { windowOpen } from '../services/browser' import { Container } from '../components/Container' +import { MobileUI } from '../components/MobileUI' import { Logo } from '@common/brand/Logo' import { Icon } from '../components/Icon' @@ -33,12 +34,14 @@ export const AccountPage: React.FC = () => { dense /> - - {!browser.hasBilling && } - - - {!browser.hasBilling && } - + + + {!browser.hasBilling && } + + + {!browser.hasBilling && } + + diff --git a/frontend/src/routers/Router.tsx b/frontend/src/routers/Router.tsx index 8836b52ea..b85350d8d 100644 --- a/frontend/src/routers/Router.tsx +++ b/frontend/src/routers/Router.tsx @@ -346,39 +346,37 @@ export const Router: React.FC<{ layout: ILayout }> = ({ layout }) => { {/* Account */} - - } - secondary={ - - - - - - - - - - - - - - - - - - - - - - - - - } - layout={layout} - root="/account" - /> - + } + secondary={ + + + + + + + + + + + + + + + + + + + + + + + + + } + layout={layout} + root="/account" + /> {/* Not found */} From 6e53ed8e20d6819e117912a415569328014df14b Mon Sep 17 00:00:00 2001 From: Jamie Ruderman Date: Tue, 21 Oct 2025 18:31:52 -0700 Subject: [PATCH 3/5] chore: remove beta label from scripting feature --- frontend/src/components/SidebarNav.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/components/SidebarNav.tsx b/frontend/src/components/SidebarNav.tsx index 30abc5d74..99305124a 100644 --- a/frontend/src/components/SidebarNav.tsx +++ b/frontend/src/components/SidebarNav.tsx @@ -110,9 +110,7 @@ export const SidebarNav: React.FC = () => { icon="scripting" match={['/script', '/scripts', '/runs']} dense - > - - + /> setMore(!more)} sx={{ marginTop: 2 }}> From a4ba6a21561da66c4c3bb7c5dcda13a54873aaef Mon Sep 17 00:00:00 2001 From: Jamie Ruderman Date: Tue, 21 Oct 2025 18:31:53 -0700 Subject: [PATCH 4/5] refactor: simplify log retention evaluation logic --- frontend/src/models/logs.ts | 39 +++++-------------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/frontend/src/models/logs.ts b/frontend/src/models/logs.ts index 1554f8ba4..f8d408f15 100644 --- a/frontend/src/models/logs.ts +++ b/frontend/src/models/logs.ts @@ -5,33 +5,6 @@ import { RootModel } from '.' const DAY_MS = 24 * 60 * 60 * 1000 -const toTimestamp = (value?: Date | string) => (value ? new Date(value).getTime() : undefined) - -const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max) - -const evaluateRetention = ({ - items, - minDate, - hasMore, - allowedDays, -}: { - items: IEvent[] - minDate?: Date - hasMore?: boolean - allowedDays: number -}) => { - const minDateMs = toTimestamp(minDate) - const oldestMs = toTimestamp(items[items.length - 1]?.timestamp) - const boundaryReady = Boolean(items.length && !hasMore && minDateMs !== undefined && oldestMs !== undefined) - if (!boundaryReady) return { reached: false, near: false } - - const reached = oldestMs! <= minDateMs! - const thresholdDays = clamp(allowedDays > 0 ? allowedDays * 0.1 : 1, 0.25, 1) - const near = !reached && oldestMs! - minDateMs! <= thresholdDays * DAY_MS - - return { reached, near } -} - type ILogState = { size: number after?: string @@ -93,18 +66,16 @@ export default createModel()({ items: mergedItems, } - const { reached, near } = evaluateRetention({ - items: mergedItems, - minDate, - hasMore: nextEvents.hasMore, - allowedDays, - }) + const hasReachedLimit = !nextEvents.hasMore && allowedDays > 0 + const firstLogMs = state.user.created?.getTime() || 0 + const logLimitMs = Date.now() - allowedDays * DAY_MS + const planUpgrade = hasReachedLimit && firstLogMs < logLimitMs set({ events: nextEvents, fetching: false, fetchingMore: false, - planUpgrade: reached || near, + planUpgrade, }) }, From 1b7007a5131c27341fe9461f8517b87ea43d6b16 Mon Sep 17 00:00:00 2001 From: Jamie Ruderman Date: Tue, 21 Oct 2025 18:33:53 -0700 Subject: [PATCH 5/5] 3.41.0 --- android/app/build.gradle | 4 ++-- electron/package-lock.json | 4 ++-- electron/package.json | 4 ++-- frontend/package.json | 2 +- ios/App/App.xcodeproj/project.pbxproj | 8 ++++---- package-lock.json | 8 ++++---- package.json | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index d8c3525dd..cfa62bf72 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.remoteit" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 286 - versionName "3.40.2" + versionCode 287 + versionName "3.41.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/electron/package-lock.json b/electron/package-lock.json index ff543d3ba..f09e63539 100644 --- a/electron/package-lock.json +++ b/electron/package-lock.json @@ -1,12 +1,12 @@ { "name": "remoteit", - "version": "3.40.2", + "version": "3.41.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "remoteit", - "version": "3.40.2", + "version": "3.41.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/electron/package.json b/electron/package.json index a809b7573..4cc2d6ea5 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "remoteit", - "version": "3.40.2", + "version": "3.41.0", "private": true, "main": "build/index.js", "description": "Remote.It cross platform desktop application for creating and hosting connections", @@ -169,4 +169,4 @@ "build/**/*" ] } -} \ No newline at end of file +} diff --git a/frontend/package.json b/frontend/package.json index 349e39e91..2fa79f95c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "remoteit-desktop-frontend", - "version": "3.40.2", + "version": "3.41.0", "private": true, "type": "module", "scripts": { diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 8755f7932..1f4ab7ed4 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -352,7 +352,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 139; + CURRENT_PROJECT_VERSION = 140; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NR6A6NQAYW; INFOPLIST_FILE = App/Info.plist; @@ -360,7 +360,7 @@ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.40.2; + MARKETING_VERSION = 3.41.0; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = com.remoteit.mobile.ios; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -381,7 +381,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 139; + CURRENT_PROJECT_VERSION = 140; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NR6A6NQAYW; INFOPLIST_FILE = App/Info.plist; @@ -389,7 +389,7 @@ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.40.2; + MARKETING_VERSION = 3.41.0; PRODUCT_BUNDLE_IDENTIFIER = com.remoteit.mobile.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/package-lock.json b/package-lock.json index 559ea34f3..3e8aef2b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "remoteit-capacitor", - "version": "3.40.2", + "version": "3.41.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "remoteit-capacitor", - "version": "3.40.2", + "version": "3.41.0", "hasInstallScript": true, "workspaces": [ "electron", @@ -40,7 +40,7 @@ }, "electron": { "name": "remoteit", - "version": "3.40.2", + "version": "3.41.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -164,7 +164,7 @@ }, "frontend": { "name": "remoteit-desktop-frontend", - "version": "3.40.2", + "version": "3.41.0", "dependencies": { "@airbrake/browser": "^2.1.9", "@aws-amplify/auth": "^5.6.6", diff --git a/package.json b/package.json index 1726dd521..fa4c6c92d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "remoteit-capacitor", - "version": "3.40.2", + "version": "3.41.0", "private": true, "description": "Remote.It cross platform desktop application for creating and hosting connections", "workspaces": [