Fantasy Football Without the Homework

Posted on October 21st, 2026.

Just after 1:00 on a Sunday

The league board before the deadline
Before 1:00 you can see who's done, but not who they picked.

Most Sundays this fall, my wife and I sit down for the 1 PM NFL games and do the same thing as soon as they kick off: we open Rafters and see who everybody picked.

"Wow, we both went with Brock Purdy."

"Oooh, you used Jahmyr Gibbs this week?"

Until 1:00, nobody in the league can see anyone else's lineup. You can see how many slots each person has filled, but not who they picked. Then the deadline passes, every lineup appears at once, and the texting starts.

Rafters is a fantasy football game I built this summer for our family league. You pick five players a week, and once you use someone, he's gone for the rest of your season.

The league I cut

I'm a big fantasy football player. Last year I was in five leagues, and it had stopped being fun. With that many teams you end up with a smattering of players everywhere, so you can never really root for anyone. Even when you had a guy you liked, you were playing against him in another league. Keeping up with all of them had turned into a chore.

So this year I decided to cut back. The college league I've been in for over 10 years and the high school league that's been around even longer weren't going anywhere. The one that made sense to drop was the newest: a league my friend and I had started a couple of years ago so our partners could join in, since we talk about fantasy all season anyway.

It was the right call on paper. That league was never as serious. Nobody was working the waiver wire, and I wasn't the only one ready to let it go.

My wife, half joking and half not, saw it differently: "Oh, of course it's the one I'm in that's getting cut. The girls don't get to play. Sorry, boys only."

She had a point. Regular fantasy football asks a lot: a draft, a roster to manage, trades, the waiver wire every week. If you don't follow the NFL closely, you're not really being kept out, but you are set up to get crushed.

So the question became: could I make something that kept the fun part of fantasy, picking players and rooting for them on Sunday, without everything that makes it a part-time job? Something anyone could play well, whether or not they follow football closely. Open it once a week, spend a few minutes, then just watch.

The game that disappeared

The first thing I reached for was an old idea: a game I remembered playing as a kid. I got the Sports Illustrated for Kids magazine, and I loved their website. This was old-school internet, around 2005, with little Flash games and message boards. The game I thought of was Grid-O-Matic, a salary-style fantasy football game.

Every week you got a budget, the better players cost more, and you picked a lineup that scored fantasy points on one huge leaderboard of everyone playing. It was a lot like the daily fantasy salary games that got popular later.

Grid-O-Matic sign-in page on Sports Illustrated for Kids, 2005

Grid-O-Matic's sign-in page in 2005, via the Wayback Machine. It's all that's left.

That screenshot is about all that survives. The Wayback Machine saved the sign-in page, but you can't get past it, and I couldn't find a single image of the game itself anywhere. It's lost to the archives of the internet.

The format is basically gone too. ESPN retired its version. SI's salary cap games are gone. The weekly-budget format survives almost entirely as real-money daily fantasy or high-stakes entry-fee leagues. There was nowhere left to play it.

I looked at other formats too. Survivor pools were out: with four people, it's over in three weeks and then nobody has anything to do. Confidence pick'em was a different vibe entirely. I wanted people rooting for players, not game results, because that's what makes it feel like fantasy.

The format that fit was one-and-done: pick a full lineup every week from anyone in the NFL, but once you use a player, he's gone for the rest of your season. I found one hosted version that worked roughly that way. It cost about $100 a season, and I wasn't going to ask a group I wasn't sure would stay interested to pay for that.

How Rafters works:

Building it myself almost didn't happen. Before any code existed, my honest take was that this "isn't important enough for the level of work and potential costs to create." Mostly I assumed the NFL data would be locked down or expensive.

It wasn't. Sleeper's API needs no key and returns every player along with weekly fantasy points already calculated. ESPN's scoreboard gives kickoff times. Historical stats are published as open data. About ten minutes of digging turned "probably not" into "let's go."

I think that assumption stops a lot of people from building small things, and not just sports apps. We assume the data won't be available, or there's no free way to host it, or it'll be way harder to build than it is. For me, all three turned out to be wrong.

As easy as Wordle

Before writing any rules, I wrote down one constraint, and almost every decision after that came back to it. Picture someone who could only name a handful of NFL players off the top of their head. They should be able to make their picks on a phone in under three minutes.

The phone part ruled out a lot on its own. If this was a spreadsheet you had to open on a laptop and type names into, it was never going to work, and it wouldn't be worth doing.

The time part wasn't about anyone's attention span. It was about what kind of thing this should be. I wanted making your Rafters picks to feel like playing Wordle or Connections from the New York Times: something you do in a couple of minutes because it's fun, simple and well made, not a chore you put off.

Rafters app icon on a phone home screen next to theScore, Sleeper and NYT Games

Right where it belongs on my home screen.

I had specific people in mind: my wife, and my friend's girlfriend. Both were up for a game with the rest of us, but neither was going to spend the season tracking depth charts. The goal was never to water it down. It's a game for anyone, and it still has to hold up for someone who knows every team inside and out (like me and my friend). Football knowledge should help, just not decide everything before Week 1.

That constraint made a few decisions for me.

Kickers and defenses had to go, even though I wanted them. My first lineup had QB, RB, WR, TE, FLEX, K and DST, because it was what everyone was used to from regular fantasy. But in a one-and-done game that means sixteen kicker picks and sixteen defense picks, positions nobody has an opinion about. How do you pick a kicker for a week? They're basically all the same. I gave up the familiar lineup to skip thirty-two boring picks.

Projections stay, even though they might make everyone pick the same people. Showing each player's projected points means lineups might converge on the same names, and that was a real argument against them. But without projections, anyone who doesn't follow the depth charts is guessing, maybe picking a backup quarterback because they recognize the name. Projections give everyone the same starting point. Convergence also matters less in this format: if everyone uses Justin Jefferson in Week 1, everyone is equally out of Jefferson. The strategy comes down to when you spend a player.

Player search showing unavailable players with reasons
Search "brock" and everyone still shows up, with the reason you can't pick them.

Never hide a player. Grey him out and say why. Picture someone going to put in Mahomes and thinking, "What the hell, I haven't picked him yet, why won't it let me pick him?" So players you can't pick never disappear from the list or from search. They grey out with a reason: used in Week 4, on bye, played Thursday. A search that returns nothing is the worst thing that screen can do, because someone will decide the app is broken.

Scoring by placement, to keep the standings tight. This one adds a little complexity, and it might be unintuitive at first. You'd expect to just add up your points every week. But think about how that feels as the weeks go by. Whoever falls behind finds it depressing every time they open the leaderboard. Miss one week and you might never catch up.

Season standings through Week 6
Standings points on the right, total score underneath. Look at who has the most total score.

So Rafters keeps two separate numbers:

Most standings points after Week 16 wins. A blowout week is worth the same as winning by a tenth of a point, so one huge Sunday can't bury everyone, and one bad week can't sink your season.

That's also where the game gets deeper for people who want to dig in. Since winning by 30 earns nothing extra, using a bunch of top players to win a week by a mile is a waste. When to spend a star depends on what you think everyone else will do. You can't see this week's picks until 1:00, but you can look back at who everyone has already used. This is our first season, so we're figuring out what good strategy looks like in real time.

One deadline

The biggest design call in the whole project was about Thursday night football, and it's one of the things that makes Rafters different from most fantasy games.

Every normal fantasy app locks each player when his game starts. The first version of my plan did the same, but then I thought about what it would actually be like to play. I didn't want everyone wondering, "Great, now do I have to make my picks by Thursday?" just because a Thursday game exists. But you also can't let someone pick a player whose game already happened, after they've seen how he did.

Picks page with all five slots filled
A full lineup. The "Before lock" line lists the teams that play before the deadline, so their players are off the board this week.

I wanted everything to lock at 1 PM on Sunday. The question was what to do with the games that kick off earlier.

So I stopped thinking about when players lock. Players whose games start before the deadline aren't locked, they're ineligible that week. They're just off the board. One rule, "does this game start at or after Sunday at 1:00?", handles Thursday night, the London morning games, Thanksgiving, Christmas, and the December Saturday games with no special cases.

That rule is also what makes the 1:00 reveal possible. Since nothing locks early, there's nothing to stagger. Everyone's lineup stays hidden until the same moment, then everything appears at once.

It's a real tradeoff, and it could get annoying. Late in the season, when your options are thin, a guy you were saving might land on a Thursday night game and be off the board that week. "What the heck, I wanted to use him." I think one deadline, one reveal and one simple rule are worth it, but this is another one where I'll find out in December.

Writing it down before building it

I'm not handwriting any code. I build these things with AI tools (a combination of Claude Code, Codex, and my Hermes agent), and from earlier projects I'd learned that the better the information you give them, the better the result.

So before any code, I wrote a full product requirements doc: the rules, and more importantly, why each rule exists. Five slots. One-and-done per manager. Placement standings. One deadline. What happens when a game gets canceled. What happens when someone joins late. What's deliberately left out.

That doc went through four rounds of revision in one sitting, and most of the changes came from me pushing back on my first draft. I'd rather argue it out on paper, where changes are cheap, than in code, where they're expensive. For quick throwaway projects I'll just start building, but for something I'd been turning over in my head for a while, with a clear picture of what I wanted, it was worth doing this work up front.

It paid off. The first build, straight from the spec, was impressively good. It went live at rafters.lol on August 31, two weeks before the first Sunday deadline.

Beyond the AI subscription I was already paying for, the only cost was $1.54 for the domain. The code lives on GitHub, and the app and database both run on free tiers. That would probably change if this ever grew. At a hundred players I'd likely need a paid database plan, and I'm not sure I could keep calling those data sources for free.

My "this is actually going to work" moment came right after launch. I opened it on my phone and used the developer tools we had built to simulate through a week: locked, live, and final. It was pulling real data from Sleeper and ESPN for free, it showed player headshots, and because I'd written design guidance into the spec, it didn't look like a cheap AI-slop app. It was something I'd be comfortable sending to someone without them wondering what hacky piece of junk I wanted them to play.

Why "Rafters"

The naming came late. The plan was done, and "one-and-done fantasy football" doesn't roll off the tongue. The shortlist included Burn Pile, Punch Card, Leftovers, and Last Call. Burn Pile almost won, because "burn" was already the verb this format creates: "don't burn Bijan in Week 1."

Rafters won because it describes the rule. When a team retires a number, it hangs a banner in the rafters for good. Use a player once and he goes up in your rafters. That banner shape became the logo, the pick cards, and every team's icon.

My Season page showing each week's five players
My Season: every player I've used, hung in my rafters. The little #1 marks the top scorer at his position that week.
Team settings with the banner icon and color picker
Every team gets a banner of its own.

What real players teach you

The league ended up as four of us: me (James Squad), my wife (The Purples), my sister (Elizabeth), and my brother-in-law (Team Renteria). My friend and his girlfriend, who I had in mind the whole time I was designing this, never ended up joining. I didn't want to badger them into playing my game.

You can picture how people will use something all you want, but playing it for real shows you things you'd never come up with yourself.

Stat breakdown for Brock Purdy's 31.3-point week
Tap any score to see what's behind it, like Brock Purdy's 31.3 in Week 3.

I learned a lot in the first live week alone. It was the first time Rafters went through every phase with real games: making picks, games in progress, and the week wrapped up. Thankfully nothing fundamental broke, but I kept noticing small things. Some labels didn't quite say what they meant. Some text was hard to read on a phone. The five picks didn't quite fit on one screen. It's a family league and nobody files bug reports, so almost every change since kickoff came from me playing along and noticing what was confusing.

My favorite fix: a progress label counted NFL games left when it should have counted players left, because two of your picks can play in the same game. I only noticed it once real games were on the screen.

Watching everyone else play taught me even more. My sister gets the "new week is open" email every Wednesday, and she has all five picks in within about ten minutes. My wife is the opposite. She's often on the couch Sunday morning saying "oh shoot, I gotta do my Rafters picks" when the reminder email arrives. I'm somewhere in the middle: I'll lock in one or two guys, then think about the rest all week.

Being able to see how many slots someone has filled before the deadline, without seeing who, turned out to be its own little window into how people approach the game. I hadn't expected that.

And the person I made this for? She loves it. She's checking scores all Sunday as the games happen: where she stands, who she has left, whether her picks are paying off, and who's screwing her this week with a low score. She's still making real decisions, thinking about who to go with each week, without tracking the waiver wire and securing her RB1's handcuff, which was always the hardest part of the full league for her. And I think the cherry on top is that her husband made her a game. That part I'm pretty proud of.

Week 5 final results
Week 5: I beat my sister by 0.4 points. That's worth exactly as much as winning by 40.

Through Week 6, I'm in first with 11 standings points, then Elizabeth with 10, The Purples with 9 and Team Renteria with 6. The funny part is that I have the lowest total score of the top three. My wife has scored the most fantasy points in the league and sits in third. I've won the last three weeks, and under placement scoring, a win is a win no matter the margin. Whether that feels fair to her is another question.

The thing I'm happiest about is how close the scores have been. It's rarely decided during the early games on Sunday. Usually someone has a player left on Sunday or Monday night who could change the order. That's exactly what placement scoring was meant to do.

Strategy is still early. Seven weeks in, there are plenty of good players left. A few things have surprised me:

What I'm taking away from this

Don't say no too early. I remembered a game I loved as a kid, found out nothing like it existed anymore, and built my own version in a couple of weeks without writing code myself. You still need some know-how to get the pieces wired together. But it no longer takes a team of developers and a server rack to make the thing you wish existed. The data and the hosting were both free. The only thing that almost stopped me was my own assumption that it wouldn't work.

And the answer keeps changing. These tools have moved so fast that something that wasn't realistic for one person a year or two ago might be a weekend project now. If you've got an idea you shelved because it seemed like too much, it's worth checking again.

Build for the player and the student. Rafters has two kinds of people in it: people who want to play, and people who want to study. I didn't want a game for one camp with the other tagging along. Someone who doesn't follow football can make their picks off projections in a few minutes and still win a week. Someone who does can dig into matchups: this receiver is facing a defense with weak cornerbacks, so maybe this is his week. That knowledge absolutely helps, and it's fun to use. I tightened the skill curve without flattening it. Knowing football helps, you don't need it to compete, and nobody gets smoked every single week. Both camps have a reason to come back on Wednesday.

Constraints make the product. A phone, a few minutes a week, and a league where not everyone follows the NFL. That sounds limiting, but it's why Rafters doesn't feel like every other fantasy app. I couldn't find a game built for this group of people, and those constraints are what turned it into one.

I'm not trying to build the next big fantasy platform. I build things because I want them to exist, the same way I made Spell Garden for my wife. Next year I'd like to run it again with six to eight people, and maybe, if it's not too much work, let other groups start their own leagues. For now, I'm seeing this season through. I'll write a follow-up after Week 16 on how the strategy, and that one-deadline rule, actually held up.

And next Sunday at 1:00, we'll be on the couch again, seeing who everyone picked.