Repository navigation
FormLogic v0.1.21
Before you update
- Every site runs one full migration on its first request after this update. It's safe to repeat and usually takes seconds. If it takes longer, other requests answer 503 with
migration_in_progressandRetry-After, and pages wait with their spinner up and try reads again. Writes aren't repeated. - Running on nginx or Apache with
Alias? Replace your server block with the current example in the README. Nothing had ever run the old examples. On nginx every/api/request was a 404, embedded forms were refused, and the rules v0.1.20 added were missing. The Apache example had the same fault for/api/. The nginx example also cut any quiet request at 60 seconds, where a Studio round, an update or a backup can take ten minutes. - Updating by uploading files? Upload the hidden
.htaccesstoo. Many FTP clients skip it. Everything still works without it, but a missing build file gets the app's home page instead of a 404. - Behind Cloudflare or another CDN and coming from v0.1.19 or older? Purge
/sw.jsand/registerSW.jsonce, right after this update. A CDN already holding the oldsw.jscan go on serving it for hours. v0.1.20 and later tell it not to keep those files. - If you set
SMTP_HOST, mail may start going out.symfony/mailerwasn't in the release zip, soSMTP_HOSTdid nothing and an update removed a copy added by hand. It ships now. If you set it and never saw mail, check the address it sends from before you update. flow_kvkeys now differ by case.voucher:AB12andvoucher:ab12used to be one key, so one customer's value could overwrite another's. A flow that writes a key in one case and reads it in another no longer finds it. Stored rows aren't changed.- A CSV that isn't UTF-8 or a Western encoding is refused, with a message saying to save it as CSV UTF-8. Excel's Western files (Windows-1252, UTF-16 with a BOM, semicolons or tabs) import, and say what they were read as.
- Reports on
datefields may move to the right day. Totals that used to shift by the app's offset, or with daylight saving, no longer do, so a saved monthly figure can differ from an earlier one. - Use the wizard's upgrade? It works again, so turn it off afterwards. It answered an empty 404 from v0.1.18 on. It still needs
INSTALL_ENABLE=1, and while that's set it answers anyone who can reach the site, so remove the setting and deleteinstall.phpwhen you're done. - Rolling back below v0.1.18 with
DATA_ENCRYPTION_KEYset now has to be confirmed, on the admin page or with--allow-downgrade. Those releases can't read what's sealed, so authenticator codes, webhook signatures and hosted records break. The check names them. - Mail on mod_php and mod_fcgid. PHP-FPM is the setup to use if you can. Forgot-password holds to a 2-second floor on servers that can't end an answer early, so its timing doesn't tell an outsider which addresses have accounts. That's a floor and not a guarantee: a mail server that has died still shows, at 5 seconds. mod_fcgid holds short answers until PHP exits, which PHP can't change. Doctor warns of both, and
DEPLOYMENT.mdsays what's true of each.
What's new
- An open tab hears of a new release. A page built for another release shows one "A new version is ready" with Reload. It never reloads by itself, and embedded forms don't show it.
- Flows run on the desktop show their result. Every Run via Desktop relay used to go back to "Queued" and never showed one, since the feature was built.
- SoftN v0.0.31: an app says on the page when it can't save, when a page doesn't parse and when its code fails, and a loop of writes to one collection is no longer refused.
What's fixed
Updates and failures
- An in-app update could skip its migrations. If a request hit the old code in the moment the files were swapped, it marked the new release as done without running them. The recycle bin answered 500, two-factor setup failed, and
--checkand deep health stayed green. This release migrates once whatever an older one stamped, which also heals a site this already happened to.bin/upgrade.php --checkused to pass on a database 8 releases behind, and now compares properly. - A database that's down gets a clean 503 with
Retry-After. It used to be an empty 500 or, where PHP's error display was on, a 200 of stack trace with the server's paths. An admin no longer sees "Maintenance mode is ON" when the database is down. - A failed chunk reloads the page in Firefox and WebKit as well as Chromium, a chunk's stylesheet counts, and a page with unsaved answers is never reloaded. One case used to reload a thousand times in six seconds.
- An admin's page from v0.1.17 or older says it's out of date, where every admin write failed with a request for a password nothing asked for. The same goes for two-factor and a password box on a connected domain.
Search, dates and data that leaves
- An app's record search found nothing outside plain ASCII: José, Иван, 山田 or a URL. It now reads every language, for rows already stored, and sort folds accents. The linked-record search does too.
- App reports moved
dateanswers by the app's offset, so in New York 1 March landed in February and atodayfilter on a date field counted 0. Only the submitted time moves now, and by the offset of that row's own moment. - A dump restores anywhere. Restoring into a MySQL in another time zone moved every timestamp, and could stop partway with no users loaded.
- CSV exports keep the BOM Excel needs. Export then import keeps every answer type that can be kept, and the preview says what isn't.
- Text limits count characters, not bytes: a 700-character Japanese flow description was a 500.
Mail and backups
- A mail server that accepts the connection and then says nothing can't hold a visitor's submit for a minute. Mail goes after the response with a 5-second limit per step, and a failed mail is audited and shown by Doctor.
- A failed backup night still does its retention, recycle bin and upload clean-up, so the job that frees space runs when space has run out.
- Webhook retries reach the 6-hour step
DEPLOYMENT.mdpromises.
The desktop link
- A desktop that comes back lets go of what it held. Closing OAIY mid-turn used to hold a row, and one of a person's two places, for up to fifteen minutes. This needs no change in OAIY.
- Settings says why a linked desktop listed nothing, and offers Try again.
/api/v1honoursanswersGteandanswersLte, so a desktop flow asking for upcoming bookings isn't handed every booking.- A flow that ends in text, a number or a boolean shows its result, and a finished run's sealed copy is cleared when the page has opened it.
Smaller things
- An admin's password reset that can't be mailed says so and leaves the member signed in. It used to say "emailed" after signing them out.
- A migration over 15 seconds no longer gives other requests a 500.
- A path nothing answers is a 404 in plain words, where a 405 read "Internal Server Error".
- Cancel on an upload's password dialog no longer says the page is out of date.
- A new app no longer says a custom screen is saved but switched off.
- A host with
ini_setdisabled keeps its API. - The native runtime takes Tauri 2.12.2 and its plugins, Vite 8.3.5 and sha2 0.11.1.
Tested with
SoftN v0.0.31 (ZIPP v0.0.32) and OAIY v0.1.12.