A buddy of mine does freelance web dev. Mostly small business sites -- restaurants, dentists, that kind of thing. Every single client needs a contact form. And every single time it's the same conversation: "Why am I paying $20 a month just to get emails from my website?"
Fair question honestly.
His solution was to rig up an n8n workflow that catches form submissions via webhook and dumps them into a Google Sheet. It works. Technically. Until a column shifts, or the webhook URL expires, or the client wants to see their submissions somewhere that isn't a spreadsheet.
I kept thinking about this. A form backend is such a basic thing. You receive a POST request. You save it. You send a notification. Maybe you show it in a dashboard. That's it. That's literally the whole product. And yet Formspree wants $20/mo for it. Basin, Formcarry -- same ballpark.
So around December last year I decided to just build the thing myself.
The building process
I should mention -- this was always a side project. I run a small automation agency during the day, so FormTo got evenings and weekends. Some weeks I'd grind on it for hours, other weeks I barely touched it. That's just how side projects go I guess.
The backend came together pretty fast. Fastify, PostgreSQL, standard stuff. I used Claude Code a lot during development and honestly it was a game changer for velocity. Stuff that would normally take me a full evening to figure out -- like getting JWT auth right, or writing all the database migrations, or setting up the Caddy reverse proxy config -- I could knock out in an hour or two. Not saying AI wrote the whole thing, but it definitely cut the timeline by half, maybe more. For a solo dev working on nights and weekends that matters a lot.
The frontend though. That's where things got interesting.
The Upwork disaster
I'm primarily a backend guy. I can hack together a React app but I'm not going to pretend I'm a frontend specialist. So I thought OK, let me hire someone on Upwork to build a clean dashboard UI. Found a guy, decent portfolio, good reviews. Gave him the designs, explained the API, set up the repo.
What a disaster.
The first delivery was basically a template he found somewhere with my API calls shoved in. Half the components didn't work. State management was all over the place. I spent more time reviewing and fixing his code than it would have taken me to write it from scratch. After two rounds of revisions that somehow made things worse, I just paid him for the hours and moved on.
Ended up building the frontend myself with Claude Code again. Took me about two weeks to get something I was actually happy with. React 19, Tailwind v4, Radix UI for the component primitives. Is it the most beautiful dashboard ever? No. But it works, it's consistent, and I understand every line of code in it. That Upwork detour cost me about a month of progress and a few hundred dollars for code I threw away entirely.
Lesson learned: if your project is small enough and you're technical enough, just build it yourself. Hiring makes sense when you're scaling, not when you're prototyping.
So what is FormTo actually?
FormTo is a self-hosted form backend. You take any HTML form, point the action attribute at your FormTo instance, and submissions start showing up in a dashboard. No JavaScript SDK, no API keys, no build step.
<form action="https://forms.yourdomain.com/f/contact-abc123" method="POST">
<input name="name" required />
<input name="email" type="email" required />
<textarea name="message"></textarea>
<button type="submit">Send</button>
</form>
I only built stuff I actually needed or my friend kept asking for. Notifications go to email (any SMTP), Telegram, Slack, or a generic webhook -- so you can still pipe it to n8n or Make if that's your thing, but you don't have to anymore. There's spam handling with honeypot fields and rate limiting instead of CAPTCHAs because nobody likes CAPTCHAs. Auto-close after X submissions or a date, which turned out to be really handy for RSVPs and waitlists. CSV export because someone will always ask for a spreadsheet, it's like a law of nature at this point. And hosted form pages if you don't even want to write HTML -- just share a link and you're done.
Running it
The whole thing runs on Docker Compose. One command and you've got a working form backend with automatic HTTPS via Caddy. There's a first-run wizard so you don't need to mess with config files beyond setting a domain and database password. It runs fine on a $5 VPS.
git clone https://github.com/lumizone/formto
cd formto
cp formto.env.example formto.env
docker compose up -d
One thing I want to be clear about -- this is not a form builder. No drag-and-drop, no visual editor, no templates. You write your form however you want and point it at FormTo. That's intentional. There are a million form builders out there already. I just wanted the backend part done well.
Open source + cloud
It's open source under AGPL-3.0. The full feature set is right there, nothing held back behind a paywall or a pro tier. I'm also working on a cloud version at formto.dev for people who don't want to deal with servers, but the self-hosted version will always be the complete product. No artificial limits to nudge you toward paying.
GitHub: github.com/lumizone/formto
It's still early and I'm the only one working on it. If something breaks, if you want a feature, or if you just want to tell me the UI is ugly -- open an issue. I read all of them.
Top comments (0)