# Contributing to our examples A few important things to stick to when contributing to our examples: ## Keep it simple The point of examples is to show how Builder.io integrates with a site, and make it easy for someone to discover it. ### Use as little boilerplate as possible If you generated your example from a starter, then added the Builder.io integration, be sure to delete anything else you reasonably can. For example, if you start from a Next.js starter, and it has example API code, example CSS, "hello world" code, example components (that aren't registered for use in Builder), just delete all of that. Focus on what developers need to see and learn, not boilerplate that is irrelevant that they can easily get lost in when trying to find what matters for the. #### ✅ Good ```bash src/ components/ example-component.jsx # example component pages/ [...page].jsx # example page ``` #### ❌ Avoid ```bash # too much stuff to dig through to find what matters src/ components/ my-component.jsx index.js pages/ index.jsx styles/ index.css api/ example-api.js utils/ my-utils.js ``` ### Use as little abstraction as possible Avoid all kinda of custom wrappers and stick to the Builder SDKs/APIs as directly as possible #### ✅ Good ```ts import { getContent } from '@builder.io/sdk-react' getContent(...) ``` #### ❌ Avoid ```ts import { getBuilderContent } from './get-builder-content' // Unnecessary abstraction away from the APIs people are trying to learn getBuilderContent(...) ``` ### Use comments Comments help explain to someone who is brand new to Builder.io what is going on in-context #### ✅ Good ```tsx export async function getStaticProps() { // Get the page from Builder.io's API const page = await getContent({ // Provide your model name model: 'page', // Provide the current URL url: '/' // You can add other options here: https://github.com/BuilderIO/builder/blob/main/packages/core/docs/interfaces/GetContentOptions.md }) if (!page) { // If no page exists, show a 404 return { notFound: true } } return { props: { page } } } ``` #### ❌ Avoid ```ts export async function getStaticProps() { const page = await getContent({ model: 'page', url: '/' }) if (!page) { return { notFound: true } } return { props: { page } } } ``` ### Use JavaScript, not TypeScript I know, we all love TypeScript. But not everyone knows TypeScript, yet you need to know JavaScript to use Builder. This also helps keep the example as small and simple as possible, without additional syntax that may not be understood #### ✅ Good ```tsx export const getStaticProps = async (context) => { // ... } ``` #### ❌ Avoid ```tsx import type { GetStaticProps } from 'next' export const getStaticProps: GetStaticProps = async (context) => { // ... } ``` ### Use the README.md effectively At the top, briefly explain what this example is, and what files in particular someone should look at first. Then, explain how to get started #### ✅ Good ```md # Builder.io example with SvelteKit This is an example of using Builder with SvelteKit. See (pages/index.svelte)[pages/index.svelte] to see the example integration point in detail ## Get Started ... ``` #### ❌ Avoid ```md # SvelteKit Builder and Svelte ``` ## Use best practices Be sure to guide people into the "pit of success" by sticking to best practices throughout. ### SSR/SSG When possible, do things in an SSR/SSG compatible way, vs complete client side #### ✅ Good ```tsx export default function MyPage({ builderJson }) { return } ``` #### ❌ Avoid ```tsx export default function MyPage({ builderJson }) { const [builderJson, setBuilderJson] = useEffect(null) useEffect(() => { getContent(...).then(setBuilderJson }, []) return } ``` ### Always include a header and footer We are not a "blank canvas" page builder. We are meant to be integrated with, and consistent with, an existing site. So always have some placholder header and footer as this is how we recommend using Builder, not as a total blank slate #### ✅ Good ```tsx export default function MyPage({ builderJson }) { return ( <> ) } ``` #### ❌ Avoid ```tsx export default function MyPage({ builderJson }) { return } ``` ### Use descriptive variables name Builder is full of new abstract concepts, so more descriptive names can make things much more clear #### ✅ Good ```jsx const builderPageJson = await getContent(...) ``` #### ❌ Avoid ```jsx // In particular avoid naming anything just "builder", in the context of builder examples // it means literally nothing of value (and can even cause extra confusion) const builder = await getContent(...) ```