-
Instrumental
-
Vocal (Single)
-
Vocal (Multiple)
+
-
-
Submit
@@ -111,21 +223,31 @@
Vocal Presence:
notComplete: false,
selectedGenre: "",
selectedMood: "",
- selectedEnergy: "",
+ selectedClarity: "",
selectedDance: "",
selectedVocals: "",
selectedGenreOther: "",
instructions: `
-
*NOTE*
+
Song Tagging Instructions
- Songs may take a few seconds to load. If the song does not load in a reasonable amount of time, please report the task using the report button.
+ Listen to the track and tag it with appropriate attributes. Your input helps improve music discovery and organization.
-
Listen to at least a few seconds of the song before answering the questions.
+
Guidelines:
+
Genre: Select the primary genre of the track. If it doesn't fit standard genres, choose "Other" and specify.
+
How it makes you feel: Choose the emotion or mood that best describes how the track makes you feel.
+
Lyric Clarity: Rate how clear and understandable the lyrics are. Choose "Instrumental" if there are no vocals.
+
Danceability: Assess how suitable the track is for dancing based on rhythm and tempo.
+
Vocal Presence: Indicate if the track is instrumental or has single/multiple vocalists.
+
+
Important Notes:
+
Songs may take a few seconds to load. If the song does not load in a reasonable amount of time, please report the task.
+
Listen to at least 30 seconds of the song before answering the questions.
Try to be accurate — guess only if you genuinely can't tell.
Use headphones or a quiet environment for the best experience.
-
If the song abruptly cuts off, is silent, or sounds corrupted, report it.
+
If the song abruptly cuts off, is silent, or sounds corrupted, please report it.
+
All fields are required before you can submit.
`
};
},
@@ -144,7 +266,7 @@
*NOTE*
methods: {
async uploadAndSubmit() {
this.btnLoading = true;
- const fields = [this.selectedGenre, this.selectedMood, this.selectedEnergy, this.selectedDance, this.selectedVocals];
+ const fields = [this.selectedGenre, this.selectedMood, this.selectedClarity, this.selectedDance, this.selectedVocals];
if (fields.some(field => field === "")) {
this.notComplete = true
}
@@ -159,11 +281,11 @@
*NOTE*
song: this.songSource,
genre: this.selectedGenre,
mood: this.selectedMood,
- energy: this.selectedEnergy,
+ clarity: this.selectedClarity,
dance: this.selectedDance,
vocals: this.selectedVocals,
}
-
+
},
},
"*",
From cf6339c0f02e77e4e76dc37d0e723a3f5b4150e4 Mon Sep 17 00:00:00 2001
From: Miguel Nobre
Date: Wed, 11 Mar 2026 10:55:24 -0400
Subject: [PATCH 10/13] fixing regex bug
---
apps/task-poster/src/fetcher.ts | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/apps/task-poster/src/fetcher.ts b/apps/task-poster/src/fetcher.ts
index 89aac7a1..588d4beb 100644
--- a/apps/task-poster/src/fetcher.ts
+++ b/apps/task-poster/src/fetcher.ts
@@ -436,7 +436,14 @@ export const getTasks = async (fetcher: Fetcher, csv: string) => {
const iterator = db.iterate(["fetcher", sId, sFId, "done", {}], undefined, true);
// the high water mark
- const regex = new RegExp(fetcher.pipelineFilterRegex as string);
+ let regex: RegExp | null = null;
+ if (fetcher.pipelineFilterRegex) {
+ try {
+ regex = new RegExp(fetcher.pipelineFilterRegex as string);
+ } catch (e) {
+ console.error("Invalid pipelineFilterRegex, skipping filter:", fetcher.pipelineFilterRegex);
+ }
+ }
let dataQueue: any[] = [];
for await (const taskId of iterator) {
@@ -450,7 +457,7 @@ export const getTasks = async (fetcher: Fetcher, csv: string) => {
}
// regex filter
- if (!task.result || regex.test(task.result) || task.result == "") {
+ if (!task.result || (regex && regex.test(task.result)) || task.result == "") {
continue;
}
From 9feff61239fdc85844be98a0187730f25d27f664 Mon Sep 17 00:00:00 2001
From: Miguel Nobre
Date: Mon, 16 Mar 2026 10:55:20 -0400
Subject: [PATCH 11/13] adding new template
---
.../verify-sentence-nonpipeline.html | 146 ++++++++++++++++++
1 file changed, 146 insertions(+)
create mode 100644 assets/templates/Mozilla/sentence-creation/verify-sentence-nonpipeline.html
diff --git a/assets/templates/Mozilla/sentence-creation/verify-sentence-nonpipeline.html b/assets/templates/Mozilla/sentence-creation/verify-sentence-nonpipeline.html
new file mode 100644
index 00000000..205e8fac
--- /dev/null
+++ b/assets/templates/Mozilla/sentence-creation/verify-sentence-nonpipeline.html
@@ -0,0 +1,146 @@
+
+
+
Effect AI - Sentence Verification
+
+
+
+
+
+
Is a linguistically correct sentence?
+
+
+
+ Yes
+
+ Skip
+
+ No
+
+
+
+ Task incomplete - Please complete all sections of the task
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+
From eeb3b0da2288ed0665fb4de39a87679274401e9e Mon Sep 17 00:00:00 2001
From: Miguel Nobre
Date: Mon, 23 Mar 2026 16:56:31 -0400
Subject: [PATCH 12/13] adding image annotation task + taskposter template
preview fix
---
apps/task-poster/src/templates.ts | 22 +-
apps/worker-app/app/pages/index.vue | 2 +-
.../bounding-box-labeler.html | 1050 +++++++++++++++++
3 files changed, 1064 insertions(+), 10 deletions(-)
create mode 100644 assets/templates/Image Annotation/bounding-box-labeler.html
diff --git a/apps/task-poster/src/templates.ts b/apps/task-poster/src/templates.ts
index 68ea2d89..7c269e49 100644
--- a/apps/task-poster/src/templates.ts
+++ b/apps/task-poster/src/templates.ts
@@ -73,11 +73,16 @@ const findTemplateFields = (html: string) => {
const re = /\$\{([^}]+)\}/g;
const matches: string[][] = [];
let m;
- do {
- const m = re.exec(html);
- if (m) matches.push(m.slice(0, 3));
- } while (m);
- return matches;
+ while ((m = re.exec(html))) {
+ matches.push(m.slice(0, 2));
+ }
+ // Deduplicate by field name
+ const seen = new Set();
+ return matches.filter(([_, name]) => {
+ if (seen.has(name)) return false;
+ seen.add(name);
+ return true;
+ });
};
const form = (msg = "", values: Record = {}): string => `
@@ -117,12 +122,11 @@ ${fields.map(
${name}
+ id="f${name}" name="${name}" type="text">`,
+).join("")}
Preview
-`,
-)}
`;
const templatePreviewFrame = async (
@@ -317,7 +321,7 @@ export const addTemplateRoutes = (app: Express): void => {
width="100%"
srcdoc="${escapeHTML(renderedTemplate)}">
-${templateDataForm(escapeHTML(html), fields, req.body)}`);
+${templateDataForm(html, fields, req.body)}`);
});
app.post("/t/:id", requireAuth, async (req, res) => {
diff --git a/apps/worker-app/app/pages/index.vue b/apps/worker-app/app/pages/index.vue
index fd45c2ae..ffc59b66 100644
--- a/apps/worker-app/app/pages/index.vue
+++ b/apps/worker-app/app/pages/index.vue
@@ -144,4 +144,4 @@ function prevPage() {
#dashboard {
background: black !important;
}
-
+
\ No newline at end of file
diff --git a/assets/templates/Image Annotation/bounding-box-labeler.html b/assets/templates/Image Annotation/bounding-box-labeler.html
new file mode 100644
index 00000000..8cbb4928
--- /dev/null
+++ b/assets/templates/Image Annotation/bounding-box-labeler.html
@@ -0,0 +1,1050 @@
+
+
+
+
Effect AI - Bounding Box Labeler
+
Draw bounding boxes around objects in the image
+
+
+
+
+
+
+
+
Drawing label:
+
+
+ {{ label }}
+
+
+
+
+
+
Select a label, then click and drag to draw. Shift+scroll to zoom. Ctrl+click a box to delete it.
+
Select a label, then tap and drag to draw. Pinch to zoom, two fingers to pan.
+
+
+
+
+
+
+
+ Undo last box
+
+
+
+
+
+
Loading image...
+
+
+
The image could not be loaded. You may skip this task.
+
Skip Task
+
+
+
+
+
+
Failed to load image. You may skip this task.
+
Skip Task
+
+
+
+
+
+
+
+
+
+
+
+
Labels Checklist
+
+ ✓
+ ○
+
+ {{ label }}
+ {{ boxCountFor(label) }} boxes
+ selected
+
+ {{ visibleLabels[label] === false ? 'Show' : 'Hide' }}
+
+
+
+
+
+
+
+
+
Drawn Boxes ({{ boxes.length }})
+
+
+
+ {{ box.label }}
+
+
+
+
+
+
+ No bounding boxes drawn yet. Select a label and draw on the image.
+
+
+
+
+
+
+ Task incomplete – Every label must have at least one bounding box
+
+
+ Missing: {{ missingLabels.join(', ') }}
+
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+
From d7e333b55fc54168cfeec1bd4e60d15d90b97a61 Mon Sep 17 00:00:00 2001
From: Miguel Nobre
Date: Mon, 23 Mar 2026 17:07:15 -0400
Subject: [PATCH 13/13] template name change
---
.../{lyric-transcriber-noWaveform.html => lyric-transcriber.html} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename assets/templates/Audius/{lyric-transcriber-noWaveform.html => lyric-transcriber.html} (100%)
diff --git a/assets/templates/Audius/lyric-transcriber-noWaveform.html b/assets/templates/Audius/lyric-transcriber.html
similarity index 100%
rename from assets/templates/Audius/lyric-transcriber-noWaveform.html
rename to assets/templates/Audius/lyric-transcriber.html