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
111 changes: 110 additions & 1 deletion apps/docs/content/guides/queues/quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,14 @@ Then enable the required roles permissions.

Once your Queue has been created, you can begin enqueueing and dequeueing Messages.

Here's a TypeScript example using the official Supabase client library:
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="js"
queryGroup="language"
>
<TabPanel id="js" label="JavaScript">

```tsx
import { createClient } from '@supabase/supabase-js'
Expand Down Expand Up @@ -205,3 +212,105 @@ const QueuesTest: React.FC = () => {

export default QueuesTest
```

</TabPanel>
<$Show if="sdk:dart">
<TabPanel id="dart" label="Dart">

```dart
import 'package:supabase_flutter/supabase_flutter.dart';

final supabase = Supabase.instance.client;

// Add a Message
Future<void> sendToQueue() async {
final result = await supabase.schema('pgmq_public').rpc('send', params: {
'queue_name': 'foo',
'message': {'hello': 'world'},
'sleep_seconds': 30,
});
print(result);
}

// Dequeue Message
Future<void> popFromQueue() async {
final result = await supabase.schema('pgmq_public').rpc('pop', params: {
'queue_name': 'foo',
});
print(result);
}
```

</TabPanel>
</$Show>
<$Show if="sdk:swift">
<TabPanel id="swift" label="Swift">

```swift
import Supabase

let supabase = SupabaseClient(
supabaseURL: URL(string: "supabaseURL")!,
supabaseKey: "supabaseKey"
)

// Add a Message
func sendToQueue() async throws {
let result = try await supabase
.schema("pgmq_public")
.rpc("send", params: [
"queue_name": AnyJSON.string("foo"),
"message": AnyJSON.object(["hello": "world"]),
"sleep_seconds": AnyJSON.integer(30)
])
.execute()
print(result)
}

// Dequeue Message
func popFromQueue() async throws {
let result = try await supabase
.schema("pgmq_public")
.rpc("pop", params: ["queue_name": "foo"])
.execute()
print(result)
}
```

</TabPanel>
</$Show>
<$Show if="sdk:python">
<TabPanel id="python" label="Python">

```python
from supabase import create_client, Client

supabase_url = "supabaseURL"
supabase_key = "supabaseKey"

supabase: Client = create_client(supabase_url, supabase_key)

# Add a Message
def send_to_queue():
result = supabase.schema("pgmq_public").rpc(
"send",
{
"queue_name": "foo",
"message": {"hello": "world"},
"sleep_seconds": 30,
}
).execute()
print(result)

# Dequeue Message
def pop_from_queue():
result = supabase.schema("pgmq_public").rpc(
"pop",
{"queue_name": "foo"}
).execute()
print(result)
```

</TabPanel>
</$Show>
</Tabs>
12 changes: 3 additions & 9 deletions apps/docs/content/troubleshooting/refresh-postgrest-schema.mdx
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
---
title = "Reload/refresh postgrest schema"
topics = [
"database",
]
keywords = [
"schema",
"postgrest",
]
topics = [ "database" ]
keywords = [ "schema", "postgrest" ]
database_id = "b76ac13f-db24-4d19-9d00-af60c978cd26"

# Optionally, list the error messages associated with this issue.
[[errors]]
http_status_code = 400
code = "bad_request"
message = "Could not find a relationship between X and Y in the schema cache"

---

To refresh your PostgREST schema, go to your project **Dashboard**, and open the **SQL Editor**.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,17 +149,25 @@ export const CronJobTableCell = ({
onClick={(e) => e.stopPropagation()}
/>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="w-42">
<DropdownMenuItem
className="gap-x-2"
onClick={(e) => {
e.stopPropagation()
onRunCronJob()
}}
>
<Play size={12} />
Run command
</DropdownMenuItem>
<DropdownMenuContent align="end" className="w-60 space-y-1">
<Tooltip>
<TooltipTrigger className="w-full">
<DropdownMenuItem
className="gap-x-2"
onClick={(e) => {
e.stopPropagation()
onRunCronJob()
}}
>
<Play size={12} />
Run command
</DropdownMenuItem>
</TooltipTrigger>
<TooltipContent>
Manual runs execute the command immediately and will not appear in the cron jobs
table.
</TooltipContent>
</Tooltip>
<DropdownMenuItem
className="gap-x-2"
onClick={(e) => {
Expand Down
31 changes: 23 additions & 8 deletions apps/studio/components/interfaces/SignIn/SignInForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { auth, buildPathWithParams, getReturnToPath } from 'lib/gotrue'
import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { LastSignInWrapper } from './LastSignInWrapper'
import { Eye, EyeOff } from 'lucide-react'

const schema = z.object({
email: z.string().min(1, 'Email is required').email('Must be a valid email'),
Expand All @@ -31,6 +32,8 @@ export const SignInForm = () => {
const queryClient = useQueryClient()
const [_, setLastSignIn] = useLastSignIn()

const [passwordHidden, setPasswordHidden] = useState(true)

const [captchaToken, setCaptchaToken] = useState<string | null>(null)
const captchaRef = useRef<HCaptcha>(null)
const [returnTo, setReturnTo] = useState<string | null>(null)
Expand Down Expand Up @@ -146,14 +149,26 @@ export const SignInForm = () => {
render={({ field }) => (
<FormItemLayout name="password" label="Password">
<FormControl_Shadcn_>
<Input_Shadcn_
id="password"
type="password"
autoComplete="current-password"
{...field}
placeholder="&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;"
disabled={isSubmitting}
/>
<div className="relative">
<Input_Shadcn_
id="password"
type={passwordHidden ? 'password' : 'text'}
autoComplete="current-password"
{...field}
placeholder="&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;"
disabled={isSubmitting}
className="pr-10"
/>
<Button
type="default"
title={passwordHidden ? `Show password` : `Hide password`}
aria-label={passwordHidden ? `Show password` : `Hide password`}
className="absolute right-1 top-1 px-1.5"
icon={passwordHidden ? <Eye /> : <EyeOff />}
disabled={isSubmitting}
onClick={() => setPasswordHidden((prev) => !prev)}
/>
</div>
</FormControl_Shadcn_>
</FormItemLayout>
)}
Expand Down
6 changes: 6 additions & 0 deletions apps/www/_blog/2025-04-04-mcp-server.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ toc_depth: 3
launchweek: '14'
---

<Admonition type="note">
Be sure to read our launch post about the [Supabase Remote MCP Server](/blog/remote-mcp-server),
and read our [MCP Server documentation](/docs/guides/getting-started/mcp) for the latest
information.
</Admonition>

We are launching an official [Supabase MCP server](https://github.com/supabase-community/supabase-mcp). You can use this server to connect your favorite AI tools (such as [Cursor](https://www.cursor.com/) or [Claude](https://claude.ai/download)) directly with Supabase.

<div className="video-container mb-8">
Expand Down
2 changes: 2 additions & 0 deletions apps/www/_blog/2025-10-08-triplit-joins-supabase.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ description: 'Matt Linkous is joining Supabase to expand third-party integration
author: paul_copplestone
image: triplit-joins-supabase/thumb.png
thumb: triplit-joins-supabase/thumb.png
categories:
- company
date: '2025-10-08:10:00:00'
toc_depth: 2
---
Expand Down
58 changes: 58 additions & 0 deletions apps/www/_blog/2025-10-16-snap-launches-snap-cloud.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
title: 'Snap, Inc. Launches Snap Cloud, Powered by Supabase'
description: 'Snap Cloud is a new managed backend platform for developers building on Spectacles, powered by Supabase.'
author: inian
image: 2025-10-16-snap-launches-snap-cloud/og.png
thumb: 2025-10-16-snap-launches-snap-cloud/og.png
categories:
- product
date: '2025-10-16:10:00:00'
toc_depth: 2
---

Today, Snap Inc. launched Snap Cloud, a new managed backend platform for developers building on Spectacles, powered by Supabase. Snap Cloud is a complete backend integrated directly into Snap's AR authoring tool, Lens Studio.

Snap Cloud is the latest example of how organizations are using Supabase to power modern, data-driven experiences. Built on Supabase, Snap Cloud gives Spectacles developers instant access to a full Postgres [database](https://www.supabase.com/database), [real-time APIs](https://www.supabase.com/realtime), and globally distributed [Edge Functions](https://www.supabase.com/edge-functions) without any infrastructure setup. Supabase offers enterprise-grade security, compliance, and performance while preserving developer agility.

For developers, this means they can store and query world data, sync live sessions across devices, and run AI-powered logic at the edge, all inside the same environment.

## Lens Studio and Snap Cloud, powered by Supabase

With Snap Cloud, Spectacles developers can now use backend capabilities directly inside Lens Studio, powered by Supabase. This integration makes it easier to build connected, data-driven AR experiences without needing to manage infrastructure.

Supabase enables several key features in Lens Studio:

- **Persistent data**: Save and query spatial anchors, object positions, and other world data in a managed Postgres database so experiences remain consistent across sessions and devices.
- **Realtime collaboration**: Sync shared scenes and user interactions with Supabase Realtime to create multiplayer or co-located AR experiences.
- **Authentication**: Manage user identities, permissions, and sessions.
- **Media storage**: Host and serve 3D assets, textures, and audio files with Supabase Storage for fast, scalable retrieval during runtime.
- **Edge compute**: Run server-side logic and AI models through Supabase Edge Functions to process input, perform inference, or trigger automations close to the user.
- **Analytics and telemetry**: Capture event data and sensor output in Postgres tables for performance tracking and real-time insight.

<Img
src={{
dark: '/images/blog/2025-10-16-snap-launches-snap-cloud/lens-studio.jpg',
light: '/images/blog/2025-10-16-snap-launches-snap-cloud/lens-studio.jpg',
}}
alt="Lens Studio, powered by Supabase"
/>

Together, Lens Studio and Supabase form a full-stack platform for AR development on Spectacles. Snap provides the creative tools and hardware interface, while Supabase powers the data, logic, and scale behind every experience.

## By the numbers

Both Snap and Supabase operate at global scale, serving millions of developers and users each day.

- Snapchatters use AR Lenses in the Snapchat camera 8 billion times per day, and over 400,000 developers have built more than 4 million Lenses with Snap's world-leading AR tools.
- 4,500,000+ developers building on Supabase
- 100,000+ API Calls / Second on Supabase
- 43,000+ Databases Launched Daily on Supabase
- 1,000,000+ Databases Managed on Supabase

These metrics highlight the reliability and reach required for modern, data-intensive workloads. Whether running in Snap's Lens Studio or an enterprise control plane, Supabase delivers the performance, availability, and compliance developers expect from a production-grade platform.

## Building the future together

Snap Cloud is currently in alpha as part of Snap's upcoming Spectacles program and represents a new wave of applications that merge AI, data, and the physical world. Supabase is proud to provide the data platform behind it.

At Supabase, we believe that every company, whether building AR glasses, smart devices, or next-generation applications, deserves the same foundation Snap is using for Spectacles: the power of Postgres, made simple, scalable, and ready for anything.
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.
Loading