From acdf69cebbf3d911f5ee0ed83f555dfc4d5e5534 Mon Sep 17 00:00:00 2001 From: Matthew Morris Date: Thu, 25 Jun 2026 19:37:02 -0400 Subject: [PATCH] Skip user activity tracking in local dev MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User activity is collaborator presence ("who else is editing this site") — it filters out your own activity and only surfaces other users. In local dev (single user, no collaborators) it has nothing to show, and listing it tries to resolve activity rows that point at since-deleted pages, throwing a flood of 404s and ZodErrors in the editor console. Gate both ends on instance.dev_mode: setUserActivity no longer writes presence records locally, and getUserActivity returns [] instead of listing/resolving them. Mirrors the existing dev_mode gating used elsewhere (e.g. Deploy). Co-Authored-By: Claude Opus 4.8 (1M context) --- src/lib/UserActivity.svelte.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/lib/UserActivity.svelte.ts b/src/lib/UserActivity.svelte.ts index 1f0d971f8..0f2f65949 100644 --- a/src/lib/UserActivity.svelte.ts +++ b/src/lib/UserActivity.svelte.ts @@ -8,6 +8,7 @@ import { build_cms_page_url } from './pages' import { site_context } from './builder/stores/context' import { get } from 'svelte/store' import { current_user } from './pocketbase/user' +import { instance } from './instance' import type { ObjectOf } from './pocketbase/CollectionMapping.svelte' export type UserActivityValues = Omit @@ -29,6 +30,11 @@ export type UserActivityInfo = { const user_activity_context = new Context<{ value: UserActivityValues }>('user_activity') export const setUserActivity = (overrides: Partial) => { + // User activity is collaborator presence ("who else is editing this site"). + // It's meaningless in local dev (single user, no collaborators) and would + // write churn records against the local DB, so don't track it there. + if (instance.dev_mode) return + const existing_context = user_activity_context.getOr({ value: null }) if (existing_context.value) { // Set activity overrides through context @@ -138,7 +144,11 @@ export const setUserActivity = (overrides: Partial) => { onDestroy(stopTracking) } -export const getUserActivity = ({ filter }: { filter?: (activity: UserActivityInfo) => unknown } = {}) => { +export const getUserActivity = ({ filter }: { filter?: (activity: UserActivityInfo) => unknown } = {}): UserActivityInfo[][] => { + // No collaborator presence in local dev — skip the list (which would also + // try to resolve activities pointing at since-deleted pages and throw). + if (instance.dev_mode) return [] + const { value: site } = site_context.get() return (UserActivities.list({ filter: { site: site.id } }) ?? []) .filter((activity) => activity.user !== get(current_user)?.id)