GitHub Pages
Add form submissions to your GitHub Pages site using plain HTML forms or JavaScript for a better user experience.
Overview
GitHub Pages serves static files — it can't process form submissions on its own. onsubmit.dev provides a simple API endpoint that handles form submissions for you.
Your form ID is available in the onsubmit.dev dashboard after creating a form.
Quick start
Point your form's action attribute to your onsubmit.dev endpoint:
html
<form action="https://onsubmit.dev/f/YOUR_FORM_ID" method="POST">
<input name="name" placeholder="Your name" required />
<input name="email" type="email" placeholder="Email" required />
<textarea name="message" placeholder="Message"></textarea>
<button type="submit">Send</button>
</form>JavaScript submission
For a better user experience without page reloads, submit the form with JavaScript:
html
<form id="contact-form">
<input name="name" placeholder="Your name" required />
<input name="email" type="email" placeholder="Email" required />
<textarea name="message" placeholder="Message"></textarea>
<button type="submit">Send</button>
<p id="form-status" hidden></p>
</form>
<script>
const form = document.getElementById('contact-form');
const status = document.getElementById('form-status');
form.addEventListener('submit', async (e) => {
e.preventDefault();
const data = Object.fromEntries(new FormData(form));
try {
const res = await fetch('https://onsubmit.dev/f/YOUR_FORM_ID', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
if (res.ok) {
form.reset();
status.textContent = 'Thanks! We\'ll be in touch.';
status.hidden = false;
} else {
throw new Error('Submission failed');
}
} catch (err) {
status.textContent = 'Something went wrong. Please try again.';
status.hidden = false;
}
});
</script>File uploads
For forms with file inputs, use FormData directly:
javascript
form.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(form);
const res = await fetch('https://onsubmit.dev/f/YOUR_FORM_ID', {
method: 'POST',
body: formData, // Don't set Content-Type header
});
});