Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/docs/content/guides/realtime/settings.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ You can set the following settings using the Realtime Settings screen in your Da
- Database connection pool size: Determines the number of connections used for Realtime Authorization RLS checking
{/* supa-mdx-lint-disable-next-line Rule004ExcludeWords */}
- Max concurrent clients: Determines the maximum number of clients that can be connected
- Max events per second: Determines the maximum number of events per second that can be sent
2 changes: 2 additions & 0 deletions apps/docs/public/humans.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Barco Fourie
Beng Eu
Bo Lu
Bobbie Soedirgo
Brendan Stephens
Brent Newson
Carel de Waal
Cameron Blackwood
Expand Down Expand Up @@ -151,6 +152,7 @@ Wen Bo Xie
Yorvi Arias
Yuliya Marinova
Yuri Santana
Zsolt Pazmandy
____________

JOBS
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 34 additions & 37 deletions apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ export const RealtimeSettings = () => {
.min(1)
.max(maxConn?.maxConnections ?? 100),
max_concurrent_users: z.coerce.number().min(1).max(50000),
max_events_per_second: z.coerce.number().min(1).max(10000),
// [Joshen] These fields are temporarily hidden from the UI
// max_events_per_second: z.coerce.number().min(1).max(50000),
// max_bytes_per_second: z.coerce.number().min(1).max(10000000),
// max_channels_per_client: z.coerce.number().min(1).max(10000),
// max_joins_per_second: z.coerce.number().min(1).max(5000),
Expand Down Expand Up @@ -117,6 +117,7 @@ export const RealtimeSettings = () => {
private_only: !data.allow_public,
connection_pool: data.connection_pool,
max_concurrent_users: data.max_concurrent_users,
max_events_per_second: data.max_events_per_second,
})
}

Expand Down Expand Up @@ -245,6 +246,36 @@ export const RealtimeSettings = () => {
Max concurrent clients
</FormSectionLabel>
}
>
<FormSectionContent loaders={1} loading={isLoading} className="!gap-y-2">
<FormControl_Shadcn_>
<Input_Shadcn_ {...field} type="number" value={field.value || ''} />
</FormControl_Shadcn_>
<FormMessage_Shadcn_ />
</FormSectionContent>
</FormSection>
)}
/>
</CardContent>
<CardContent>
<FormField_Shadcn_
control={form.control}
name="max_events_per_second"
render={({ field }) => (
<FormSection
className="!p-0 !py-2"
header={
<FormSectionLabel
description={
<p className="text-foreground-lighter text-sm !mt-1">
Sets maximum number of events per second that can be sent to your
Realtime service
</p>
}
>
Max events per second
</FormSectionLabel>
}
>
<FormSectionContent loaders={1} loading={isLoading} className="!gap-y-2">
<FormControl_Shadcn_>
Expand All @@ -270,7 +301,7 @@ export const RealtimeSettings = () => {
</p>
</div>
<div className="flex-grow flex items-center justify-end">
{false ? (
{isFreePlan ? (
<UpgradePlanButton source="realtimeSettings" plan="Pro" />
) : (
<ToggleSpendCapButton />
Expand All @@ -287,46 +318,11 @@ export const RealtimeSettings = () => {

{/*
[Joshen] The following fields are hidden from the UI temporarily while we figure out what settings to expose to the users
- Max events per second
- Max bytes per second
- Max channels per client
- Max joins per second
*/}

{/* <CardContent>
<FormField_Shadcn_
control={form.control}
name="max_events_per_second"
render={({ field }) => (
<FormSection
className="!p-0 !py-2"
header={
<FormSectionLabel
description={
<p className="text-foreground-lighter text-sm !mt-1">
Sets maximum number of events per second rate per channel limit
</p>
}
>
Max events per second
</FormSectionLabel>
}
>
<FormSectionContent loading={isLoading} className="!gap-y-2">
<FormControl_Shadcn_>
<Input_Shadcn_
{...field}
type="number"
disabled={!canUpdateConfig}
value={field.value || ''}
/>
</FormControl_Shadcn_>
<FormMessage_Shadcn_ />
</FormSectionContent>
</FormSection>
)}
/>
</CardContent> */}
{/* <CardContent>
<FormField_Shadcn_
control={form.control}
Expand Down Expand Up @@ -440,6 +436,7 @@ export const RealtimeSettings = () => {
)}
/>
</CardContent> */}

<CardFooter className="justify-between">
<div>
{isPermissionsLoaded && !canUpdateConfig && (
Expand Down
45 changes: 38 additions & 7 deletions apps/studio/components/interfaces/SignIn/SessionTimeoutModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useEffect } from 'react'

import { InlineLink } from 'components/ui/InlineLink'
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
import { toast } from 'sonner'

interface SessionTimeoutModalProps {
visible: boolean
Expand Down Expand Up @@ -35,13 +36,43 @@ export const SessionTimeoutModal = ({
'Please try signing in again. If you are not able to sign in again, please contact Support.',
}}
>
<p className="text-sm text-foreground-light">
Consider{' '}
<InlineLink href="https://github.com/orgs/supabase/discussions/36540">
generating a HAR file
</InlineLink>{' '}
from your session to help Support pinpoint the issue.
</p>
<div className="space-y-4 text-sm text-foreground-light">
<ul className="list-disc pl-1.5 list-inside space-y-1 text-sm text-foreground-light">
<li>Try with a different browser</li>
<li>Disable browser extensions that block network requests</li>
<li>
<button
title="Clear storage and reload"
className="underline"
onClick={() => {
try {
localStorage.clear()
sessionStorage.clear()
} catch (e) {
toast.error('Failed to clear browser storage')
}
window.location.reload()
}}
>
Clear your browser storage
</button>
</li>
</ul>
<p>
If none of these steps work, please{' '}
<InlineLink href={`/support/new?subject=Session%20timed%20out`}>
Contact support
</InlineLink>
.
</p>
<p>
Consider{' '}
<InlineLink href="https://github.com/orgs/supabase/discussions/36540">
generating a HAR file
</InlineLink>{' '}
from your session to help Support pinpoint the issue.
</p>
</div>
</ConfirmationModal>
)
}
11 changes: 3 additions & 8 deletions apps/studio/pages/project/[ref]/realtime/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,7 @@ import { DocsButton } from 'components/ui/DocsButton'
import { DOCS_URL } from 'lib/constants'

const RealtimePoliciesPage: NextPageWithLayout = () => {
return (
<ScaffoldContainer>
<RealtimeSettings />
</ScaffoldContainer>
)
return <RealtimeSettings />
}

RealtimePoliciesPage.getLayout = (page) => (
Expand All @@ -22,10 +18,9 @@ RealtimePoliciesPage.getLayout = (page) => (
<PageLayout
title="Realtime Settings"
subtitle="Configure your project's Realtime settings"
// [Joshen] Scaffolding for now - once docs for this is ready
primaryActions={<DocsButton href={`${DOCS_URL}/guides/realtime/authorization`} />}
primaryActions={<DocsButton href={`${DOCS_URL}/guides/realtime/settings`} />}
>
{page}
<ScaffoldContainer>{page}</ScaffoldContainer>
</PageLayout>
</RealtimeLayout>
</DefaultLayout>
Expand Down
26 changes: 26 additions & 0 deletions apps/www/_blog/2025-10-08-triplit-joins-supabase.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
title: 'Triplit joins Supabase'
description: 'Matt Linkous is joining Supabase to expand third-party integrations and offline-first capabilities.'
author: paul_copplestone
image: triplit-joins-supabase/thumb.png
thumb: triplit-joins-supabase/thumb.png
date: '2025-10-08:10:00:00'
toc_depth: 2
---

We're excited to welcome Matt Linkous, co-founder of [Triplit](https://www.triplit.dev/), to the Supabase team.

With this acquisition, we're bringing Matt's deep expertise in the offline-first domain into our ecosystem. Our focus isn't to directly integrate Triplit into our platform. Instead, Matt will be working to expand third-party integrations at Supabase. Part of this effort will be making Supabase an excellent partner to other syncing systems such as [ElectricSQL](https://electric-sql.com/), [Zero](https://zero.rocicorp.dev/), and [PowerSync](https://www.powersync.com/).
Creating a great self-serve integration system is a growing priority at Supabase, so we're excited for Matt to bring his experience as Y Combinator founder and open-source maintainer to build an integration experience that's seamless for both developers using Supabase and third-party providers.

### Offline mode when?

We know, firsthand, that there is a lot of demand for better offline mode experience. However, solving offline mode in a way that works for everyone is a formidable challenge. And while Triplit exemplifies how rethinking the database from the ground up can create an admirable developer experience, this move is about Matt's expertise and collaboration, not about immediately using Triplit to solve offline needs at Supabase. We'll continue to explore the best paths forward for offline functionality and communicate transparently as those plans evolve.

### What Happens With Triplit's Code

Triplit is already largely open-source but as part of his onboarding, Matt will spend time further open-sourcing the Triplit codebase, documenting the patterns they used, and sharing lessons learned. We hope this knowledge sharing will help support the offline-first community and spark new ideas in the ecosystem.

### Next Steps

Stay tuned as we integrate Matt into our team and leverage his insights to enhance the Supabase developer experience. We're excited for what's to come and grateful for your support as we continue to grow.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading