From cc14c95dcf2bf83c809106e9075bd3cfe398634b Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 11 Feb 2026 11:33:43 -0330 Subject: [PATCH] Flatten urls --- apps/learn/config/docs.ts | 96 +++++++++---------- .../04-05-performance-optimization.mdx | 15 --- .../content/foundations/introduction.mdx | 64 +++---------- apps/learn/contentlayer.config.js | 17 +++- 4 files changed, 77 insertions(+), 115 deletions(-) delete mode 100644 apps/learn/content/foundations/04-05-performance-optimization.mdx diff --git a/apps/learn/config/docs.ts b/apps/learn/config/docs.ts index c01a6f79f2e..bdbefb52f46 100644 --- a/apps/learn/config/docs.ts +++ b/apps/learn/config/docs.ts @@ -16,19 +16,19 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Supabase Architecture', - href: '/foundations/01-01-supabase-architecture', + href: '/foundations/supabase-architecture', }, { title: 'When to Choose Supabase', - href: '/foundations/01-02-when-to-choose-supabase', + href: '/foundations/when-to-choose-supabase', }, { title: 'Project Setup and Configuration', - href: '/foundations/01-03-project-setup-and-configuration', + href: '/foundations/project-setup-and-configuration', }, { title: 'Local Development Workflow', - href: '/foundations/01-04-local-development-workflow', + href: '/foundations/local-development-workflow', }, ], }, @@ -37,27 +37,27 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Schema Design for Supabase', - href: '/foundations/02-01-schema-design-for-supabase', + href: '/foundations/schema-design-for-supabase', }, { title: 'Essential Postgres Data Types', - href: '/foundations/02-02-essential-postgres-data-types', + href: '/foundations/essential-postgres-data-types', }, { title: 'Database Functions and Triggers', - href: '/foundations/02-03-database-functions-and-triggers', + href: '/foundations/database-functions-and-triggers', }, { title: 'Key Postgres Extensions', - href: '/foundations/02-04-key-postgres-extensions', + href: '/foundations/key-postgres-extensions', }, { title: 'Migrations and Version Control', - href: '/foundations/02-05-migrations-and-version-control', + href: '/foundations/migrations-and-version-control', }, { title: 'Replication', - href: '/foundations/02-06-replication', + href: '/foundations/replication', }, ], }, @@ -66,23 +66,23 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Authentication Fundamentals', - href: '/foundations/03-01-authentication-fundamentals', + href: '/foundations/authentication-fundamentals', }, { title: 'Authentication Methods', - href: '/foundations/03-02-authentication-methods', + href: '/foundations/authentication-methods', }, { title: 'Advanced Authentication', - href: '/foundations/03-03-advanced-authentication', + href: '/foundations/advanced-authentication', }, { title: 'User Management', - href: '/foundations/03-04-user-management', + href: '/foundations/user-management', }, { title: 'Security Considerations', - href: '/foundations/03-05-security-considerations', + href: '/foundations/security-considerations', }, ], }, @@ -91,27 +91,27 @@ export const courses: SidebarNavGroup = { items: [ { title: 'RLS Fundamentals', - href: '/foundations/04-01-rls-fundamentals', + href: '/foundations/rls-fundamentals', }, { title: 'Policy Patterns', - href: '/foundations/04-02-policy-patterns', + href: '/foundations/policy-patterns', }, { title: 'Auth Helper Functions', - href: '/foundations/04-03-auth-helper-functions', + href: '/foundations/auth-helper-functions', }, { title: 'Multi-Tenancy Patterns', - href: '/foundations/04-04-multi-tenancy-patterns', + href: '/foundations/multi-tenancy-patterns', }, { title: 'Performance Optimization', - href: '/foundations/04-05-performance-optimization', + href: '/foundations/rls-performance-optimization', }, { title: 'Pitfalls & Debugging', - href: '/foundations/04-06-common-pitfalls-and-debugging', + href: '/foundations/common-pitfalls-and-debugging', }, ], }, @@ -120,23 +120,23 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Storage Architecture', - href: '/foundations/05-01-storage-architecture', + href: '/foundations/storage-architecture', }, { title: 'Access Control', - href: '/foundations/05-02-access-control', + href: '/foundations/access-control', }, { title: 'File Operations', - href: '/foundations/05-03-file-operations', + href: '/foundations/file-operations', }, { title: 'Image Transformations', - href: '/foundations/05-04-image-transformations', + href: '/foundations/image-transformations', }, { title: 'Integration Patterns', - href: '/foundations/05-05-integration-patterns', + href: '/foundations/integration-patterns', }, ], }, @@ -145,23 +145,23 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Realtime Architecture', - href: '/foundations/06-01-realtime-architecture', + href: '/foundations/realtime-architecture', }, { title: 'Database Changes', - href: '/foundations/06-02-database-changes', + href: '/foundations/database-changes', }, { title: 'Broadcast', - href: '/foundations/06-03-broadcast', + href: '/foundations/broadcast', }, { title: 'Presence', - href: '/foundations/06-04-presence', + href: '/foundations/presence', }, { title: 'Real-World Patterns', - href: '/foundations/06-05-real-world-patterns', + href: '/foundations/real-world-patterns', }, ], }, @@ -170,27 +170,27 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Edge Functions Architecture', - href: '/foundations/07-01-edge-functions-architecture', + href: '/foundations/edge-functions-architecture', }, { title: 'Development Workflow', - href: '/foundations/07-02-development-workflow', + href: '/foundations/development-workflow', }, { title: 'Common Patterns', - href: '/foundations/07-03-common-patterns', + href: '/foundations/common-patterns', }, { title: 'Database Integration', - href: '/foundations/07-04-database-integration', + href: '/foundations/database-integration', }, { title: 'AI and LLM Integration', - href: '/foundations/07-05-ai-and-llm-integration', + href: '/foundations/ai-and-llm-integration', }, { title: 'Advanced Topics', - href: '/foundations/07-06-advanced-topics', + href: '/foundations/advanced-topics', }, ], }, @@ -199,23 +199,23 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Vector Fundamentals', - href: '/foundations/08-01-vector-fundamentals', + href: '/foundations/vector-fundamentals', }, { title: 'Indexing Strategies', - href: '/foundations/08-02-indexing-strategies', + href: '/foundations/indexing-strategies', }, { title: 'Search Patterns', - href: '/foundations/08-03-search-patterns', + href: '/foundations/search-patterns', }, { title: 'RAG Implementation', - href: '/foundations/08-04-rag-implementation', + href: '/foundations/rag-implementation', }, { title: 'Production Considerations', - href: '/foundations/08-05-production-considerations', + href: '/foundations/production-considerations', }, ], }, @@ -224,27 +224,27 @@ export const courses: SidebarNavGroup = { items: [ { title: 'Performance Optimization', - href: '/foundations/09-01-performance-optimization', + href: '/foundations/performance-optimization', }, { title: 'Monitoring & Observability', - href: '/foundations/09-02-monitoring-and-observability', + href: '/foundations/monitoring-and-observability', }, { title: 'Security Hardening', - href: '/foundations/09-03-security-hardening', + href: '/foundations/security-hardening', }, { title: 'Backup and Recovery', - href: '/foundations/09-04-backup-and-recovery', + href: '/foundations/backup-and-recovery', }, { title: 'Deployment Patterns', - href: '/foundations/09-05-deployment-patterns', + href: '/foundations/deployment-patterns', }, { title: 'Client Considerations', - href: '/foundations/09-06-client-considerations', + href: '/foundations/client-considerations', }, ], }, diff --git a/apps/learn/content/foundations/04-05-performance-optimization.mdx b/apps/learn/content/foundations/04-05-performance-optimization.mdx deleted file mode 100644 index a08320bf460..00000000000 --- a/apps/learn/content/foundations/04-05-performance-optimization.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Performance Optimization -description: Optimizing RLS policies for speed ---- - - -## Topics Covered - -- Indexing columns used in policies -- Function wrapping for performance: (select auth.uid()) -- Minimizing joins in policy conditions -- Using security definer functions strategically -- Benchmarking and profiling policies - -_Content coming soon_ diff --git a/apps/learn/content/foundations/introduction.mdx b/apps/learn/content/foundations/introduction.mdx index 4c378e9efe5..06ece4275b3 100644 --- a/apps/learn/content/foundations/introduction.mdx +++ b/apps/learn/content/foundations/introduction.mdx @@ -2,78 +2,42 @@ title: Supabase Foundations description: Learn the foundations of Supabase, the Postgres development platform. -explore: - - title: Supabase Docs - link: https://supabase.com/docs - itemType: doc - courseHero: title: Supabase Foundations subtitle: Learn the foundations of Supabase, the Postgres development platform. - description: In this short course, you'll explore how Supabase brings together **Database**, **Auth**, **Storage**, **Edge Functions**, and **Realtime** into a unified developer platform. + description: A comprehensive guide to building on Supabase — from your first project to production. Covers **Database**, **Auth**, **Row Level Security**, **Storage**, **Realtime**, **Edge Functions**, **AI and Vectors**, and more. stats: - - label: 5 Chapters + - label: 9 Sections icon: book-open accent: emerald - - label: ~1 hour - icon: clock - accent: blue - label: Beginner icon: zap accent: amber --- -In this short course, you'll explore how Supabase brings together **Database**, **Auth**, **Storage**, **Edge Functions**, and **Realtime** into a unified developer platform. - -By the end, you'll understand how each piece of Supabase fits together, how to persist and protect your data, and how to start confidently building your own applications. +A comprehensive guide to building on Supabase — from your first project to production. You'll learn how Database, Auth, Storage, Realtime, and Edge Functions work together, and how to use them confidently in your own applications. ## What you'll learn -- **Architecture**: how Supabase's core products work together. -- **Data fundamentals**: create tables, insert and retrieve data, and explore our generated APIs. -- **Authentication**: create and sign in users, and make secure requests. -- **Security**: enable Row Level Security (RLS) and write policies to protect your data. -- **Storage**: upload and serve files using buckets. -- **Edge Functions**: run custom backend logic close to your users, using Deno and Supabase's serverless runtime. -- **Vector search**: store and query embeddings for AI-powered search and recommendations. +- **Platform Architecture** — how Supabase is structured, when to choose it, setting up projects, and local development workflows. +- **Database Design & Postgres** — schema design, data types, functions, triggers, extensions, migrations, and replication. +- **Authentication & Users** — sign-up and login flows, authentication methods, user management, and security considerations. +- **Row Level Security** — RLS fundamentals, policy patterns, auth helpers, multi-tenancy, performance, and common pitfalls. +- **Storage** — architecture, access control, file operations, image transformations, and integration patterns. +- **Realtime** — subscribing to database changes, broadcast, presence, and real-world patterns. +- **Edge Functions** — architecture, development workflow, common patterns, database integration, and AI/LLM integration. +- **AI and Vectors** — vector fundamentals, indexing strategies, search patterns, and RAG implementation. +- **Production Readiness** — performance optimization, monitoring, security hardening, backups, and deployment patterns. --- ## Prerequisites - A [Supabase account](https://supabase.com/) (free) -- Basic familiarity with a terminal to run queries. - ---- - -## Course outline - -The course is split into 7 chapters, each approximately 10 minutes long. - -1. **What is Supabase?** - Get an overview of Supabase's architecture and core products. Create your first project and make a simple API call. -2. **Your First Table** - Create a Postgres table in Supabase, insert data, and query it through the REST API. -3. **Authentication Basics** - Add users, sign them in, and understand how Supabase secures your APIs with JWTs. -4. **Secure Your Data with Row-Level Security** - Enable Row-Level Security and write policies to ensure users only access their own data. -5. **Storage** - Store files in Supabase Storage and upload and serve files from your buckets. -6. **Edge Functions** - Deploy simple functions to run backend logic close to your users using Deno. -7. **Vector Search** - Store and query embeddings for AI-powered search and recommendations using Supabase Vector. +- Basic familiarity with a terminal --- ## Before you begin -Create a new project at [supabase.com](https://supabase.com), open the **Supabase Dashboard**, and grab your **API URL** and **anon key** from the [Connect dialog](https://supabase.com/dashboard/project/_/settings/api?showConnect=true&connectTab=frameworks). -You'll use them throughout the course to send real requests to your database and APIs. - ---- - -## Duration - -Approx. **1 hour** — a fast, hands-on introduction to the Supabase platform. +Create a new project at [supabase.com](https://supabase.com), open the **Supabase Dashboard**, and grab your **API URL** and **API key** from the [Connect dialog](https://supabase.com/dashboard/project/_/settings/api?showConnect=true&connectTab=frameworks). You'll use them throughout the course to send real requests to your database and APIs. diff --git a/apps/learn/contentlayer.config.js b/apps/learn/contentlayer.config.js index a225afd6336..4553270c564 100644 --- a/apps/learn/contentlayer.config.js +++ b/apps/learn/contentlayer.config.js @@ -12,11 +12,24 @@ import { visit } from 'unist-util-visit' const computedFields = { slug: { type: 'string', - resolve: (doc) => `/${doc._raw.flattenedPath}`, + resolve: (doc) => { + // Strip numeric prefixes like 01-01-, 02-02- from path segments + const cleanPath = doc._raw.flattenedPath + .split('/') + .map((segment) => segment.replace(/^\d{2}-\d{2}-/, '')) + .join('/') + return `/${cleanPath}` + }, }, slugAsParams: { type: 'string', - resolve: (doc) => doc._raw.flattenedPath, + resolve: (doc) => { + // Strip numeric prefixes like 01-01-, 02-02- from path segments + return doc._raw.flattenedPath + .split('/') + .map((segment) => segment.replace(/^\d{2}-\d{2}-/, '')) + .join('/') + }, }, }