Technical Museum
All Hardware Maps ML & AI Music Social Tools Writing Apps & Games
Deciduous
Decision graph CLI for tracing how software decisions evolve
Rust SQLite HTML/JS
Deciduous Archaeology Demo
Demonstrations of decision archaeology on React and stacked git workflows
Rust React Git
Phish Explorer
Jam analytics dashboard for Phish 3.0 era
Elixir Phoenix LiveView D3.js
Local LLM on MacBook
4-bit quantization, safetensors, and Bumblebee + EMLX for Apple Silicon
Elixir Rust Python
A Bot that posts like me
Porting the posting bot to Elixir using local LLM work
Elixir Bumblebee EMLX
Receipt Printer Software Suite
A complete software suite for thermal receipt printers
Elixir Python
Role Call
TV writer overlap explorer
Elixir Phoenix LiveView
Fill Your Sky
Interactive map of 418+ Bluesky communities with 545K+ people
Elixir Phoenix LiveView D3.js
Code Mirror
A live code mirror experiment
Elixir Phoenix LiveView
Pocket Pnin
A local LLM running on my iPhone, coming to the App Store for free
Swift MLX
NYC Census Maps
Interactive census and PLUTO data visualization for New York City
Elixir Phoenix LiveView Leaflet.js
MTA Bus Tracker
Real-time MTA bus and train tracking on an interactive map
Elixir Phoenix LiveView Leaflet.js
Concert GIF Maker
Extract GIFs from concert videos with a retro Mac interface
Elixir Phoenix LiveView FFmpeg
Send a VERY direct message, to my receipt printer
A social project where friends send photos that print on my receipt printer
Elixir Phoenix LiveView
Archive TV
A real over-the-air TV channel from magnetic media archives
Elixir FFmpeg
Losselot
Neural network loss function explorer
Python
Todoinksies
A personal todo app
Elixir Phoenix LiveView
Ormery
An ORM written in Temper
Temper
Collage Maker
Upload photos and arrange them into grid collages
Elixir Phoenix LiveView
GenStage Tutorial 2025
A modern GenStage tutorial for the Elixir ecosystem
Elixir GenStage
Temper Rust Bug
Found a bug in the Temper compiler and built a demo repo
Temper Rust
300+ Years of Tree Law
A blog post that became its own LiveView application
Elixir Phoenix LiveView
HEEx in Other Languages
Experiments porting Phoenix HEEx templates to Rust, Lua, C#, Java, Python, and JS
Temper Rust Lua
Live Draft LSP
Live-stream blog drafts from Zed to Phoenix via a custom LSP
Rust Elixir Zed
Bluesky Hoover Apps
Various apps that vacuum up and process the Bluesky firehose
Elixir Phoenix LiveView
Bobby Posts Bot
A bot that posts like me, in Python
Python
Photo Booth Receipt Printer
A portable photo booth that prints on receipt paper
Python Elixir
Nathan For Us
A Nathan For You social network with video search and GIF creation
Elixir Phoenix LiveView FFmpeg
Browser History Roast MCP
An MCP server that roasts you based on your browser history
Python MCP
GenStage Tutorial (Original)
The original GenStage tutorial
Elixir GenStage
Bluesky Firehose Toys
Real-time firehose visualizations: emoji streams, jetstream comparisons, and more
Elixir Phoenix LiveView WebSocket
31 exhibits Apps & Games
MY FAV
LEICA SHOTS
Work Log — Recent Commits
+12-4 temperlang/temper/fix/rust-for-loop-var-reset Mar 16 14:57
52c431a fix: reset for-loop variable on each iteration in Rust async state machine Fixes #378 When a `for (var i = 0; ...)` loop is inside a while loop and the for body contains an `await`, the Rust backend's coroutine-to-state-machine transformation extracts the variable declaration to a persistent struct field but drops the initializer from the case body. This means `i = 0` only runs once (at generator creation), so the inner loop silently never executes after the first outer iteration. The fix: don't extract the initializer for ValueLeaf (simple value) declarations. Extract just the declaration to persistent storage, and leave the `i = 0` assignment in the state machine case body so it re-executes every time the case is entered. Before: persistent: var i: Int = 0 (runs once) case body: (nothing) After: persistent: var i: Int (declaration only) case body: i = 0 (runs on each case entry) This is safe for non-loop declarations too — the assignment just runs once when the case is entered, same as before. Minimal reproduction (pure Temper, no deps): while (outerCount < 3) { outerCount = outerCount + 1; for (var i = 0; i < items.length; ++i) { totalLoopBodyRuns = totalLoopBodyRuns + 1; await resolved(); } } JS (correct): total loop body runs: 9 Rust before: total loop body runs: 3 Rust after: total loop body runs: 9 All existing be-rust and be-js tests pass. Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
+12-4 temperlang/temper/fix/rust-for-loop-var-reset Mar 16 13:55
48c6bf8 fix: reset for-loop variable on each iteration in Rust async state machine Fixes #378 When a `for (var i = 0; ...)` loop is inside a while loop and the for body contains an `await`, the Rust backend's coroutine-to-state-machine transformation extracts the variable declaration to a persistent struct field but drops the initializer from the case body. This means `i = 0` only runs once (at generator creation), so the inner loop silently never executes after the first outer iteration. The fix: don't extract the initializer for ValueLeaf (simple value) declarations. Extract just the declaration to persistent storage, and leave the `i = 0` assignment in the state machine case body so it re-executes every time the case is entered. Before: persistent: var i: Int = 0 (runs once) case body: (nothing) After: persistent: var i: Int (declaration only) case body: i = 0 (runs on each case entry) This is safe for non-loop declarations too — the assignment just runs once when the case is entered, same as before. Minimal reproduction (pure Temper, no deps): while (outerCount < 3) { outerCount = outerCount + 1; for (var i = 0; i < items.length; ++i) { totalLoopBodyRuns = totalLoopBodyRuns + 1; await resolved(); } } JS (correct): total loop body runs: 9 Rust before: total loop body runs: 3 Rust after: total loop body runs: 9 All existing be-rust and be-js tests pass. Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
+12-4 temperlang/temper/fix/rust-for-loop-var-reset Mar 16 13:54
3683385 fix: reset for-loop variable on each iteration in Rust async state machine Fixes #378 When a `for (var i = 0; ...)` loop is inside a while loop and the for body contains an `await`, the Rust backend's coroutine-to-state-machine transformation extracts the variable declaration to a persistent struct field but drops the initializer from the case body. This means `i = 0` only runs once (at generator creation), so the inner loop silently never executes after the first outer iteration. The fix: don't extract the initializer for ValueLeaf (simple value) declarations. Extract just the declaration to persistent storage, and leave the `i = 0` assignment in the state machine case body so it re-executes every time the case is entered. Before: persistent: var i: Int = 0 (runs once) case body: (nothing) After: persistent: var i: Int (declaration only) case body: i = 0 (runs on each case entry) This is safe for non-loop declarations too — the assignment just runs once when the case is entered, same as before. Minimal reproduction (pure Temper, no deps): while (outerCount < 3) { outerCount = outerCount + 1; for (var i = 0; i < items.length; ++i) { totalLoopBodyRuns = totalLoopBodyRuns + 1; await resolved(); } } JS (correct): total loop body runs: 9 Rust before: total loop body runs: 3 Rust after: total loop body runs: 9 All existing be-rust and be-js tests pass. Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
+12-4 temperlang/temper/fix/rust-for-loop-var-reset Mar 16 12:28
a2270c2 fix: reset for-loop variable on each iteration in Rust async state machine Fixes #378 When a `for (var i = 0; ...)` loop is inside a while loop and the for body contains an `await`, the Rust backend's coroutine-to-state-machine transformation extracts the variable declaration to a persistent struct field but drops the initializer from the case body. This means `i = 0` only runs once (at generator creation), so the inner loop silently never executes after the first outer iteration. The fix: don't extract the initializer for ValueLeaf (simple value) declarations. Extract just the declaration to persistent storage, and leave the `i = 0` assignment in the state machine case body so it re-executes every time the case is entered. Before: persistent: var i: Int = 0 (runs once) case body: (nothing) After: persistent: var i: Int (declaration only) case body: i = 0 (runs on each case entry) This is safe for non-loop declarations too — the assignment just runs once when the case is entered, same as before. Minimal reproduction (pure Temper, no deps): while (outerCount < 3) { outerCount = outerCount + 1; for (var i = 0; i < items.length; ++i) { totalLoopBodyRuns = totalLoopBodyRuns + 1; await resolved(); } } JS (correct): total loop body runs: 9 Rust before: total loop body runs: 3 Rust after: total loop body runs: 9 All existing be-rust and be-js tests pass.
+2177-1865 notactuallytreyanastasio/snake-rust/main Mar 16 11:07
f97f776 Update from temper_snake 43c00a9c8607047854c74f427095d22fb00b36f9
+1265-1213 notactuallytreyanastasio/snake-lua/main Mar 16 11:07
912b30c Update from temper_snake 43c00a9c8607047854c74f427095d22fb00b36f9
+1600-1486 notactuallytreyanastasio/snake-js/main Mar 16 11:07
028958b Update from temper_snake 43c00a9c8607047854c74f427095d22fb00b36f9
+1583-1534 notactuallytreyanastasio/snake-python/main Mar 16 11:07
bdd12df Update from temper_snake 43c00a9c8607047854c74f427095d22fb00b36f9
+813-701 notactuallytreyanastasio/snake-csharp/main Mar 16 11:07
afcbe54 Update from temper_snake 43c00a9c8607047854c74f427095d22fb00b36f9
+1041-793 notactuallytreyanastasio/snake-java/main Mar 16 11:07
01210ed Update from temper_snake 43c00a9c8607047854c74f427095d22fb00b36f9
+2639-59 notactuallytreyanastasio/temper_snake/main Mar 16 11:03
7de9814 fix: nullable string comparison in spectator handshake for Rust backend The Rust codegen can't compare String? directly to a string literal. Use `is String` type check first, then compare the narrowed value. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0329d61 feat: randomize snake spawn positions with edge buffer Spawn positions are now PRNG-driven instead of cycling through 4 fixed quarter positions. Each snake gets a random position at least 5 cells from any edge (so it has room to react before hitting a wall) and a random direction. The seed is mixed with the player index for deterministic but spread-out placement. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
be3cf48 feat: add spectator mode and join/spectate handshake protocol Clients now send a handshake message on connect: - "join" → player (spawns a snake) - "spectate" → spectator (receives frames, no snake) Server waits for the first message to decide. Spectators get added to the broadcast list but no PlayerSnake is created. They see the full board with all players and bots but don't affect the game. New file: bot/spectate.js — minimal spectator client. Updated: client sends "join", bot sends "join", spectate sends "spectate". Usage: node bot/spectate.js # watch the game node bot/spectate.js ws://host:8080 # watch a remote game Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
43c00a9 add deciduous
d6f31aa feat: add AI snake bots powered by local LLMs via Ollama Each bot connects as a regular WebSocket client — the server can't tell it apart from a human. The bot receives rendered ASCII frames, strips ANSI escapes, sends the board to a local Ollama model with a personality-specific system prompt, parses the response for a direction (u/d/l/r), and sends it to the server. 6 personalities: greedy (chase food), cautious (survive), aggressive (hunt other snakes), chaotic (unpredictable), hunter (target the leader), wall_hugger (patrol edges). Usage: node bot/snake-bot.js greedy mistral-small bash bot/swarm.sh llama3.2:3b # launches 4 bots at once All bots share one model in Ollama (~2GB for 3B params). Each bot decides every ~1-2s. Between decisions, the snake keeps moving in its current direction — gives a natural "thinking" feel. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4dc6928 feat: bots randomly pick JS, Rust, or Python compiled client Each AI bot spawns a random compiled Temper client (JS, Rust, or Python) as a subprocess and controls it by piping directions to stdin and reading rendered frames from stdout. The bot wrapper: 1. Picks a random backend (or accepts one as CLI arg) 2. Spawns the compiled client as a child process 3. Reads ASCII frames from the child's stdout 4. Sends frames to Ollama with personality prompt 5. Writes the LLM's chosen direction to the child's stdin This means each bot is genuinely running a different language's compiled output — a Rust binary, a Node.js script, or a Python program — all connecting to the same server via WebSocket. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+3289-570 notactuallytreyanastasio/snake-java/main Mar 15 23:11
125731a Update from temper_snake c8f06c7238f126a9988baa78bfcb5e103626b476
+9372-5725 notactuallytreyanastasio/snake-js/main Mar 15 23:11
2086e05 Update from temper_snake c8f06c7238f126a9988baa78bfcb5e103626b476
+2274-996 notactuallytreyanastasio/snake-python/main Mar 15 23:11
f5e407e Update from temper_snake c8f06c7238f126a9988baa78bfcb5e103626b476
+3771-680 notactuallytreyanastasio/snake-rust/main Mar 15 23:11
8f3106b Update from temper_snake c8f06c7238f126a9988baa78bfcb5e103626b476
+2999-600 notactuallytreyanastasio/snake-csharp/main Mar 15 23:11
66ec778 Update from temper_snake c8f06c7238f126a9988baa78bfcb5e103626b476
+1872-503 notactuallytreyanastasio/snake-lua/main Mar 15 23:11
f2de24b Update from temper_snake c8f06c7238f126a9988baa78bfcb5e103626b476
+1090-11 notactuallytreyanastasio/temper_snake/main Mar 15 23:07
c8f06c7 server frames correction
11a0d08 fix: update compiler branch refs to do-more-crimes-to-play-snake-multiplayer CI and build instructions now point to the new Temper compiler branch that includes std/ws (WebSocket) and std/io terminal size detection. Updates the git clone in the GitHub Actions workflow, the generated child repo READMEs, and the manual build instructions in README.md. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f6f6f11 get thigns working for rust and stuff
cdcf29d docs: update bug report with minimal repro on Temper main Confirmed the for-loop variable reset bug on Temper main (cb8c3d5) with a pure-Temper reproduction — no std/io, no WebSocket, no external dependencies. Just PromiseBuilder + await inside a for loop inside a while loop. JS: "total loop body runs: 9" — PASS Rust: "total loop body runs: 3" — FAIL Root cause: `for (var i = 0; ...)` compiles the init as a struct field default (runs once at generator creation), not as a per-iteration assignment in the state machine. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4860666 fix: avoid await inside broadcast loop (Rust codegen state machine bug) The Rust backend's state machine doesn't reset for-loop variables when the outer loop iterates after an await inside the inner loop. Work around this by using for-of (forEach) without await for the broadcast, since wsSend is synchronous in the Rust backend (channel push). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c52a6fc docs: rewrite bug report referencing only Temper main Clean report with no references to snake, WebSocket, or multiplayer code. Minimal reproduction uses only core Temper primitives (PromiseBuilder, async/await, for loop). Tested on main at cb8c3d5. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8f1bc83 docs: detailed report on Rust backend broadcast loop await bug Documents a codegen bug where for-loop variables inside outer loops don't reset when the inner loop awaits a synchronously-resolved Promise. Includes root cause analysis (re-entrant generator.next() from inline on_ready callbacks), the exact state machine case flow, evidence from debug logging, the workaround, and scope analysis. Verified the bug does not reproduce with async-resolved Promises (sleep(0)) — only with @connected functions that call pb.complete() synchronously (like wsSend). The JS backend is unaffected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ca39530 docs: add JS, Rust, and Python multiplayer setup instructions Complete setup and run instructions for all three backends with server and client commands. Documents mix-and-match interop. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
aaf8625 feat: add multiplayer snake over WebSockets Add networked multiplayer to the snake game. One player starts a server, others connect as clients, and everybody shares the same board. The entire multiplayer stack — game logic, protocol, server, client — is written in Temper and compiles to every backend. This commit covers the game-side changes. The compiler-side changes (adding std/ws and terminal size detection to std/io) live on the `do-more-crimes-to-play-snake-multiplayer` branch in the Temper repo. ## What changed ### Multi-snake game logic (src/snake.temper.md, +437 lines) New types: - `PlayerStatus` (sealed): `Alive` / `Dead` - `PlayerSnake`: id, segments, direction, score, status - `MultiSnakeGame`: width, height, list of snakes, food, rng, tick count New functions: - `newMultiGame(width, height, numPlayers, seed)` — spawns snakes at spread-out positions around the board (quarters, facing inward) - `multiTick(game, directions)` — the core multiplayer tick. Handles: - Per-snake direction changes (rejects opposite) - Wall collision (per snake) - Self collision (per snake) - Head-to-body collision (your head hits another snake's body) - Head-to-head collision (two snakes move to the same cell — both die) - Food eating (first alive snake to reach food gets the point) - Food respawning (avoids all snake segments) - `multiRender(game)` — renders the board with per-player symbols: P0: @/o, P1: #/+, P2: $/~, P3: %/=, P4+: &/. Shows score and alive/dead status per player below the board. - `changePlayerDirection(game, playerId, dir)` — updates one player - `isMultiGameOver(game)` — true when <=1 snake alive (2+ players) - `addPlayer(game, seed)` — adds a snake to a running game - `removePlayer(game, playerId)` — removes a disconnected player - `directionToString` / `stringToDirection` — serialization helpers All single-player code is untouched. The 18 original tests still pass. ### Server (server/server.temper.md) A WebSocket server using the new `std/ws` module. Architecture: - Accept loop (async block): listens on port 8080, accepts connections, calls `addPlayer` to spawn a new snake, then spawns a per-connection recv loop as another async block - Per-connection recv loop (async block per player): reads single-char direction messages (u/d/l/r), calls `changePlayerDirection` - Game loop (async block): ticks every 200ms, builds the directions list from current snake states, calls `multiTick`, broadcasts the rendered frame to all connections via `wsSend` The board size is calculated from the server's terminal dimensions minus a 10-character margin on each axis, using the new `terminalColumns()` and `terminalRows()` from `std/io`. Players can join at any time. The server handles disconnections gracefully (the snake just stops getting direction updates and eventually hits a wall). ### Client (client/client.temper.md) A WebSocket client that connects to the server. Two async blocks: - Input loop: reads w/a/s/d via `readLine()`, maps to single-char direction codes (u/d/l/r), sends via `wsSend` - Recv loop: receives messages via `wsRecv`, prints them directly (the server sends fully-rendered frames as plain text) The client is intentionally dumb. It has no game logic. It sends keypresses and displays whatever the server sends back. ### Protocol Deliberately minimal, no parsing required: - Client → Server: single characters "u", "d", "l", "r" - Server → Client: complete rendered ASCII frames (the output of `multiRender`), sent as-is over the WebSocket No JSON. No message framing. No serialization library. The server renders the board, sends the string, the client prints it. ### Tests (test/snake_test.temper.md, +13 tests) New tests covering: multi-game creation, snake count, alive status, different spawn positions, segment count, both snakes moving on tick, wall collision killing a snake, game-over detection, direction changes, opposite direction rejection, addPlayer, removePlayer, render output, and direction serialization round-trips. Total: 31 tests (18 single-player + 13 multiplayer). All pass. ## How to play # Terminal 1: start server cd temper.out/js && node snake-server/index.js # Terminal 2: player 1 cd temper.out/js && node snake-client/index.js # Terminal 3: player 2 cd temper.out/js && node snake-client/index.js Connect as many players as you want. ## Compiler changes required (separate branch) The Temper compiler gained a new `std/ws` module with 6 @connected functions and 2 opaque types, wired for JS (`ws` npm package) and Rust (`tungstenite` crate). Also `terminalColumns()`/`terminalRows()` in `std/io`. 13 files changed, 554 insertions. Committed on branch `do-more-crimes-to-play-snake-multiplayer` in the Temper repo. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+261-36 notactuallytreyanastasio/temper_snake/multiplayer-snake Mar 15 23:04
d46f2f7 docs: detailed report on Rust backend broadcast loop await bug Documents a codegen bug where for-loop variables inside outer loops don't reset when the inner loop awaits a synchronously-resolved Promise. Includes root cause analysis (re-entrant generator.next() from inline on_ready callbacks), the exact state machine case flow, evidence from debug logging, the workaround, and scope analysis. Verified the bug does not reproduce with async-resolved Promises (sleep(0)) — only with @connected functions that call pb.complete() synchronously (like wsSend). The JS backend is unaffected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bbe65f6 docs: add JS, Rust, and Python multiplayer setup instructions Complete setup and run instructions for all three backends with server and client commands. Documents mix-and-match interop. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1e0cf3c fix: avoid await inside broadcast loop (Rust codegen state machine bug) The Rust backend's state machine doesn't reset for-loop variables when the outer loop iterates after an await inside the inner loop. Work around this by using for-of (forEach) without await for the broadcast, since wsSend is synchronous in the Rust backend (channel push). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2365282 docs: update bug report with minimal repro on Temper main Confirmed the for-loop variable reset bug on Temper main (cb8c3d5) with a pure-Temper reproduction — no std/io, no WebSocket, no external dependencies. Just PromiseBuilder + await inside a for loop inside a while loop. JS: "total loop body runs: 9" — PASS Rust: "total loop body runs: 3" — FAIL Root cause: `for (var i = 0; ...)` compiles the init as a struct field default (runs once at generator creation), not as a per-iteration assignment in the state machine. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
07dec9c docs: rewrite bug report referencing only Temper main Clean report with no references to snake, WebSocket, or multiplayer code. Minimal reproduction uses only core Temper primitives (PromiseBuilder, async/await, for loop). Tested on main at cb8c3d5. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4ce98e9 server frames correction
937cd53 get thigns working for rust and stuff
+4108-0 notactuallytreyanastasio/nvim_temper_syntax_highlighter/main Mar 15 15:57
cf510c3 Auto-publish from templight@d19a7d0
+67-0 notactuallytreyanastasio/templight/main Mar 15 15:57
7338a18 Add README Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+6161-0 notactuallytreyanastasio/templight/main Mar 15 15:56
1fe9a5a Add Neovim plugin source, build output, and CI workflow - nvim/: plugin source files (ftdetect, plugin, highlighting logic) - temper.out/lua/: committed build output for CI testing - .github/workflows/: CI that runs Lua tests and publishes to nvim_temper_syntax_highlighter on success Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+3465-1 notactuallytreyanastasio/templight/main Mar 15 15:56
d19a7d0 Include luaunit in committed build output for CI tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+14-14 notactuallytreyanastasio/snake-js/main Mar 15 14:25
3c5373c Update from temper_snake a39098b041de1619f89cf75b20e1b9365fc7ee3c
+375-257 notactuallytreyanastasio/temper_snake/main Mar 15 14:22
07a8562 write up the process a bit more
a39098b write up teh whole thing a bit more
+16-16 notactuallytreyanastasio/snake-js/main Mar 15 08:54
a43dcf6 Update from temper_snake 0344778b5417ec14c5717d2cff2765f03dca4b5a
+19-19 notactuallytreyanastasio/snake-java/main Mar 15 08:54
d125fa1 Update from temper_snake 0344778b5417ec14c5717d2cff2765f03dca4b5a
+19-19 notactuallytreyanastasio/snake-csharp/main Mar 15 08:54
a024134 Update from temper_snake 0344778b5417ec14c5717d2cff2765f03dca4b5a
+10-10 notactuallytreyanastasio/snake-js/main Mar 15 08:48
ebd07ef Update from temper_snake 26476b980303ae985689513527c1731356962183
+23-15 notactuallytreyanastasio/snake-lua/main Mar 15 08:47
91e3fd5 Update from temper_snake bc2e9fd57ff0765930c54c5a8c0b6c14ad2c46a1
+33-27 notactuallytreyanastasio/snake-js/main Mar 15 08:47
b5ca7cb Update from temper_snake bc2e9fd57ff0765930c54c5a8c0b6c14ad2c46a1
+22-15 notactuallytreyanastasio/snake-rust/main Mar 15 08:46
04421f1 Update from temper_snake bc2e9fd57ff0765930c54c5a8c0b6c14ad2c46a1
+19-15 notactuallytreyanastasio/snake-python/main Mar 15 08:46
cc0105d Update from temper_snake bc2e9fd57ff0765930c54c5a8c0b6c14ad2c46a1
+22-15 notactuallytreyanastasio/snake-java/main Mar 15 08:46
073a11b Update from temper_snake bc2e9fd57ff0765930c54c5a8c0b6c14ad2c46a1
+23-15 notactuallytreyanastasio/snake-csharp/main Mar 15 08:46
d11e917 Update from temper_snake bc2e9fd57ff0765930c54c5a8c0b6c14ad2c46a1
+12-5 notactuallytreyanastasio/temper_snake/main Mar 15 08:44
26476b9 docs: final README polish - fix build commands, controls, summary - Build command: gradlew installDist (not cli:build) - Show all 6 backend build commands - Controls: no Enter needed (raw mode) - Summary: updated file/line counts to include follow-up fixes Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+92-14 notactuallytreyanastasio/temper_snake/main Mar 15 08:42
bc2e9fd feat: add backend-specific compiler change details to child repo READMEs Each of the 6 published repos now explains exactly what had to change in the Temper compiler to make that backend work: - JS: auto-connected pattern, setTimeout + process.stdin raw mode - Python: ThreadPoolExecutor futures, tty/termios raw mode - Lua: cooperative coroutine scheduler, non-blocking IO polling - Rust: cross-crate FunctionCall paths, dependency detection fix - C#: native async/await, net8.0 framework, namespace fixes - Java: CompletableFuture + ForkJoinPool, timeout fix, stty raw mode Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+161-33 notactuallytreyanastasio/snake-lua/main Mar 15 08:29
d3109c1 Update from temper_snake d27a2fddc11e33daafd386ab9534e4084cb1d29b
+26-17 notactuallytreyanastasio/snake-csharp/main Mar 15 08:29
38abb24 Update from temper_snake d27a2fddc11e33daafd386ab9534e4084cb1d29b
+23-7 notactuallytreyanastasio/snake-python/main Mar 15 08:29
fcf2847 Update from temper_snake d27a2fddc11e33daafd386ab9534e4084cb1d29b
+67-12 notactuallytreyanastasio/snake-rust/main Mar 15 08:29
6180b3b Update from temper_snake d27a2fddc11e33daafd386ab9534e4084cb1d29b
+33-12 notactuallytreyanastasio/snake-java/main Mar 15 08:29
a2fe4a9 Update from temper_snake d27a2fddc11e33daafd386ab9534e4084cb1d29b
+30-14 notactuallytreyanastasio/snake-js/main Mar 15 08:29
1ce066c Update from temper_snake d27a2fddc11e33daafd386ab9534e4084cb1d29b
+19-3 notactuallytreyanastasio/temper_snake/main Mar 15 08:26
d27a2fd fix: update CI workflow with correct run commands for all backends - Python: add std to PYTHONPATH, update prereqs to 3.11+ - Java: add run.sh script (installs local Maven deps then runs) - Java run_cmd in README now points to run.sh instead of incomplete mvn command Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+9-71 notactuallytreyanastasio/snake-python/main Mar 15 08:11
79b8b32 Update from temper_snake 607863589efbf618cd4d0b2bf09037a93358517f
+9-90 notactuallytreyanastasio/snake-csharp/main Mar 15 08:11
ec41f3a Update from temper_snake 607863589efbf618cd4d0b2bf09037a93358517f
+9-70 notactuallytreyanastasio/snake-lua/main Mar 15 08:11
d685074 Update from temper_snake 607863589efbf618cd4d0b2bf09037a93358517f
+22-95 notactuallytreyanastasio/snake-js/main Mar 15 08:11
ad1ddd1 Update from temper_snake 607863589efbf618cd4d0b2bf09037a93358517f
+9-101 notactuallytreyanastasio/snake-rust/main Mar 15 08:11
724eca8 Update from temper_snake 607863589efbf618cd4d0b2bf09037a93358517f
+9-88 notactuallytreyanastasio/snake-java/main Mar 15 08:11
ea8dce6 Update from temper_snake 607863589efbf618cd4d0b2bf09037a93358517f
+400-51 temperlang/temper/do-crimes-to-play-snake Mar 15 08:08
4e085e3 fix: make all 6 backends run the snake game correctly Lua: - Replace temper.TODO stub with cooperative coroutine scheduler - async {} now compiles to temper.async_launch() (was "TODO") - LuaTranslator emits temper.run_scheduler() after top-level code - Non-blocking IO: sleep uses deadline-based promises, readLine uses stty min 0 time 0 for polling - Round-robin scheduler drives multiple async blocks cooperatively Rust: - Fix missing temper-std dependency in generated Cargo.toml - Connected functions (stdSleep, stdReadLine) reference temper_std:: paths but bypassed the import-based dependency scan - RustTranslator now tracks usedSupportFunctionPaths - RustBackend scans these after translation to inject temper-std dep with correct features - Also fixes missing temper_std::init() in generated lib.rs - Add raw terminal mode for single-keypress input Java: - Fix waitUntilTasksComplete() 10-second hard timeout - Now loops until ForkJoinPool is truly quiescent - Add raw terminal mode via stty for single-keypress input C#: - Update target framework from net6.0 to net8.0 (current LTS) - Namespace-qualify OrderedDictionary and AsReadOnly in RegexSupport.cs to avoid conflicts with System.Collections.Generic.OrderedDictionary introduced in .NET 9+ - Add single-keypress input via Console.ReadKey Python: - Add raw terminal mode for single-keypress input via tty/termios Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ca3191c test: add functional test for `std/io` `sleep()` across backends Adds `control-flow/io-sleep/io-sleep.temper.md` to the functional test suite, verifying that `sleep()` from `std/io` works correctly: - Sleep returns and execution continues after `await` - Multiple sequential sleeps work - Zero-ms sleep resolves immediately - Sleep interleaved with computation produces correct results Uses short delays (5-10ms) to avoid slowing the test suite. Passes on: JS, Python, Lua, Java 17, C#. Skipped on Rust (`@Ignore`) because the Rust functional test infrastructure only links `temper-core`, not `temper-std`, so `import("std/io")` produces an unresolved crate at cargo build time. The Rust `sleep` implementation itself works (verified manually via the snake game with `cargo run`). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+455-39 notactuallytreyanastasio/temper_snake/main Mar 15 08:07
6078635 docs: update README with all 6 backend fixes and run commands - Lua: document cooperative coroutine scheduler replacing temper.TODO stub - Rust: document connected function dependency detection fix - Java: document waitUntilTasksComplete timeout fix - C#: document net8.0 target framework and OrderedDictionary namespace fix - Add run commands for all 6 backends (was missing Python, C#, Java) - Add prerequisites for all backends Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+100-8 notactuallytreyanastasio/snake-rust/main Mar 15 06:28
8356001 docs: add detailed compiler modification context for Rust backend Explains what was changed in the Temper compiler (commit 0f31c89) to make this game possible — RustSupportNetwork.kt, RustBackend.kt, and std/io/support.rs with thread::sleep + PromiseBuilder pattern. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+89-8 notactuallytreyanastasio/snake-csharp/main Mar 15 06:28
644acf8 docs: add detailed compiler modification context for C# backend Explains what was changed in the Temper compiler (commit 0f31c89) to make this game possible — StandardNames.kt, CSharpSupportNetwork.kt, CSharpBackend.kt, and std/Io/IoSupport.cs with native async Task.Delay. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+70-8 notactuallytreyanastasio/snake-python/main Mar 15 06:28
e647da7 docs: add detailed compiler modification context for Python backend Explains what was changed in the Temper compiler (commit 0f31c89) to make this game possible — PySupportNetwork.kt and temper_core/__init__.py with ThreadPoolExecutor-based sleep and Future-based readLine. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+69-8 notactuallytreyanastasio/snake-lua/main Mar 15 06:28
212eed0 docs: add detailed compiler modification context for Lua backend Explains what was changed in the Temper compiler (commit 0f31c89) to make this game possible — temper-core/init.lua with synchronous blocking sleep, temper.TODO() async stub, and make_resolved() pattern for await translation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+82-9 notactuallytreyanastasio/snake-js/main Mar 15 06:28
75a4c9d docs: add detailed compiler modification context for JavaScript backend Explains what was changed in the Temper compiler (commit 0f31c89) to make this game possible — JsSupportNetwork.kt, JsBackend.kt, and temper-core/io.js with setTimeout-based sleep and raw mode stdin readLine. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+87-8 notactuallytreyanastasio/snake-java/main Mar 15 06:28
389ab33 docs: add detailed compiler modification context for Java backend Explains what was changed in the Temper compiler (commit 0f31c89) to make this game possible — StandardNames.kt, JavaSupportNetwork.kt, and Core.java with ForkJoinPool Thread.sleep + CompletableFuture. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+14-14 notactuallytreyanastasio/snake-js/main Mar 15 06:13
963db3d Update from temper_snake 8d15eff257d06df8969d197fa1b6d6d36da346ca
+222-1 notactuallytreyanastasio/temper_snake/main Mar 15 05:59
72c63eb feat: CI pipeline to build and publish snake to 6 language repos GitHub Actions workflow that: - Builds Temper compiler from do-crimes-to-play-snake branch - Compiles snake game for JS, Python, Lua, Rust, C#, Java - Runs 18 tests - Publishes compiled output to 6 child repos via SSH deploy keys Child repos: snake-js, snake-python, snake-lua, snake-rust, snake-csharp, snake-java Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+35-8 notactuallytreyanastasio/temper_snake/main Mar 15 05:49
0e8f644 get the build right
+134-0 notactuallytreyanastasio/temper_snake/main Mar 15 05:46
9670598 tell a story
+62-0 notactuallytreyanastasio/temper_snake/main Mar 15 05:41
c8c27ab docs: add KNOWN_ISSUES.md for Rust backend dep resolution bug Documents the temper-std missing dependency issue when multi-module projects import from std/io in a secondary module. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+208-162 notactuallytreyanastasio/temper_snake/main Mar 15 05:30
9218db1 feat: real-time keyboard input via two async blocks Split into 3 pure Temper modules: - src/ (snake library): pure game logic, types, render, PRNG - game/ (snake-game runner): two async blocks for stdin input + game loop - test/ (snake-test): 18 tests, separated to avoid readLine blocking Game uses w/a/s/d + Enter for direction control. Input loop and game loop cooperate via shared mutable direction variable. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+23-5 notactuallytreyanastasio/alloy/main Mar 14 11:51
38e266a Fix native test detection: install pytest, use pipefail Two bugs prevented Python test failures from being caught: 1. pytest was never installed — pip only installed the ORM packages 2. pipe to tee swallowed exit codes — tee always succeeds, masking the actual test runner exit code Fixes: add `pip install pytest` before running tests, add `set -o pipefail` to all native test steps so failures propagate. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+118-34 notactuallytreyanastasio/alloy/main Mar 14 11:44
106f24a Run native runtime tests on generated code before publishing Test matrix now runs both `temper test -b <lang>` AND native tests (pytest, npm test, cargo test, etc.) against temper.out/<lang>/. Publish is gated on native test results. Issues auto-opened only when temper tests pass but native tests fail (codegen bug signal). Reverts notify-app-template to simple vendor push since all testing now happens in the top-level alloy repo. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+3-167 notactuallytreyanastasio/alloy-js/main Mar 14 11:22
176770f Update from alloy 8e45223e9a5f78ce5ce7569f6012d77711f3f03b
+3-167 notactuallytreyanastasio/alloy-csharp/main Mar 14 11:22
03e5369 Update from alloy 8e45223e9a5f78ce5ce7569f6012d77711f3f03b
+3-167 notactuallytreyanastasio/alloy-py/main Mar 14 11:22
60f013b Update from alloy 8e45223e9a5f78ce5ce7569f6012d77711f3f03b
+3-167 notactuallytreyanastasio/alloy-java/main Mar 14 11:22
9ba52d0 Update from alloy 8e45223e9a5f78ce5ce7569f6012d77711f3f03b
+3-167 notactuallytreyanastasio/alloy-rust/main Mar 14 11:22
a5945bb Update from alloy 8e45223e9a5f78ce5ce7569f6012d77711f3f03b
+0-118 notactuallytreyanastasio/alloy-java-app/main Mar 14 11:22
fb17652 Update ORM vendor from 9ba52d01dfa2abb7eba10010b27fce231c0f5fab
+3-167 notactuallytreyanastasio/alloy-lua/main Mar 14 11:22
f6b603f Update from alloy 8e45223e9a5f78ce5ce7569f6012d77711f3f03b
+0-467 notactuallytreyanastasio/alloy-rust-app/main Mar 14 11:22
8b8c7bf Update ORM vendor from a5945bb70e40676bc5bf06312084e8c4baf7fa69
+0-23497 notactuallytreyanastasio/alloy-js-app/main Mar 14 11:22
711a98e Update ORM vendor from 176770ff7b7231be3f3842a0bfee6e620c1076a3
+61-169 notactuallytreyanastasio/alloy/main Mar 14 11:16
8e45223 Add per-backend test gating with auto-issue on failure - New test matrix job: runs `temper test -b <lang>` for all 6 backends in parallel (js, py, rust, java, lua, csharp) - Publish job gated per-backend: only pushes to lib repo if that backend's tests passed, preventing broken code from cascading - Auto-opens GitHub issue with test output on failure, comments on existing issue if one is already open - Reverts notify-app-template to simple vendor push (testing moved upstream to avoid PAT requirement for cross-repo issue creation) - Build job uploads Temper compiler + ORM source as artifacts for test matrix consumption Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+167-3 notactuallytreyanastasio/alloy-java/main Mar 14 03:20
0add71b Update from alloy 92aa09f508b14fcd34bbc6b93f1bd900043dd774
+167-3 notactuallytreyanastasio/alloy-rust/main Mar 14 03:20
3d2c2c6 Update from alloy 92aa09f508b14fcd34bbc6b93f1bd900043dd774
+167-3 notactuallytreyanastasio/alloy-py/main Mar 14 03:20
bda2f0b Update from alloy 92aa09f508b14fcd34bbc6b93f1bd900043dd774
79 pushes github.com/notactuallytreyanastasio
phangraphs — Phish 3.0 Jam Analytics
phangraphs
Tweezer
.419
BATTING AVG
70 JC · 167× played
Avg 13.3m · Peak 43:37 · 🎧 150/167
Longest: 43:37
2023-04-17 · William Randolph Hearst Greek Theatre, University of California, Berkeley
Most Loved: 237 likes
2013-07-31 · Lake Tahoe Outdoor Arena at Harveys
📊 80% Set 2 · 65/70 JCs from Set 2
Last: 2025-09-19 (178d ago) · avg every 36d
Best year: 2021 — 7/7 JC
🔥 JC Streak: 2 in a row
""Theme from the Bottom" jam for a bit."
TAP TO SEE AND PLAY JAMS
Tweezer .419
TAP TO FLIP BACK
70 jams
2009-05-31 13:30
Fenway Park · Boston, MA
"Theme from the Bottom" jam for a bit.
2009-06-07 17:07
Susquehanna Bank Center · Camden, NJ
The "Camden Tweezer." Old school, repetitive, amazing groove. Like a '92-'94 version.
2009-06-19 12:44
Verizon Wireless Music Center · Noblesville, IN
A very good jam eventually segues into a spacey interlude before "2001" kicks in.
2009-07-31 12:25
Red Rocks Amphitheatre · Morrison, CO
Diverse, tight, melodic jams.
2009-11-25 12:30
Wachovia Center · Philadelphia, PA
Similar to Camden's "Tweezer."
2009-12-29 16:34
American Airlines Arena · Miami, FL
"Manteca"-like jam into space.
2010-07-03 13:11
Verizon Wireless Amphitheatre at Encore Park · Alpharetta, GA
Reaches a pretty good peak and segues beautifully into "Slave."
2010-12-30 18:14
Madison Square Garden · New York, NY
Kind of a mixed bag until this spell-bindingly intricate, spectacular "staccato-esque" improvisation takes over.
2011-07-02 11:06
Watkins Glen International · Watkins Glen, NY
Unusually staccato-esque, repetitive jam, with some "elephant-like" noises from Trey thrown in.
2011-08-06 12:14
Gorge Amphitheatre · George, WA
Blistering jam, in part, largely Mike-driven, that segues into some serene spacey jamming, that in turn goes into "Caspian" and "Sand" before "Tweezer" returns for a minute.
2011-08-12 11:14
Polo Fields, Golden Gate Park · San Francisco, CA
Very well-played, with an excellent peak, and Page grooving on the clavinet as the jam goes spacey.
2011-09-03 14:21
Dick's Sporting Goods Park · Commerce City, CO
"Green-Eyed Lady" teases in the intro composed section by Page, and Fish teases the "Golden Age" drum line in what is a magnificently melodic jam that is quite stunning in parts. Brief hints of "Lovelight" and "Jessica." It's excellent from the very start of the jam, too. Must. Fucking. Hear.
2011-12-28 12:39
Madison Square Garden · New York, NY
Segues nicely out of "Carini" and features a tight, melodic, soulful jam that dissolves beautifully into "My Friend."
2012-08-26 13:17
Verizon Wireless Amphitheatre - Charlotte · Charlotte, NC
Enchanting, even stunningly beautiful, jam to which each band member contributes powerfully. (Listen carefully for Mike's tease of "Cars Trucks Buses" as well.)
2012-12-28 20:09
Madison Square Garden · New York, NY
A mesmerizingly incandescent psychedelicious soundscape of elephantine proportion.
2013-07-12 12:31
Nikon at Jones Beach Theater · Wantagh, NY
Page drives the jam into an outstanding peak in the final few minutes, and an excellent segue into "Cities" occurs with Fish playing the rhythm of the "Wedge."
2013-07-31 36:16
Lake Tahoe Outdoor Arena at Harveys · Stateline, NV
One of the most magnificently focused, sustained, and enchanting improvisations in Phish history, with several discrete sections, and audience participation taboot.
2013-10-20 23:46
Hampton Coliseum · Hampton, VA
Exceptional, diverse "type II" action, ending in a mellow, spacey haze.
2013-10-27 17:29
XL Center · Hartford, CT
Overrated by your friends, this version captivates with brilliantly melodic soloing by Trey for several minutes, before flaking out a bit, and becoming aimless. (Still worth your while to hear to be sure.)
2013-11-02 15:23
Boardwalk Hall · Atlantic City, NJ
Very repetitive, melodic, spirited, funky jam... check. this. OUT!
2014-07-13 16:00
Randall's Island · New York, NY
Slow, steady, melodic climb to a triumphant peak, and then an old school ending with a few twists.
2014-07-27 4:27
Merriweather Post Pavilion · Columbia, MD
Acting as the improvisational meat of a "Tweezer-fest", the jamming here takes on an uplifting, "TFTB"-esque vibe and then gets wonky and atonal before sliding into "Waiting All Night".
2014-12-31 17:07
American Airlines Arena · Miami, FL
Beautifully-interactive melodic jam that soars for quite awhile!
2015-08-01 26:01
Aaron's Amphitheatre at Lakewood · Atlanta, GA
The longest version since Tahoe is gorgeous, in part, but does meh-ander now and then, despite a section where Trey repeats a "Born On The Bayou"-esque riff, and despite the final few minutes where the jam picks up momentum before petering-out with a loop'ed noise from Trey's guitar.
2015-08-07 19:17
Blossom Music Center · Cuyahoga Falls, OH
Spectacular improvisation that traverses titillating terrain before mellifluously mellowing into "Lizards."
2015-08-09 14:17
Alpine Valley Music Theatre · East Troy, WI
Textural, repetitive improv eventually morphs into major key bliss, as Trey repeats a catchy melodic theme and the band reach a glorious peak before the jam dissolves into Dirt.
2015-08-22 17:36
Watkins Glen International · Watkins Glen, NY
Fierce, punchy version that soars from the get-go, with Trey employing killer effects. The jam then plateaus, and then launches into melodic, major key mode for a while before dissolving into Caspian.
2016-01-02 22:26
Madison Square Garden · New York, NY
With thrilling, melodic contributions from each band member, this version requires repeated listenings to fully appreciate, and peaks wondrously well.
2016-09-02 16:57
Dick's Sporting Goods Park · Commerce City, CO
Great intro with Trey using a wah pedal to create a cool swelling effect and the jam builds to a coordinated peak with piercing guitar and pounding drums before > to "Jim".
2016-10-19 16:47
Ascend Amphitheater · Nashville, TN
Funky, powerful start transitions to a melodic plateau with soaring improv.
2016-12-30 16:40
Madison Square Garden · New York, NY
The jam slowly, patiently builds before (similar to 10/19/16) plateauing mellifluously, exploding triumphantly, and seguing into "Sparks" (after Trey arguably teases "Midnight Rider" for a measure or two!).
2017-12-30 19:31
Madison Square Garden · New York, NY
Key modulates a few mins into the jam, and a bright, effortlessly soaring groove transpires. Excellent interplay by the band as well, including as the jam mightily peaks before they return to the theme and conclude it old school.
2018-08-03 16:26
Verizon Wireless Amphitheatre at Encore Park · Alpharetta, GA
Effect-heavy improv with layers of sounds eventually climbs, and builds, soaring to a blissful, thematic peak before grooving to an albeit brief return to the "Tweezer" theme.
2018-09-02 14:27
Dick's Sporting Goods Park · Commerce City, CO
An atypical (very improvisational) intro that heads into the jam segment about a minute early is just the start of a melodically-blessed version in which each band member is inspired and contributes mightily to a stellar version with heavy Manteca teases into Golden Age.
2018-10-20 18:40
Hampton Coliseum · Hampton, VA
Punchy from the start, this version cooks for several minutes before a major-key improvisation occurs, in which Trey hoses everyone down mellifluously. The jam then segues smoothly into a spacey, divinely-melodic interlude, and a patient, steady build transpires, eventually reaching a spectacular peak. The improv then dramatically melts down, but instead of concluding, the jam surprisingly shoots skyward to a second powerful-but-fleeting peak, before "Dirt" abruptly begins.
2018-10-26 20:13
Allstate Arena · Rosemont, IL
The band, like one organism, seemingly processes varying properties of a periodic waveform, or signals that contain vital information, to be shared with some other, astral, life forms. Trey shines, but all four clearly articulate, or inform the several structures, or forms of this "Tweezer's" many "pieces," which, so sutured, create a sonic sort of euphoria (the audience reactions are truly memorable).
2018-12-29 19:52
Madison Square Garden · New York, NY
First section features an extended, fiery jam that is akin to "I Know You Rider" (Grateful Dead) before funkily dissolving into "Death Don't Hurt Very Long."
2018-12-29 7:36
Madison Square Garden · New York, NY
Second section is melodic, patient, and mystical, and includes a smooth transition to "No Quarter."
2019-12-30 2:26
Madison Square Garden · New York, NY
Punches out of "Steam" and soars triumphantly, hearkening back to the peak of the set's opening version, before seguing into "Ruby Waves."
2019-12-30 35:33
Madison Square Garden · New York, NY
Symphonic in scope, this version features a host of strikingly disparate sections with tempo and key and harmonic and melodic changes galore. Inarguably among the most sublime masterpieces of improvisation in Phish's illustrious history.
2021-08-01 33:50
Ameris Bank Amphitheatre · Alpharetta, GA
Among the most magnificent versions in Phish history, this one's improvisation traverses a host of gloriously bedazzling galaxies that are, at times, as mind-expandingly thrilling as they are soulful and divine.
2021-08-13 22:22
Atlantic City Beach · Atlantic City, NJ
Soulful, soaring soloing by Trey with fierce accompaniment, this second-set-opening version arguably stays "Type I" but still delivers. Oh, if every 20 min version could pay off like this.
2021-09-01 34:00
Shoreline Amphitheatre · Mountain View, CA
Yet another exploratory "type II" adventure, this version's jam goes all over the globe, with segments that at times seem to have vigorous "Manteca" and "Jingo-Va" themes, and even "Lizards" and "Dave's Energy Guide" teasing and a cacphonous "Split Open and Melt" jam, that are separated by a mellow, spacey-but-mellifluous and playful, improvisation. Best listened to, closely, with headphones.
2021-10-24 6:16
The Forum · Inglewood, CA
It's not every day that Tweezer features a full-blown jam on another song, so this version gets charted simply for its uniqueness, segueing into "L.A. Woman" only about eight measures after the start of the jam segment (don't miss the tease of "Walk This Way" at the end of the composed opening section too).
2021-10-24 7:21
The Forum · Inglewood, CA
This version (which completes formation of this set's Tweezer "sandwich") begins the way any other version would though launches quickly into a jam that grooves along for a few minutes, jazziliciously yet with some melodic loops, before dissolving into a mellifluous haze, a serene code from which Birds erupts.
2021-10-29 19:34
MGM Grand Garden Arena · Las Vegas, NV
After beginning ordinarily enough, the jam eventually takes-on a Trey-led melodic theme reminiscent of "hose" improvisation, yet the "type I" form is maintained in a compellingly fierce manner. This theme-jam takes over four minutes to begin peaking, soaring, in a dizzyingly beautiful fashion, and then Trey turns on the syrupy envelope-filter effect, and Mike begins playing lead fucking bass, with fantastic accompaniment from Page, who then begins soloing a bit over this incredible groove being laid down by Mike, Trey and Fish around 16 mins in. Spine-tinglingly cool, repetitive, grooving takes over, and Trey begins soloing melodically o'er it before Fish returns to Tweezer's drum line, and the jam dissolves away as Trey nearly teases "Lifeboy" before Bitch begins. It's a safe bet that if this sick improv doesn't move you, then 4.0 Phish is not for you.
2021-10-29 3:59
MGM Grand Garden Arena · Las Vegas, NV
After Sand peaks and "goes type II," Trey leads the full-band back into Tweezer at 11:53 of the Sand (LivePhish timing; fwiw the fact that this isn't tracked on LivePhish explains why Phish.net does not rely on LP tracking for setlist purposes---it can be demonstrably, objectively, Wrong). This renewed Tweezer jam cooks for many minutes before the key modulates in "type II" fashion and the groove melodically soars anew, with a wondrously smooth segue into Sigma Oasis.
2022-02-24 21:37
Moon Palace · Quintana Roo, Cancun, Mexico
It's no wonder that a version that explores a variety of fantastic universes includes soaring improv heavily teasing "Lizards" for a spell.
2022-04-21 13:58
Madison Square Garden · New York, NY
Although "average-lengthed" among all versions e'er performed, this gem-of-a-version shines, with the first few minutes of the jam featuring steady, intermittent, "Your Pet Cat"-esque chording and comping by Trey, and a melodically charming/glittering section during which Trey sustains a note for many measures (a modest peak) over excellent accompaniment (that's never dark), before the version concludes atypically with a single chord from Trey that is sustained into the first note > of "2001."
2022-04-21 1:43
Madison Square Garden · New York, NY
Your Pet "Tweezer" returns, buzzing, if not quite purring, for a few more minutes.
2022-05-29 22:13
The Wharf Amphitheater · Orange Beach, AL, US
Jam is fairly straightforward for the first few minutes, but then there's a key modulation (type II activity afoot) and a funkaliciously melodic bridge of sorts occurs, before Page hops on the synth and Trey deploys some echoflex and then envelope filter effects. Soon melodic tension builds--slllowwwly though--courtesy of Page Mike and Trey, until there's a massive Floyd-esque echoplextastic dissonant sustained release/peak, of sorts. OF SORTS. Make no mistake: communities of ALIENS were contacted during this jam.
2022-07-31 18:50
Merriweather Post Pavilion · Columbia, MD
Straightforward jam until 9:15, when the key modulates and an "All Along The Watchtower"-esque progression takes shape (an ajamakinto "Watchtower," but no musical quote of its melody so no tease). They jam on this "Watchtower" progression for many measures, going "type II" to an extent in the process though Fish returns briefly within it here and there to "Tweezer's" drum line. Then there's another key modulation and Trey begins soloing melodically o'ertop beautiful accompaniment from Page, Mike and Fish. This improv eventually gels around an enchanting theme before the key modulates yet again and a steady, dark, heavy "type II" jam ensues. Fish soon brings back "Tweezer's" drum line, and Trey Mike and Fish briefly to "Tweezer's" melodic line and comping, as this jam fizzles out and "Wingsuit" begins after sustain.
2023-04-17 43:37
William Randolph Hearst Greek Theatre, University of California, Berkeley · Berkeley, CA
Continuing along its 30 year trajectory of functioning as a great excuse to jam, the Greek Tweezer is another historic version that not only overflows with ideas in showcasing the band's commitment to excellence, but also swells and soars with (at times) wonderfully weird improvisation, brimming with dynamic reverence for proximity to the burning shore.
2023-07-15 29:14
Ameris Bank Amphitheatre · Alpharetta, GA
Phish's 2023 "Tweezer" rampage continues with yet another monster version from Alpharetta. Stutter-step delay grooves, kaleidoscopic psych-bliss, and big-boned muscular funk form this delightfully hearty stew before a heroic, guitar-laden hard rock strut brings it all home. ->"Golden Age".
2023-07-23 27:32
St. Joseph's Health Amphitheater at Lakeview · Syracuse, NY
Begins with a brief major tangent but then reverts to a typically rocking "Tweezer" jam, albeit in a different key, then finds its footing again with a segment anchored by Trey's off-kilter, cyclical lead. From there, it builds more conventionally until the main riff returns, seemingly to bring things to a close, but the band really makes a meal out of this denouement by running through different permutations of the "Tweezer" theme, reintroducing Trey's mid-jam riff, and closing with a Moog-ified final volley, then -> "Oblivion".
2023-08-05 5:19
Madison Square Garden · New York, NY
Opening composed section and early part of the jam segment before Mike begins "Guy Forget."
2023-08-05 0:46
Madison Square Garden · New York, NY
"Type II" improv continues after the "Guy Forget" silliness ends, sounding absolutely nothing like "Tweezer" for several minutes (and then only Fish temporarily returns to "Tweezer's" drum line for a few measures). Collective "full-band" improv at its finest, with each band member complementing each other so well the improv at times sounds like it could have been composed, even as it soars through several key modulations and time signatures. Yet another masterful version, providing further evidence that "Tweezer" is Phish's most consistently wondrous jam-vehicle since 2009.
2023-10-13 15:55
United Center · Chicago, IL
> from "Waves". In a rare spot as the third song in the second set, this (relatively) compact version packs a big punch. The band locks into the jam quickly and seamlessly. Around 11:20, Trey weaves back to the Tweezer riff, giving off this version might be incredibly compact. Instead, he pivots on a dime to a life-affirming major key jam. > into a fierce "Crosseyed".
2024-04-18 25:22
Sphere · Las Vegas, NV
> from "Sand." As if the band wasn't going to drop a huge version of "Tweezer" at the Sphere. A fun and bouncy jam becomes triumphant around 17:00 with an incendiary Trey peak. Immediately afterward, things slow down and the "Tweezer" riff emerges. What follows is must-hear as the band has an extended outro, staying within the bounds of "Tweezer" until it has been fully deconstructed. The deconstruction eventually -> into "My Friend, My Friend."
2024-07-30 41:06
Chaifetz Arena, Saint Louis University · St. Louis, MO
Another massive entry in the (almost) 40 min club spends ample time mining deep crevices, discovering diverse bits of melodic beauty, and exploring riff laden spaces, before Trey and the band finally lock onto an ecstatic progression that takes the band through a series of peaks so gorgeous and gratuitous, the stunned crowd responds with a full minute and a half of ravenous applause
2024-08-09 24:08
Bethel Woods Center for the Arts · Bethel, NY
Like a labyrinthine Hall of Mirrors, this "Tweezer" shifts through several moods and themes in impressionistic fashion. Fishman's cerebral, yet grounded grooving keeps the ship afloat as the band modulates between locked-in funk, abrasive dissonance, nearly rudderless psychedelia and finally a super catchy, Allman Brothers-inflected country rock section that turns anthemic. This then resolves back to the "Tweezer" theme and > a powerful "Pillow Jets".
2024-08-09 2:49
Bethel Woods Center for the Arts · Bethel, NY
-> from "Pillow Jets," Trey and Fish work their way into a snappy, musical and inventive "Tweezer" segment featuring rather cool contributions from Mike and Page. Fish is just fantastic and clearly having a blast, while Trey does his thing. A bit by way of noise drops; Trey strums; and the band -> into just what you'd want: "Piper." // Part "Piper" and "song-"outro, a return to the iconic "Tweezer" riff unquestionably caps this incendiary Summer 24 segment.
2024-08-17 19:30
The Woodlands · Dover, DE
The second of a potent 1-2-3 punch, this "Tweezer" initially stews in layered psychedelic funk fitting for its festival setting, before shifting towards eruptive, celebratory rock. Mike's seismic bass bombs provide a platform for Trey's pumped-up blues rock heroics, before a return to the "Tweezer" theme signals a denouement, dissolving into scratchy guitar loops and > "Scents and Subtle Sounds".
2025-04-23 30:35
Bill Graham Civic Auditorium · San Francisco, CA
In contrast to some of the other monsters of recent years, this version stays tethered to "Tweezer" (or something close to it) for an extended period before it gradually peels away, but even while the jam remains within arm's reach of home, the play is fresh and engaging. From there the band embarks on an adventurous journey marked by constant evolution which flows remarkably well, making every new section feel like an organic extension of the same piece, all without relying on any of the well-worn paths one might expect a jam of this length to indulge in. And while this dynamic does not lend itself to a singular peak, the jam is ripe with recurring motifs and themes despite its freewheeling nature, perhaps culminating around 24:30 with Trey's long sustained note over a "MLB"-esque descent. > "Lonely Trip" to end this exhilarating ride.
2025-06-22 21:06
SNHU Arena · Manchester, NH
The first leg of a three-part "Tweezer" begins with a playful, bouncy groove buoyed by chunky bass and chugs along in an easy-going manner until briefly slowing as it transitions back to minor for more typical "Tweezer" riffing. After 12:45 the jamming steadily gains traction with a new direction as an excellent rocking theme is developed and driven home with great aplomb until it dissolves > "Mercury".
2025-06-22 7:44
SNHU Arena · Manchester, NH
> from a strong "Mercury" as the second leg of a three-part "Tweezer" bonanza. This section is largely "Type I" but with plenty of synthy flourishes and adds in a splash of ambience in the finals minutes before > "Pillow Jets".
2025-06-22 13:05
SNHU Arena · Manchester, NH
Slowly emerges > from "Pillow Jets" for the third and final time in a "Tweezer"-dominated set, and is quickly reduced to an eerie hush. Creepy effects are gradually added to the mix as the off-kilter energy builds until eventually Fish kicks back in and the riff returns to usher in a climactic finale, after which it dwindles in the old-fashioned way to put a capper on a collective 42 minutes of "Tweezer" action.
2025-07-13 29:47
North Charleston Coliseum · North Charleston, SC
Leaves the station after a bit of funk, coalescing around a spacey synth section over which Trey solos melodically. The jam then seems poised to return home at 15:00, but relaunches with more rugged riffing before eventually closing strongly with a celebratory peak and the reemergence of the "Tweezer" riff which unravels -> "Ghost".
2025-09-19 27:58
Hampton Coliseum · Hampton, VA
More than anything, this jam is defined by the wall of loops Trey builds from around 11-16min wherein the band executes one of the most unique peaks of the year. It's dimly lit as Mike roots everything through ominous playing, but the combo of wild loops and synths on top gives the impression of contained madness akin to the HAL 9000 systematically betraying the Discovery One. Moving from the peak of the jam, the back half is fairly standard in nature but accentuated by each member giving it their all. Perhaps not the most transgressive music you've heard from The Phish From Vermont, but the A for Effort is real here. Closing with a shreddy, psychedelic, 2.0 style peak, we return to the "Tweezer" riff on a high before fading > into a perfectly placed "Ruby Waves."
2025-09-19 5:05
Hampton Coliseum · Hampton, VA
Returns > from "NMINML" with plucky synth-funk which transitions to a more calming, upbeat vibe before concluding > "Waste".
phangraphs Phish 3.0 Jam Analytics
AIM Chat - Terminal
Online (0)
jeff 02:52 AM
What is up y'all
jeff 03:44 AM
Thanks for visiting my website
jeff 03:51 AM
Trying from mobile let’s see what’s up
Uechi Nerd 03:54 AM
Hi, greetings from Planet Crackpot!
jeff 03:55 AM
oh man what's up
jeff 03:56 AM
Hey everyone
Uechi Nerd 03:56 AM
winding down with a beer or three
Uechi Nerd 03:57 AM
desktop version
Uechi Nerd 04:01 AM
Disappointed that War does not lead to actual combined-arms conflict.
jeff 04:01 AM
that would be hard to conjure
jeff 04:02 AM
I am so excited that this works and is a successful combination of windows and old apple lol
Uechi Nerd 04:02 AM
Probably for the best, actually. That shit is very very messy.
Uechi Nerd 04:02 AM
I am intrigued and happy it works!
Uechi Nerd 04:03 AM
I respect the wizardry.
Visitor7804 04:05 AM
this is delightful.
jeff 04:06 AM
hell yeah visitor 7804, this is livin' brother
guy4get 04:07 AM
i've never felt so alive
EarlofVincent 04:09 AM
Commencing experiment in 3....2....
jeff 04:14 AM
1
leah 04:16 AM
hi!
leah 04:16 AM
this is lovely
jeff 04:21 AM
hi! lol I was just like what if I combined Mac and windows and added a flower tree of life and called it my homepage and then smoked some weed and made it happen in an empty mall in Connecticut
B. Droptables 10:51 AM
Always cool to play with your toys.
Visitor1128 08:47 AM
yo!
Visitor1128 08:48 AM
i can barely work my phone. what am i doing here?
jeff 09:04 AM
the phone is not optimized yet but it "kind of works" I am sorry lol
jeff 09:04 AM
you have to pick a username, then it goes to the chat, then if you hit the bottom tabs it'll let you go to the app sections.
Bobdawg 04:43 AM
Hi everybody this is my blog I hope you enjoy it I did some more changes and anyone can write a post here now for me.
dinkleberg 01:45 AM
ALL HAIL TREE OF LIFE
jeff 08:55 PM
hi Hacker News
jeff 04:28 PM
hey there I am not really Jeff
Mal Function 05:34 PM
Hey! Please reveal... how exactly do I actually use losselot on my Mac? I've run the git clone commend in Terminal.app and seem successfully to have installed into a new <losselot> sub-folder in my home folder but now???