{"id":339025,"date":"2026-07-29T16:23:48","date_gmt":"2026-07-29T16:23:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/data-maker-forms\/"},"modified":"2026-07-29T16:23:22","modified_gmt":"2026-07-29T16:23:22","slug":"fobo-data-maker-forms","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/fobo-data-maker-forms\/","author":23513671,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.2","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"FOBO Data Maker Forms","header_author":"FOBO","header_description":"Renders Data Maker forms from signed .dmf uploads. POSTs sealed submissions to the Data Maker API; supports the localStorage-backed edit flow.","assets_banners_color":"0a3c6b","last_updated":"2026-07-29 16:23:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/fobo-tools.com\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":16,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"chivantiebosch","date":"2026-07-29 16:23:22"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3627468,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3627468,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3627468,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3627468,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"fobo\/data-maker-form":{"name":"fobo\/data-maker-form","title":"FOBO Data Maker Form"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3627468,"resolution":"1","location":"assets","locale":"","width":1292,"height":2194},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3627468,"resolution":"2","location":"assets","locale":"","width":1292,"height":1750},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3627468,"resolution":"3","location":"assets","locale":"","width":2560,"height":1800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3627468,"resolution":"4","location":"assets","locale":"","width":2560,"height":1800}},"screenshots":{"1":"A designer-themed RSVP form rendered on the front end, with a background image, custom fonts, and choice fields.","2":"A petition form with a signature pad and a Markdown-enabled comments field.","3":"The Forms admin screen: every uploaded .dmf listed with its shortcode, signing status, and upload date.","4":"Uploading a signed .dmf bundle and giving it a shortcode slug."}},"plugin_section":[],"plugin_tags":[273710,601,37260],"plugin_category":[42],"plugin_contributors":[273711],"plugin_business_model":[],"class_list":["post-339025","plugin","type-plugin","status-publish","hentry","plugin_tags-datamaker","plugin_tags-forms","plugin_tags-renderer","plugin_category-contact-forms","plugin_contributors-chivantiebosch","plugin_committers-chivantiebosch"],"banners":{"banner":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/banner-772x250.png?rev=3627468","banner_2x":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/banner-1544x500.png?rev=3627468","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/icon-128x128.png?rev=3627468","icon_2x":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/icon-256x256.png?rev=3627468","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/screenshot-1.png?rev=3627468","caption":"A designer-themed RSVP form rendered on the front end, with a background image, custom fonts, and choice fields."},{"src":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/screenshot-2.png?rev=3627468","caption":"A petition form with a signature pad and a Markdown-enabled comments field."},{"src":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/screenshot-3.png?rev=3627468","caption":"The Forms admin screen: every uploaded .dmf listed with its shortcode, signing status, and upload date."},{"src":"https:\/\/ps.w.org\/fobo-data-maker-forms\/assets\/screenshot-4.png?rev=3627468","caption":"Uploading a signed .dmf bundle and giving it a shortcode slug."}],"raw_content":"<!--section=description-->\n<p>The FOBO Data Maker Forms plugin lets you host Data Maker forms on a WordPress site. Upload a signed <code>.dmf<\/code> bundle, paste the shortcode onto any page, and submissions are sealed against the form's recipient pubkey and forwarded to the Data Maker API.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Full parity with the desktop renderer for the v1 column set: text, number, date, choice, multi-choice, checkbox, attachment, image, divider, spacer, group, rich-text, heading, button.<\/li>\n<li>Pre-compiled VisibleWhen \/ CalculatedExpression \/ ValidationRule expressions ship with the .dmf, so cascade fires entirely in the browser \u2014 no server round-trip per keystroke.<\/li>\n<li>libsodium-backed sealed submissions; the WP server never sees plaintext values once they leave the browser.<\/li>\n<li>Optional browser-localStorage edit flow lets submitters return and amend their previous submission via a one-time edit token.<\/li>\n<li>Theme switch: use the form's own Data Maker palette, or inherit the active WordPress theme.<\/li>\n<\/ul>\n\n<p>Out of scope for v1: multi-step (Steps), signature\/initials fields, relation fields, charts, nested record entry.<\/p>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>PHP 8.1+ with the <code>sodium<\/code> extension (default in PHP 7.2+).<\/li>\n<li>The <code>zip<\/code> extension.<\/li>\n<li>HTTPS on the WordPress site is strongly recommended.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the following third-party services. No data is sent to any of them until a visitor submits a form, or until an administrator turns on the optional Turnstile feature.<\/p>\n\n<p><strong>Data Maker API<\/strong> (<code>https:\/\/datamaker-api.fobo-tools.com<\/code>)\nThe form's destination. When a visitor submits a form, the plugin seals (end-to-end encrypts) the submitted values against the form publisher's public key in the browser and POSTs the sealed blob plus minimal metadata (the form id, schema version, and a submission timestamp) to this endpoint, which routes it to the form's publisher. The WordPress server never sees the plaintext field values. File attachments are encrypted in the browser and PUT directly to the publisher's storage via a short-lived upload slot issued by this API. This service is operated by FOBO Tools.\nTerms: https:\/\/fobo-tools.com\/terms \u2014 Privacy: https:\/\/fobo-tools.com\/privacy<\/p>\n\n<p><strong>Cloudflare Turnstile<\/strong> (<code>https:\/\/challenges.cloudflare.com<\/code>)\nA privacy-friendly CAPTCHA, used only on forms where an administrator has enabled the per-form Turnstile toggle. When enabled, the visitor's browser loads Cloudflare's widget script and obtains a challenge token; that token is sent with the submission and verified server-side against Cloudflare's <code>siteverify<\/code> endpoint before the submission is sealed. No form field values are sent to Cloudflare. This service is operated by Cloudflare, Inc.\nTerms: https:\/\/www.cloudflare.com\/website-terms\/ \u2014 Privacy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<h3>Content Security Policy<\/h3>\n\n<p>The renderer evaluates pre-compiled VisibleWhen \/ Calculated \/ Validation expressions on the client at every keystroke. The compiled bodies are plain JavaScript and run via <code>Function(...)<\/code> constructor, which a strict <code>Content-Security-Policy: script-src 'self'<\/code> header rejects.<\/p>\n\n<p>If the host site ships a CSP header, allow:<\/p>\n\n<ul>\n<li><code>script-src 'self' 'unsafe-eval'<\/code> \u2014 to permit the compiled expression evaluator.<\/li>\n<li><code>script-src 'self' https:\/\/challenges.cloudflare.com<\/code> \u2014 if the per-form Turnstile toggle is on (Cloudflare's widget loads from this origin).<\/li>\n<li><code>connect-src 'self' https:\/\/datamaker-api.fobo-tools.com https:\/\/challenges.cloudflare.com<\/code> \u2014 for the sealed submit endpoint and the Turnstile siteverify call.<\/li>\n<li><code>frame-src https:\/\/challenges.cloudflare.com<\/code> \u2014 for the Turnstile iframe.<\/li>\n<\/ul>\n\n<p>Sites that cannot grant <code>'unsafe-eval'<\/code> can still upload forms with no VisibleWhen \/ Calculated \/ per-field Validation expressions; static layouts work without the expression evaluator running.<\/p>\n\n<h3>Source code and build<\/h3>\n\n<p>This plugin ships its complete, human-readable source. The minified files under <code>assets\/dist\/<\/code> are build artifacts only \u2014 their unminified sources sit beside them and are what you edit:<\/p>\n\n<ul>\n<li><code>assets\/renderer.js<\/code> builds <code>assets\/dist\/renderer.min.js<\/code><\/li>\n<li><code>assets\/fn.js<\/code> builds <code>assets\/dist\/fn.min.js<\/code><\/li>\n<li><code>assets\/wp-bridge.js<\/code> builds <code>assets\/dist\/wp-bridge.min.js<\/code><\/li>\n<li><code>assets\/styles.css<\/code> builds <code>assets\/dist\/styles.min.css<\/code><\/li>\n<li><code>assets\/layout.css<\/code> builds <code>assets\/dist\/layout.min.css<\/code><\/li>\n<\/ul>\n\n<p>Regenerate them with <code>make minify<\/code>, which runs Terser 5.36.0 and csso-cli 4.0.2 \u2014 both versions pinned in the bundled <code>Makefile<\/code>.<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<ul>\n<li><strong>Font Awesome 5 Free (Solid)<\/strong> \u2014 <code>assets\/fa-solid-900.ttf<\/code>, drives the glyph controls. Font licensed under SIL OFL 1.1; icons and CSS under MIT. https:\/\/fontawesome.com \u2014 source: https:\/\/github.com\/FortAwesome\/Font-Awesome<\/li>\n<li><strong>libsodium<\/strong> \u2014 used through PHP's bundled <code>sodium<\/code> extension (PHP 7.2+). No library code is shipped with the plugin.<\/li>\n<\/ul>\n\n<h3>Local development<\/h3>\n\n<p>A Docker harness ships in <code>docker-compose.yml<\/code> (WordPress 6.7 + PHP 8.2 + MariaDB 11) with the plugin folder bind-mounted into <code>wp-content\/plugins\/fobo-data-maker-forms\/<\/code>.<\/p>\n\n<pre><code>make up           # start WP on http:\/\/localhost:8089\nmake wp-install   # one-shot scripted install + activate (admin\/admin)\nmake logs         # tail WordPress error log\nmake down         # stop containers\nmake down ARGS=-v # stop + nuke volumes\n<\/code><\/pre>\n\n<p>PHP edits are picked up immediately. JS\/CSS edits to assets\/ are too \u2014 refresh the page in the browser.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>fobo-data-maker-forms<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin under <strong>Plugins<\/strong>.<\/li>\n<li>Configure the <strong>Data Maker API URL<\/strong> under <strong>FOBO Data Maker Forms \u2192 Settings<\/strong>.<\/li>\n<li>Upload a <code>.dmf<\/code> bundle under <strong>FOBO Data Maker Forms \u2192 Upload .dmf<\/strong> with a slug.<\/li>\n<li>Embed in a page: <code>[fobo_data_maker_form id=\"your-slug\"]<\/code>.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release. Reads .dmf envelope v3 (compiled.json + elementCss.json + palette.css extras). Sealed POST\/PUT submissions. localStorage edit flow.<\/li>\n<\/ul>","raw_excerpt":"Render Data Maker forms on a WordPress site from signed .dmf bundles.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/339025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=339025"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/chivantiebosch"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=339025"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=339025"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=339025"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=339025"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=339025"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=339025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}