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
+135-9 notactuallytreyanastasio/blog/main May 27 14:20
a6a91c8 make it friendlier for HN
+968-6 notactuallytreyanastasio/blog/main May 27 13:48
0cc12f9 add some flair to 2048 page
78919ce 2048 blitz edition
+1047-12 notactuallytreyanastasio/bobs_broadcast/main May 25 02:57
e8c45f5 tutorial rewrite/simplification
3137020 finalize tutorial rewrite
+3450-244 notactuallytreyanastasio/archive_classifier/main May 22 17:24
989dd16 feat: play button auto-advances frames every 3 seconds ▶ starts playback from current position, ⏸ pauses. Auto-scrolls transcript to keep active segment visible. Loops back to start at end. Manual slider interaction stops playback. Co-Authored-By: Alpha <alpha@alphafornow.com>
c205871 fix: Classify button fires pipeline in background Task - Clicking Classify now actually starts the transcription pipeline - Runs in a background Task so LiveView stays responsive - Flash message confirms transcription started - Dev logs include timestamps for ML timing visibility Co-Authored-By: Alpha <alpha@alphafornow.com>
3e74793 fix: invert text color on all children when segment is highlighted The timestamp badge and text span had their own color styles overriding the parent. Now sets color on all children. Co-Authored-By: Alpha <alpha@alphafornow.com>
ab96055 feat: cache thumbnails in Postgres + serve from ETS - thumbnail binary column on videos table (~7KB each, ~9.5MB total) - mix fetch_thumbnails: bulk fetch from archive.org (10 concurrent) - ThumbnailController serves from ETS cache at /thumbnails/:id - Falls back to archive.org redirect if not cached - LiveView and SearchLive now use local thumbnail endpoint - Cache-Control: 1 day on served thumbnails Co-Authored-By: Alpha <alpha@alphafornow.com>
79b1315 feat: dedup consecutive identical transcript segments Whisper loops on the same phrase for many 2-second windows. Dedup.merge_consecutive/1 collapses runs into single segments with the full time range (e.g., 0:46 - 1:14: "I'm sorry"). Applied at both storage time (pipeline) and display time (LiveView). 6 dedup tests. 60 tests total. Co-Authored-By: Alpha <alpha@alphafornow.com>
ced409b perf: enable EXLA persistent cache for compiled graphs Without this, the Whisper compute graph gets JIT-recompiled from scratch on every server restart (~4 minutes). With cache_dir set, compiled graphs persist to disk and reload in seconds. Co-Authored-By: Alpha <alpha@alphafornow.com>
a022d12 fix: increase download timeouts and add retry config connect_timeout: 2 min, receive_timeout: 30 min, retry: transient, max_retries: 3. Archive.org can be slow under concurrent requests. Co-Authored-By: Alpha <alpha@alphafornow.com>
8f48610 fix: preserve ANSI colors in bin/server via script -q Co-Authored-By: Alpha <alpha@alphafornow.com>
ae9656c make website work as a v1 release that has some videos transcribed and working pipes
d125a60 chore: upgrade to whisper-medium, delete whisper-small cache whisper-small had poor segment timestamps on longer videos. whisper-medium (3GB) should produce more accurate timing. Cleared 932MB whisper-small cache. Co-Authored-By: Alpha <alpha@alphafornow.com>
84b92cb feat: filmstrip timeline with hover-to-read transcript - VideoFrame schema: stores JPEG frames at 10s intervals - Media.Frames: FFmpeg frame extraction (TODO: migrate to Xav NIF) - Pipeline extracts frames alongside audio transcription - FrameController serves frames at /frames/:id (1 week cache) - TranscriptSearchLive: horizontal filmstrip with colocated JS hook Hover a frame → shows timestamp + transcript at that moment - Frame extraction is non-blocking: failure doesn't abort pipeline Co-Authored-By: Alpha <alpha@alphafornow.com>
c779dc5 fix: restore start_whisper: true in dev Co-Authored-By: Alpha <alpha@alphafornow.com>
ed6a32c feat: supervised transcription pipeline with bounded concurrency - Pipeline.Supervisor: houses Task.Supervisor + TranscriptionProducer - TranscriptionProducer: GenServer with queue, max 2 concurrent jobs - Task.Supervisor.async_nolink for crash isolation - Classify button enqueues via producer, not bare Task.start - Logs: enqueue, start (with active count), complete - Pipeline added to application supervision tree Co-Authored-By: Alpha <alpha@alphafornow.com>
ba4b2d8 fix: enable chunked transcription for long audio Added chunk_num_seconds: 30 to Whisper serving config. Without this, Bumblebee only processes the first 30 seconds and hallucinates/repeats for the rest. Now it properly chunks the audio and produces accurate timestamps across the full video. Co-Authored-By: Alpha <alpha@alphafornow.com>
155ea3e fix: frame scrub requires click+drag instead of hover mousemove was firing on every hover, causing the slider to follow the cursor without clicking. Now requires mousedown first. Fixes play button not responding (mouse events were interfering). Co-Authored-By: Alpha <alpha@alphafornow.com>
0bb9235 feat: live job queue viewer on admin page - Shows all Twerker jobs sorted by status (running → queued → failed → completed) - Color-coded rows: yellow=running, red=failed, green=completed - Shows elapsed time, attempt count, error snippets - Auto-refreshes every 5 seconds via handle_info timer Co-Authored-By: Alpha <alpha@alphafornow.com>
ea491c7 feat: end-to-end transcription pipeline verified - Fixed Whisper serving: pass file path, not binary content - Replaced FFmpeg CLI with Xav NIF bindings (FFmpeg 7.x) - Media.Audio module uses Xav for audio extraction - First successful transcription: "Interview with Older People Bowie Jagger Dancing" → 28 timestamped segments in Postgres - Pipeline: download → extract audio → Whisper → store → cleanup Co-Authored-By: Alpha <alpha@alphafornow.com>
11babf5 feat: full-text search across video metadata AND transcript content - tsvector columns + GIN indexes on videos and transcripts tables - Auto-maintained via Postgres triggers on insert/update - search_videos_fts/1: returns videos matching in title, description, OR spoken words - Cache.search now uses FTS for non-empty queries (ETS for empty) - Searching "sphinx" finds videos where someone SAID "sphinx" even if it's not in the title Co-Authored-By: Alpha <alpha@alphafornow.com>
0a5573f test: add 17 new tests + better pipeline logging New tests: - Video changeset (6): required fields, enum values, defaults - Cache (7): all_videos, search, get, stats, reload - Pipeline (4): hallucination filter logic (non-ASCII ratio, repeated words) Pipeline now logs [pipeline] prefix at each step: Starting, Downloading, Extracting audio, Sending to Whisper, Done 54 tests total, zero warnings. Co-Authored-By: Alpha <alpha@alphafornow.com>
4ae751e feat: admin dashboard for mass-enqueuing transcription jobs - AdminLive at /admin with composable filters: Duration range (MM:SS), collection, search, status - list_videos_filtered/1 with duration range support - enqueue_videos/1 mass-enqueues via Twerker - Live match count updates as filters change - Enqueue All button with count badge - Admin link in toolbar - Fixed test sandbox: Cache GenServer allowed in sandbox - 6 admin tests, 66 total Co-Authored-By: Alpha <alpha@alphafornow.com>
3c4ac48 chore: add timing logs to cache load and Whisper pipeline - Cache: batch ETS insert + log load time in ms - Whisper: log model loading time, transcription time, segment count - All timings visible in application logs at info level Co-Authored-By: Alpha <alpha@alphafornow.com>
03d5b46 fix: filter Whisper hallucinations from transcripts - Reject repeated non-ASCII character spam (Georgian, etc.) - Reject single punctuation / empty segments - Reject same-word-repeated-5-times hallucinations - Trim whitespace from all transcript text Note: whisper-small has poor segment timestamps on longer videos. Consider whisper-medium or chunked audio for better accuracy. Co-Authored-By: Alpha <alpha@alphafornow.com>
971a6a3 fix: remove invalid Req options (connect_timeout, pool_timeout) connect_timeout and pool_timeout are not valid Req options. This caused ALL 61 queued jobs to fail with ArgumentError. Removed both — Req/Finch defaults are sufficient. Co-Authored-By: Alpha <alpha@alphafornow.com>
749b061 fix: simplify deploy.sh — always build, no fragile heredoc nesting Co-Authored-By: Alpha <alpha@alphafornow.com>
8000919 feat: interactive video explorer with frame scrubbing - Frame viewer: hover to scrub through frames like a gif - Timeline slider: drag to any moment, frame + caption follow - Caption bar: shows spoken words at current timestamp - Transcript segments are clickable buttons → jump to that moment - Active segment highlighted in blue - Frame preloading for smooth scrubbing - Colocated .VideoExplorer JS hook handles all interactions - Dockerfile: compile before assets.deploy (colocated hooks need build artifacts) Co-Authored-By: Alpha <alpha@alphafornow.com>
f952adb feat: replace in-memory queue with Twerker persistent job runner - Twerker as path dep (../twerker) - twerker_jobs table for persistent queue (survives restarts) - Classify/Reclassify buttons use Twerker.enqueue/3 - Removed old Pipeline.TranscriptionProducer (replaced by Twerker) - Twerker PipelineSupervisor in app tree with 2 consumers - Disabled in test env (start_twerker: false) Co-Authored-By: Alpha <alpha@alphafornow.com>
5b47e93 feat: bin/server wrapper that tees logs to logs/server.log Enables unified log tailing from Alpha's bin/logs.sh Co-Authored-By: Alpha <alpha@alphafornow.com>
f437370 feat: repeatable dev-to-prod DB sync script scripts/sync-db-to-prod.sh: pg_dump → scp → pg_restore Idempotent, prints row counts on completion. Co-Authored-By: Alpha <alpha@alphafornow.com>
6c3e091 feat: add Reclassify button for classified/failed videos Clears old transcripts and frames, resets status, re-enqueues. Co-Authored-By: Alpha <alpha@alphafornow.com>
53df079 feat: "Transcribed only" checkbox on catalog, checked by default Filters to only show classified videos so users see what they can actually search transcripts for. Uncheck to see everything. Co-Authored-By: Alpha <alpha@alphafornow.com>
1b3e55d docs: thorough README covering setup, architecture, and conventions Co-Authored-By: Alpha <alpha@alphafornow.com>
05ddf00 feat: link classified videos to transcript viewer Co-Authored-By: Alpha <alpha@alphafornow.com>
0e4740a feat: per-video transcript viewer + URL state on search - TranscriptSearchLive at /videos/:id/transcript?q=<term> Per-video drill-down: shows all segments, filter by spoken words Timestamps, segment count, fully shareable URL - SearchLive at /search?q=<term> URL-driven state via handle_params + push_patch Works from shared links — mount reads q param - 37 tests passing, zero warnings Co-Authored-By: Alpha <alpha@alphafornow.com>
01d6eb5 fix: hallucination filter was rejecting all segments The regex [\P{Latin}\P{Common}] matched everything including English. Replaced with non_ascii_ratio check — only reject if >50% non-ASCII. Added logging for filtered segment count. Co-Authored-By: Alpha <alpha@alphafornow.com>
c886dad feat: deploy infrastructure for archive.bobbby.online - Dockerfile: multi-stage build with FFmpeg 7 dev libs for Xav NIF - deploy.sh: rsync + sidecar into blog's docker-compose stack - Auto-patches docker-compose.yml, Caddyfile, init-db.sh - Creates archive_classifier_prod database - Builds, deploys, migrates, reloads Caddy - Release scripts: bin/server, bin/migrate - Prod config: Whisper disabled by default, logger at :info - Runs on port 4002 behind Caddy at archive.bobbby.online Co-Authored-By: Alpha <alpha@alphafornow.com>
99cba12 chore: disable Whisper auto-start in dev Boot was taking 4+ minutes loading the 3GB model on every restart. Whisper will start lazily or via twerker worker process instead. Co-Authored-By: Alpha <alpha@alphafornow.com>
6735012 feat: exponential backoff for archive.org downloads 1s → 2s → 4s → 8s → 16s between retries, max 5 attempts. Logs each retry with delay. Temp files confirmed cleaning up. Co-Authored-By: Alpha <alpha@alphafornow.com>
85cb7d2 feat: "Watch" button linking to archive.org for every video Opens archive.org/details/{archive_id} in a new tab. Available on all videos regardless of classification status. Co-Authored-By: Alpha <alpha@alphafornow.com>
123d633 fix: add pool_timeout and log download errors with detail Finch connection pool may starve with concurrent downloads. pool_timeout: 5min gives queued downloads time to acquire a connection. Error logging now shows the full reason for failed downloads. Co-Authored-By: Alpha <alpha@alphafornow.com>
+122-124 notactuallytreyanastasio/Beta/main May 22 13:45
0cdcc17 more renaming just to see what happens
+652-530 notactuallytreyanastasio/Beta/main May 22 13:20
08b50b5 fix lowercase alpha occurances
acf5de0 rename Alpha to Beta
+21-8 notactuallytreyanastasio/twerker/main May 22 12:28
f70c1a3 fix: fetch jobs as structs instead of relying on returning: true update_all with returning: true can return nil in some Ecto versions. Re-fetch jobs after update to ensure full structs are dispatched. Co-Authored-By: Alpha <alpha@alphafornow.com>
fc1a000 feat: recover orphaned jobs on producer startup Jobs left in "running" status from a previous crash/restart get reset to "queued" so they're picked up again. Prevents stuck jobs. Co-Authored-By: Alpha <alpha@alphafornow.com>
+122-8 notactuallytreyanastasio/twerker/main May 22 12:04
f3b8098 docs: README with setup, usage, architecture Co-Authored-By: Alpha <alpha@alphafornow.com>
+1631-281 notactuallytreyanastasio/archive_classifier/main May 22 05:46
6f18d1a fix: real HTML popover for description on hover Dark tooltip appears below the card on hover. Only shows when description differs from the title. Co-Authored-By: Alpha <alpha@alphafornow.com>
e1dd630 fix: strip HTML tags from description popovers Archive.org descriptions contain raw HTML (<div>, <br />). Strip to plain text before rendering in the tooltip. Co-Authored-By: Alpha <alpha@alphafornow.com>
126bfab fix: remove dead code caught by Elixir 1.20 type inference The || fallback and nil clause were unreachable — the :if guard already guarantees description is non-nil. Type inference is sharp. Co-Authored-By: Alpha <alpha@alphafornow.com>
77a514c refactor: integer PK, archive_id field, Ecto.Enum for status - Video uses standard integer PK (Ecto handles it) - archive.org identifier stored as archive_id with unique index - classification_status is now Ecto.Enum (:pending, :queued, :classifying, :classified, :failed) - All tests updated, 15 passing, zero warnings Co-Authored-By: Alpha <alpha@alphafornow.com>
bae1865 feat: collection-first drill-in UI, sort dropdown, thumbnails - Landing shows 7 collections as cards with thumbnails and total duration - Click collection to drill in to its videos - Sort dropdown: duration asc/desc, title asc/desc - Thumbnails from archive.org/services/img/{archive_id} - Auto-fill grid adapts columns to viewport width - Stripped Phoenix default navbar and branding - Search filters both collection view and drill-in view Co-Authored-By: Alpha <alpha@alphafornow.com>
32aeb19 feat: ETS cache for all videos, 3-column grid grouped by collection - Cache GenServer loads all 1,371 videos into ETS on startup - Search runs in-memory (catalog is static, fully digitized) - Cache.reload/1 updates single video after classification change - LiveView: 3-column grid, videos grouped by collection - Collections get human-readable names (Ron Wood, Jackson Browne, etc) - Zero Postgres queries on page load/search after startup Co-Authored-By: Alpha <alpha@alphafornow.com>
2d8175c perf: add composite index on (collection, duration) for cache load Co-Authored-By: Alpha <alpha@alphafornow.com>
810dfe7 feat: transcript search page at /search - SearchLive: search spoken words across all transcribed videos - Results show video thumbnail, title, timestamp range, matched text - Transcript schema tests (changeset validation, ilike search, case-insensitive) - Route: GET /search - CLAUDE.md: codified test-first development as mandatory Co-Authored-By: Alpha <alpha@alphafornow.com>
b069fb9 feat: wire Whisper serving into supervision tree - Conditionally starts via :start_whisper config flag - Model configurable via :whisper_model (whisper-small in dev, whisper-tiny in test) - Tests never load the model (start_whisper: false in test.exs) Co-Authored-By: Alpha <alpha@alphafornow.com>
9c8e0ac feat: catalog LiveView with search and classify trigger - Archive context with list_videos, count_videos, stats, queue_for_classification - CatalogLive: browse catalog, search by title/description, trigger classification - 11 context tests covering search, filtering, status, pagination - Removed dead PageController (replaced by LiveView at /) - exqlite available in all envs (no hacky warn suppression) Co-Authored-By: Alpha <alpha@alphafornow.com>
ae4e559 feat: transcription pipeline — Whisper, FFmpeg, transcript storage - ML.Whisper: Bumblebee Nx.Serving for whisper-small with segment timestamps - Media.FFmpeg: audio extraction (16kHz mono WAV) and duration probe - Classification.Transcript: Ecto schema with video_id, start_time, end_time, text - Pipeline.Transcribe: download → extract audio → transcribe → store → cleanup - Whisper-small verified loading on M4 Pro (967MB model) Co-Authored-By: Alpha <alpha@alphafornow.com>
71c4eaa fix: show full titles, description on hover Co-Authored-By: Alpha <alpha@alphafornow.com>
+6430-0 notactuallytreyanastasio/Beta/main May 22 04:48
5d6eaf9 add supporting docs and site stuff to publish
+6683-11 notactuallytreyanastasio/Beta/main May 22 04:33
0ff60ec wire it up so that it just runs all the things, assuming you have ollama and can run the qwen model alongside the regular shit
+30-29 notactuallytreyanastasio/deciduous/main May 07 12:47
6e4f0c0 update docs RE cowork not working yet Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+30424-14135 notactuallytreyanastasio/deciduous/main May 07 02:27
a1203a4 release: v0.15.0 - MCP server for Claude Code, Desktop, and cowork Built-in MCP server (`deciduous mcp`) exposes 31 tools over the Model Context Protocol. Works with Claude Code, Claude Desktop, and cowork. - Graph CRUD, querying, full-text search, chain tracing - Session management: each conversation gets its own decision tree - Sessions persist across server restarts for long-running cowork - /query slash command for natural language decision graph reports - Full docs at deciduous.dev/mcp with API reference Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c96a2c4 update docs, site, etc with MCP info
bfb6947 implement MCP server stuff
+500-1 notactuallytreyanastasio/blimp/main May 01 11:26
b7e10a5 Merge tutorial/ch07-clock: Chapter 7 ("The Clock") A logical Clock actor (callers advance via :tick) plus a BikeShare.Rider extended with pickup_at and an :elapsed handler. The chapter argues for logical clocks over now() for both testability and WASM compatibility (now() in the WASM build is stubbed to 0). Solution passes 7/7 in CLI and WASM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
91f7dfd feat(tutorial): chapter 7 -- The Clock Adds 07-clock.md and the ch07_clock exercise. A simple Clock actor with one Int field that callers advance via :tick. The BikeShare.Rider from Chapter 6 grows pickup_at and a guarded :elapsed handler that reports how long the rider has had the bike. The chapter explains why the clock is logical (callers send :tick) rather than wall-clock: WASM's now() returns 0, and even a working wall clock would make tests flake. Pattern is the same one used by Erlang/OTP and most distributed systems for testable time. Three TODOs: - Clock's :tick (the canonical "increment counter, reply new value" shape from earlier chapters) - Rider's guarded :pickup, now threaded with a Clock arg, capturing the pickup time into pickup_at via a multi-field become whose right-hand side is a `clock <- :now` send - Rider's guarded :elapsed, computing (clock <- :now) - pickup_at Solution passes 7/7 in CLI and WASM. Stub Exercise hints are prose-only; no commented-out answer code under any TODO. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+26-35 notactuallytreyanastasio/blimp/main May 01 04:29
11006e2 Merge stubs/no-answer-comments: stubs no longer ship the answer ch4/5/6 exercise stubs had Exercise hints with the literal solution lines commented out underneath, which defeated the prose rewrite from the previous merge. Hints are now prose-only. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ee19920 docs(exercises): replace commented-out answers with prose hints The TODO comments in ch4/ch5/ch6 stubs had the answer code commented out underneath, which is exactly the copy-paste shape the prose rewrite was meant to remove. Each Exercise: hint is now a prose description of what the handler should do, with no literal lines the reader can uncomment. Stubs still parse, solutions still pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+492-1 notactuallytreyanastasio/blimp/main May 01 01:45
3ce6a62 feat(tutorial): chapter 6 -- The Rider Adds 06-rider.md and the ch06_rider exercise. Introduces a BikeShare.Rider actor that holds one user's session: name and a Bike slot that's nil when idle. New language ground: - nil as a meaningful state value - == nil and != nil guards on multi-clause handlers - the pre-flight check pattern (send to downstream, dispatch on the reply, only commit your own state if downstream confirmed) Three TODO handlers; the multi-clause :pickup and :return get their fallback clauses pre-wired so the reader's work is the guarded "do the thing" clauses. The rider also lives at BikeShare.Rider so each instance is its own supervision boundary under the same prefix as Vault and Inventory from chapter 5. Solution passes 7/7 in CLI and WASM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6b1ee2b Merge tutorial/ch06-rider: Chapter 6 ("The Rider") A BikeShare.Rider actor with a Bike-or-nil session slot. New ground is nil as a state value, == nil / != nil guards, and the pre-flight check pattern (ask the bike before committing the rider's own state). Each rider lives at BikeShare.Rider so it inherits the supervision boundary from chapter 5. Solution passes 7/7. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+199-243 notactuallytreyanastasio/blimp/main May 01 01:11
0373af8 Merge tutorial/parallel-examples: ch3-5 steps no longer copy-paste Each "Step N: fill in X" section now shows the language pieces as small parallel patterns and asks the reader to compose the actual handler, rather than leading with the exact answer in a code block. "Putting it together" recap blocks removed; standalone concept sections that overlapped with the new step content folded into the steps themselves. No code changes; solutions still pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7987591 docs(tutorial): rewrite ch3-5 step sections with parallel examples The "Step N: fill in X" sections used to lead with the exact answer in a code block, then walk through it line by line. That made the exercises a copy-paste rather than a synthesis, and the "Putting it together" recap blocks doubled the answer count. New shape: each step shows the language pieces in small parallel patterns (a Counter that takes a typed arg, a Stack that pops the head, an integer-list reduce, a divide-by-zero bubbler) and asks the reader to compose the actual handler from those parts. The exercise file's solution stays the canonical assembled answer. Also folded the standalone "Sending messages from inside a handler" section in ch3 and "Sending into a closure" section in ch4 into the steps that needed the concept, since they were duplicating ground the steps now cover with their own parallel snippets. No code changes; solutions still pass 8/7/5 in CLI and WASM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+562-1 notactuallytreyanastasio/blimp/main Apr 29 18:02
b138476 Merge tutorial/ch05-supervision: Chapter 5 ("The supervision tree") Introduces bubble / orelse / bubbles(CascadeBubble) and the dotted-name supervision tree. Exercise wires a BikeShare parent to a Vault and an Inventory; the vault bubbles on overdraw, the parent translates the bubble into a tagged tuple, and an :emergency handler cascades a reset across every BikeShare.* sibling at once. Solution passes 5/5 in CLI and WASM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ea72016 feat(tutorial): chapter 5 -- The supervision tree Adds 05-supervision.md and the ch05_supervision exercise. Introduces three new pieces of language ground: - bubble :reason raises a failure that propagates as a value - target <- :msg orelse X catches a bubble at the call site - bubbles(CascadeBubble) handler annotation: when this handler bubbles, restart every dotted-name sibling under the same supervisor prefix The exercise builds three cooperating actors: a BikeShare.Vault that holds cents, a BikeShare.Inventory that holds a bike count, and a BikeShare parent that wires them together. Three TODOs: - :withdraw bubbles :overdraw on insufficient funds - :charge translates the bubble into {:error, :declined} via orelse - :corruption is annotated bubbles(CascadeBubble) so a panic resets every BikeShare.* sibling Solution passes 5/5 in the CLI and in the tutorial WASM evaluator. The chapter walks through bubble vs. tagged tuple as a design choice (state preserved vs. erased), the dotted-name supervision boundary, and the bulkhead pattern of unrelated supervisor prefixes never cascading into each other. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+31-5 notactuallytreyanastasio/blimp/main Apr 29 17:50
19809f3 fix(ws): use the correct RFC 6455 magic GUID for Sec-WebSocket-Accept The handshake constant in builtins.zig had the magic GUID's hex digits scrambled: 258EAFA5-E914-47DA-95CA-5AB9DC80CB65 (wrong) 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 (RFC 6455 §1.3) curl doesn't validate Sec-WebSocket-Accept against the locally computed expected value, so handshakes from curl saw the 101 and the WS frames started flowing -- the chat *looked* like it worked. Real browsers do validate, and rejected every connection with "Incorrect 'Sec-WebSocket-Accept' header value", which is why Enter on the chat input never actually delivered: the WS was never open, the form fell through to its HTTP POST fallback, and the page reloaded. Fixes the GUID, fixes the test that was calibrated to match the bug (it now expects the RFC 6455 example value "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" for key "dGhlIHNhbXBsZSBub25jZQ=="), and adds a deploy snippet to infra/README.md for rebuilding and shipping the chat interpreter. Verified end to end on the live box: handshake response now matches the RFC value, and a headless-Chrome session through https://blimp.bobbby.online/chat/ logs in, types a message, hits Enter, and sees the message broadcast back via WebSocket without a page reload. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1949b0c Merge chat/fix-ws-handshake: WebSocket handshake now follows RFC 6455 The ws_accept_key builtin was using a corrupted magic GUID, which curl's loose handshake check let slide but every real browser correctly rejected. Fixes the constant, fixes the test that was calibrated to the bug, and documents the rebuild/redeploy steps for the chat interpreter in infra/README.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+110-11 notactuallytreyanastasio/blimp/main Apr 29 17:38
9228098 chat: serve at blimp.bobbby.online/chat/ via Caddy reverse proxy Three changes to chat.blimp so it works behind a path-stripping proxy: - Form actions become relative ('/login' -> 'login', '/send' -> 'send') so they resolve against whatever URL the page is at. - Redirects use './' so the browser stays under the /chat/ prefix instead of jumping to root. - The WebSocket URL is now built from window.location, including protocol (wss when the page is HTTPS) and the current pathname prefix. Also adds infra/Caddyfile + infra/README.md, which are the live contents of /opt/blog/Caddyfile on the Hetzner box. The blimp.bobbby.online block now redirects bare /chat -> /chat/ and reverse-proxies /chat/* to 172.18.0.1:8080 (the blog_default docker-bridge gateway, where the blimp-chat systemd service is listening on the host's 0.0.0.0:8080). Verified end-to-end: GET /chat/ serves the login HTML, POST /chat/login redirects with a session cookie, GET /chat/ws does the WebSocket upgrade and immediately receives the broadcast frame. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
337d1f2 Merge chat/path-aware: chat lives at blimp.bobbby.online/chat/ chat.blimp uses relative URLs (form actions, WebSocket, 302 redirects) so it works behind a path-stripping reverse proxy. Caddy on the Hetzner box now proxies /chat/* on blimp.bobbby.online to 172.18.0.1:8080, where the blimp-chat systemd service is listening. Adds infra/Caddyfile + infra/README.md so the proxy config is tracked alongside the source. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+498-4 notactuallytreyanastasio/blimp/main Apr 29 17:25
01f1408 feat(tutorial): chapter 4 -- Zoom out Adds 04-zoom-out.md and the ch04_zoom_out exercise. Introduces anonymous functions (`fn(x: T) do ... end`) and the three list builtins that take them as arguments: map, filter, reduce. The chapter's exercise builds a `BikeShare` actor that holds a list of `Station` references and fans questions (total bike count, names of busy stations) out to all of them via map / filter / reduce. Three TODO handlers (`:open`, `:total_bikes`, `:busy_stations`). Solution passes 7/7 in CLI and in WASM. The original ch4 roadmap said "supervision tree, dotted names, zoom out". This chapter takes the "zoom out" half of that and ch5 will take supervision + dotted names. Updated 00-why-actors.md's roadmap to reflect the split, and updated the ch5 placeholder title in the SPA chapter list. Implementation note: at this zoom level Stations track bikes by an integer counter rather than by holding [Bike] actor references. A runtime hang shows up when actor refs are passed as typed message args into actors that later get iterated by a parent's closure-send; we work around it here, will revisit alongside ch5. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4a74600 Merge tutorial/ch04-zoom-out: Chapter 4 ("Zoom out") Anonymous functions, map/filter/reduce, and a `BikeShare` parent actor that fans questions out to a list of `Station` children. Seven tests; solution passes in CLI and WASM. Splits the original ch4/ch5 roadmap: ch4 takes "zoom out", ch5 takes the supervision tree + dotted names + crash isolation material, including a runtime hang to fix where actor refs passed as typed args interact badly with closure iteration. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+87-16 notactuallytreyanastasio/blimp/main Apr 28 03:19
b541da3 docs: add self-hosting narrative to README, deslop pass Full story of the bootstrap: prerequisites, lexer, parser, evaluator, closing the loop, bugs found, what came after. Deslopped: cut "the language eating itself", "fell into place fast", dramatic fragment openers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+147-116 notactuallytreyanastasio/blimp/main Apr 28 03:11
f0aee23 docs: rewrite README from scratch using decision graph Self-hosted compiler is the lead story. Shows the actual compiler.blimp pipeline. Fixes chat.blimp line count (706, not 23k). Adds concurrent server, safe strings, property tests, LTO benchmarks. Drops the old Zig-focused implementation table. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+30-15 notactuallytreyanastasio/blimp/main Apr 28 03:07
e169732 docs: README reflects self-hosted compiler, Zig is bootstrap Blimp compiles Blimp. The self-hosted compiler (lexer, parser, evaluator, codegen, stdlib) lives in chunks/lang/lib/. The Zig code is the bootstrap that gets it off the ground. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+18-22 notactuallytreyanastasio/blimp/main Apr 28 03:03
5f4e961 docs: fix README accuracy -- real line counts, remove stale screenshots Zig line counts were from months ago. Updated to actual wc -l output. Clarified C is just the 846-line native runtime, everything else is Zig. Removed outdated playground and REPL screenshots. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+130-230 notactuallytreyanastasio/blimp/main Apr 27 13:02
5986e8a docs: rewrite README with current project state Update examples, line counts, WASM size, add tutorial and tree-sitter links, restructure around key ideas rather than syntax reference. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+1091-0 notactuallytreyanastasio/blimp/main Apr 27 12:58
fdf9e89 add db
+57-57 notactuallytreyanastasio/blimp/main Apr 26 01:43
9ff6564 docs(tutorial): backtick actor / type names in ch1-3 prose Sweeps the tutorial chapters so identifiers (Bike, DockingStation, String, status, id) render monospaced wherever they appear in prose, not just inside fenced code blocks. Headings get the same treatment ("The shape of a Bike" -> "The shape of a `Bike`"). Code blocks and already-backticked spans untouched. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+751-56 notactuallytreyanastasio/blimp/main Apr 26 01:12
ab2b6bb feat(tutorial): chapter 3 -- Actors talking to actors Adds 03-actors-talking.md and the ch03_actors exercise (stub + solution). Introduces a DockingStation actor that holds a list of Bike references and orchestrates rentals: list-typed state, the cons / head / tail / length pattern, typed message arguments ((b: Bike)), and sending messages to other actors from inside a handler. Exercise has 8 tests; the solution passes all 8 in the CLI. Wires ch03 into the SPA's chapter list so the tutorial picks up the new markdown, stub, and solution files automatically. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4a5caa8 feat(tutorial): replace textarea editor with Monaco Drops Monaco (v0.46.0 from jsdelivr) into docs/tutorial/index.html in place of the layered textarea + <pre> highlight overlay. Registers a `blimp` Monarch grammar mirroring blimp-highlight.js (same keywords, constants, builtins, atoms, #{} interpolation, PascalCase types) and a `blimp-dark` theme matching the existing token colors so highlighting stays visually consistent with the static code blocks rendered in the middle pane. Cmd/Ctrl+Enter is now a Monaco command bound to Run Tests. The cheat tab and rendered markdown blocks keep using blimp-highlight.js (small, sync, no behavioral change). Boot does Promise.all([blimp.init, initMonaco]) before loading the first chapter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
39c1a3c Merge tutorial/ch03-stations: Monaco editor + Chapter 3 Two coherent changes shipped together: 1. Replace the textarea editor in the tutorial SPA with Monaco (v0.46.0), with a Blimp Monarch grammar and a dark theme that mirrors blimp-highlight.js. Cmd/Ctrl+Enter runs tests via a Monaco command. Cheat tab and rendered-markdown code blocks keep using blimp-highlight.js. 2. Chapter 3 -- "Actors talking to actors". Introduces the DockingStation actor that holds a list of Bike references and orchestrates rentals. New language ground: list-typed state ([Bike]), cons / head / tail / length, typed message arguments ((b: Bike)), and sending messages from inside a handler. Includes 03-actors-talking.md plus stub + 8/8-passing solution under exercises/ch03_actors/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
+2111-1451 notactuallytreyanastasio/blimp/main Apr 24 21:00
d939fdf feat(tutorial): SPA with embedded REPL, test runner, and Blimp highlighter Adds docs/tutorial/index.html, a single-page tutorial viewer. Three-pane layout: chapter rail on the left, rendered markdown in the middle, interactive REPL pane on the right. URL fragment (#ch00, #ch01, etc) drives chapter navigation, fetches the chapter's markdown, loads the matching exercise stub into the editor, and runs the reader's code against the WASM-compiled Blimp runtime via the new `runTests()` binding. Failures show up inline with structural detail captured from the assertion builtin. "Cheat" tab fetches the solution .blimp file from disk and highlights it; "Copy to editor" paves over the stub. Also adds blimp-highlight.js, a zero-dependency syntax highlighter for Blimp. Keyword list is derived from chunks/lang/tree-sitter-blimp/ grammar.js plus Zig-parser extras (test, property, given, if, else) so it stays in sync with the real grammar. Handles string interpolation (#{...}), atoms, numbers, operators, keywords, builtins, and type-like capitalized identifiers. Used for code blocks in rendered chapter markdown, the live editor textarea (layered <pre> overlay with scroll sync), and the cheat-view solution display. exercises/ lives at the repo root so CLI users can run `blimp test exercises/...`. For the web tutorial, docs/tutorial/exercises is a symlink to ../../exercises so the SPA fetches work from a single path both locally and in production; deploy.sh follows the symlink via rsync -L. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
00f8e54 feat(tutorial): bike share tutorial chapters 0-2 and first exercises Builds a TDD-driven Blimp tutorial that teaches the actor model by constructing a bike share simulation one actor at a time. Twelve chapters planned total; this commit lands the first three: - Chapter 0: why actors, the dispatcher-with-clipboard mental model, functional core / imperative shell as the organizing philosophy, and the piecemeal progression the rest of the chapters follow. - Chapter 1: your first actor. A Bike with id and status, four handlers filled in one at a time. Walks through actor templates, state defaults, the `::` assignment operator, atoms as interned symbols, spawn-with-overrides, the `<-` send operator, and why `become` exists (Hewitt's original actor primitive, not mutation). - Chapter 2: state, become, and the free lock. Multi-clause handlers with guards, tagged `{:ok, ...}` and `{:error, ...}` tuples, a third `:broken` state that drops in without any type edits, and the punchline of the chapter: why an actor's mailbox plus "handlers run to completion" gives you mutual exclusion without any locks. Each chapter has a matching exercise file in exercises/chNN_topic/ with a stub the reader fills in, failing tests that progressively go green, and a reference solution in solutions/. Voice: one-sentence-per-line markdown, no em-dashes, piecemeal concept-then-exercise flow, design decisions traced back to the deciduous graph and docs/lang_design/ where they were made. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
9a4e116 feat(chat): poll-based server loop, read WS frames end-to-end Replace the blocking accept_loop with a poll-based loop that watches [server_fd | all_ws_fds]. When a WS fd is ready, read one frame and route {"type":"msg","from":..,"text":..} to the room, then broadcast. HTTP POST /send path preserved as a fallback for WS-less clients. Also fixes extract_quoted's off-by-one: Blimp evaluates args such that char_at(s, idx) in a call alongside idx+1 sees the post-incremented idx. Compute char_at into a local first. Same pattern may need the same treatment wherever it appears (json_escape_loop, slice_idx); not swept in this commit. TODO: step 3 of the bidirectional-WS plan still has 'from' coming from the client frame instead of a server-side session lookup. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
9d20b71 Merge lang/ws-bidirectional: WASM test runner, bike share tutorial, SPA, deploy fix # Conflicts: # deploy.sh
79aad67 chore: remove old blog tutorial.html The old interactive browser tutorial at docs/blog/tutorial.html is replaced by the new bike-share tutorial under docs/tutorial/. No incoming links remain from blog/index.html or the manifesto. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
90a90fd docs: scrub 'Ruby's skin, Elixir's soul' phrase Removes the pithy motto from the three places it appeared (the core language feel design doc, the parser design doc, and the manifesto) and replaces each with a direct description of what the phrase meant: Blimp's surface syntax is Ruby-flavored (do/end, optional parens, readable sentences) and the data model is Elixir-flavored (immutable values, pattern matching, pipes, atoms). Same content, no marketing motto. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
30 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 (250d 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???