Webforms behaviour notes

1. What is the issue? Please be detailed.
Collecting webforms issues/glitches - sorry if these are already solved but not released, I'm on v0.24.0

  • if a label's line ends with a ${} field and there is then a newline entered in the form definition, the newline is ignored and the following line will run on. If the line ends in a character and then the newline, the newline is used. eg ending as text ${field} vs text ${field} text

  • when geopoint/trace/shape values are manually placed the value returned is only lat long whereas in Collect / Enketo they are lat long altitude precision and Collect uses '0.0' vs Enketo uses 0

    • discovered as I used a constraint on the geopoint to force manual placement as selected-at(., 3) = 0 and I couldn't proceed in WF. Modifying it to selected-at(., 3) = 0 or selected-at(., 3) = '' fixed my issue.
    • link to github issue #811
  • using now() in the default column doesn't load the current date to the question, is blank. Works ok in Collect.

    • This is a collect issue, any connection?
    • To test, a field with a now() calculation shows in an note as 2026-05-19 in Collect but in WF it's shown as 2026-05-19T16:17:32.366+10:00, the submitted field value in Collect / Enketo CSV is 2026-05-19T16:17:32.366+10:00 though.
  • dynamic image defaults where the image field has a triggered calculation like concat('jr://images/',${selected_drawing_to_load}) do not work, the image is not loaded.

    • dynamic defaults are marked as complete but this case doesn't seem to work. Other text/select dynamic defaults are ok.
  • For questions that have image / big-image, the big-image file path&name is appended to the label eg "My reference drawingjr://images/my_reference_dwg.pdf"

  • A dynamic default for a geopoint doesn't show a pin on the map when calculated in but does show ":white_check_mark: Point Saved" at the bottom. Unlike Collect there is no co-ord value shown so it doesn't actually appear to the user as if the default was loaded, but the submission correectly contains the point.

May I add one ?
Using the distance(geotrace) function to calculate the length of a geotrace returns an error where enketo do not :-1:

The function 'distance' received a value that does not represent GPS coordinates

@ahblake
Hey, so far I was able to reproduce two of your issues: First one with label's line ending with a${} and the last one with a dynamic default for a geopoint.

I've already filled separate issues and we'll be tracking that.

I was not able to reproduce this one:

using now() in the default column doesn't load the current date to the question, is blank. Works ok in Collect.

I've used the now() in the default column and it is not blank in Web Forms. Could you maybe share your form?

webforms_now_date.xlsx (225.5 KB)

Here is an example. enter_date does not get the default value in v0.24.0. There is no relevance / required etc on this, moving it outside a group made no change. Does work in Enketo.

Also tried putting a field in the default where that field was a calculate with now(), doesn't work in enketo or WF.

I can reproduce this issue. The problem is to do with the type of the field - if I change enter_date to dateTime then it works. Essentially you're trying to stuff a dateTime into a date and it doesn't work.

I'll investigate what the correct behaviour is, but for now switching to dateTime is a workaround.

Issue raised: https://github.com/getodk/web-forms/issues/830

So WF is more correct (wrong type, fail) and Collect/Enketo are more forgiving (use the date portion).

As I want it to be a date value I would have to change the default expression to format-date(now(), '%Y-%m-%d') (tested, works in Enketo/WF)

This is somehow related perhaps: the now() value from a calc field renders as a date only in a note in Collect, but the submitted field value is a datetime, and this value renders in a note as a datetime in WF. So Collect is treating it two different ways?

Other options:

  • use today(), instead of now()
  • or ${today}, metadata
  • convert the now to a date, try date( decimal-date-time(now()) )
  • for a note: format-date-time(now(), ...)
  • use today(), instead of now()
    • for the specific issue of loading the current date as the default to a date question, this is the simplest solution.
  • or ${today}, metadata
    • works in WF, not in enketo
  • convert the now to a date (i.e. decimal-date-time(now())
    • this breaks the parser java.lang.IllegalArgumentException: Invalid cast of data [20622.0604915625] to type Date
    • the overly complicated date(decimal-date-time(now())) works for enketo but doesn't work for webforms, which is expected as the expression returns a datetime not a date. the docs could benefit from a small edit here to clarify:
      • Converts an integer representing a number of days from January 1, 1970 (the Unix Epoch) to a standard date datetime value.

  • for a note: format-date-time(now(), ...)
    • this also works as a default for a date field.

I know big-image is not complete on the matrix yet, but I can't find a post highlighting this seemingly related behaviour, so chucking it in this thread.

  1. When a choice has an image and a big-image, selects get the path to the big-image media appended to the label.
  2. If the same file is used for image and big-image, the thumbnail is not shown against the select (file is uploaded).

redacted example, labels should only have text to the left of jr://. Difference between displayed image (1st option) when big-image is a different file and not displayed when they are the same file (options 2 & 3)

Is there a list of all accepted image types for WF? (related, how about Collect?) It's not clear in the docs.

HEIC can be used in Collect as a source, and will remain in this format if not annotated (A 'chosen' HEIC image was uploaded to central as HEIC with my max-pixels resolution), but returns Failed to load image. if HEIC is chosen in WF.

WEBP is accepted by WF and unannotated uploads as WEBP (yet untested in Collect)

I'm not campaigning for esoteric formats to be included, but HEIC does seem like it will become more common and is more space/bandwidth efficient.

Hi @ahblake!

Web Forms doesn't have an explicit allowlist for image formats. It accepts any file whose MIME type is image/*. However, the drawing tool for annotate, draw, and signature always outputs JPEG, because the tool uses a white background by default, and JPEG doesn't support transparency (transparent pixels would turn black). JPEG also gives good compression for photo content while keeping good quality.

It seems that HEIC/HEIF is a format on Apple devices. These files pass validation since their MIME type is image/heic or image/heif, but Chrome and Firefox don't have native HEIC decoding on non-Apple platforms, so they could behave unexpectedly in Web Forms. Safari works better in that case since Apple controls the full codec stack. That said, codec support can vary by OS and browser version. We still need to research the codec support further.

Is HEIC/HEIF the preferred format in your organization?

The HEIC image i tried in was actually one i shot on an android phone, used with Choose Image in a Collect submission and uploaded without annotation, then downloaded and tried to use via the file picker in WF (chromium browser in macos).

I don't have a need for HEIC or WEBP (although i am tempted to investigate use for media if it offers better quality/kb than JPG/PNG), i was mostly surprised that HEIC wasnt accepted.

Hello,
In the column label, in choices sheet, a string value starting with the symbol > cannot be displayed in Webforms :

Afterwards, I switched > with « Supérieur à [...] », then it worked perfectly
@mathieubossaert @nathalie_H

Thanks @mjm_olivo . For more details the versions involved are :

versions:
6b1ac3b8a8f4b21c74eda22d4773a332a4c724e3 (v2026.1.2-1-g6b1ac3b)
 56b6bbdb4cac59aa850e3ddd1cd19ab9f2be1af3 client (v2026.1.2)
 142c1c85501d90d225116862ba79dd914c5fcfc1 server (v2026.1.1)

Thank you, @mjm_olivo and @mathieubossaert. I have opened an issue to track it and will work on fixing it.

@JenniferQ (moving this away from a thread that was meant to be about Collect issues)

versions:
ee0e4207ab6fb628247f4d5b5b576325782a5a05 (v2026.2.0)
 0000000000000000000000000000000000000000 client (v2026.2.0)
 bee93414a2215bd73d7f371113c6640c66d90c95 server (v2026.2.0)

I did see that issue and wondered if it was related, but thought that it was primarily around editing submissions with version changes affecting the file in an image question, whereas what I was seeing was the image display against a select working and then not working, and only being restored if I uploaded a file that is "different" (i.e. reuploading the identical file doesn't fix it).

Additionally, the form was always in draft, there were no submissions, all the behaviour was observed while completing the draft form testing.

I don't know exactly what caused the images to stop appearing either. First one broke, then two more (the latter two I had replaced the original image as I uploaded the wrong files initially). It appears to be independent of version but maybe time based (related to files being moved to S3?).

I opened the 2026-07-20 draft that added the 'new' options, and now all images are broken (two days ago the first 3 options were broken but the newly added ones were ok). There has been no version change since my earlier post that added the 'new' options.

You beat me to this one! :chequered_flag: I spotted it yesterday and forgot about this post (and what the blank selects were supposed to have in them)


At the same time I discovered this one;

In my form, I have a question that has calculated values in the label and hint (and guidance), the label also had some static text, the hint did not.

The result in WF was:
Label: Some text [calculated label text]
Hint: --ODK-OUTPUT-STRING-0--``--ODK-OUTPUT-STRING-1--

Modifying the form so that the hint field was some text ${hint_text_calculate} then resulted in:

Label: Some text [calculated label text]
Hint: some text [calculated hint text][guidance text]

The issue appears to be putting a field in a hint with no other text. But a label with a field and nothing else is ok.

I also tested a field followed by text and that worked, resulting in
[calculated hint text]some text[guidance text]

I am assuming that string0 is the hint and string1 is the guidance note, as guidance isn't properly supported yet, but does appear.

And

I opened the 2026-07-20 draft that added the 'new' options, and now all images are broken (two days ago the first 3 options were broken but the newly added ones were ok). There has been no version change since my earlier post that added the 'new' options.

Thank you @ahblake! I attempted to reproduce the issue in draft mode and reupload the same images, plus some other different combinations, but the error didn't occur. I'll check with the Central team in case they have any ideas related to the back end.

We noticed some issues with calculations and setvalues for the upload question type that we'll be fixing.

In my form, I have a question that has calculated values in the label and hint (and guidance), the label also had some static text, the hint did not.

I can reproduce this one. The guidance still doesn't support output, and breaks the hint. I've added this case to the issue tracking the implementation of guidance so this case is tested.

Is this the same issue?

Is there a particular test you'd like me to try? I thought perhaps a fresh form, record the time of media upload, check every 12hrs to see if they still load.

Edit: I went to setup the above test, but instead found the image was broken in WF from first upload. Steps taken:

  • versions
    • versions:
      ee0e4207ab6fb628247f4d5b5b576325782a5a05 (v2026.2.0)
      0000000000000000000000000000000000000000 client (v2026.2.0)
      bee93414a2215bd73d7f371113c6640c66d90c95 server (v2026.2.0)
    • WF 1.0.0
  • new form, with only a note and a select that has image against choices, no big-image
  • uploaded form, uploaded only one attachment, koala.jpg (the exact same file I had previously uploaded to a different draft form in the same project)
  • tested draft in WF - broken image against select (not expected!). Other two also broken but expected.
  • tested draft in Enkketo - image appears ok
  • created a modified file and uploaded against koala.jpg (an image never before uploaded to this form or project or server)
  • tested draft in WF - new image appears against select. Other two also broken but expected.
  • tested draft in Enketo - new image appears ok
  • tested draft in WF at 1424 (+ ~100min) - new image still appears against select.
  • tested draft in WF at 1850 (+ ~6hrs) new image no longer appears against select.

WebForms; new form, in draft, identical attachment has been previously uploaded to this project but not this form

Enketo; new form, in draft, identical attachment has been previously uploaded to this project but not this form

WebForms; new form, in draft, new attachment has never been previously uploaded to this server. at 1min after upload.

WebForms; new form, in draft, new attachment has never been previously uploaded to this server. at ~6hrs after upload.

We suspect that's the cause, but we need to finish testing in the server environment with Sentry and S3 (where S3 is blocking Sentry headers) to confirm. A quick workaround would be to temporarily remove Sentry on the front end (removing SENTRY_DSN_FRONTEND). Once we finish testing, we'll update back here with the fix ready!