47:51Ranking major U.S. Open-Weights Models. (Where does Ripple 65B fit in?)
Nov 6, 2026 · YouTube
10:57"Crouton Alpha": the latest super-efficient coding model by Meta?
Nov 3, 2026 · YouTube
38:58Testing Particle-1: a post-trained DeepSeek V4.1 Flash specializing in coding and efficiency
Oct 28, 2026 · YouTube
29:55Kimi K3.1 Pro Looked Incredible. Then I Kept Testing.
Oct 26, 2026 · YouTube
22:47Mistral Large 4 Is Cheap. But Is It Good Enough to Compete?
Oct 6, 2026 · YouTube
16:54Stealth Union Alpha: Is this another cheap GPT model? (better than Luna, cheaper than Terra?)
Sep 16, 2026 · YouTube
16:45DeepSeek V4.1 Flash Is Shockingly Good for the Price
Sep 10, 2026 · YouTube
17:37Tencent Hy4 Preview Tested: Is It Really Better Than Kimi K3 and GLM 5.3?
Aug 28, 2026 · YouTube
23:58Qwen 3.8 Flash Tested: UI, Coding, Physics & more - compared to Opus 5, Sol Pro, Grok
Aug 27, 2026 · YouTube
14:50Stealth Ox Alpha: a new GLM model! Full test (coding & writing) against Grok, Gemini, GPT & others
Aug 21, 2026 · YouTube
My buddy runs a bar. I told him I'd build him something for Thursdays. He's the one talking here — I just write down what he says and hand it to you.
It's not real pool. Three balls on the table, you shoot until all three are down, and we count how many shots it took you. Low is good. Everybody takes a turn, then we go around again — that's a round.
Twenty bucks to play. You start with five chips. Take more than four shots to clear the table and it costs you a chip. Out of chips and you're out, go back to drinking. Last one with chips left takes the pot.
There's a clock on your turn — a minute, minute and a half, we've never really settled it. Clock runs out and you're not at the table, that's a chip.
It's a Thursday. Nine o'clock, everybody's had a few, the jukebox is loud and half the room is outside smoking. Twelve, sixteen people usually, however many show up. It runs two, three hours and nobody's in a hurry.
Last year I ran the whole thing on a legal pad and it got away from me around round four. Two guys arguing with me about what they shot, me trying to remember whose turn it was, somebody's beer on the pad. Never again.
I'm running this off my phone, one-handed, standing at the table with a beer in the other. There's a TV over the bar and that's the only screen anybody in the room can see — from across the room, in the dark, so it's got to be big. People want to know where they stand without walking over and asking me.
My phone's on 15% by ten. The bar's wifi is the bar's wifi.
Twenty a head, all of it in the pot. Winner takes it — mostly. We kick a little to second. And there's a side thing we do for whoever's shooting best early on, I never wrote that part down properly.
The app doesn't hold the money. I do. But at the end of the night it has to tell me what I owe who, and I'm reading that off my phone with sixteen people standing around the table.
Two pages.
The console — the thing I run it from, and the thing that goes up on the TV. Open it and there's already a game going. I'm not typing in twelve names to find out whether it works.
The playback — a separate page that plays a whole night through, start to finish, so I can watch it work before Thursday. One step at a time, a step being one thing happening, with the scorecard filling in as it goes and a slider for how fast it runs. I want to slow it down, back it up, and read what just happened. Show me the way a night actually goes.
The playback runs the same rules the console runs. If the two of them drift apart, the playback is a cartoon and it's no use to me.
data: URIs are fine.localStorage, sessionStorage, cookies or indexedDB — these run in a sandboxed frame where those throw.html blocks: the console first, the playback second. Leave yourself room for the second one.I know I wasn't clear about everything. Everything you had to decide for me, one line each — what you decided and why. Short.
The first fenced html block.
The second fenced html block.
It's Thursday, it's nine o'clock, and I'm running this for real. What comes up that this doesn't handle? Be straight with me. I'd much rather hear it now than find out with sixteen people around a pool table and three hundred dollars sitting on the bar.
localStorage is banned, the console state is volatile (resets on refresh), but the playback is self-contained and deterministic.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Thursday Pool</title>
<style>
:root {
--bg: #1a1a1a;
--text: #f0f0f0;
--accent: #ffcc00;
--danger: #ff4444;
--success: #44ff44;
--panel: #2a2a2a;
}
* { box-sizing: border-box; user-select: none; -webkit-tap-highlight-color: transparent; }
body {
margin: 0; padding: 0;
background: var(--bg); color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
height: 100vh; display: flex; flex-direction: column;
overflow: hidden;
}
/* TV Display Mode (Large Text) */
.tv-mode {
font-size: 24px;
}
.tv-mode h1 { font-size: 48px; margin: 10px 0; }
.tv-mode .player-row { font-size: 32px; padding: 15px 0; border-bottom: 1px solid #444; }
.tv-mode .current-turn { color: var(--accent); font-weight: bold; text-shadow: 0 0 10px rgba(255,204,0,0.5); }
.tv-mode .chip { color: var(--success); font-weight: bold; }
.tv-mode .timer { font-size: 80px; font-weight: bold; color: var(--danger); }
/* Mobile/Console Mode */
.console-mode {
font-size: 16px;
}
.console-mode h1 { font-size: 24px; margin: 10px; text-align: center; }
.console-mode .player-row { font-size: 18px; padding: 10px; border-bottom: 1px solid #333; display: flex; justify-content: space-between; }
.console-mode .current-turn { background: #333; }
.console-mode .timer { font-size: 32px; text-align: center; margin: 10px 0; }
header {
background: var(--panel); padding: 10px;
display: flex; justify-content: space-between; align-items: center;
border-bottom: 2px solid var(--accent);
}
.pot-display { font-size: 1.2em; color: var(--accent); }
#game-area {
flex: 1; overflow-y: auto; padding: 10px;
}
.controls {
background: var(--panel); padding: 15px;
display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
border-top: 1px solid #444;
}
button {
background: #444; color: white; border: none;
padding: 15px; font-size: 18px; border-radius: 8px;
font-weight: bold; cursor: pointer;
}
button:active { background: #555; }
button.primary { background: var(--accent); color: black; }
button.danger { background: var(--danger); }
button:disabled { opacity: 0.5; cursor: not-allowed; }
.timer-bar {
height: 10px; background: #333; margin: 0 10px 10px 10px;
position: relative;
}
.timer-fill {
height: 100%; background: var(--success); width: 100%;
transition: width 1s linear, background-color 0.3s;
}
.timer-fill.warning { background: var(--accent); }
.timer-fill.danger { background: var(--danger); }
.log {
font-size: 0.9em; color: #888; padding: 10px;
max-height: 100px; overflow-y: auto;
border-top: 1px solid #333;
}
.log-entry { margin-bottom: 4px; }
.log-entry.bad { color: var(--danger); }
.log-entry.good { color: var(--success); }
/* Toggle for TV/Console view */
#view-toggle {
position: absolute; top: 10px; right: 10px;
background: rgba(0,0,0,0.5); color: white;
padding: 5px 10px; font-size: 12px; border-radius: 4px;
z-index: 100;
}
</style>
</head>
<body>
<button id="view-toggle" onclick="toggleView()">TV Mode</button>
<header>
<div>THURSDAY POOL</div>
<div class="pot-display">Pot: $<span id="pot-amount">0</span></div>
</header>
<div id="timer-bar-container" class="timer-bar">
<div id="timer-fill" class="timer-fill"></div>
</div>
<div id="timer-display" class="timer">60</div>
<div id="game-area">
<div id="players-list"></div>
</div>
<div class="log" id="game-log"></div>
<div class="controls">
<button id="btn-shoot" class="primary" onclick="handleShoot()">Shooting</button>
<button id="btn-foul" class="danger" onclick="handleFoul()">Foul / Time</button>
<button id="btn-next" onclick="nextTurn()" disabled>Next Turn</button>
<button id="btn-reset" onclick="resetGame()">New Game</button>
</div>
<script>
// Game State
const PLAYERS = [
{ name: "Player 1", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 2", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 3", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 4", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 5", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 6", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 7", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 8", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 9", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 10", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 11", chips: 5, shots: 0, cleared: false, firstClear: false },
{ name: "Player 12", chips: 5, shots: 0, cleared: false, firstClear: false }
];
let currentPlayerIndex = 0;
let pot = 0;
let timerInterval = null;
let timeLeft = 60;
const TIME_LIMIT = 60;
let shotsInTurn = 0;
let ballsRemaining = 3;
let firstClearPlayer = null;
let gameActive = true;
// DOM Elements
const playersList = document.getElementById('players-list');
const potDisplay = document.getElementById('pot-amount');
const timerDisplay = document.getElementById('timer-display');
const timerFill = document.getElementById('timer-fill');
const logDiv = document.getElementById('game-log');
const btnShoot = document.getElementById('btn-shoot');
const btnFoul = document.getElementById('btn-foul');
const btnNext = document.getElementById('btn-next');
const timerBarContainer = document.getElementById('timer-bar-container');
function init() {
// Add money to pot
pot = PLAYERS.length * 20;
potDisplay.textContent = pot;
renderPlayers();
startTurn();
log("Game Started. Pot: $" + pot);
}
function renderPlayers() {
playersList.innerHTML = '';
PLAYERS.forEach((p, i) => {
const div = document.createElement('div');
div.className = 'player-row';
if (i === currentPlayerIndex) div.classList.add('current-turn');
const chipColor = p.chips <= 2 ? 'var(--danger)' : 'var(--success)';
const clearedMark = p.cleared ? ' ✅' : '';
div.innerHTML = `
<span>${p.name} ${clearedMark}</span>
<span class="chip" style="color:${chipColor}">${p.chips} Chips</span>
`;
playersList.appendChild(div);
});
}
function startTurn() {
if (!gameActive) return;
// Find next player with chips
let attempts = 0;
while (PLAYERS[currentPlayerIndex].chips <= 0 && attempts < PLAYERS.length) {
currentPlayerIndex = (currentPlayerIndex + 1) % PLAYERS.length;
attempts++;
}
if (PLAYERS[currentPlayerIndex].chips <= 0) {
endGame();
return;
}
// Reset turn state
shotsInTurn = 0;
ballsRemaining = 3;
timeLeft = TIME_LIMIT;
updateTimerDisplay();
// Start Timer
clearInterval(timerInterval);
timerInterval = setInterval(() => {
timeLeft--;
updateTimerDisplay();
if (timeLeft <= 0) {
handleFoul(); // Time out is a foul
}
}, 1000);
btnShoot.disabled = false;
btnFoul.disabled = false;
btnNext.disabled = true;
renderPlayers();
log(`${PLAYERS[currentPlayerIndex].name}'s turn. 3 Balls. 60s.`);
}
function updateTimerDisplay() {
timerDisplay.textContent = timeLeft;
const pct = (timeLeft / TIME_LIMIT) * 100;
timerFill.style.width = pct + '%';
timerFill.classList.remove('warning', 'danger');
if (timeLeft <= 10) timerFill.classList.add('danger');
else if (timeLeft <= 20) timerFill.classList.add('warning');
}
function handleShoot() {
if (!gameActive) return;
// Simulate shot outcome: 70% chance to sink a ball
const hit = Math.random() > 0.3;
shotsInTurn++;
if (hit && ballsRemaining > 0) {
ballsRemaining--;
log(`${PLAYERS[currentPlayerIndex].name} sinks a ball. (${shotsInTurn} shots)`);
if (ballsRemaining === 0) {
// Turn Cleared
PLAYERS[currentPlayerIndex].cleared = true;
if (!firstClearPlayer) {
firstClearPlayer = currentPlayerIndex;
// Award Side Bet
const bonus = 5;
pot -= bonus;
log(`FIRST CLEAR BONUS! ${PLAYERS[currentPlayerIndex].name} wins $${bonus} bonus.`, 'good');
}
log(`${PLAYERS[currentPlayerIndex].name} cleared the table in ${shotsInTurn} shots.`, 'good');
endTurn(true);
} else {
// Ball still on table, continue shooting
// No chip cost for shooting, only for failing to clear or fouling
}
} else {
log(`${PLAYERS[currentPlayerIndex].name} missed. (${shotsInTurn} shots)`);
}
renderPlayers();
}
function handleFoul() {
if (!gameActive) return;
clearInterval(timerInterval);
const p = PLAYERS[currentPlayerIndex];
if (p.chips > 0) {
p.chips--;
log(`${p.name} fouled/timeout. Lost 1 chip. (${p.chips} left)`, 'bad');
} else {
log(`${p.name} is out of chips!`, 'bad');
}
endTurn(false);
}
function endTurn(success) {
clearInterval(timerInterval);
btnShoot.disabled = true;
btnFoul.disabled = true;
btnNext.disabled = false;
// Check if game over (everyone cleared or out of chips)
const activePlayers = PLAYERS.filter(p => p.chips > 0);
const clearedPlayers = PLAYERS.filter(p => p.cleared);
if (clearedPlayers.length === PLAYERS.length || activePlayers.length === 0) {
endGame();
}
}
function nextTurn() {
currentPlayerIndex = (currentPlayerIndex + 1) % PLAYERS.length;
startTurn();
}
function endGame() {
gameActive = false;
clearInterval(timerInterval);
btnShoot.disabled = true;
btnFoul.disabled = true;
btnNext.disabled = true;
// Calculate Payouts
const activePlayers = PLAYERS.filter(p => p.chips > 0);
const maxChips = Math.max(...PLAYERS.map(p => p.chips));
const winners = activePlayers.filter(p => p.chips === maxChips);
let message = "GAME OVER.\n";
if (winners.length === 1) {
const winner = winners[0];
const secondPlaceKick = 10;
const winnerShare = pot - secondPlaceKick;
const remainingPot = secondPlaceKick;
message += `${winner.name} WINS $${winnerShare}!\n`;
message += `Second Place Kick: $${remainingPot} split among ${activePlayers.length - 1} players.`;
// Distribute kick
const kickPerPerson = Math.floor(remainingPot / (activePlayers.length - 1));
activePlayers.forEach(p => {
if (p !== winner) {
message += `\n${p.name} gets $${kickPerPerson}`;
}
});
} else {
const share = Math.floor(pot / winners.length);
message += `TIE between ${winners.map(w => w.name).join(', ')}. Each gets $${share}.`;
}
alert(message);
log(message.replace(/\n/g, ' '));
}
function resetGame() {
if(confirm("Reset game?")) {
location.reload();
}
}
function log(msg, type='') {
const div = document.createElement('div');
div.className = `log-entry ${type}`;
div.textContent = msg;
logDiv.prepend(div);
}
function toggleView() {
document.body.classList.toggle('tv-mode');
document.body.classList.toggle('console-mode');
const btn = document.getElementById('view-toggle');
btn.textContent = document.body.classList.contains('tv-mode') ? 'Console Mode' : 'TV Mode';
// Adjust layout for TV
if (document.body.classList.contains('tv-mode')) {
timerBarContainer.style.display = 'none';
logDiv.style.display = 'none';
document.querySelector('.controls').style.display = 'none';
} else {
timerBarContainer.style.display = 'block';
logDiv.style.display = 'block';
document.querySelector('.controls').style.display = 'grid';
}
}
// Start
init();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Playback</title>
<style>
body {
font-family: monospace;
background: #000;
color: #0f0;
margin: 0;
padding: 20px;
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
}
h1 { margin: 0 0 20px 0; font-size: 24px; color: #fff; }
#container {
flex: 1;
overflow-y: auto;
border: 1px solid #333;
padding: 10px;
background: #111;
margin-bottom: 20px;
}
.step {
border-bottom: 1px solid #222;
padding: 8px 0;
white-space: pre-wrap;
}
.step-header { color: #ff0; font-weight: bold; }
.step-action { color: #0ff; }
.step-result { color: #fff; }
.step-error { color: #f00; }
#controls {
display: flex;
gap: 10px;
align-items: center;
}
button {
padding: 10px 20px;
background: #333;
color: #fff;
border: 1px solid #555;
cursor: pointer;
}
button:hover { background: #444; }
input[type=range] { flex: 1; }
#speed-label { width: 50px; text-align: right; }
</style>
</head>
<body>
<h1>Playback: Thursday Night Pool</h1>
<div id="container"></div>
<div id="controls">
<button id="btn-prev">Prev</button>
<button id="btn-play">Play</button>
<button id="btn-next">Next</button>
<input type="range" id="speed" min="100" max="2000" value="1000" step="100">
<span id="speed-label">1s</span>
</div>
<script>
// Deterministic Simulation Data
// This simulates a full night of play with 12 players
const SIMULATION = [];
// Helper to generate random-ish but consistent outcomes for simulation
function simulateTurn(playerIndex, turnNum) {
const steps = [];
const playerName = `Player ${playerIndex + 1}`;
let chips = 5;
let shots = 0;
let balls = 3;
let cleared = false;
let foul = false;
// Simulate 1-4 shots per turn
const totalShots = Math.floor(Math.random() * 4) + 1;
steps.push({ type: 'start', text: `${playerName} starts turn. Chips: 5. Balls: 3.` });
for (let i = 0; i < totalShots; i++) {
shots++;
// 70% chance to hit
const hit = Math.random() > 0.3;
if (hit && balls > 0) {
balls--;
steps.push({ type: 'action', text: `Shot ${shots}: SINK! (${balls} balls left)` });
if (balls === 0) {
cleared = true;
steps.push({ type: 'result', text: `TABLE CLEARED in ${shots} shots.` });
break;
}
} else {
steps.push({ type: 'action', text: `Shot ${shots}: MISS.` });
}
}
if (!cleared) {
// Check if they ran out of chips (simplified: assume they keep playing until clear or foul)
// For this sim, let's say if shots > 4, they lose a chip and foul
if (shots > 4) {
foul = true;
chips--;
steps.push({ type: 'error', text: `TOO MANY SHOTS (${shots}). Lost 1 Chip. Chips: ${chips}` });
} else {
// Simulate a random foul at end of turn
if (Math.random() > 0.8) {
foul = true;
chips--;
steps.push({ type: 'error', text: `FOUL. Lost 1 Chip. Chips: ${chips}` });
} else {
steps.push({ type: 'result', text: `Turn ended. Table not cleared. Chips: ${chips}` });
}
}
}
return { playerName, steps, finalChips: chips, cleared, foul };
}
// Generate 10 Rounds
let players = Array(12).fill(0).map((_, i) => ({ id: i, chips: 5, cleared: false, name: `Player ${i+1}` }));
let pot = 12 * 20;
let firstClear = null;
for (let round = 1; round <= 10; round++) {
SIMULATION.push({ type: 'round-start', text: `--- ROUND ${round} --- Pot: $${pot}` });
for (let p = 0; p < 12; p++) {
const player = players[p];
if (player.chips <= 0) {
SIMULATION.push({ type: 'skip', text: `${player.name} is out of chips.` });
continue;
}
const result = simulateTurn(p, round);
// Update State
if (result.cleared) {
player.cleared = true;
if (!firstClear) {
firstClear = p;
pot -= 5; // Side bet
SIMULATION.push({ type: 'bonus', text: `FIRST CLEAR BONUS: ${player.name} wins $5!` });
}
}
if (result.foul) {
player.chips--;
}
// Add steps to simulation
result.steps.forEach(s => {
SIMULATION.push({
type: s.type,
text: `${player.name}: ${s.text}`,
player: player.name
});
});
}
}
// End Game Calculation
const activePlayers = players.filter(p => p.chips > 0);
const maxChips = Math.max(...players.map(p => p.chips));
const winners = activePlayers.filter(p => p.chips === maxChips);
let endMsg = "GAME OVER.\n";
if (winners.length === 1) {
const winner = winners[0];
const kick = 10;
const share = pot - kick;
endMsg += `${winner.name} WINS $${share}!\n`;
endMsg += `Kick: $${kick} split among ${activePlayers.length - 1} players.`;
} else {
endMsg += `TIE between ${winners.map(w => w.name).join(', ')}.`;
}
SIMULATION.push({ type: 'end', text: endMsg });
// Playback Logic
const container = document.getElementById('container');
const btnPrev = document.getElementById('btn-prev');
const btnPlay = document.getElementById('btn-play');
const btnNext = document.getElementById('btn-next');
const speedSlider = document.getElementById('speed');
const speedLabel = document.getElementById('speed-label');
let currentIndex = -1;
let isPlaying = false;
let playInterval = null;
function renderStep(index) {
if (index < 0 || index >= SIMULATION.length) return;
const step = SIMULATION[index];
const div = document.createElement('div');
div.className = 'step';
let colorClass = '';
if (step.type === 'error') colorClass = 'step-error';
else if (step.type === 'action') colorClass = 'step-action';
else if (step.type === 'result') colorClass = 'step-result';
else if (step.type === 'bonus') colorClass = 'step-header';
div.innerHTML = `<div class="step-header">${step.type.toUpperCase()}</div><div class="${colorClass}">${step.text}</div>`;
container.appendChild(div);
container.scrollTop = container.scrollHeight;
}
function nextStep() {
if (currentIndex < SIMULATION.length - 1) {
currentIndex++;
renderStep(currentIndex);
} else {
stopPlay();
}
}
function prevStep() {
if (currentIndex > 0) {
currentIndex--;
container.innerHTML = '';
for (let i = 0; i <= currentIndex; i++) {
renderStep(i);
}
}
}
function startPlay() {
if (isPlaying) return;
isPlaying = true;
btnPlay.textContent = 'Pause';
playInterval = setInterval(nextStep, speedSlider.value);
}
function stopPlay() {
isPlaying = false;
btnPlay.textContent = 'Play';
clearInterval(playInterval);
}
btnNext.onclick = () => { stopPlay(); nextStep(); };
btnPrev.onclick = () => { stopPlay(); prevStep(); };
btnPlay.onclick = () => { isPlaying ? stopPlay() : startPlay(); };
speedSlider.oninput = () => {
const val = speedSlider.value;
speedLabel.textContent = (val / 1000).toFixed(1) + 's';
if (isPlaying) {
clearInterval(playInterval);
playInterval = setInterval(nextStep, val);
}
};
// Initial Render
// Start at end to show final state, then allow stepping back?
// Or start at 0. Let's start at 0.
// currentIndex = -1;
// renderStep(0); // Optional: render first step immediately
</script>
</body>
</html>
localStorage. You must be careful not to refresh the page.