DJ plays drums one week and sings the next, and one photo can't fit both. A person can now have a photo per instrument, named Name - Instrument (DJ - Drums.jpg, DJ - Vocals.jpg), plus a plain DJ.jpg for everything else.
Sync reads the instrument of the spot each person lands in that week: the spot's bracketed role, or their Planning Center position if the spot has none. It then picks a photo in this order:
The photo picked by hand for them on that instrument.
A photo named for that instrument.
Their everyday pick, otherwise their best-named photo. A photo of them on another instrument still beats Planning Center's headshot.
The usual shorthands count as one instrument: Vox/Vocals/Singer, Keys/Piano/Pad, Drums/Perc, Bass, Guitar/Electric/Acoustic/Rhythm, and Leader.
Your own photos win
On the live board, Mike Powell and Rosaliz Gaitan showed their Planning Center headshots, so the booth dragged "Mike" and "Rose" in by hand. There were two causes:
Mike had two photos ("Mike" and "mike"). Sync treated that as a reason to fall back to Planning Center. Now the first library photo is used, and Planning Center's headshot only shows for someone with no library photo at all.
Sync had no way to know "Rose" is Rosaliz. Dropping a library photo onto the synced person already in a spot now makes it their photo for that instrument, when the names plausibly match: same name, same first name ("DJ action" → DJ McLean), or a nickname sharing the first three letters ("Rose" → Rosaliz). They keep their Planning Center name and spot.
Picks are saved in the module's settings.json under photoFor, keyed by person and instrument (for example <id>|drums), so a drum pick never overrides a vocal photo. A spot naming several roles (Leader, Vox 1, Acoustic) files the pick under its most specific: Leader, then Vocals, Drums, Keys, Bass, Guitar. Dropping a different person's photo still replaces the person. The "Mike" and "Rose" photos already dragged in by hand for this plan are learned on the next Sync. A synced person's library photo is read live, so replacing that photo file updates the board without a re-sync.
Dragging
The editor was one scrolling column, so a photo found far down the list had to be carried back up to its spot, and every drop redrew the editor back at the top. Now:
The spots are pinned in their own pane above the photos.
Each pane auto-scrolls when a drag nears its edge.
Both panes keep their scroll position when the editor redraws.
A search box filters the photos by name.
Verified
matching.test.js: passes, with new tests:
DJ gets his drum photo on drums, his vocal photo on vocals, and his everyday photo on keys or stage manager.
Piano and Keys count as one instrument.
Someone whose only photo is on another instrument still gets their own photo.
Nobody else's instrument photo is borrowed.
The leader spot files picks under Leader.
samePerson accepts "Rose" for Rosaliz.
Two equally good photos give a library photo, not Planning Center's.
Four-week Sync harness: a JavaScriptCore harness ran the real server.js. DJ is on drums (drum photo), then the action shot is dropped onto him on drums, then he moves to vocals (vocal photo; the drum pick stays out of it), then keys (everyday photo), then back to drums (the remembered action shot). The pick is stored under drums only. The previous commit fails four of those six checks.
Earlier suites: still pass: notes and mics, last week replaced, nobody twice, hand swaps kept, and learning the live board's hand-placed "mike" and "Rose".
Browser: the real client.js ran on the live board's data in a 420px-tall tile:
a mouse drag from the bottom of the photo list onto the first spot, with no manual scrolling;
a touch drag that auto-scrolled the spots pane to the hidden second row;
scroll positions, search text and focus surviving a board update.
## A photo per instrument
DJ plays drums one week and sings the next, and one photo can't fit both. A person can now have a photo per instrument, named `Name - Instrument` (`DJ - Drums.jpg`, `DJ - Vocals.jpg`), plus a plain `DJ.jpg` for everything else.
Sync reads the instrument of the spot each person lands in that week: the spot's bracketed role, or their Planning Center position if the spot has none. It then picks a photo in this order:
1. The photo picked by hand for them on that instrument.
2. A photo named for that instrument.
3. Their everyday pick, otherwise their best-named photo. A photo of them on another instrument still beats Planning Center's headshot.
The usual shorthands count as one instrument: Vox/Vocals/Singer, Keys/Piano/Pad, Drums/Perc, Bass, Guitar/Electric/Acoustic/Rhythm, and Leader.
## Your own photos win
On the live board, Mike Powell and Rosaliz Gaitan showed their Planning Center headshots, so the booth dragged "Mike" and "Rose" in by hand. There were two causes:
- **Mike had two photos ("Mike" and "mike").** Sync treated that as a reason to fall back to Planning Center. Now the first library photo is used, and Planning Center's headshot only shows for someone with no library photo at all.
- **Sync had no way to know "Rose" is Rosaliz.** Dropping a library photo onto the synced person already in a spot now makes it their photo **for that instrument**, when the names plausibly match: same name, same first name ("DJ action" → DJ McLean), or a nickname sharing the first three letters ("Rose" → Rosaliz). They keep their Planning Center name and spot.
Picks are saved in the module's `settings.json` under `photoFor`, keyed by person and instrument (for example `<id>|drums`), so a drum pick never overrides a vocal photo. A spot naming several roles (Leader, Vox 1, Acoustic) files the pick under its most specific: Leader, then Vocals, Drums, Keys, Bass, Guitar. Dropping a *different* person's photo still replaces the person. The "Mike" and "Rose" photos already dragged in by hand for this plan are learned on the next Sync. A synced person's library photo is read live, so replacing that photo file updates the board without a re-sync.
## Dragging
The editor was one scrolling column, so a photo found far down the list had to be carried back up to its spot, and every drop redrew the editor back at the top. Now:
- The spots are pinned in their own pane above the photos.
- Each pane auto-scrolls when a drag nears its edge.
- Both panes keep their scroll position when the editor redraws.
- A search box filters the photos by name.
## Verified
- **`matching.test.js`:** passes, with new tests:
- DJ gets his drum photo on drums, his vocal photo on vocals, and his everyday photo on keys or stage manager.
- Piano and Keys count as one instrument.
- Someone whose only photo is on another instrument still gets their own photo.
- Nobody else's instrument photo is borrowed.
- The leader spot files picks under Leader.
- `samePerson` accepts "Rose" for Rosaliz.
- Two equally good photos give a library photo, not Planning Center's.
- **Four-week Sync harness:** a JavaScriptCore harness ran the real `server.js`. DJ is on drums (drum photo), then the action shot is dropped onto him on drums, then he moves to vocals (vocal photo; the drum pick stays out of it), then keys (everyday photo), then back to drums (the remembered action shot). The pick is stored under drums only. The previous commit fails four of those six checks.
- **Earlier suites:** still pass: notes and mics, last week replaced, nobody twice, hand swaps kept, and learning the live board's hand-placed "mike" and "Rose".
- **Browser:** the real `client.js` ran on the live board's data in a 420px-tall tile:
- a mouse drag from the bottom of the photo list onto the first spot, with no manual scrolling;
- a touch drag that auto-scrolled the spots pane to the hidden second row;
- scroll positions, search text and focus surviving a board update.
Not yet tried on the production machine.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
christian
added 1 commit 2026-10-20 13:30:17 -04:00
Photos. Sync fell back to the Planning Center headshot whenever two
library photos matched a person equally ("Mike" and "mike"), and had no
way to know "Rose" is Rosaliz — so the booth dragged those in by hand
every week. Now:
- Several equally good library photos is not a reason to use PCO's; the
first of them is used. PCO's headshot is only for someone with no photo.
- Dropping a library photo onto the synced person already in that spot
(same name, same first name, or a nickname sharing its first three
letters) makes it their photo: they keep their Planning Center name and
spot, and it is remembered (settings.json photoFor) for every later
Sync. Photos already dragged in by hand for this plan are learned the
same way on the next Sync.
- A synced person's library photo is read live, so replacing that photo
updates the board without a re-sync.
Dragging. The editor was one scrolling column, so a photo found far down
the list had to be carried back up to its spot, and every drop redrew the
editor back to the top. The spots are now pinned in their own pane above
the photos, each pane auto-scrolls when a drag nears its edge, both keep
their scroll position through redraws, and a search box filters the
photos by name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
christian
added 1 commit 2026-10-20 13:40:10 -04:00
DJ plays drums one week and sings the next; one photo can't fit both. A
person can now have a photo per instrument, named "Name - Instrument"
("DJ - Drums.jpg", "DJ - Vocals.jpg"), plus a plain "DJ.jpg" for
everything else. Sync reads the instrument family of the spot each person
lands in (its bracketed role, else their PCO position) and picks:
1. the photo picked by hand for them on that instrument;
2. a photo named for that instrument;
3. their everyday pick, else their best-named photo. A photo of them on
another instrument still beats PCO's headshot.
Families keep the shorthands together: Vox/Vocals/Singer, Keys/Piano/Pad,
Drums/Perc, Bass, Guitar/Electric/Acoustic/Rhythm, Leader. A photo
dropped onto someone is remembered per person per instrument
("<id>|drums"), so a drum pick never overrides the vocal photo. A spot
naming several roles files under its most specific: Leader, then Vocals,
Drums, Keys, Bass, Guitar. Photo names from files now collapse the spaces
left by "Name - Instrument".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
christian
changed title from Band Lineup 1.13.0: your own photos win, a dropped photo becomes theirs, spots stay in reach while dragging to Band Lineup 1.13.0: a photo per instrument, your own photos win, spots stay in reach while dragging2026-10-20 13:40:21 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A photo per instrument
DJ plays drums one week and sings the next, and one photo can't fit both. A person can now have a photo per instrument, named
Name - Instrument(DJ - Drums.jpg,DJ - Vocals.jpg), plus a plainDJ.jpgfor everything else.Sync reads the instrument of the spot each person lands in that week: the spot's bracketed role, or their Planning Center position if the spot has none. It then picks a photo in this order:
The usual shorthands count as one instrument: Vox/Vocals/Singer, Keys/Piano/Pad, Drums/Perc, Bass, Guitar/Electric/Acoustic/Rhythm, and Leader.
Your own photos win
On the live board, Mike Powell and Rosaliz Gaitan showed their Planning Center headshots, so the booth dragged "Mike" and "Rose" in by hand. There were two causes:
Picks are saved in the module's
settings.jsonunderphotoFor, keyed by person and instrument (for example<id>|drums), so a drum pick never overrides a vocal photo. A spot naming several roles (Leader, Vox 1, Acoustic) files the pick under its most specific: Leader, then Vocals, Drums, Keys, Bass, Guitar. Dropping a different person's photo still replaces the person. The "Mike" and "Rose" photos already dragged in by hand for this plan are learned on the next Sync. A synced person's library photo is read live, so replacing that photo file updates the board without a re-sync.Dragging
The editor was one scrolling column, so a photo found far down the list had to be carried back up to its spot, and every drop redrew the editor back at the top. Now:
Verified
matching.test.js: passes, with new tests:samePersonaccepts "Rose" for Rosaliz.server.js. DJ is on drums (drum photo), then the action shot is dropped onto him on drums, then he moves to vocals (vocal photo; the drum pick stays out of it), then keys (everyday photo), then back to drums (the remembered action shot). The pick is stored under drums only. The previous commit fails four of those six checks.client.jsran on the live board's data in a 420px-tall tile:Not yet tried on the production machine.
🤖 Generated with Claude Code
Photos. Sync fell back to the Planning Center headshot whenever two library photos matched a person equally ("Mike" and "mike"), and had no way to know "Rose" is Rosaliz — so the booth dragged those in by hand every week. Now: - Several equally good library photos is not a reason to use PCO's; the first of them is used. PCO's headshot is only for someone with no photo. - Dropping a library photo onto the synced person already in that spot (same name, same first name, or a nickname sharing its first three letters) makes it their photo: they keep their Planning Center name and spot, and it is remembered (settings.json photoFor) for every later Sync. Photos already dragged in by hand for this plan are learned the same way on the next Sync. - A synced person's library photo is read live, so replacing that photo updates the board without a re-sync. Dragging. The editor was one scrolling column, so a photo found far down the list had to be carried back up to its spot, and every drop redrew the editor back to the top. The spots are now pinned in their own pane above the photos, each pane auto-scrolls when a drag nears its edge, both keep their scroll position through redraws, and a search box filters the photos by name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>DJ plays drums one week and sings the next; one photo can't fit both. A person can now have a photo per instrument, named "Name - Instrument" ("DJ - Drums.jpg", "DJ - Vocals.jpg"), plus a plain "DJ.jpg" for everything else. Sync reads the instrument family of the spot each person lands in (its bracketed role, else their PCO position) and picks: 1. the photo picked by hand for them on that instrument; 2. a photo named for that instrument; 3. their everyday pick, else their best-named photo. A photo of them on another instrument still beats PCO's headshot. Families keep the shorthands together: Vox/Vocals/Singer, Keys/Piano/Pad, Drums/Perc, Bass, Guitar/Electric/Acoustic/Rhythm, Leader. A photo dropped onto someone is remembered per person per instrument ("<id>|drums"), so a drum pick never overrides the vocal photo. A spot naming several roles files under its most specific: Leader, then Vocals, Drums, Keys, Bass, Guitar. Photo names from files now collapse the spaces left by "Name - Instrument". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Band Lineup 1.13.0: your own photos win, a dropped photo becomes theirs, spots stay in reach while draggingto Band Lineup 1.13.0: a photo per instrument, your own photos win, spots stay in reach while dragging