Read-only snapshot of DDM's researcher interface for the placeholder ChatGPT project, with two synthetic participants. Every page can be opened; nothing can be saved, and delete, import and export are switched off. All demos
Projects ChatGPT donati… Data Donation Edit Blueprint
DDM v3.0.0b4

Blueprint Settings

General Settings

For internal use (e.g., "watch_history")
The File Uploader through which the related file will be uploaded

Display Settings

Configure what participants see on the donation interface

Title of the Blueprint shown to participants (e.g., "Watch History").
Explains to participants what data is extracted (e.g., "Videos you watched and when")
Controls display order in Blueprint list. Lower = first.
Data Extraction Configuration

File Identification

Files are identified by their path in the zip file. For example, if the file is some_data.json at the root of the zip, enter some_data.json as the file path.

You can use regex patterns or define multiple paths, which are tried in priority order (lower numbers first; useful if the filename may not always be the same).

Filepath Is regex Priority Remove

The uploader extracts all file paths from the uploaded zip and tries to match them against your specified path(s).

Matching works from the right: data.json will match both root/data.json and root/some-folder/data.json, selecting the first match. Be specific enough to avoid unintended matches.

If a match is found, the uploader validates the file content and extracts the data.

If no match is found, it tries the next path you defined, or displays an information message to the participant that the file could not be found in the uploaded zip-file.

Regex matching

Mark a file path as is regex to use regex patterns. For example, /specific folder/.*\.json$ matches both /specific folder/my_data.json and /specific folder/meine_daten.json — useful when filenames vary based on account settings.

For single file uploads, the participant will upload a single file – file identification is therefore not necessary.

File Validation

Configure how an identified file is validated

The character that separates values in the CSV (e.g., , ; or \t for tab). If left empty, the delimiter is inferred automatically.
The character(s) that separate one entry from the next in the file — for example, a blank line or a single line break. Use \n for a line break, or \n\n for a blank line between entries.
The character sequence that separates individual fields within a single record (e.g., a line break if each field is on its own line). Use \n for a line break.
The character that separates a field's name from its value within a line (e.g., : in Name: John, or = in name=John).
How many lines to skip at the beginning of the TXT-file.
How many lines to skip at the end of the TXT-file.
Whether to trim whitespace around records/entries and key-value pairs.
Comma-separated, in double quotes: "Field A", "Field B"

Comma-separated, in double quotes: "Field A", "Field B". Only used if a Nested loop path is configured (JSON format).

When a file has been identified, it is validated in order:

  1. Format correct: The file matches the expected file format.
  2. Fields present: The file contains all expected fields.

If any step fails, no data is extracted and the participant sees an error explaining what went wrong.

Data Extraction

Configure what data will be collected

Optional: if the data you want isn't at the top level of the file, enter the field name that contains it here. Leave empty to extract straight from the top level. To reach a field nested inside another field, separate the names with a dot, e.g. friends.real_friends.
If an extracted field contains several separate values (e.g. multiple lines of a message) instead of a single value, they are combined into one text using this separator. Use \n to join them with a line break.
Optional: use this if each item contains a list (or a named set) of related sub-items that you also want to extract as their own rows — for example, if each conversation contains a set of messages. Enter the field name that holds these sub-items (e.g. messages). Each sub-item becomes a separate row, and the data extracted from the parent item is automatically included in every row. To reach a field nested inside another field, separate the names with a dot, e.g. data.messages.
When reviewing their donation, participants normally see one combined table. Enable this to instead show a separate table for each top-level item (e.g. one table per conversation), with that item's own data shown once above its table. Only available once a Nested loop path is configured.
Adds a button to each entry's table (e.g. each conversation) letting participants exclude that specific entry from their donation, without having to decline the whole donation. Requires 'Show one table per nested entry' to be enabled. Only available once a Nested loop path is configured.

Relevant Fields

List any field you want to (a) keep in the donated data (mark as keep in donation), or (b) reference in an Extraction Rule.

Scope Expected name Regex Rename to Keep in donation Remove

Extraction Rules

Order Rule name Field Description Delete
1 Drop nodes hidden in the ChatGPT interface hidden – configure rule
2 Drop system and tool messages role – configure rule
3 EXAMPLE rule: mask e-mail addresses (regex masking is not anonymization) text – configure rule

Only fields listed in the Relevant Fields section and marked keep in donation are included in the donated data. Optionally, you can provide a field alias via rename to, which is used both in the data export and when referencing the field in Extraction Rules. Data is then extracted and transformed according to the defined Extraction Rules (if any).

Extraction Rules are applied row-by-row to the data located at the defined Extraction Root, in the order you define them. All extraction happens on the participant's device, using JavaScript.

Configuring extraction:

  1. In the Extraction Fields section, list each field you want to keep and mark it keep in donation.
  2. Add Extraction Rules to filter (delete rows) or transform values using comparison or regex operators.
Extraction Operator Description Note
Equal (==) Delete row if field value equals comparison value. Works for strings, integers, and dates1.
Not Equal (!=) Delete row if field value does not equal comparison value. Works for strings, integers, and dates1.
Greater than (>) Delete row if field value is greater than comparison value. Works for integers and dates1. Strings are skipped and row is kept in the data.
Smaller than (<) Delete row if field value is smaller than comparison value. Works for integers and dates1. Strings are skipped and row is kept in the data.
Greater than or equal (>=) Delete row if field value is greater than or equal to comparison value. Works for integers and dates1. Strings are skipped and row is kept in the data.
Smaller than or equal (<=) Delete row if field value is smaller than or equal to comparison value. Works for integers and dates1. Strings are skipped and row is kept in the data.
Delete match (regex) Remove the part of the field value that matches the regex.
Example: regex ^Watched transforms "Watched video XY" → "video XY"
Values are converted to strings before regex matching.
Replace match (regex) Replace the matching part of the field value with replacement value.
Example: regex [\w\-\.]+@([\w\-]+\.)+[\w\-]{2,4} with replacement _anonymized_ transforms "some text email@address.com" → "some text _anonymized_"
Values are converted to strings before regex matching.
Delete row when match (regex) Delete the entire row if the field value matches the regex.
Example: regex ^Watched deletes any row where the field starts with "Watched "
Values are converted to strings before regex matching.

1Dates are detected if formatted as ISO, RFC2822, or HTTP, and only if both values use the same format. Otherwise, treated as strings.

None None None – configure rule
The order in which rules are applied
A label for this rule (internal use only)

The value to compare the field against
The replacement for matched text.

Advanced Settings

If set, this blueprint is used as a fallback when the referenced blueprint's parser fails to extract data (either because it does not find the expected file or because it encounters an error).
If a Blueprint has multiple backups, backup blueprints with lower priority values are tried first when the main blueprint's parser fails.

Copy Blueprint

Delete Blueprint