> music
// upload · shelve · words · moving picturesmp3 · m4a · aac · wav · flac · ogg — select several for an EP/album; track order follows filename (01…, 02…)
jpg · png — auto-rendered in the site's dither style
| # | title | artist | in | len | ops |
|---|
order: the site lists newest first, automatically. the ↑↓ arrows appear only on songs inside an ep/album and move them along that tracklist.
qr codes: each generates a public link ( /dl/<token> ) that downloads the original file. limit its downloads (1…n) or leave it infinite. the landing page never consumes a use — only the actual download does.
| # | title | type | tracks | ops |
|---|
deleting a release deletes its tracks and files. individual songs (edit / qr / delete) are managed in tracks_on_disk above. newest release first, automatically.
| # | song | shelf | lines | ops |
|---|
mp4 · mov · m4v · webm · mkv — re-rendered at 480px, 216 colours, dithered
| # | title | where | status | len | ops |
|---|
after upload the video shows as processing… while the server re-renders it; the page checks back automatically until it's ready. live recordings appear on /live, newest gig first (by the gig date); the ↑↓ arrows order the music_videos shelf only.
> admin
// inbox · newsletter · subscribers · send to… · website qr · gigs · works · spotlight| from | reach | message | when | ops |
|---|
// [ open ] shows the whole message and marks it read · unread rows are bold
// subscribers: …
// subject = the inbox line · header = the big centered title inside the letter (empty = "newsletter")
jpg · png — rendered in the site's dither style
// leave the photo link empty and the photo points at the featured song's page instead (when one is picked below)
// a song, or a whole ep/album: the letter gets a [ ▶ ] listen line under the photo that plays it on the site, and the photo links there too when it has no link of its own
// [ save + test ] (and [ test ] on any saved draft) mails ONLY the test address, subject marked [test] — the real [ send ] is untouched and the draft stays a draft
> send later
// saves the draft and books it: at that moment (eastern time — edt or est as the calendar says) it goes to the whole list, exactly like [ send ]. a booked row shows its time and a [ cancel ]; [ send ] on any row still means right now.
| # | subject | carries | status | ops |
|---|
// letters go out via brevo as news@ilanwoodward.com — one email per subscriber, each with its own unsubscribe link. [ send ] asks twice. a dropped photo only uploads when you hit [ save draft ] — check the "carries" column says photo before sending.
| subscriber | since | ops |
|---|
// this code takes the scanner straight to a signup-only page ( /newsletter ) — one code, reusable forever, no download attached
> email replies
// checking…
// to have replies to the newsletter land in the inbox panel, add these two records at namecheap (domain list → manage → advanced dns → mail settings: custom mx) — host reply, then press [ register with brevo ]. dns can take a few hours; [ check ] tells you when it's through.
| host | type | priority | value |
|---|---|---|---|
| reply | MX | 10 | inbound1.sendinblue.com. |
| reply | MX | 20 | inbound2.sendinblue.com. |
// mx: …
// brevo also has to know the subdomain itself. add these records at namecheap (same place, but under host records → add new record → TXT), then [ check ] and press [ register with brevo ] again:
| type | host | value | brevo sees it |
|---|
// once registered: a subscriber pressing reply in their mail app lands in the inbox panel, tagged email (the letter's footer "reply" link goes to the contact form either way). letters sent to labels keep replying to your own mailbox.
// the real letter with its real subject (no [test]), to people outside the list: a label you're courting, a friend who missed it. the list is untouched, the letter's status stays as it is, and the footer reads sent to you directly instead of "unsubscribe".
> which letter
> addresses
// type an address and press enter (or [ + add ]) — as many as you like, each shows below before anything is sent. a list pasted in with commas or spaces is split up.
> labels
| label | address | notes | last sent | ops |
|---|
> sent directly
// nothing sent directly yet
| # | made | scans | last scan | ops |
|---|
// every press makes a new code with its own address ( /q/<token> ). all of them land on the home page, scan forever, and count their scans here — so a card, a poster and a sticker can each have their own. deleting one stops the counting; printed copies still land home.
| date | time | venue | place | event | link | ops |
|---|
| page | title | link | ops |
|---|
// loading…
// placeholder = the meadow photo · spotlight = new_release! with artwork + a big play button (phones see it above the library)