You are considering contributing to Typebot. I thank you for this 🙏.
Any contributions you make are greatly appreciated. It can be anything from typo fixes to new features.
Let's discuss about what you want to implement before creating a PR if you are unsure about the requirements or the vision of Typebot.
Typebot is a Monorepo powered by Turborepo. It is composed of 2 main applications:
- the builder (
./apps/builder
), where you build your typebots - the viewer (
./apps/viewer
), where your user answer the typebot
These apps are built with awesome web technologies including Typescript, Next.js, Prisma, Chakra UI, Tailwind CSS.
-
Fork this repository to your own GitHub account and then clone it to your local device.
-
Create a new branch:
git checkout -b MY_BRANCH_NAME
-
Install dependencies
cd typebot.io pnpm i
-
Set up environment variables
Copy
.env.dev.example
to.env
Check out the Configuration guide if you want to enable more options
-
Make sure you have Docker running
-
Start the builder and viewer
pnpm dev
Builder is available at
http://localhost:3000
Viewer is available at
http://localhost:3001
Database inspector is available at
http://localhost:5555
By default, you can easily authenticate in the builder using the "Github Sign In" button. For other options, check out the Configuration guide
-
(Optionnal) Start the landing page
Copy
apps/landing-page/.env.local.example
toapps/landing-page/.env.local
cd apps/landing-page pnpm dev
-
(Optionnal) Start the docs
cd apps/docs pnpm start
I know the project can be a bit hard to understand at first. I'm working on improving the documentation and the codebase to make it easier to contribute. If you have any questions, feel free to open a discussion
The first step to create a new Typebot block is to define its schema. For this you need to
-
Add your integration in the enum
IntegrationBlockType
inpackages/schemas/features/blocks/integrations/enums.ts
-
Create a new file in
packages/schemas/features/blocks/integrations
.Your schema should look like:
import { z } from 'zod' import { blockBaseSchema } from '../baseSchemas' export const myIntegrationBlockSchema = blockBaseSchema.merge( z.object({ type: z.enum([IntegrationBlockType.MY_INTEGRATION]), options: z.object({ //... }), }) ) export type MyIntegrationBlock = z.infer<typeof myIntegrationBlockSchema>
-
Add
myIntegrationBlockSchema
toblockSchema
inpackages/schemas/features/blocks/schemas.ts
As soon as you have defined your schema, you can start implementing your block in the builder and the viewer. Since the code is strictly typed, you should see exactly where you need to add your integration-specific code.
To sum it up you need to create a folder in apps/builder/src/features/blocks/integrations
and in apps/viewer/src/features/blocks/integrations