dbbasic-forms: Git-Native Form Builder
A simple, git-friendly form builder that stores everything in TSV files. Build forms, collect responses, export to CSV—all without a database.
Why This Exists
Form builders shouldn't cost $29/month. Your data shouldn't be locked in a SaaS platform. Forms are just tables, and tables are just TSV files.
Features
- Visual Form Builder: Drag-drop interface for creating forms
- TSV Storage: All data in human-readable text files
- Git-Friendly: Version control your forms and responses
- Admin Interface: Auto-discovered by dbbasic-admin
- CSV Export: One-click export to spreadsheet
- Zero Setup: No database, no configuration, just works
Installation
pip install dbbasic-forms
Requires Python 3.8+ and dbbasic-tsv.
Quick Start
Create a Form
from dbbasic_forms import FormBuilder
builder = FormBuilder()
contact_form = builder.create_form(
form_id="contact",
name="Contact Form",
description="Get in touch with us",
fields=[
{
"name": "name",
"type": "text",
"label": "Name",
"required": True
},
{
"name": "email",
"type": "email",
"label": "Email",
"required": True
},
{
"name": "message",
"type": "textarea",
"label": "Message"
}
]
)
Submit Responses
# From your web handler
form = builder.get_form("contact")
response_id = form.submit_response({
"name": "Alice Johnson",
"email": "alice@example.com",
"message": "Love your product!"
})
View Responses
# Get all responses
responses = form.get_responses(limit=10)
for response in responses:
print(f"{response['submitted_at']}: {response['email']}")
# Export to CSV
csv_data = form.export_responses_csv()
with open("responses.csv", "w") as f:
f.write(csv_data)
Data Format
Your forms and responses are stored in TSV files:
$ cat data/forms.tsv
id name description fields created_at
contact Contact Form Get in touch with us [{"name":"email"...}] 2024-01-15T10:30:00
$ cat data/responses_contact.tsv
id submitted_at name email message
resp_20240115... 2024-01-15T14:22:00 Alice Johnson alice@example.com Love your product!
This means you can:
- Debug with
tail -f data/responses_contact.tsv - Search with
grep alice data/responses_contact.tsv - Edit in Excel, Google Sheets, or vim
- Track changes in Git with meaningful diffs
Field Types
text- Single-line text inputemail- Email with validationtextarea- Multi-line textnumber- Numeric inputdate- Date pickerselect- Dropdown menuradio- Radio buttons (single choice)checkbox- Checkboxes (multiple choice)file- File upload (coming soon)
Admin Interface
dbbasic-forms integrates with dbbasic-admin for visual management.
The admin interface includes:
- Form builder with drag-drop fields
- Response viewer with filtering
- CSV export
- Form analytics
Install dbbasic-admin:
pip install dbbasic-admin
The forms interface is auto-discovered at /admin/forms.
Web Framework Integration
Flask Example
from flask import Flask, request, jsonify
from dbbasic_forms import FormBuilder
app = Flask(__name__)
builder = FormBuilder()
@app.route('/api/forms/<form_id>/submit', methods=['POST'])
def submit_form(form_id):
form = builder.get_form(form_id)
if not form:
return jsonify({"error": "Form not found"}), 404
response_id = form.submit_response(request.json)
return jsonify({
"success": True,
"response_id": response_id,
"message": form.settings["success_message"]
})
FastAPI Example
from fastapi import FastAPI, HTTPException
from dbbasic_forms import FormBuilder
app = FastAPI()
builder = FormBuilder()
@app.post("/api/forms/{form_id}/submit")
async def submit_form(form_id: str, data: dict):
form = builder.get_form(form_id)
if not form:
raise HTTPException(status_code=404, detail="Form not found")
response_id = form.submit_response(data)
return {
"success": True,
"response_id": response_id,
"message": form.settings["success_message"]
}
API Reference
FormBuilder
builder = FormBuilder(data_dir="data")
Methods:
create_form(form_id, name, description, fields, settings)→ Formget_form(form_id)→ Form | Nonelist_forms()→ List[Dict]delete_form(form_id)→ bool
Form
form = builder.get_form("contact")
Methods:
submit_response(response_data)→ str (response_id)get_responses(limit, offset)→ List[Dict]count_responses()→ intget_response(response_id)→ Dict | Nonedelete_response(response_id)→ boolupdate_form(name, description, fields, settings)→ boolexport_responses_csv()→ strto_dict()→ Dict
When to Use This
✅ Perfect for:
- Contact forms on static sites
- Feedback forms
- Event registrations
- Surveys and polls
- Internal tools (HR forms, IT requests)
- Prototypes and MVPs
❌ Not suitable for:
- High-volume transactional forms (>1K submissions/day)
- Payment forms (use Stripe Checkout)
- Multi-tenant SaaS applications
- Real-time collaboration
Rule of thumb: If your form responses can safely live in Git (because they're content, not transactions), use dbbasic-forms.
Deployment
Development
pip install dbbasic-forms
# Data is stored in ./data directory
# Commit to git: git add data/ && git commit -m "Add form data"
Production (Git-Based)
git clone https://github.com/yourorg/yourapp.git
cd yourapp
pip install -r requirements.txt
# Data is in the repo
# New responses append to TSV files
# Push updates: git add data/ && git commit && git push
Performance
- Form Creation: <1ms
- Response Submission: <5ms
- Query 10K Responses: ~100ms
- CSV Export (10K rows): ~200ms
Limits:
- Responses per form: 100K recommended, 1M maximum
- Fields per form: 50 recommended
Comparison
| Feature | dbbasic-forms | Google Forms | Typeform |
|---|---|---|---|
| Cost | Free | Free/Limited | $25+/mo |
| Data Ownership | ✅ | ❌ | ❌ |
| Git-Friendly | ✅ | ❌ | ❌ |
| Self-Hosted | ✅ | ❌ | ❌ |
| Visual Builder | ✅ | ✅ | ✅ |
| File Uploads | 🚧 | ✅ | ✅ |
Documentation
- Full Specification - Complete technical spec
- API Reference - Method documentation
- Examples - Code examples and demos
Contributing
Contributions welcome! See CONTRIBUTING.md for guidelines.
License
MIT License - see LICENSE for details.
Credits
Created by the AskRobots team as part of the dbbasic ecosystem.
Inspired by the philosophy that forms shouldn't require infrastructure.
Remember: The best form builder is the one you control.
Metadata
Release files for dbbasic-forms 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dbbasic_forms-1.0.1.tar.gz | 24.9 kB | Without provenance | Details for dbbasic_forms-1.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dbbasic_forms-1.0.1-py3-none-any.whl | Python 3 | none | any | Details for dbbasic_forms-1.0.1-py3-none-any.whl |
Total release size: 45.2 kB
Release files / dbbasic_forms-1.0.1.tar.gz
| Download URL | dbbasic_forms-1.0.1.tar.gz |
|---|---|
| Size | 24.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a26ef927ad6109e7253046ca3811c105186784725282128541c440b5696f8433
|
|
BLAKE2b-256 checksum How to use checksums |
e9a3eef8c8e656e75fa9ccca684034276cfdebf2cae439e73f2bf58ef854a4e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.1
|
Release files / dbbasic_forms-1.0.1-py3-none-any.whl
| Download URL | dbbasic_forms-1.0.1-py3-none-any.whl |
|---|---|
| Size | 20.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0bf83cfe24599b12cd9a763a9824f0cf559defecdbf1d89e57b1edd8e2a9563e
|
|
BLAKE2b-256 checksum How to use checksums |
57238edcae7fca746710ec87324b2cb9532da73fe9c256513724e403525b6b10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.1
|
Security for dbbasic-forms 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.