Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# SquadSync

Balanced team formation for hackathons, workshops, and study groups. Organizers create an event and share a QR/link; attendees self-register; a **deterministic engine** builds balanced teams. Auth is **Nostr (NIP-98)** — no passwords, no email.
Balanced team formation for hackathons, workshops, and study groups. Organizers create an event and share a QR/link; attendees self-register; a **deterministic engine** builds balanced teams. **AI (Claude) reads each attendee's free-text "Other" strength and maps it to a standard category** so everyone is comparable before allocation — while the team-building itself stays fully deterministic and reproducible. Auth is **Nostr (NIP-98)** — no passwords, no email.

## What it does

Expand Down
Binary file modified frontend/public/guide/02-create-event.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/03-event-dashboard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/04-attendees-qr.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/05-join-form.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/06-configure.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/07-engine-results.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/08-published.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/guide/09-ai-category.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 12 additions & 2 deletions scripts/capture-guide.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ async function main() {
await page.waitForSelector('[role="dialog"]', { timeout: 10000 });
await page.fill('input[id="title"]', "AI for Agriculture Hackathon");
await page.fill('#description', "Build AI + satellite tools to improve crop yields.");
await page.fill('input[id="event_at"]', "2026-07-15T09:00");
await page.fill('input[id="team_count"]', "3");
await page.fill('input[id="participant_limit"]', "30");
await shot(page, "02-create-event");
await page.click('button:has-text("Create Event")');
await page.waitForURL(/\/dashboard\/events\/[^/]+$/, { timeout: 15000 });
Expand Down Expand Up @@ -94,9 +96,14 @@ async function main() {
});
}

// 04 attendees + QR
// 04 attendees + QR — wait for the FULL QR card (its Download button) AND the
// populated table, so neither the QR nor the roster is still a skeleton.
await page.goto(`${BASE}/dashboard/events/${eventId}/attendees`, { waitUntil: "domcontentloaded" });
await page.waitForSelector("text=Registration QR Code", { timeout: 45000 });
await page.waitForSelector('button:has-text("Download PNG")', { timeout: 45000 });
await page.waitForSelector("text=6 participants", { timeout: 45000 });
await page.waitForSelector("text=Carol", { timeout: 45000 });
await page.waitForTimeout(500);
await shot(page, "04-attendees-qr");

// 05 public join form (NEW form)
Expand All @@ -106,9 +113,12 @@ async function main() {
await shot(join, "05-join-form");
await join.close();

// 06 configure
// 06 configure — wait for BOTH cards (the form only renders past its loading
// skeleton once the config has loaded); "Role Constraints" is the last card.
await page.goto(`${BASE}/dashboard/events/${eventId}/configure`, { waitUntil: "domcontentloaded" });
await page.waitForSelector("text=Balancing Weights", { timeout: 45000 });
await page.waitForSelector("text=Role Constraints", { timeout: 45000 });
await page.waitForTimeout(500);
await shot(page, "06-configure");

// 07 engine results
Expand Down
54 changes: 0 additions & 54 deletions scripts/capture-join.mjs

This file was deleted.

Loading