diff --git a/content-collections.ts b/content-collections.ts index 09c031ea4..684e633e7 100644 --- a/content-collections.ts +++ b/content-collections.ts @@ -31,6 +31,7 @@ const posts = defineCollection({ published: z.iso.date(), updated: z.iso.date().optional(), draft: z.boolean().optional(), + rss: z.boolean().optional(), excerpt: z.string(), authors: z.string().array(), library: libraryListSchema.optional(), diff --git a/public/blog-assets/ag-grid-partnership/header-logos.png b/public/blog-assets/ag-grid-partnership/header-logos.png new file mode 100644 index 000000000..9d5e79f7d Binary files /dev/null and b/public/blog-assets/ag-grid-partnership/header-logos.png differ diff --git a/public/blog-assets/clerk-partnership/header.png b/public/blog-assets/clerk-partnership/header.png new file mode 100644 index 000000000..d28dcd5d8 Binary files /dev/null and b/public/blog-assets/clerk-partnership/header.png differ diff --git a/public/blog-assets/cloudflare-partnership/header.png b/public/blog-assets/cloudflare-partnership/header.png new file mode 100644 index 000000000..89683d09e Binary files /dev/null and b/public/blog-assets/cloudflare-partnership/header.png differ diff --git a/public/blog-assets/coderabbit-partnership/header.png b/public/blog-assets/coderabbit-partnership/header.png new file mode 100644 index 000000000..3d135acf0 Binary files /dev/null and b/public/blog-assets/coderabbit-partnership/header.png differ diff --git a/public/blog-assets/electric-partnership/header.png b/public/blog-assets/electric-partnership/header.png new file mode 100644 index 000000000..8225da855 Binary files /dev/null and b/public/blog-assets/electric-partnership/header.png differ diff --git a/public/blog-assets/lovable-partnership/header.png b/public/blog-assets/lovable-partnership/header.png new file mode 100644 index 000000000..89ac9caf7 Binary files /dev/null and b/public/blog-assets/lovable-partnership/header.png differ diff --git a/public/blog-assets/netlify-partnership/header-logos.png b/public/blog-assets/netlify-partnership/header-logos.png new file mode 100644 index 000000000..d8977e41c Binary files /dev/null and b/public/blog-assets/netlify-partnership/header-logos.png differ diff --git a/public/blog-assets/openrouter-partnership/header-logos.png b/public/blog-assets/openrouter-partnership/header-logos.png new file mode 100644 index 000000000..1afd9eb3c Binary files /dev/null and b/public/blog-assets/openrouter-partnership/header-logos.png differ diff --git a/public/blog-assets/prisma-partnership/header.png b/public/blog-assets/prisma-partnership/header.png new file mode 100644 index 000000000..67c4859ae Binary files /dev/null and b/public/blog-assets/prisma-partnership/header.png differ diff --git a/public/blog-assets/railway-partnership/header.png b/public/blog-assets/railway-partnership/header.png new file mode 100644 index 000000000..1fe099c9e Binary files /dev/null and b/public/blog-assets/railway-partnership/header.png differ diff --git a/public/blog-assets/render-partnership/header.png b/public/blog-assets/render-partnership/header.png new file mode 100644 index 000000000..1b1afd8b8 Binary files /dev/null and b/public/blog-assets/render-partnership/header.png differ diff --git a/public/blog-assets/sentry-partnership/header.png b/public/blog-assets/sentry-partnership/header.png new file mode 100644 index 000000000..a8914502c Binary files /dev/null and b/public/blog-assets/sentry-partnership/header.png differ diff --git a/public/blog-assets/serpapi-partnership/header.png b/public/blog-assets/serpapi-partnership/header.png new file mode 100644 index 000000000..74f38fe75 Binary files /dev/null and b/public/blog-assets/serpapi-partnership/header.png differ diff --git a/public/blog-assets/unkey-partnership/header.png b/public/blog-assets/unkey-partnership/header.png new file mode 100644 index 000000000..1f415268c Binary files /dev/null and b/public/blog-assets/unkey-partnership/header.png differ diff --git a/public/blog-assets/vercel-partnership/header.png b/public/blog-assets/vercel-partnership/header.png new file mode 100644 index 000000000..3d392a2cd Binary files /dev/null and b/public/blog-assets/vercel-partnership/header.png differ diff --git a/public/blog-assets/workos-partnership/header.png b/public/blog-assets/workos-partnership/header.png new file mode 100644 index 000000000..6a1690231 Binary files /dev/null and b/public/blog-assets/workos-partnership/header.png differ diff --git a/src/blog/ag-grid-partnership.md b/src/blog/ag-grid-partnership.md index 8dcf3e1d6..005ba6cc1 100644 --- a/src/blog/ag-grid-partnership.md +++ b/src/blog/ag-grid-partnership.md @@ -8,6 +8,8 @@ authors: - Niall Crosby --- +![TanStack + AG Grid](/blog-assets/ag-grid-partnership/header-logos.png) + We're excited to announce that [AG Grid](https://ag-grid.com/react-data-grid/?utm_source=reacttable&utm_campaign=githubreacttable) is now the official **TanStack Table** open-source partner! Together we will strive to achieve the following goals: - To jointly educate the JavaScript and TypeScript ecosystem about the differences between the two libraries and when to choose which. diff --git a/src/blog/clerk-partnership.md b/src/blog/clerk-partnership.md new file mode 100644 index 000000000..eeef81121 --- /dev/null +++ b/src/blog/clerk-partnership.md @@ -0,0 +1,22 @@ +--- +title: TanStack + Clerk Partnership +published: 2024-08-16 +updated: 2026-09-08 +rss: false +excerpt: Clerk supports TanStack with authentication tools that fit into the routes and server code of a Start app. +library: start,router +authors: + - Tanner Linsley +--- + +![TanStack + Clerk](/blog-assets/clerk-partnership/header.png) + +A sign-in screen is only the beginning of authentication. The session has to survive navigation, protected pages need to know who's signed in, and the server has to check access before returning private data. + +That's why we're excited to have Clerk supporting TanStack as a partner! Clerk focuses on the account and session experience, alongside the routing and application tools we're building with TanStack. + +The collaboration has a concrete integration to show for it. Clerk released its [TanStack Start SDK beta on September 11, 2024](https://clerk.com/changelog/2024-09-11-tanstack-start-beta), giving Start developers a dedicated way to add authentication and authorization. + +If you're adding Clerk to an app today, use the [current Start quickstart](https://clerk.com/docs/tanstack-react-start/getting-started/quickstart). Our [Clerk example app](/start/latest/docs/framework/react/examples/start-clerk-basic) also gives you a project to explore. + +Thanks to the Clerk team for supporting the project and making this part of building an app easier. diff --git a/src/blog/cloudflare-partnership.md b/src/blog/cloudflare-partnership.md new file mode 100644 index 000000000..faef5f24d --- /dev/null +++ b/src/blog/cloudflare-partnership.md @@ -0,0 +1,24 @@ +--- +title: TanStack + Cloudflare Partnership +published: 2025-09-08 +updated: 2026-09-08 +rss: false +excerpt: Cloudflare supports TanStack's independence and the work of running full-stack apps on Workers. +library: start +authors: + - Tanner Linsley +--- + +![TanStack + Cloudflare](/blog-assets/cloudflare-partnership/header.png) + +TanStack should be useful wherever you choose to deploy. Cloudflare is backing that direction as a partner, supporting our open-source work and giving TanStack Start developers a path to running their apps on Workers. + +There's engineering behind that path. Start's server rendering and server functions need to work in the deployment environment you choose, and our teams have been working through that integration as Start moves toward its 1.0 release. + +## Support that keeps deployment open + +Cloudflare's [September 23, 2025 announcement](https://blog.cloudflare.com/cloudflare-astro-tanstack/) puts the broader commitment into words. Cloudflare and Netlify are both supporting TanStack, even though they compete to host applications built with it. That helps us keep developing tools that developers can use across platforms. + +I'm grateful for that support! It gives us more room to improve TanStack while keeping the project open and independent. + +If Workers is where you want to run your app, our [Cloudflare partner page](/partners/cloudflare) links to the current deployment guides. diff --git a/src/blog/coderabbit-partnership.md b/src/blog/coderabbit-partnership.md new file mode 100644 index 000000000..b39c8c553 --- /dev/null +++ b/src/blog/coderabbit-partnership.md @@ -0,0 +1,19 @@ +--- +title: TanStack + CodeRabbit Partnership +published: 2025-08-16 +updated: 2026-09-08 +rss: false +excerpt: CodeRabbit supports TanStack and adds another review pass to the pull requests our maintainers work through. +authors: + - Tanner Linsley +--- + +![TanStack + CodeRabbit](/blog-assets/coderabbit-partnership/header.png) + +Every pull request asks a maintainer to spend some attention. Understanding the change, checking the edge cases, and deciding whether it belongs in the library all take work, even when the diff is small. + +CodeRabbit is joining TanStack as a partner, and we use its automated reviews in our pull request workflow. It can walk through a change, summarize what it does, and leave feedback for the author and maintainers to investigate before merging. + +The useful part is having that feedback in the conversation where we're already reviewing the code. An author can address a finding or explain why it doesn't apply, and maintainers still make the decisions about correctness and the direction of the project. + +Thanks to CodeRabbit for supporting TanStack and the people maintaining it! If you want to try the workflow in your own repository, our [CodeRabbit partner page](/partners/coderabbit) links to the setup and review documentation. diff --git a/src/blog/electric-partnership.md b/src/blog/electric-partnership.md new file mode 100644 index 000000000..786ec9314 --- /dev/null +++ b/src/blog/electric-partnership.md @@ -0,0 +1,22 @@ +--- +title: TanStack + Electric Partnership +published: 2025-05-25 +updated: 2026-09-08 +rss: false +excerpt: Electric and TanStack are building TanStack DB together, bringing reactive queries and Postgres sync into the same workflow. +library: db +authors: + - Tanner Linsley +--- + +![TanStack + Electric](/blog-assets/electric-partnership/header.png) + +I've wanted developers to be able to work with their data as naturally as if it were already local. Electric's Kyle Mathews and I found a lot of common ground there, especially around making that experience something you can adopt a little at a time. + +That shared direction became our work together on TanStack DB. Electric brings Postgres sync, and TanStack DB gives applications collections, live queries, and optimistic mutations to work with that data. Sam Willis's work on the reactive query engine helped make the pieces fit together. + +The result is useful in a very ordinary interaction: someone changes a record, and the views that depend on it update. Your components query collections, while the sync integration keeps those collections current. You can also bring data from existing APIs into DB, so trying this doesn't require replacing your entire backend. + +Electric's [July 2025 introduction to the collaboration](https://electric.ax/blog/2025/07/29/super-fast-apps-on-sync-with-tanstack-db) walks through how it came together. For the current API and setup, see the [Electric collection guide](/db/latest/docs/collections/electric-collection). + +I'm grateful to Kyle, Sam, and the Electric team for building this with us! diff --git a/src/blog/lovable-partnership.md b/src/blog/lovable-partnership.md new file mode 100644 index 000000000..04b0c777f --- /dev/null +++ b/src/blog/lovable-partnership.md @@ -0,0 +1,22 @@ +--- +title: TanStack + Lovable Partnership +published: 2026-07-01 +updated: 2026-09-08 +rss: false +excerpt: Lovable builds new apps on TanStack Start and supports the open-source foundations behind them. +library: start,router +authors: + - Tanner Linsley +--- + +![TanStack + Lovable](/blog-assets/lovable-partnership/header.png) + +When someone asks Lovable to build an app, TanStack Start is now part of what makes that app work! Lovable is also joining us as a partner, putting support back into the open-source tools its platform depends on. + +Their move to Start began with new projects on May 13, 2026. Lovable wanted to stay with React, render pages on the server, and build on an open framework that could run across hosting platforms. Those are choices we've put a lot of work into making possible. + +There are practical benefits for the person building the app. A page can arrive with its content already rendered, and server functions let backend logic live alongside the application instead of requiring a separately deployed function for each piece. + +We've also been working with Lovable on the TanStack guidance its AI uses when generating code. Starting from the skills we maintain, their team has been refining those rules around real projects. That's a useful place for collaboration, helping the generated code follow the framework's actual patterns. + +Read [Lovable's explanation of the move](https://lovable.dev/blog/building-apps-using-tanstack-start) for the details. I'm excited to see what people build on this foundation, and grateful to Lovable for helping sustain it. diff --git a/src/blog/netlify-partnership.md b/src/blog/netlify-partnership.md index d378de0d6..154c2a2c8 100644 --- a/src/blog/netlify-partnership.md +++ b/src/blog/netlify-partnership.md @@ -6,7 +6,7 @@ authors: - Tanner Linsley --- -![Netlify Header](/blog-assets/netlify-partnership/header.jpg) +![TanStack + Netlify](/blog-assets/netlify-partnership/header-logos.png) **Netlify is an official hosting partner for TanStack Start.** The practical result is a supported deployment path through [`@netlify/vite-plugin-tanstack-start`](https://www.npmjs.com/package/@netlify/vite-plugin-tanstack-start), including SSR, Server Routes, Server Functions, middleware, and local Netlify platform emulation. diff --git a/src/blog/openrouter-partnership.md b/src/blog/openrouter-partnership.md index 3d5c42d88..1499366fe 100644 --- a/src/blog/openrouter-partnership.md +++ b/src/blog/openrouter-partnership.md @@ -6,7 +6,7 @@ authors: - Tanner Linsley --- -![TanStack + OpenRouter](/blog-assets/openrouter-partnership/header.png) +![TanStack + OpenRouter](/blog-assets/openrouter-partnership/header-logos.png) **OpenRouter is now an official TanStack sponsor.** The most concrete expression of that is already shipped: [`@tanstack/ai-openrouter`](https://tanstack.com/ai/latest/docs/adapters/openrouter), a first-class TanStack AI adapter that gives you access to hundreds of models through one API. diff --git a/src/blog/prisma-partnership.md b/src/blog/prisma-partnership.md new file mode 100644 index 000000000..9f494c226 --- /dev/null +++ b/src/blog/prisma-partnership.md @@ -0,0 +1,20 @@ +--- +title: TanStack + Prisma Partnership +published: 2025-08-14 +updated: 2026-09-08 +rss: false +excerpt: Prisma backs TanStack with a shared focus on getting from a new app to a working Postgres database. +library: start,db +authors: + - Tanner Linsley +--- + +![TanStack + Prisma](/blog-assets/prisma-partnership/header.png) + +Prisma is joining us as a partner, and we already have something practical to work on together: making it easier to start a TanStack app with a Postgres database. + +Prisma Postgres takes the provisioning and infrastructure setup off your plate. You still own the important application decisions, your schema, your queries, and what the product does with its data, but getting a database running doesn't have to become a project of its own. + +That was also the focus of our first conversations. Alongside the sponsorship, our teams started working on Prisma as a database option in the TanStack CLI. A starter is much more useful when it can get you to a working application with persistence, instead of leaving you to assemble that part afterward. + +I'm excited to have the Prisma team involved, both in supporting TanStack and in making those first steps better! For the current setup, follow the integration guide linked from our [Prisma partner page](/partners/prisma). diff --git a/src/blog/railway-partnership.md b/src/blog/railway-partnership.md new file mode 100644 index 000000000..2a4dc0997 --- /dev/null +++ b/src/blog/railway-partnership.md @@ -0,0 +1,24 @@ +--- +title: TanStack + Railway Partnership +published: 2026-01-22 +updated: 2026-09-08 +rss: false +excerpt: A shorter path from a TanStack Start project to a running app, with Railway services and databases together. +library: start +authors: + - Tanner Linsley +--- + +![TanStack + Railway](/blog-assets/railway-partnership/header.png) + +Getting a full-stack app online should feel like the next step in building it. We're partnering with Railway to make that path easier for TanStack developers, with application services and databases managed in the same project. + +For TanStack Start, that means running the app as a Node service, including server rendering and server functions. When the app needs Postgres or another service, you can add it alongside the application and connect them through the project's private network. + +Railway's support also helps us keep working on TanStack itself. Deployment choice matters to us, and we're glad to have a partner investing in a good experience for people who choose Railway! + +## The deployment work continues + +In September 2026, we celebrated the ongoing partnership with an updated TanStack Start guide and a focus on the `railway up` workflow and Railway Sandboxes. The guide gives you a direct path from a local Start project to a deployed service. Sandboxes give you an environment for running and testing code programmatically. + +Start with [Railway's TanStack Start guide](https://docs.railway.com/guides/tanstack-start), or see our [Railway walkthrough](/partners/railway). The [Sandbox documentation](https://docs.railway.com/sandboxes) covers that separate workflow. diff --git a/src/blog/render-partnership.md b/src/blog/render-partnership.md new file mode 100644 index 000000000..2f6a1ac0c --- /dev/null +++ b/src/blog/render-partnership.md @@ -0,0 +1,22 @@ +--- +title: TanStack + Render Partnership +published: 2026-09-01 +updated: 2026-09-08 +rss: false +excerpt: Render joins TanStack to make shipping full-stack apps easier, with managed services and versioned infrastructure. +library: start +authors: + - Tanner Linsley +--- + +![TanStack + Render](/blog-assets/render-partnership/header.png) + +We're teaming up with Render to make it easier to get a TanStack app into production and keep building once it's there. Render is supporting TanStack as a Gold partner, helping fund the open-source tools that go into those apps. + +A Start app might begin with a few routes and a database. Later, you add a background worker, a cache, or another service. Render gives those pieces a home together, with managed Postgres, Redis-compatible Key Value, and private networking between services. You can spend more of your time on the application as it grows. + +The deployment path is concrete, too. TanStack Start runs as a Node web service on Render, and a `render.yaml` Blueprint lets you keep the service configuration in the same repository as your code. Pull request previews give you somewhere to check a change before shipping it. + +Thanks to the Render team for backing TanStack and working with us on that path! + +Our [Render deployment walkthrough](/partners/render) covers the setup, from creating the app to deploying its first Blueprint. diff --git a/src/blog/sentry-partnership.md b/src/blog/sentry-partnership.md new file mode 100644 index 000000000..418f5f94b --- /dev/null +++ b/src/blog/sentry-partnership.md @@ -0,0 +1,20 @@ +--- +title: TanStack + Sentry Partnership +published: 2024-07-18 +updated: 2026-09-08 +rss: false +excerpt: Sentry supports TanStack and helps developers connect production errors to the code and requests behind them. +library: start,router +authors: + - Tanner Linsley +--- + +![TanStack + Sentry](/blog-assets/sentry-partnership/header.png) + +An app can work perfectly on your machine and still fail for someone using it. When that happens, you need more to go on than a report that a page didn't load. + +We're welcoming Sentry as a TanStack partner! Their error monitoring and performance tools help developers investigate what happened in production, connecting failures and slow requests to the code involved. That's useful context in an app where routing, data loading, and rendering all contribute to what a user sees. + +Sentry's support helps us keep improving the open-source tools underneath those applications. It's a good fit for the work that continues after the first deployment, finding the problems real users encounter and getting them fixed. + +For a Start app today, the [Sentry integration guide](https://docs.sentry.io/platforms/javascript/guides/tanstackstart-react/) is the place to begin. Thanks to the Sentry team for backing TanStack. diff --git a/src/blog/serpapi-partnership.md b/src/blog/serpapi-partnership.md new file mode 100644 index 000000000..cfebd8bb5 --- /dev/null +++ b/src/blog/serpapi-partnership.md @@ -0,0 +1,22 @@ +--- +title: TanStack + SerpApi Partnership +published: 2026-02-24 +updated: 2026-09-08 +rss: false +excerpt: SerpApi supports TanStack and gives applications structured search results to build on. +library: start,ai +authors: + - Tanner Linsley +--- + +![TanStack + SerpApi](/blog-assets/serpapi-partnership/header.png) + +Sometimes the data your app needs is out on the web. A research tool might need search results, a dashboard might track where a page appears, or an agent might need sources it can return to a user. + +SerpApi is supporting TanStack as a partner and provides a way to retrieve those results as structured JSON. It handles the search engine requests and parsing, including location-specific searches, so your application can work with fields instead of maintaining its own HTML scraper. + +In a TanStack Start app, that request belongs in server code. Keep the API key there, call SerpApi, and return the results your interface needs. From there you can build a results page, add filters, or make search available as a tool for an AI workflow. + +The [JavaScript integration guide](https://serpapi.com/integrations/javascript) is a good starting point. For tools that connect through MCP, there's also an [MCP integration](https://serpapi.com/integrations/mcp). + +Thanks to SerpApi for helping support the open-source work behind TanStack! diff --git a/src/blog/unkey-partnership.md b/src/blog/unkey-partnership.md new file mode 100644 index 000000000..bcecb9284 --- /dev/null +++ b/src/blog/unkey-partnership.md @@ -0,0 +1,20 @@ +--- +title: TanStack + Unkey Partnership +published: 2025-04-24 +updated: 2026-09-08 +rss: false +excerpt: Unkey supports TanStack's work on controlling application workload, with API keys and server-side rate limits. +library: pacer +authors: + - Tanner Linsley +--- + +![TanStack + Unkey](/blog-assets/unkey-partnership/header.png) + +A search box can debounce input, but that doesn't stop someone from calling the API directly. Keeping an app responsive and deciding how much work its server will accept are related problems, and they need controls in different places. + +We're welcoming Unkey as a TanStack partner alongside our work on TanStack Pacer! Pacer gives you tools like debouncing, throttling, and queuing inside your application. Unkey provides API key management and server-side rate limiting, where you can enforce access and usage limits on incoming requests. + +For example, an app can use Pacer to avoid sending a request for every keystroke, then check a caller's rate limit on the server before doing expensive work. The client makes the interaction smoother, and the server remains responsible for enforcing the limit. + +Thanks to Unkey for supporting TanStack. Their [rate limiting guide](https://www.unkey.com/docs/platform/ratelimiting/introduction) covers that server-side piece, and our [Unkey partner page](/partners/unkey) also links to the API key setup. diff --git a/src/blog/vercel-partnership.md b/src/blog/vercel-partnership.md new file mode 100644 index 000000000..e3719a670 --- /dev/null +++ b/src/blog/vercel-partnership.md @@ -0,0 +1,30 @@ +--- +title: TanStack + Vercel Partnership +published: 2026-09-08 +excerpt: Vercel is a Gold TanStack partner, supporting our open-source work with integrations for TanStack Start, AI Gateway, and Sandbox. +library: start,ai +authors: + - Tanner Linsley +--- + +![TanStack + Vercel](/blog-assets/vercel-partnership/header.png) + +**Vercel is now a Gold TanStack partner!** Their support helps fund our open-source work, and there are already a few ways to use the two together, from deploying a TanStack Start app to running model calls and coding agents with TanStack AI. + +## TanStack Start on Vercel + +You can deploy a full-stack TanStack Start app on Vercel, with Git-based deployments and preview URLs for reviewing changes before they go live. Vercel's [TanStack Start deployment guide](https://vercel.com/kb/guide/deploy-a-tanstack-start-app-to-vercel) covers the setup, and our [hosting guide](/start/latest/docs/framework/react/guide/hosting) has the configuration details alongside the other deployment options Start supports. + +## Vercel AI Gateway + +The [`@tanstack/ai-vercel-gateway` adapter](/ai/latest/docs/adapters/vercel-gateway) connects TanStack AI to Vercel AI Gateway for chat, embeddings, image generation, and summarization. You can route requests across model providers with one API key and configure provider preferences and fallback models per request, while keeping TanStack AI's existing chat and streaming APIs. + +Vercel's [AI Gateway guide](https://vercel.com/kb/guide/tanstack-ai-vercel-ai-gateway) covers authentication, streaming a chat response, and configuring those routing options. + +## Vercel Sandbox + +Model calls are one part of building an agent, giving it somewhere to run commands and edit files is another. [`@tanstack/ai-sandbox-vercel`](https://vercel.com/kb/guide/tanstack-ai-vercel-sandbox) plugs Vercel's managed microVMs into TanStack AI's sandbox system, so you can choose where an agent runs separately from which agent you use. + +The integration supports resuming a sandbox by ID with its files intact and exposing a dev server port for previews. Your workspace definition stays with TanStack AI, and Vercel provides the environment it runs in. + +Thanks to the Vercel team for supporting TanStack and putting these guides together. You can find the deployment and AI integration docs on our [Vercel partner page](/partners/vercel). diff --git a/src/blog/workos-partnership.md b/src/blog/workos-partnership.md new file mode 100644 index 000000000..7ab70db5d --- /dev/null +++ b/src/blog/workos-partnership.md @@ -0,0 +1,20 @@ +--- +title: TanStack + WorkOS Partnership +published: 2025-09-23 +updated: 2026-09-08 +rss: false +excerpt: WorkOS supports TanStack and helps developers bring business identity requirements into their applications. +library: start,router +authors: + - Tanner Linsley +--- + +![TanStack + WorkOS](/blog-assets/workos-partnership/header.png) + +Your app is ready for a customer, and then their IT team asks whether it works with the company's identity provider. That can turn a sign-in feature into a much larger project. + +WorkOS is joining TanStack as a partner to support developers building those kinds of applications. Its tools cover requirements like single sign-on, directory sync, and audit logs, the things a business may need before its employees can use your product. + +For a TanStack Start app today, the [WorkOS AuthKit SDK](https://workos.com/docs/sdks/authkit-tanstack-start) provides the authentication and session integration. You can read the current user in a route loader or server function, and use that session when deciding what the application should return. Our [Start example](/start/latest/docs/framework/react/examples/start-workos) shows the integration in a working project. + +We're grateful to WorkOS for backing TanStack and helping developers handle the identity requirements that come with growing a business application! diff --git a/src/components/ds/ui/BlogPostCard.tsx b/src/components/ds/ui/BlogPostCard.tsx index 3d1e040a5..c626457c7 100644 --- a/src/components/ds/ui/BlogPostCard.tsx +++ b/src/components/ds/ui/BlogPostCard.tsx @@ -57,7 +57,7 @@ export function BlogPostCard({ // the focus ring keeps keyboard focus visible now the bg cue is gone. 'group/post flex flex-col rounded-xl corner-squircle transition-transform duration-200 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-background-default motion-safe:hover:-translate-y-0.5', featured - ? 'gap-4 md:min-h-[410px] md:flex-row md:gap-6' + ? 'gap-4 md:flex-row md:items-center md:gap-6' : isLarge ? 'gap-4' : 'gap-3', @@ -69,7 +69,8 @@ export function BlogPostCard({ {post.headerImage ? ( @@ -83,7 +84,9 @@ export function BlogPostCard({ alt="" loading={featured ? 'eager' : 'lazy'} decoding="async" - className="h-full w-full object-cover" + className={ + featured ? 'block h-auto w-full' : 'h-full w-full object-cover' + } /> ) : ( Resources -

- Resources for using {partner.name} with TanStack. -

{resources.map((resource) => { const isExternal = resource.href.startsWith('http') diff --git a/src/routes/partners.railway.tsx b/src/routes/partners.railway.tsx index 9028dc796..132044f61 100644 --- a/src/routes/partners.railway.tsx +++ b/src/routes/partners.railway.tsx @@ -517,6 +517,9 @@ function RailwayPartnerPage() { > Read the deployment guide +
diff --git a/src/routes/partners.render.tsx b/src/routes/partners.render.tsx index 3354f7321..580aff513 100644 --- a/src/routes/partners.render.tsx +++ b/src/routes/partners.render.tsx @@ -527,6 +527,9 @@ function RenderPartnerPage() { > Read the deployment guide + diff --git a/src/routes/rss[.]xml.ts b/src/routes/rss[.]xml.ts index 172f38f16..9b4a2b84f 100644 --- a/src/routes/rss[.]xml.ts +++ b/src/routes/rss[.]xml.ts @@ -25,8 +25,10 @@ export function getRssImageMediaType(src: string) { return 'application/octet-stream' } -function generateRSSFeed() { - const posts = getPublishedPosts().slice(0, 50) // Most recent 50 posts +export function generateRSSFeed() { + const posts = getPublishedPosts() + .filter((post) => post.rss !== false) + .slice(0, 50) const siteUrl = 'https://tanstack.com' const buildDate = new Date().toUTCString() diff --git a/src/utils/partners.tsx b/src/utils/partners.tsx index 5e2ed4fe6..ba17b4164 100644 --- a/src/utils/partners.tsx +++ b/src/utils/partners.tsx @@ -500,6 +500,11 @@ const clerk = ((): Partner => { href, canonicalHref: 'https://clerk.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Clerk partnership', + href: '/blog/clerk-partnership', + }, { kind: 'documentation', label: 'Clerk TanStack Start quickstart', @@ -556,6 +561,11 @@ const workos = ((): Partner => { href, canonicalHref: 'https://workos.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + WorkOS partnership', + href: '/blog/workos-partnership', + }, { kind: 'documentation', label: 'WorkOS AuthKit TanStack Start SDK', @@ -730,6 +740,11 @@ const cloudflare = ((): Partner => { href, canonicalHref: 'https://www.cloudflare.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Cloudflare partnership', + href: '/blog/cloudflare-partnership', + }, { kind: 'documentation', label: 'Cloudflare TanStack Start guide', @@ -778,6 +793,11 @@ const lovable = ((): Partner => { href, canonicalHref: 'https://lovable.dev/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Lovable partnership', + href: '/blog/lovable-partnership', + }, { kind: 'documentation', label: 'Build with a URL in Lovable', @@ -837,6 +857,11 @@ const sentry = ((): Partner => { href, canonicalHref: 'https://sentry.io/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Sentry partnership', + href: '/blog/sentry-partnership', + }, { kind: 'documentation', label: 'Sentry for TanStack Start', @@ -1002,6 +1027,11 @@ const unkey = ((): Partner => { href, canonicalHref: 'https://www.unkey.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Unkey partnership', + href: '/blog/unkey-partnership', + }, { kind: 'documentation', label: 'Unkey server-side rate limiting', @@ -1055,6 +1085,11 @@ const serpApi = ((): Partner => { href, canonicalHref: 'https://serpapi.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + SerpApi partnership', + href: '/blog/serpapi-partnership', + }, { kind: 'documentation', label: 'SerpApi JavaScript integration', @@ -1112,6 +1147,11 @@ const electric = ((): Partner => { href, canonicalHref: 'https://electric.ax/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Electric partnership', + href: '/blog/electric-partnership', + }, { kind: 'documentation', label: 'TanStack DB Electric collection', @@ -1167,8 +1207,28 @@ const vercel = ((): Partner => { label: 'TanStack Start on Vercel', href: 'https://vercel.com/kb/guide/deploy-a-tanstack-start-app-to-vercel', }, + { + kind: 'documentation', + label: 'Vercel AI Gateway adapter', + href: '/ai/latest/docs/adapters/vercel-gateway', + }, + { + kind: 'documentation', + label: 'TanStack AI with Vercel Sandbox', + href: 'https://vercel.com/kb/guide/tanstack-ai-vercel-sandbox', + }, + { + kind: 'documentation', + label: 'TanStack AI with Vercel AI Gateway', + href: 'https://vercel.com/kb/guide/tanstack-ai-vercel-ai-gateway', + }, + { + kind: 'announcement', + label: 'TanStack + Vercel partnership', + href: '/blog/vercel-partnership', + }, ], - relatedProducts: ['start', 'router'], + relatedProducts: ['start', 'router', 'ai'], status: 'active', lastReviewedAt: currentPartnerReviewDate, tier: 'gold', @@ -1210,6 +1270,11 @@ const prisma = ((): Partner => { href, canonicalHref: 'https://www.prisma.io/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Prisma partnership', + href: '/blog/prisma-partnership', + }, { kind: 'documentation', label: 'Prisma with TanStack Start', @@ -1254,6 +1319,11 @@ const codeRabbit = ((): Partner => { href, canonicalHref: 'https://www.coderabbit.ai/', resources: [ + { + kind: 'announcement', + label: 'TanStack + CodeRabbit partnership', + href: '/blog/coderabbit-partnership', + }, { kind: 'documentation', label: 'CodeRabbit quickstart', @@ -1398,6 +1468,11 @@ const railway = ((): Partner => { href, canonicalHref: 'https://railway.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Railway partnership', + href: '/blog/railway-partnership', + }, { kind: 'documentation', label: 'TanStack Start hosting guide', @@ -1443,6 +1518,11 @@ const render = ((): Partner => { href, canonicalHref: 'https://render.com/', resources: [ + { + kind: 'announcement', + label: 'TanStack + Render partnership', + href: '/blog/render-partnership', + }, { kind: 'documentation', label: 'TanStack Start hosting guide', diff --git a/tests/rss.test.ts b/tests/rss.test.ts index 090b808a1..827a7f2ae 100644 --- a/tests/rss.test.ts +++ b/tests/rss.test.ts @@ -1,6 +1,32 @@ import assert from 'node:assert/strict' import test from 'node:test' -import { getRssImageMediaType } from '../src/routes/rss[.]xml' +import { generateRSSFeed, getRssImageMediaType } from '../src/routes/rss[.]xml' +import { getPublishedPosts } from '../src/utils/blog' + +test('retrospective partner posts stay out of RSS while regular posts remain', () => { + const feed = generateRSSFeed() + const latestRegularPost = getPublishedPosts().find( + (post) => post.rss !== false, + ) + assert.ok(latestRegularPost) + assert.ok(feed.includes(`/blog/${latestRegularPost.slug}`)) + for (const partner of [ + 'sentry', + 'clerk', + 'unkey', + 'electric', + 'prisma', + 'coderabbit', + 'cloudflare', + 'workos', + 'railway', + 'serpapi', + 'lovable', + 'render', + ]) { + assert.ok(!feed.includes(`/blog/${partner}-partnership`)) + } +}) test('uses the image media type matching an RSS enclosure URL', () => { assert.equal(getRssImageMediaType('/header.png'), 'image/png') diff --git a/vite.config.ts b/vite.config.ts index f6cfa87c8..8ae2ecb23 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -186,7 +186,7 @@ export default defineConfig({ envDir, define: { __TANSTACK_ENABLE_SERVER_BUILDER_GENERATION__: JSON.stringify(true), - __TANSTACK_ENABLE_IMAGE_TRANSFORMATIONS__: JSON.stringify(true), + __TANSTACK_ENABLE_IMAGE_TRANSFORMATIONS__: JSON.stringify(!isDev), __TANSTACK_LOCAL_DOCS_TOKEN__: JSON.stringify(localDocsDevToken), __TANSTACK_SITE_URL__: JSON.stringify(SITE_URL), },