All notable changes to FormVox will be documented in this file.
- Pricing removed from admin Support tab — The Support tab no longer hardcodes subscription tiers and prices. A single "View pricing & plans" button now links to voxcloud.nl/pricing/#formvox where pricing is maintained. Reason: keeping prices in the app required a new App Store release for every price change (review time: days to weeks); the website can be updated instantly. The Support tab now focuses on installation state, organization details, and subscription-key management.
- Telemetry transparency expanded — The "What we collect" list in the Anonymous Usage Statistics section now accurately reflects every field actually sent in the telemetry payload, including the organization name and contact email (only sent if filled in by the admin) and the new Extended Support flag (see below). The previous list omitted these fields.
- Extended Support / Enterprise flag in telemetry — The telemetry payload now includes
hasExtendedSupport, sourced from Nextcloud's publicOCP\Util::hasExtendedSupport()API (NC 17+). Returns false on any failure so a Community instance is never reported as Enterprise. The license key is sent alongside so the license server can cross-check the claim against an active subscription — the boolean alone is unauthenticated and could otherwise be spoofed. Required for the Nextcloud ISV partnership where bundled-license customers need automatic recognition. - Description links open in a new tab — Links in form, section and question descriptions now open in a new browser tab with
rel="noopener noreferrer", so respondents don't lose their in-progress form when they click a reference link. (#87)
- "What a subscription includes" checklist with green checkmarks — content moved to voxcloud.nl/pricing/#formvox.
- Hardcoded pricing tiers (Free + €19/€59/€139/year + Contact us) — content moved to voxcloud.nl/pricing/#formvox.
- Standalone "Learn more about FormVox" contact block at the bottom of the Support tab — replaced by an inline "Questions? info@voxcloud.nl" link next to the new pricing CTA.
- Submit failed on password-protected public forms — After entering the share password the user could open the form but every submit was rejected with "Password required" because the frontend never replays the password on subsequent requests. The authenticate flow now sets a signed, HMAC-protected
formvox_pw_<fileId>cookie (1 h validity,SameSite=Lax) which the share-gate accepts as proof of password possession on submit and upload. (#82) - Date picker selected the day before in non-UTC time zones — Picking 17 May in CEST was serialised as
2026-05-16because the previous implementation calledtoISOString()(UTC) on aDateconstructed at local midnight. Date questions now serialise using local Y-M-D and parseYYYY-MM-DDstrings into a local-midnightDateso the displayed date always matches the picked date. (#80, #89) - CSV export still fragmented in Excel —
fputcsv()used PHP's default\nrecord separator while in-cell newlines were normalised to\r\n, producing mixed line endings that some Excel versions interpreted as a new row inside a quoted cell. Both writes now use the expliciteol: "\r\n"argument so record terminators and in-cell newlines are consistent CRLF. (#83) - Question labels shoved sideways in Microsoft Edge — The flex container holding a question label and the TTS button could grow horizontally beyond its parent in Edge when the label was long. The label is now a shrinkable flex item (
flex: 1 1 auto; min-width: 0) withoverflow-wrap: break-wordand the row allows wrapping, matching the layout other browsers already produced. (#84) - "Move to section" did nothing when Pages were enabled — The pages-mode draggable did not listen for the
move-to-sectionevent from the question overflow menu, and questions dragged under a section header did not become visually nested because the wrapper that applies the indent style was only rendered in single-page mode. Both code paths now match: dropdown moves work, drag-into-section auto-assigns thesectionId, and dragging a section header carries its children with it on the same page. (#88)
- Bot protection that works behind NAT — Public form submissions are now protected by an ALTCHA-style proof-of-work challenge solved in the user's browser, replacing per-IP rate limiting as the primary anti-bot defense. Cost is paid per browser, so an organisation with hundreds of users behind a single NAT IP all submit without throttling. The challenge is invisible to legitimate users (~50–150 ms of work in a Web Worker), self-hosted (no third-party service, no external JS, no API keys, GDPR-clean), and adapts difficulty to the per-form submit rate so attackers pay more under load. The signature is bound to the form's file ID so a challenge issued for one form cannot be reused on another. Single-use replay protection via Nextcloud's distributed cache (Redis) with APCu fallback for single-server installs. (#76)
- Anonymous submit rate limit raised from 100/hour to 25 000/hour — With ALTCHA now the primary defense, the per-IP limit becomes a wide safety net rather than the front line. The new ceiling comfortably accommodates large-organisation peaks (think 10 000 employees filling in a training evaluation in one hour) while still bounding pathological abuse if the cache backend goes down.
- Form description rendered as plain text on the public form — The form description on the public response page now renders as markdown instead of literal text with the raw
#/*characters and collapsed newlines. Headings, lists, links, code, and blockquotes in the form description, section descriptions, and the in-editor markdown preview all render with proper visual styling. (#63) - "Form not found" / "Access forbidden" for logged-in respondents on restricted folders — When a public form had
require loginenabled and was stored in a Group Folder or Team Folder the respondent was not a member of, the submission failed because the authenticated submit path used a user-context file load. Authenticated respondents now use the same admin-bypass loader as anonymous submissions, so the share link plus token (and anyallowed_users/allowed_groupsrules) are the only gate — no folder ACL needed. (#77)
- Markdown editor for descriptions — Form description and per-question/section descriptions now use a native Nextcloud-style markdown editor (EasyMDE) with a toolbar for bold, italic, headings, lists, links, images, and preview. Includes a custom drag handle to resize the editor vertically.
- Form editor layout redesign — Top-level form actions (Edit/Preview tabs, Share, Results, and the Pages/Branding/Settings overflow menu) now live in a sticky page header at the top of the editor, instead of a horizontal bar that visually appeared to belong to the form description. Question and section creation moved to a dedicated "+ Add question" rail below the question list — the spot where the cursor naturally lands after editing the previous question.
- Conditional logic broke for multiple-choice answers —
showIfevaluation now correctly handles array answers from multiple-choice/checkbox questions in both the frontend evaluator and PHP backend, instead of comparing the whole array against a single value. (#71) - CSV export of table answers showed internal column ids — Table-type answers in CSV exports now use the column labels from the form definition instead of internal column ids. (#70)
- Orphaned fields persisted after question type change — Switching a question's type (e.g. from
scaletotext) now strips type-specific fields (options, scale bounds, rating, matrix, table, file, validation, date bounds) so the saved question matches its new type. (#69) - Newlines in answers broke CSV row alignment — Long-text answers containing newlines are now normalised to
\r\nper RFC 4180 before being written to CSV, so spreadsheets parse rows correctly. (#65)
- Description textareas overlap question actions when resized — The question description and section description textareas in the form editor no longer have a resize handle, preventing them from growing over the per-question action buttons (edit/delete/drag) when dragged. Matches the existing behaviour of the top-level form description. (#62)
- Webhook "Enabled" toggle unresponsive — The enable/disable switch in Share → Advanced Settings → Integrations now correctly reflects its state and persists changes. Previously the switch used a deprecated Vue prop API (
:checked/@update:checked) which silently sentundefinedto the backend, disabling webhooks without feedback. (#61) - Admin statistics no longer crash on user-backend errors —
getUserCount()now wrapscallForAllUsers()in a try/catch and falls back to1if the user backend throws (e.g., LDAP timeout), keeping the admin stats page, license usage reporter, and telemetry job running.
- License usage reports now include
activeUsers30d— The daily license sync (/api/licenses/usage) now carries the same active-user metric that telemetry already reports, giving the license server full visibility of active instance usage.
- CSV export garbled German/special characters — CSV export now includes a UTF-8 BOM so Excel on Windows correctly recognises the encoding (#57)
- Results chart legend shows internal option IDs — The chart legend now uses the same label mapping as the charts themselves (#58)
- Unanswered questions blank in Results — Unanswered questions now show "Not answered" (translated) instead of a blank dash (#58)
- External storage support — Forms stored on external storage mounts (SMB, SFTP, S3, local mounts) can now be loaded via public share links (#55)
- Updated
fast-xml-parserfrom 5.5.7 to 5.7.1 (fixes malicious CDATA/comment sanitization and stack overflow on long tag expressions)
- AI form generation — Generate forms from a description, an uploaded document (PDF/DOCX/ODT/text), or both, using Nextcloud's built-in TaskProcessing API. Async pattern identical to nextcloud/assistant: the request returns immediately with a task id, the frontend polls, and a background
TaskSuccessfulEventlistener materialises the form and sends a Nextcloud notification even if the user closes the browser tab. Includes heuristic truncated-JSON repair for less capable LLMs. - AI conditional logic — The AI may add
showIfconditions on generated questions when a follow-up is genuinely only relevant given a prior answer. Values are snapped to existing option values; forward references and circular dependencies are rejected by construction. - AI admin panel — New "AI" tab in FormVox admin settings with provider-availability status (live-detected task type), per-instance enable/disable toggle, max-questions-per-form slider (3-20), max source-document size slider (1-25 MB), and toggles for source-document upload and conditional logic features.
- Scheduled opening (
share_starts_at) — Share links can be scheduled to open in the future. Before the start time, visitors see a "This form is not yet open — opens at {date}" page; submissions/uploads are blocked server-side on all public endpoints. - Per-form branding logo uploads — Logo and image blocks in per-form branding now upload to
.formvox-branding-{fileId}/next to the.fvformfile (mirrors the.formvox-uploads-pattern), travel along on form move, and are cleaned up on form delete (#53) - Result summary shows labels — Radio/choice questions in the Results summary chart and legend now show the option label instead of the internal id (#52)
- Full translations (EN, NL, DE, FR) — 43 new user-facing strings for the AI flow, AI admin panel, scheduled opening and "not yet open" page are fully translated in all four supported languages
- Share link date pickers don't persist changes — Changing the expiration or opening date in the Share dialog now debounces and saves automatically instead of discarding the new value on reload
- Notification icons missing on mobile/desktop clients — All FormVox notifications now emit an absolute icon URL (#54)
- AI form generation is off by default until the admin enables it (unless a provider was already installed when the admin first visits the AI tab, in which case it's enabled automatically for convenience)
- Telemetry error feedback: The "Send report now" button now shows the actual server error message (e.g., rate limit, connectivity issue) instead of silently failing
- Updated
dompurifyandfollow-redirectsdependencies to fix moderate security vulnerabilities
- Team folder support — Forms stored in Nextcloud Team Folders with object storage backends can now be loaded via public share links (#49)
- Native date/time pickers — Share link expiration and
datetimequestion answers now use two separate native fields (date + time) side-by-side for a consistent, accessible experience (#48)
- Share link expiration date picker not working — The expiration picker now correctly captures selected dates and times (#48)
- Forms saved in team folders cannot be displayed —
FormService::getFileByIdPublicnow recognizes theobject::groupfolder:storage pattern (#49)
- Security improvements to the public submission flow (token handling and share-link gating)
- Support tab in admin settings — New "Support" tab in the FormVox admin panel with subscription pricing, installation statistics, organization contact fields, and license key management
- License key management — Admins can enter and activate a
FVOX-subscription key, which is validated against the VoxCloud license server. The key is displayed masked and can be removed at any time - Installation statistics in Support tab — Shows total forms, total responses, and total users directly in the admin panel
- License banner — An info banner appears at the top of the admin panel when the installation exceeds the free tier limits (25 forms or 50 users) and no valid subscription key is configured. A warning banner is shown when a subscription key is invalid or expired
- Organization contact fields — Admins can optionally save an organization name and contact email to be associated with their subscription
- Background license sync — A daily background job validates the license and reports usage to the VoxCloud license server, with per-instance jitter to spread server load
- Telemetry section moved to Support tab — The anonymous usage statistics section has been moved from the Statistics tab to the Support tab for better discoverability
- Full translations (EN, NL, DE, FR) — All Support tab strings are fully translated in all four supported languages
- Statistics tab simplified — The "About FormVox" blurb and anonymous usage statistics section have been moved to the Support tab, keeping the Statistics tab focused on form and response counts
- Sections / fieldsets — Group questions into collapsible sections with an optional title, description, and conditional display (
showIf). Entire sections can be shown or hidden based on answers (#38) - Markdown in section descriptions — Section descriptions support Markdown including images (
) - Drag & drop into sections — Drag questions into a section;
sectionIdis auto-assigned based on position - "Move to section" menu item — Assign a question to a section via the
...menu - Specify notification recipients — Form owners can now select which users or groups receive a Nextcloud notification when a response is submitted (#46)
- Form not submitted for logged-in users — Forms with login requirement now correctly save responses without requiring edit-level share permissions (#43)
- Scroll broken on public form — Added
overscroll-behavior: autoto override Nextcloud's layout scroll capture, restoring mouse wheel scroll on Windows/Chrome/Edge (#44) - CSV export shows option IDs instead of labels — CSV export now outputs human-readable option names instead of internal IDs (#41)
- Images embedded in ODT exports — Uploaded image files are now embedded directly in the ODT document (#45)
- Toolbar layout — Editor toolbar splits into left (content actions) and right (view/share actions); labels hide when space is tight
- "Add page" moved to
...menu — Keeps the toolbar compact when pages are enabled - odf-kit updated to v0.9.4 — Picks up latest fixes from upstream
- ODT template export — Upload a custom ODT template with placeholders like
{Q1},{Q2},{form_title}, etc. Responses are automatically filled into your template when exporting as ODT (#23) - Template auto-detection — "Export ODT" now automatically uses the uploaded template if one exists, removing the need for a separate export option
- Template portability — ODT templates follow the form when moved between folders and are cleaned up when the form is deleted
- Table question type — New "Table" question with configurable columns (text, number, date, dropdown) and dynamic rows. Ideal for expense declarations, item lists, and structured data collection (#35)
- Notification on new responses — Form owners receive a Nextcloud notification when someone submits a response. Toggle on/off per form in Share settings
- Wider form layout — Public form container increased from 700px to 960px for better readability
- TelemetryJob crash — Background job crashed with
fetchAssociative()not found on Nextcloud'sResultAdapter. Changed tofetch()(#31) - External API missing pages/pageOrder — API response now includes
pagesandpageOrderfields (#27) - Required matrix not validated on page navigation — Users could skip to the next page without filling required matrix questions (#34)
- Required matrix accepting one row — Matrix questions marked as required now require all rows to be answered (#25)
- Horizontal scrolling blocked for wide matrix tables — Matrix tables now scroll horizontally within the form container (#28)
- Multiple file uploads broken — File metadata was lost for multi-file uploads, showing only filenames instead of clickable links in results (#36)
- Multi-file upload count incorrect — File count now shows total number of files, not number of responses
[object Object]in ODT export — Multi-file answers now display filenames correctly in ODT exports- Webhook creation failing — Fixed parameter binding for webhook creation endpoint
- Form hard to read in dark mode — Public form templates had hardcoded light background colors that overrode dark mode CSS variables, making text unreadable (#39)
- Presence endpoints moved to PresenceController — Collaborative editing presence heartbeat and editor list moved from
ApiControllerto dedicatedPresenceControllerfor cleaner separation - FormDeletedListener extended — Now also cleans up ODT template folders when a form is deleted
- Form submits on Enter key in multi-page forms - Pressing Enter in a text input triggered the browser's native form submit event, bypassing page navigation and submitting the form even on page 1 of a multi-page form. The submit handler now checks for remaining pages and navigates forward instead of submitting (#21)
- Single choice / multiple choice / dropdown options have no value - Option values were never populated when creating questions in the editor (always empty string
""), making all options indistinguishable. Radio buttons, checkboxes, dropdowns, and conditional rules all failed because every option had the same empty value. Now generates a unique value (based on option ID) for each option. Existing forms with empty values are automatically migrated on load (#16, #18)
- Translation .js runtime files not updated - The v0.3.5 release fixed placeholder names in
.jsonfiles but not in the corresponding.jsfiles that Nextcloud actually loads at runtime viaOC.L10N.register(). All broken placeholder names are now also fixed inde.js,nl.js, andfr.js(#22) - Single choice / checkbox questions not selectable - Confirmed fix was present in source since v0.3.2 but may not have been correctly included in the v0.3.4 App Store tarball. This release ensures the correct compiled JavaScript is shipped (#18)
- Form submits instead of going to next page on multi-page forms - Previous and Next buttons were missing
native-type="button", causing the browser to treat them as submit buttons inside the form element. Clicking Next triggered both page navigation and form submission simultaneously (#21) - Translation placeholders not interpolated - Placeholder names in German, Dutch and French translations used translated names (e.g.
{aktuell},{huidig},{courant}) instead of the original variable names. Vue'st()function only substitutes exact matches, so the raw placeholder text was shown instead of the actual value (#22) - Screenshot filenames with spaces - Renamed all screenshot files to use hyphens instead of spaces and updated
info.xmlURLs accordingly to improve compatibility
- Date/time range restrictions - Set minimum and maximum allowed values for Date, DateTime, and Time questions (#15)
- Date/DateTime: NcDateTimePicker-based min/max selectors in question settings
- Time: native time input for earliest/latest allowed time
- Client-side and server-side validation with clear error messages
- Date picker automatically restricts selectable dates to the allowed range
- Markdown support in descriptions - Question descriptions now render Markdown formatting (#5, #6)
- Bold, italic, links, images, lists, headings, and more
- Images in descriptions are rendered inline with responsive sizing
- External HTTPS images allowed via Content Security Policy
- Links are auto-linked and clickable
- Answer piping (
{{Q1}}) still works alongside Markdown - TTS (text-to-speech) strips Markdown syntax for natural speech output
- Condition editor date/time picker - Condition value inputs now auto-detect the question type and show the appropriate picker (date picker, datetime picker, or time input) instead of a plain text field
- Date comparison in conditions not working - "Greater than" and "Less than" operators on date questions always evaluated to false because date strings (e.g.
2026-03-12) were converted withNumber()resulting inNaN. Now correctly compares date strings lexicographically (#19) - Question reordering not visible to respondents - Dragging questions to a new position in the editor was saved correctly, but the public form still displayed questions in their original creation order. Fixed by using the page's question ID order instead of the form's question array order (#20)
- Public form scrolling broken on some Nextcloud setups - Contradictory CSS
overflow: visiblecombined withoverflow-x: hidden/overflow-y: autocaused scroll to break per CSS spec. Removedoverflow: visiblefrom all public templates (#17)
- Single choice questions broken - All radio buttons were pre-selected and user selection didn't work. Fixed incorrect NcCheckboxRadioSwitch API usage:
model-valuenow receives the selected value string instead of a boolean (#16) - Multiple choice questions broken - Clicking one checkbox selected all options. Fixed by passing an array as
model-valuewith proper:nameand:valueprops for NcCheckboxRadioSwitch's array management (#16) - Dropdown selection not registering - Dropdown questions showed validation errors even when answered. Root cause was the same NcCheckboxRadioSwitch misuse in the underlying component (#16)
- Matrix radio buttons broken - Matrix question type had the same boolean vs string model-value issue (#16)
- Added missing translations for all 0.3.0 features (page routing, collaborative presence, draft autosave, QR code, accessibility) in NL, DE, FR
- Accessibility (a11y) improvements for public form response pages
- Text-to-Speech (TTS) - Speaker icon per question to read question text, description, and answer options aloud using the Web Speech API
- Toggle behavior: click to start reading, click again to stop
- Language automatically detected from Nextcloud user locale
- Visual feedback on speaker button while reading (color change)
- ARIA attributes on all question types for screen reader support
role="group"witharia-labelledbyon every questionaria-required,aria-invalid,aria-describedbyon all input fieldsrole="radiogroup"for single choice, scale, and rating questionsrole="alert"on validation error messagesaria-live="polite"on page indicator and submission statusaria-live="assertive"on form error messagesaria-labelon file upload zone, remove buttons, and matrix radio buttonsscope="col"/scope="row"on matrix table headers
- Keyboard navigation for custom controls
- Arrow keys (left/right/up/down) to navigate scale and star rating buttons
- Home/End keys for first/last option
- Enter/Space to activate file upload zone
- Roving tabindex (WAI-ARIA radiogroup pattern) on scale and rating
- Focus management
- On validation error: scroll to and focus first question with error
- On page navigation: focus first question on new page
- After submission: focus thank-you page for screen reader announcement
- TTS automatically stops on page navigation and form submission
- Skip link - "Skip to form questions" link (visible on Tab focus) to bypass headers
- Per-question inline validation errors alongside global error banner
- Screen reader-only status announcements for submission progress
- Conditional page routing - Skip to specific pages based on answers in multi-page forms
- Configure routing rules per page in the editor (If question → operator → value → go to page)
- Operators: equals, not equals, contains, is empty, is not empty, greater than, less than
- Falls back to linear navigation when no rule matches
- Back button navigates through the routed path (not just previous page number)
- QR code generation - QR code in the Share dialog for form links
- Auto-generated when a share link is created
- Download as PNG with form title in filename
- Draft autosave - Automatically saves form responses in the browser (localStorage)
- Respondents can resume where they left off after closing the browser
- "Welcome back" banner with Continue / Start over options
- Drafts expire after 7 days and are cleared on successful submission
- Collaborative editing presence - See who else is editing a form
- Avatar indicators in the editor toolbar showing active editors
- Heartbeat-based presence detection (30-second polling)
- TTS language now uses browser language instead of Nextcloud instance language
- Nextcloud 33 support - App now supports Nextcloud 28 through 33
- Replaced deprecated
IResult::fetch()withfetchAssociative()in StatisticsService
- Mimetype registration breaking all file types - FormVox's MIME type registration in
Application::boot()populatedMimeTypeDetector::$mimeTypesbefore core defaults were loaded, causing Nextcloud to lose mimetype detection for images, PDFs, and all other file types (#12)- After updating, run
occ maintenance:mimetype:update-dbandocc maintenance:mimetype:update-jsto restore mimetypes
- After updating, run
- Question color coding - Assign colors to individual questions for visual organization
- 7 color options (blue, green, orange, red, purple, cyan, brown)
- Color indicator in question header with dropdown picker
- Colored left border on questions in editor and public forms
- Custom regex validation per question with custom error messages
- Define validation patterns (e.g., postal codes, license plates, phone numbers)
- Custom error messages when validation fails
- Real-time validation feedback on form submission
- Response limits - Set maximum number of responses per form
- Custom "form closed" message when limit is reached
- Live counter showing current vs max responses
- Share dialog reorganization
- Response settings and Link settings are now always visible (not collapsed)
- Embed code, API & Webhooks, and Responses moved to collapsible "Advanced" section
- Cleaner, more intuitive settings layout
- Scroll issues on public forms caused by password manager browser extensions
- Fixed for LastPass, Bitwarden, 1Password, and similar extensions
- Added CSS workarounds for extension-injected elements
- Improved scroll compatibility for Nextcloud 28+ public page layout
- Nextcloud 33 compatibility - Fixed deprecated
OC_App::getAppPath()call
- Microsoft Forms Import - Import forms directly from Microsoft Forms
- OAuth integration with Microsoft Entra ID (Azure AD)
- Import form structure including all question types
- Import existing responses
- Support for multi-page forms (sections)
- Support for Likert/Matrix questions
- Admin settings for Azure app registration configuration
- Per-user Microsoft account connection
- Question type mapping: Choice, Text, Rating, Date, Likert, Ranking, NPS, File upload
- New "Import" card in template gallery (visible when MS Forms is configured)
- Import wizard with form selection, preview, and progress tracking
- Admin settings now include "Integrations" tab for Microsoft Forms configuration
- Improved documentation for Azure app registration setup with required API permissions
- PreviewProvider regex pattern fix (preg_match delimiter error)
- External API for programmatic access from third-party systems
- API key authentication with bcrypt-hashed storage
- Configurable permissions per key (read_form, read_responses, write_responses, delete_responses)
- CRUD operations on form responses
- API keys automatically stripped when downloading .fvform via WebDAV
- Webhooks for real-time notifications
- Events: response.created, response.updated, response.deleted
- HMAC-SHA256 signed payloads for security
- Configurable per-form with enable/disable toggle
- New "API & Integrations" section in Share dialog for managing API keys and webhooks
- Comprehensive External API & Webhooks documentation in
docs/architecture/external-api.md
- Admin settings page no longer blocks on statistics loading (statistics are now fetched async)
- Consistent app icon (
app-dark.svgnow matchesapp.svgstructure)
- File upload question type with configurable allowed file types and size limits
- Download all uploads as ZIP from Results view
- DAV plugin to strip sensitive data from .fvform files on download (responses, settings, tokens)
- Form embedding: embed forms in external websites (SharePoint, intranets, etc.) via iframe
- Embed code generator in Share dialog with responsive width and height options
- Admin setting to restrict embedding to specific domains (Settings tab)
- Editor toolbar redesign: Preview, Share, Results buttons now prominent; less-used options in dropdown
- Editor header redesign: cleaner look with underline focus states
- Question cards redesign: hover effects, focus states, modernere look
- Description fields now use multi-line textarea instead of single-line input
- Improved spacing and visual hierarchy throughout editor
- Required questions now clearly marked with red asterisk and "(required)" label on public forms
- Hide .fvform files now properly hidden from sync clients while remaining visible in web interface
- Uploaded files are now deleted when their response is deleted
- Icon vertical alignment in dropdown menus
- Suppress @nextcloud/vue appName/appVersion warnings in console
- Comprehensive documentation structure in
docs/folder- User guides (creating forms, question types, advanced features, sharing, results, exporting)
- Admin guides (installation, configuration, security)
- Architecture docs (overview, file format, API reference, comparison with Nextcloud Forms)
- Pre-commit hook to prevent accidental commit of private keys
- Security: Added
*.keyand*.pemto.gitignore
- Updated README with correct build commands and documentation links
- Updated authors in README (Sam Ditmeijer & Rik Dekker)
- Deprecated monolithic
docs/user-guide.md(replaced by structured docs) - Deprecated
docs/comparison-with-nextcloud-forms.md(moved todocs/architecture/)
- Added website and documentation links to App Store listing
- Updated authors in App Store metadata (Sam Ditmeijer & Rik Dekker)
- Added screenshots to App Store listing
- Total users count in telemetry data (consistent with other VoxCloud apps)
- Complete translations for Dutch (NL), German (DE), and French (FR)
- 380 translation strings per language
- Template gallery on homepage with colored template cards (Survey, Poll, Registration, Demo, Blank)
- Collapsible template section with state persistence in localStorage
- Form cards with colored headers based on template type
- Tabs navigation (Recent, My forms) with counts
- Delete confirmation dialog using Nextcloud Vue NcDialog
- File-based permission system using Nextcloud's native file permissions
- New FilePermissionController for permission checks via
/api/permissions/{fileId} - User/group access restrictions for public forms (restrict response access to specific Nextcloud users and/or groups)
- Telemetry now includes
totalUsersfield alongsideactiveUsers30d - Demo form templates (survey, poll, registration, demo) are now fully translatable via IL10N
- Removed sidebar navigation, moved "New form" button to header
- Template gallery title changed from "Explore templates" to "New form"
- Clicking template card now opens modal with pre-selected template and location picker
- Modal no longer shows template selection (template already chosen by card click)
- Permission system now respects Nextcloud share permissions (read-only shares can't edit forms)
- Form filename now automatically updates when form title is changed
- Public form mobile responsiveness (horizontal scroll issues)
- Dark mode support on public forms (inputs now readable)
- Date picker and DateTime picker popup visibility on public forms
- Time input alignment on public forms
- Favorites functionality (temporarily removed due to API issues)
- Admin settings with tabs (Branding, Statistics)
- Form statistics overview (total forms, responses, active users)
- Anonymous telemetry with opt-out option
- Background job for telemetry reporting
- App icons now follow Nextcloud standards (navigation bar, app store, dark theme)
- Simplified "About FormVox" section in admin settings
- File-based forms storage (.fvform files)
- Multiple question types: text, textarea, single choice, multiple choice, dropdown, date, time, number, scale, rating, file upload, matrix
- Conditional logic (branching)
- Quiz mode with scoring
- Export to CSV, JSON, Excel
- Native Nextcloud sharing integration
- Public form links with password protection and expiration dates
- Per-form branding with visual page builder
- Answer piping (use previous answers in later questions)
- Charts and visualizations in Results view
- Pagination in Individual responses view
- Files app integration with filetype icons
- Folder picker for creating new forms
- Comprehensive user guide documentation
- End-to-end encryption compatible