Backstage
About 200 hours in, since July 15, 2026.
Scoreboards
- Scoreboards, under Explore: the boards on a slider hung from the bar. The first is Bug reports. Each has its own address -- scoreboards.lafter.gg/bugs -- and no heading: the slider names it.
- A bug report sent signed in, or from an address an account has, can be given a point from the mail it arrives in: Approve gives it there and then, with a line saying so, no page to land on. The board is the points, by display name. The one it goes to hears of it in their inbox; the board says nothing of it.
- An admin can set anyone's total with the pencil beside the row, or put somebody on with the + under the board, by name or Riot ID.
Site
- The bug report mail is text: who, page, IP, what happened, the console, and Approve. No logo block, no footer.
- A bug report can carry the last sixty lines the browser's console saw. Send error logs, in the bottom left corner, is ticked; untick it to leave them out.
- A bug report opens with From: your address, filled in, or whatever you type -- an email or a name -- for updates. Anonymous beside it sends it with nothing.
- The bug report is From, What happened and Images (optional). The errors box is gone: the console goes with it. Anonymous and Send error logs are bubbles, lit when on.
- Signed in, From is your account's address, locked, with your name above it; Anonymous is the one way round it, and the report says when it was on.
- In more than one org, the top bar names the one whose page you are on, then a white ... that opens the whole list on hover.
- https:// reads as written: the mono face no longer joins the two slashes into one.
- The top bar's tabs are spaced a little tighter.
- Play in the top bar is Explore: Lookup, Live, Tournaments, Scoreboards.
- Signed out, the top bar is Explore, Tools, Download and Sign In, the same as signed in.
- On a phone the menu opens as a panel over the page: Play, Tools and your account as groups, every link out at once, the tabs and corner buttons out of the way.
- On a phone an org's name fits on one line, and the bar and footer run edge to edge.
- Feste's send button is a >.
- The profile drawer and the inbox never open by themselves, reload or not. The profile tab has a dot until it is first opened.
- A slow lookup or a Feste reply in one tab no longer holds up every other tab in the same browser.
Orgs
- The Forms list on an org's Overview stays where it is; it no longer follows the scroll.
- Brackets, on the Overview, carries an Admin -- Stage link for whoever builds the org's brackets.
- An admin previewing a temp session is a temp session in the org whose page it is, and nowhere else.
- Joining is a dialog over the page, with an x. Closed, it goes to your inbox as a Verify note, and comes off it the moment you verify. The Join tab under the org's tabs opens it again.
- Membership is verified again every thirty days. A month on, the join tab asks for the work email again and the org's pages wait until it is; nothing of yours goes. Three months without verifying, the membership goes, and verifying brings it back.
- Stage is a tab beside Overview, Tournaments and Draft for whoever runs the org's brackets: site admins and the org's own admins. Not while previewing the org as an outsider.
- Joining hangs from the underside of the Overview, Tournaments and Draft strip and opens over the page; nothing moves for it.
Lookup
- Lookup is lookup.lafter.gg: a player at lookup.lafter.gg/Name-Tag, a team at lookup.lafter.gg/team/Name. Old lafter.gg/lookup links forward.
- An open game has a reload arrow beside its x: every player in it is looked up again, ranks and all.
- Each rank on a player's banner is its own square; hovering one lists every rank that queue has been seen at, newest first.
- When nothing on screen is long enough to score, the score panel is empty instead of keeping the last number.
- The hover also shows last split's end and peak and the best finish ever, read from the League client by a tester's Connector after a refresh.
Connector
- The live view inside the Connector asks as the account signed in to the Connector, so testers and admins get suggestions there. From 0.2.42.
- Signed in as a tester or admin, the Connector reads last split's ranks from the League client for players refreshed on Lookup. From 0.2.43.
- The settings gear is a square flush in the top-left corner. From 0.2.44.
Admin
- The account list leaves out the emulated players.
- Each account lists its orgs. Click one to make them that org's admin, or take it back.
- An op admin can make others op admin.
Stage
- The title sits at the top; every saved bracket runs along under it, an org a section with a round + to start one. The org slider is in the setup box beside the name.
- Formats are Worlds -- a Swiss to three wins, deciders best of three, then a knockout of the eight through, best of five -- MSI, a double elimination best of five with no reset, and Seasonal, everyone against everyone then the top four in a playoff. Custom is one of the pieces: Single, Double, Swiss, Round robin or Free, set with a click under it.
- Swiss pool heads read wins and losses, 2W-1L; the deciding pools carry their own series. Lines run from a pool to the two it feeds. Rounds fill the height.
- The setup box's form picker reads Link form.
- A new bracket is Untitled until named.
- Swiss is whole from the start: every round's pools -- 2-0, 1-1, 0-2 -- with exactly the cells the teams will fill, empty until the round before is done. Swiss has no losers' bracket; those pools are it.
- Lines run between cells, from a match to where its winner or loser lands, gold once the team is through.
- Team names in a bracket are gold links to the team's lookup, with the team's icon.
- A result is entered game by game: blocks you click to give a game to either team. Once a team has enough, the games not needed are struck through and cannot be given.
- A match's time is entered in the zone you pick and read by everyone in their own. Under it, when the setup box names an availability question, a week of hours shows how many of the two rosters are free; click an hour to put the match there.
- Standings tables show five rows; + more opens the whole table.
- Org admins can build for their org. Site admins see every org.
- On an org's pages, whoever can build for it can click a match on a published bracket and mark its games; the result shows at once.
- Stage is rebuilt. Pick the org, then a format: Single or Double elimination, Swiss, Round robin or Custom, each with its own options.
- Teams are a drawer off the left edge, like the profile's, under a teams icon. Drag them into seeds; Auto-fill seeds every locked team by Mirth.
- Stage heads the page with the org or tourney below it on a slider, each in its own face. A new bracket starts with that org's locked teams already seeded.
- Save, Discard and Publish sit at the very bottom, in the site's square buttons.
- Click a match for its time, series length and result; click a round for all of its matches at once.
- Emulate plays everything out by Mirth, for testing. Clear results undoes it.
- Save keeps a draft. Publish puts it on the org's Overview under Brackets and on its Tournaments page; later saves stay off them until published again.
- Stage is in the admin menu only while it is being built.
Draft
- Casters and Spectators are two lists under Teams, like Players and Teams. Casters are out of the Players list.
- A temp session on an address your account already verified is you: it never shows as a second row.
- The draft is the org's members' only. Signed in without a verified address for the org, you are sent to its Overview to join.
- An admin previewing a temp session looks and does not write: nothing is saved under the preview address.
- One row per Riot account. A second address on a temp session with the same Riot account cannot sign up again.
- A team can carry an icon: one of sixteen shapes in one of ten colours, picked by the captain or coach from the team card, and drawn beside the team's name everywhere.
- Hovering a Lanes cell that ends in an ellipsis lifts the whole run into a bubble under it.
- The draft is one page of players and teams, with your profile and your team in a drawer off the left edge. The drawer is on every tab of the org.
- Seats are Starter, Sub, Captain and Coach. An offer names the seat; a captain sets how many subs the team carries.
- Players can ask to join a team that takes requests. The captain answers from the Draft section of the drawer, which also lists offers out, each with Revoke.
- The side slider reads Starter, Sub, Captain, Coach, Caster. Starter and Sub are the seat you want.
- Captains and coaches keep their whole profile in the drawer, lanes and all, with the team above it.
- A captain with no team yet is in the list, as Captain.
- Click a player in the list for their profile: accounts, lanes, their note, and Offer.
- Abandon, at the foot of the drawer, leaves the org: membership, a temp session's access, the signup and open offers. Not while on a team there.
- Click a team in the list for its roster as banners; its name is the lookup. In a banner, the name is the lookup and the rest opens the player.
- The Teams list lines up under its titles, Mirth after Region.
- Join requests on the Draft heading reads Open, in gold, or Closed, in grey.
- Players, over the list, gives the total beside how many are free.
- Empty seats are banner-sized and say empty. A new team starts with no sub seat; the region sits beside the team name.
- Spectator is a side: off the player list, no offers, no requests. In an org nobody can sign up for, everyone is a spectator.
- A spectator gets no drawer: no profile, no Abandon.
- How captains see you, in the drawer, is Preferences.
- The full Players and Teams lists open as wide as the page's, one line a row, with a rule between rows.
- The offer names the player, linked to their lookup, with the seat beside the name. Their 1st lane is picked to start, and their Extra note sits above your message.
- Roster rows show a teammate's level, rank and mirth when you hover them; your own row is just your seat. Seat pickers line up at the right.
- For a captain or coach the Draft section sits under the team. A coach's profile is just Extra: no lanes.
- An offer you send shows in the Draft section straight away, under Offers, with its lanes. Join requests is a word on the Draft heading you click to turn on or off.
- The team card reads Team and Mirth, with the roster count alone.
- Another player's banner carries the same mirth label and arrow as yours.
- Lanes in the list are in the cards' colours, best first: gold, silver, bronze, and struck red for a lane someone will not play.
- A free agent switch, and a Status column: Free agent, Not looking or Signed for players; Locked, Open or Closed for teams.
- Mirth, the draft's points: from your highest ranked account, LP included. It follows your rank until your first tournament game, then moves with how you play against the lobby.
- Roster, team and account rows are banners with the icon, rank and level; each links to its lookup.
- Team names are checked as they are typed.
- The whole team hears who joined and who left.
Inbox
- A temp session has the inbox too: what the site sends its address. No welcome letter, no mail between people -- those are an account's. Signing up brings its messages along.
- Notifications, at the foot of the drawer, are bubbles: one a source, gold when on. On to begin with.
- The welcome letter names Scoreboards. A welcome you binned stays binned when its words change.
- Mail between accounts: compose, reply, threads, Starred, Sent and Trash, search, pins, and selecting several at once.
- To suggests players as you type, from anyone looked up, by Riot ID or display name.
- Messages carry their org's name in its own face, or Lafter's. A filter hides an org, its team messages, or Lafter's.
- Notify, at the foot of the drawer, turns Lafter's or an org's notifications off. The a in the logo stops laughing while Lafter's are off.
- Picking in the filter or Notify leaves the menu open.
- The inbox and the draft drawer start closed on every page, and stay as they were when the page reloads itself.
- Team messages sit in their own group under the rest. Drag a heading to swap them.
- Every entry reads the same way, as its own card: whose it is and what (Amazon Offer, Lafter Welcome) and when, then the one line that matters, then the rest cut short.
- An open offer or request has a green check and a red x under its star and trash can. The trash can is red, like the letter's.
- Decline and Accept, and every red or green button, are tinted rather than solid.
- A welcome letter once per account, with a walkthrough of the site.
- The new-here dot stays gone across every lafter.gg subdomain once the inbox has been opened.
Feste
- Asked how to find or do something, Feste can point at it: the thing glows for a moment, opens, or wears a dot until it is clicked. Only when asked, one or two things at most.
- Feste, the help chat, is the mask bottom right. Ask anything about Lafter; answers link the page you need.
- For accounts and temp sessions, with a few questions an hour and a day, one at a time, and a daily budget. An admin can turn it off or change any limit from the admin menu.
- The chat keeps its whole history, under the opening line.
- A dot on the mask for an answer you have not read yet.
- Out of API credit, Feste says it is resting, and admins get an Alert in their inbox once a day.
- Feste flags a message that threatens, harasses, is sexual, mentions self-harm, asks for someone's details or tries to get round its instructions. Flagged messages are emailed to the admins, and counted under Limits.
- In answers, Lafter and every org name link home, set in their own faces.
- Feste answers more: 150 questions a day each, longer questions and answers, more of the conversation remembered, and the stronger model for anything involved, temp sessions included.
- Feste's admin panel is two numbers: questions a day per person, and dollars a month.
Site
- Play, in the top bar, holds Lookup, Live and Tournaments, the way Tools holds Muster and Rehearsal. The welcome letter lists them the same way.
- Beside the logo, each of your orgs gets its own plus: Lafter + amazon + experimental.
- The tournaments search sits right under the title, as wide as the word until you click it.
Backstage
- The line under the title is the hours put into Lafter so far.
- Each era shows the Lafter version it shipped as. This one is 2.0; the Connector keeps its own numbers.
- Date ranges read with a dash.
Muster
- A form for one org reads Org/Tourney where it said Organization.
Terms and privacy
- The Terms of Service and Privacy Policy cover org spaces and temp sessions, the draft, mail, Feste and what it sends to Anthropic, flagged messages, seven-day deletion, and every cookie the site sets.
Account
- A face on the account page: a laugh, ours or a classic emoji. An emoji is the whole picture, no ring; ours fill their circle.
- Linked accounts and organizations are banners, each with a red x. The x on an org abandons it: its draft signup and open offers go with it. Not while on a team there.
- The org list is Organizations / Tournaments, under a rule that parts it from the accounts.
- Click your username or email to change it. A username changes at once; an email once the new address follows its link, after your password (or a mailed code). The address you had is mailed a link to undo it for seven days.
- The x beside an account or org is a bare red x at the left.
- Click your display name to change it, with the same emailed undo.
- The laughing a in the Lafter wordmark is gold and laughs everywhere it appears, the small ones included.
- Delete account sits beside Sign Out. The account goes seven days later; Keep account undoes it until then.
- The account menu reads Account, Settings, Preferences, with a dot while Preferences is empty.
- A temp session that makes an account keeps its draft signup, its offers and its form answers.
- An account on a team roster no longer holds up everyone else's deletion.
Orgs
- Experimental: a tournament space open to every account, for trying things out. Its name reads like a line of code, and its card is just its name.
- Experimental's caret blinks everywhere its name appears, the org page heading included.
- Joining an org hangs from the top of its page, text centred, with a tab under it to fold it away.
- Tournament cards are centred, larger, and count members. While there are few they stack full width; a search sits under the heading.
- An admin can ban someone from an org's tournament. The Tournaments list shows green where you can take part, a check where you have a draft profile, and a red cross where you are banned.
- Joining an org is a tab up from the bottom edge, with the one-time-link details behind an i.
- Experimental is closed to sign-ups. Its card has a red border, and its join tab and tooltip say so.
- Experimental's rules open with a note: it is for building the tools, its players and teams are made up.
- Experimental has a hundred emulated players: sixteen teams, some with subs and coaches, fifteen locked and one still drafting.
- Emulated players never come up in Lookup's suggestions or a message's To. Their names still look up, from our own records only.
- A team's lookup page loads. Any address with a page's name followed by more path was a server error, and is a not-found now.
Site
- NA, EUW and the rest are a region, not a server.
- Summoner level reads lvl.
- Every × that removes something is the same ringed ×.
- The admin menu slides up from the bottom edge, starts closed, and lays its sections side by side.
- The bug button and Feste slide out with the drawers on their side.
- On a phone: a menu button for the links, drawers that fill the screen one at a time, and the player and team lists as small cards.
Connector
- 0.2.22 to 0.2.41. Settings behind a gear, the account among them, and a theme switch that matches the site's.
- An overlay on the game, and the Connector comes forward when champion select or the game starts.
- Maximized, it shows the live page in one HUD strip, scaled with the screen.
- Updates are checked while you play and shown when you are idle. Click the version to check now.
- Builds ship from GitHub Actions and are refused if signed with the wrong key.
Live
- Suggestions for everyone in the lobby, for the lane they are on.
- The game shows while it is being played, and rows update in place.
- Runes are the champion banner's second row, from our own matches.
Data
- Champion stats per patch, a power tier per champion, and five picks read as one team.
- The match scraper works from a cohort of ranked players, Emerald up, solo/duo and flex only.
- Champions are matched by Riot's key, not their display name.
Lookup
- The lookup tool is at
lafter.gg/lookup/Name-Tag. It was on cast.lafter.gg. - Selecting a match scrolls to the breakdown. Arrows at the edge of the screen move between the breakdown and the match you picked.
- The banner reads Riot ID, then rank, then server.
- A refresh a normal account cannot spend says why. It used to do nothing.
Site
- Tools menu in the top bar, holding Muster and Rehearsal.
- Muster is open to any account. Publishing a form to the public or to an org still needs an admin.
- An expired Riot key returns an error naming the key rather than a generic failure.
- Every Backstage entry has a page of its own at
/backstage/<date>-<slug>. - An org's own tabs sit in the middle of the top bar rather than under its lockup.
- The Tools and account menus open on the Live page. It loaded
script.js twice, so each click opened a menu and closed it again. - No rule between the Linked Accounts row and the list of them. It read as a divider between two things while it sat inside one.
Muster
- The Riot ID question no longer asks for a server. It is read from the account.
- A Riot ID question can be set to take alt accounts. Each one verifies on Enter and shows as a banner under the main account.
- The roster row shows the highest-ranked account somebody declared; the rest are behind an expander.
- Text answers can be ticked off as they are read. Ticks are per reader, each answer carries its date, and blank answers collapse into one row that opens. On by default for long text and notes; a switch on the question either way.
- The availability heat map shows one week at a time. The week and month views disagreed about how many people were free.
- A question's heat map is the one that question asked. The overlay was showing every heat map on the form, including on questions that had none.
- The five-row cap on a results list works. Rows it hid were still being drawn, so a list of nineteen showed nineteen with "+ 14 more" under it.
- Servers Riot merged away read as the server that replaced them: PH, SG and TH are SEA. Answers stored before the merge were being counted as servers, so a form's results listed SG.
tools/merge_sea_regions.php rewrites the stored answers.
Live
- The enemy team in champ select is not five bots. The client withholds their names and ids outside customs, and a missing id was being read as a bot; those seats stay blank until the game starts, which is when Riot will say.
- Once the game starts the page shows who is actually in it — all ten, their champions, and the ranks we hold — rather than the last draft state.
- In game: every name, KDA, CS, level and the items each of the ten is holding, off the client's own API. Riot publishes nothing about a game in progress, so the Connector reads it locally and pushes it down the relay the draft already uses.
- Items suggested for the champion you are on — what wins on it, and what you build on it — from match payloads already stored. No Riot call.
- A hovered pick or ban is faded until it is locked.
Connector
- 0.2.13. Polls the client's live game API once a game starts, so the Live page keeps going past champion select.
- The version sits at the right edge when there is no sync label beside it.
- Watch link is one line, and the code switch reads
code.
Riot
- A Riot ID lookup finds the server the account is on. Naming a region skipped the search, so a form defaulting to NA reported SEA players as NA and unranked.
- A region transfer leaves a record on the old server — same level, no games. The lookup takes the server with games on it rather than the first that answers.
- A rank lookup that failed is stored as unread. It was stored as unranked.
Drafting
- The draft at
amazon.lafter.gg/draft. Captains send offers; players answer them from an inbox. - An offer holds no roster slot. Filling the seat voids the offers still out.
- The draft does not ask which lanes you play. It reads them from your answers to the org's form, or from your Lafter preferences, and shows them as the cards you set them on. Buttons for either, and the cards are a question only when neither has anything.
- A captain runs one team. It can be renamed or disbanded at any point, and disbands itself if they switch to player — the roster and any open offers with it.
- Captain and player swap from the banner under the title, which also carries your Riot ID.
- An offer picks its position from the lanes that player says they play.
- The inbox is docked as the draft page's right column. It was a button in the corner that opened a panel over the page, which is the shape of a notification — an offer is a thing you act on, beside the roster it would change.
- The captain's page is three columns: the team on the left, the pool and the other teams in the middle, offers on the right.
- An offer holds a seat. Offering to eight people for three places is how five of them find out they were a fallback.
- A captain picks a server they play on. A team is region locked and its captain is on it, so one run on a server they cannot queue on is a team a man short on the day. One server is shown rather than asked; somebody with no Riot ID on file yet still gets the full list.
- A team's name is unique across Lafter, and a team has no tag — the name is the whole of how one is told from another. A disbanded team stops holding its name.
- The lookup box takes a team name. A Riot ID carries its own discriminator, so a query with no hash is a team:
lafter.gg/lookup/Prime Squad. Published teams only — a roster still being built is a captain's working notes. - A Riot ID here is whichever we hold: the form answer, what the Connector linked, or what verification resolved. It was read off
users.riot_name, which Rehearsal writes with a synthetic account — so a captain could see a rehearsal session where their Riot ID should be, and anyone who only ever typed one into a form showed none. - The pool is one line per player — Riot ID, positions, level, rank, server — and every other account we hold for them under it, with the server each is on.
- A team plays on one server, picked when it is created. The pool is the people who can queue there: an account on it, or an answer saying they will play there. The row says which, so "SEA, will play NA" is on an NA captain's list and reads as what it is.
- A team is six seats, seven if it carries a coach. Publishing takes exactly five players — the coach is not one of them and nor is a sub. Until it publishes none of that is enforced, because sorting starters from cover before anyone has signed is work for its own sake.
- The captain takes a seat on their own roster and can sit in any of the three. A published roster is fixed until it is unpublished.
- Captain and player are one slider, and what the move costs is written between the two ends.
Muster
- 15-minute availability. Grid columns are quarter hours, labelled on the gridline.
- Availability calendar. Weekly pattern applied across a date range, with per-day overrides. Week, month, split and season views.
- Four scouting field types — Riot ID, servers, drag-to-rank positions, notes.
- Riot ID verification. Account and rank resolved through Riot. No form asks for a rank.
- Editable responses. Reopen and change. Wait between edits set per form.
- Org-wide form lock. Answers freeze; respondents keep read access to theirs.
- Builder rework. Settings pinned to the left edge, slug derived from the title, per-question numbering.
Accounts
- Account levels 0–5. Level 0 grants and revokes. Revocation applies on the next request.
- Unique display names, case- and whitespace-insensitive.
Tournament
- Placement by team rating. Rank seeds the starting number, weighted to the roster's best player; results move it. No rank floor.
- Verified player count on org pages. Admins open it for the roster: account and Riot ID status per person.
Connector
- No account needed to stream. Install, open League, draft goes live.
- Signed out sessions always require a watch code. Open links need an account.
- Retroactive claim on sign-in. Sessions that install already streamed attach to the account.
Orgs
- Work-email access to org forms. Emailed link opens the form. No account.
- Grants migrate to an account on sign-up, matched by browser or work address.
- Respondent list of verified addresses on the results page.
Muster
- Dedupe on verified email, so signed-out then signed-in is one response.
Muster
- Clean form URLs —
muster.lafter.gg/your-form. Fixed a regression from that work where every submission from a new link was rejected with "Missing form". - Availability grid transposed — days down, hours across, full width. Current hour marked. Results view matches.
- Form layout. Header block with a question count, separated questions, smaller required mark.
Site
- Theme switch on every page, persisted site-wide.
- 70 contrast failures fixed across both themes, checked against WCAG. Sign-in pages dropped their private copy of the palette.
- Terms and Privacy return 200 again at lafter.gg/terms and lafter.gg/privacy. Both had been blank since a folder move.
- Extensionless URLs, trailing slash optional. Old links redirect.
Connector
- "Require code to watch" turns off. A boolean was sent to Postgres in a form it rejects, in a spot that swallowed the error. Root cause of several failed earlier fixes.
Muster
- Forms save with "Required" unticked. Same boolean cause; the error blamed the slug.
- Builder: per-question description, preview including drafts, field types renamed to Pick one / Pick many / True / false.
Live draft
- Best Bans, replacing a hardcoded "Soon". Ranks by enemy mastery, win rate and games; becomes Contest Picks after the ban phase.
- Suggestions for every player in the lobby. The fallback lookup only queried NA, and only the local player's Riot ID reached the live page.
- Sort options reorder the list. Mastery sorts on champion points rather than a flattened score.
- Bans, ban hovers and roster names reach the dashboard. Three separate drops between the client read and the relay.
Connector
- Optional watch codes, Connector 0.2.12. Code edits reach the relay without a reconnect.
Site
- live.lafter.gg splits into Live and Tournament. Tournaments lists every org space.
- Org name in the nav for verified members; "Lafter + [org]" lockup on org pages.
- Internal tools out of the main nav.
Fixes
- Crash on Riot 429s, Connector sign-in broken by a syntax error, stale champion data between patches, "no live sessions" vanishing after a refresh, rank display after a Riot API change, clipped cursive headings.
- Draft simulator reproducing champion select end to end — timers, ten bans, position swaps. Found most of the above.
Muster
- Muster (muster.lafter.gg) — form builder. Text, checkboxes, select, and a weekly availability grid with per-person timezones.
Orgs
- Org spaces — company subdomains like amazon.lafter.gg, with work-email verification.
Site
- Bug reporting on every page — screenshots by paste, drag or browse, up to five.
- Terms of Service and Privacy Policy, required for the Riot production key. Cookies disclosed: session and theme only.
- Theme fixes, themed scrollbar, broken nav links, font loading.
Site
- Open Graph and Twitter Card previews on every page.
- Icons moved to an asset folder, root favicon kept as a fallback.
Connector
- The Lafter Connector — desktop app reading the local League client and streaming champion select to the dashboard.
- 0.1.4 through 0.2.0+, plus a relay server between Connector and dashboard.
Live draft
- Redesign — flanking suggestion banners, five-column layout, visible bans, cached per-player suggestions, rank from linked accounts.
- Multi-account linking, champion preferences, mastery indicator.
Accounts
- Sign-up, sign-in, GangDev SSO.
- Admin tools and a user-view toggle.
Lafter
- Lafter started — League drafting and stats companion, aimed at Clash prep.
- First landing page, and groundwork for the Riot Developer API application.