Scheduling and contact forms,
behind one clean API.
Give every user a public booking page and an embeddable contact form, backed by typed ConnectRPC, a generated SDK, signed webhooks, and a dashboard you don't have to build.
No credit card · deploys on free tiers · self-host anywhere
Intro Call · 30 min
Pick a time
Inbox
POST /SubmitMessage · 200 OK
Built on the tools you already run
Everything a booking link needs, and nothing it doesn't
Two products sharing one identity layer, one API, and one deployable binary.
Scheduling that respects timezones
Weekly availability rules, date overrides, Google Calendar sync, and auto-generated Google Meet links. Slots are computed server-side so two people never book the same minute.
Weekly rules
Thu · 6 bookings
Next bookings
Spam-proof by default
Honeypot fields, per-IP rate limiting, and a spam score on every submission.
Scoring live submissions…
Typed end to end
Protobuf definitions generate both the Go server and the TypeScript SDK, so a renamed field breaks the build instead of production.
const halo = new HaloMail({
apiUrl: process.env.API_URL,
});
await halo.contact.submitMessage({
formSlug: "portfolio",
senderName: "Jane Visitor",
senderEmail: "jane@example.com",
data: { message: "Let's talk." },
});Emails that don't look templated
Five built-in themes plus custom HTML, with live preview before you send.
Thanks for reaching out
Hi Jane, got your message about the portfolio. I'll reply within a day, or grab a slot below.
You're booked
Tue, 09:00 · Intro Call
New message · portfolio
Jane Visitor wrote: "Saw your portfolio, can we talk?"
Meeting confirmed
Wed 14:30 · Design Review
$ halomail send
from: jane@example.com
subject: let's talk
delivered · 200 OK
▮
One dashboard for meetings and messages.
Every booking, every form submission, every API key and webhook delivery in a single place, with an audit log that records who changed what.
- Read, search, and mark submissions without leaving the app
- Rotate scoped API keys and replay failed webhooks
- Per-form target addresses and redirect URLs
This week
Bookings
34
Messages
128
Show rate
92%
Embed forms anywhere with an access key.
Just like Web3Forms, generate a unique access key for your website. When users submit the form, data is stored and email notifications are instantly routed to you.
See the embed guideLive on your site in three steps
No SDK required for the basics: a slug, two lines of HTML, and you're receiving.
Create a form or event type
From the dashboard or one API call. You get a slug and a public booking handle.
halomail.app/book/you
Paste two lines into your site
A script tag and a data-halomail attribute on the form you already designed.
<form data-halomail="portfolio">
Messages and bookings land
Stored, forwarded to your inbox, and pushed to your endpoints as signed webhooks.
POST /SubmitMessage · 200 OK
Two lines of HTML, or the raw API
The widget is progressive enhancement over a form you already have. Prefer to own the request? It's plain JSON over POST.
<script src="https://api.halomail.app/widget.js" defer></script>
<form data-halomail="portfolio">
<input name="name" required>
<input name="email" type="email" required>
<textarea name="message" required></textarea>
<input name="_hl_hp" tabindex="-1" style="display:none">
<button type="submit">Send</button>
</form>curl https://api.halomail.app/halomail.scheduling.v1.BookingService/CreateBooking \
-H 'Content-Type: application/json' \
-d '{
"eventTypeId": "evt_01a01b8f",
"inviteeName": "Grace Hopper",
"inviteeEmail": "grace@example.com",
"start": "2026-06-15T09:00:00Z"
}'Everything you need, nothing you don't
One typed API powers the dashboard, the SDK, and your own integrations.
Scheduling
A cal.com-style booking experience for every user.
- Availability rules with per-date overrides
- Google Calendar sync & auto-generated Google Meet links
- Reschedule and cancel links built in
Contact forms
Web3Forms-style access keys for your website.
- Spam scoring plus rate limiting
- Stored, searchable submissions
- Instant email forwarding to your inbox
Email designer
Notification emails that match your brand.
- Five built-in themes, custom HTML too
- Template variables, safely substituted
- Live preview before you send
Developer surface
Everything is an API before it's a screen.
- Scoped keys and signed webhooks
- Generated TypeScript SDK
- Audit logs on sensitive actions
6
services, one binary
~15 MB
container image
$0
to run on free tiers
MIT
licensed, forever
Have a question? We've got answers.
Confused or curious? The docs cover the whole surface, from the first embed to self-hosting the stack on your own infrastructure.
Read the docsAn open-source platform that gives every user a public booking page and an embeddable contact form, behind one typed API. Run it as a hosted service or self-host the whole thing as a single container.
Create an account, make a form or event type, then paste a script tag into your site. The integration guide walks through both, with copy-paste snippets for plain HTML and React.
PostgreSQL, yes. A free Neon project is plenty to start. Redis is optional: without it, rate limiting falls back to an in-memory limiter, which is correct for a single instance.
Yes. Verify a domain with your email provider, then point EMAIL_FROM at an address on it. Without a verified domain, delivery is limited to your own account address.
In monolith mode it fits inside the free tiers of a container host and a managed Postgres. Scale a single service out to its own deployment later without touching code.
Every write endpoint except form submission and booking requires a bearer token. Deploy the gateway behind your own proxy if you want the rest locked down further.
No. Self-hosting gives you every feature in the codebase. There is no enterprise edition and no license key. You are paying for operations when you choose hosted, not for features.
A managed Postgres with daily backups, automatic deploys of new versions, configured email delivery, and someone to email when something breaks.
In both directions. It is the same schema and the same API, so a database dump moves your data either way. No export fees, no lock-in.
No. One price covers your whole team, however many people that is.
Self-hosting is the trial: run the exact same software for as long as you like before paying anything. Cancel hosted whenever; billing stops at the end of the period.
Ship scheduling and contact in an afternoon.
Self-host the whole platform as one container, or run each service on its own. Same API either way.