-
sports
v68 · aug 6
NFL pre-season games in Sports Bar
August meant an empty NFL section — the schedule and scores pages only ever showed regular-season games, and the regular season doesn't start until September. ESPN's scoreboard already includes pre-season matchups by default, so the Schedule, Scores, and hub ticker/All-tab feeds now surface them too, live-updating through the same poller path as any other game, with a clear amber "Pre" chip everywhere they appear (game cards, the ticker, and the game-detail header) so they're never mistaken for a regular-season result. Standings stay untouched — they're sourced from ESPN's separate standings endpoint, never from scoreboard events — and once the regular season kicks off the chip simply stops appearing; no separate on/off switch needed.
-
› NFL pre-season games now appear in Schedule, Scores, and the hub ticker/All-tab feeds
-
› a clear amber "Pre" chip on game cards, the ticker, and the game-detail header
-
› live score updates for in-progress pre-season games via the existing scoreboard poller
-
› standings and records stay regular-season only — pre-season results never leak in
-
› inert during the regular season — the chip only shows for actual pre-season games
check the NFL schedule →
-
lab
v67 · aug 6
New Lab demo: ETS Tables
The Elixir & OTP section covered processes, GenServers, Tasks, and messaging — but not ETS, the in-memory table layer real Phoenix code leans on constantly (this very site uses ETS caches for sports scores). The new ETS Tables demo gives you a real per-session table: insert and delete rows live, look one up, run a match/select query, and — the core lesson — apply the exact same inserts to a fresh :set, a :bag, and an :ordered_set table side by side to see how each one actually handles a repeated key. A 6-step guided tour walks through :ets.new, insert, lookup, delete, select, and the three-way type contrast.
-
› insert, look up, and delete rows in a real ETS table, live
-
› a match/select query step: find rows by exact value or by a `value > threshold` match spec
-
› the same 4 inserts (with one repeated key) applied to :set, :bag, and :ordered_set side by side
-
› a 6-step guided tour covers table creation, CRUD, querying, and the three table types
-
› the table is created on mount and destroyed on terminate — nothing persists, nothing leaks across sessions
-
› slots into the Elixir & OTP curriculum pager, right after GenServer Lifecycle
try ETS tables →
-
studio
v66 · aug 6
Theory: Roman numerals — the chord/key rung above scales and triads
Theory could already drill scales, triads, and seventh chords in isolation — but nothing taught the mapping between a chord and its function inside a key, the conceptual rung that makes yesterday's progression ear-training actually meaningful: that Dm *is* ii in C major. A new Roman Numerals deck flips a chord-in-key to its Roman numeral and back ("Dm in C major" ↔ "ii"), covering every diatonic triad and secondary dominant across 9 major and 9 minor keys — the same Secondary Dominants reference chart the app already ships, now a real flashcard deck instead of a look-up page. FSRS-scheduled like every other Theory deck, and it shows up automatically in "Study all due."
-
› a new Roman Numerals deck in Theory: chord + key -> Roman numeral, and back
-
› 216 cards — every diatonic triad and secondary dominant (V/ii, V/V, ...) across 9 major + 9 minor keys
-
› flat keys spell with ♭, sharp keys with ♯ — never a bare letter + b/#
-
› FSRS-scheduled and included in "Study all due" alongside every other Theory deck
study theory →
-
sports
v65 · aug 6
The hub ticker finally tells scheduled games apart
The Sports Bar hub's scrolling ticker shows the today±2 window at a glance, but a scheduled game only ever carried ESPN's raw status text — often just the word "Scheduled", so three straight days of the same matchup all looked identical with no way to tell which was tonight's game. Scheduled games now get a compact start time in your own timezone ("7:10 PM"), with a day chip ("Tomorrow", "Tue") in front whenever the game isn't today. Latest results also stopped showing a misleading "0 – 0" for postponed games — the score is suppressed instead of implying the game was actually played and tied.
-
› scheduled games in the ticker show a compact start time in your timezone, e.g. "7:10 PM"
-
› a day chip ("Tomorrow" / a weekday abbreviation) appears whenever the game isn't today, so same-matchup reruns across the ±2-day window read distinctly
-
› postponed games no longer render a misleading "0 – 0" in Latest results
-
› no new polling — built entirely from the pollers' already-cached, already-parsed start times
check the ticker →
-
studio
v64 · aug 5
Ear Training: hear the progression, not just the chord
Ear Training could already drill an interval or a chord quality in isolation — but functional hearing, the skill that actually matters, is recognizing how chords move together. A new Progressions module plays a short diatonic progression (I–V–vi–IV, ii–V–I, and four more) through the same audio you already know, and asks you to name it by Roman numeral rather than by key — the same progression sounds the same whether it's played in C or G, which is the whole point. FSRS-scheduled like every other card type, and it shows up automatically in "Study all due."
-
› a new Progressions module in Ear Training: hear a short diatonic progression, name it by Roman numeral
-
› 6 progressions across 4 keys — I–IV–V–I, I–V–vi–IV, ii–V–I, I–vi–IV–V, vi–IV–I–V, and the Andalusian i–♭VI–♭VII–i
-
› answers are key-independent by design — the same I–V–vi–IV reads the same whether it's played in C or G
-
› FSRS-scheduled and included in "Study all due" alongside every other Ear Training module
train your ear →
-
study
v63 · aug 5
Download your Notestar writing
Notes and journal entries were already stored as plain markdown, but there was no way to get them back out — no export, no backup. Study Settings now has a "Download my data" button that streams a zip built on the spot: journal entries as markdown files grouped by month, thematic notes as markdown files grouped by tag, and a manifest.json with your goals and milestones. Nothing is generated ahead of time or kept on the server — the archive is assembled fresh for each download and never written to disk.
-
› "Download my data" in Study Settings streams a zip of your Notestar content on demand
-
› journal entries export as markdown grouped by month, notes as markdown grouped by tag
-
› a manifest.json rounds out the archive with your goals and milestones
-
› built fresh per request — no background job, nothing persisted
download your notes →
-
studio
v62 · aug 5
See what's coming: an FSRS forecast on the Studio hub
The Progress section already showed where you'd been — accuracy trends, leech cards, a daily activity heatmap. It's now got a forward-looking view too, straight from the FSRS scheduler that already runs every review: a 7-day bar chart of reviews coming due (with a 30-day total alongside it), a current recall estimate per section ("~92% recall"), and a mastery snapshot showing how many cards are still being learned versus mastered. Theory — which has no per-review history to chart accuracy or response time from — gets its own version of the recall + mastery picture for the first time, since that only needs FSRS's current state, not a review log. Nothing new to track: every number here already existed inside the scheduler, just not surfaced until now.
-
› a 7-day due-review forecast bar on the Studio hub's Progress section, plus a 30-day total
-
› current recall estimate per section — Theory, Reading, and Ear Training — from FSRS.retrievability/2
-
› a mastery snapshot (learning / young / mastered) built from each section's stability distribution
-
› Theory now shows recall + mastery too, even though it still can't chart accuracy or response-time trends
-
› fully derived from existing FSRS state — nothing new to track, an honest empty state until you've studied
see your forecast →
-
studio
v61 · aug 4
See your daily study rhythm on the Studio hub
The Progress section on the Studio hub already charted accuracy and response-time trends and called out your toughest "leech" cards for Reading and Ear Training. It was missing the simplest view of all: how often you actually show up. A GitHub-style heatmap now shows reviews per day over the last 12 weeks, combining Reading and Ear Training into one activity grid — darker squares mean more reviews that day. Built entirely from the review history already being logged; nothing new to track, just a new way to see it.
-
› a 12-week reviews-per-day heatmap on the Studio hub's Progress section
-
› combines Reading and Ear Training review counts into one daily grid
-
› darker squares = more reviews that day, hover any square for the exact count
-
› an honest empty state for accounts with no review history yet
check your progress →
-
food
v60 · aug 4
Kitchen's ingredient picker is now searchable
Kitchen's picker (from yesterday's Recipe Finder + Meal Planner merge) inherited a findability gap: about 50 chips spread across five category blocks with no way to jump straight to one ingredient, and on a phone the search/plan buttons sat below a wall of chips. A type-to-filter search box now sits above the picker — type a few letters and every category narrows to just the matching chips, herbs & spices included (its section opens automatically while a search has a match inside it). A compact "N selected" count sits right next to the search box, so you can see your pantry size without scrolling. None of this touches your actual pantry selection — clearing the search always brings every chip straight back.
-
› type to filter all ~50 ingredient chips down to matches, across every category at once
-
› herbs & spices auto-expand while a search has a match inside, and collapse back once you clear it
-
› a friendly empty state when nothing matches, instead of a blank grid
-
› an always-visible "N selected" count next to the search box — no more scrolling to check your pantry size
-
› purely a view filter — your actual pantry selection, and the saved cookie, are never touched
search the pantry →
-
study
v59 · aug 4
Notestar journal: rotating reflection prompts
The Journal's "Gentle nudges" mode used to greet an empty entry with the same static placeholder every day. It now shows a rotating reflection prompt instead — a short question like "What drained you today?" or "What's one thing you'd repeat tomorrow?" — pulled from a bank that varies by day of the week, so Monday's prompts aren't Sunday's. Not feeling it? "Try another" cycles to the next prompt in that day's bank, no server round-trip. "Use this prompt" drops it into the entry as a quoted heading to write under; otherwise it's just guidance — start typing and it disappears, and nothing about it is ever saved unless you write something yourself. A non-empty entry never shows it, and it never appears at all in Guided template or Daily review mode, which already prefill the entry a different way.
-
› empty entries in Gentle nudges mode now show a rotating reflection prompt instead of a static placeholder
-
› the prompt bank varies by day of the week — Monday's prompts differ from Sunday's
-
› "Try another" cycles the bank client-side; "Use this prompt" inserts it as a quoted heading to write under
-
› purely guidance — never auto-saved, disappears the moment you start typing your own words
open the Journal →
-
food
v58 · aug 3
Recipe Finder and Meal Planner merged into Kitchen
Two sub-apps used to run the same pantry idea in parallel: Recipe Finder matched ingredients you picked, and Meal Planner built a week from a dataset that had never heard of your pantry. Kitchen (`/kitchen`) is the merge — one ingredient picker feeding both find-something-now and plan-my-week, switchable without losing your selection. Planning is now pantry-aware: generation prefers meals your pantry already covers, a meal it can't fully cover still gets scheduled (a week has to fill) but is labeled with exactly what it still needs, and the shopping list only lists what's actually missing. Herbs & spices default to fully selected and start collapsed — most kitchens have a spice rack, and assuming otherwise just added noise — expand the section any time to deselect what you don't stock. `/recipes` and `/planner` keep working via a redirect.
-
› one pantry drives both modes — find something makeable right now, or generate a 7-day plan around it
-
› plan generation now prefers pantry-covered meals; a meal the pantry can't fully support is still scheduled, labeled with what it needs
-
› the shopping list subtracts everything the pantry already has, herbs & spices included
-
› herbs & spices start collapsed and fully selected — a stocked spice rack is the better default
-
› /recipes and /planner still work, redirecting straight into the right Kitchen mode
try Kitchen →
-
lab
v57 · aug 3
New Lab demo: Tasks & Async
The Elixir & OTP section had demos for spawning raw processes and running a GenServer, but nothing for the concurrency primitive most Elixir code actually reaches for: Task. The new Tasks & Async demo lets you launch a batch of real, bounded Task.async processes and watch them run — then contrasts the two ways to collect them. Task.await_many launches everything at once and hands results back in the order you submitted them, no matter which one finished first. Task.async_stream caps how many run at once and streams results back live as each one completes. A guided tour walks through both, plus a one-line takeaway for each.
-
› spawn 3, 5, or 8 real concurrent tasks and watch them execute in parallel
-
› async/await: uncapped concurrency, results returned in submission order
-
› async_stream: pick a concurrency cap and watch back-pressure limit how many run at once
-
› a 6-step guided tour covers async, await, await_many ordering, and async_stream's ordered: false
-
› slots into the Elixir & OTP curriculum pager, right after Process Spawning
run some tasks →
-
studio
v56 · aug 3
Study everything due in one sitting
Theory, Reading, and Ear Training each track their own due cards, which meant three separate sessions to clear a day's review. The hub now offers "Study all due" — one interleaved queue that draws from all three sections at once, so a Theory card is followed by a Reading card is followed by an Ear Training card instead of grinding through one section at a time. Each card still renders with its section's own interaction (flip-and-rate flashcards, or multiple choice with audio) and every review is still recorded through that section's own spaced-repetition schedule — this just changes the order you see them in.
-
› one queue interleaves Theory, Reading, and Ear Training instead of studying them one at a time
-
› the hub shows a combined due count and links straight into the mixed session
-
› each card keeps its own section's FSRS scheduling — nothing changes about when a card comes back
-
› a clean empty state when nothing across all three sections is due
study all due →
-
arcade
v55 · aug 3
Jigsaw and Sudoku co-op remember who you are
Refreshing mid-puzzle, or closing the tab and coming back later, used to hand you a brand-new stranger identity — new name, new color, and your scoreboard credit gone. Your player identity now saves in your browser and comes back with you: same name, same color, same running score, whether you refresh, reopen the tab, or rejoin a game already in progress. A genuinely new visitor still gets a freshly generated one, and a tampered or corrupted save is safely ignored in favor of a fresh identity rather than trusted as-is.
-
› refreshing mid-game in Jigsaw or Sudoku co-op keeps your name, color, and scoreboard credit
-
› closing the tab and rejoining later restores the same identity
-
› new visitors still get a freshly generated name and color
-
› a tampered or corrupted saved identity is rejected server-side, never trusted directly
play a round →
-
sports
v54 · aug 3
The Sports Bar hub now knows your teams
The new All hub (just shipped) already merges every league's live games, upcoming slate and recent finals into one feed. It's now personalized on top of that: if you follow any teams (the ★ next to a team in standings or on a game card), their games are pinned to the front of the live/upcoming/results feed instead of wherever they'd otherwise fall — including which game gets featured up top. A merged news section joins it, pulling recent headlines from every league you're viewing. Both update in place as the same score/news pollers tick — nothing new to fetch, nothing to reload.
-
› followed teams' games are pinned to the front of the live/upcoming/results feed
-
› the featured "live now" / "up next" game prefers a followed team when one's in play
-
› a merged, newest-first news section under the games feed
-
› updates live off the existing score/news pollers — no new polling, no reload
check the hub →
-
food
v53 · aug 3
Restaurant Roulette's craving list just doubled
The craving picker had ten cuisines and ten qualities — too narrow if what you wanted was Korean, Vietnamese, Greek, Hawaiian, Peruvian, Lebanese, or Taiwanese, or a specific dish like ramen, tacos, sandwiches, soup, salad, dumplings, curry, or a gluten-free bite. Both lists just doubled: 20 cuisines/categories and 20 qualities/ingredients, all matchable against real dishes in the dataset — nothing was added that can't actually turn up in a result.
-
› 10 new cuisines: Korean, Vietnamese, Greek, Hawaiian, Peruvian, Lebanese, Taiwanese, ramen, tacos, sandwiches
-
› 10 new qualities: soup, salad, dumplings, curry, tofu, hummus, kimchi, bowls, kid-friendly, gluten-free
-
› every new craving is backed by real menu items in the dataset — no dead-end selections
-
› existing craving matching and scoring is unchanged
try a new craving →
-
sports
v52 · aug 2
Sports Bar opens on every league at once
Sports Bar was five sealed rooms: NFL, MLB, NBA, MLS and the World Cup, one at a time, with no way to ask "what's on right now?" without clicking through all of them. There is now an "All" tab, first in the league nav and the one a fresh visit lands on. All Scores and All Schedule show every league's games at once, grouped under a league header so each slate stays readable. All Standings stacks each league's own table — the conference-and-division shapes and the points-based ones are genuinely different, so nothing is forced into one grid; collapse the leagues you don't follow. Picking a league still works exactly as it did, still sticks for your next visit, and a link straight to, say, MLB standings still opens MLB standings. None of this adds any new data fetching: All reads the same live caches the league pages already read. Your Teams moved off the hub into More, where it isn't competing with the scores.
-
› "All" is first in the league nav and the default for a fresh visit
-
› All Scores and All Schedule group every league's games under clear league headers
-
› All Standings stacks each league's own table shape, collapsible per league
-
› no new polling — All reads the caches the league pages already use
-
› your league choice still persists, deep links still land where they point, and Back still works
-
› Your Teams now lives under More instead of crowding the hub
see every league →
-
food
v51 · aug 2
Restaurant Roulette can find your zip code for you
Typing a zip code is still the default, but there's now a pin button next to the field that asks your browser for your device's location — nothing happens until you tap it, and your browser's own permission prompt is what actually grants it, not us. Say yes and the nearest zip code we cover fills in, still editable if it's not quite right. Say no, or your device can't find a signal, and you get a short note and the field stays exactly as you left it. Too far from anywhere we cover and it says so honestly instead of guessing.
-
› a map-pin button next to the zip field — opt-in, nothing runs until you click it
-
› granted + nearby fills the nearest covered zip code, still editable by hand
-
› denied, timed out, or unsupported all show a graceful note and leave the field untouched
-
› too far from our coverage area says so honestly rather than picking something wrong
spin the roulette →
-
food
v50 · aug 2
Restaurant Roulette's craving picker got a lot smaller
The picker used to be a wall of ~20 buttons — cuisines and qualities both fully spelled out whether you wanted them or not — pushing the zip code and Find food button off the bottom of the screen on a phone. It's now a search box per category: type a few letters of what you're craving, pick it from the browser's own suggestions, and it shows up as a small removable chip. No new library shipped for this — it's a plain text input and the browser's built-in autocomplete list, so it's keyboard- and screen-reader-friendly by default. Selecting and matching work exactly as before; only how you get there changed.
-
› cuisines and qualities are now two searchable boxes instead of ~20 always-visible chips
-
› the phone layout finally shows the zip code and Find food button without scrolling past the picker
-
› selected cravings still show as chips you can remove with one tap
-
› built entirely from native HTML — no autocomplete library was added
spin the roulette →
-
food
v49 · aug 2
Every Restaurant Roulette listing now shows its work
A review of the roulette's restaurant list turned up a problem in its oldest entries: the original listings for New York, Los Angeles, Chicago, Austin, San Francisco and the first Portland neighborhoods couldn't be matched to real businesses. A few sat at addresses that are office buildings rather than restaurants, and a few carried the wrong zip code for their own street. All 36 are gone. In their place are 42 venues checked one at a time against the restaurant's own website — the address it prints and the dishes on its menu — and every listing now records the page that check came from and the date it happened. A couple of neighborhoods came out smaller than they were, and one has no pizzeria at the moment. That's deliberate: a shorter list you can actually turn up to beats a longer one you can't.
-
› 36 listings that couldn't be traced to a real business were removed
-
› 42 replacements, each checked against the venue's own site for both address and menu
-
› every listing carries the source it was verified against, and a test now rejects one that doesn't
-
› coordinates are geocoded from the street address and cross-checked against two mapping services
-
› no more same-block duplicates in St. Johns
spin the roulette →
-
food
v48 · aug 2
Restaurant Roulette actually spins now
It's called Roulette, but hitting "Find food" just swapped one card for another — correct and completely flat. The pick now arrives with a short slot-machine reveal: the cuisine line riffles through the craving categories while the restaurant name and the dish blur through a run of characters, and the three lines snap into place one after another. The whole thing is over in under a second, and it is pure decoration — the result, the distance, and the Re-roll button are all there and clickable the instant the server answers, so nothing about finding food got slower. Re-roll mid-spin and the reveal simply restarts on the new pick. If your device asks for reduced motion, you get the finished card with no spin at all.
-
› the cuisine, restaurant and dish lines settle in sequence, done in under a second
-
› the reveal decorates the result — it never delays it, and Re-roll works during the spin
-
› prefers-reduced-motion gets the complete, static card instead
-
› the spin never invents a restaurant: it settles on exactly the pick the server chose
spin the roulette →
-
food
v47 · aug 2
Roulette sends your zip code to the food that's actually closest
When the metro expansion added Beaverton, Tigard and Gresham pools, a handful of west- and east-side zip codes were left pointing at the Portland pool they had always used. Searching 97225 "within 5 miles" reported nothing nearby while a Beaverton restaurant sat a mile and a half away — the pool was picked before the distance filter ever ran. Nine zip codes now resolve to the nearest pool we cover, and a test measures every covered zip against every pool, so the next batch of restaurants can't quietly strand one. The "nothing that close" message no longer claims we have restaurants in a zip code that has none of its own, either.
-
› 97219, 97221, 97225, 97229, 97230, 97231, 97233, 97236 and 97239 now reach their nearest pool
-
› 97225 within 5 miles goes from "nothing nearby" to a restaurant 1.4 miles away
-
› routing is distance-checked in CI, so the next batch of restaurants can't leave a zip code pointed miles past a nearer pool
-
› the empty-distance message is honest about zips served by a neighboring pool
spin the roulette →
-
food
v46 · aug 2
Restaurant Roulette now covers the whole Portland metro
Roulette used to stop at the Portland city line, and St. Johns — the one zip the whole feature was built around — had a pool small enough that a couple of re-rolls saw everything there was to see. That zip gained eight restaurants, spanning pizza, Mexican, Thai, sushi, Indian, Hawaiian barbecue, breakfast and pub food. The suburbs are in too: Beaverton, Lake Oswego, Milwaukie and Oak Grove, Tigard, and Gresham all return real picks now instead of "we don't have that zip code yet." Every restaurant added is an actual business at an actual address — verified one at a time, with the ones that had quietly closed left out.
-
› the 97203 / St. Johns pool gained 8 verified restaurants
-
› Beaverton, Lake Oswego, Milwaukie/Oak Grove, Tigard and Gresham zips now return results
-
› 33 new restaurants, each verified against the business's own site or a dated listing
-
› area labels stay honest — a zip served by a neighbor's pool says whose food it is
spin the roulette →
-
food
v45 · aug 2
Restaurant Roulette asks how far you'll go
Roulette matched on cravings and a zip code and nothing else, so a pick across town was exactly as likely as the place around the corner — and in Portland, where one neighborhood pool serves a whole cluster of zip codes, "nearby" could mean a twelve-mile drive. There is now a distance selector next to the zip field: Anywhere (the default, and exactly what you had before), or within 1, 5, or 10 miles. The radius trims the candidate pool before anything is matched, so it applies to Best match and Random alike, and a re-roll stays inside the distance you picked. Distances are straight-line from the center of your zip code — as the crow flies, which the picker says out loud rather than implying a driving estimate it can't make.
-
› a distance selector on the roulette form: Anywhere, 1, 5, or 10 miles
-
› the radius filters candidates before matching, so both selection modes obey it
-
› re-rolls stay within the radius the result was found at
-
› a distinct empty state when the radius (not your cravings) is what came up short
-
› each result now shows roughly how far away it is
spin the roulette →
-
food
v44 · aug 2
Food Court introduces itself properly
The Food Court's first-run tour only ever talked about Restaurant Roulette — so landing on Recipe Finder or Meal Planner for the first time meant reading about craving picks and zip codes over the page you actually opened, and then never getting an introduction to it. Each sub-app now has its own tour: Recipe Finder explains cooking from your pantry and its near-miss matches, Meal Planner explains the reuse-driven week and its shopping list, and the hub introduces all three. Already dismissed the old Food Court tour? Nothing comes back.
-
› Recipe Finder and Meal Planner each get a first-run tour about themselves
-
› the Food Court hub now introduces all three sub-apps instead of just Roulette
-
› dismissals are per sub-app — and an existing Food Court dismissal still silences all of them
-
› the homepage card now says what Food Court actually does today
open the food court →
-
v43 · aug 2
The homepage finally says what Lab and Music Studio ship
Two cards on the homepage were describing apps that had outgrown them. The Lab card only ever mentioned Elixir, even though the Lab has spent months adding JavaScript, TypeScript, CPU and GPU sections — 25 lessons a visitor had no way of knowing were there. The Music Studio card only mentioned theory, sightreading and ear training, leaving out Cadence Keep (the tower-defense study game) and Maestro (sight-reading at a real MIDI piano) entirely. Both cards now name what the app actually covers.
-
› the Lab card now names JavaScript, TypeScript, CPUs and GPUs alongside Elixir
-
› the Music Studio card now mentions Cadence Keep and Maestro alongside the drills
-
› a new test ties every app's card copy to the routes it really serves, so the next section to land can't quietly go unadvertised
see the apps →
-
food
v42 · aug 2
Meal Planner now writes your shopping list
Generate a weekly plan and the shopping list comes with it — every ingredient the week needs, aggregated into one list and grouped by the same aisles the Recipe Finder picker uses (proteins, vegetables, pantry staples, dairy, herbs & spices). Nothing is listed twice: an ingredient six meals share is one line with a ×6 next to it, and a lunch built from last night's leftovers doesn't ask you to buy that chicken again. Change how many meals a day you're planning, or hit regenerate, and the list rewrites itself to match.
-
› every generated plan now shows a grouped shopping list underneath it
-
› deduplicated across the week, with a ×N count when several meals share an ingredient
-
› leftover meals don't re-list what they're reusing — only the extras you actually need
-
› the list follows the plan: switch scope or regenerate and it updates instantly
plan your week →
-
food
v41 · aug 2
Recipe Finder remembers your pantry
Recipe Finder used to forget everything the moment you left — a returning cook had to re-tap their whole kitchen before getting a single suggestion. Now your ingredient selection is saved as "my pantry" and comes back with you on your next visit, ready to search. A count and a Clear pantry button sit right above the search, so wiping the slate is one tap whenever your kitchen changes.
-
› your ingredient selection is remembered across visits — no re-tapping your kitchen
-
› the saved pantry is there on the very first paint, already primed for a search
-
› a Clear pantry button (with a live count) resets the picker and the saved copy
-
› no account needed: the pantry stays on your own device, never on our servers
stock your pantry →
-
food
v40 · aug 1
Food Court gets a Meal Planner
Food Court's second sub-app is here: Meal Planner generates a 7-day home-cooking plan optimized for ingredient and leftover reuse. Pick dinners only, lunch + dinner, or all three meals a day, then generate — every meal is composed to a 25% protein / 25% starch / 50% vegetables balanced plate, and cards call out when a meal reuses another day's leftovers (e.g. "uses leftover roast chicken from Monday"). Don't like the plan? Regenerate any time.
-
› new sub-app: Meal Planner (food.hack.codes/planner), linked from the Food Court hub
-
› choose dinners only, lunch + dinner, or breakfast/lunch/dinner before generating
-
› every meal card shows its protein/starch/veg components at the balanced-plate ratio
-
› leftover reuse is explicit on the card, not just implied — plans regenerate instantly
plan your week →
-
food
v39 · aug 1
Food Court adds Recipe Finder — cook with what you have
The Food Court umbrella now answers the at-home question too: pick what's in your kitchen from a categorized ingredient picker (proteins, vegetables, pantry staples, dairy, herbs & spices), and Recipe Finder matches you with real recipes — fully makeable ones first, then near-misses missing just 1-2 ingredients, clearly labeled with what to grab. Every recipe card ships a photo of the finished dish, and picking one opens a detail view with have-vs-missing ingredients and full prep steps.
-
› 14 curated recipes spanning a 46-ingredient taxonomy across 5 categories
-
› results split into "ready to make" and "almost there" (missing 1-2 ingredients)
-
› every recipe card and detail view shows a photo of the finished dish
-
› friendly empty state when nothing matches your selection
try Recipe Finder →
-
food
v38 · aug 1
Restaurant Roulette now covers Portland, OR
Restaurant Roulette's curated dataset now covers Portland, Oregon — 97203 (St. Johns / North Portland) plus a broad footprint of neighboring 972xx zips across the Pearl District, Buckman/Hawthorne, and Alberta Arts District. Search any covered Portland zip for pizza, BBQ, vegan, and more, in both Best-match and Random modes.
-
› Portland, OR joins the five starter-city zips (NYC, LA, Chicago, Austin, SF)
-
› 97203 supported at minimum, per direct request — the repo owner's home zip
-
› ~30 residential Portland zips covered via neighboring-zip fallback to four curated neighborhood pools
-
› the unsupported-zip hint now summarizes coverage instead of listing every zip
try Restaurant Roulette →
-
food
v37 · aug 1
The Food Court gets its night-market marquee
The Food Court hub now opens on an animated 16-bit night market at closing time: three glowing stalls, steam drifting off the last pots, rain through the archway, a cat asleep on the rice sacks — and one lone customer, tray in hand, deciding what to eat next while the green noodle-bowl sign hums. It's the same cozy animated-banner family the other apps wear, in Food Court's own lime glow. Purely decorative, pauses when offscreen, and honors reduced-motion.
-
› hand-drawn animated pixel-art banner on the Food Court hub
-
› a ~13s "scan the stalls → one lands" loop that mirrors Restaurant Roulette
-
› steam-riding motes catch the green sign's glow on the way up
-
› battery-friendly: pauses offscreen and in hidden tabs, static under reduced-motion
visit the food court →
-
food
v36 · jul 31
The Food Court is open — Restaurant Roulette
hack.codes has a new app: Food Court, home to Restaurant Roulette. Pick any mix of broad cuisines (Mexican, Italian, pizza, sushi, BBQ, ...) and narrow qualities (cheesy, spicy, noodles, vegetarian, ...), drop in a US zip code, and hit Find food. Best match returns the restaurant and menu item that fits the most of what you picked; Random rolls uniformly from everything that fits at least one. Re-roll for another pick any time. v1 ships with a curated starter set of five zip codes across five cities — a real API integration is a natural follow-up.
-
› new app: Food Court (food.hack.codes), first sub-app Restaurant Roulette
-
› multi-select craving picker spans broad cuisines and narrow qualities
-
› Best match (highest-scoring pick) or Random (uniform above a match threshold), plus re-roll
-
› starter dataset covers 5 zip codes across NYC, LA, Chicago, Austin, and SF
try restaurant roulette →
-
study
v35 · jul 22
Explore the NYC 3D map without an account
Geography's Misato-style scroll-driven map of New York City used to sit behind the Study sign-up wall even though it has nothing to do with tracked progress. It's stateless, so it's now open the same way Radio and Arcade already are: open the Study hub, tap Geography, and fly through the five boroughs — no account needed. Math and journaling stay signed-in, since those track your progress.
-
› Geography (the NYC map) is now reachable signed out, at /geography
-
› Math and Notestar are unchanged — still sign in to track progress
-
› the map's WebGL rendering and interactions are unchanged either way
explore geography →
-
studio
v34 · jul 21
Try a sample from every Studio section
The signed-out Music Studio hub used to let you try Theory before signing up, but left Reading and Ear Training as description cards. Now all three sections have an account-free "try a sample" reveal: Theory's note-identification flashcard, a note-naming staff snippet for Reading, and an interval-recognition prompt for Ear Training — no sound autoplays, no account needed.
-
› Reading gets a "name this note" staff snippet, revealed on tap
-
› Ear Training gets an interval-recognition prompt (no autoplaying audio)
-
› all three previews are account-free and add no weight to the shared JS bundle
try music studio →
-
arcade
v33 · jul 18
Find the newest game faster
The arcade hub now calls out its newest release instead of leaving it to scroll: a jump-to index sits right under the header linking to every game, and the newest one carries a "new" badge for its first 30 days.
-
› a jump-to index under the header links straight to every game
-
› the newest game gets a "new" badge, both in the index and on its card, for 30 days
see the arcade →
-
arcade
v32 · jul 17
New game: Cascade
Arcade's fifth game is here. Cascade is a falling-block puzzle: seven pieces, full wall-kick rotation, a ghost piece showing where each piece will land, a hold slot for saving one for later, and hard/soft drop for when you need speed. Chain line clears for combos and back-to-back bonuses as the level speed climbs. Keyboard on desktop (arrows to move/rotate, Z/X to rotate, space to hard-drop, C to hold, P to pause), on-screen touch controls on phones, and a local best score to beat.
-
› seven pieces with full wall-kick rotation, a ghost piece, and a hold slot
-
› hard and soft drop, combo chains, and back-to-back bonuses as the level speeds up
-
› keyboard (arrows, Z/X, space, C, P) on desktop, on-screen touch controls on phones
-
› a local best score keeps track of your top run
play cascade →
-
studio
v31 · jul 17
Cadence Keep celebrates your victories properly
Defend the whole queue and the win screen now erupts: a golden trophy pops in with a fanfare burst of Studio-violet rays and sparks — the platform's first sprite-atlas animation, baked at build time by the same deterministic graphics pipeline that painted Neon Drift's night sky. Prefers-reduced-motion gets a calm still frame, and if the artwork ever fails to load you get the trusty old trophy emoji.
-
› one-shot trophy celebration on the Cadence Keep "Keep defended!" screen
-
› pixelkit gains a sprite-atlas player — the groundwork for more reward moments across the apps
-
› animation pauses off-screen and respects reduced-motion; total added weight is under 30 KB
defend the keep →
-
v30 · jul 12
Download your data, any time
hack.codes now asks people to invest daily practice time, so it should let them take that investment with them. Account settings has a new "Download my data" button that generates a single JSON file with your account profile plus everything you've built across the apps — Studio review history, Notestar goals/notes/journal, Math practice stats, and your followed Sports Bar teams.
-
› one button in account settings downloads a dated JSON file (hack-codes-export-YYYY-MM-DD.json)
-
› covers your profile, Studio Theory/Reading/Ear Training review history and settings, Notestar goals/notes/journal, Math practice stats, and followed Sports Bar teams
-
› strictly your own data — every query is scoped to your account, and a fresh account exports cleanly with empty sections
-
› hidden while an admin is viewing your account in read-only impersonation mode
download your data →
-
arcade
v29 · jul 11
Pong gets a second player
Pong was the one Arcade game with no way to play against another person — Sudoku offers co-op, Jigsaw too, but Pong dropped you straight into vs-AI. Now there's a mode toggle right on the Pong screen: stick with vs AI (unchanged), or pick "2 players, one keyboard" for couch co-op — player 1 keeps W/S, player 2 gets the arrow keys, same first-to-11 scoring either way.
-
› a mode toggle on the Pong screen: vs AI (default) or 2 players, one keyboard
-
› distinct controls for local co-op — P1: W/S, P2: arrow keys — documented right in the UI
-
› score and win flow are unchanged in both modes
-
› desktop-only for now: the toggle is hidden on phones, which keep the same vs-AI experience
play pong →
-
studio
v28 · jul 10
Your Music Studio progress, charted
Signing up for Music Studio promised progress tracking — now the hub delivers on it. A new Progress section on the hub turns your existing Reading and Ear Training review history into an accuracy trend, a response-time trend, and a list of the cards you keep missing ("leeches"), with a link straight into practicing them. No new data collection: it's all built from the review log that was already being kept every time you rated a card.
-
› 8-week accuracy and response-time sparklines for Reading and Ear Training
-
› a leech-card list surfaces what you keep getting wrong, with a link to drill it
-
› new accounts see an honest empty state instead of a blank panel
-
› Theory tracks mastery today, not per-review history, so it gets its own honest placeholder rather than fake charts
see your progress →
-
studio
v27 · jul 9
See it before you sign up
Music Studio and Study used to hand a logged-out visitor a bare login form — no context, no reason to sign up. Both now show a real landing page at their root instead: what the app does, a sample you can try right there (a theory flashcard, a math drill), and a clear sign-up/log-in CTA that drops you right back in the app once you're in. Signed-in visitors see no change at all.
-
› studio.hack.codes and study.hack.codes now show a public preview instead of redirecting straight to login
-
› try a sample question on the spot — no account needed
-
› sign up or log in from the landing page and land back in the app, not somewhere random
-
› deep links (e.g. a bookmarked lesson) still redirect to login as before
see the studio preview →
-
arcade
v26 · jul 9
Neon Drift gets a real night sky
The city you drift through just got richer. Neon Drift's flat backdrop is now a full night sky — a starfield with faint nebula wisps and city-glow on the horizon — and every tower wears a new, more detailed set of lit windows with actual depth. The neon signs are real glowing tube shapes now, not just bars. Same buttery 60fps, same zero-download boot: the new artwork streams in behind the scenes and the game never waits for it.
-
› a baked equirectangular night skybox — stars, nebula wisps, and horizon glow that blend into the fog
-
› richer building facades: inset windows with depth and varied cyan/magenta/amber interiors
-
› neon signs upgraded to glowing tube shapes in pink, cyan, and violet
-
› textures load asynchronously with the old procedural look as an instant fallback — no boot delay, no jank
take a night drive →
-
lab
v25 · jul 8
Watch the machine think
The Lab's OTP demos have always run on real processes — now you can watch them. A new Live OTP X-Ray panel streams real telemetry as it happens: GenServer calls, room startups, and LiveView event dispatch scroll by in a CRT-styled log while you interact with the Messaging or GenServer demos in another tab.
-
› new Live OTP X-Ray panel under Elixir & OTP — a live, scrolling log of real :telemetry events
-
› watch GenServer.call round-trips, Room.init, and LiveView event/info dispatch as they happen
-
› read-only: it only observes, and keeps just the most recent 100 events per session
watch it think →
-
v24 · jul 3
Enter the matrix (and meet the city)
The hacker theme now rains — green zeros and ones fall quietly behind every page, straight out of the movie, tuned to stay out of your way while you read. Love the night-city homepage from yesterday? It has its own home now: a sixth theme family, city, a faithful clone of hacker that keeps the skyline. Switch any time from the theme picker in the header.
-
› hacker theme: an animated matrix digital-rain backdrop on every page (dark mode) — deliberately dim, with the occasional bright glyph leading a column
-
› new city theme: yesterday's hacker look, glow and all, plus the animated night-city homepage skyline
-
› pick either from the header theme menu — six families now, each with light and dark modes
-
› both backdrops respect reduced-motion and pause when the tab is hidden
pick your sky →
-
v23 · jul 3
The homepage after dark
The homepage now settles into an animated pixel-art night city — quiet streets, warm apartment windows winking on and off, drifting rooftop steam, and a few neon signs (open 24/7, naturally). The app icons on the cards breathe with a soft phosphor glow and the occasional glitch. Hacker theme, dark mode — the city comes out at night.
-
› a full-screen animated night skyline behind the app grid — windows flicker, steam drifts, stars twinkle, and every ~100 seconds a shooting star slips by
-
› legible little neon signs: OPEN 24/7, BAR, and a buzzing VACANCY
-
› app-card icons now glow and glitch, gently and never in unison
-
› respects reduced-motion (a still night scene) and pauses entirely when the tab is hidden
see the night city →
-
study
v22 · jul 3
New York, rebuilt to scale
The Geography flyover of New York City is now geographically real: true borough coastlines from actual map data, Manhattan's famous tilt, golden-hour light over a dense skyline of thousands of buildings, all seven iconic bridges, and a dozen new places to discover — from JFK to the Verrazzano-Narrows.
-
› real coastlines on a to-scale board — Brooklyn and Queens finally share Long Island, and the harbor islands are all there
-
› golden-hour lighting, street grids (including Broadway's diagonal), and skyscraper cores with lit windows
-
› all seven iconic bridges, both airports, and 12 new points of interest with facts
-
› smarter labels that hide behind skyscrapers instead of floating through them
fly over new york →
-
studio
v21 · jun 27
Maestro now works on iPad — play your piano through the mic
Maestro now works on iPad and iPhone. Safari has no Web MIDI, so instead of connecting over Bluetooth you tap “Listen to my piano” and Maestro hears the notes you play through the microphone — your acoustic or digital piano works with nothing to pair. (This also enables desktop Safari and acoustic pianos everywhere.)
-
› tap “Listen to my piano” on iPad/iPhone and play — Maestro detects each note you play through the mic
-
› no MIDI cable or Bluetooth pairing needed; an acoustic piano works too
-
› Web MIDI over Bluetooth is still used automatically on browsers that support it (Chrome, Edge)
play maestro →
-
studio
v20 · jun 23
Maestro: play sheet music on a real piano
A new Music Studio game that connects to a real digital piano over Bluetooth (Web MIDI). Read a scrolling staff and play the notes in time — Practice mode loops any bars you choose so you can drill a tricky passage, Perform mode scores a full run and awards up to three stars. No piano? Use the on-screen keys or your computer keyboard.
-
› connect a MIDI keyboard (e.g. a Roland FP-60X) over Bluetooth and your notes are recognized live
-
› Practice mode loops a chosen range of measures; Perform mode scores timing and accuracy for stars
-
› five public-domain etudes, an adjustable tempo, and a metronome mascot that reacts to your playing
play maestro →
-
studio
v19 · jun 17
Cadence Keep: a richer battlefield
Cadence Keep's battle scene got a detailed 16-bit pixel-art makeover — a dithered night sky and glowing moon over a deep, lit city skyline, a brick-built keep with banners and braziers, distinct reinforcement towers, and bolder enemy creatures marching the lane.
-
› a denser, deeper parallax cityscape with hundreds of lit windows under a dithered indigo sky and a glowing moon
-
› the keep is now brick-built with battlements, an arched gate, a waving banner and a conducting Maestra
-
› reinforcement towers have distinct silhouettes by tier, and the Dissonance are bolder, shaded creatures that stay easy to read
play cadence keep →
-
v18 · jun 17
a richer look: more detailed animated banners
Every app's homepage banner got a high-detail 16-bit pixel-art glow-up. The cozy scenes you know are all intact — just redrawn with far more detail, warmer layered lighting, and little characters who now have faces and personality.
-
› the same scenes, far more detailed — wood grain, fabric folds, plants, neon, books, and rain on the windows
-
› the characters now have subtle faces and personality: a friendly bartender pulling a glass, a musician lost in the music, a maker peering into a glowing open machine, a writer pausing to think, a listener settled in with a mug
-
› sleeping pets, denser set-dressing, and cozier, warmer lighting in every room
see the apps →
-
studio
v17 · jun 17
Cadence Keep: a gentler opening
Cadence Keep no longer throws you to the wolves. The opening calm is longer and now shows a countdown to the first wave, and reinforcements come quickly at first — your very first tower needs just one correct answer — so you can build a real wall before the Dissonance arrives.
-
› the opening grace period is longer (12 seconds) with a visible countdown bar to the first wave
-
› reinforcements scale: your 1st tower needs 1 correct answer, the 2nd needs 2 in a row, the 3rd needs 3, and so on
-
› the gentle early ramp lets you stack up a starting defense during the calm instead of facing the first wave bare
play cadence keep →
-
studio
v16 · jun 17
Cadence Keep: a real fight
Cadence Keep's battle got a proper rebalance and a clearer look. The Dissonance now grows stronger the further you progress, reinforcements are earned by chaining correct answers (and can be destroyed by enemies that break through), and the enemies themselves are big, detailed, and easy to track.
-
› enemies get tougher, faster, and more frequent the more questions you answer — the run can actually be lost now
-
› reinforcements are earned by a 5-answer combo (no longer one per correct answer), and they're scaled back in power
-
› your reinforcements are a destructible wall: enemies that reach the keep tear them down before they touch your health
-
› redesigned, high-contrast enemy creatures with health bars and a boss crown — and the muddy fog is gone for a clear battlefield
-
› Cadence Keep is now pure play — it no longer records reviews to your spaced-repetition schedule, so a fast, pressured game can't skew your study data
play cadence keep →
-
studio
v15 · jun 16
Cadence Keep goes realtime
Cadence Keep is now a true realtime tower defense. After a brief calm to build up, the Dissonance marches on your keep in waves — raise reinforcements before they arrive, because enemies that reach the keep are what cost you health now, not wrong answers. The whole battlefield got a detailed night-time pixel-art glow-up too.
-
› a grace period opens each round so you can build reinforcements before the first wave arrives
-
› enemies that reach the keep drain its health — stronger foes hit harder
-
› wrong answers no longer cost health or score; they cost a reinforcement instead (and nothing if you have none to spare)
-
› a richer scene: a glowing moon, drifting fog, parallax skyline, lit braziers, and a defensive line that lights up as it grows
play cadence keep →
-
studio
v14 · jun 16
tune your flashcard sessions: shuffle, audio, timed mode
a new settings gear on every Music Studio section (Theory, Reading, Ear Training) lets you shuffle the order, control audio, set your session length, and turn on a timed mode that scales the pressure.
-
› shuffle cards to break out of the same review order
-
› control audio — mute the chord on reveal in Theory, or auto-play the prompt in Ear Training and Reading
-
› set how many cards a session draws so you can do a quick burst or a long sit
-
› optional timed mode with Slow / Medium / Fast countdowns — run out of time and the card counts as a miss
open the studio →
-
studio
v13 · jun 16
new Theory deck: Thirds & Sevenths
a new Theory flashcard deck drills the guide tones — the 3rd and 7th — of major-7, minor-7, and dominant-7 chords across all twelve roots, in both directions.
-
› name the 3rd and 7th of any maj7, m7, or dom7 chord — the two notes that define its color
-
› all twelve roots, fully reversible (chord → guide tones, and guide tones → chord)
-
› hear the chord and see it on the keyboard on reveal, just like the other Theory decks
study thirds & sevenths →
-
studio
v12 · jun 15
Cadence Keep: turn theory drills into a tower-defense game
Music Studio has a new optional game mode. Cadence Keep turns your theory flashcards into fast multiple-choice rounds that power a tower-defense battle — answer correctly to build your towers, slip up and the Dissonance marches on your keep.
-
› every theory card becomes a clear, self-contained question ("Spell the A dominant 7th chord") with four answer choices
-
› correct answers build and upgrade towers; wrong answers send tougher waves — combos and boss cards score big
-
› it's real study: answers feed your spaced-repetition schedule, with a casual mode if you'd rather just play
-
› lose a round and you get the exact cards that tripped you up, plus a "Defend again" rematch
play cadence keep →
-
study
v11 · jun 15
Geography lands in Study: explore New York City
Study has a new Geography section — starting with an interactive 3D map of New York City. Scroll to fly across the five boroughs and tap any landmark to learn its story.
-
› a new Geography section on the Study hub
-
› New York City as a scroll-driven 3D map — fly from a bird's-eye view down into each borough
-
› tap landmarks, neighborhoods, and boroughs for a quick description and a fun fact
-
› fully keyboard- and screen-reader-friendly: a "browse all places" list covers every spot, with a static map for reduced-motion
open geography →
-
sports
v10 · jun 14
Soccer kicks off: MLS + the World Cup
the Sports Bar now follows the beautiful game — live MLS scores with a real points table, plus full World Cup coverage with group standings, the knockout rounds, scores and schedule.
-
› MLS: live scores and a points-based table (W-D-L, goal difference, and PTS), sorted the way the standings actually work
-
› World Cup: group standings, knockout matches grouped by round, plus scores and the full schedule
-
› a soccer glossary and rules to explain offside, stoppage time, VAR, group stage and more
open the sports bar →
-
sports
v9 · jun 13
sports bar navigation, on every screen
the Sports Bar now has a primary navigation bar at every size — a tab bar pinned to the bottom on phones, and a top navbar tucked under the site header on tablets and desktops.
-
› desktop & tablet: Hub, Live, Standings, Schedule, and More are always one tap away from a top navbar
-
› mobile: the bottom tab bar stays put and reserves room for the iPhone home indicator
-
› the site footer now stays pinned to the bottom of the screen on short pages too
open the sports bar →
-
radio
v8 · jun 12
desert rock joins the dial
98.3 Desert Rock is on the air — Queens-of-the-Stone-Age-inspired fuzz vamps and straight-driving drums, generated live in your browser.
-
› desert rock: heavy fuzz guitar riffs, locked-in driving drums, and that wide open desert space
-
› every station now plays a distinct track every time — different instrument palettes, tempos, and production so no two songs sound alike
-
› the radio powers its display lights down when you pause it
tune in →
-
arcade
v7 · jun 12
jigsaw hints, on your terms
a new toggle on the jigsaw board turns the piece-placement outline on or off — bigger puzzles now stay unspoiled by default.
-
› third board button (next to the picture ghost) shows or hides the slot outline while dragging
-
› hints start on for 24-piece casual, off for 60 and 108 — flip them any time
-
› the site menu now opens above the board instead of hiding behind it
solve one →
-
v6 · jun 12
what's new has a home
every shipped feature on one page — open it any time from the account menu.
-
› the full changelog lives at hack.codes/whats-new
-
› opening the page clears the pulsing dot — read is read
see everything →
-
radio
v5 · jun 12
the radio got a body
a 1930s cathedral radio you tune by dragging the dial — static crackles between four all-new stations, generated live in your browser.
-
› lo-fi, trip hop, cool jazz, and delta blues — rebuilt from the ground up to actually groove
-
› drag the dial (or tap a preset); the needle sweeps and static plays between stations
-
› blues comes through a gramophone: band-limited, mono, warm and crackly
tune in →
-
arcade
v4 · jun 11
two new arcade games
jigsaw and neon drift join pong and sudoku. signal and cartographer have retired.
-
› jigsaw — solo or co-op puzzles; every image procedurally painted from a seed; invite a friend mid-game
-
› neon drift — 3D neon night city; drift-charged signal scanner; light up districts, unlock trim colors
-
› signal and cartographer retired (links redirect to the arcade hub)
play now →
-
v3 · may 31
what's new, delivered
this panel — and a showcase email whenever something ships.
-
› version-stamped news that follows you across every app
-
› one-click unsubscribe on every announcement
got it →
-
radio
v2 · may 30
the radio dock follows you
start a station and the mini-player rides along across every app.
open radio →
-
zoo
v1 · may 30
the zoo is open
feed koi, trumpet with an elephant, watch a peacock fan its tail.
visit the zoo →