Vibe code your own Typeform

Vibe code your own Typeform as seven questions, a thank-you screen, and a CSV. Publish a share URL you own and skip the $29–$99 visual builder.

  • getting-started
  • vibe-coding
  • tonight

You can vibe code your own Typeform as a form and a table. Typeform is a polished form. The catalog says that in one line: a polished form for the seven questions you actually ask.

You pay $29–$99 a month for it. That is $348–$1,188 a year. The basic replacement is 2 hours: one question at a time, and a table of answers.

I would ship this second if I still rented a questionnaire. It is marked Tonight. The verdict on the card is “Build it tonight”.

Yesterday I wrote about building your own Linktree in 30 minutes. A form is the next small bill. Open the product page, copy the prompt, and collect a real response before you start decorating the builder.

What you get when you vibe code your own Typeform

The Typeform page splits the work into three rows.

The first row is the one you want tonight. One question at a time. A response table. A public share URL and an inbox of answers.

The second row is 6 hours. Logic jumps, theming, a proper CSV export, webhooks. Those can wait until someone has submitted.

The third row is 2 weeks and up. A visual builder, payment fields, an integrations gallery. The table labels that row as the part you should skip.

If you tell an agent to “clone Typeform”, it aims at the third row. Use the prompt on the page. It is written for a useful v1, and you still have to keep it on the first row.

The estimate table puts a polished CSV on the 6-hour row. I would still download the current table tonight. Without an export you are looking at answers in a browser tab you do not own.

Here is the shape of the data you are building. Nothing else has to exist at 2 hours.

const intake = {
  slug: 'studio-intake',
  title: 'New client intake',
  intro: 'A few questions before we book a call.',
  thankYou: 'Got it. I will email you this week.',
  questions: [
    { id: 'name', type: 'text', label: 'What should I call you?', required: true },
    { id: 'email', type: 'email', label: 'Where should I reply?', required: true },
    { id: 'work', type: 'select', label: 'What do you need?', options: ['Site', 'Newsletter', 'Something else'] },
    { id: 'notes', type: 'long', label: 'Anything I should read first?' },
  ],
}

A visitor hits a stable public URL and answers those one at a time. You open the table, download a CSV, and the share link you already sent still works.

Who a Typeform alternative is for

The audience line on the page is specific. A small business collecting leads or client intake.

The goal is to publish one-question-at-a-time forms that feel excellent on mobile. Tonight the done state is one published form and at least one real row in the table.

If you take payments in the form, or you run research with quotas and panels, keep paying. That is the honest rebuild. The site puts it at 2 weeks on purpose.

The same v1 also replaces Jotform and Youform. They solve the same job. One focused build covers whichever of those you currently pay for.

Tally is $29–$89 a month. The catalog gives it 8 hours because the product is a document-style block builder. If Tally is the logo on the invoice, this Typeform-shaped v1 still covers a name and an email.

SurveyMonkey is $39–$75 per person per month, about 4 hours for a question form, a table, and a CSV. Use that page for occasional surveys. Use this Typeform v1 for seven intake questions and a thank-you screen.

Read the non-goals before you copy anything

Open the guide. Read the audience and the non-goals before you touch the prompt.

The non-goal is the useful sentence: do not create a general visual workflow builder or payment fields.

The guardrail sits next to it. Validate and rate-limit submissions server-side. Include a honeypot field. A public form that writes to your inbox will get hit by bots. You deal with that on the server, not with a hidden CSS trick the crawler ignores.

Then pick the stack you already write. Every prompt ships in four flavors: AHA (Astro, HTMX, Alpine.js), Next.js, Laravel, and Rails. The AHA version for this product uses Astro, HTMX, and D1. This site is an Astro app on Cloudflare, so that is the path I default to. Use Laravel if that is your weekday language. The scope matters more than the framework.

Copy the prompt. Before you run it, add one extra line at the top: ship the 2-hour row only. One-question flow, response table, a CSV download. Stop.

Walk the first Typeform journey

You create a form from scratch. You add four questions. You mark email required. You preview it on a phone-sized width. You publish a stable share URL.

A respondent opens that URL. They see one question. They go next. They get a validation message if the email is garbage. They land on your thank-you sentence.

You get a notification. You open the table. You search for the email. You export the current rows.

Keep that share URL stable when you edit a question later, so the link in your newsletter and the link on the booking page keep working.

The screens the prompt asks for are a forms list, a builder, a public responder, and a results view. For 2 hours, a short question list is enough. Type, label, required, options. The ordered rail, theme controls, and logic summary can wait.

The public responder is what the visitor sees. One focused question per view, a progress mark, back and next, and validation that keeps the answer they already typed.

The results view is what you see. A table, a detail page, and a download. Webhook-delivery status can wait.

The data model on the page is Form, Question, LogicRule, Submission, Answer. Tonight you need Form, Question, Submission, and Answer. LogicRule waits.

One more rule from the prompt, and it is a good one. Published forms use an immutable version so editing cannot corrupt historical answers. If 2 hours are real, freeze the published questions as a JSON snapshot on the form row. Do not invent a versioning UI. Just stop live-editing questions someone already answered.

Code the public POST yourself

Agents will give you a pretty form and a wide-open POST endpoint. The catalog already tells you to validate and rate-limit on the server, and to include a honeypot.

The honeypot is a field humans never see. Bots fill it. You drop those submissions without a lecture.

function shouldAccept({ honeypot, submissionsLastHour }) {
  if (honeypot.trim() !== '') {
    return { ok: false, reason: 'ignored' }
  }

  if (submissionsLastHour >= 20) {
    return { ok: false, reason: 'rate-limited' }
  }

  return { ok: true }
}

shouldAccept({ honeypot: 'buy followers', submissionsLastHour: 3 })
//{ ok: false, reason: 'ignored' }

Twenty an hour per form is where I would start. High enough for a launch day. Low enough that a script cannot fill the table. Tell the human you are rate-limited. A bot can get the thank-you screen and no row.

Required email is the other check that has to live on the server. The prompt scenario is specific: reject malformed input, keep the answer, focus the field explanation. Do not wipe the rest of the session because question two is missing an @.

The mini-prompt on the page is “The CSV export that can’t attack a spreadsheet”. Respondents type =HYPERLINK into a feedback box. Spreadsheet apps will run that as a formula if you let them.

function escapeCsvCell(value) {
  let text = String(value)
  if (/^[=+\-@\t\r]/.test(text)) {
    text = `'${text}`
  }
  if (/[",\n\r]/.test(text)) {
    text = `"${text.replaceAll('"', '""')}"`
  }
  return text
}

escapeCsvCell('=2+2')
//'=2+2

Prefix a leading =, +, -, or @ with a single quote so the cell stays text. Quote fields that contain commas, quotes, or newlines. Double embedded quotes. End rows with CRLF. Put a UTF-8 BOM at the top of the file so Excel does not mangle accented names.

Columns: one per question in form order, plus submitted-at and submission id. Name the file with the form slug and the export date, studio-intake-2026-10-11.csv.

That is enough for tonight. Streaming 50,000 rows is the 6-hour version of the same download.

What not to build in a Typeform clone

Leave out the visual builder, payment fields, and anything that looks like an integrations gallery.

Logic jumps are on the feature list. Skip them until a real form needs “if they said newsletter, skip the site questions”. Theming is two CSS variables and a logo if you have ten extra minutes.

If the agent starts a template marketplace, stop it. Paste the non-goal again.

The 6-hour row, after someone submits

Use the form as the real intake for a week. Then look at the second estimate.

Logic jumps. Each rule says: if question X matches, jump to question Y or end. The mini-prompt is “Logic jumps that can’t loop forever”. Jumps go forward or end. Record the path they took, so a required question they were allowed to skip does not block submit.

Theming, so the form looks like the rest of your site.

A webhook, so a submission can hit the tool you already use. The mini-prompt is “One click, one submission, even on hotel wifi”. Issue a token when the form loads. One token, one row. Fire the email and the webhook after the insert commits.

Immutable versions, if you edit questions after people have answered. The mini-prompt is “Edit the form without gaslighting old answers”. Publishing freezes the questions. Old rows keep the wording they saw.

That is the solid v1. The catalog says 6 hours. Stop there.

The product pages put hosting this way: a focused replacement costs your build time plus close-to-zero hosting.

Put the form on a subdomain you already own, forms.flaviocopes.com, or on a path next to a site you already deploy. Update the intake link in your email first, then the other places you still point at Typeform.

Use it for a week as the real tool, not as a demo. If you miss a jump, add it from the 6-hour row. You will not miss a visual builder.

Then cancel Typeform, or Jotform, or Youform, whichever one you pay for.

A waitlist with a position number is a different job. That is GetWaitlist, $15–$50 a month, about 3 hours. Build that if the hype list is the rent.

If you want another Tonight card after this one, the audit is still the index. Bitly is about 90 minutes. Build your own link shortener is that walkthrough. Statuspage is about 3 hours.

Start now

Go to Build your own Typeform. Copy the AHA prompt, or the stack you already write.

Tell the agent the first estimate only: one-question flow, response table, a CSV. Two hours.

Publish the share URL. Point one real intake at it tonight.