├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── .vscode ├── extensions.json └── launch.json ├── README.md ├── astro.config.mjs ├── package.json ├── pnpm-lock.yaml ├── public ├── favicon.svg ├── logos │ ├── EvmosDao.svg │ ├── Grafbase.svg │ ├── Neo4j.svg │ ├── Sibi.svg │ ├── Soundtrack.svg │ ├── Tailor.svg │ ├── TheGuild.svg │ ├── TravelpassGroup.svg │ ├── WunderGraph.svg │ └── logos.json └── solutions │ ├── cosmo.svg │ ├── hive.svg │ └── solutions.json ├── src ├── components │ ├── FAQ.tsx │ ├── Footer.astro │ ├── GraphParticles.astro │ ├── Logo.astro │ ├── LogoWall.astro │ ├── Navbar.astro │ ├── OpenFederationLogo.astro │ ├── Particles.astro │ └── Solutions.astro ├── env.d.ts ├── layouts │ ├── Layout.astro │ ├── PrivacyPolicy.astro │ └── Terms.astro └── pages │ ├── index.astro │ ├── privacy-policy.md │ └── terms.md ├── tailwind.config.cjs └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | 4 | # generated types 5 | .astro/ 6 | 7 | # dependencies 8 | node_modules/ 9 | 10 | # logs 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | # Package manager 4 | pnpm-lock.yaml 5 | *lock.json 6 | 7 | # Output 8 | gen 9 | dist 10 | 11 | # Logs 12 | logs 13 | *.log 14 | 15 | # IDE 16 | .vscode 17 | .idea 18 | 19 | CHANGELOG.md 20 | .husky -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "semi": true, 4 | "singleQuote": true, 5 | "tabWidth": 2, 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Open Federation Home 2 | 3 | Open Federation is a community-driven open source initiative to create and maintain a specification for federated GraphQL APIs. Be part of the future; let's craft together. 4 | 5 | # Contributing 6 | 7 | ## Solutions 8 | 9 | If you have your own Open Federation compatible solution please raise a PR by adding your product SVG to [public/solutions](./public/solutions) and an entry into the [solutions.json](./public/solutions/solutions.json). 10 | 11 | ## Support 12 | 13 | To show your support please raise a PR by adding your SVG to [public/logos](./public/logos) and an entry into the [logos.json](./public/logos/logos.json). Thank you 🙏 14 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'astro/config'; 2 | import tailwind from '@astrojs/tailwind'; 3 | import react from "@astrojs/react"; 4 | 5 | // https://astro.build/config 6 | export default defineConfig({ 7 | integrations: [tailwind(), react()] 8 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "open-federation", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro build", 9 | "preview": "astro preview", 10 | "astro": "astro", 11 | "lint": "prettier --write . --plugin=prettier-plugin-astro" 12 | }, 13 | "dependencies": { 14 | "@astrojs/react": "^2.3.2", 15 | "@astrojs/tailwind": "^4.0.0", 16 | "@heroicons/react": "^2.0.18", 17 | "@radix-ui/react-accordion": "^1.1.2", 18 | "@typeform/embed": "^2.16.0", 19 | "@types/react": "^18.0.21", 20 | "@types/react-dom": "^18.0.6", 21 | "astro": "^2.10.12", 22 | "plausible-tracker": "^0.3.8", 23 | "react": "^18.0.0", 24 | "react-dom": "^18.0.0", 25 | "tailwindcss": "^3.0.24", 26 | "tailwindcss-radix": "^2.8.0", 27 | "tsparticles": "^2.12.0", 28 | "tsparticles-engine": "^2.12.0" 29 | }, 30 | "devDependencies": { 31 | "@tailwindcss/typography": "^0.5.10", 32 | "prettier": "^3.0.2", 33 | "prettier-plugin-astro": "^0.12.0", 34 | "prettier-plugin-tailwindcss": "^0.5.3" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 4 | 13 | 19 | 20 | -------------------------------------------------------------------------------- /public/logos/EvmosDao.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /public/logos/Grafbase.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/logos/Neo4j.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/logos/Sibi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/logos/Tailor.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /public/logos/TheGuild.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /public/logos/TravelpassGroup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/logos/WunderGraph.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/logos/logos.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Evmos Community DAO", 4 | "logo": "EvmosDao.svg", 5 | "home": "https://evmosdao.org/" 6 | }, 7 | { 8 | "name": "Grafbase", 9 | "logo": "Grafbase.svg", 10 | "home": "https://grafbase.com/" 11 | }, 12 | { 13 | "name": "Neo4j", 14 | "logo": "Neo4j.svg", 15 | "home": "https://neo4j.com/brand/" 16 | }, 17 | { 18 | "name": "Sibi", 19 | "logo": "Sibi.svg", 20 | "home": "https://www.sibipro.com/" 21 | }, 22 | { 23 | "name": "Soundtrack", 24 | "logo": "Soundtrack.svg", 25 | "home": "https://www.soundtrackyourbrand.com/" 26 | }, 27 | { 28 | "name": "Tailor", 29 | "logo": "Tailor.svg", 30 | "home": "https://www.tailor.tech/" 31 | }, 32 | { 33 | "name": "TravelpassGroup", 34 | "logo": "TravelpassGroup.svg", 35 | "home": "https://www.travelpassgroup.com/" 36 | }, 37 | { 38 | "name": "WunderGraph", 39 | "logo": "WunderGraph.svg", 40 | "home": "https://wundergraph.com/" 41 | } 42 | ] 43 | -------------------------------------------------------------------------------- /public/solutions/cosmo.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/solutions/hive.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/solutions/solutions.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "WunderGraph Cosmo", 4 | "logo": "cosmo.svg", 5 | "home": "https://wundergraph.com/cosmo", 6 | "description": "The open source alternative to Apollo GraphOS and Federation. Migrate in one click and get rid of vendor lock-in. Deploy on-prem or use our cloud." 7 | } 8 | ] 9 | -------------------------------------------------------------------------------- /src/components/FAQ.tsx: -------------------------------------------------------------------------------- 1 | import { MinusIcon, PlusIcon } from '@heroicons/react/20/solid'; 2 | import * as Accordion from '@radix-ui/react-accordion'; 3 | 4 | const FAQ = ({ 5 | items, 6 | }: { 7 | items: { 8 | question: string; 9 | answer: string; 10 | }[]; 11 | }) => ( 12 | 13 | {items.map(({ question, answer }) => { 14 | return ( 15 | 16 | 17 | 18 | {question} 19 | 20 | 21 | 22 | 23 | {answer} 24 | 25 | ); 26 | })} 27 | 28 | ); 29 | 30 | export default FAQ; 31 | -------------------------------------------------------------------------------- /src/components/Footer.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Logo from './OpenFederationLogo.astro'; 3 | --- 4 | 5 | 40 | -------------------------------------------------------------------------------- /src/components/GraphParticles.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { ISourceOptions } from 'tsparticles-engine'; 3 | import Particles from './Particles.astro'; 4 | 5 | const options: ISourceOptions = { 6 | fullScreen: { 7 | enable: true, 8 | zIndex: -100, 9 | }, 10 | particles: { 11 | number: { value: 40, density: { enable: true, value_area: 1000 } }, 12 | color: { value: '#000000' }, 13 | shape: { 14 | type: 'circle', 15 | stroke: { width: 0, color: '#000000' }, 16 | polygon: { nb_sides: 5 }, 17 | }, 18 | opacity: { 19 | value: 0.2, 20 | random: false, 21 | anim: { enable: false, speed: 1, opacity_min: 0, sync: false }, 22 | }, 23 | size: { 24 | value: 3, 25 | random: true, 26 | anim: { enable: false, speed: 40, size_min: 0.1, sync: false }, 27 | }, 28 | line_linked: { 29 | enable: true, 30 | distance: 150, 31 | color: '#000000', 32 | opacity: 0.2, 33 | width: 1, 34 | }, 35 | move: { 36 | enable: true, 37 | speed: 1, 38 | direction: 'none', 39 | random: false, 40 | straight: false, 41 | out_mode: 'out', 42 | bounce: false, 43 | attract: { enable: false, rotateX: 600, rotateY: 1200 }, 44 | }, 45 | }, 46 | retina_detect: true, 47 | }; 48 | --- 49 | 50 | 58 | 59 | 62 | -------------------------------------------------------------------------------- /src/components/Logo.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | name: string; 4 | logo: string; 5 | home: string; 6 | } 7 | 8 | const { name, logo, home } = Astro.props; 9 | --- 10 | 11 | 12 |
13 | {name} 14 |
15 |
16 | -------------------------------------------------------------------------------- /src/components/LogoWall.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import logos from '../../public/logos/logos.json'; 3 | import Logo from './Logo.astro'; 4 | --- 5 | 6 |

7 | Supported by small companies and big enterprises. Show yours by adding your logo here. 12 |

13 |
14 |
15 |
16 | {logos.map((l) => )} 17 |
18 |
19 | {logos.map((l) => )} 20 |
21 |
22 | 30 |
31 | 32 | 77 | -------------------------------------------------------------------------------- /src/components/Navbar.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Logo from './OpenFederationLogo.astro'; 3 | --- 4 | 5 |
6 | 14 |
15 | -------------------------------------------------------------------------------- /src/components/OpenFederationLogo.astro: -------------------------------------------------------------------------------- 1 | 15 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/Particles.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { ISourceOptions } from 'tsparticles-engine'; 3 | 4 | export interface IParticlesProps { 5 | id: string; 6 | init: string; 7 | loaded?: string; 8 | options?: ISourceOptions; 9 | url?: string; 10 | } 11 | 12 | const { id, init, loaded, options, url } = Astro.props as IParticlesProps; 13 | --- 14 | 15 | 22 | 23 | 24 | 25 | 69 | -------------------------------------------------------------------------------- /src/components/Solutions.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import solutions from '../../public/solutions/solutions.json'; 3 | --- 4 | 5 | { 6 | solutions.map((s) => { 7 | return ( 8 | 13 |
14 | {s.name} 15 |
16 |
17 |

{s.name}

18 |

{s.description}

19 |
20 |
21 | ); 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/layouts/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | title: string; 4 | } 5 | 6 | const { title } = Astro.props; 7 | --- 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {title} 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/layouts/PrivacyPolicy.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Navbar from 'src/components/Navbar.astro'; 3 | import Layout from './Layout.astro'; 4 | import Footer from 'src/components/Footer.astro'; 5 | --- 6 | 7 | 8 | 9 |
10 |

Privacy policy

11 | 12 |
13 |