An open-source, modern alternative to Typeform built with Next.js
An open-source, modern alternative to Typeform built with Next.js. It offers a smooth, one-question-at-a-time experience that makes filling out forms easy and engaging.
We wanted to create a simple, fast, and customizable form builder that you can own. Whether you need a simple contact form or a complex survey, this project provides a solid foundation with a modern tech stack.

Enter to advance, Up/Down arrows to navigate.
Follow these steps to run the project locally on your machine.
undefinedClone the repositoryundefined
git clone https://github.com/yourusername/nextjs-typeform-clone.git
cd nextjs-typeform-clone
undefinedInstall dependenciesundefined
npm install
# or
yarn install
# or
pnpm install
undefinedRun the development serverundefined
npm run dev
undefinedOpen your browserundefined
Navigate to http://localhost:3000 to see the form in action.
Hereโs a quick look at how the code is organized so you can find your way around.
src/
โโโ app/ # Next.js App Router pages
โ โโโ page.tsx # Main entry point (renders the form)
โ โโโ layout.tsx # Global layout and metadata
โโโ components/
โ โโโ form/ # Core form components
โ โ โโโ type-form.tsx # Main form logic and state manager
โ โ โโโ field-renderer.tsx # Decides which field component to show
โ โ โโโ progress-bar.tsx # Top progress bar
โ โ โโโ fields/ # Individual field types
โ โ โโโ text-field.tsx
โ โ โโโ number-field.tsx
โ โ โโโ choice-field.tsx
โ โ โโโ date-field.tsx
โ โโโ ui/ # Reusable UI components (buttons, inputs, etc.)
โโโ data/
โ โโโ data.ts # Form configuration (JSON structure)
โ โโโ constants.ts # Static data (choices, lists)
โโโ lib/ # Utility functions
You donโt need to touch the code logic to change the questions. Just edit src/data/data.ts.
Example structure:
export const myForm = {
title: "My Custom Form",
fields: [
{
id: "name",
type: "short_text",
title: "What is your name?",
required: true,
},
{
id: "age",
type: "number",
title: "How old are you?",
},
// Add more fields here...
],
};
Then update src/app/page.tsx to use your new form:
<Typeform form={myForm} />
src/components/form/fields/.src/components/form/field-renderer.tsx to import and render your new field based on its type.We love contributions! If you have an idea for a new feature or found a bug:
git checkout -b feature/amazing-feature).This project is open-source and available under the MIT License. You are free to use, modify, and distribute it for personal or commercial projects.