config.style.page.color: "black on white"
config.style.page.link.font: "underline"
config.style.page.link.color: "#D0033E"
config.style.page.link.lineColor: "#D0033E"
config.style.page.link.active.color: 'blue'
config.style.page.link.active.lineColor: 'blue'
config.style.dark.page.color: "white on #D0033E"
config.style.dark.page.link.font: "underline"
config.style.dark.page.link.color: "yellow-2"
config.style.dark.page.link.lineColor: "yellow-2"
config.style.dark.page.link.active.color: 'black'
config.style.dark.page.link.active.lineColor: 'black'
config.footer.left: ""
config.body.transition.name: "none"
--
[align center]
{embed image: 'on repeat thumbnail.png', alt: 'On Repeat'}
[[ⓘ about->about this game]]\
[[▷ play->Intro]]
[continue][align center]
{embed image: 'on repeat banner.png', alt: 'On Repeat'}
a love letter to good music
written by [[Sarah Willson->https://passerine.itch.io/]]\
for [[IFComp 2026->https://ifcomp.org/comp/2026]]
many thanks to Kirk Damato, Allyson Gray, and Antares Meketa
for playtesting and support <3
extra thanks to Christy, Tom, Jason, Aaron, Vince, and cellar door
({back link, label: 'back'})
config.style.page.header.font: "16"
config.style.page.header.link.font: "small caps"
config.style.page.footer.font: "16"
config.style.page.footer.link.font: "small caps"
config.style.page.style: "none"
config.style.page.verticalAlign: 'center'
config.body.transition.name: "none"
day: 0
spin: 0
skip: 0
daytoday: 'THURSDAY'
--
[align center]
~~[[June 2026, Los Angeles]]~~
spin: 5
--
you were caught by surprise.
this album is what you didn’t know you were missing.
you forgot it was possible. [[love at first spin.]]
*Thank you for your pre-order. This album is now available!*
you stay up too late listening.
[[but it’s worth it.]]
config.style.page.verticalAlign: "center"
--
{embed passage: 'cycles'}
{embed passage: 'new day'}[if spin < 3]
😒🌑🌑
[continue]
[if spin < 8 && spin > 2]
🌑😎🌑
[continue]
[if spin > 7]
🌑🌑😵💫
[continue]
[javascript]
if (spin > 10) {
spin = 10;
}
if (spin < 0) {
spin = 0;
}
[continue]config.style.page.verticalAlign: "top"
daytoday: 'THURSDAY'
daysoftheweek: ['FRIDAY', 'SATURDAY', 'SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY']
config.header.center: "DAY {day} ({daytoday})"
config.header.right: "{embed passage: 'mood'}"
daytime: true
weekday: true
working: true
--
[align left]
you worked late again. dinner was a leftover conference bagel on the drive home. at least the traffic wasn’t so bad.
Nacho’s waiting at the door for you, just like always. you feed him and deflate on the couch to check Discord.
someone linked to an album release livestream at 9pm.
[[sure, might as well.]]
dailyday: ['they said the election results could take a while, but somehow they still talk about it every single day. if only your phone hadn’t stopped connecting to your car, you could put the album on instead.', 'there’s a protest downtown today, but you don’t know anyone who’s going.', 'looks like the election results are mostly in. good, one less thing to worry about.', 'they’re outlining all the ways the World Cup will wreak havoc on traffic this week in great detail.', 'they’re interviewing a losing candidate for mayor. aren’t there more important things going on?', 'a famous music producer died. you didn’t really know his work, but it’s still sad.', 'seems like a slow news day. your mind drifts to the all-hands meeting tomorrow morning. usually they’re only once a month, but there was one just last week.', 'your mind wanders again. you can’t stop wondering what this meeting will be about. turns out you were right to be concerned. the department head announces they’re cutting 25% of the workforce, including you. they still want you to work next week to “tie up loose ends,” or you can stay home without pay. either way, everyone affected is being sent home early today. your car didn’t even have time to heat up in the parking lot.', 'looks like the album merch is back in stock. just when you’re about to lose your job.', 'a warehouse fire is burning on the eastside. last month it was that chemical leak at the factory, and now this.']
dailynight: ['it’s so hot today, and the traffic is atrocious. you’re happy to finally get home.', 'you text all your friends about the album. a couple of them say they’ll listen to it.', 'all the album merch is still sold out, so you order a copy of the CD.', 'as predicted, there’s a lot of traffic. you pass an abandoned fruit stand on a streetcorner.', 'a Waymo is stopped in the left turn lane and everyone’s losing their minds. as if honking is going to fix anything.', 'it’s a fairly easy commute. you wonder whether there will be a tour for your new favorite album. how great would that be?', 'you pass a World Cup fan zone on the way home. that explains the traffic.', 'they’re still running events at the new train stations. maybe once you’re unemployed you can finally check out the D line extension.', 'you get to thinking about music and how free it makes you feel. maybe you could write something about it.', 'there’s a lot of loud cheering in your neighborhood today. the right team must’ve won the World Cup game.']
album_low: ['it puts you in a great mood. maybe music can fix everything.', 'you forgot how much track 4 rocks. amazing.', 'been a while since you listened straight through. what a masterpiece.', 'you turn up the volume and really focus. it’s just as moving as it was when you first heard it.', 'it’s been too long since you listened. you really needed this.']
album_middle: ['this album rules. you lament that the merch already sold out. ', 'your favorite song runs through your head for hours. what a gift.', 'the way that instrumental lick punctuates the lyrics. incredible.', 'volume up. by now you’ve got the tracklist memorized.', 'you decide to rewatch the livestream for a fresh take. how is it just as good live?', 'track 7 still makes you want to cry. pure poetry.', 'you put your favorite song on loop, as a treat. so good.', 'you’ve got your favorite track memorized now. feels like a mini accomplishment.', 'track 8 is an underrated masterpiece. how did you only just notice? you might have a new favorite song.']
album_high: ['good stuff. maybe you should abstain tomorrow, so you don’t get tired of it.', 'oh. you zoned out and the album’s almost over.', 'you put your favorite track on loop until you lose interest.', 'somehow you keep getting distracted after a couple songs.', 'you tap your foot along with the music while scrolling through your phone.']
mom: ['she says she’s finally in a good place to quit smoking. you promise to support her.', 'you catch her audibly puffing a cigarette. seems like quitting didn’t last long.', 'she says work has been stressful lately, but it’s getting easier.']
coffee: ['the barista you like is here today. they’re so nice. is it possible they like you too?', 'that cool barista isn’t as friendly today. maybe you were imagining things.', 'that barista isn’t here today. you should probably be drinking the free coffee at work anyway.']
doomscroll: ['it’s pretty gloomy in the #politics channel. feels so helpless sometimes.', 'everyone’s getting riled up today. maybe this time something will change.', 'a small win today, at least. how long will it last?']
game: ['might as well start over since you got stuck last time. the beginning reminds you how fun this game is.', 'after a while you’re caught up to where you left off before. maybe next time you’ll finally beat it.', 'you can’t seem to figure out what to do next. no wonder you stopped playing last time.']
shopping: ['right, you still need to get a new pillow. a couple hours later you emerge from your research with a contender.', 'you hunt around for the best price on that pillow you wanted. then you get distracted picking out things for Nacho so you can get free shipping.', 'you remember that pillow you were going to buy, but the price went way up. you empty your cart. they’ll be on discount eventually.']
dinner: ['you decide to go with that easy pasta dish. way better than a frozen meal.', 'there’s a new recipe you’ve been meaning to try. it takes all night, but it’s absolutely delicious.', 'that new recipe is a little underwhelming this time. what did you do wrong?']
book: ['it’s a fascinating topic, but it’s dense reading. will you ever finish it?', 'you notice you’ve been reading the same page over and over. maybe you need something lighter.', 'you keep falling asleep reading, so you give in and take a nap. it‘s glorious.']
chores: ['you have so much stuff. you spend a while organizing the hallway closet, and it looks much better.', 'you bring some donations to Goodwill. feels good to have more space.', 'World Market is having a sale. couldn’t hurt to buy a few useful things.']
nacho: ['you watch him romp for a while. he loves spending time together. so do you.', 'you notice his paw is swollen again, so you clean it and apply some of that homemade salve.', 'his paw looks much better now. you play with him awhile, carefully.']
friend: ['it’s nice to see her. she’s dating someone new. she seems happy.', 'her boyfriend sounds iffy. it’s good to see her, though.', 'she’s single again. she keeps bringing up how much she misses her boyfriend.']
dating: ['you swipe through some profiles. hopefully someone cool will write back.', 'you have a cute little back-and-forth with someone. you try not to get too excited, but it kind of makes your night.', 'when you check your messages, the last conversation says “profile suspended.” great.']
movie: ['you trawl Netflix and pick one you haven’t heard of. good story, good acting. makes you think.', 'after tons of scrolling through titles, nothing grabs you. you vow to go to an actual theater next time.', 'you splurge on a movie ticket AND a large popcorn. it’s indulgent but it feels good.']
epilogue: ['the warehouse fire from last week is still blazing. it must be serious.', 'your CD arrives in the mail.', 'you check your phone. someone posted a link to an album release livestream.', 'the week’s almost over. soon you’ll have some big decisions to think about. you can’t explain why, but it’s starting to hit you: the world out there is full of paths you could take. the freedom is overwhelming.']
--
day: day + 1
daytime: true
config.style.page.verticalAlign: "center"
config.header.center: ""
--
[javascript]
daytoday = daysoftheweek.shift();
[continue]
[if day == 2 || day == 3 || day == 8 || day == 9 || day == 10; align center]
~~[[Day {day}->weekend activities]]~~
[continue]
[if day == 1 || day == 4 || day == 5 || day == 6 || day == 7; align center]
~~[[Day {day}->weekday activities]]~~
[continue]
[if day == 11; align center]
~~[[Day {day}->epilogue]]~~
[continue]config.style.page.verticalAlign: "top"
config.header.center: "DAY {day} ({daytoday})"
--
[if daytime]
work today. you turn on the news during your commute.
[else]
time to head home. better get on the road to beat the traffic.
[continue]
[javascript]
if (daytime === true) {
write(dailyday.at(0));
dailyday.push(dailyday.shift());
} else {
write(dailynight.at(0));
dailynight.push(dailynight.shift());
}
[continue]
[if daytime]
the morning goes by quickly. you’ve got an hour for lunch.
[[listen to the album]]\
[[call mom]]\
[[go get a coffee]]\
[[doomscroll in the atrium]]
[else]
you shouldn’t stay up too late, but you’ve got some time before bed.
[[listen to the album]]\
[[play a game]]\
[[do some online shopping]]\
[[cook a nice dinner]]
[continue]
config.style.page.verticalAlign: "top"
config.header.center: "DAY {day} ({daytoday})"
--
[if daytime && day != 8]
it’s the weekend. you check your phone while Nacho eats breakfast.
[continue]
[if daytime && day == 8]
work today. you turn on the news during your commute.
[continue]
[if !daytime]
it’s already getting dark, but the day’s not over yet.
[continue]
[javascript]
if (daytime === true) {
write(dailyday.at(0));
dailyday.push(dailyday.shift());
} else {
write(dailynight.at(0));
dailynight.push(dailynight.shift());
}
[continue]
[if daytime]
what will you do today?
[[listen to the album]]\
[[read a book]]\
[[clean up around the house]]\
[[hang out with Nacho]]
[else]
what will you do tonight?
[[listen to the album]]\
[[have dinner with a friend]]\
[[check the dating app]]\
[[watch a movie]]
[continue]spin: spin - 1
--
you step out to the parking lot and give your mom a call.
[javascript]
write(mom.at(0));
mom.push(mom.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
it’s nice out, so you walk over to the good coffee shop.
[javascript]
write(coffee.at(0));
coffee.push(coffee.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
you know you shouldn’t, but...
[javascript]
write(doomscroll.at(0));
doomscroll.push(doomscroll.shift());
[continue]
{embed passage: 'rest of day'}spin: spin + 1
--
you pop in your headphones.
{embed passage: 'spin select'}spin: spin - 1
--
spending time with Nacho always makes you happy.
[javascript]
write(nacho.at(0));
nacho.push(nacho.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
you text Pearl and she’s down to get some food.
[javascript]
write(friend.at(0));
friend.push(friend.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
putting things in order is always calming.
[javascript]
write(chores.at(0));
chores.push(chores.shift());
[continue]
{embed passage: 'rest of day'}[if daytime]
[[go on with your day]]
[else]
[[the rest of the evening passes without incident.->new day]]
[continue][javascript]
write(album_middle.at(0));
album_middle.push(album_middle.shift());
[continue]
{embed passage: 'rest of day'}[javascript]
write(album_low.at(0));
album_low.push(album_low.shift());
[continue]
{embed passage: 'rest of day'}[javascript]
write(album_high.at(0));
album_high.push(album_high.shift());
[continue]
{embed passage: 'rest of day'}[if spin > 8]
{embed passage: 'spin high'}
[continue]
[if spin < 9 && spin > 2]
{embed passage: 'spin middle'}
[continue]
[if spin < 3]
{embed passage: 'spin low'}
[continue]daytime: false
--
[if day == 2 || day == 3 || day == 8 || day == 9 || day == 10]
{embed passage: 'weekend activities'}
[else]
{embed passage: 'weekday activities'}
[continue]spin: spin - 1
--
you open that mobile game you’ve been wanting to finish.
[javascript]
write(game.at(0));
game.push(game.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
you browse the front page first. nothing interesting on sale.
[javascript]
write(shopping.at(0));
shopping.push(shopping.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
you do enjoy eating a meal that isn’t from a can or left over from work.
[javascript]
write(dinner.at(0));
dinner.push(dinner.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
good idea. you can finally finish that library book.
[javascript]
write(book.at(0));
book.push(book.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
do people even meet each other on apps anymore?
[javascript]
write(dating.at(0));
dating.push(dating.shift());
[continue]
{embed passage: 'rest of day'}spin: spin - 1
--
yeah, a movie sounds great. might help to take your mind off things.
[javascript]
write(movie.at(0));
movie.push(movie.shift());
[continue]
{embed passage: 'rest of day'}config.style.page.verticalAlign: "top"
config.header.center: "DAY {day} ({daytoday})"
--
it’s Monday morning. you can’t put off deciding any longer. go back to work and get paid, or stay home and give yourself the week off.
[[go back to work]]\
[[take the week off]]day: day + 1
config.body.transition.name: "crossfade"
config.body.transition.duration: '900ms'
--
[javascript]
daytoday = daysoftheweek.shift();
write(epilogue.at(0));
epilogue.push(epilogue.shift());
if (day === 12) {
write ('<br><br>');
if (working === true) {
write ('you go through the motions. one foot in front of the other.');
} else {
write ('you laze around the house pretending it’s the longest weekend ever. it helps.');
}
}
if (day === 13) {
write ('<br><br>');
if (spin < 3) {
write ('you put it on the shelf with your other music.');
} else if (spin > 7) {
write ('maybe you can return it for a refund.');
} else {
write ('you open it immediately and read the liner notes cover to cover.');
}
}
if (day === 14) {
write ('<br><br>');
if (spin < 3) {
write ('sure, might as well. you put it on in the background while you go about your day.');
} else if (spin > 7) {
write ('you were thinking you might take a break from music for a while.');
} else {
write ('you put it on for a while, but decide you\’d rather be listening to your new CD.');
}
}
[continue]
[if day == 15]
you’ve been on autopilot for a long time. sure, it feels like you’re making your own choices, but they’re all from the same limited menu. who says those are your only choices? have you ever thought about rewriting the menu?
[[your phone pings with an email notification.]]
[else]
[[another day passes.]]
[continue]it’s not like you want to go back to work, but you don’t know what’s coming next, and the extra paycheck will help.
when you get home, you text some friends and tell them you got laid off. they’re very sympathetic. you feel a little better.
[[another day passes.]]working: false
--
you deserve the week off. you can figure out the money thing later. you’re never going back.
after you’ve whiled away the morning, you text some friends and tell them you got laid off. they’re very sympathetic. you feel a little better.
[[another day passes.]]you must be on the superfan mailing list from when you bought the CD. they’re announcing a presale for the upcoming tour.
[if spin < 3]
it’s funny: for a few days you thought music could be the thing to get you out of this loop, but now you can already feel the album fading from your mind. just like the last one you thought would change everything.
you hit delete and unsubscribe. the CD will always be there if you need it. maybe someday you will.
[continue]
[if spin > 7]
it’s funny: for a few days you thought music could be the thing to get you out of this loop, but you don’t feel like listening to the album anymore. just like the last one you thought would change everything.
maybe it was just a passing phase. you delete the email. there are better uses of your time and money. you just have to figure out what they are.
[continue]
[if spin < 8 && spin > 2]
you can think of a thousand reasons not to go, but you’re done with excuses. this time, _things will change_. there’s plenty of time now to do everything you want to do. you can finish that library book, for one thing. you can go to a protest by yourself. maybe you’ll even go back to the good coffee shop and talk to that barista.
plus, you’ve never seen your favorite artist live. your heart leaps. there’s no doubt in your mind: for right now, you know exactly what your future holds.
[continue]
[align center]
**THE END**
[[⏮ replay->Intro]]