diff --git a/packages/web/docs/package.json b/packages/web/docs/package.json
index 93947fe69d1..0c63b081f10 100644
--- a/packages/web/docs/package.json
+++ b/packages/web/docs/package.json
@@ -28,6 +28,7 @@
"tailwind-merge": "2.6.0"
},
"devDependencies": {
+ "@mdx-js/typescript-plugin": "^0.0.8",
"@tailwindcss/typography": "0.5.16",
"@theguild/tailwind-config": "0.6.3",
"@types/react": "18.3.18",
diff --git a/packages/web/docs/public/blog-assets/add-reactivity-to-an-existing-source/PimpMyGraphQL.webm b/packages/web/docs/public/blog-assets/add-reactivity-to-an-existing-source/PimpMyGraphQL.webm
new file mode 100644
index 00000000000..26fbcb2cda9
Binary files /dev/null and b/packages/web/docs/public/blog-assets/add-reactivity-to-an-existing-source/PimpMyGraphQL.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-as-a-best-practice-for-modern-angular-apps/graphiql.webm b/packages/web/docs/public/blog-assets/graphql-as-a-best-practice-for-modern-angular-apps/graphiql.webm
new file mode 100644
index 00000000000..586e369f38c
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-as-a-best-practice-for-modern-angular-apps/graphiql.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-deep-dive-5/2.webm b/packages/web/docs/public/blog-assets/graphql-deep-dive-5/2.webm
new file mode 100644
index 00000000000..30dbff0276f
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-deep-dive-5/2.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-deep-dive-5/8.webm b/packages/web/docs/public/blog-assets/graphql-deep-dive-5/8.webm
new file mode 100644
index 00000000000..58e5b25241e
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-deep-dive-5/8.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-deep-dive-5/9.webm b/packages/web/docs/public/blog-assets/graphql-deep-dive-5/9.webm
new file mode 100644
index 00000000000..2cb0b3c5fb5
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-deep-dive-5/9.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-geo-strike/gameplay.mp4 b/packages/web/docs/public/blog-assets/graphql-geo-strike/gameplay.mp4
new file mode 100644
index 00000000000..5f9b0f9ab8d
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-geo-strike/gameplay.mp4 differ
diff --git a/packages/web/docs/public/blog-assets/graphql-geo-strike/gameplay.webm b/packages/web/docs/public/blog-assets/graphql-geo-strike/gameplay.webm
new file mode 100644
index 00000000000..bf538f2850b
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-geo-strike/gameplay.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-geo-strike/map.mp4 b/packages/web/docs/public/blog-assets/graphql-geo-strike/map.mp4
new file mode 100644
index 00000000000..66553b2b26d
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-geo-strike/map.mp4 differ
diff --git a/packages/web/docs/public/blog-assets/graphql-geo-strike/map.webm b/packages/web/docs/public/blog-assets/graphql-geo-strike/map.webm
new file mode 100644
index 00000000000..abadbcff346
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-geo-strike/map.webm differ
diff --git a/packages/web/docs/public/blog-assets/graphql-stencil-apollo/stencil.webm b/packages/web/docs/public/blog-assets/graphql-stencil-apollo/stencil.webm
new file mode 100644
index 00000000000..dff1460e98e
Binary files /dev/null and b/packages/web/docs/public/blog-assets/graphql-stencil-apollo/stencil.webm differ
diff --git a/packages/web/docs/public/blog-assets/introducing-graphql-inspector/cli.webm b/packages/web/docs/public/blog-assets/introducing-graphql-inspector/cli.webm
new file mode 100644
index 00000000000..380ce051f7a
Binary files /dev/null and b/packages/web/docs/public/blog-assets/introducing-graphql-inspector/cli.webm differ
diff --git a/packages/web/docs/public/blog-assets/manage-circular-imports-hell-in-graphql-modules/math.webm b/packages/web/docs/public/blog-assets/manage-circular-imports-hell-in-graphql-modules/math.webm
new file mode 100644
index 00000000000..523a388e708
Binary files /dev/null and b/packages/web/docs/public/blog-assets/manage-circular-imports-hell-in-graphql-modules/math.webm differ
diff --git a/packages/web/docs/public/blog-assets/whatsapp-clone/68ea32458cb9961d5132fe3c6ba8788c.webm b/packages/web/docs/public/blog-assets/whatsapp-clone/68ea32458cb9961d5132fe3c6ba8788c.webm
new file mode 100644
index 00000000000..0b8d54f2880
Binary files /dev/null and b/packages/web/docs/public/blog-assets/whatsapp-clone/68ea32458cb9961d5132fe3c6ba8788c.webm differ
diff --git a/packages/web/docs/public/blog-assets/whatsapp-clone/app.webm b/packages/web/docs/public/blog-assets/whatsapp-clone/app.webm
new file mode 100644
index 00000000000..72bcf41454c
Binary files /dev/null and b/packages/web/docs/public/blog-assets/whatsapp-clone/app.webm differ
diff --git a/packages/web/docs/src/app/blog/(posts)/a-new-year-for-schema-stitching/page.mdx b/packages/web/docs/src/app/blog/(posts)/a-new-year-for-schema-stitching/page.mdx
new file mode 100644
index 00000000000..bdf8cfdffd0
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/a-new-year-for-schema-stitching/page.mdx
@@ -0,0 +1,94 @@
+---
+title: A New Year for GraphQL Schema Stitching
+description: 2021 is the year to give Schema Stitching a fresh look after its recent renovation
+date: 2021-01-14
+authors: gmac
+tags: [graphql, graphql-federation, graphql-tools, schema-stitching]
+---
+
+> If you'd told me eight months ago that I'd end up
+> [writing a book](https://github.com/gmac/schema-stitching-handbook) on Schema Stitching, I
+> wouldn't have believed it.
+
+That's because eight months ago my team was trying to mature an old GraphQL prototype into a formal
+API product, and our dependence on Schema Stitching v4 (a
+[famously abandoned project](https://apollographql.com/docs/federation/migrating-from-stitching) of
+Apollo) imposed numerous bugs, limitations, and performance bottlenecks on our work. I researched
+transitioning to the newer [Apollo Federation](https://apollographql.com/docs/federation) as a
+solution to these woes, but the involved migration path proved too daunting for our immediate time
+constraints.
+
+## Not "The Old" Schema Stitching
+
+Something remarkable happened at this critical juncture for my team...
+
+[GraphQL Tools](https://graphql-tools.com/docs/introduction) (the repo of Schema Stitching
+libraries) was brought back to life by **The Guild** and friends. The most pivotal new addition was
+a small mention of "[type merging](https://graphql-tools.com/docs/stitch-type-merging)", a feature
+that introduced automated query planning for types distributed across services (very similar to
+Apollo Federation). The new v5 library was still pretty raw, but it started a feedback loop that
+matured the library dramatically in v6, and then again in v7 (and will again in v8!).
+
+During these development cycles, numerous missing Stitching features were identified and added:
+[batch execution](https://github.com/gmac/schema-stitching-handbook/wiki/Batching-Arrays-and-Queries#what-is-query-batching)
+for consolidating sub-service requests,
+[computed fields](https://graphql-tools.com/docs/stitch-type-merging#computed-fields) for
+encapsulating service concerns,
+[interface proxies](https://graphql-tools.com/docs/stitch-type-merging#computed-fields) for bridging
+interfaces across services, and
+[schema directives](https://graphql-tools.com/docs/stitch-directives-sdl) for configuring stitched
+schemas via SDL annotations. Also, the
+[library documentation](https://graphql-tools.com/docs/stitch-combining-schemas) was rewritten from
+top-to-bottom for a new generation of users.
+
+Coming into 2021, Schema Stitching has been revitalized into an un-opinionated library capable of
+building an opinionated framework like Apollo Federation. If you want out-of-the-box workflows,
+Federation is the tool for you. Otherwise, Stitching is the comparable alternative that keeps you in
+control of your full system architecture.
+
+## The Handbook
+
+The tricky thing about the self-service nature of Schema Stitching is that its usage extends beyond
+just the scope of library documentation. To bridge this knowledge gap, the
+[Schema Stitching Handbook](https://github.com/gmac/schema-stitching-handbook) was started as a
+companion guide that walks through building stitching libraries into practical applications. The
+content is split into a few major sections:
+
+1. **Foundation** chapters cover the setup and use of core stitching library features. These
+ chapters provide code examples and detailed explanations of subjects covered in the
+ [official documentation](https://graphql-tools.com/docs/stitch-combining-schemas).
+2. **Architecture** chapters explore larger structural concerns around
+ [testing](https://github.com/gmac/schema-stitching-handbook/blob/master/continuous-integration-testing),
+ [versioning](https://github.com/gmac/schema-stitching-handbook/blob/master/versioning-schema-releases),
+ and
+ [releasing](https://github.com/gmac/schema-stitching-handbook/blob/master/hot-schema-reloading)
+ stitched schemas. Stitching has no CLI or
+ [managed services](https://apollographql.com/docs/federation/managed-federation/overview), but
+ you may find that these tools are not prohibitively difficult to self-service.
+3. **Other Integration** chapters explore how
+ [other tools](https://github.com/gmac/schema-stitching-handbook/tree/master/federation-services)
+ and
+ [programming languages](https://github.com/gmac/schema-stitching-handbook/tree/master/subservice-languages/ruby)
+ fit into a stitched schema. Stitching is perfectly compatible with any valid GraphQL resource,
+ and we're excited to catalog that here.
+
+The Handbook is versioned as a living repo to provide a comprehensive guide that may evolve with the
+library. We look to you, fellow developers, to contribute your own discoveries of how Schema
+Stitching integrates with tools and languages that we haven't explored yet.
+
+## A New Year
+
+Whether you're planning a new API project, looking to migrate an existing one, or curious of
+alternatives for your current distributed GraphQL architecture, 2021 is the year to give Schema
+Stitching a fresh look. Read the
+[new documentation](https://graphql-tools.com/docs/stitch-combining-schemas),
+[review the handbook](https://github.com/gmac/schema-stitching-handbook),
+[watch the video series](https://youtube.com/watch?v=8-mZqjgIdiI&list=PLTJ2vmU3jbWy6JntdRQZAmy0mcpYu2OD1),
+or [join us for a conversation](https://github.com/ardatan/graphql-tools/discussions) to learn about
+the exciting progress that was made last year.
+
+---
+
+- [GraphQL Tools repository](https://github.com/ardatan/graphql-tools)
+- [GraphQL Schema Stitching Handbook](https://github.com/gmac/schema-stitching-handbook)
+- [Schema Stitching official documentation](https://graphql-tools.com/docs/stitch-combining-schemas)
diff --git a/packages/web/docs/src/app/blog/(posts)/accounts.js-1.0-rc/page.mdx b/packages/web/docs/src/app/blog/(posts)/accounts.js-1.0-rc/page.mdx
new file mode 100644
index 00000000000..4e5bb2cc1fe
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/accounts.js-1.0-rc/page.mdx
@@ -0,0 +1,306 @@
+---
+title: Announcing Accounts.js 1.0 Release Candidate
+tags: [accounts-js, graphql-modules, graphql]
+authors: [niccolo]
+date: 2024-01-08
+description:
+ Introducing Accounts.js 1.0 Release Candidate, an end to end authentication and accounts
+ management solution.
+---
+
+The first release candidate of [Accounts.js](https://www.accountsjs.com/) 1.0 is now officially
+available!
+
+It's the culmination of a long process of rearchitecting the whole framework, which is finally a
+first-class citizen of the [graphql-modules](https://the-guild.dev/graphql/modules) package. It
+supports the latest GraphQL.js v16 and [graphql-tools](https://the-guild.dev/graphql/tools) v10 as
+well as any modern GraphQL server including Apollo Server v4 and
+[GraphQL Yoga](https://the-guild.dev/graphql/yoga-server) v5.
+
+## About Me
+
+My name is Niccolò Belli, [darkbasic](https://github.com/darkbasic) on GitHub. I'm a freelance
+full-stack web developer passionate about open source who loves to work with Typescript and GraphQL,
+along with managing Linux servers. I've been working on Open Source technologies since many years
+and I've recently become an Accounts.js maintainer because I was tired of the existing alternatives
+and their lack of GraphQL integration. While I don't like overly-opinionated frameworks that lock
+you in into their ecosystems I love to work with libraries that allow you to quickly prototype your
+application while being scalable and highly customizable. That's why I'm also a MikroORM
+collaborator, which is the best Node.js ORM available and allows me to retain any amount of
+flexibility if I decide to manually write big PostgreSQL queries and hydrate the results back into
+the ORM for further processing. I've developed many tools around this workflow, including
+automatically generating [slonik](https://github.com/gajus/slonik) types via the ORM metadata to
+manually write composable SQL queries that are type safe at runtime and build time. This is material
+for another blog post but I would love to make everything open source once my prerequisite
+[zod PR](https://github.com/colinhacks/zod/pull/2234) gets merged.
+
+## What Is Accounts.JS
+
+The `@accounts` suite of packages aims to provide an end-to-end authentication and accounts
+management solution with n user-friendly way to start while preserving options for configuration.
+These packages offer OAuth support for popular providers such as Instagram or Twitter, two-factor
+authentication, password-based accounts, recovery options, and customizable account creation and
+validation.
+
+To integrate `accounts-js` into your application, you need to configure these three components:
+
+1. **Transports**: The flexibility of `accounts-js` allows it to be integrated with different types
+ of APIs. For now, we provide packages for both GraphQL and REST.
+
+2. **Databases**: Accounts.js provides a
+ [native Mongo integration](https://github.com/accounts-js/accounts/tree/master/packages/database-mongo).
+ Additionally, it offers
+ [MikroORM](https://github.com/accounts-js/accounts/tree/master/packages/database-mikro-orm) and
+ [Typeorm](https://github.com/accounts-js/accounts/tree/master/packages/database-typeorm)
+ integrations, which lets you use `accounts-js` with any database. Optionally, you can use Redis
+ to store the session data, or provide a custom database adapter that will work with existing
+ authentication strategies by implementing the `DatabaseInterface`.
+
+3. **Strategies**: You can use multiple strategies to let your users access your app. For now, it
+ supports password-based, magic link, and OAuth authentication methods.
+
+**Note**: Accounts.js is a **full-stack** solution, providing a full set of packages to seamlessly
+implement your chosen authentication workflow on the **client** as well!
+
+## The New Architecture
+
+In Accounts.js 1.0, we use `graphql-modules` to compose the authentication framework, automatically
+piecing together your preferred database adapter(s) with the authentication service(s) of your
+choice (password-based, OAuth, etc). As mentioned before, `accounts-js` currently supports GraphQL
+and REST. For the former, `graphql-modules` automatically provides the schema based on the modules
+you're using, while for the latter, it provides dependency injection across the various modules to
+piece them together.
+
+```ts
+const app = createApplication({
+ modules: [
+ createAccountsCoreModule({ tokenSecret: 'secret' }),
+ createAccountsPasswordModule({
+ requireEmailVerification: true,
+ sendVerificationEmailAfterSignup: true,
+ }),
+ createAccountsMongoModule({ dbConn }),
+ ],
+ schemaBuilder: buildSchema({ typeDefs, resolvers }),
+```
+
+If your application already uses `graphql-modules`, all you need to do is add the `accounts.js`
+modules of your choice to your own application module. Otherwise, it's a matter of providing your
+resolvers and type definitions to the `buildSchema` function.
+
+```ts
+// GraphQL Yoga 5
+const yoga = createYoga({
+ plugins: [useGraphQLModules(app)],
+ context: ctx => context(ctx, { createOperationController })
+})
+createServer(yoga).listen()
+
+// Apollo Server 4
+const apollo = new ApolloServer({
+ gateway: app.createApolloGateway()
+})
+startStandaloneServer(apollo, {
+ context: ctx => context(ctx, { createOperationController })
+})
+```
+
+At this point, whatever your GraphQL server of choice, your authenticated application is just a few
+lines of code away.
+
+> But what if all I care is REST?
+
+Use the `graphql-modules` injector to retrieve the `AccountsServer` instance and feed it to
+`@accounts/rest-express`!
+
+```ts
+const controller = app.createOperationController({
+ context: {}
+})
+const accountsServer = controller.injector.get(AccountsServer)
+expressApp.use(accountsExpress(accountsServer))
+```
+
+Alternatively, if you don't want to use `graphql-modules`, you can still manually instantiate the
+providers. Here's
+[an example](https://github.com/accounts-js/accounts/blob/master/examples/rest-express-typescript-without-modules/src/index.ts).
+
+## The New MikroORM Database Adapter
+
+The second big change in Accounts.js 1.0 is the release of the brand new
+[MikroORM](https://mikro-orm.io/) database adapter. MikroORM is a TypeScript ORM for Node.js based
+on Data Mapper, Unit of Work and Identity Map patterns. It is also very well-written and actively
+developed. Today also marks the release of the v6 of MikroORM, which incorporates
+[my recent work](https://github.com/mikro-orm/mikro-orm/pull/4321) to automatically batch references
+and collections and retrieve them via dataloaders firing a single query. This is especially useful
+with GraphQL transport since it automatically solves its notorious N+1 problem without you even
+noticing it—more information [here](https://mikro-orm.io/docs/dataloaders).
+
+```ts
+@Entity()
+export class User extends AccountsUser {
+ @Property()
+ firstName: string
+
+ @Property({ nullable: true })
+ lastName?: string
+
+ constructor({ firstName, lastName, ...otherProps }: CtorArgs) {
+ super(otherProps)
+ this.firstName = firstName
+ if (lastName) {
+ this.lastName = lastName
+ }
+ }
+}
+```
+
+The Accounts.js MikroORM database adapter can be backed by your database of choice (PostgreSQL,
+MySQL, MariaDB, SQLite, MongoDB). It won't force you into any existing entity schema: you can use
+the existing entities or provide your own, but please make sure to extend the base ones so that
+authentication can occur.
+
+```ts
+entities: [
+ User,
+ getUserSchema({ AccountsUser, abstract: true }),
+ getEmailSchema({ UserEntity: User }),
+ getServiceSchema({ UserEntity: User }),
+ getSessionSchema({ UserEntity: User }),
+],
+```
+
+Under the hood, it uses MikroORM's [EntitySchema](https://mikro-orm.io/docs/entity-schema), so you
+must also provide the schema for the base entities.
+
+## Breaking Changes
+
+`@accounts/boost` has been removed. It was no longer deemed necessary because of the new
+`graphql-modules` architecture that already allows you to plug and play various modules. For
+example, instead of providing an existing database connection, you can let `@accounts/module-mongo`
+create a new one for you:
+
+```ts
+const app = createApplication({
+ modules: [
+ [...],
+ // If you don't provide dbConn it will automatically
+ // create a new one, but the module needs to be awaited.
+ await createAccountsMongoModule(),
+```
+
+`@accounts/graphql-api` has been moved into the following packages:
+
+- `@accounts/module-core`
+- `@accounts/module-magic-link`
+- `@accounts/module-mikro-orm`
+- `@accounts/module-mongo`
+- `@accounts/module-password`
+- `@accounts/module-typeorm`
+
+These packages can assemble your desired authentication workflow and your preferred database
+adapter. Despite the significant changes under the hood, I strived to keep the public API mostly the
+same, so migrating to 1.0 should be a manageable effort.
+
+## What's New
+
+- We switched from pnpm to yarn 4.
+- We now return code 401 unmasked errors when unauthorized.
+- Added the `requireEmailVerification` option to require the user to verify the email in order to be
+ able to authenticate.
+- You can now enable both `ambiguousErrorMessages` and `enableAutologin` if
+ `requireEmailVerification` is disabled.
+- `@accounts/password` provides express endpoints to verify the email or reset the password whenever
+ the user clicks on the links received via email.
+- `@accounts/rest-express` now validates its inputs via express-validator.
+- The examples now use graphql-yoga v5 instead of the old apollo-server 2.
+- A new `@apollo/server` v4 example has been added.
+- A basic graphql-http example has been added.
+- A MikroORM example has been added.
+- The accounts-microservice example has been rewritten from scratch to use modern graphql-tools.
+- Docs have been refactored to use `docusaurus-plugin-typedoc-api` instead of
+ `scripts/generate-api-docs.ts`.
+- New and much improved CI release workflow.
+- Basic support for running tests from vscode.
+- Upgraded `graphql-modules` to v3 alpha
+- Upgraded `@graphql-tools/merge` to v9
+- Upgraded `@graphql-tools/schema` to v10
+- Upgraded `@graphql-tools/utils` to v10
+- Upgraded `graphql` to v16
+- Upgraded `typeorm` to 0.3.17
+- Upgraded `@apollo/client` to 3.8
+- Upgraded `@graphql-codegen` to v5
+- Upgraded `mongodb` to v6
+- Upgraded `ioredis` to v5
+- Upgraded `jsonwebtoken` to v9
+- Upgraded `lodash` to 4.17
+- Upgraded `pg` to 8.11
+- Upgraded `request-ip` to 3.3
+- Upgraded `oauth` to 0.10
+- Upgraded `node-fetch` to 2.7
+- Upgraded `express` to 4.18
+- Upgraded `emittery` to 0.13
+- Upgraded `@levminer/speakeasy` to 1.4
+- Upgraded `@graphql-tools/delegate` to v10
+- Upgraded `@graphql-tools/stitch` to v9
+- Upgraded `@graphql-tools/wrap` to v10
+- Upgraded `mongoose` to v8
+- Upgraded `react` to 18.2
+- Upgraded `jest` to 29
+- Upgraded `typescript` to 5.3
+- Upgraded `eslint` to v8
+- Upgraded `prettier` to v3
+- Upgraded `@apollo/server` to 4.9
+- Upgraded `docusaurus` to v3
+
+## Remaining Work for the Stable Release
+
+OAuth authentication, while working, surely deserves some love. While REST endpoints for OAuth
+should be functional, there are no mutations or resolvers yet, meaning you can't use them with the
+GraphQL transport. I'd also like to review the OAuth code and write some examples.
+`@accounts/oauth-instagram`, in particular, still relies upon the deprecated `request` package and
+should be updated. Other popular OAuth providers like Facebook still need to be added (but PRs
+exist).
+
+Before the 1.0 stable gets released, I plan to get the existing providers in a better shape,
+together with examples and the relevant GraphQL schema.
+
+## Post 1.0
+
+I want to create a new `@accounts/phone` authentication service which lets you authenticate via SMS
+OTPs. That would be especially useful in react-native applications where you could automatically
+read the SMS and automate the authentication process.
+
+Currently, Accounts.js bundles CommonJS code. While CommonJS can be imported in both CommonJS and
+ESM applications, that would rule out Deno/Bun support. For the same reason, we cannot use a wrapper
+either: while that would allow us to use ESM imports, it wouldn't be real ESM and thus won't be
+compatible. The remaining alternatives are pure ESM and dual packages. While several library authors
+opted for the former because of
+[dual package hazard](https://nodejs.org/api/packages.html#packages_dual_package_hazard) concerns, I
+weigh the benefits differently. While dual package hazards are real, the whole GraphQL ecosystem
+relies on dual packages; thus, using `instance of` is already a hazard. These authors suggest using
+`async imports` to import their pure ESM libraries in common projects, which exposes everyone to the
+same hazard (not even considering that this is only viable in async contexts). That goes against why
+they decided to bundle pure ESM in the first place. I think it's still too early to target pure ESM,
+and dual package is the lesser evil, so I'm leaning towards that for future releases, but I'm ready
+to change my mind if you provide enough arguments.
+
+I'd also like to implement some form of account linking, where users could link their existing
+account with a different authentication service (for example, password-based and OAuth).
+
+I want to extend Multi-Factor Authentication outside of the password service, baking it into the
+core of accounts.js so that any authentication service can take advantage of it.
+
+If future major versions of Accounts.js introduce breaking changes to the database structure, I
+would like to provide migrations directly via the `@accounts/mikro-orm` package.
+
+Last but not least, I would like to bake in cookies authentication. Not only would that fare better
+against XSS, but it would also allow server-side rendering and thus enable the usage of frameworks
+like Next.js. Alternative storage methods would remain available for those using native
+applications.
+
+At the end of the day, 1.0 is just a number, and I really want to provide stable APIs via semantic
+versioning.
+
+Accounts.js is an open-source project, and we welcome your
+[contributions](https://github.com/accounts-js/accounts)!
diff --git a/packages/web/docs/src/app/blog/(posts)/accountsjs-graphql-modules/page.mdx b/packages/web/docs/src/app/blog/(posts)/accountsjs-graphql-modules/page.mdx
new file mode 100644
index 00000000000..e471ace413b
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/accountsjs-graphql-modules/page.mdx
@@ -0,0 +1,561 @@
+---
+title: Authentication with accounts-js & GraphQL Modules
+description: How to implement server-side using accounts-js, GraphQL-Modules and Apollo-Server
+date: 2018-11-16
+authors: arda
+tags: [graphql, graphql-modules, authentication]
+---
+
+import { Callout } from '@theguild/components'
+
+When starting a backend project, two of the biggest concerns will usually be the right structure of
+the project and authentication. If you could skip thinking and planning about these two, starting a
+new backend project can be much easier.
+
+
+ If you haven't checked out our [blog post about authentication and authorization in GraphQL
+ Modules](/blog/graphql-modules-auth), please read that before!
+
+
+Internally, we use [GraphQL-Modules](https://graphql-modules.com) and
+[accounts-js](https://github.com/accounts-js/accounts) to help us with those two decisions,
+GraphQL-Modules helps us solve our architectural problems in modular, schema-first approaches with
+the power of GraphQL and accounts-js helps us create our authentication solutions by providing a
+simple API together with client and server libraries that saves us a lot of the groundwork around
+authentication.
+
+If you haven't heard about [accounts-js](https://github.com/accounts-js/accounts) before, it is a
+set of libraries to provide a full-stack authentication and accounts-management solutions for
+Javascript.
+
+It is really customizable; so you can write any plugins for your own authentication methods or use
+the already existing email-password or the Facebook and Twitter OAuth integration packages.
+
+accounts-js has connector libraries for MongoDB and Redis, but you can write your own database
+handler by implementing a simple interface.
+
+accounts-js provides a ready to use GraphQL API if you install their GraphQL library, and **we are
+happy to announce that the GraphQL library is now internally built using GraphQL-Modules**!
+
+It doesn't affect people who are not using GraphQL Modules, but it helps the maintainers of
+accounts-js and simplifies the integration for GraphQL-Modules-based projects.
+
+## How to Implement Server-Side Using accounts-js, GraphQL Modules and Apollo Server
+
+First install required dependencies from npm or yarn:
+
+```sh
+yarn add mongodb @accounts/server @accounts/password @accounts/database-manager @accounts/mongo @accounts/graphql-api @graphql-modules/core apollo-server graphql-import-node
+```
+
+Let's assume that we're using MongoDB as our database, password-based authentication and
+ApolloServer:
+
+```ts
+import 'graphql-import-node'
+import { ApolloServer } from 'apollo-server'
+import { MongoClient } from 'mongodb'
+import { DatabaseManager } from '@accounts/database-manager'
+import { AccountsModule } from '@accounts/graphql-api'
+import MongoDBInterface from '@accounts/mongo'
+import { AccountsPassword } from '@accounts/password'
+import { AccountsServer } from '@accounts/server'
+import { resolvers } from './resolvers'
+import * as typeDefs from './typeDefs.graphql'
+
+const PORT = process.env.MONGO_URI || 4000
+const MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017/myDb'
+const TOKEN_SECRET = process.env.TOKEN_SECRET || 'myTokenSecret'
+
+async function main() {
+ const mongoClient = await MongoClient.connect(MONGO_URI, {
+ useNewUrlParser: true,
+ native_parser: true
+ })
+ const db = mongoClient.db()
+ const userStorage = new MongoDBInterface(db, {
+ convertUserIdToMongoObjectId: false
+ })
+ // Create database manager (create user, find users, sessions etc) for accounts-js
+ const accountsDb = new DatabaseManager({
+ sessionStorage: userStorage,
+ userStorage
+ })
+ // Create accounts server that holds a lower level of all accounts operations
+ const accountsServer = new AccountsServer(
+ {
+ db: accountsDb,
+ tokenSecret: TOKEN_SECRET
+ },
+ {
+ password: new AccountsPassword()
+ }
+ )
+ const { schema } = new GraphQLModule({
+ typeDefs,
+ resolvers,
+ imports: [AccountsModule.forRoot({ accountsServer })],
+ providers: [
+ {
+ provide: Db,
+ useValue: db // Use MongoDB's instance inside DI
+ }
+ ]
+ })
+ const apolloServer = new ApolloServer({
+ schema,
+ context: session => session,
+ introspection: true
+ })
+ const { url } = await apolloServer.listen(PORT)
+ console.log(`Server listening: ${url}`)
+}
+
+main()
+```
+
+And we can extend User type with custom fields in our schema, and add a mutation which is restricted
+to authenticated clients.
+
+```graphql
+type Query {
+ allPosts: [Post]
+}
+
+type Mutation {
+ addPost(title: String, content: String): ID @auth
+}
+
+type User {
+ posts: [Post]
+}
+
+type Post {
+ id: ID
+ title: String
+ content: String
+ author: User
+}
+```
+
+Finally, let's define some resolvers for it:
+
+```ts
+export const resolvers = {
+ User: {
+ posts({ _id }, args, { injector }) {
+ const db = injector.get(Db)
+ const Posts = db.collection('posts')
+ return Posts.find({ userId: _id }).toArray()
+ }
+ },
+ Post: {
+ id: ({ _id }) => _id,
+ author({ userId }, args, { injector }) {
+ const accountsServer = injector.get(AccountsServer)
+ return accountsServer.findUserById(userId)
+ }
+ },
+ Query: {
+ allPosts(root, args, { injector }) {
+ const db = injector.get(Db)
+ const Posts = db.collection('posts')
+ return Posts.find().toArray()
+ }
+ },
+ Mutation: {
+ addPost(root, { title, content }, { injector, userId }: ModuleContext) {
+ const db = injector.get(Db)
+ const Posts = db.collection('posts')
+ const { insertedId } = Posts.insertOne({ title, content, userId })
+ return insertedId
+ }
+ }
+}
+```
+
+When you print the whole app's schema, you would see something like above:
+
+```graphql
+type TwoFactorSecretKey {
+ ascii: String
+ base32: String
+ hex: String
+ qr_code_ascii: String
+ qr_code_hex: String
+ qr_code_base32: String
+ google_auth_qr: String
+ otpauth_url: String
+}
+
+input TwoFactorSecretKeyInput {
+ ascii: String
+ base32: String
+ hex: String
+ qr_code_ascii: String
+ qr_code_hex: String
+ qr_code_base32: String
+ google_auth_qr: String
+ otpauth_url: String
+}
+
+input CreateUserInput {
+ username: String
+ email: String
+ password: String
+}
+
+type Query {
+ twoFactorSecret: TwoFactorSecretKey
+ getUser: User
+ allPosts: [Post]
+}
+
+type Mutation {
+ createUser(user: CreateUserInput!): ID
+ verifyEmail(token: String!): Boolean
+ resetPassword(token: String!, newPassword: String!): Boolean
+ sendVerificationEmail(email: String!): Boolean
+ sendResetPasswordEmail(email: String!): Boolean
+ changePassword(oldPassword: String!, newPassword: String!): Boolean
+ twoFactorSet(secret: TwoFactorSecretKeyInput!, code: String!): Boolean
+ twoFactorUnset(code: String!): Boolean
+ impersonate(accessToken: String!, username: String!): ImpersonateReturn
+ refreshTokens(accessToken: String!, refreshToken: String!): LoginResult
+ logout: Boolean
+ authenticate(serviceName: String!, params: AuthenticateParamsInput!): LoginResult
+ addPost(title: String, content: String): Post
+}
+
+type Tokens {
+ refreshToken: String
+ accessToken: String
+}
+
+type LoginResult {
+ sessionId: String
+ tokens: Tokens
+}
+
+type ImpersonateReturn {
+ authorized: Boolean
+ tokens: Tokens
+ user: User
+}
+
+type EmailRecord {
+ address: String
+ verified: Boolean
+}
+
+type User {
+ id: ID!
+ emails: [EmailRecord!]
+ username: String
+ posts: [Post]
+}
+
+input UserInput {
+ id: ID
+ email: String
+ username: String
+}
+
+input AuthenticateParamsInput {
+ access_token: String
+ access_token_secret: String
+ provider: String
+ password: String
+ user: UserInput
+ code: String
+}
+type Post {
+ id: ID
+ title: String
+ content: String
+ author: User
+}
+```
+
+## How to Implement Client-Side Using accounts-js, React and Apollo-Client
+
+Now we can create a simple frontend app by using Apollo-Client and accounts-js client for this
+backend app. The example below shows some example code that works on these two.
+
+```tsx
+import React, { Component } from 'react'
+import { render } from 'react-dom'
+import ApolloClient from 'apollo-boost'
+import gql from 'graphql-tag'
+import { ApolloProvider, Mutation, Query } from 'react-apollo'
+import { AccountsClient } from '@accounts/client'
+import { AccountsClientPassword } from '@accounts/client-password'
+import GraphQLClient from '@accounts/graphql-client'
+
+const apolloClient = new ApolloClient({
+ async request(operation) {
+ const tokens = await accountsClient.getTokens()
+ if (tokens) {
+ operation.setContext({
+ headers: {
+ 'accounts-access-token': tokens.accessToken
+ }
+ })
+ }
+ },
+ uri: 'http://localhost:4000/graphql'
+})
+
+const accountsGraphQL = new GraphQLClient({ graphQLClient: apolloClient })
+const accountsClient = new AccountsClient({}, accountsGraphQL)
+const accountsPassword = new AccountsClientPassword(accountsClient)
+
+const ALL_POSTS_QUERY = gql`
+ query AllPosts {
+ allPosts {
+ id
+ title
+ content
+ author {
+ username
+ }
+ }
+ }
+`
+
+const ADD_POST_MUTATION = gql`
+ mutation AddPost($title: String, $content: String) {
+ addPost(title: $title, content: $content)
+ }
+`
+
+class App extends Component {
+ state = {
+ credentials: {
+ username: '',
+ password: ''
+ },
+ newPost: {
+ title: '',
+ content: ''
+ },
+ user: null
+ }
+ componentDidMount() {
+ return this.updateUserState()
+ }
+ async updateUserState() {
+ const tokens = await accountsClient.refreshSession()
+ if (tokens) {
+ const user = await accountsGraphQL.getUser()
+ await this.setState({ user })
+ }
+ }
+ renderAllPosts() {
+ return (
+
+ {({ data, loading, error }) => {
+ if (loading) {
+ return
+ )
+ }
+}
+
+render(
+
+
+ ,
+ document.getElementById('root')
+)
+```
+
+As you can see from the example, it can be really easy to create an application that has
+authentication in modular and future-proof approach.
+
+You can learn more about accounts-js from the
+[docs](https://accounts-js.netlify.com/docs/getting-started.html) of this great library for more
+features such as Two-Factor Authentication and Facebook and Twitter integration using OAuth.
+
+Also, you can learn more about GraphQL-Modules on the [website](https://graphql-modules.com) and see
+how you can add GraphQL Modules features into your system in a gradual and selective way.
+
+If you want strict types based on GraphQL Schema, for each module, GraphQL Code Generator has
+built-in support for GraphQL-Modules based projects.
+[See the docs](https://github.com/Urigo/graphql-modules#graphql-code-generator-integration) for more
+details.
+
+You can check out our example about this integration
+[https://github.com/ardatan/graphql-modules-accountsjs-boilerplate](https://github.com/ardatan/graphql-modules-accountsjs-boilerplate).
+
+## All Posts about GraphQL Modules
+
+- [GraphQL Modules — Feature based GraphQL Modules at scale](/blog/graphql-modules)
+- [Why is True Modular Encapsulation So Important in Large-Scale GraphQL Projects?](/blog/modular-encapsulation-graphql-modules)
+- [Why did we implement our own Dependency Injection library for GraphQL-Modules?](/blog/dependency-injection-library-in-graphql-modules)
+- [Scoped Providers in GraphQL-Modules Dependency Injection](/blog/graphql-modules-scoped-providers)
+- [Writing a GraphQL TypeScript project w/ GraphQL-Modules and GraphQL-Code-Generator](/blog/graphql-typescript-modules-codegen)
+- [Authentication and Authorization in GraphQL (and how GraphQL-Modules can help)](/blog/graphql-modules-auth)
+- [Authentication with accounts-js & GraphQL Modules](/blog/accountsjs-graphql-modules)
+- [Manage Circular Imports Hell with GraphQL-Modules](/blog/manage-circular-imports-hell-in-graphql-modules)
diff --git a/packages/web/docs/src/app/blog/(posts)/add-reactivity-to-an-existing-source/page.mdx b/packages/web/docs/src/app/blog/(posts)/add-reactivity-to-an-existing-source/page.mdx
new file mode 100644
index 00000000000..eccc6d3645f
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/add-reactivity-to-an-existing-source/page.mdx
@@ -0,0 +1,178 @@
+---
+title: Add reactivity to an existing source using GraphQL Mesh
+authors: jycouet
+tags: [graphql, graphql-mesh, subscription]
+date: 2020-12-15
+description:
+ How To extend an existing endpoint with subscriptions to bring reactivity to your application.
+---
+
+import { VideoEmbed } from '#components/video-embed'
+import { Callout } from '@theguild/components'
+
+## Introduction
+
+Working on the
+[code generator for svelte plugin](https://github.com/ticruz38/graphql-codegen-svelte-apollo), I was
+looking for a public graphQL endpoint having queries, mutations and subscriptions for nice examples.
+Unfortunately I didn't find anything out of the box, ready to use for my demos. So I decided to
+extend an existing source!
+
+## Starting Point
+
+Across my researches I found one cool public endpoint regarding
+[SpaceX](https://api.spacex.land/graphql). It has `Queries` and `Mutations` ready to use! So I
+decided to pimp this endpoint, and bring a bit of reactivity with subscriptions.
+
+The idea is to publish the new user when it's inserted with this `mutation`:
+
+```graphql
+mutation addUser {
+ insert_users(objects: { name: "jyc" }) {
+ affected_rows
+ returning {
+ name
+ }
+ }
+}
+```
+
+How hard is to do this? Let's find out... **Let's Pimp this GraphQL!**
+
+
+
+## Implementation
+
+Multiple ways are possible!
+
+
+ Spoiler alert
+ Thanks to `graphql-mesh`, it's dead easy! 🚀🚀🚀
+
+
+### 1. Create a New Repo
+
+```sh
+mkdir newRepo
+cd newRepo
+yarn init
+```
+
+### 2. Add `graphql-mesh` Packages
+
+```sh
+yarn add @graphql-mesh/cli @graphql-mesh/graphql @graphql-mesh/transform-resolvers-composition graphql
+```
+
+### 3. Add `.meshrc.yaml` File in the Root Folder With
+
+```yaml filename=".meshrc.yaml"
+sources:
+ - name: spacexGQL
+ handler:
+ graphql:
+ endpoint: https://api.spacex.land/graphql/
+
+additionalTypeDefs: |
+ extend type Subscription {
+ usersAdded: [users]
+ }
+
+transforms:
+ - resolversComposition:
+ - resolver: 'Mutation.insert_users'
+ composer: ./src/composition/insert_user
+
+additionalResolvers:
+ - type: Subscription
+ field: usersAdded
+ pubsubTopic: usersAdded
+```
+
+Where I
+
+- declare the graphQL source
+- extend `Subscription` to listen to user added users
+- compose the existing `Mutation.insert_users`
+
+### 4. Add `./src/composition/insert_user.js` File with All the Logic for This New Mutation Composition
+
+```js filename="insert_user.js"
+module.exports = next => async (root, args, context, info) => {
+ // add returning.id to the selection
+ info.operation.selectionSet.selections[0].selectionSet.selections.push({
+ kind: 'Field',
+ name: {
+ kind: 'Name',
+ value: 'returning'
+ },
+ arguments: [],
+ directives: [],
+ selectionSet: {
+ kind: 'SelectionSet',
+ selections: [
+ {
+ kind: 'Field',
+ name: {
+ kind: 'Name',
+ value: 'id'
+ },
+ arguments: [],
+ directives: []
+ }
+ ]
+ }
+ })
+
+ // send the mutation to the graphQL source
+ const result = await next(root, args, context, info)
+
+ // select returned ids
+ const ids = result.returning.map(c => c.id)
+
+ // Query users enforcing fields to return
+ const responseUser = await context.spacexGQL.apiQuery.users(
+ {
+ where: { id: { _in: ids } }
+ },
+ {
+ fields: {
+ id: true,
+ name: true,
+ rocket: true,
+ timestamp: true,
+ twitter: true
+ }
+ }
+ )
+
+ // publish new users
+ context.pubsub.publish('usersAdded', responseUser)
+
+ return result
+}
+```
+
+That's it!
+
+## Wrap Up
+
+- Extending an endpoint with subscription is easy! _Thx to tooling._
+
+- You can find the source on [GitHub](https://github.com/jycouet/space-x-land-with-sub)
+
+- You see all this in action directly in the
+ [playground](https://space-x-land-with-sub.herokuapp.com)
+
+I'm now ready to work on the demo for
+[**Svelte Codegen**](https://github.com/ticruz38/graphql-codegen-svelte-apollo)! Stay tunned ;)
+
+[@jycouet](https://twitter.com/jycouet)
+
+
+ Special thanks to [n1ru4l](https://twitter.com/n1rual) who helped me find the nicest way to do it
+ ;)
+
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-free-single-sign-on-for-graphql-hive/page.mdx b/packages/web/docs/src/app/blog/(posts)/announcing-free-single-sign-on-for-graphql-hive/page.mdx
new file mode 100644
index 00000000000..d739f8c8ea7
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/announcing-free-single-sign-on-for-graphql-hive/page.mdx
@@ -0,0 +1,43 @@
+---
+title: Announcing free SSO (Single Sign On) for GraphQL Hive
+tags: [graphql, graphql-federation, graphql-hive]
+authors: laurin
+date: 2022-11-07
+description: Link your GraphQL Hive Organization to your OAuth OIDC provider of choice.
+---
+
+Today we are excited to announce that due to popular demand we now support connecting a GraphQL Hive
+Organization to an OAuth Open ID Connect Provider (OIDC) for Single Sign On (SSO).
+
+> [GraphQL Hive](https://the-guild.dev/graphql/hive) is our schema registry solution for
+> continuously evolving your GraphQL schema backed by performance insights and usage statistics.
+> Whether you are working in a small company with a single GraphQL service or a big multi-team
+> company with multiple (federated or composed) GraphQL services, GraphQL Hive is the perfect tool
+> to help you manage your GraphQL schema.
+
+GraphQL Hive gives you the flexibility of choosing your existing identity provider of choice for
+authenticating users, such as Google Workspaces, Okta, Auth0, and many more.
+
+Users logging into GraphQL Hive via an OIDC provider will be automatically added and limited to
+interacting within your organization.
+
+You can start using OIDC SSO on the GraphQL Hive Cloud version for any type of organization at no
+additional cost starting today.
+
+Offering this feature for free is a big deal for us. We at The Guild believe that Single Sign On is
+a core security requirement and not a luxury feature that you have to buy in.
+
+You can learn more about the broken relationship between SaaS vendors and SSO on the
+[SSO Wall of Shame](https://sso.tax/).
+
+In addition, OAuth Open ID Connect login is not only limited to the GraphQL Hive Cloud version, but
+is also available on self-hosted GraphQL Hive
+[which we announced Last month](/blog/announcing-self-hosted-graphql-hive).
+
+Huge thanks go out to the incredible helpful team at [SuperTokens](https://supertokens.com/) that
+helped us a lot with questions and feedback on shipping this feature. GraphQL Hive is
+[fully open source](https://github.com/graphql-hive/console) and also uses the SuperTokens Open
+Source project for user authentication.
+
+- [Get started with adding OAuth OIDC SSO to your GraphQL Hive organization](https://the-guild.dev/graphql/hive/docs/management/sso-oidc-provider)
+- [Get started with with custom OIDC providers for self-hosted Hive](https://the-guild.dev/graphql/hive/docs/self-hosting/oidc-login)
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/changes-history.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/changes-history.png
new file mode 100644
index 00000000000..c16859a6667
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/changes-history.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/monitoring-preview.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/monitoring-preview.png
new file mode 100644
index 00000000000..22d1f77b382
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/monitoring-preview.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/page.mdx b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/page.mdx
new file mode 100644
index 00000000000..d1298f4dea7
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/page.mdx
@@ -0,0 +1,185 @@
+---
+title: Announcing GraphQL Hive, the complete GraphQL API manager
+tags: [graphql, graphql-federation, graphql-hive]
+authors: [charlypoly, arda, laurin, saihaj, kamil, dotan, uri, dimitri]
+date: 2022-05-24
+description: We are incredibly excited to share with you today the public launch of GraphQL Hive!
+---
+
+After months of development and collecting feedback from our customers using it in production, we
+are incredibly excited to share with you today the public launch of
+[Hive](https://the-guild.dev/graphql/hive)!
+
+## Built for the Community, for All GraphQL APIs
+
+[GraphQL Hive](https://the-guild.dev/graphql/hive) has been built with 3 main objectives in mind:
+
+- **Help GraphQL developers to get to know their GraphQL APIs** a little more with our schema
+ registry, performance monitoring, alerts, and integrations.
+- **Support all kinds of GraphQL APIs**, from
+ [Federation](https://the-guild.dev/graphql/hive/federation), and Stitching, to standalone APIs.
+- **Open Source at the heart**: GraphQL Hive is 100% open-source, and build in public with the
+ community.
+- **A plug and play SaaS solution**: to give access to Hive to most people with a generous free
+ “Hobby plan”
+
+Without further ado, let's review together how GraphQL Hive will help you to get the best of your
+GraphQL APIs.
+
+## Features Overview
+
+GraphQL Hive provides all the tools to get visibility of your GraphQL architecture at all stages,
+from standalone APIs to composed schemas
+([Federation](https://the-guild.dev/graphql/hive/federation), Stitching).
+
+From our experience working in the GraphQL field, **we believe that the following set of features
+are essential for a good understanding and operating of GraphQL APIs**, at any stage.
+
+### Schema Registry
+
+Using Hive requires publishing changes to your GraphQL API schema. Once published on the Schema
+Registry, Hive will offer 3 useful features to manage your GraphQL API:
+
+**Get warned about breaking changes**. For every new version of the schema either committed in a
+Pull Request or publish, Hive will run a set of checks and notify your team via Slack, GitHub, or
+within the Hive application.
+
+
+
+The definition of a “breaking change” is data-driven (based on "_live operations monitoring_") and
+entirely configurable for each project:
+
+
+
+The schema changes detection also applies in a Federation setup, when a given subgraph breaks the
+composed supergraph.
+
+**Access the history of changes**. On top of detecting potential breaking changes, Hive gives your
+team access to the full history of changes, even on a complex composed schema (Federation,
+Stitching).
+
+Hive can also be configured to post the detected schema changes to Slack, fostering collaboration
+between the front-end and back-end engineers.
+
+
+
+**Supercharge your GraphQL development workflow**. Finally, Hive provides a high-availability and
+multi-zone CDN service based on Cloudflare, allowing you to access the registry, through a secured
+external service, that's always up regardless of Hive services.
+
+This secured URL, generated from the Hive UI, can be used to supercharge your GraphQL development
+workflow, by:
+
+- **updating your GraphQL Code Generator config** to fetch the introspection from Hive CDN, instead
+ of production, staging, or local version of your GraphQL API
+- **updating your GraphQL Gateway** to fetch the schema from Hive CDN instead of querying all
+ services
+- **updating your GraphQL Mesh configuration** to fetch a GraphQL Source schema from Hive CDN
+
+Doing so will avoid deployment issues and development issues (ex: getting introspection for codegen
+from the wrong development version of the schema).
+
+More examples are available in Hive documentation:
+https://the-guild.dev/graphql/hive/docs/high-availability-cdn.
+
+The three aspects of Schema Registry covered above **will help you a safer and smoother deployment
+of your GraphQL APIs**, even when working with standalone or monolithic GraphQL APIs.
+
+### Monitoring
+
+Once a Schema is deployed, **it is important to be aware of how it is used and what is the
+experience of its final users**.
+
+GraphQL Hive helps you get a global overview of the usage of your GraphQL API with:
+
+- Error rates and repartition
+- Global and queries performances (latency, RPM…)
+- Operations count
+- Active GraphQL clients
+
+
+
+At a glance, the Hive operations dashboard helps you to understand:
+
+- **Does your GraphQL API face unexpected traffic?**
+- **Does a new version of Schema result in a raise of errors?**
+- **Which queries are slow?**
+
+Being able to quickly answer these questions allows you to build better GraphQL APIs and better user
+experiences.
+
+### Integrations
+
+**Hive is well integrated with Slack and most CI/CD systems** to get you up and running as smoothly
+as possible!
+
+As covered earlier, **Hive can notify your team when schema changes occur, either via Slack or a
+custom webhook:**
+
+
+
+Also, **the Hive CLI allows integration of the schema checks mechanism to all CI/CD systems**
+(GitHub, BitBucket, Azure, and others).
+
+To compare new schema with the latest one and detect breaking changes, run the following command:
+
+```sh
+hive schema:check schema.graphql
+```
+
+The same applies for schema publishing and operations checks.
+
+If you are using GitHub, you can directly benefit from **the Hive app that will automatically add
+status checks to your PRs**!
+
+
+
+And we are just getting started, we are already planning more alerts/notifications types and more
+integrations.
+
+## Get Started with GraphQL Hive
+
+By far the easiest way to use GraphQL Hive is to get started with one of our hosted plans below.
+
+**Our hobby plan is free and fits perfectly for most side projects**. When you're ready to upgrade,
+we have you covered with our Pro plan.
+
+All plans come with **unlimited seats, high availability and all the features**.
+
+You can now give more insight into your GraphQL API's performance by inviting all of your team to
+your project.
+
+### Pricing
+
+As you can see, the pricing is based on real usage and not the number of seats.
+
+You can start for free with the "Hobby" plan and upgrade to "Pro" once you hit the limits.
+
+| Feature / Plan | Hobby | Pro | Custom |
+| -------------- | --------- | ----------- | ------------ |
+| Base price | $ 0 | $ 10 | $ Talk to us |
+| Users / Seats | Unlimited | Unlimited | Unlimited |
+| Schema pushes | Unlimited | Unlimited | Unlimited |
+| Monitoring | Up to 1M | $ 10 per 1M | Unlimited |
+| Data retention | 7 days | 90 days | 12 months |
+
+If you need more than the Pro plan, let us know, and we
+[can discuss your requirements](mailto:contact@the-guild.dev).
+
+### GraphQL Hive Can Be Self-Hosted
+
+As stated earlier, [GraphQL Hive](https://the-guild.dev/graphql/hive) is completely open-source
+under the MIT license, meaning that you are free to host on your own infrastructure.
+
+You will find instructions in the [GitHub repository](https://github.com/graphql-hive) and feel free
+to contact us for any questions or support.
+
+## Join Us in Building the Future of Hive
+
+Like all [The Guild](/) projects, GraphQL Hive is built with the community.
+
+We can't wait to [get you onboard](https://app.graphql-hive.com) and get your feedback, pull
+requests, and feature requests on
+[https://github.com/graphql-hive](https://github.com/graphql-hive).
+
+See you in Hive! 🐝
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/schema-checks-conditional-configuration.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/schema-checks-conditional-configuration.png
new file mode 100644
index 00000000000..7be4217b9b9
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/schema-checks-conditional-configuration.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/schema-checks-gh.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/schema-checks-gh.png
new file mode 100644
index 00000000000..a6f92420019
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/schema-checks-gh.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/slack-schema-change.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/slack-schema-change.png
new file mode 100644
index 00000000000..6628567e3f2
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-hive-release/slack-schema-change.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/copy-header.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/copy-header.png
new file mode 100644
index 00000000000..cbce181ff4d
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/copy-header.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/page.mdx b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/page.mdx
new file mode 100644
index 00000000000..251f3e64b89
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/page.mdx
@@ -0,0 +1,85 @@
+---
+title: Announcing GraphQL Network Inspector
+tags: [graphql, graphql-network-inspector]
+authors: [warrenjday]
+date: 2023-02-22
+description: A better way to debug network traffic with GraphQL
+---
+
+import { YoutubeIframe } from '#components/youtube-iframe'
+
+GraphQL Network Inspector is a dedicated devtools extension which allows you to inspect and debug
+GraphQL queries and mutations from network traffic.
+
+The extension has seen great adoption since its initial release and now I'm excited to announce it's
+new home as part of The Guild.
+
+You can check out the open source extension and try it out today.
+[GraphQL Network Inspector](https://github.com/warrenday/graphql-network-inspector)
+
+
+
+## Why GraphQL Network Inspector?
+
+If you've ever worked with GraphQL on the client, you'll know that it can be a real pain to debug
+using the standard network tab. The standard devtools are designed for REST APIs and don't provide
+clear visibility into the individual GraphQL queries and mutations being sent.
+
+With every request you'll see `POST /graphql`. This makes it difficult to distinguish requests
+without opening the request details and inspecting the body.
+
+GraphQL Network Inspector solves this problem by providing a dedicated tab for GraphQL requests and
+displaying each query in a readable format.
+
+
+
+## Features Overview
+
+The great thing about a dedicated inspector is we can provide much more specific functionality
+around GraphQL. Here are some of the features we've added to the extension:
+
+### Request Overview
+
+The request overview tab provides a simple overview of all queries and mutations. Here you can see
+queries by name, distinguish between queries and mutations and even see total errors returned for
+each request.
+
+
+
+### Request Details
+
+Clicking into a request will show similar details to the standard inspector. But here we have a
+better breakdown for each element of the request including; headers, request query with variables
+and response.
+
+
+
+### Copy Details to GraphQL Playground
+
+The extension also provides convenient buttons to copy the request query and variables into GraphQL
+Playground, great if you want to re-run the query.
+
+Under the request details tab, you'll see a button to copy the query and variables to the clipboard.
+
+You can also click individual headers to copy them as well.
+
+
+
+### Convenient Features
+
+Streamlining the debugging process is a key goal of the extension. On top of the features above
+we've also introduces helpful extras such as full-text search and filtering.
+
+
+
+Check out the extension today and don't forget to give
+[GraphQL Network Inspector](https://github.com/warrenday/graphql-network-inspector) a star ⭐️ on
+GitHub.
+
+We'd love to hear your feedback and suggestions for the extension. How would you like to see it
+integrate further with The Guild ecosystem? Let us know.
+
+Happy debugging!
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-compare.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-compare.png
new file mode 100644
index 00000000000..e694e819428
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-compare.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-details.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-details.png
new file mode 100644
index 00000000000..e9c1ed9b620
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-details.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-overview.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-overview.png
new file mode 100644
index 00000000000..b8503ec97f3
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/request-overview.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/response-details.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/response-details.png
new file mode 100644
index 00000000000..6e558197235
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/response-details.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/search.png b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/search.png
new file mode 100644
index 00000000000..9c4c5ea03e7
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-network-inspector/search.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-graphql-yoga-v2/page.mdx b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-yoga-v2/page.mdx
new file mode 100644
index 00000000000..3de68ab7dc8
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/announcing-graphql-yoga-v2/page.mdx
@@ -0,0 +1,313 @@
+---
+title: Announcing GraphQL Yoga 2.0!
+tags: [server, graphql-federation, envelop, node, graphql]
+authors: [charlypoly, arda, laurin, saihaj]
+date: 2022-03-29
+description:
+ Fully-featured GraphQL Server with focus on easy setup, performance and great developer experience
+---
+
+Today we are incredibly excited to share with you the new GraphQL Yoga! This release was made
+possible with your contributions, issues, and feedback.
+
+[The Guild](https://the-guild.dev/about-us) took over the development of
+[GraphQL Yoga](https://graphql-yoga.com) from [Prisma](https://prisma.io) in early 2021, and with
+the growing community of tools in the GraphQL space, most recently [Envelop](https://envelop.dev),
+we were able to rewrite GraphQL Yoga 2.0 from scratch with easy setup, performance, and developer
+experience at the core.
+
+GraphQL Yoga continues to boast a "convention over configuration" approach and the freedom to use
+your favorite libraries, from HTTP to schema-building.
+
+You are no longer required to install dozens of dependencies to get features such as subscriptions,
+file uploads, CORS, error masking, and more.
+
+Building a GraphQL Yoga server requires a single import and only a few lines of code to start
+serving an API. And you also get [GraphiQL](https://github.com/graphql/graphiql) for making
+development even easier.
+
+```js
+// 1. Import GraphQL Yoga
+import { createServer } from '@graphql-yoga/node'
+
+// 2. Create your server
+const server = createServer({
+ schema: {
+ typeDefs: /* GraphQL */ `
+ type Query {
+ hello: String
+ }
+ `,
+ resolvers: {
+ Query: {
+ hello: () => 'Hello Hello Hello'
+ }
+ }
+ }
+})
+
+// 3. Serve the API and GraphiQL
+server.start()
+```
+
+## The Yoga V2 Experience
+
+### Your Stack and Habits
+
+The main goal of Yoga v2 is to **allow you to leverage all the GraphQL ecosystem** by being
+compatible with most of the existing schema-design, HTTP server libraries, and deployment
+environments.
+
+Built on top of a **modular and extendable GraphQL Server**, Yoga v2 allows you to use your
+preferred schema design approach and HTTP server library.
+
+For example, Yoga v2 is fully compatible with Express and Nexus, with no additional packages:
+
+```ts
+import express from 'express'
+import { makeSchema, queryType } from 'nexus'
+import { createServer } from '@graphql-yoga/node'
+
+const Query = queryType({
+ definition(t) {
+ t.string('hello', { resolve: () => 'hello world!' })
+ }
+})
+const schema = makeSchema({
+ types: [Query]
+})
+
+const graphQLServer = createServer({ schema })
+
+const app = express()
+
+// Bind GraphQL Yoga to the `/graphql` endpoint
+// Here it takes the request and response objects and handles them internally
+app.use('/graphql', graphQLServer)
+
+app.listen(4000, () => {
+ console.log('Running a GraphQL API server at http://localhost:4000/graphql')
+})
+```
+
+The same applies to **GraphQL Tools, Pothos, Nexus, TypeGraphQL, SDL first schema-design approaches,
+graphql-js, Apollo Tools, Fastify, Koa, Next.js, SvelteKit, and Deno**.
+
+Beyond the compatibility of schema-design and HTTP server libraries, Yoga v2 makes **deploying a
+GraphQL API to any environment seamless** (Vercel Functions, Cloudflare Workers, AWS Lambda and
+more).
+
+Here, a GraphQL API built with GraphQL Modules, deployed on Cloudflare Workers:
+
+```tsx
+import { createApplication } from 'graphql-modules'
+import { createServer } from '@graphql-yoga/common'
+import { helloWorldModule } from './helloWorld'
+
+const application = createApplication({
+ modules: [helloWorldModule]
+})
+
+const server = createServer({ schema: application.schema })
+
+server.start()
+```
+
+## Productivity at Your Fingertips
+
+### Batteries-Included
+
+Yoga v2 comes with **sensible defaults to make development faster**, all with **complete TypeScript
+support**.
+
+**Features common to modern GraphQL APIs** such as file-uploads, subscription support, advanced
+error handling, or CORS **come built-in with Yoga**:
+
+```ts
+import { createServer, GraphQLYogaError } from '@graphql-yoga/node'
+
+// Provide your schema
+const server = createServer({
+ schema: {
+ typeDefs: /* GraphQL */ `
+ # adding this custom scalar enables file upload support
+ scalar Upload
+
+ type Query {
+ hello: String
+ }
+
+ type Subscription {
+ countdown(from: Int!): Int!
+ }
+
+ type Mutation {
+ readTextFile(file: Upload!): String
+ }
+ `,
+ resolvers: {
+ Query: {
+ hello: () => 'world'
+ },
+ Subscription: {
+ countdown: {
+ // This will return the value on every 1 sec until it reaches 0
+ subscribe: async function* (_, { from }) {
+ for (let i = from; i >= 0; i--) {
+ await new Promise(resolve => setTimeout(resolve, 1000))
+ yield { countdown: i }
+ }
+ }
+ }
+ },
+ Mutation: {
+ readTextFile: async (_, { file }: { file: File }) => {
+ let textContent = null
+ try {
+ textContent = await file.text()
+ } catch (e) {
+ // return an error visible by the client
+ throw new GraphQLYogaError(`Failed to parse file`)
+ }
+ return textContent
+ }
+ }
+ }
+ }
+})
+
+// We now serve a GraphQL API with Subscriptions (over SSE), CORS,
+// and File uploads support!
+server.start()
+```
+
+Yoga v2 also provides APIs to handle **logging, advanced Subscriptions** use-cases (over WS,
+Pub/Sub), [**Apollo Federation**](https://the-guild.dev/graphql/hive/federation) Support,
+[and more](https://graphql-yoga.com/docs/quick-start).
+
+### Easily Extend Your API with Envelop Plugins
+
+GraphQL Yoga supports [Envelop](https://envelop.dev) out of the box, which gives you greater
+control, and the ability to hook into the GraphQL execution phases.
+
+Here, we are building a full-featured GraphQL API with security rules, a response cache and sentry
+error reporting with only a few lines of code:
+
+```ts
+import { useDepthLimit } from '@envelop/depth-limit'
+import { useResponseCache } from '@envelop/response-cache'
+import { useSentry } from '@envelop/sentry'
+import { createServer } from '@graphql-yoga/node'
+
+const server = createServer({
+ schema: {
+ typeDefs: /* GraphQL */ `
+ type Query {
+ hello: String
+ }
+ `,
+ resolvers: {
+ Query: {
+ hello: () => 'Hello Hello Hello'
+ }
+ }
+ },
+ plugins: [
+ useDepthLimit({
+ // set up some security rules
+ maxDepth: 10
+ }),
+ useResponseCache(), // speed up our server with a response cache
+ useSentry() // report unexpected errors to sentry
+ ]
+})
+
+// Start the server and explore http://localhost:4000/graphql
+server.start()
+```
+
+The Envelop Plugin currently [proposes more than 35+ plugins](https://envelop.dev/plugins) covering
+most of the standard GraphQL APIs features you need in production.
+
+Ultimately, you can [develop custom Envelop plugins](https://envelop.dev/docs/plugins/custom-plugin)
+to create reusable behaviors that hook on to the GraphQL lifecycle.
+
+## Production-Ready
+
+GraphQL Yoga v2 has been built in production for production usage.
+
+Built-in real-world conditions within our projects (e.g. [GraphQL Mesh](https://graphql-mesh.com))
+and with some of [our clients](/#services), performance was highly prioritised. The core of Yoga is
+as performant as possible, and we continuously keep track and improve it.
+
+Also, the Yoga V2 repository runs performance checks on every commit and Pull Request, so we can
+always capture any performance regression.
+
+Last but not least, every commit is ensured to run on all deployment targets such as AWS Lambda or
+Cloudflare workers through an End-To-End testing suite!
+
+We continue our effort of pushing GraphQL Yoga to more production environments with the imminent
+release of [Redwood 1.0](https://redwoodjs.com) that uses Yoga 2.0 as its default GraphQL server.
+
+## A Standards-Compliant GraphQL Server
+
+In the same way that TypeScript aims to stay aligned with ECMAScript, GraphQL Yoga is based on
+several official and recognized specs:
+
+- [GraphQL-spec](https://spec.graphql.org/October2021),
+ [GraphQL-over-HTTP](https://github.com/graphql/graphql-over-http): guarantees your GraphQL API to
+ work with all existing GraphQL clients (Apollo, Relay, urql, and more)
+- [GraphQL-Multipart-Request](https://github.com/jaydenseric/graphql-multipart-request-spec):
+ enables great file upload support
+- [W3C Fetch API](https://fetch.spec.whatwg.org): we embrace the future of Node.js and provide the
+ same developer experience on all platforms
+
+## GraphQL Features from the Future
+
+Yoga v2 supports some experimental GraphQL features such as
+[`@defer` and `@stream`](https://github.com/graphql/graphql-js/pull/2839), allowing you to get a
+taste of the future of GraphQL (with compatible clients such as
+[urql](https://formidable.com/open-source/urql/docs/comparison/#core-features)).
+
+Also, thanks to the Envelop plugin system, Yoga v2 can also act as "Babel for GraphQL", giving you
+the option to use features that are not yet in the GraphQL spec but are very useful in production
+today, like `@defer`, `@stream` and
+[`@oneOf`](https://envelop.dev/docs/guides/using-graphql-features-from-the-future).
+
+## Get Started with Yoga V2
+
+Yoga v2 provides the best GraphQL experience while giving you the freedom to use your preferred
+stack and tools.
+
+### Get Started from Scratch with Our New Tutorial
+
+**Want to try it?** Give
+[our brand-new tutorial](https://graphql-yoga.com/tutorial/basic/00-introduction) a try! It will
+guide you in building a full-featured, modern API with GraphQL Yoga.
+
+[Episode #36 of `graphql.wtf`](https://graphql.wtf/episodes/36-graphql-yoga-2) is also great
+introduction to GraphQL Yoga 2.0:
+
+import { YoutubeIframe } from '#components/youtube-iframe'
+
+
+
+### ... or Migrate Your Existing GraphQL Server to Yoga
+
+All Yoga v2's features
+[are well documented on the website](https://graphql-yoga.com/docs/quick-start), and we also have
+[some migration guides](https://graphql-yoga.com/docs/migration/migration-from-apollo-server) (from
+v1, Apollo Server and Express GraphQL).
+
+## What's Next
+
+Yoga v2 is the biggest and most important project we released to date; still, it is just the
+beginning of our GraphQL server vision.
+
+We can't wait to get your
+[questions, user feedback, and feature requests/PRs](https://github.com/dotansimha/graphql-yoga),
+and we already plan for new features such as an Enhanced Plugin System that will provide features
+similar to Envelop but at the request level.
+
+Don't hesitate to reach out to us on Twitter and support us by
+[sharing this article!]()
diff --git a/packages/web/docs/src/app/blog/(posts)/announcing-self-hosted-graphql-hive/page.mdx b/packages/web/docs/src/app/blog/(posts)/announcing-self-hosted-graphql-hive/page.mdx
new file mode 100644
index 00000000000..77e91d6d69c
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/announcing-self-hosted-graphql-hive/page.mdx
@@ -0,0 +1,38 @@
+---
+title: Announcing self-hosted GraphQL Hive
+tags: [graphql, graphql-federation, graphql-hive]
+authors: [laurin]
+date: 2022-10-05
+description:
+ Host your own GraphQL Hive instance. We are happy to announce that we have reached the milestone
+ of making it easy to host their own instance of GraphQL Hive.
+---
+
+It has been five months since [we launched GraphQL Hive](/blog/announcing-graphql-hive-release) and
+one year since [we first announced GraphQL Hive](/blog/graphql-hive-preview), and it has been a wild
+ride since then!
+
+> GraphQL Hive is our schema registry solution for continuously evolving your GraphQL schema backed
+> by performance insights and usage statistics. Whether you are working in a small company with a
+> single GraphQL service or a big multi-team company with multiple (federated or composed) GraphQL
+> services, GraphQL Hive is the perfect tool to help you manage your GraphQL schema.
+
+We first were surprised but also excited about the amount of interest from companies of all sizes
+and industries and individuals from all over the world in GraphQL Hive. We are so grateful for all
+the support, contributions and feedback we received so far from external contributors and are
+looking forward to a bright future!
+
+Aside from the diverse range of companies that are already successfully using our hosted GraphQL
+Hive version, a lot of companies have been asking us whether it is possible to host your own GraphQL
+Hive instance!
+
+Since the beginning of the project, we had a different vision for SaaS and community editions of
+GraphQL Hive compared to traditional SaaS products. Instead of only open-sourcing a small portion of
+the whole stack we always wanted to open-source the full stack and make it easy for anyone to host
+their own instance of GraphQL Hive.
+
+Today, we are happy to announce that we have reached this milestone and spinning up your first
+GraphQL Hive instance is as easy as running a single command! All you need is `docker` and
+`docker-compose` installed on your machine.
+
+[Head over to our GraphQL Hive documentation for getting started!](https://the-guild.dev/graphql/hive/docs/self-hosting/get-started)
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/063a3d092340209bd6e454e2fee4ac41.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/063a3d092340209bd6e454e2fee4ac41.png
new file mode 100644
index 00000000000..b8f4853afca
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/063a3d092340209bd6e454e2fee4ac41.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/1600bc44b918bf784039061e9895496f.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/1600bc44b918bf784039061e9895496f.png
new file mode 100644
index 00000000000..1ffe96842f6
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/1600bc44b918bf784039061e9895496f.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/250a232da3f4667a2feba74895729d19.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/250a232da3f4667a2feba74895729d19.png
new file mode 100644
index 00000000000..7e08c911f8f
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/250a232da3f4667a2feba74895729d19.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/251fe78b9075dac4e8088a4e174427e1.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/251fe78b9075dac4e8088a4e174427e1.png
new file mode 100644
index 00000000000..8ae00be82d6
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/251fe78b9075dac4e8088a4e174427e1.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/26d1e2f5199df372a39ca801d9ce936b.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/26d1e2f5199df372a39ca801d9ce936b.png
new file mode 100644
index 00000000000..bb7447198cf
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/26d1e2f5199df372a39ca801d9ce936b.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/3b47588c7a195cbb887dad8db7fb8c7f.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/3b47588c7a195cbb887dad8db7fb8c7f.png
new file mode 100644
index 00000000000..76d5be55f5a
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/3b47588c7a195cbb887dad8db7fb8c7f.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/8356f13d18d0ff7af35920e4bf73f854.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/8356f13d18d0ff7af35920e4bf73f854.png
new file mode 100644
index 00000000000..fe095457047
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/8356f13d18d0ff7af35920e4bf73f854.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/9eb65f486aae61db008b4b6f5bea90e3.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/9eb65f486aae61db008b4b6f5bea90e3.png
new file mode 100644
index 00000000000..41967bd05b5
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/9eb65f486aae61db008b4b6f5bea90e3.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/c6953c9d535f0c4ab8a02f8019954e99.png b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/c6953c9d535f0c4ab8a02f8019954e99.png
new file mode 100644
index 00000000000..b144c0169c1
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/c6953c9d535f0c4ab8a02f8019954e99.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/page.mdx b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/page.mdx
new file mode 100644
index 00000000000..472283532f9
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/apollo-angular-011/page.mdx
@@ -0,0 +1,312 @@
+---
+title: Apollo Angular Version 0.11
+authors: kamil
+tags: [graphql, apollo-angular]
+date: 2017-03-01
+description: New name, AoT support, TypeScript improvements, and Angular 4 readiness
+---
+
+## New Name, AoT Support, TypeScript Improvements, and Angular 4 Readiness
+
+We recently released version `0.11.0` of
+[apollo-angular](https://github.com/apollographql/apollo-angular) and a lot of things have changed
+and improved since our last update blog!
+
+First, here is an overview list of the main changes:
+
+- New name
+- Support for Apollo Client 0.8+
+- AoT support
+- Multiple Apollo Client instances in a single app
+- TypeScript improvements and TypeScript codegen
+- Apollo Client Developer Tools
+- ES6 Modules and Tree Shaking
+- Support for Angular 4
+
+So let's dive into it!
+
+---
+
+## New Name
+
+
+
+As you all know, the term “Angular 2” is
+[no longer a thing](https://angularjs.blogspot.com/2017/01/branding-guidelines-for-angular-and.html),
+now it's just “Angular”, without the version suffix (#justAngular). So we renamed the package to be
+**“apollo-angular”**. We really wanted “angular-apollo” to match up with `react-apollo`, but it was
+already taken. That means that from now on the “angular2-apollo” package is deprecated.
+
+We've applied this rule to the service as well, so there is no “Angular2Apollo” anymore. It's just
+**Apollo**. Simpler and more convenient. The migration process is very simple:
+
+```ts
+import { Angular2Apollo } from 'angular2-apollo'
+
+class AppComponent {
+ constructor(apollo: Angular2Apollo) {}
+}
+```
+
+```typescript
+import { Apollo } from 'apollo-angular'
+
+class AppComponent {
+ constructor(apollo: Apollo) {}
+}
+```
+
+---
+
+## Apollo Client 0.8
+
+We've updated our dependency to apollo-client 0.8 which includes a lot of improvements in size and
+performance. check out the full list
+[here](https://dev-blog.apollodata.com/apollo-client-0-8-e8db5efc75fb).
+
+---
+
+## Ahead-Of-Time Compilation
+
+
+
+One of the most interesting features of Angular is Ahead-of-Time compilation. Angular's compiler
+converts the application, components, and templates to executable JavaScript code at build time. AoT
+compilation improves the size of the app as well as the performance and stability thanks to
+static-code analysis at build time.
+
+
+
+To support this feature, we had to change the way of providing ApolloClient to ApolloModule. Instead
+of using an instance of ApolloClient directly, it has to be wrapped with a function. Here's an
+example:
+
+```ts
+import { ApolloModule } from 'apollo-angular'
+import { ApolloClient } from 'apollo-client'
+
+const client = new ApolloClient()
+
+function provideClient() {
+ return client
+}
+
+ApolloModule.withClient(provideClient)
+```
+
+---
+
+## Multiple Clients
+
+
+
+We're happy to introduce a support for multiple clients. Yes, it's now possible to use many
+instances of the ApolloClient inside of the ApolloModule, meaning you can call multiple GraphQL
+endpoints from your single client app.
+
+The use case for this feature came from some of our enterprise users. Some common use cases are when
+working with a server endpoint as well as a 3rd party API, or in case you are calling multiple
+microservices GraphQL endpoints from on client app. While it's always better to have all of your
+data in one GraphQL service to be able to get all of the data you need in one request, sometimes
+it's unavoidable to have to call multiple APIs.
+
+We decided to make it as an optional feature and to implement it in a way that doesn't break your
+existing app. Let me explain how it works. First thing, you need to define a function to return a
+map of clients:
+
+```ts
+function provideClients() {
+ return {
+ default: defaultClient,
+ extra: extraClient
+ }
+}
+```
+
+Then, you can use a new method of ApolloModule called **forRoot** to provide clients, so you can use
+it in your app:
+
+```
+ApolloModule.forRoot(provideClients)
+```
+
+The `Apollo` service has now two new methods: `use()` and `default()`. First one takes a key of a
+client you want to use, second one returns the default client.
+
+```typescript
+
+class AppComponent {
+ apollo: Apollo;
+
+ ngOnInit() {
+ // uses the defaultClient
+ this.apollo.watchQuery({...}).subscribe(() => {});
+
+ // works the same as the one above
+ this.apollo.default().watchQuery({...}).subscribe(() => {});
+ // uses the extraClient
+ this.apollo.use('extra').watchQuery({...}).subscribe(() => {});
+ }
+}
+
+```
+
+> It's important to know that if you want to have a default client, you need to use `default` as a
+> key.
+
+---
+
+## More Control
+
+
+
+Apollo-Client and Apollo-Angular both are written in TypeScript, but we still had room for
+improvements for our users, here are some of them.
+
+Thanks to [the recent change](https://github.com/apollographql/apollo-client/pull/914) we were able
+to take advantage of TypeScript's feature called **Generic Types**. It's now possible to easily
+define an interface of the “data” property in methods like _watchQuery_, _query_, _mutation_ and
+many more.
+
+This gives you **more control** over the code, making it **more predictable** and easier to
+**prevent bugs.** Take a look at an example.
+
+```ts
+const query = gql`
+ query currentUser {
+ currentUser {
+ name
+ }
+ }
+`
+
+interface User {
+ name: string
+}
+
+interface Data {
+ currentUser: User
+}
+
+class AppComponent {
+ apollo: Apollo
+ currentUser: User
+
+ ngOnInit() {
+ this.apollo.watchQuery({ query }).subscribe(result => {
+ this.currentUser = result.data.currentUser
+ })
+ }
+}
+```
+
+It's very helpful and convenient, especially when used with RxJS operators. You gain more control
+over the result modifications. But there are even more improvements!
+
+## Let's Talk about Observables
+
+In Angular world, we commonly use RxJS. Unfortunately, Apollo's standard observable shim is not
+compatible with RxJS, so to have the best developer experience, we created the
+ApolloQueryObservable. They both behave the same, containing the same methods (like refetch for
+example), except the RxJS support.
+
+We recently changed the logic of the ApolloQueryObservable's generic type. Here's an example to see
+how to migrate:
+
+```typescript
+class AppComponent {
+ user: ApolloQueryObservable>
+
+ getUser() {
+ this.user.subscribe(result => {
+ // result is of type ApolloQueryResult
+ })
+ }
+}
+```
+
+```ts
+class AppComponent {
+ user: ApolloQueryObservable
+
+ getUser() {
+ this.user.subscribe(result => {
+ // result is of type ApolloQueryResult
+ })
+ }
+}
+```
+
+## It Is Human Nature to Be Lazy
+
+
+
+We love automation, just to avoid keep repeating the same things on and on again. I have great news
+for you!
+
+As we know, GraphQL is strongly typed, so we have created a tool to **generate API code or type
+annotations based on a GraphQL schema and query documents**. This tool is called
+[“apollo-codegen”](https://github.com/apollographql/apollo-codegen).
+
+Thanks to Robin Ricard's work, Apollo Codegen now supports TypeScript, so Angular developers no
+longer have to define types for their queries manually.
+
+## Better Developer Experience
+
+
+
+We are happy to announce that Angular integration works great with the
+[**Apollo Client Developer Tools**](https://dev-blog.apollodata.com/apollo-client-developer-tools-ff89181ebcf).
+
+It's a Chrome DevTools extension for Apollo Client which has 3 main features:
+
+- A built-in GraphiQL console that allows you to make queries against your GraphQL server using your
+ app's network interface directly (no configuration necessary).
+- A query watcher that shows you which queries are being watched by the current page, when those
+ queries are loading, and what variables those queries are using.
+- A cache inspector that displays your client-side Redux store in an Apollo-Client-friendly way. You
+ can explore the state of the store through a tree-like interface, and search through the store for
+ specific field keys and values.
+
+Try the dev tools in your Angular Apollo app today!
+
+---
+
+## ES6 Modules and Tree Shaking
+
+
+
+App load time is an important part of the overall user experience. Earlier, I talked about AoT
+compilation, which radically improves performance, but there is still room to speed things up.
+
+To make our app even smaller we can use a process called **Tree Shaking**. It basically follows the
+trail of import and export statements by statically analyzing the code. This way we get rid of
+unused parts of the application.
+
+As you know, every angular package has a **UMD bundle** (to support **CommonJS** and **AMD**) and a
+separate space for **ES6 Modules**. Thanks to recent changes in the
+[apollo-client](https://github.com/apollographql/apollo-client/pull/1069) and
+[apollo-client-rxjs](https://github.com/kamilkisiela/apollo-client-rxjs/pull/16), we do the same, so
+you can use tree shaking in your app!
+
+---
+
+## Ready for the Future
+
+
+
+With the first stable version of Angular, the core team announced a predictable release schedule. It
+means that every 6 months there's going to be a new major version of the framework.
+
+We have good news!
+
+**Angular 4.0.0** is now still in beta, but it's **fully compatible with Apollo**, so you don't have
+to worry about any breaking changes.
+
+## Keep Improving
+
+We are working hard to give Angular developers the best developer experience we can. We want to hear
+more from you — what should we do next, what can we improve?
+
+And if you are really interested in GraphQL, Did you know
+[Apollo is hiring](https://meteor.com/careers#open-source-engineer)?
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-12/861767ce574bfae276f842a1c7046ec4.webm b/packages/web/docs/src/app/blog/(posts)/apollo-angular-12/861767ce574bfae276f842a1c7046ec4.webm
new file mode 100644
index 00000000000..e6abc0b3291
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/apollo-angular-12/861767ce574bfae276f842a1c7046ec4.webm differ
diff --git a/packages/web/docs/src/app/blog/(posts)/apollo-angular-12/page.mdx b/packages/web/docs/src/app/blog/(posts)/apollo-angular-12/page.mdx
new file mode 100644
index 00000000000..7871acb9f55
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/apollo-angular-12/page.mdx
@@ -0,0 +1,212 @@
+---
+title: Apollo-Angular 1.2 - using GraphQL in your apps just got a lot easier!
+tags: [graphql, angular, apollo-angular]
+authors: kamil
+date: 2018-08-21
+description:
+ Check what's new in Apollo Angular and how to get the full potential benefits of using Angular +
+ GraphQL + TypeScript combined thanks to GraphQL-Code-Generator
+---
+
+import { StackBlitz } from '#components/stack-blitz'
+import { VideoEmbed } from '#components/video-embed'
+import { YoutubeIframe } from '#components/youtube-iframe'
+
+_Check what's new in Apollo Angular and how to get the full potential benefits of using Angular +
+GraphQL + TypeScript combined thanks to GraphQL-Code-Generator._
+
+We are very excited to announce a new version of Apollo Angular that dramatically improves and
+simplifies the usage of GraphQL with Angular.
+
+This version also adds production and scale related features, that our large Enterprise and
+production users had been asking for.
+
+## TL;DR
+
+- [Code generation for Apollo Angular](https://graphql-code-generator.com/docs/plugins/typescript-apollo-angular)
+- Query, Mutation, Subscription as an Angular service
+- [Apollo Angular Boost](https://npmjs.com/package/apollo-angular-boost)
+- Testing tools
+
+---
+
+
+
+---
+
+## Introducing Query, Mutation and Subscription as an Angular Services
+
+Through almost two years of using GraphQL in Angular we gained a lot of experience, and learned how
+people use the library.
+
+With the current API, having `query` and `watchQuery` methods sometimes confused a lot of
+developers. For people who use Apollo for long time it's obvious but we often get asked about
+differences between them and many newcomers are surprised.
+
+> We decided to add a new approach of working with GraphQL in Angular.
+
+```ts
+import { Injectable } from '@angular/core';
+import { Query } from 'apollo-angular';
+import gql from 'graphql-tag';
+
+@Injectable({...})
+export class FeedGQL extends Query {
+ document = gql`
+ query Feed {
+ posts {
+ id
+ title
+ }
+ }
+ `
+}
+```
+
+There are now 3 new simpler APIs: `Query`, `Mutation` and `Subscription`. Each of them allows to
+define the shape of a result & variables.
+
+The only thing you need to do is to set the `document` property, That's it, and now you use it as a
+regular Angular service:
+
+```ts
+import { Component } from '@angular/core'
+import { FeedGQL } from './feed-gql.ts'
+
+@Component({
+ /* … */
+})
+export class FeedComponent {
+ constructor(feedGQL: FeedGQL) {
+ feedGQL.watch().valueChanges.subscribe(result => {
+ // ...
+ })
+ }
+}
+```
+
+In our opinion, the new API is more intuitive and documents feels now like a first class-citizens.
+
+> But it also opens up the doors for something wayyyyy cooler!
+
+## Taking It to the Next Level
+
+As an Angular developer, you already understand how much power Typescript adds to your development —
+the Angular community took those capabilities to the next level with code generation, through things
+like schematics.
+
+The GraphQL community also took the concept of static type capabilities into new places — over the
+API and managing data automatically at runtime with the query language.
+
+While using GraphQL, Typescript and Angular and maintaining `apollo-angular` in the past 2 years we
+always keep thinking how can we get all those technologies closer to create something that is more
+powerful than the sum of its parts.
+
+
+
+## GraphQL Code Generator for Apollo Angular
+
+We are pleased to announce a new set of tools that takes the GraphQL schema from the server and the
+query from the Angular component and generate everything in the middle for you!
+
+Just by consuming a static GraphQL schema and defining the data you need and its structure in a
+GraphQL Query, there is no need for you to write any Typescript! You already defined it, why writing
+it again?
+
+We will generate a strongly typed Angular service, for every defined query, mutation or
+subscription, ready to use in your components!
+
+## How It Works
+
+You create a `.graphql` file with a document that you want to use in a component:
+
+```graphql
+query Feed {
+ posts {
+ id
+ title
+ }
+}
+```
+
+Next, you run the
+[**GraphQL Code Generator — Angular Apollo Plugin**](https://graphql-code-generator.com/docs/plugins/typescript-apollo-angular)
+to generate types and angular services.
+
+Then you simply import and use it as a regular, Angular service.
+
+```js
+import { FeedGQL } from './generated'
+```
+
+> GraphQL Code Generator takes query's name, makes it PascalCased and adds GQL suffix to it. An
+> example, “myFeed” becomes “MyFeedGQL”.
+
+See it here in action and play with it:
+
+
+
+To play with code generator try to clone this repository:
+
+
+ github.com/kamilkisiela/apollo-angular-services
+
+
+Using Angular, Typescript and GraphQL in a coordinated way, gives us new level of simplicity and
+power for our developer experience:
+
+- **Less code to write** — no need to create a network call, no need to create Typescript typings,
+ no need to create a dedicated Angular service
+- **Strongly typed out of the box** — all types are being generated, no need to write any Typescript
+ definitions and struggle to keep them updated
+- **Full developer experience of tools and IDEs** — development time autocomplete and error
+ checking, not only across your frontend app but also with your API teams!
+- **Tree-shakable** thanks to Angular 6
+
+## More Thanks to GraphQL
+
+We believe GraphQL is a game changer in how you plan and create your frontend apps.
+
+The vision that guides us is that you should be able to sketch a list of data types your backend can
+provide, sketch components and their data dependencies — and all the rest of the plumbing can be
+generated for you.
+
+Once you'll write an app like that, you will ask yourself why did you write all the other
+boilerplate code by yourself before.
+
+But we've just talked about one new feature in apollo-angular. there is more:
+
+- **Testing utilities** There were a lot of questions about testing Apollo components, so we decided
+ to finally release something with a similar API to the one Angular's `HttpClient` uses.
+ [Sergey Fetiskin](https://medium.com/@sergeyfetiskin?source=post_header_lockup) wrote
+ [an article about it](https://medium.com/@sergeyfetiskin/testing-apollo-graphql-in-your-angular-application-595f0a04aad3).
+- **Apollo Angular Boost** It's hard for newcomers to get started with Apollo Angular. Inspired by
+ Apollo Boost we decided to create an Angular version of it. Here's
+ [an interactive example](https://stackblitz.com/edit/simple-apollo-angular-boost-example).
+- **Create Apollo on DI level** There is now an extra way to create Apollo Client. Instead of using
+ `Apollo.create` inside of a constructor, you can provide settings on Dependency Injection level.
+ Read the
+ [“Using Dependency Injection”](https://apollographql.com/docs/angular/basics/setup.html#using-dependency-injection)
+ chapter in docs.
+- **GraphQL Subscription outside NgZone** Apollo.subscribe accepts now a second argument in which
+ you can enable running subscription's callback outside NgZone.
+- **Automatic Persisted Queries for Angular** It's now possible to use APQ with Angular's
+ HttpClient, just install apollo-angular-link-persisted.
+
+---
+
+- Query and Mutation as a service on
+ [StackBlitz](https://stackblitz.com/edit/apollo-angular-services) and
+ [GitHub](https://github.com/kamilkisiela/apollo-angular-services)
+- Query and Mutation —
+ [Step by step tutorial](https://github.com/kamilkisiela/apollo-angular-introduction)
+- Example:
+ [Apollo Angular Boost on StackBlitz](https://stackblitz.com/edit/basic-apollo-angular-app)
+- [Apollo Angular repository](https://github.com/apollographql/apollo-angular)
+- [Documentation](https://apollographql.com/docs/angular/basics/services.html)
diff --git a/packages/web/docs/src/app/blog/(posts)/better-type-safety-for-resolvers-with-graphql-codegen/page.mdx b/packages/web/docs/src/app/blog/(posts)/better-type-safety-for-resolvers-with-graphql-codegen/page.mdx
new file mode 100644
index 00000000000..ee979e0c09d
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/better-type-safety-for-resolvers-with-graphql-codegen/page.mdx
@@ -0,0 +1,203 @@
+---
+title: Better Type Safety for your GraphQL resolvers with GraphQL Codegen
+tags: [graphql, codegen, node, typescript]
+authors: dotan
+date: 2020-05-17
+description:
+ Type-check your resolvers' implementation in order to find issues in build-time. Simply integrate
+ with your existing TypeScript data models and context types.
+---
+
+import { CodeSandbox } from '#components/code-sandbox'
+
+export const embedOptions = {
+ theme: 'light',
+ view: 'editor',
+ previewwindow: 'console'
+}
+
+If you use TypeScript to write your GraphQL schema implementation, you'll love the integration with
+GraphQL Codegen and `typescript-resolvers` plugin.
+
+This plugin allows you to easily have typings for your resolvers, with super flexible configuration
+that allow you to integrate it easily to your existing code, types and models.
+
+That means that you can type-seal your code and have complete type-safety: your GraphQL resolvers
+will be typed (parent type, args, inputs, return value, context type), and you can use your own
+TypeScript type models, so you can have type-safety all across your implementation, from API to
+database.
+
+Having type check on your resolvers can help to improve your code quality, detect issues in build
+time (instead of runtime), and improve developer experience.
+
+## Getting Started
+
+If you are already familiar with [GraphQL Code Generator](https://the-guild.dev/graphql/codegen),
+you can skip this step.
+
+Start by installing GraphQL Codegen and the relevant plugins:
+
+```sh
+yarn add @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-resolvers
+```
+
+Now, create `codegen.yml` file with the following, make sure to point to your schema location:
+
+```yaml
+schema: YOUR_SCHEMA_LOCATION_HERE
+generates:
+ ./resolvers-types.ts:
+ plugins:
+ - typescript
+ - typescript-resolvers
+```
+
+> GraphQL Code Generator uses [`graphql-tools`](https://the-guild.dev/graphql/tools) so you can
+> point to your schema files, or `/graphql` endpoint.
+
+To run GraphQL Codegen, use: `yarn graphql-codegen` (or, create a script for it if you wish). This
+should create a new file called `resolvers-types.ts` in your codebase.
+
+## Simple Resolvers Signature
+
+In this example, we'll use the following GraphQL schema and resolvers as reference.
+[You can find a working live-demo of this part here](https://codesandbox.io/s/condescending-albattani-ixyp9?file=/resolvers.ts).
+
+
+
+This is a naive implementation of a GraphQL API, and we'll see how more advanced use cases could be
+implemented in the upcoming steps.
+
+To get started with the generated files, import `Resolvers` identifier from your generated file, and
+use it to type your resolvers object, for example:
+
+
+
+Now, TypeScript engine will verify that object you returned, and you'll be able to see that if
+you'll change one of the fields, it will be type checked immediately.
+
+Also, if you'll change your schema types and re-run the codegen (or use
+[Watch Mode](https://graphql-code-generator.com/docs/getting-started/development-workflow#watch-mode)),
+it will re-generate the matching types and check your code again.
+
+As your probably understood, the default behavior of `typescript-resolvers` is using the base type
+generated by `typescript`, that means, that your schema types and resolvers needs to match and have
+the same signature and structure.
+
+But it's not always the case - because your GraphQL schema, in most cases, isn't the same as your
+models types - this is why we have `mappers` configuration.
+
+## Use Your Model Types
+
+Models types are the way your data is being stored or represented behind the scenes. Think about
+`User` object from example - in most cases, the representation of `User` in your database (or any
+other downstream API) is different than the way your represent `User` in your API. Sometimes it's
+because of security considerations, and sometimes because fields are internal and used only by you,
+and not by the consumers.
+
+Those model types are the actual objects that you are usually using in your resolvers code. Those
+can be created manually (with a simple TypeScript `type`, `interface` or `class`), or created
+automatically from your downstream APIs, database or any other data-source that you use in your app.
+
+The way to tell codegen where are your models types are located is called `mappers`.
+
+To use `mappers` configuration, we need first to setup a real type safety, and have models types for
+our actual objects.
+
+Let's assumes that your backend is implemented this way, with some models types:
+
+
+
+It means that now, your resolvers implementation needs to adjusted and handle the different data
+structure:
+
+
+
+Noticed the errors? it caused by the fact that we don't have the appropriate mapping set yet. We
+need to tell GraphQL codegen that our schema types are different than the model types.
+
+To do that, let's update codegen config with `mappers` and add a mapping between a GraphQL type to a
+TypeScript type (and the file it's located in):
+
+
+
+This way, GraphQL Codegen will use your custom models types in the generated output, instead of the
+default types, and your resolvers' implementation will look like that:
+
+
+
+Note that now you'll get autocomplete, type safety and a better connection between your GraphQL
+schema and your GraphQL resolvers.
+
+## Typed Context
+
+`typescript-resolvers` also supports replacing the `context` type of your resolvers' implementation.
+All you have to do, is to add this following to your codegen configuration:
+
+```yaml
+schema: schema.graphql
+generates:
+ ./resolvers-types.ts:
+ config:
+ contextType: models#MyContextType
+ mappers:
+ User: ./models#UserModel
+ Profile: ./models#UserProfile
+ plugins:
+ - typescript
+ - typescript-resolvers
+```
+
+This will make sure to replace `any` with `MyContextType`, and you'll be able to access a
+fully-typed `context` object in your resolvers.
+
+## What's Next?
+
+A few notes that worth mentioning:
+
+- You can use `mappers` on every GraphQL type, interface or a union.
+- Your resolvers' arguments (`args`) are also fully-typed, according to your schema definition.
+- The `parent` value is also fully typed, based on your `mappers`.
+- You can import your types from a node module package (`User: models-lib#UserType`).
+- You can also map to built-in language types (`DateType: Date`)
+- Aliasing the imports is also possible (`User: ./models#User as MyCustomUserType`)
+
+You can also modify the default mapper (`defaultMapper`) and allow partial resolution, this will
+allow you to return partial objects in every resolver
+([more info](https://github.com/dotansimha/graphql-code-generator/issues/1133#issuecomment-456812621)):
+
+```yaml
+config:
+ useIndexSignature: true
+ defaultMapper: Partial<{T}>
+```
+
+For more advanced use-cases, you can find
+[the complete plugin documentation here](https://graphql-code-generator.com/docs/plugins/typescript-resolvers/#configuration).
diff --git a/packages/web/docs/src/app/blog/(posts)/build-realtime-graphql-backends-with-grafbase/page.mdx b/packages/web/docs/src/app/blog/(posts)/build-realtime-graphql-backends-with-grafbase/page.mdx
new file mode 100644
index 00000000000..8f2ffe31e5c
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/build-realtime-graphql-backends-with-grafbase/page.mdx
@@ -0,0 +1,118 @@
+---
+title: Build realtime GraphQL backends with Grafbase
+description:
+ Build collaborative, multiplayer apps faster and easier than ever with GraphQL Live Queries using
+ Grafbase.
+authors: notrab
+tags: [graphql, real-time, live-query]
+date: 2023-01-17
+---
+
+**The Guild** has made working with realtime
+[GraphQL Subscriptions and Live Queries](/blog/subscriptions-and-live-queries-real-time-with-graphql)
+easy over the last few years thanks to plugins that work out of the box with
+[GraphQL Yoga](https://the-guild.dev/graphql/yoga-server).
+
+However, there are developers who don't want the hassle of building a backend, managing deployments,
+configuring continuous integration, juggling connection pooling, and more. Thankfully, there are
+solutions designed to abstract all the hard work.
+
+[Grafbase](https://grafbase.com) was built to manage all of the above. You get a distributed GraphQL
+API at the edge by creating a single `grafbase/schema.graphql` file in your project.
+
+Your schema contains models with special directives to relate data, set default values, validation,
+and more.
+
+```graphql
+# grafbase/schema.graphql
+
+type Post @model {
+ title: String!
+ slug: String! @unique
+}
+```
+
+In 2021, [Laurin Quast](https://twitter.com/n1rual) introduced a collection of packages to support
+the use of GraphQL Live Queries on the server and client.
+
+**Today, Grafbase is happy to announce it now supports GraphQL Live Queries!**
+
+This means that all you need to do to start using GraphQL Live Queries is add `@live` to your query!
+
+```graphql
+query @live {
+ postCollection(first: 10) {
+ edges {
+ node {
+ id
+ title
+ }
+ }
+ }
+}
+```
+
+The `@live` directive will observe any changes to the data and send a message using
+[Server-Sent Events](https://grafbase.com/docs/realtime/live-queries#server-sent-events) with the
+patch to update the current query state.
+
+The event is in the format of
+[JSON Patch](https://grafbase.com/docs/realtime/live-queries#json-patch):
+
+```json
+{
+ "patch": [
+ {
+ "op": "add",
+ "path": "/postCollection/edges/3",
+ "value": {
+ "node": {
+ "id": "post_01GJMDWJ2M6WWTM26S7C1KKYBE",
+ "title": "Instant serverless GraphQL backends"
+ }
+ }
+ }
+ ],
+ "revision": 1
+}
+```
+
+Together with The Guild, Grafbase is also releasing 2 new packages (with more on the way) to further
+abstract the effort needed to implement Live Queries on the frontend.
+
+Starting with support for [Apollo Client](https://www.apollographql.com/docs/react/) and
+[URQL](https://formidable.com/open-source/urql/), you can add Live Queries with the following
+packages:
+
+- [`@grafbase/apollo-link`](https://www.npmjs.com/package/@grafbase/apollo-link)
+- [`@grafbase/urql-exchange`](https://www.npmjs.com/package/@grafbase/urql-exchange)
+
+Developers not using either of those libraries can still use Live Queries with the native
+[`EventSource`](https://grafbase.com/docs/realtime/live-queries#eventsource) API.
+
+## Try It Now!
+
+You can try Live Queries by building your own backend in one simple command:
+
+```bash
+npx grafbase init
+```
+
+Once you've modelled your data using the [schema](https://grafbase.com/docs/schema/overview) you can
+run your backend locally to build:
+
+```bash
+npx grafbase dev
+```
+
+## About Grafbase
+
+Grafbase is the easiest way to build and deploy GraphQL backends. Go from idea to production in
+seconds, without spending time on infrastructure.
+
+- Build backends with GraphQL SDL as configuration
+- Spin up instant preview environments with every PR
+- Build locally with the CLI — `npx grafbase dev`
+- Deployed to the edge with no cold starts
+- Add granular permissions for users (and groups)
+- **Build collaborative multiplayer apps faster with Live Queries**
diff --git a/packages/web/docs/src/app/blog/(posts)/building-graphql-servers-in-2022/page.mdx b/packages/web/docs/src/app/blog/(posts)/building-graphql-servers-in-2022/page.mdx
new file mode 100644
index 00000000000..c27c5d4d9b5
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/building-graphql-servers-in-2022/page.mdx
@@ -0,0 +1,67 @@
+---
+title: Building GraphQL Servers in 2022
+authors: notrab
+tags: [graphql, conference, yoga]
+date: 2022-06-28
+description:
+ In this talk we'll learn about the tools needed to build your own GraphQL server from scratch
+ using GraphQL Yoga.
+---
+
+Building GraphQL servers in 2022 couldn't be any easier thanks to GraphQL Yoga. This year at
+[HasuraCon](https://hasura.io/events/hasura-con-2022/building-graphql-servers-in-2022-overview-of-the-bestnew-tools-you-should-add-to-your-toolbelt)
+I discussed how Yoga started, how it evolved, and what we can expect from the future.
+
+For many years of building GraphQL servers in the Node ecosystem, our choices have been limited.
+Apollo Server library has dominated the ecosystem. With its pairing client library, it was often a
+good fit for a very long time. However, I believe there are more mature and battle-tested solutions
+available today, thanks to the evolution of Yoga.
+
+[GraphQL Yoga](https://graphql-yoga.com) takes a different approach by providing enough bells and
+whistles that make you production-ready, but builds itself on top of the core primitives of HTTP.
+Yoga is runtime agnostic too, so if you're currently working with Cloudflare Workers, Vercel
+Functions, AWS Lambda or something else, Yoga will fit right in.
+
+GraphQL Yoga comes with [Envelop](https://envelop.dev), and is the recommended way you should be
+using Envelop today to extend your GraphQL server.
+
+import { YoutubeIframe } from '#components/youtube-iframe'
+
+
+
+If you haven't used Yoga before, this is how easy it is to create a production-ready GraphQL server:
+
+```ts
+import { createServer } from '@graphql-yoga/node'
+
+const server = createServer({
+ schema: {
+ typeDefs: /* GraphQL */ `
+ type Query {
+ hello: String
+ }
+ `,
+ resolvers: {
+ Query: {
+ hello: () => 'Hello from Yoga!'
+ }
+ }
+ }
+})
+
+server.start()
+```
+
+If you are interested in following along with me to build a server, add plugins and more, you can
+watch the recording of the workshop:
+
+
+
+Hopefully you find this talk interesting, and you learn more about building GraphQL severs with
+Yoga!
diff --git a/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/auto.png b/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/auto.png
new file mode 100644
index 00000000000..98c08700193
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/auto.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/banner.png b/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/banner.png
new file mode 100644
index 00000000000..73852ed065e
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/banner.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/gif.gif b/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/gif.gif
new file mode 100644
index 00000000000..bd6bce978c5
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/building-random-gif-generator-with-fets-and-giphy/gif.gif differ
diff --git a/packages/web/docs/src/app/blog/(posts)/caching-data-with-dataloader/page.mdx b/packages/web/docs/src/app/blog/(posts)/caching-data-with-dataloader/page.mdx
new file mode 100644
index 00000000000..c26e3a77434
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/caching-data-with-dataloader/page.mdx
@@ -0,0 +1,227 @@
+---
+title: Caching data with DataLoader
+authors: giladtidhar
+tags: [cache, data, server, graphql]
+date: 2022-01-26
+description: How to use DataLoader to cache data in your GraphQL server.
+---
+
+import { Callout } from '@theguild/components'
+
+## Caching
+
+Caching is an essential part of designing scalable and performant GraphQL API.
+
+But, what is caching? Caching is the technical design of trying to avoid compute-intensive tasks by
+keeping their results temporarily in a cache. A cache is a place in memory for important data, which
+can be delivered to the client faster than the regular procedure.
+
+For example, for a GraphQL API, we might want to cache a field value that comes from a slow external
+API. The goal of caching is to improve performance where it's needed the most.
+
+### How Is Caching Faster?
+
+Using a cache for compute-intensive data is faster for a few reasons:
+
+- A cache is usually not stored in storage, but in memory, which is a much faster.
+- A cache is smaller than a database, so there are a lot less values to filter through.
+- While some cached data might be queried a lot of times, it will be fetched from the database only
+ one time, so there's less time lost for fetching multiple times.
+
+## How Do We Use Caching?
+
+### Caching with `dataloader`
+
+My preferred platform for caching is dataloader, and in this tutorial I will explain how to use
+dataloader with Node.js and Typescript, to have caching in your server.
+
+
+**Tip**: `dataloader` outside of GraphQL
+
+The `dataloader` package was created specifically for GraphQL, but it can work with other Node.js
+programs.
+
+
+
+## Using DataLoader
+
+### 1. Install DataLoader in Your Project
+
+Install `dataloader` by running the following:
+
+`npm install --save dataloader` or `yarn add dataloader`
+
+### 2. Import `dataloader`
+
+To start, import `dataloader` and LRU (LRU is a cache algorithm that will put only the most _X_
+requested items in the cache).
+
+```ts
+import DataLoader from 'dataloader'
+import { LRUMap } from 'lru_map'
+```
+
+### 3. Define the Types That Would Be Saved to Our Cache
+
+The first type should be a way to represent the data, like a string with a name, and the other is
+the data itself. For example, let's say we're trying to cache books. Our package name will be the
+books' id, so we can tell which book is which. Our package data will be the books' length, writer,
+price etc...
+
+so in this case, our schema would look like this:
+
+```graphql
+type book {
+ id: ID!
+ name: String!
+ author: author!
+ price: Int!
+ description: String!
+ length: Int!
+}
+type author {
+ id: ID!
+ name: String!
+}
+```
+
+and the corresponding data type would look like this:
+
+```ts
+type packageId = string
+
+type PackageData = /* note that this is the type of the data we represent. */ {
+ id: string
+ name: string
+ author: {
+ id: string
+ name: string
+ }
+ price: number
+ description: string
+ length: number
+}
+```
+
+The reason we write types is for type safety, let's say we have books and toys which have different
+values, we wouldn't want that somehow toys will be inserted into our books cache
+
+### 4. Create the DataLoader Instance
+
+```ts
+const dataLoader = new DataLoader(
+ async (/* (1) */ keys: readonly packageId[]) =>
+ /* (2) */ Promise.all(
+ keys.map(async packageId => {
+ await getData(packageId).catch(e => e)
+ })
+ ),
+ {
+ cacheMap: new LRUMap(100) /* (3) */
+ }
+)
+```
+
+As you can see, we give the keys that the user asks for to the dataloader (1).
+
+I recommend setting the keys to be some kind of id for the following reason: Lets say that in your
+api, the user asks for data using its id, so the user will fetch with `id:"something"`, you could
+just pass the id as the key, instead of changing it.
+
+The dataloader will first check if it has the keys on cache, and if so, it would return the data,
+without going through the database, saving you a lot of valuable time.
+
+After that (2), we give the dataloader a function for fetching the data, in case it doesn't have it
+in the cache. In this case, I have the function `getData`, and I'm using the keys to "get data" from
+my database.
+
+In the end (3) we give it cacheMap and some value, the value represents how many queries dataloader
+will cache, in this case, after a 100 values, it will delete the least used value (the one that
+wasn't queried for the longest time) to make space for the 101st value.
+
+From now, to query data, you just run
+
+```ts
+dataLoader.load(keys)
+```
+
+## DataLoader with GraphQL
+
+Dataloader was designed to work with GraphQL, to solve the
+[n+1 problem](https://medium.com/the-marcy-lab-school/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a)
+
+The N+1 problem is a common problem when designing GraphQL API. Looking at the Query below, we can
+see that the GraphQL API will call 20 times the `Book.author` resolver:
+
+```graphql
+query BooksWithAuthors {
+ books(first: 20) {
+ id
+ title
+ author {
+ id
+ name
+ }
+ }
+}
+```
+
+Depending on the resolver implementation, this query might trigger 20 SQL queries or API calls to
+resolve authors that might've wrote multiple books. Dataloader helps to solve this problem by
+caching, deferring and grouping similar resolver calls.
+
+### How to Use the DataLoader Package with GraphQL?
+
+To use the dataloader with GraphQL just pass it in the context!
+
+Now, your code should look somewhat like this:
+
+```ts
+import DataLoader from "dataloader";
+import { LRUMap } from "lru_map";
+
+type packageId = string;
+type PackageData = Package;
+
+export type GraphQLContext = {
+ dataLoader: DataLoader;
+ // ...
+};
+const dataLoader = new DataLoader(
+ async (keys: readonly PackageId[]) => {
+ return await Promise.all(
+ keys.map(async (packageId) => {
+ await getData(packageId).catch((e) => e);
+ })
+ );
+ },
+ {
+ cacheMap: new LRUMap(100),
+ }
+);
+// ...
+export async function contextFactory() {
+ return { dataLoader, ... };
+}
+```
+
+Now, in your resolvers, just call `context.dataLoader.load(keys)` and that's it! You now have
+caching in your server!
+
+An example of a resolver implementation:
+
+```ts
+export const resolvers = {
+ Query: {
+ getBook(parent, input, context) {
+ return context.dataLoader.load(input.bookId)
+ }
+ }
+}
+```
+
+for further learning, check these out:
+
+[The n+1 problem](https://medium.com/the-marcy-lab-school/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a)
+[The dataloader github page](https://github.com/graphql/dataloader)
+[A great video about dataloader](https://youtu.be/_FQ1ZEWIn2s)
diff --git a/packages/web/docs/src/app/blog/(posts)/ci-ci-graphql-inspector/circleci.jpeg b/packages/web/docs/src/app/blog/(posts)/ci-ci-graphql-inspector/circleci.jpeg
new file mode 100644
index 00000000000..be201163f83
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/ci-ci-graphql-inspector/circleci.jpeg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/ci-ci-graphql-inspector/page.mdx b/packages/web/docs/src/app/blog/(posts)/ci-ci-graphql-inspector/page.mdx
new file mode 100644
index 00000000000..5e44767b6dc
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/ci-ci-graphql-inspector/page.mdx
@@ -0,0 +1,92 @@
+---
+title: Validate GraphQL Schema - Continuous Integration & Delivery Pipeline
+authors: kamil
+tags: [graphql, graphql-inspector]
+date: 2020-05-03
+description:
+ Detect breaking changes and identify possible issues in GraphQL API with GraphQL Inspector
+---
+
+GraphQL Inspector since day one supported any kind of Continuous Integration and Delivery Pipeline.
+Nothing new here, except now it's more flexible and super lightweight.
+
+The new version of GraphQL Inspector comes with a **CLI crafter specifically for CI/CD**.
+
+We recently released a lot more interesting features. You can read about them in
+["New GraphQL Inspector and upcoming features"](/blog/new-graphql-inspector) article.
+
+## CLI for CI?
+
+The regular CLI comes with everything built-in. Loads Schema, Operations and Fragments from any
+source. It can extract GraphQL pieces from GraphQL files, code files (Vue, React, Angular and even
+Gatsby). The CLI supports GraphQL Endpoints, Git repositories and also files on GitHub.
+
+It's heavy!
+
+Usually, in the CI/CD pipeline you want to compare a current schema with the one in production and
+detect breaking changes. Which means, you don't need all the other commands and features of
+Inspector CLI.
+
+## CLI Designed for CI/CD
+
+That's why in new GraphQL Inspector, everything is a plugin.
+
+You want to compare schemas and detect breaking changes?
+
+```bash
+yarn global add @graphql-inspector/diff-command
+```
+
+Your production schema is accessible through an endpoint but newly proposed schema is defined
+in `.graphql` files?
+
+```bash
+yarn global add @graphql-inspector/url-loader
+yarn global add @graphql-inspector/graphql-loader
+```
+
+Ok, everything is ready!
+
+## How to Compare Schemas?
+
+You can use the command below in your CI/CD pipeline:
+
+```bash
+graphql-inspector diff "https://api.com/graphql" "schema.graphql"
+```
+
+Here's how the result looks like. It shows a list of all changes and groups them by criticality
+level (Breaking, Dangerous or Safe).
+
+
+
+To learn more about CLI for CI, please read
+["Continuous Integration"](https://graphql-inspector.com/docs/products/ci) chapter in our
+documentation.
+
+---
+
+## Future Plans
+
+We're working on **Azure and Bitbucket integrations** plus a **monitoring feature**. Talk to us to
+try it out.
+
+We want to make **Azure** and **Bitbucket** a first-class citizens in GraphQL Inspector and give you
+the same experience as you get right now with **GitHub**.
+
+**Monitoring** will enable you to analyze the traffic of your GraphQL APIs and provide details
+needed to improve performance. Collecting informations about the usage will let you safely remove
+deprecated pieces of GraphQL Schema.
+
+> If you're interested, please reach out to us!
+
+---
+
+### Enjoy GraphQL Inspector!
+
+We have big plans for Inspector, and you're very welcome to join us in that journey.
+
+GraphQL Inspector is a tool created by developers, for developers and that's why we'd love to get
+your feedback and shape GraphQL Inspector together!
+
+Oh... and it's [Open Sourced](https://github.com/kamilkisiela/graphql-inspector)!
diff --git a/packages/web/docs/src/app/blog/(posts)/codegen-typescript-react-apollo/b58035f95547416aab98b54d3ce812f6.png b/packages/web/docs/src/app/blog/(posts)/codegen-typescript-react-apollo/b58035f95547416aab98b54d3ce812f6.png
new file mode 100644
index 00000000000..1d99d3bf396
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/codegen-typescript-react-apollo/b58035f95547416aab98b54d3ce812f6.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/codegen-typescript-react-apollo/page.mdx b/packages/web/docs/src/app/blog/(posts)/codegen-typescript-react-apollo/page.mdx
new file mode 100644
index 00000000000..bffad9d880a
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/codegen-typescript-react-apollo/page.mdx
@@ -0,0 +1,153 @@
+---
+title: GraphQL Code Generator for Typescript React Apollo
+authors: arda
+tags: [graphql, codegen, react, react-apollo, hooks]
+date: 2018-08-21
+updateDate: 2020-05-20
+description:
+ Generate React Apollo Query, Mutation and Subscription components and hook. All completely typed
+ by TypeScript.
+---
+
+import { CodeSandbox } from '#components/code-sandbox'
+import { Callout } from '@theguild/components'
+
+export const embedOptions = {
+ theme: 'light',
+ view: 'editor',
+ previewwindow: 'console'
+}
+
+[GraphQL Code Generator](https://github.com/dotansimha/graphql-code-generator) is a template based
+generator that lets you generate anything out of your GraphQL schemas and queries.
+
+So we've created a new template that generates **React Apollo**'s **_Query_**, **_Mutation_** and
+**_Subscription_** components, as well as **_HOC_** components, all completely typed by
+**_TypeScript_**, so you won't have to do that work manually!
+
+## Introducing a Code Generator for React Apollo
+
+Whether you use the new **React Apollo API** or you prefer to use **HOC**, there is really no need
+to write those wrapper components again and again!
+
+Based on a GraphQL static schema and a GraphQL query, the
+[GraphQL Codegen - Typescript React Apollo Template](https://github.com/dotansimha/graphql-code-generator/tree/master/packages/templates/typescript-react-apollo)
+will generate a ready to use, fully typed components. All you need to do is to write your query,
+mutation or subscription and just use those components in your application.
+
+
+
+Using **_React_**, **_TypeScript_** and **_GraphQL_** in a coordinated way, gives us new level of
+simplicity and power for our developer experience:
+
+- **Less code to write** — no need to create a network call, no need to create Typescript typings,
+ no need to create a dedicated React Component
+- **Strongly typed out of the box** — all types are being generated, no need to write any Typescript
+ definitions and struggle to keep them updated
+- **Full developer experience of tools and IDEs** — development time autocomplete and error
+ checking, not only across your frontend app but also with your API teams!
+
+## Play with It
+
+We prepared an example of how to use those auto generated components,
+[it's available on CodeSandbox](https://codesandbox.io/s/github/dotansimha/graphql-codegen-react-apollo-example).
+
+
+
+## Start Using It
+
+All you need to do to use React Apollo template is to install two packages:
+
+```
+yarn add -D @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-operations @graphql-codegen/typescript-react-apollo
+```
+
+> Make sure you have `graphql` installed as well.
+
+Now let's create `codegen.yml` configuration file, pointing to our schema and documents files:
+
+
+
+Now let's set up a npm script in `package.json` to run `graphql-codegen` command:
+
+```json
+{
+ "scripts": {
+ "generate": "graphql-codegen"
+ }
+}
+```
+
+It might seem like a lot but lets split it into smaller pieces and explain each one of them it will
+make things easier.
+
+- **schema:** — path of a file with schema or an URL
+- **documents** - list of code files that contains your GraphQL queries
+- **generates:** — list of output files, with a nested list of plugins we would like to use.
+
+Then, define a `.graphql` file with a document that you'd like to use in a component:
+
+
+
+Next, you need to run GraphQL Code Generator to generate Typescript types and React components:
+
+```
+yarn generate
+```
+
+> You can also run `yarn graphql-codegen` directly.
+
+Then, you simply import the auto-generated React Hook, named after your GraphQL operation name and
+use it in your component:
+
+
+
+You can learn more about [React Apollo API here](https://apollographql.com/docs/react).
+
+
+If you are not using React Hooks, and you prefer to use React HOC or React Components for your data fetching, you can change the codegen configuration flags according to your needs:
+
+`withHooks: true` - will generate type-safe hooks.
+
+`withComponent: true` - will generate type-safe data components.
+
+`withHOC: true` - will generate type-safe High-Order-Components.
+
+
+
+---
+
+We believe **_GraphQL_** is a game changer in how you plan and create your frontend apps.
+
+The vision that guides us is that you should be able to sketch a list of data types your backend can
+provide, sketch components and their data dependencies — and all the rest of the plumbing can be
+generated for you.
+
+Once you'll write an app like that, you will ask yourself why did you write all the other
+boilerplate code by yourself before.
+
+This is just one template out of many, check out more things you can generate with the
+[GraphQL Code Generator](https://graphql-code-generator.com) and give us ideas about other templates
+you would like to see implemented.
diff --git a/packages/web/docs/src/app/blog/(posts)/collecting-graphql-live-query-resource-identifier-with-graphql-tools/cover.jpg b/packages/web/docs/src/app/blog/(posts)/collecting-graphql-live-query-resource-identifier-with-graphql-tools/cover.jpg
new file mode 100644
index 00000000000..0766eea382d
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/collecting-graphql-live-query-resource-identifier-with-graphql-tools/cover.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/collecting-graphql-live-query-resource-identifier-with-graphql-tools/page.mdx b/packages/web/docs/src/app/blog/(posts)/collecting-graphql-live-query-resource-identifier-with-graphql-tools/page.mdx
new file mode 100644
index 00000000000..b6df63775df
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/collecting-graphql-live-query-resource-identifier-with-graphql-tools/page.mdx
@@ -0,0 +1,364 @@
+---
+title: Collecting GraphQL Live Query Resource Identifier with GraphQL Tools
+tags: [graphql, graphql-tools, real-time, live-query]
+authors: laurin
+date: 2021-07-01
+description:
+ GraphQL Tools can help to solve a variety of problems. Lean how it can be used for live queries.
+---
+
+import { Callout } from '@theguild/components'
+
+Photo by [Łukasz Nieścioruk](https://unsplash.com/@luki90pl) on
+[Unsplash](https://unsplash.com/photos/BMVzvCYTlvU")
+
+
+ **Note:** This article showcases technical details for implementing a Live Query engine with
+ graphql-tools. If you are new to Live Queries you might want to check out [Subscriptions and Live
+ Queries - Real Time with GraphQL](/blog/subscriptions-and-live-queries-real-time-with-graphql)
+ first.
+
+
+GraphQL live queries can solve real-time updates in a more elegant way than GraphQL subscriptions.
+
+Instead of subscribing to events live queries primarily subscribe to data changes.
+
+Instead of updating the client store manually a live query updates the client store _magically_
+without redundant cache update logic on the client.
+
+[You can learn more about the differences here](https://medium.com/open-graphql/graphql-subscriptions-vs-live-queries-e38302c7ab8e).
+
+All those benefits, however, come with the drawback of the server having to become stateful, in
+particular, being aware of all the data the client operation consumes and re-executing those query
+operations for a specific client once the underlying data changes.
+
+As I first started experimenting with GraphQL live queries the easiest solution was to simply
+trigger live query re-executions based on the `Query` object type root fields. E.g. a query with a
+selection set selection on the `Query.viewer` field could be re-executed by emitting the
+`Query.viewer` event through the live query store event emitter. However, the viewer could be a
+completely different record/resource for each client that consumes the given query operation.
+
+To be more clear here is the corresponding schema:
+
+```graphql
+type User {
+ id: ID!
+ login: String!
+}
+
+type Query {
+ """
+ Returns the authenticated user. Returns null in case the user is not authenticated.
+ """
+ viewer: User
+ """
+ List of the users that are currently online.
+ """
+ onlineUsers: [User!]!
+}
+
+type Mutation {
+ updateLogin(newLogin: String!): Boolean!
+}
+```
+
+```graphql
+query viewer @live {
+ viewer {
+ id
+ login
+ }
+}
+```
+
+Let's see how the implementation for this could look like:
+
+```tsx
+const Query = {
+ viewer: (source, args, context) => {
+ return context.viewer
+ }
+}
+
+const Mutation = {
+ updateLogin: async (source, args, context) => {
+ await context.db.updateUser(context.viewer.id, args.newLogin)
+
+ context.liveQueryStore.triggerUpdate(`Query.viewer`)
+ return true
+ }
+}
+```
+
+If a specific user updates his login we shouldn't invalidate and re-execute any live query operation
+that has a viewer selection set for any connected user who might not even be affected by that
+change!
+
+
+
+At the same time, the user could also be referenced in another operation e.g. a list of all
+available users (`Query.onlineUsers`). The `Query.viewer` event would not cover and schedule a
+re-execution for operations that select the user via that field.
+
+## There Must Be a Better Solution for Uniquely Identifying the Selection Set Data
+
+As you probably noticed the user has an `id` field of the `ID!` (nonnull id) type. This is a
+commonly used field for uniquely identifying a resource on the client-side. Apollo-client uses the
+`__typename` field in combination with the `id` field as the default resource cache key (`User:1`),
+Relay goes a step further and already assumes that the resource type is already encoded (e.g.
+`base64("User:1")` Note:
+[You are not forced to use base64 🤔](https://dev.to/daniel15/comment/np0o)) inside the id and
+therefore only uses the id field.
+
+What if we could also use such an identifier on the server-side in our live query store
+implementation?
+
+My current implementation just traversed the AST of the query operation and extracted the
+[schema coordinates](https://github.com/graphql/graphql-spec/pull/746) on the root query type. E.g.
+`Query.viewer` for the `viewer` live query operation from above.
+
+
+
+However, in case we would want to identify the user via the id we must also add something like
+`User:1` to the set of resources the live query operation selects. This requires schema knowledge as
+the live query store needs to know which type has an id field and if included in the selection set,
+gather the corresponding resource identifier.
+
+
+
+As mentioned above this allows more granular query invalidations.
+
+
+
+The first drawback I had in mind is that if an operation does not specify the `id` field on the
+selection set, the resource cannot be tracked by the live query store.
+
+However, most operations will probably select the `id` field as it is most likely used on the client
+for the cache keys.
+
+Furthermore, it could be possible to simply transform the query in such a way that the `id` field is
+added to the selection set (similar to how apollo-client is by default adding a `__typename`
+selection to each object type).
+
+For keeping things simple I decided to push the responsibility for selecting the id field to the
+client that sends the live query operation. I also could not find a use-case in my existing
+application where there was no `id` selection for a resource 👍.
+
+## Implementing the Resource Identifier Collector
+
+The next obstacle is to decide how the ids are extracted and I had two options in mind.
+
+### 1. Traversing the GraphQL Execution Result Tree
+
+This simply seemed complicated to me as I would need to traverse the whole result while somehow
+guessing/checking the type of each leaf based on the operation AST and the schema. I quickly dropped
+that idea.
+
+### 2. Manually Register the Resource Identifier by Calling a Function That Is Injected via the Context
+
+The goal of my live query store implementation is to add live query support to any schema with
+minimal effort. Passing something along-side the context that a library user must call inside a
+query resolver seemed wrong and all this should be an implementation detail the library user should
+not care about.
+
+Imagine if we had to register a resource manually in each resolver that returns an object type.
+
+```tsx
+const Query = {
+ viewer: (source, args, context) => {
+ const viewer = context.viewer
+ context.registerResource(`User:${viewer.id}`)
+ return viewer
+ }
+}
+```
+
+It might seem quite simple for a single resolver, however, it can quickly clutter and lead to bugs
+if we have to manually do that for any resource in any resolver.
+
+Ideally a library user will just have to add a `context.liveQueryStore.triggerUpdate("User:1")` line
+to the `updateLogin` mutation field resolver in order to _magically_ schedule an operation
+re-execution, without the overhead of adding an additional function call to each resolver.
+
+```tsx
+const Query = {
+ viewer: (source, args, context) => {
+ // No tracking registration code here.
+ return context.viewer
+ }
+}
+
+const Mutation = {
+ updateLogin: async (source, args, context) => {
+ await context.db.updateUser(context.viewer.id, args.newLogin)
+
+ context.liveQueryStore.triggerUpdate(`User:${context.viewer.id}`)
+ return true
+ }
+}
+```
+
+So, I thought more about how this could be implemented in a less verbose way.
+
+As any other field, the `id` field has a resolver (either the default resolver provided by GraphQL
+or a user-defined resolver), so if there was a way to wrap each `id` field resolver with a function
+that could solve the issue. The wrapper could call the actual resolver, register the resource, and
+then return the value. The user won't have to care about anything (besides adding the `id` field to
+the selection set of the query).
+
+The best library for transforming and modifying GraphQL Schemas is
+[`graphql-tools`](https://github.com/ardatan/graphql-tools). Fortunately, it is now maintained by
+The Guild, as apollo abandoned it and was maintained pretty poorly.
+
+So I dug a bit into the fancy documentation and found `@graphql-tools/wrap`.
+
+A quick excerpt from the documentation:
+
+> Schema wrapping is a method of making modified copies of GraphQLSchema objects, without changing
+> the original schema implementation.
+
+Looks perfect, but since in this specific case I could potentially modify/map an existing schema, I
+digged a bit further, chatted with [@yaacovCR](https://github.com/yaacovCR) and learned about
+`mapSchema` from `@graphql-tools/utils`. It maps an existing schema into a new schema while applying
+some rules (kind of similar how `Array.map()` works 🤔).
+
+Using `mapSchema` might be slightly faster as there will be no delegation to a second schema.
+
+So the final plan is the following: We map the existing schema and warp the resolver fields append
+the resource identifiers to a Set.
+
+```ts
+import {
+ defaultFieldResolver,
+ execute,
+ GraphQLOutputType,
+ GraphQLScalarType,
+ GraphQLSchema,
+ isNonNullType,
+ isScalarType
+} from 'graphql'
+import { MapperKind, mapSchema } from '@graphql-tools/utils'
+
+const ORIGINAL_CONTEXT_SYMBOL = Symbol('ORIGINAL_CONTEXT_SYMBOL')
+
+const isNonNullIDScalarType = (type: GraphQLOutputType): type is GraphQLScalarType => {
+ if (isNonNullType(type)) {
+ return isScalarType(type.ofType) && type.ofType.name === 'ID'
+ }
+ return false
+}
+
+// invokes the callback with the resolved or sync input. Handy when you don't know whether the input is a Promise or the actual value you want.
+export const runWith = (input: T | Promise, callback: (value: T) => void) => {
+ if (input instanceof Promise) {
+ input.then(callback, () => undefined)
+ } else {
+ callback(input)
+ }
+}
+
+const addResourceIdentifierCollectorToSchema = (
+ schema: GraphQLSchema,
+ idFieldName: string
+): GraphQLSchema =>
+ mapSchema(schema, {
+ [MapperKind.OBJECT_FIELD]: (fieldConfig, fieldName, typename) => {
+ const newFieldConfig = { ...fieldConfig }
+
+ let isIDField = fieldName === idFieldName && isNonNullIDScalarType(fieldConfig.type)
+ let resolve = fieldConfig.resolve ?? defaultFieldResolver
+
+ newFieldConfig.resolve = (src, args, context, info) => {
+ if (!context || ORIGINAL_CONTEXT_SYMBOL in context === false) {
+ return resolve(src, args, context, info)
+ }
+
+ const collectResourceIdentifier: ResourceIdentifierCollectorFunction =
+ context.collectResourceIdentifier
+ context = context[ORIGINAL_CONTEXT_SYMBOL]
+ const result = resolve(src, args, context, info)
+
+ if (isIDField) {
+ runWith(result, (id: string) => collectResourceIdentifier({ typename, id }))
+ }
+ return result
+ }
+
+ return newFieldConfig
+ }
+ })
+```
+
+The implementation for executing the operation is similar to the following:
+
+```ts
+const newIdentifier = new Set(rootFieldIdentifier)
+const collectResourceIdentifier: ResourceGatherFunction = ({ typename, id }) =>
+ // for a relay spec conform server the typename could even be omitted :)
+ newIdentifier.add(`${typename}:${id}`)
+
+// You definitely wanna cache the wrapped schema as you don't want to re-create it for each operation :)
+const wrappedSchema = addResourceIdentifierCollectorToSchema(schema)
+
+const result = execute({
+ schema: wrappedSchema,
+ document: operationDocument,
+ operationName,
+ rootValue,
+ contextValue: {
+ [ORIGINAL_CONTEXT_SYMBOL]: contextValue,
+ collectResourceIdentifier
+ },
+ variableValues: operationVariables
+})
+```
+
+I had to wrap the "user" context in a context (context-ception 🤯) on which I also attached the
+function for adding the resource identifier to the resource identifier set. I got inspired for this
+by the apollo-server source code, as I knew it has a way for measuring resolver execution time,
+which must be done on a request/operation basis similar to the resource identifier collection. This
+method allows using a new function/context for each execution. Inside the field resolver, the
+correct user context is then passed into the actual (user) field resolver.
+
+Now after the operation has been executed against the schema the `newIdentifier` Set should contain
+the identifiers of all the resources that were resolved during the operation execution.
+
+The live query store can now use that information for re-executing queries once a resource
+identifier event is emitted 👌.
+
+## Conclusion
+
+Identifying resources and invalidating queries based on a resource basis rather than a query root
+field basis allows more efficient query re-executions and can avoid pushing unnecessary updates to
+clients.
+
+GraphQL Tools is a super handy library that can be used for solving a huge variety of problems. I am
+glad it got such a huge update and good documentation!
+
+The implementation probably won't cover all use-cases. What if a client is not authenticated and the
+`Query.viewer` resolver returns `null`. There is no `User:ID` string available on the live query
+store operation context once the user has authenticated. Either a `Query.viewer` update must be
+emitted through the live query store emitter (which will affect ANY client operation that selects
+the `viewer`), the client must re-execute the operation after login or the live query store must
+somehow be notified to re-execute all operations of the user that just authenticated.
+
+In case you are interested in the source code for the implementation
+[check it out on GitHub](https://github.com/n1ru4l/graphql-live-query/blob/7674745b441201448feb7043290bd2ac7dbdd11c/packages/in-memory-live-query-store/src/InMemoryLiveQueryStore.ts#L44-L87)
+
+**There is still more to discover and build in live query land!**
+
+We still need to manually notify the live query store that a resource must be invalidated. An
+abstraction for doing this behind the scenes could vastly differ for different stacks.
+
+Maybe the ORM/database store layer could emit the events or a proxy could emit those events based on
+database operations such as `INSERT`, `DELETE`, and `UPDATE`.
+
+Re-executing a query operation is nice and smart, but not the most efficient solution. What if we
+could only re-execute certain resolvers? I already have some ideas in mind, and I will probably
+write about that as well!
+
+[Check out this super cool talk about live queries @ Facebook!](https://youtube.com/watch?v=BSw05rJaCpA)
+
+[Check out this super cool talk about live queries @ Samsara!](https://youtube.com/watch?v=g-asVW9JFPw)
+
+[I also wrote an article about my Socket.io GraphQL Server Engine implementation!](https://dev.to/n1ru4l/graphql-live-queries-with-socket-io-4mh6)
diff --git a/packages/web/docs/src/app/blog/(posts)/coolest-underrated-design-pattern-in-react/8da637649866c3f3ebcc4e5c90437d89.png b/packages/web/docs/src/app/blog/(posts)/coolest-underrated-design-pattern-in-react/8da637649866c3f3ebcc4e5c90437d89.png
new file mode 100644
index 00000000000..361ea5584df
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/coolest-underrated-design-pattern-in-react/8da637649866c3f3ebcc4e5c90437d89.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/coolest-underrated-design-pattern-in-react/f8270eba98b7fce153579c2607ca2eb8.png b/packages/web/docs/src/app/blog/(posts)/coolest-underrated-design-pattern-in-react/f8270eba98b7fce153579c2607ca2eb8.png
new file mode 100644
index 00000000000..907d3fe42f7
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/coolest-underrated-design-pattern-in-react/f8270eba98b7fce153579c2607ca2eb8.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/create-native-addon-using-c/6989c5ee48f37336c330100619adbe13.png b/packages/web/docs/src/app/blog/(posts)/create-native-addon-using-c/6989c5ee48f37336c330100619adbe13.png
new file mode 100644
index 00000000000..3e674f42d7c
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/create-native-addon-using-c/6989c5ee48f37336c330100619adbe13.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/create-native-addon-using-c/e2b532f4bd546a9c1bdb1cb2022fbd80.jpg b/packages/web/docs/src/app/blog/(posts)/create-native-addon-using-c/e2b532f4bd546a9c1bdb1cb2022fbd80.jpg
new file mode 100644
index 00000000000..146a194daf0
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/create-native-addon-using-c/e2b532f4bd546a9c1bdb1cb2022fbd80.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/2b3e4b1d4204649da2b520229d0a3b5d.png b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/2b3e4b1d4204649da2b520229d0a3b5d.png
new file mode 100644
index 00000000000..dcefd9e133f
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/2b3e4b1d4204649da2b520229d0a3b5d.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/33a00b9051bfb0894f2d6964afed0de9.png b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/33a00b9051bfb0894f2d6964afed0de9.png
new file mode 100644
index 00000000000..0e552e8c195
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/33a00b9051bfb0894f2d6964afed0de9.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/4d50875c67ddc3d9139635c8597a1ea1.png b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/4d50875c67ddc3d9139635c8597a1ea1.png
new file mode 100644
index 00000000000..963f72ee6a8
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/4d50875c67ddc3d9139635c8597a1ea1.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/7e4dac18ecbfa0f679d7d2c41134b75d.png b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/7e4dac18ecbfa0f679d7d2c41134b75d.png
new file mode 100644
index 00000000000..5b00aa25533
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/7e4dac18ecbfa0f679d7d2c41134b75d.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/9ecd4800956fc386f893c8730a0beb63.jpeg b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/9ecd4800956fc386f893c8730a0beb63.jpeg
new file mode 100644
index 00000000000..ef0fc783c6a
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/9ecd4800956fc386f893c8730a0beb63.jpeg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/b8088e43c6db651c5daa8ed96b65125a.png b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/b8088e43c6db651c5daa8ed96b65125a.png
new file mode 100644
index 00000000000..c1528f47c15
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/b8088e43c6db651c5daa8ed96b65125a.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/dee039857e0e507016a5fb742f50c814.png b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/dee039857e0e507016a5fb742f50c814.png
new file mode 100644
index 00000000000..ba7f7b6b0c9
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/customizable-css-engine-in-javascript/dee039857e0e507016a5fb742f50c814.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/defer-support-codegen/monitoring-view.png b/packages/web/docs/src/app/blog/(posts)/defer-support-codegen/monitoring-view.png
new file mode 100644
index 00000000000..c055d72f3df
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/defer-support-codegen/monitoring-view.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/defer-support-codegen/page.mdx b/packages/web/docs/src/app/blog/(posts)/defer-support-codegen/page.mdx
new file mode 100644
index 00000000000..9b3aae69177
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/defer-support-codegen/page.mdx
@@ -0,0 +1,260 @@
+---
+title: Using @defer Directive with GraphQL Code Generator
+authors: aleksandra
+tags: [graphql, graphql-federation, codegen]
+date: 2023-05-24
+description:
+ Learn how to boost GraphQL performance using the @defer directive and GraphQL Code Generator for
+ deferred fragment field resolution.
+---
+
+Optimization is crucial for the good performance of GraphQL applications, which can grow in
+complexity and size. The `@defer` directive in GraphQL is a feature that allows fragment fields to
+be resolved separately from the rest of the query. This can be useful when dealing with large
+queries or slow-to-resolve fields.
+
+And now, we have some exciting news to share: support for `@defer` is available in GraphQL Code
+Generator! 🥳
+
+You can start using GraphQL Code Generator to generate code for queries that include deferred
+fragments, and the generated code will automatically include support for the `@defer` directive.
+
+Let's take a closer look at how the directive works and how you can use it in your GraphQL
+applications.
+
+## How Does `@defer` Work?
+
+When a query includes a deferred fragment field, the server will return a partial response with the
+non-deferred fields first, followed by the remaining fields once they have been resolved.
+
+For example, consider the following query:
+
+```graphql
+query GetUser($id: ID!) {
+ user(id: $id) {
+ id
+ name
+ ...OrdersFragment @defer
+ }
+}
+
+fragment OrdersFragment on User {
+ orders {
+ id
+ total
+ }
+}
+```
+
+Let's say you have a query that fetches information about a user, but the `orders` field takes more
+time to resolve. You can use the `@defer` directive to first return a partial response with the `id`
+and `name` and then later return the `orders` field. This can improve the performance of your
+application by reducing the amount of time it takes to load initial data.
+
+## Using `@defer` with GraphQL Codegen
+
+Once you update the GraphQL Code Generator to the latest version and start using the `@defer`
+directive in your queries, the generated code will automatically include support for the directive.
+Below, we're going to see an example of usage.
+
+As the `@defer` directive
+[is now supported in Apollo](https://www.apollographql.com/docs/react/data/defer/), we're going
+explore how it works with Apollo Client. You need to use Apollo Client version 3.7.0 or higher for
+the defer support to work.
+
+_Note: you could also use the `@defer` directive with other GraphQL clients, such as
+[URQL](https://formidable.com/open-source/urql/docs/) — the example usage in Hive with URQL is
+described below._
+
+Here's an example `codegen.ts` config:
+
+```jsx
+// condegen.ts
+import { type CodegenConfig } from '@graphql-codegen/cli'
+
+const config: CodegenConfig = {
+ schema: '',
+ documents: ['src/**/*.tsx'],
+ generates: {
+ './gql/': {
+ preset: 'client'
+ }
+ },
+ hooks: { afterAllFileWrite: ['prettier --write'] }
+}
+
+export default config
+```
+
+Let's consider the same example with `user` and `orders`. Once you declare a fragment and a query in
+your application, you can run the codegen, and it will have the information about deferred fields.
+
+```jsx
+// src/index.tsx
+import { graphql } from './gql'
+
+const OrdersFragment = graphql(`
+ fragment OrdersFragment on User {
+ orders {
+ id
+ total
+ }
+ }
+`)
+
+const GetUserQuery = graphql(`
+ query GetUser($id: ID!) {
+ user(id: $id) {
+ id
+ name
+ ...OrdersFragment @defer
+ }
+ }
+`)
+```
+
+The generated type for `GetUserQuery` will have information that the fragment is _incremental,_
+meaning it may not be available right away.
+
+```tsx
+// gql/graphql.ts
+
+export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({
+ __typename?: 'Query'
+} & {
+ ' $fragmentRefs'?: { OrdersFragment: Incremental }
+})
+```
+
+Apart from generating code that includes support for the `@defer` directive, the Codegen also
+exports a utility function called `isFragmentReady`. This function can be used to determine whether
+the data for a deferred fragment field has been resolved or not. The `isFragmentReady` function
+takes three arguments: the query document, the fragment definition, and the data returned by the
+query. You can use it to conditionally render components based on whether the data for a deferred
+fragment is available, as shown in the example below:
+
+```jsx
+// index.tsx
+import { useQuery } from '@apollo/client';
+
+import { useFragment, graphql, FragmentType, isFragmentReady } from './gql';
+
+const OrdersFragment = graphql(`...`)
+
+const GetUserQuery = graphql(`...`);
+
+const OrdersList = (props: { data: FragmentType }) => {
+ const data = useFragment(OrdersFragment, props.data);
+ return (
+ // render orders list
+ )
+};
+
+function App() {
+ const { data } = useQuery(GetUserQuery);
+
+ return (
+
+ );
+}
+
+export default App;
+```
+
+With the above code, the `orders` field is rendered only if it's available in the data object.
+
+### Example with GraphQL Yoga and Apollo Client
+
+If you want to see the `@defer` directive in action, you can check out
+[the example in the GraphQL Code Generator repository](https://github.com/dotansimha/graphql-code-generator/tree/master/examples/react/apollo-client-defer).
+
+### How Does It Compare with Relay?
+
+Relay allows for incremental delivery of data from the server to the client without an extra logic
+on the client because it uses Suspense. It enables the client to render parts of the UI as soon as
+the corresponding data is available.
+
+The same can be achieved in other GraphQL clients with the `@defer` directive and the
+`isFragmentReady` utility function.
+
+As the Suspense usage requires deep integration with a GraphQL client code, the GraphQL Code
+Generator does not support it out-of-the-box. We are looking forward to collaborate with the
+maintainers of clients like Apollo Client and Urql, and go for a more generic suspense-backed
+implementation in the future.
+
+## Example Usage in GraphQL Hive
+
+To evaluate the codegen support for the `@defer` directive, we integrated it into the GraphQL Hive
+application. GraphQL Hive is a schema registry for GraphQL.
+
+> With Hive you manage and collaborate on all your GraphQL schemas and GraphQL workflows, regardless
+> of the underlying strategy, engine or framework you're using: this includes Schema Stitching
+> (opens in a new tab), [Apollo Federation](https://the-guild.dev/graphql/hive/federation), or just
+> a traditional monolith approach.
+
+The Hive application uses [URQL](https://formidable.com/open-source/urql/docs/) as its GraphQL
+client, which supports the `@defer` directive starting from version 4.0.0.
+
+In Hive, the operations page displays all server-executed operations, providing valuable insights
+into operation performance, end-user consumption, and operation success rates.
+
+
+
+Given the substantial amount of data to be loaded, we decided to apply the `@defer` directive to the
+operation stats query fragments:
+
+```graphql
+query generalOperationsStats($selector: OperationsStatsSelectorInput!, $resolution: Int!) {
+ operationsStats(selector: $selector) {
+ ... on OperationsStats {
+ # ...
+ }
+ ... on OperationsStats @defer {
+ failuresOverTime(resolution: $resolution) {
+ # ...
+ }
+ requestsOverTime(resolution: $resolution) {
+ # ...
+ }
+ durationOverTime(resolution: $resolution) {
+ # ...
+ }
+ }
+ ... on OperationsStats @defer {
+ clients {
+ # ...
+ }
+ }
+ }
+}
+```
+
+You can check out [a PR to Hive](https://github.com/kamilkisiela/graphql-hive/pull/2082) that adds
+`@defer` in the operations page.
+
+Throughout the process, we collaborated a bit with the URQL team to enhance URQL's `graphcache`
+exchange, resulting in improved support for the `@defer` directive in the new version. You can check
+out the relevant PRs:
+
+- [Mark deferred, uncached results as partial](https://github.com/urql-graphql/urql/pull/3163)
+- [Fix defer field state becoming sticky and affecting future fields](https://github.com/urql-graphql/urql/pull/3167)
+- [Handle both variations of multipart/mixed preamble](https://github.com/urql-graphql/urql/pull/3172)
+
+---
+
+To summarize, the `@defer` directive in GraphQL is a feature that allows fragment fields in a query
+to be resolved separately from the rest of the query. With support for `@defer` now available in
+GraphQL Code Generator, you can easily add deferred resolution to your GraphQL applications and
+optimize their performance. We hope that this new feature will help you build even more powerful and
+performant GraphQL apps!
+
+Let us know your thoughts. We'd love your feedback!
diff --git a/packages/web/docs/src/app/blog/(posts)/dependency-injection-library-in-graphql-modules/page.mdx b/packages/web/docs/src/app/blog/(posts)/dependency-injection-library-in-graphql-modules/page.mdx
new file mode 100644
index 00000000000..7757f2215e6
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/dependency-injection-library-in-graphql-modules/page.mdx
@@ -0,0 +1,279 @@
+---
+title: Dependency Injection in GraphQL-Modules
+authors: arda
+tags: [DI, graphql, graphql-modules]
+date: 2019-01-11
+description: Why did we implement our own Dependency Injection library for GraphQL-Modules?
+---
+
+## Why Not Inversify / Angular / NestJS?
+
+When designing GraphQL Modules, we tried different approaches to encapsulate modules safely. We
+created a solution where you won't need to use Dependency Injection when you start, but after you
+are getting to a certain scale, you can make use of our separate DI library to ease the separation
+and make the boundaries stricter, only at the point when it really makes sense and helps you. When
+you get to that point, DI helps you mostly for ease of mocking providers for testing and
+encapsulation for less error-prone implementation.
+
+In the early stages of GraphQL-Modules, it used to have
+[Inversify](https://github.com/inversify/InversifyJS) internally for Dependency Injection in
+GraphQL-Modules. Inversify is a platform-agnostic Dependency Injection library written in
+JavaScript. Unfortunately, **_Inversify_** didn't fit our needs for modular DI (Dependency
+Injection) due to some critical reasons that we'll expand on this article.
+
+That's why, we implemented our own platform-agnostic Dependency Injection library called
+`@graphql-modules/di` which is independent from `@graphql-modules/core`, and it can be used by
+itself.
+
+It supports factory, class and value providers that can have `Symbol`, `string`, `number`,
+`function` and `object` tokens in a `provide` definition, and it can address constructable classes,
+factory functions and constant values as injected values. It has some features that are similar to
+[Angular's Dependency Injection](https://angular.io/guide/dependency-injection) that is mentioned in
+their documentation. In this article we'll explain the similarities and differences between those
+solutions.
+
+**Let's start with the principles we wanted to have in our DI logic, and we will finish with the
+comparisons with Angular and NestJS.**
+
+## Encapsulation
+
+While we were still using **_Inversify_**, we used to have a single `GraphQLApp` top module. Regular
+GraphQL Modules cannot import each other, but can be imported by that `GraphQLApp` object. Also
+these modules didn't have an **_encapsulation_**, because all the **_providers_**, **_schemas_** and
+**_resolvers_** were getting concatenated without any **_encapsulation_**. After that, we decided to
+provide complete Modular approach, and make everything module. Now Each module has its own injector,
+valid schema and context which is independent from its parent modules. Also, each module is
+constructed by using the imported modules' DI containers, schema contents and context builders.
+
+{/* prettier-ignore */}
+If you want to know more about **_encapsulation_** see the
+
+blog post about it.
+
+For example, if you have a **_DatabaseModule_** in your application that has to be shared across the
+whole application, and it needs to take a custom provider that will be defined by the user. What you
+will do in those DI implementations is to create a provider by decorating it with a global scoped
+provider; then put it in **_ApplicationModule_**. However, this would **violate** the
+**encapsulation principle** of the modular approach.
+
+To summarize; while your **_DatabaseModule_** is imported by other modules in the lower level and
+that module will use a provider in its parent. It mustn't know what imports it.
+
+We handle this in a different way in GraphQL Modules by passing configuration by obeying the
+encapsulation rule;
+
+```typescript
+const AppModule = new GraphQLModule({
+ imports: ({ config: { connectionStuff }}) => { // getting the configuration in schema and DI container generation phase
+ DatabaseModule.forRoot({ // Define this configured module as the default instance inside AppModule
+ connectionStuff
+ }),
+ OtherModuleThatUsesDB,
+ },
+ configRequired: true, // makes schema and DI container prevent to be requested without a valid configuration
+})
+
+const DatabaseModule = new GraphQLModule({
+ providers: [SomeDbProvider],
+ configRequired: true, // makes this module prevent to be used without a valid configuration in any part of the application
+});
+
+@Injectable()
+export class SomeDbProvider {
+ constructor(@ModuleConfig() config) { // get configuration into the provider
+ // some logic with the configuration
+ }
+}
+
+const OtherModuleThatUsesDB = new GraphQLModule({
+ imports: [
+ DatabaseModule.forChild() // Use the configured DatabaseModule in the higher level, prevent this module to be imported without unconfigured DatabaseModule
+ ]
+})
+```
+
+The three benefits we have with this type of DI and modular system;
+
+- _AppModule_ is protected from an unsafe call without a valid configuration that is needed in the
+ internal process (_DatabaseModule_); thanks to `configRequired` .
+- _DatabaseModule_ is protected from an unsafe import without a valid configuration that is needed
+ in the internal process (_SomeDbProvider_); thanks to `configRequired` again!
+- _OtherModuleThatUsesDb_ is protected from an unsafe call or import without a definition of a
+ well-configured _DatabaseModule._
+
+## Hierarchy
+
+We also have another problem about the hierarchical approach of existing DI implementations. Let me
+give an example;
+
+- **_A DI Container_** has **_FooProvider_**
+- **_B DI Container_** has **_BarProvider_**
+- **_C DI Container_** has **_BazProvider_**
+- **_D DI Container_** has **_QuxProvider_**
+- **A** imports **B**
+- **B** imports **D**
+- **B** imports **C**
+
+For example the following case will happen in our DI;
+
+- **_FooProvider_** cannot be injected inside **_B_** while **_BarProvider_** can be injected by
+ **A**; because the injector of **_B_** only have its providers and **_D_**'s and **C**'s
+ (**_BazProvider_** and **_QuxProvider_**).
+
+As you can see in the comparison with **_Inversify_**, **_Inversify_** can attach only one child DI
+container in a parent DI container; and this wouldn't fit our hierarchy-based modular approach. For
+example, you cannot make **B extend** both **D** and **C** by keeping **D** and **C** encapsulated.
+If you merge all of them into the one injector like Angular does, **D** can access **C**'s providers
+without importing **C**.
+
+## Scoped Providers
+
+In contrast with client side application, your DI system wouldn't need to have different scopes like
+Application Scope and Session Scope. In our implementation, we can define providers that have a
+lifetime during a single GraphQL Network Request and not the whole the application runtime; because
+some providers needs to belong in a single client. Unfortunately, you need to find tricky ways to
+manage scoped providers if you use existing DI libraries like **_Inversify_**.
+
+> In server-side applications, every client request has its own scope that we call \`**session
+> scope\`**. We think this session scope should be able to have its own providers and DI logic
+> outside the application scope.
+
+You can read more about the different scopes that we have in GraphQL Modules in the blog post
+{/* prettier-ignore */} about Scoped Providers.
+
+## Comparisons with Other DI Implementations of Frameworks
+
+### Comparison with Inversify
+
+To provide _true encapsulation_; we should have an **_injector/container_** with multiple children,
+and these children must not know each other and even its parent. In **_Inversify_**, they have
+something like that which is called **_Hierarchical_** **_DI_**. In this feature of **_Inversify_**,
+the`parent` term can be misunderstood. because an injector seeks for its own providers then looks
+for the other injector that is being defined as `parent` in that feature. But, we need is more than
+that. We want to have multiple `parent` according to their logic.
+
+> Every module has its own injector together with its children's injectors. So, every module can
+> interact with its children's providers with its own injector.
+
+You can read more about _Hierarchy_ and _Encapsulation_ in the beginning of this article.
+
+### Comparison with Angular's DI
+
+In Angular, there is one injector that is shared across all the application while there are
+different encapsulated injectors belonging to each module in different scope.
+
+> Our Dependency Injection implementation is more strict in terms of encapsulation than Angular's.
+
+```typescript
+import { NgModule } from '@angular/core'
+import { BarModule } from '@bar'
+import { FooModule, FooProvider } from '@foo'
+
+@NgModule({
+ imports: [FooModule, BarModule],
+ providers: [
+ {
+ provide: FooProvider,
+ useClass: MyFooProvider
+ }
+ ]
+})
+export class AppModule {}
+```
+
+This is an example top module written in Angular. Let's assume `FooProvider` originally implemented
+and defined inside `FooModule` and used by `BarModule` . When `FooProvider` token is replaced by
+`MyFooProvider` in `AppModule` scope, `BarModule` also uses our `MyFooProvider` inside its logic.
+This explicitly violates encapsulation in the modular approach, because Angular is supposed to send
+to `BarModule` `FooModule` 's `FooProvider` implementation instead of the one defined outside of
+`BarModule` ; because it shouldn't know what is defined in the higher level.
+
+```typescript
+import { BarModule } from '@bar'
+import { FooModule, FooProvider } from '@foo'
+import { GraphQLModule } from '@graphql-modules/core'
+
+export const AppModule = new GraphQLModule({
+ imports: [FooModule, BarModule],
+ providers: [
+ {
+ provide: FooProvider,
+ useClass: MyFooProvider
+ }
+ ]
+})
+```
+
+However, GraphQL-Modules will send to `BarModule` the correct `FooProvider` , because `BarModule`
+imports `FooModule` not `AppModule` . So, `MyFooProvider` will be sent if the current injector is
+inside `AppModule` scope.
+
+In GraphQL-Modules, if A imports B and B imports C, A can access C's scope. But, C cannot access the
+scopes of B and A. This allows us to create a safely built GraphQL Application and reduces the error
+prone. You can read more about _Hierarchy_ and _Encapsulation_ in the beginning of this article.
+
+Angular doesn't care about that. it has a single injector for the all application. This may cause
+some problems for debugging on a large scale backend application.
+
+> That ability is not so important for Angular applications; because they are running on the
+> browser, not on the server. But still you can notice the similar behavior to GraphQL-Modules DI's
+> if you load an Angular module lazily using router's `loadChildren` property.
+
+And Angular's DI library doesn't differentiate _Application and Session scopes_ because it doesn't
+need that. An Angular application has a lifetime until `window` is terminated by closing it or
+refreshing page; the session and application runtime can be considered same in the client
+application. That's why, our DI implementation is more complex than Angular's as it need to handle
+multiple clients by running a single application. You can read more about
+[_Scoped Providers_](/blog/graphql-modules-scoped-providers) in the beginning of this article
+
+### Comparison with NestJS' DI Implementation
+
+NestJS is a server-side model-view-controller full-fledged framework that has all the principles of
+MVC Backend framework. exposing a GraphQL API is only one of its various features. Our goal with
+GraphQL Modules was to create a set of tools and libraries that answer needs for the GraphQL
+ecosystem, and can be (and should be) used by NestJS users as well.
+
+> The principles and approaches we're trying to apply in GraphQL Modules is not only for Dependency
+> Injection but also for GraphQL Schemas and Context.
+
+In comparison to Nest's goals, GraphQL-Modules is a platform-agnostic library that can be used even
+with the plain `graphqljs` package **without a server**; because it was designed to work exactly
+same in all GraphQL Server platforms such as Apollo, Yoga, graphql-express etc. For example, you can
+**use _Apollo_'s data sources with graphql-express**; because GraphQL Modules **passes its own cache
+mechanism into the dataloaders thanks to our independent DI logic**.
+
+> The result of a GraphQLModule is a context builder and a schema while NestJS' GraphQLModule is a
+> NestJS module that exposes an API using Apollo.
+
+NestJS has its own dependency injection system which is similar to Angular's but **more strict**;
+you can define both global (not by default like Angular) and encapsulated providers at the same
+time. We preferred not to have global providers like Angular (you can see how it works above in the
+Angular comparison); because we consider it can be more **error-prone**, and it has to be done by
+**passing configuration**. You can read more with an example about passing configuration and keeping
+safe boundaries between your modules in the
+[_Encapsulation_](/blog/modular-encapsulation-graphql-modules) article.
+
+Also, NestJS DI system doesn't share the important feature of defining providers that have the
+life-time of the client request (we call it **session scope**). We think a backend system would need
+to differentiate DI containers according to these different scopes. You can read more about it in
+[_Scoped Providers_](/blog/graphql-modules-scoped-providers) part of this article above.
+
+## Working Together
+
+We wanted to share the principles behind our implementation in order to get more background to our
+community and get feedback from other library authors.
+
+That is also one of the reasons we created our DI library as a separate library, not only so it
+would be optional to our users, but also to potentially share that implementation with other
+libraries like NestJS and Inversify for example.
+
+## All Posts about GraphQL Modules
+
+- [GraphQL Modules — Feature based GraphQL Modules at scale](/blog/graphql-modules)
+- [Why is True Modular Encapsulation So Important in Large-Scale GraphQL Projects?](/blog/modular-encapsulation-graphql-modules)
+- [Why did we implement our own Dependency Injection library for GraphQL-Modules?](/blog/dependency-injection-library-in-graphql-modules)
+- [Scoped Providers in GraphQL-Modules Dependency Injection](/blog/graphql-modules-scoped-providers)
+- [Writing a GraphQL TypeScript project w/ GraphQL-Modules and GraphQL-Code-Generator](/blog/graphql-typescript-modules-codegen)
+- [Authentication and Authorization in GraphQL (and how GraphQL-Modules can help)](/blog/graphql-modules-auth)
+- [Authentication with AccountsJS & GraphQL Modules](/blog/accountsjs-graphql-modules)
+- [Manage Circular Imports Hell with GraphQL-Modules](/blog/manage-circular-imports-hell-in-graphql-modules)
diff --git a/packages/web/docs/src/app/blog/(posts)/extending-your-graphql-service/distributed-graph.png b/packages/web/docs/src/app/blog/(posts)/extending-your-graphql-service/distributed-graph.png
new file mode 100644
index 00000000000..56563b0053a
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/extending-your-graphql-service/distributed-graph.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/extending-your-graphql-service/page.mdx b/packages/web/docs/src/app/blog/(posts)/extending-your-graphql-service/page.mdx
new file mode 100644
index 00000000000..be13664b43b
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/extending-your-graphql-service/page.mdx
@@ -0,0 +1,193 @@
+---
+title: 'Extending your GraphQL service: Federation or Schema Stitching'
+description:
+ A summary of information regarding extending your GraphQL service to use Federation or Schema
+ Stitching.
+date: 2024-11-18
+authors: egoodwinx
+tags: [graphql, graphql-tools, schema-stitching, graphql-federation]
+featured: true
+---
+
+If you're looking to extend your GraphQL service into separated services, you've likely come across
+two key terms: schema stitching and federation. Even if these concepts are new to you, don't
+worry—this post will introduce you to both approaches and help you understand their role in
+enhancing your GraphQL infrastructure.
+
+## What Is GraphQL?
+
+Let's start with a brief overview of GraphQL: it's a query language and runtime for APIs that work
+with your existing data. GraphQL delivers precisely the data you need—no more, no less—and allows
+APIs to evolve over time.
+
+However as GraphQL gained widespread adoption, many companies faced growing pains with their
+implementations. As their graphs grew, they began to face the challenges typical of monolithic
+systems. These large graphs blurred the lines between distinct business domains, which is where
+separating GraphQL services becomes beneficial.
+
+There are several reasons why you might want to split your GraphQL service into smaller, separate
+services:
+
+**Separate Business Domains**
+
+In most applications, data is already organized by business domains. For instance, the data and
+logic behind a `Users` service are distinct from that of an `Orders` service. Separating your
+GraphQL services allows you to maintain this natural separation, making it easier to manage,
+develop, and scale each domain individually.
+
+**Scaling Requirements**
+
+As your GraphQL service grows, maintaining a single, monolithic system can lead to complexity and
+performance issues. Different parts of the system may have varying scaling needs—for example,
+user-related queries might need to handle more traffic than order-related ones. Splitting services
+by domain allows each one to scale independently based on demand, improving both performance and
+resource efficiency.
+
+**Simpler Ownership and Maintenance**
+
+Having distinct GraphQL schemas and resolvers for different services enables parallel development by
+different teams. It also simplifies ownership and accountability, as each service can be managed and
+maintained independently. Smaller, focused services are easier to understand, test, and deploy,
+making long-term maintenance less burdensome compared to a single, complex monolith.
+
+## What Is the Solution?
+
+The solution may seem straightforward: separate the different domains and information into different
+schemas. But what happens when domains or information are related?
+
+This is where schema stitching or federation comes into play. These approaches allow definitions to
+relate data between different schemas.
+
+## [Schema Stitching](https://the-guild.dev/graphql/stitching/docs)
+
+Schema stitching takes many smaller services’ schemas and stitches them together to make a larger
+schema. This larger schema is used by a proxy service, the gateway, to delegate different parts of
+the query to different subschema services.
+
+
+
+There are three main approaches to schema stitching:
+
+#### [Schema Extension](https://the-guild.dev/graphql/stitching/docs/approaches/schema-extensions) (Gateway-Level Configuration)
+
+Schema extension uses schema delegation to take different subschemas and extend them at the gateway
+level.
+
+Say you had a type, `book` and a type `author` in different schemas and services. At the gateway
+level you can extend the type `book` with a new field `author` that delegates to the `author`
+service.
+
+#### [Type Merging](https://the-guild.dev/graphql/stitching/docs/approaches/type-merging) (Gateway-Level Configuration)
+
+Type merging allows for partial definitions of a type to exist in any subschema which are all merged
+into a unified type at the gateway.
+
+This is useful if you have different standalone GraphQL APIs and you need to configure those at the
+gateway level.
+
+Lets consider a situation where you needed a type `author` but had two different services. In the
+first service you would have the fields `id` and `name` . In the second service you would have the
+fields `id` and `description`. In the gateway it would merge the `author` type to contain all the
+fields `id`, `description`, and `name`. When you built a query it would go to the service that
+declared the type.
+
+#### [Stitching Directives](https://the-guild.dev/graphql/stitching/docs/approaches/stitching-directives) (Service Level Configuration)
+
+Similar to Federation, schema stitching allows for directives-based approach of schema stitching.
+This allows you to configure your merging at the service level versus the gateway level.
+
+In this example you would use the `@merge` directive and `@key` directive with a selectionSet to
+explain how to merge the schemas.
+
+## Federation
+
+Federation lets you use directives to combine multiple APIs into a single federated graph.
+
+When a user makes a request, it goes through the router. Based on the directives, the router
+orchestrates and distributes the request across the APIs and returns a unified response.
+
+This router needs a supergraph as a map to route to the different subgraphs, this supergraph can be
+created by paid applications like GraphOS or free services such as The Guild’s own
+[Hive](https://the-guild.dev/graphql/hive).
+
+Federation introduces the concept of Entities which are federated types that exist across multiple
+subgraphs.
+
+Here is a comparison of Federation-Compatible Gateway Implementations:
+
+https://the-guild.dev/graphql/hive/federation-gateway-audit
+
+For more information on Federation and The Guild's support, please see here:
+
+https://the-guild.dev/graphql/hive/federation
+
+## What Is the Overall Difference?
+
+Schema stitching merges multiple schemas into a single unified schema by directly combining them. In
+this setup, the gateway executes the requests by resolving data from multiple services, often
+relying on custom logic to determine how to fetch and combine the data from different schemas.
+
+Federation allows each subgraph to manage part of the unified schema independently. The central
+gateway composes these subgraphs into a unified graph, and relationships between services are
+handled through federation directives like `@key`, `@provides`, and `@extends`. The gateway uses
+these directives to predetermine how data is fetched and merged across services.
+
+This structure enables static checks, ensuring predictable behavior of the gateway in production. By
+using tools like Hive CLI or Apollo Studio to create the supergraph, you can validate the schema
+ahead of time, preventing conflicts before the supergraph is deployed. Additionally, these tools
+provide insight into how the gateway will execute queries, giving you confidence in its behavior
+after deployment.
+
+The Guild’s products are compatible with both Federation and Schema Stitching.
+
+## Which One Is Better for Your Use Case?
+
+This is a question only you can answer, but let’s look at common questions you should ask to
+determine which approach is better for your use case.
+
+| | Schema Stitching | Federation |
+| ------------------------------------------------------- | ---------------- | ---------- |
+| Customizability | More | Less |
+| Scalability | Less | More |
+| Collaboration | Less | More |
+| GraphQL Knowledge Required for subschema/graphlet teams | Less | More |
+| GraphQL Knowledge Required for Gateway team | More | Less |
+
+**What is the overall GraphQL knowledge for the teams involved?**
+
+Federation requires more over knowledge of GraphQL from all teams involved as they need to work
+together to make the federated schema work as expected. Schema Stitching requires less knowledge
+from subschema teams but more knowledge from the team owning the gateway as the stitching logic can
+become complex as the number of services grow.
+
+**What is your organizational structure?**
+
+If you have teams across organizations who need to collaborate, it may be better to use Apollo
+Federation as it supports more collaboration on the schema so teams need to work together and
+understand what each other is doing with their schema.
+
+If you want to minimize the need for teams to collaborate closely, schema stitching might be a good
+choice. With schema stitching, the gateway "magically" combines the services for the teams managing
+subschemas. The gateway handles most of the stitching process, so subschema teams don't need to
+worry about how their schemas are integrated.
+
+**How fast do you need to build your solution?**
+
+Schema Stitching is usually a faster approach for smaller or simpler projects since it is straight
+forward. You can combine schemas quickly without much additional infrastructure but it takes longer
+to develop as the overall service grows.
+
+Federation takes a bit longer to set up as it requires multiple subgraphs, a gateway, and a
+registry. As the services grow, Federation can speed up development for teams since each team
+independently manages their service.
+
+**How customizable does your implementation of the gateway need to be?**
+
+Schema stitching allows for a deeper customization of schemas, resolvers, and transformations since
+you have full control over how each service is combined.
+
+Federation is more suited for scalability and team collaboration. Customization is more structured
+through federation directives.
+
+If you would like to talk to an expert in regards to your GraphQL implementation, feel free to get
+in touch with The Guild [here](https://the-guild.dev/#get-in-touch).
diff --git a/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/cli-compatible.png b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/cli-compatible.png
new file mode 100644
index 00000000000..ad96927403e
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/cli-compatible.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/cli-not-compatible.png b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/cli-not-compatible.png
new file mode 100644
index 00000000000..5d127513b34
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/cli-not-compatible.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/page.mdx b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/page.mdx
new file mode 100644
index 00000000000..856c21260cb
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/page.mdx
@@ -0,0 +1,134 @@
+---
+title: Audit of GraphQL Gateways Supporting Apollo Federation
+tags: [graphql, graphql-federation]
+authors: kamil
+date: 2024-09-10
+description:
+ Set of tests to evaluate and compare the compatibility of different GraphQL gateways with Apollo
+ Federation.
+---
+
+import NextImage from 'next/image'
+
+The Apollo Federation spec is a hot topic, we must admit. The adoption of it keeps increasing,
+especially over past two years. There's a reason! It's a fantastic piece of technology, but also a
+complex piece of tech.
+
+> If you're curious about the results,
+> [visit the audit page](https://the-guild.dev/graphql/hive/federation-gateway-audit)
+
+## Complexity Is Not Obvious{/* eslint-disable-line mdx/remark */}
+
+**As a user** of Apollo Federation, you might not see the full spectrum of
+[Apollo Federation](https://the-guild.dev/graphql/hive/federation).
+
+When building subgraphs, you might occasionally encounter composition errors, but ultimately,
+everything works and you query data. The real complexity lies in tooling, starting with the
+composition library, and ending on the gateway and it's query planning.
+
+**As maintainers** of [Hive Gateway](https://the-guild.dev/graphql/hive/docs/gateway)
+([previously part of GraphQL Mesh](/blog/graphql-mesh-v1-hive-gateway-v1)) and creators of GraphQL
+Hive (our Schema Registry for GraphQL Federation), we've seen a wide range of supergraphs. Over the
+past few years, we've been working with companies adopting or already using Apollo Federation in
+production.
+
+We learned something, actually quite a lot!
+
+Today, we're even collaborating with creators of Apollo Federation and the
+[ChilliCream](https://chillicream.com/) teams (who built
+[GraphQL Fusion](https://chillicream.com/blog/2023/08/15/graphql-fusion/)) on
+[the new specification for federated GraphQL APIs](https://graphql.org/blog/2024-05-16-composite-schemas-announcement/),
+as proud members of GraphQL Foundation.
+
+We've seen Apollo Federation's complexity, we understood the rules of it very well, and we have
+something incredibly interesting to share!
+
+Before we get to that, let's first discuss what does it mean to "support Apollo Federation" on a
+gateway.
+
+## What Does "Apollo Federation Support" Really Mean?{/* eslint-disable-line mdx/remark */}
+
+As you know, the spec contains a lot of directives, and these can be used in various ways, resulting
+in **many** combinations. Sometimes weird at first glance, but when you really think about them,
+they make sense.
+
+In a lot of cases, the spec is abused, but hey… what's allowed, has to work!
+
+Most of the time you will see “Apollo Federation support” phrase or a list of supported directives,
+and this is fine, but it tells only a part of the story.
+
+If a gateway supports the `@key` directive, it may or may not support it on an Interface type, for
+example. You simply don't know until you try it!
+
+Did you know that in Apollo Federation v1, a field that is annotated with `@external`, that is also
+part of key fields, and is not defined anywhere else, is still resolvable?
+
+```graphql
+extend type Product @key(fields: "id name") @key(fields: "upc") {
+ id: ID @external
+ name: String @external
+ upc: String @external
+ price: Float!
+}
+```
+
+Not everyone knows that key fields of extension types in Federation v1, must be annotated with
+@external , and these are still resolvable by the subgraph. That's why we built the audit!
+
+
+
+> Here's how the auditing tool looks like. It's a simple CLI and we're going to release it on NPM
+> and as a binary soon. As of today, you need to clone the repository.
+
+## The Apollo Federation Audit!{/* eslint-disable-line mdx/remark */}
+
+As you know, The Guild has open source nature in its core. What we do we share, we open source, we
+give away for free. It was always like that, it won't ever change.
+
+Over the years we encountered a lot of aspects of Apollo Federation when working on query planning
+for Hive Gateway (previously GraphQL Mesh, just a reminder that it's not a new project, but rather
+well established).
+
+We spent quite a few months, writing down our knowledge about Apollo Federation, in form of 40
+supergraphs, covering wide range, if not all, of the spec.
+
+Each of those supergraphs, have a set of subgraphs running as real GraphQL APIs, with real runtime
+and real data.
+
+We have created 170 tests in total so far…
+
+All that effort to measure how compatible our gateway is with Apollo Federation... and now we give
+it away to everyone, even our “competitors”, for free, no strings attached!
+
+> We never had a tool to measure gateway's compatibility with Apollo Federation, but now we have one
+> — and we've put it to the test!
+
+
+
+Visit the audit page and see the results:
+[https://the-guild.dev/graphql/hive/federation-gateway-audit](https://the-guild.dev/graphql/hive/federation-gateway-audit)
+
+The main reason behind building such tool, was to improve our Hive Gateway, have a set of tests we
+can use for various of ways. We were also curious how well the rest of the GraphQL gateways perform,
+how compatible they are, how good their query planning understands Apollo Federation. The results
+are interesting.
+
+## About the Audit{/* eslint-disable-line mdx/remark */}
+
+The existing GraphQL Gateway benchmarks focus on performance, pure speed, query planning overhead
+and related factors. You only care about performance, if the gateway can query data correctly. Who
+wants a fast, but partially broken gateway? All the gateway implementors knows that, and they work
+hard to improve their gateway every day.
+
+We wanted to push the community forward, by giving them a chance to make a giant jump.
+
+That's why the auditing tool is fully open-source (MIT license), and available for everyone.
+
+Visit the repository:
+[https://github.com/the-guild-org/graphql-federation-gateway-audit](https://github.com/the-guild-org/graphql-federation-gateway-audit)
+
+We want to turn our effort into helping potential users of GraphQL gateways to better understand
+what Apollo Federation support means, but also the maintainers of those gateways to improve their
+score and learn from our experience.
+
+We aim to make it a shared effort, an "official" auditing tool for Apollo Federation gateways.
diff --git a/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/results.png b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/results.png
new file mode 100644
index 00000000000..f1266406efe
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/federation-gateway-audit/results.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/fetch-for-servers/page.mdx b/packages/web/docs/src/app/blog/(posts)/fetch-for-servers/page.mdx
new file mode 100644
index 00000000000..d59d6fe1680
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/fetch-for-servers/page.mdx
@@ -0,0 +1,285 @@
+---
+title: JavaScript runs everywhere, so should your servers - here is how
+tags: [fetch, whatwg, node, graphql, graphql-yoga]
+authors: arda
+date: 2022-08-22
+description: A new way to make any Javascript server platform-agnostic.
+---
+
+## TL;DR
+
+- We made GraphQL Yoga 2.0 **platform-agnostic**, so it is able to run anywhere JavaScript can run
+ (Cloudflare Workers, Deno, Next.js. AWS Lambdas etc.) thanks to the new **Fetch API standard**
+- We've created Ponyfills so it will work the same on older versions of Node that don't
+ have Fetch API elements globally available
+- We've made a [**new general library**](https://github.com/ardatan/whatwg-node) out of it so that
+ any other framework or app could achieve the same
+- Let's help other frameworks in the ecosystem to migrate to this new library and standard
+
+At the beginning of the year, [we launched GraphQL Yoga 2.0](/blog/announcing-graphql-yoga-v2) - a
+server framework for GraphQL APIs.
+
+While planning version 2.0 of Yoga, we were thinking about all the things that changed in the
+ecosystem and what developers using JavaScript **expect from their server** frameworks now and in
+the **future**.
+
+One of the most powerful trend in the JS ecosystem was the **proliferation of new environments and
+platforms** that can run JS (Lambdas, Cloudflare Workers, Deno, Bun etc.). So we set up to build a
+single GraphQL server framework that could run on any of these platforms.
+
+What we've found in the process was fascinating, and we believe would change how any JS HTTP
+frameworks are being built, without any relation to GraphQL
+
+While Node.js is the most popular environment, multiple platforms can run JavaScript, usually,
+having their own way of creating servers, and using different APIs.
+
+On the other hand, the JavaScript client-side has mostly migrated over the years to a common set of
+standards (`fetch`), independently of the underlying platform.
+
+This is where we realized that WHATWG Fetch API that uses
+[`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request),
+[`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response), and `ReadableStream` could
+also be used on the server side to provide a unified API to run JavaScript HTTP servers everywhere.
+
+## Why Fetch API Standard?
+
+When you send a request from the client, `fetch(...requestArgs)` uses
+[`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object under the hood that
+contains all the details (headers, method, etc.) and the data stream you need for that
+communication. Then you take the
+[`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) object that contains the
+connection stream, and process it as you want with `.json()`, `.arrayBuffer()`, `.formData()` or
+just access the stream itself by `.body()` as `ReadableStream`
+
+On the server side, you can take
+[`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object and process it with the
+same methods without dealing with the internals of your platform.
+
+Streaming responses like SSE uses `ReadableStream`, and for Multipart requests (e.g. file uploads)
+uses `FormData`, which is exactly the same forwarded from the browser or any other client using
+Fetch API.
+
+You can see how easy to handle file uploads;
+
+```ts
+const formData = await request.formData()
+const myFile = await formData.get('myFile')
+const fileContents = await myFile.text()
+```
+
+See more in our code;
+[https://github.com/dotansimha/graphql-yoga/blob/master/packages/common/src/plugins/requestParser/POSTMultipart.ts#L18](https://github.com/dotansimha/graphql-yoga/blob/master/packages/common/src/plugins/requestParser/POSTMultipart.ts#L18)
+
+Streaming responses like
+[Server Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)
+example:
+
+```ts
+let interval
+new Response(
+ new ReadableStream({
+ start() {
+ interval = setInterval(() => {
+ this.enqueue(`data: ${Date.now()}\n\n`)
+ }, 1000)
+ },
+ cancel() {
+ clearInterval(interval)
+ }
+ }),
+ {
+ headers: {
+ 'Content-Type': 'text/event-stream'
+ }
+ }
+)
+```
+
+See more in our code;
+[https://github.com/dotansimha/graphql-yoga/blob/master/packages/common/src/plugins/resultProcessor/push.ts#L42](https://github.com/dotansimha/graphql-yoga/blob/master/packages/common/src/plugins/resultProcessor/push.ts#L42)
+
+## What about Node.js?
+
+Even though many new platforms support the Fetch API Standard, which means we can have a single
+solution for all, currently, in the older LTS versions of Node.js, we don't have an implementation
+of the Fetch API built in.
+
+Furthermore, Node.js doesn't use Web standard streams and the Fetch API in its `http` and `https`
+modules.
+
+That's why we created the [`@whatwg-node/fetch` package](https://github.com/ardatan/whatwg-node)
+(previously known as `cross-undici-fetch` ) that fills in the gaps of different `fetch`
+implementations in all the LTS Node.js versions. Under the hood, `@whatwg-node/fetch` utilizes
+`undici` if available or otherwise falls back to using `node-fetch`, which you are probably already
+familiar with.
+
+> In case [`@whatwg-node/fetch`](https://github.com/ardatan/whatwg-node) is imported in an
+> environment that already has Fetch API built in like Cloudflare Workers, no ponyfills are added to
+> your built application bundle.
+
+#### Ponyfill vs Polyfill
+
+Polyfill patches the native parts of an environment while ponyfill just exports the “patched” stuff
+without touching the environment's internals. We prefer pony filling because it prevents us from
+breaking other libraries and environmental functionalities.
+
+## Is It Possible to Have a Library That Creates a Cross-Platform Server?
+
+When rebuilding GraphQL Yoga from scratch, cross-platform support was one of the most important
+features we wanted to implement. We wanted to create a GraphQL server library that can be integrated
+with different Node.js server frameworks and other JS environments like CF Workers and Deno with a
+few additional lines of code.
+
+After a few iterations, it was clear to us that this is certainly possible and finally shipped this
+as part of GraphQL Yoga v2.
+
+GraphQL Yoga instance itself can be used directly as a request listener that you pass to Express's
+`app.use`, Node's native `http.createServer`, Next.js functions and other non-Node.js environments;
+we just pass GraphQL Yoga as an event listener for CF Workers'
+`self.addEventListener('fetch', yoga)`.
+
+As we already mentioned in the “Why Fetch API?” part, the server library itself doesn't need to care
+about the platform's connection-specific details like Node's `IncomingMessage` and `ServerResponse`
+or Next.js's `NextApi.Request` objects. You are now able to focus on your server implementation
+details by consuming a “universal standard”
+[`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) and returning “another
+standard” [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
+
+As we realized how well this works out for our users, we decided that we need to bring this to the
+next level and extract that logic into a standalone library called
+[`@whatwg-node/server` ](https://github.com/ardatan/whatwg-node).
+
+You simply provide your request handler that has a single
+[`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) parameter and expects you to
+return a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) instance. The
+generated request handler instance can be integrated with regular Node HTTP servers, Fastify, Koa,
+Deno, CF Workers, Next.js, etc. with a few lines of code.
+
+{/* prettier-ignore */}
+```ts
+import { createServerAdapter } from '@whatwg-node/server'
+import { Request, Response } from '@whatwg-node/fetch'
+
+const myServer = createServerAdapter({
+ handle(request: Request) {
+ return new Response('Hello world', {
+ status: 200
+ })
+ }
+})
+
+// Node.js
+import { createServer } from 'http'
+
+const nodeServer = createServer(myServer)
+nodeServer.listen(4000)
+
+// CF Workers
+self.addEventListener('fetch', myServer)
+
+// Next.js
+export default myServer
+
+// Deno
+serve(myServer, { addr: ':4000' })
+```
+
+### How Does It Look in Real-Life Usage Today?
+
+You can check the GraphQL Yoga repository to see how we use this library;
+
+[https://github.com/dotansimha/graphql-yoga/blob/no-more-node/packages/graphql-yoga/src/server.ts#L628](https://github.com/dotansimha/graphql-yoga/blob/no-more-node/packages/graphql-yoga/src/server.ts#L628)
+
+And the simplicity of the integrations in our examples;
+
+[https://github.com/dotansimha/graphql-yoga/tree/no-more-node/examples](https://github.com/dotansimha/graphql-yoga/tree/no-more-node/examples)
+
+Finally, how small the code is when we want to process the request and the response objects;
+
+[https://github.com/dotansimha/graphql-yoga/tree/no-more-node/packages/graphql-yoga/src/plugins](https://github.com/dotansimha/graphql-yoga/tree/no-more-node/packages/graphql-yoga/src/plugins)
+
+> There is literally nothing platform-specific in GraphQL Yoga, and this allows us to focus on
+> creating a good GraphQL Server implementation for the entire GraphQL JS ecosystem.
+
+## Node.js Server Frameworks, Routers & Middlewares
+
+Node.js solved issues years before the web standards could. However, we think that many server-side
+ideas inspired by Node.js can now easily be managed with JavaScript with Fetch, Web Streams and
+other web standards in the JavaScript ecosystem.
+
+There are many mature libraries such as Fastify, Koa, Express, and Hapi that are implemented only
+for Node.js without using the Fetch API Standard. The experience with those libraries in the current
+era of Node.js taught us a lot about how the server can be designed but maybe it is time to reduce
+the environment-specific APIs in the JS ecosystem.
+
+The major reason for using a server framework is usually “Routing” then “Middlewares” so the
+question is “Why cannot we just have that with Fetch API?”
+
+You can basically achieve routing like below, however it looks a bit unsafe.
+
+```tsx
+createServerAdapter({
+ handle(request: Request) {
+ if (request.url.endsWith('/hello')) {
+ return new Response('{ "message": "hello" }', {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ })
+ }
+ if (request.url.endsWith('/secret')) {
+ return new Response('No way!', {
+ status: 401
+ })
+ }
+ return new Response('Nothing here!', {
+ status: 404
+ })
+ }
+})
+```
+
+There is another library called `itty-router` which can be used for Routing with Fetch API. You can
+see how simple it is to achieve “Routing” in a platform-independent way.
+
+{/* prettier-ignore */}
+```tsx
+import { Router } from 'itty-router'
+import { createServerAdapter } from '@whatwg-node/server'
+
+// now let's create a router (note the lack of "new")
+const router = Router()
+
+// GET collection index
+router.get('/todos', () => new Response('Todos Index!'))
+
+// GET item
+router.get('/todos/:id', ({ params }) => new Response(`Todo #${params.id}`))
+
+// POST to the collection (we'll use async here)
+router.post('/todos', async request => {
+ const content = await request.json()
+
+ return new Response('Creating Todo: ' + JSON.stringify(content))
+})
+
+// 404 for everything else
+router.all('*', () => new Response('Not Found.', { status: 404 }))
+
+// attach the router "handle" to our server adapter
+const myServer = createServerAdapter(router)
+
+// Then use it in any environment
+import { createServer } from 'http'
+
+const httpServer = createServer(myServer)
+httpServer.listen(4000)
+```
+
+## What Node.js Frameworks Are You Using Today?
+
+Maybe it is worthwhile to open a new issue on their repo and see if we could all help them to become
+platform-agnostic, while still supporting older versions of Node, thanks to this new library.
+
+Please try it out and give us feedback [on the repo](https://github.com/ardatan/whatwg-node)!
diff --git a/packages/web/docs/src/app/blog/(posts)/git-rebase-not-interactive/aaf7b6a36c30ab802f51d8ecb40478e9.png b/packages/web/docs/src/app/blog/(posts)/git-rebase-not-interactive/aaf7b6a36c30ab802f51d8ecb40478e9.png
new file mode 100644
index 00000000000..b130586322f
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/git-rebase-not-interactive/aaf7b6a36c30ab802f51d8ecb40478e9.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-as-a-best-practice-for-modern-angular-apps/discourse-api.png b/packages/web/docs/src/app/blog/(posts)/graphql-as-a-best-practice-for-modern-angular-apps/discourse-api.png
new file mode 100644
index 00000000000..dce1bdbd7f5
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-as-a-best-practice-for-modern-angular-apps/discourse-api.png differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-as-a-best-practice-for-modern-angular-apps/page.mdx b/packages/web/docs/src/app/blog/(posts)/graphql-as-a-best-practice-for-modern-angular-apps/page.mdx
new file mode 100644
index 00000000000..f099e2158d6
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/graphql-as-a-best-practice-for-modern-angular-apps/page.mdx
@@ -0,0 +1,118 @@
+---
+title: GraphQL as a best practice for modern Angular apps?
+authors: uri
+tags: [graphql, angular]
+date: 2016-07-28
+description:
+ In this post, I'll make the case for why Angular needs a best practice for communicating with the
+ server, and why GraphQL should be that best practice.
+---
+
+In this post, I'll make the case for why Angular needs a best practice for communicating with the
+server, and why GraphQL should be that best practice.
+
+## Best Practices
+
+The Angular community is establishing best practices so that we all can benefit from making our apps
+more performant, easier to maintain, and more modern.
+
+Some current best practices include composing everything into
+[Components](https://docs.angularjs.org/guide/component), using one-way data binding, lazy loading,
+having an immutable global state management (Redux & ng-rx), and more…
+
+That is all great, and means that if we will follow those best practices our apps will behave better
+and will look more modern…
+
+…until we get to data fetching from the server.
+
+## Data Fetching
+
+Today, whether we are developing in a large company, consulting, or writing our own app, when we
+fetch data from the server we are often left with old practices that don't address the needs of a
+modern app.
+
+Also, we are kind of powerless and unable to decide how the data will be supplied to our apps by the
+server, even though the way we fetch the data to our app is at least as meaningful to the way our
+app behaves as how we present it.
+
+**We should come up with best practices for data fetching that is more in line with the modern way
+we write our apps. These should take into consideration the following needs: data documentation,
+network latency, server side rendering and faster initial loading, real time communication patterns,
+latency compensation, and optimistic UI.**
+
+## REST
+
+REST is the current protocol we go around when we're talking about app data fetching. REST has its
+benefits, but it was evolved in a time when the web was very different from today, when everything
+was about static HTML and forms and not about apps.
+
+Here are the areas where REST is currently lacking:
+
+- **self documentation** — when you send a request to a REST endpoint, there is nothing in the
+ protocol that tells you what you are going to get (and not everyone has the resources to create a
+ nice, updated documentation like Twitter)
+
+- REST doesn't support **real time data** fetching
+
+- tough choices when designing your REST endpoint, which I'll elaborate on below
+
+**Over-fetching** — When one endpoint serves all the data, each Component calls it again and again.
+This means it serves more fields than the component needed _and_ we call it many times, creating
+more load on the server
+
+**Under-fetching** — When many endpoints serve multiple resources and fields. This creates many
+round trips for one Component as well as complex joins on the client.
+
+
+
+## Rethinking Data Fetching
+
+So it looks like we need to rethink data fetching, just like we rethought web apps.
+
+Luckily, Facebook ran into the same problem in 2012 when they needed to rethink the way they fetch
+data as they wrote their mobile apps on top of their existing stack.
+
+They developed a solution, and open sourced it as [GraphQL](https://graphql.org).
+
+## GraphQL
+
+GraphQL is the new data communication protocol for modern apps.
+
+The server communicates what data it can provide and the client specifies what data it needs in a
+**simple, graph-like structure**, in **one round trip**, no matter how deep, how complex, or how
+many resources the data contains.
+
+import { VideoEmbed } from '#components/video-embed'
+
+
+
+This means: one request to get exactly the information the app needs, when it needs it. **No
+over-fetching and under-fetching.**
+
+With that, each component needs to specify its data dependencies and a client library will merge
+them into one request. There's no need for a shared service with prepared fetching functions.
+
+GraphQL is also not a storage engine! You can connect it to an existing REST endpoint or SQL and
+NoSql databases.
+
+## Shared Best Practices between Frameworks
+
+For all the reasons above, GraphQL is already the best practice for fetching data with React. Also,
+all the Facebook apps and clients use GraphQL.
+
+If the Angular community embraces GraphQL as a best practice, it would open the door to sharing more
+tools and knowledge with the React community.
+
+---
+
+To start learning about GraphQL, take a look at these sources:
+
+- [Why GraphQL is the future](https://medium.com/apollo-stack/why-graphql-is-the-future-3bec28193807#.3wpy7r34b)
+- [The basics of GraphQL in 5 minutes](https://medium.com/apollo-stack/the-basics-of-graphql-in-5-links-9e1dc4cac055#.uvh5c43kt)
+- [Replacing Discourse REST API with GraphQL](https://medium.com/apollo-stack/discourse-in-graphql-part-1-ee1ffd8a22df#.ehvb5vgl1)
+- [Angular-Apollo Docs](https://docs.apollostack.com/apollo-client/angular2.html) and
+ [GitHub Repo](https://github.com/apollostack/angular2-apollo)
+- [Building faster modern apps with Angular and GraphQL](https://graphql.com/articles/angular-graphql-faster-modern-apps)
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/01-dashboard.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/01-dashboard.jpg
new file mode 100644
index 00000000000..1e9ce06a7a4
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/01-dashboard.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/02-create-api.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/02-create-api.jpg
new file mode 100644
index 00000000000..2b22f1f897c
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/02-create-api.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/03-copy-audience.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/03-copy-audience.jpg
new file mode 100644
index 00000000000..6d2079c16b6
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/03-copy-audience.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/04-domain.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/04-domain.jpg
new file mode 100644
index 00000000000..fb2c22f077f
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/04-domain.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/05-graphiql-unauthenticated.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/05-graphiql-unauthenticated.jpg
new file mode 100644
index 00000000000..d48e62cb2ae
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/05-graphiql-unauthenticated.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/06-auth0-applications.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/06-auth0-applications.jpg
new file mode 100644
index 00000000000..4e2a9e60f87
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/06-auth0-applications.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/07-auth-create-application.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/07-auth-create-application.jpg
new file mode 100644
index 00000000000..7d8b7c746f0
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/07-auth-create-application.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/08-login.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/08-login.jpg
new file mode 100644
index 00000000000..cf4a37591a3
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/08-login.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/09-authentication-token.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/09-authentication-token.jpg
new file mode 100644
index 00000000000..ea04dc33900
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/09-authentication-token.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/10-authenticated-request.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/10-authenticated-request.jpg
new file mode 100644
index 00000000000..f97200bd6a0
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/10-authenticated-request.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/cover.jpg b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/cover.jpg
new file mode 100644
index 00000000000..fb4e75ee525
Binary files /dev/null and b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/cover.jpg differ
diff --git a/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/page.mdx b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/page.mdx
new file mode 100644
index 00000000000..46ed5e0da54
--- /dev/null
+++ b/packages/web/docs/src/app/blog/(posts)/graphql-authentication-with-envelop-and-auth0/page.mdx
@@ -0,0 +1,349 @@
+---
+title: GraphQL Authentication with Envelop and Auth0
+authors: laurin
+tags: [graphql, authentication, envelop]
+date: 2021-12-19
+description: Learn how to quickly add authentication to you GraphQL Envelop setup with Auth0.
+---
+
+Authentication in the process of identifying who is trying to access our API. Building our own
+solution can be hard and cause severe security issue if done wrong. In recent years third-party
+authentication providers became quite popular. One of those is Auth0, which comes with an
+exceptional free plan allowing up to 7.000 active users and unlimited logins, making it one of the
+best available solutions for getting started.
+
+In this guide we will go through all the steps required for integrating authentication into an
+existing envelop setup using the [`@envelop/auth0`](https://envelop.dev/plugins/use-auth0) package.
+
+## Prerequisites
+
+Ideally, you already have your basic envelop setup with your http framework of choice. This guide we
+will be based on the
+[`graphql-helix` fastify example](https://github.com/dotansimha/envelop/tree/main/examples/graphql-helix),
+but the code can be easily transferred to any other example as listed on our
+[Integrations and Examples documentation](https://envelop.dev/docs/integrations). In case you are
+hitting any roadblocks feel free to reach out to us via the chat box on this page! The full code of
+the end-result is also available in our examples
+[`graphql-helix-auth0` fastify example](https://github.com/dotansimha/envelop/tree/main/examples/graphql-helix-auth0).
+
+## Installing Dependencies
+
+We start by installing the package into our envelop setup with your favorite Package manager.
+
+```bash
+yarn install -E @envelop/auth0
+```
+
+## Adding the Auth0 Plugin to the Envelop Setup
+
+```ts
+import { useAuth0 } from '@envelop/auth0'
+
+// ... other imports and code
+
+const getEnveloped = envelop({
+ plugins: [
+ useSchema(schema),
+ useAuth0({
+ domain: 'TODO',
+ audience: 'TODO',
+ extendContextField: 'auth0'
+ })
+ ]
+})
+
+// ... server code
+```
+
+Let's break down the code. There are several configuration options we need to pass to the plugin.
+
+**`domain`** The domain of the Auth0 server we need to communicate with for authenticating a user.
+We will fill this out in the next step.
+
+**`audience`** The audience is the identifier of the API and is forwarded to Auth0 in order to
+specify for which API we are trying to authenticate our user for. E.g. if our API is hosted on
+`http://localhost:3000/graphql`, we would pass that value. We will fill this out in the next step.
+
+**`extendContextField`** Once a user got successfully authenticated the authentication information
+is added on the context object under this field. In our resolvers we can then access the
+authentication information via `context.auth?.sub`.
+
+## Setting up the Auth0 API
+
+In order to properly configure the `useAuth0` plugin we need the `domain` and `audience` values. We
+will retrieve them by setting and configuring Auth0 from scratch!
+
+If didn't already sign up for Auth0, you should do it now on
+[Auth0 Sign Up](https://auth0.com/sign-up). Since you can sign up with your GitHub or Google Account
+it should be super fast!
+
+After logging in navigate to the [Auth0 dashboard](https://manage.auth0.com/dashboard) and from
+there to the APIs page, where we will click the **Create API** button.
+
+
+
+Choose any name for the API, we are going with `Envelop Demo` for this example. The `Identifier`
+field should be set to the URL of our GraphQL API. We are hosting our API on localhost and set it to
+the host and port on which our fastify helix server is served, which is
+`http://localhost:3000/graphql`. For production, you should instead set it to the URL of the
+production server.
+
+
+
+We can ignore the Signing Algorithm option and go with the pre-set value. Once everything is filled
+out properly we can click the `Create` button.
+
+Now we already have one of the missing config options we needed `audience` , which is equal to the
+URL we just entered `http://localhost:3000/graphql`.
+
+
+
+The `domain` value is a bit hidden, but we can find it on the detail page of the API we just
+created, on the `Test` tab.
+
+
+
+It will vary depending on your account name and region, but in general it follows this pattern
+
+```
+{account_name}.{region}.auth0.com
+```
+
+This is our `domain` configuration value.
+
+Let's quickly add this information to our envelop setup.
+
+```ts
+import { useAuth0 } from '@envelop/auth0'
+
+// ... other imports and code
+
+const getEnveloped = envelop({
+ plugins: [
+ useSchema(schema),
+ useAuth0({
+ domain: '{account_name}.{region}.auth0.com',
+ audience: 'http://localhost:3000/graphql',
+ extendContextField: 'auth0'
+ })
+ ]
+})
+```
+
+We now have all the information needed for configuring the envelop plugin. However, we did not yet
+setup an application that is required for users to authenticate in the browser.
+
+But before doing so, let's verify that the plugin is doing what it should do.
+
+## Expose Authentication Information via GraphQL Schema
+
+Before we start our server we should add some types and fields to our schema in order to query for
+the authentication information. The complete code should look like this:
+
+```ts
+// The quickest way of building a schema :)
+import { makeExecutableSchema } from '@graphql-tools/schema'
+
+const schema = makeExecutableSchema({
+ typeDefs: /* GraphQL */ `
+ """
+ Describes the authentication object as provided by Auth0.
+ """
+ type AuthenticationInfo {
+ """
+ String that uniquely identifies an authenticated user.
+ """
+ sub: String!
+ }
+
+ type Query {
+ """
+ The authentication information of the request.
+ """
+ authInfo: AuthenticationInfo
+ }
+ `,
+ resolvers: {
+ Query: {
+ authInfo(_source, _args, context) {
+ return context.auth0
+ }
+ }
+ }
+})
+```
+
+Then we can start our server. The helix fastify server can be started via `yarn start`.
+
+```sh
+C:\Users\laurin\Projects\envelop\examples\graphql-helix > yarn start
+yarn run v1.22.10
+$ ts-node index.ts
+GraphQL server is running.
+```
+
+Next, we are going to execute a query on the GraphiQL instance exposed on
+`http:localhost:3000/graphql`.
+
+```graphql
+query {
+ authInfo {
+ sub
+ }
+}
+```
+
+
+
+As expected the value of the `authInfo` field is `null`, as we are not passing any authentication
+headers along with our request.
+
+## Generating an Auth0 Access Token
+
+In order to retrieve an access token, we first need to set up an Auth0 application and an
+authentication route. For the sake of this guide and in order to reduce complexity we will simply
+add an route to our fastify http server that renders some HTML with a `
+
+
+
+
+