Good Wishes
SESSION HELPER
Schedules · Availability · Pay
{{ syncBtnLabel }}
+ New project

{{ cal.title }}

{{ ol.label }}
{{ wd.label }}
{{ n.dayNum }}

ALL PROJECTS

{{ ol.label }}
Project
{{ dc.wd }}
{{ dc.md }}
{{ row.caret }}
{{ row.name }}
{{ row.rangeLabel }}
{{ row.bStatus }}
{{ row.name }}
{{ row.instrument }}
{{ cell.label }}
Each bar is a project across its dates. Click a row to unroll its players; double-click to open its booking grid.
No projects have dates set yet.

{{ selName }}

{{ selTypeLabel }} {{ selStatusLabel }} Pay direct
{{ selMetaLine }}
Edit + Add person
{{ lg.tag }} {{ lg.label }}
Musician
{{ dc.wd }}
{{ dc.md }}
{{ row.label }} {{ row.count }}
{{ row.name }}
{{ row.bookedLabel }}
{{ cell.label }}
Click a cell to cycle: empty → available → booked → unavailable. Booked days count toward pay.
No one booked yet
Add the players for this project, then mark their days on the grid.
+ Add person
Start a project
A session, a live date, whatever you're tracking. Add it, book your players, keep the pay straight.
+ New project

PROJECTS

+ New project
Project detail

{{ selName }}

Pay direct
{{ selMetaLine }}
Edit {{ selArchiveLabel }} Delete
{{ selNotes }}
Linked budget
{{ selLinkLabel }}
{{ selLinkApproved }}
Budget day rate
{{ selLinkRateStr }}
Apply to all players
Assigned budgets
Players & pay
+ Add person
Everyone works of {{ selMaxDays }} days
Day rate $ for all
Instrument
Player
Day rate
Days
Pick
Amount
Paid
{{ pt.category }}
{{ pt.name }}
$
{{ pt.amountStr }}
Booked on: {{ pt.daysLabel }}
Paid out
{{ selPaidStr }}
Still owed
{{ selOwedStr }}
No players on this project yet.
No projects yet
+ New project

PLAYERS

+ Add player
{{ st.label }}
{{ st.value }}
{{ w.name }} {{ w.totalLabel }}
{{ person.name }}
Hidden {{ inst }}
Conflict {{ person.conflictLabel }}
{{ person.contactLine }}
{{ person.notes }}
Owed · pay direct
{{ person.owedStr }}
{{ eng.projName }}
Pay direct Rental
{{ eng.sub }}
{{ eng.daysLabel }}
{{ eng.amount }}
{{ eng.paidLabel }}
Not booked on any project yet.
No players match. Adjust your search or add someone new.

CLIENTS & ARTISTS

{{ cs.label }}
{{ cs.value }}
+ Add client
{{ cl.name }}
{{ cl.kindLabel }} Hidden {{ cl.summaryLine }}
Booked
{{ cl.bookedDaysStr }}
Value
{{ cl.valueStr }}
Budgets
{{ cl.contactLine }}
{{ cl.notes }}
Ongoing
Past & done
No projects linked yet. Set this name as the client on a project.
No clients yet
Add an artist or label, or set a client on a project — they'll show up here.
+ Add client
{{ bt.totalFmt }}
Duplicate + New budget
Versions
{{ vt.totalFmt }}
★ = approved (syncs to projects)
Overall budget
$
Estimated total
{{ bTotalFmt }}
{{ bLeftLabel }}
{{ bLeftFmt }}
{{ sec.totalLabel }}: {{ sec.totalFmt }}
Day rate $
×days, each line
{{ ln.amountFmt }}
$ × {{ ln.amountFmt }}
Sec. budget $ {{ sec.budgetLeftFmt }} left
+ Add section + Non-recording expenses
Payment schedule
Scheduled {{ bPaySumFmt }} · Paid {{ bPaidFmt }} · Out {{ bOutstandingFmt }}
$

RENTALS

{{ rs.label }}
{{ rs.value }}
+ Add rental
Outside bookings that use the room but aren't your projects. They show on the calendar in teal and on the schedules of any engineer or assistant you assign — but stay out of Projects.
Rental
{{ rt.renter }}
{{ rt.dateLabel }} · {{ rt.daysStr }}
{{ rt.room }}
{{ rt.notes }}
{{ c.name }}
{{ c.roleLabel }}
{{ c.amountStr }}
{{ c.paidLabel }}
Crew total {{ rt.totalStr }}
No rentals yet
Add an outside booking — it'll show on the calendar and on your crew's schedules.
+ Add rental
Type
Status
New players you add to this project start at this rate. A linked budget's day rate takes priority.
Dates
to
Leave the second date blank for a single day. Add a block for each separate stretch — e.g. 2 days in June, 3 in July.
Pay direct
I pay the players (not the artist or label)
Cancel {{ pdSaveLabel }}
Browse the roster
Cancel Add to project
Instruments
{{ plHideLabel }}
Cancel Save player
{{ clHideLabel }} Delete
Cancel Save client
Dates
to
Crew (day rate × rental days is tracked as their pay)
Delete
Cancel Save rental

A download may have started automatically. If not (Safari, or embedded preview), copy the text below and paste it into a file named good-wishes-schedule.json, or use the download link.

{{ copyLabel }} Download file Done
Cloud sync — all devices
{{ cloudStatusText }}

Same data on your laptop and phone, always current. Set up a free Supabase project once — see SUPABASE_SETUP.md — then paste its two keys here (kept on this device).

Save keys

Sign in with a one-tap magic link. On the live site only — not this preview.

Send magic link Change keys

{{ cloudMsg }}

Signed in as {{ cloudUser }}
{{ cloudLastSynced }}
Sign out
File backup — Chrome / Edge
{{ syncStatusText }}

Pick a JSON file inside your Google Drive Desktop folder. The app saves to it automatically on every change and loads it when you open — so any Mac running Drive stays in sync. Don't edit on two machines at once.

Open existing file… Create new file…

Reconnect to resume auto-sync — browsers ask for file permission again each session.

Reconnect Forget file
Disconnect

This browser can't auto-sync to a file. Use Chrome or Edge for that — or use manual Export / Import below.

Manual backup
Export JSON… Import JSON…
Google (beta)
Import calendar events as projects · pull contact info onto players. Needs a one-time setup (GOOGLE_SETUP.md).
Connect Google…
Wipe everything and start over.

One-way & read-only: pull events in as projects, and copy phone/email onto matching players. It never writes back to Google. Needs a one-time Google Cloud setup — see GOOGLE_SETUP.md. Paste your credentials below (kept on this device only).

Save credentials Connect Google
{{ googleStatus }}
Import calendar → projects
Load events
Import ticked events
Contacts → players
Fill email/phone on players whose names match your Google contacts. Existing details are kept.
Match contacts
Done
ASSISTANT Ask, or tell me to make a change
Try: “What does Jason have coming up?”, “Who still owes reach-outs?”, or “Book Dana as engineer on a rental for Cutter Films Aug 3–4 at $350/day.” I’ll always ask before changing anything.
{{ m.text }}
{{ m.error }}
Thinking…
Confirm this change
{{ asstPendingSummary }}