Date: Wed, 3 Dec 2025 14:57:51 -0500
Subject: [PATCH 2/8] fixing a big ol oopsie in our pub empty state in the
sidebar
---
components/ActionBar/Publications.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/components/ActionBar/Publications.tsx b/components/ActionBar/Publications.tsx
index 4299146c..304f9ad4 100644
--- a/components/ActionBar/Publications.tsx
+++ b/components/ActionBar/Publications.tsx
@@ -151,7 +151,7 @@ export const PubListEmptyContent = (props: { compact?: boolean }) => {
Publish on AT Proto
- {identity && !identity.atp_did ? (
+ {identity && identity.atp_did ? (
// has ATProto account and no pubs
<>
--
2.51.2
From 35f03066f567871e0088a4972ecf8b60d9189ae7 Mon Sep 17 00:00:00 2001
From: Jared Pereira
Date: Wed, 3 Dec 2025 18:34:38 -0500
Subject: [PATCH 3/8] fix type error and lint
---
actions/deleteLeaflet.ts | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/actions/deleteLeaflet.ts b/actions/deleteLeaflet.ts
index d6108def..73c700a2 100644
--- a/actions/deleteLeaflet.ts
+++ b/actions/deleteLeaflet.ts
@@ -23,11 +23,13 @@ export async function deleteLeaflet(permission_token: PermissionToken) {
// Check publication and document ownership in one query
let { data: tokenData } = await supabaseServerClient
.from("permission_tokens")
- .select(`
+ .select(
+ `
id,
leaflets_in_publications(publication, publications!inner(identity_did)),
leaflets_to_documents(document, documents!inner(uri))
- `)
+ `,
+ )
.eq("id", permission_token.id)
.single();
@@ -36,13 +38,17 @@ export async function deleteLeaflet(permission_token: PermissionToken) {
const leafletInPubs = tokenData.leaflets_in_publications || [];
if (leafletInPubs.length > 0) {
if (!identity) {
- throw new Error("Unauthorized: You must be logged in to delete a leaflet in a publication");
+ throw new Error(
+ "Unauthorized: You must be logged in to delete a leaflet in a publication",
+ );
}
const isOwner = leafletInPubs.some(
- (pub: any) => pub.publications.identity_did === identity.atp_did
+ (pub: any) => pub.publications.identity_did === identity.atp_did,
);
if (!isOwner) {
- throw new Error("Unauthorized: You must own the publication to delete this leaflet");
+ throw new Error(
+ "Unauthorized: You must own the publication to delete this leaflet",
+ );
}
}
@@ -50,13 +56,17 @@ export async function deleteLeaflet(permission_token: PermissionToken) {
const leafletDocs = tokenData.leaflets_to_documents || [];
if (leafletDocs.length > 0) {
if (!identity) {
- throw new Error("Unauthorized: You must be logged in to delete a published leaflet");
+ throw new Error(
+ "Unauthorized: You must be logged in to delete a published leaflet",
+ );
}
for (let leafletDoc of leafletDocs) {
const docUri = leafletDoc.documents?.uri;
// Extract the DID from the document URI (format: at://did:plc:xxx/...)
- if (docUri && !docUri.includes(identity.atp_did)) {
- throw new Error("Unauthorized: You must own the published document to delete this leaflet");
+ if (docUri && identity.atp_did && !docUri.includes(identity.atp_did)) {
+ throw new Error(
+ "Unauthorized: You must own the published document to delete this leaflet",
+ );
}
}
}
--
2.51.2
From 91f9c3d4b76ba18307b98dfc320d34bd75f5a866 Mon Sep 17 00:00:00 2001
From: Jared Pereira
Date: Wed, 3 Dec 2025 19:55:05 -0500
Subject: [PATCH 4/8] update nextjs
---
package-lock.json | 90 ++++++++++++++++++++++++++---------------------
package.json | 2 +-
2 files changed, 51 insertions(+), 41 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d63df567..2cc0b212 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -51,7 +51,7 @@
"linkifyjs": "^4.2.0",
"luxon": "^3.7.2",
"multiformats": "^13.3.2",
- "next": "16.0.3",
+ "next": "^16.0.7",
"pg": "^8.16.3",
"prosemirror-commands": "^1.5.2",
"prosemirror-inputrules": "^1.4.0",
@@ -2734,9 +2734,10 @@
}
},
"node_modules/@next/env": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.3.tgz",
- "integrity": "sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ=="
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.7.tgz",
+ "integrity": "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==",
+ "license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
"version": "16.0.3",
@@ -2804,12 +2805,13 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.3.tgz",
- "integrity": "sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.7.tgz",
+ "integrity": "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==",
"cpu": [
"arm64"
],
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -2819,12 +2821,13 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.3.tgz",
- "integrity": "sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz",
+ "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==",
"cpu": [
"x64"
],
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -2834,12 +2837,13 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.3.tgz",
- "integrity": "sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz",
+ "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==",
"cpu": [
"arm64"
],
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -2849,12 +2853,13 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.3.tgz",
- "integrity": "sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz",
+ "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==",
"cpu": [
"arm64"
],
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -2864,12 +2869,13 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.3.tgz",
- "integrity": "sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz",
+ "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==",
"cpu": [
"x64"
],
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -2879,12 +2885,13 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.3.tgz",
- "integrity": "sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz",
+ "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==",
"cpu": [
"x64"
],
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -2894,12 +2901,13 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.3.tgz",
- "integrity": "sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz",
+ "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==",
"cpu": [
"arm64"
],
+ "license": "MIT",
"optional": true,
"os": [
"win32"
@@ -2909,12 +2917,13 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.3.tgz",
- "integrity": "sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz",
+ "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==",
"cpu": [
"x64"
],
+ "license": "MIT",
"optional": true,
"os": [
"win32"
@@ -15108,11 +15117,12 @@
}
},
"node_modules/next": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/next/-/next-16.0.3.tgz",
- "integrity": "sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==",
+ "version": "16.0.7",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.0.7.tgz",
+ "integrity": "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==",
+ "license": "MIT",
"dependencies": {
- "@next/env": "16.0.3",
+ "@next/env": "16.0.7",
"@swc/helpers": "0.5.15",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
@@ -15125,14 +15135,14 @@
"node": ">=20.9.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "16.0.3",
- "@next/swc-darwin-x64": "16.0.3",
- "@next/swc-linux-arm64-gnu": "16.0.3",
- "@next/swc-linux-arm64-musl": "16.0.3",
- "@next/swc-linux-x64-gnu": "16.0.3",
- "@next/swc-linux-x64-musl": "16.0.3",
- "@next/swc-win32-arm64-msvc": "16.0.3",
- "@next/swc-win32-x64-msvc": "16.0.3",
+ "@next/swc-darwin-arm64": "16.0.7",
+ "@next/swc-darwin-x64": "16.0.7",
+ "@next/swc-linux-arm64-gnu": "16.0.7",
+ "@next/swc-linux-arm64-musl": "16.0.7",
+ "@next/swc-linux-x64-gnu": "16.0.7",
+ "@next/swc-linux-x64-musl": "16.0.7",
+ "@next/swc-win32-arm64-msvc": "16.0.7",
+ "@next/swc-win32-x64-msvc": "16.0.7",
"sharp": "^0.34.4"
},
"peerDependencies": {
diff --git a/package.json b/package.json
index 3a5b8ca4..ef2bc74c 100644
--- a/package.json
+++ b/package.json
@@ -61,7 +61,7 @@
"linkifyjs": "^4.2.0",
"luxon": "^3.7.2",
"multiformats": "^13.3.2",
- "next": "16.0.3",
+ "next": "^16.0.7",
"pg": "^8.16.3",
"prosemirror-commands": "^1.5.2",
"prosemirror-inputrules": "^1.4.0",
--
2.51.2
From 989e0e1ea98788bba1573a14c5b1b5acc1d55b7f Mon Sep 17 00:00:00 2001
From: Jared Pereira
Date: Thu, 4 Dec 2025 16:45:29 -0500
Subject: [PATCH 5/8] add tags index and search function
---
.../20251204120000_add_tags_support.sql | 30 +++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 supabase/migrations/20251204120000_add_tags_support.sql
diff --git a/supabase/migrations/20251204120000_add_tags_support.sql b/supabase/migrations/20251204120000_add_tags_support.sql
new file mode 100644
index 00000000..2596c674
--- /dev/null
+++ b/supabase/migrations/20251204120000_add_tags_support.sql
@@ -0,0 +1,30 @@
+-- Create GIN index on the tags array in the JSONB data field
+-- This allows efficient querying of documents by tag
+CREATE INDEX IF NOT EXISTS idx_documents_tags
+ ON "public"."documents" USING gin ((data->'tags'));
+
+-- Function to search and aggregate tags from documents
+-- This does the aggregation in the database rather than fetching all documents
+CREATE OR REPLACE FUNCTION search_tags(search_query text)
+RETURNS TABLE (name text, document_count bigint) AS $$
+BEGIN
+ RETURN QUERY
+ SELECT
+ LOWER(tag::text) as name,
+ COUNT(DISTINCT d.uri) as document_count
+ FROM
+ "public"."documents" d,
+ jsonb_array_elements_text(d.data->'tags') as tag
+ WHERE
+ CASE
+ WHEN search_query = '' THEN true
+ ELSE LOWER(tag::text) LIKE '%' || search_query || '%'
+ END
+ GROUP BY
+ LOWER(tag::text)
+ ORDER BY
+ COUNT(DISTINCT d.uri) DESC,
+ LOWER(tag::text) ASC
+ LIMIT 20;
+END;
+$$ LANGUAGE plpgsql STABLE;
--
2.51.2
From 221abd040f65f6925dfa10eabc2e3c74993ef114 Mon Sep 17 00:00:00 2001
From: Jared Pereira
Date: Thu, 4 Dec 2025 16:54:49 -0500
Subject: [PATCH 6/8] add search_tags rpc function
---
supabase/database.types.ts | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/supabase/database.types.ts b/supabase/database.types.ts
index 43d56b03..5477c61a 100644
--- a/supabase/database.types.ts
+++ b/supabase/database.types.ts
@@ -1158,6 +1158,15 @@ export type Database = {
}
Returns: Database["public"]["CompositeTypes"]["pull_result"]
}
+ search_tags: {
+ Args: {
+ search_query: string
+ }
+ Returns: {
+ name: string
+ document_count: number
+ }[]
+ }
}
Enums: {
rsvp_status: "GOING" | "NOT_GOING" | "MAYBE"
--
2.51.2
From 3b9f80fffd077edc3f55497b073d7e72010cbf5f Mon Sep 17 00:00:00 2001
From: Jared Pereira
Date: Thu, 4 Dec 2025 18:07:58 -0500
Subject: [PATCH 7/8] update metadata tables to support tags
---
.../20251204130000_add_tags_to_drafts.sql | 7 ++++
...51204140000_update_pull_data_with_tags.sql | 38 +++++++++++++++++++
2 files changed, 45 insertions(+)
create mode 100644 supabase/migrations/20251204130000_add_tags_to_drafts.sql
create mode 100644 supabase/migrations/20251204140000_update_pull_data_with_tags.sql
diff --git a/supabase/migrations/20251204130000_add_tags_to_drafts.sql b/supabase/migrations/20251204130000_add_tags_to_drafts.sql
new file mode 100644
index 00000000..91667f74
--- /dev/null
+++ b/supabase/migrations/20251204130000_add_tags_to_drafts.sql
@@ -0,0 +1,7 @@
+-- Add tags column to leaflets_in_publications for publication drafts
+ALTER TABLE "public"."leaflets_in_publications"
+ADD COLUMN "tags" text[] DEFAULT ARRAY[]::text[];
+
+-- Add tags column to leaflets_to_documents for standalone document drafts
+ALTER TABLE "public"."leaflets_to_documents"
+ADD COLUMN "tags" text[] DEFAULT ARRAY[]::text[];
diff --git a/supabase/migrations/20251204140000_update_pull_data_with_tags.sql b/supabase/migrations/20251204140000_update_pull_data_with_tags.sql
new file mode 100644
index 00000000..9b55bff4
--- /dev/null
+++ b/supabase/migrations/20251204140000_update_pull_data_with_tags.sql
@@ -0,0 +1,38 @@
+set check_function_bodies = off;
+
+CREATE OR REPLACE FUNCTION public.pull_data(token_id uuid, client_group_id text)
+ RETURNS pull_result
+ LANGUAGE plpgsql
+AS $function$DECLARE
+ result pull_result;
+BEGIN
+ -- Get client group data as JSON array
+ SELECT json_agg(row_to_json(rc))
+ FROM replicache_clients rc
+ WHERE rc.client_group = client_group_id
+ INTO result.client_groups;
+
+ -- Get facts as JSON array
+ SELECT json_agg(row_to_json(f))
+ FROM permission_tokens pt,
+ get_facts(pt.root_entity) f
+ WHERE pt.id = token_id
+ INTO result.facts;
+
+ -- Get publication data - try leaflets_in_publications first, then leaflets_to_documents
+ SELECT json_agg(row_to_json(lip))
+ FROM leaflets_in_publications lip
+ WHERE lip.leaflet = token_id
+ INTO result.publications;
+
+ -- If no publication data found, try leaflets_to_documents (for standalone documents)
+ IF result.publications IS NULL THEN
+ SELECT json_agg(row_to_json(ltd))
+ FROM leaflets_to_documents ltd
+ WHERE ltd.leaflet = token_id
+ INTO result.publications;
+ END IF;
+
+ RETURN result;
+END;$function$
+;
--
2.51.2
From 3c39d5b40a8f44b985c298952765be5c796d64f4 Mon Sep 17 00:00:00 2001
From: Jared Pereira
Date: Thu, 4 Dec 2025 18:49:00 -0500
Subject: [PATCH 8/8] update react
---
package-lock.json | 16 ++++++++++++----
package.json | 3 ++-
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2cc0b212..295b2715 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -48,6 +48,7 @@
"inngest": "^3.40.1",
"ioredis": "^5.6.1",
"katex": "^0.16.22",
+ "l": "^0.6.0",
"linkifyjs": "^4.2.0",
"luxon": "^3.7.2",
"multiformats": "^13.3.2",
@@ -59,7 +60,7 @@
"prosemirror-model": "^1.21.0",
"prosemirror-schema-basic": "^1.2.2",
"prosemirror-state": "^1.4.3",
- "react": "19.2.0",
+ "react": "19.2.1",
"react-aria-components": "^1.8.0",
"react-day-picker": "^9.3.0",
"react-dom": "19.2.0",
@@ -13369,6 +13370,12 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/l": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/l/-/l-0.6.0.tgz",
+ "integrity": "sha512-rB5disIyfKRBQ1xcedByHCcAmPWy2NPnjWo5u4mVVIPtathROHyfHjkloqSBT49mLnSRnupkpoIUOFCL7irCVQ==",
+ "license": "MIT"
+ },
"node_modules/language-subtag-registry": {
"version": "0.3.23",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
@@ -16331,9 +16338,10 @@
}
},
"node_modules/react": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
- "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+ "version": "19.2.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz",
+ "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
diff --git a/package.json b/package.json
index ef2bc74c..4c3c8e7b 100644
--- a/package.json
+++ b/package.json
@@ -58,6 +58,7 @@
"inngest": "^3.40.1",
"ioredis": "^5.6.1",
"katex": "^0.16.22",
+ "l": "^0.6.0",
"linkifyjs": "^4.2.0",
"luxon": "^3.7.2",
"multiformats": "^13.3.2",
@@ -69,7 +70,7 @@
"prosemirror-model": "^1.21.0",
"prosemirror-schema-basic": "^1.2.2",
"prosemirror-state": "^1.4.3",
- "react": "19.2.0",
+ "react": "19.2.1",
"react-aria-components": "^1.8.0",
"react-day-picker": "^9.3.0",
"react-dom": "19.2.0",