A file-based forms and polls app for Nextcloud. All form data is stored as .fvform files in your Nextcloud file system - no database tables required.
| Create Form | Edit Form | View Results |
|---|---|---|
![]() |
![]() |
![]() |
FormVox is available in:
- 🇬🇧 English
- 🇳🇱 Nederlands (Dutch)
- 🇩🇪 Deutsch (German)
- 🇫🇷 Français (French)
- Template Gallery - Quick access to create forms from colorful template cards
- Tabs Navigation - Switch between "Recent" and "My forms" views
- Form Cards - Visual cards with colored headers based on template type
- Collapsible Templates - Hide/show template gallery with state persistence
- Blank Form
- Poll
- Survey
- Registration
- Demo Form (showcases all features)
- Branding - Customize app appearance
- Statistics - View total forms, responses, and active users
- Telemetry - Optional anonymous usage statistics (opt-out available)
- Nextcloud 28 - 32
- PHP 8.1+
- Go to Apps in your Nextcloud instance
- Search for "FormVox"
- Click Download and enable
- Download the latest release from the releases page
- Extract to your Nextcloud apps directory:
cd /var/www/nextcloud/apps tar -xzf formvox-x.y.z.tar.gz - Set correct permissions:
sudo chown -R www-data:www-data formvox
- Enable the app:
sudo -u www-data php /var/www/nextcloud/occ app:enable formvox
- PHP 8.1+
- Node.js 18+
- npm
cd formvox
npm install
npm run buildnpm run build- Production buildnpm run watch- Development build with watch mode
FormVox stores all data in .fvform files (JSON format):
{
"version": "1.0",
"id": "uuid",
"title": "Form Title",
"description": "Form description",
"created_at": "2024-01-01T00:00:00+00:00",
"modified_at": "2024-01-01T00:00:00+00:00",
"settings": {
"anonymous": true,
"allow_multiple": false,
"expires_at": null,
"show_results": "after_submit",
"require_login": false
},
"questions": [...],
"pages": null,
"responses": [...]
}| Method | Route | Description |
|---|---|---|
| GET | /api/forms |
List all forms |
| POST | /api/forms |
Create new form |
| GET | /api/form/{fileId} |
Get form details |
| PUT | /api/form/{fileId} |
Update form |
| DELETE | /api/form/{fileId} |
Delete form |
| POST | /api/form/{fileId}/respond |
Submit response |
| GET | /api/form/{fileId}/export/csv |
Export to CSV |
| GET | /api/form/{fileId}/export/json |
Export to JSON |
| Method | Route | Description |
|---|---|---|
| GET | /public/{token} |
View public form |
| POST | /public/{token}/submit |
Submit response |
| GET | /public/{token}/results |
View results (if enabled) |
FormVox is designed to handle multiple simultaneous form submissions without data loss. When multiple users submit responses at the same time, a database-based locking mechanism ensures all responses are saved correctly.
How it works:
- Uses database locks via the
preferencestable with unique constraints - Implements retry mechanism with exponential backoff (30 retries, 100ms base delay)
- Uses Nextcloud's File API (
putContent) to ensure proper cache synchronization
Performance:
| Concurrent Requests | Success Rate |
|---|---|
| 20 simultaneous | 100% |
| 50 simultaneous | 80% |
For typical usage scenarios (users submitting forms seconds apart), all responses are guaranteed to be saved.
Public form submissions are rate-limited to 100 requests per hour per IP address to prevent abuse.
FormVox includes optional anonymous telemetry to help improve the app. This can be disabled in Admin Settings.
What we collect (when enabled):
- Number of forms and responses
- Number of active users
- FormVox, Nextcloud, and PHP version numbers
- A unique hash of your instance URL (privacy-friendly identifier)
What we never collect:
- Form content or titles
- Response data or answers
- User names or email addresses
- Your actual server URL
AGPL-3.0 - See LICENSE for details.
Developed by Sam Ditmeijer & Rik Dekker

















