6c3199dci: align job names with required status check contexts
Ruleset requires contexts named fmt-and-clippy, test, and build, but
the workflow was reporting them as 'Format & Clippy', 'Test Suite (...)',
and 'Release Build'. Drop the display names so jobs report under their
keys, and add a 'test' aggregator that fans in from the matrix so a
single 'test' context reports.
236c8c5release: v0.14.0 - observation title + description support
Observations now have first-class title + description semantics:
- CLI warns when creating observations without -d
- `deciduous nodes` shows description inline for observations
- Web viewer detail panel shows description prominently below title
- All templates, commands, and instructions updated
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f24f307Rewrite system prompt with detailed Expert context guidance
The system prompt now explains:
- Every context section Claude receives and how to use it
- That callers tell you the expected return shape
- That sibling modules show available APIs — use them, don't invent
- That functions must actually exist (no hallucinating APIs)
- To write inline logic when needed functionality doesn't exist
- Session continuity across multiple holes in one compile
- That generated code gets written to source for developer review
This directly addresses Claude hallucinating nonexistent functions
like Blog.Visitors.known_ip?/1 by explicitly instructing it to
only call functions visible in the Expert context.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2bc621bAdd automatic retry on compile errors with error feedback to Claude
When generated code fails to expand/compile, the error is captured
and sent back to Claude: "The previous code had this compile error:
[error]. The code that failed: [code]. Please fix it."
Uses the existing session continuity (--continue) so Claude has full
context from the original intent + its previous attempt. Retries up
to situation_max_retries times (default: 3) before giving up.
Output shows the attempt number and error at each retry:
│ Compile error (attempt 1/4):
│ undefined function foo/1
│ Asking Claude to fix...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
af3498cStrip markdown fences from Claude responses before parsing
Claude sometimes wraps code in ```elixir ... ``` fences despite
system prompt instructions. The parser now strips these before
attempting to parse the response as Elixir code.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6996fc6Filter Kernel and SpecialForms from situation prompt imports
These are auto-imported in every module and just add noise to the
prompt. Claude already knows about Kernel functions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
a63639dAdd situation_verbose for debug logging of prompts and responses
When situation_verbose: true is set, the compiler prints the full
system prompt, user prompt (with all Expert context), command details,
and raw Claude response for each hole. Off by default.
Set via mix.exs:
elixirc_options: [situation_command: "claude", situation_verbose: true]
Or at runtime:
Code.put_compiler_option(:situation_verbose, true)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ce1f489Enrich Expert LS context and add Claude session continuity
Expert context enrichment — when Expert LS engine is running, each hole
now receives:
- Callers of the current function (what callers expect)
- Function definition/spec (the stated contract)
- Module attributes (@moduledoc, @type, etc)
- Struct definitions in the module
- Sibling modules in the same namespace
- Related ExUnit tests
All queries use safe_expert_call which returns [] on failure, so
compilation never breaks if Expert isn't running.
Claude session continuity — the first hole in a compile run starts a
fresh Claude session. Subsequent holes use --continue to resume the
same session, so Claude naturally accumulates context from previously
filled holes. One Claude "brain" across the entire compilation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fc29d3cfix: pipes lesson and predict validator
Pipes with higher-order fns (filter/map) broken in pipe evaluator.
Changed lesson to sort/reverse/length which work. Predict lessons
no longer show Correct when the eval itself errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ba0e10ffeat: Blimp lexer written in Blimp -- first self-hosting step
Added char_at, char_code, from_char_code builtins for char-level
string scanning. The lexer (lib/lexer.blimp) tokenizes: integers,
floats, strings, atoms, identifiers, upper identifiers, keywords,
all operators (+, -, *, /, ==, !=, <-, |>, ::, .., ..., ->),
comments, and whitespace. 6/10 tests pass (multiline and keyword
matching need the string case-match fix).
370 lines of pure Blimp. The compiler is starting to eat itself.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3b7a55bfeat: rewrite tutorial -- views by lesson 6, live preview pane
20 lessons restructured: values (3) -> variables/functions (2) ->
views (5, with live rendering!) -> actors (3) -> map/filter/pipes (3)
-> putting it all together (4). View lessons show rendered output
in a light preview pane. Tab inserts spaces, Cmd+Enter submits,
progress saved to localStorage.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
17e3527feat: interactive Blimp tutorial with runtime eval/test
blimp_eval(code) and blimp_test(code) builtins for runtime
code evaluation. 12-lesson tutorial: values, functions, actors,
builtins. Three step types: predict output, fill blanks, write code.
Dark theme, mobile-friendly (viewport meta, 44px tap targets,
responsive breakpoint at 480px).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8b2911dship: rebuild WASM (182KB), update tutorial + manifesto
WASM rebuilt with all fixes: and/or operators, pipes with
filter/map/reduce, Any type checks, <-- async sends, auto-scheduler,
cons operator, self-hosted compiler.
Manifesto pipe example now uses filter |> map |> sort |> reverse.
Tutorial reference pane adds and/or, <-, <-- operators.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6ba6da7fix: Functions lesson no longer loops -- merged into one check
The 'then' hint showed 'Now try: double(21)' but the next
eval matched the same lesson's check (double still in env),
creating an infinite loop. Merged into one lesson that checks
for double(21) == 42.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
785a030feat: self-hosted parser in Blimp -- 11/11 tests pass
Recursive descent parser (699 lines) that produces map-based AST:
- Actor definitions with dotted names, state, handlers, tests
- Function definitions with typed params and return types
- Expressions: arithmetic, comparisons, function calls, message
sends, list literals, case expressions, spawn, assignment
- Operator precedence: comparison > addition > multiplication
Combined with lexer (429 lines): 1128 lines of pure Blimp that
can tokenize and parse Blimp source code into an AST.
Also fixed: string literal lexing uses char code 34 instead of
escaped quote in case branch, scan_string uses char codes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ef9b0c2feat: self-hosted evaluator in Blimp -- 10/11 tests pass
Tree-walking evaluator (480 lines) that executes map-based AST:
- Literals: int, float, string, bool, nil, atom
- Arithmetic: +, -, *, / with correct precedence
- Comparisons: ==, !=, <, >, <=, >=
- Variables: assignment and lookup via Env actor
- Functions: def, call, params, closures over env
- Builtins: 25+ delegated to host (print, concat, length, etc.)
- Lists: literal construction and operations
- Case expressions: pattern matching with wildcard
- Actors: definition, spawn, message send (1 test remaining)
Combined self-hosted compiler: lexer (429) + parser (699) +
evaluator (480) = 1608 lines of pure Blimp.
Also fixed: checker allows Any-typed vars as message send targets.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
e62b8d4fix: strip quotes from WASM string results in validators
WASM eval returns strings as "hello" (with quotes) but validators
compared against hello (without). Added unquote() helper. Fixed
Greeter lesson validator.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4c80350feat: Blimp Chat -- first real web app, fully working
Multi-user chat room with:
- ChatRoom actor: messages, users, join/leave/send
- Cookie-based sessions with auto-generated tokens
- Login page, chat page with sidebar (online users) + message list
- Message send via POST, redirect-after-POST pattern
- Dark theme, mobile-friendly, auto-refresh every 3s
- Multiple simultaneous users see each other's messages
Fixed: sequential become statements (only last takes effect),
slice_list using elem() instead of head/tail in case branches,
Any-typed actor ref passing through function chains.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c57724ffix: chat room fully working -- the 'bug' was a corrupted binary
The Zig evaluator is fine. The elem()/head()/tail() calls all work
correctly at any call depth. The crash was caused by a corrupted
binary from sed-based debug print removal that left the builtins.zig
in an inconsistent state.
Clean rebuild fixes everything. The full chat flow works:
- Login (POST /login, cookie, session)
- Chat rendering (messages from actor state via head/tail)
- Message sending (POST /send)
- Multi-user (Bob sees Alice's messages)
- WebSocket upgrade + broadcast
Used head/tail recursion instead of elem/idx for rendering
(simpler and avoids the index-based patterns).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
57205b0fix: form falls back to HTTP POST when WebSocket not connected
e.preventDefault() only fires when WS is ready. Otherwise the
form submits normally via POST. Messages always send now.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
65988cdfeat: tutorial IS the REPL -- guided lessons in the REPL stream
Complete redesign: the tutorial is the REPL itself with lesson
guidance. Lessons appear as styled text in the REPL output, you
type at the blimp> prompt, results show inline, state sidebar
updates live, views render in the view pane.
18 lessons: values -> strings -> atoms -> booleans -> variables ->
lists -> functions -> views -> actors -> messages -> map/filter ->
free play. /lessons restarts, /skip advances.
Same REPL as index.html: history, multi-line (shift+enter),
view rendering, state sidebar, mounted actor views.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fdc1689feat: --self-hosted flag -- Zig bootstraps, Blimp runs
./blimp file.blimp --self-hosted
The Zig runtime loads lib/*.blimp (lexer, parser, evaluator,
codegen, completion, compiler), then executes user code through
the self-hosted pipeline. The Zig lexer/parser/evaluator become
the bootstrap layer only.
./blimp expr.blimp --self-hosted # eval via Blimp compiler
./blimp expr.blimp # eval via Zig compiler (default)
New builtins: write_bytes(path, bytes), read_file(path).
compiler.blimp provides blimp_compile(source, :eval/:wasm/:tokens/:ast).
The Zig is now the kernel: builtins + WASM bridge + CLI.
Everything above it is Blimp.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fcd258cfix: remove Google Fonts import that blocks page rendering
3841a17feat: auto-scheduling -- no manual schedule() needed
<-- auto-drains mailbox immediately after enqueue. Reduction
counter also triggers drain every 4000 evals. No explicit
schedule() call required.
w <-- :compute(5) # enqueued AND processed
print(w <- :get) # 25 -- already done
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
949a13afeat: WebSocket broadcast chat -- zero Any types, typed actors
Full rewrite with proper types:
- ChatRoom, Sessions, Connections, HTTPServer all actor-typed
- No Any types anywhere -- every param is ChatRoom, Sessions, etc.
- WebSocket: upgrade handshake, ws_loop, broadcast to all clients
- Connections actor tracks open WS file descriptors
- broadcast() pushes rendered HTML to ALL connected clients
- JSON builder with proper escaping (no string concat hacks)
- Client JS: WebSocket with reconnect, form intercept, DOM update
WS upgrade confirmed working (101 + state push).
HTTP login + cookie confirmed working (302 + Set-Cookie).
Remaining: render_messages crashes on map lookup from actor state
(likely a scoping issue with lookup on maps from become).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b6a40a0feat: BOOTSTRAP -- Blimp compiles Blimp end-to-end, 56/56 tests
The self-hosted compiler compiles programs with: functions with
return type annotations, && and || boolean operators, case
expressions, nested function calls, list operations, string
builtins, comparisons, and multi-line programs.
Fixed: self-hosted lexer now tokenizes &&. Self-hosted parser
handles or/and/|| /&& in the precedence chain. Self-hosted
evaluator executes && and ||. Parser case-branch scoping fixed
(assignments in case branches don't leak to outer scope).
Self-hosted Blimp: 2186 lines across 5 components.
Zig bootstrap: 19101 lines. Compression ratio: 8.7x.
429 lib/lexer.blimp
752 lib/parser.blimp
479 lib/eval.blimp
69 lib/complete.blimp
457 lib/tests (lexer+parser+eval+bootstrap+complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
396f630fix: enforce type annotations on ALL parameters, no exceptions
Lambda params now require types: fn(x: Int) not fn(x).
Checker traverses all function call arguments to catch lambdas
passed to map/filter/reduce/each. Complete audit:
on :msg(x: Int) -- enforced (existing)
def foo(x: Int) -- enforced (previous commit)
state x: Int :: 0 -- enforced (existing)
fn(x: Int) do end -- enforced (this commit)
The only untyped bindings are assignment (x = 42, inferred)
and for loops (for x in list, inferred from iterable).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f9ac5f7feat: autocomplete shows automatically as you type
Completions appear after 2+ characters, updating on every
keystroke. No need to hit Tab first. Exact matches are
suppressed. Menu stays open while typing and updates live.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
54bff04fix: slice(s, start, len) uses length not end index -- 10/10 lexer tests pass
The slice builtin treated arg 3 as end index but the lexer
(and the docs) use it as length. Fixed to start+len semantics.
This was the root cause of all 4 failing lexer tests -- keyword
matching, newlines, comments, and actor definitions all used
slice to extract substrings.
Also: nil-safe comparisons in evaluator, nil-comparable in
checker, char_code returns nil for nil input.
The self-hosted Blimp lexer (370 lines) now passes all 10 tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1f7478cfeat: the Blimp manifesto -- full language vision with live code
Long-form page covering every premise: values, functions, pipes,
actors, become, message passing, dot notation supervision, views
as message responses, the web framework in Blimp, the Hole operator,
the test runner, runtime internals (arenas, scheduling, LLVM),
WASM in the browser, the canvas, and the self-hosting dream.
Every code example has a Run button that evals in WASM. Actor
examples have the canvas showing hexagons and message rays.
Written in the voice: casual, direct, confident about taste.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
09b06e5feat: secure string composition -- SafeHtml, SafeSql, context automaton
Implements the accumulator pattern from the paper:
- SafeHtmlAccumulator: tracks HTML parse context through fixed parts,
applies context-sensitive escaping for each interpolation
- SafeSqlBuilder: parameterizes user input ($1, $2...), never interpolates
- HTML context automaton: pcdata/tag/attr_name/attr_value/url states
- Context-sensitive escapers: html_escape, html_attr_escape, url_escape
- Escaper selection based on current parse context (href -> url_escape)
- Reified safe types: %{__safe_html__: true, content: "..."}
22/34 tests pass. Security-critical tests all pass:
- XSS prevention: <script> tags escaped in pcdata
- URL injection: javascript: URLs escaped in href attributes
- SQL injection: user input parameterized, never interpolated
- Safe text passes through unescaped
Context automaton tests have a scoping issue (12 failures).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
a7c6b52fix: actor definition no longer auto-spawns
actor Foo do ... end registers the template but does NOT spawn.
First message send (Foo <- :msg) auto-spawns the singleton
and replaces the atom binding with an actor_ref. spawn Foo
creates additional instances.
Canvas only shows actors that are actually alive, not templates.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0001b87fix: chat deploys cleanly -- WS fallback, no server crashes
- WS upgrade returns 400 (disabled for now, Linux WS builtins
need debugging separately)
- JS only attempts WS connection on chat page, not login page
- Auto-refresh fallback every 2s when WS unavailable
- Server no longer crashes on WS upgrade attempts
Tested on production: login, session, chat, message send all work.
Server stays up across multiple requests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
63dac0ffeat: actor scheduler -- mailbox, reduction counter, async sends
The scheduler infrastructure:
- Mailbox: per-actor FIFO message queue (mailbox.zig)
- Scheduler: run queue with round-robin processing (scheduler.zig)
- Reduction counter: every eval() costs 1 reduction (4M default)
- ActorEntry gets mailbox + reductions fields
New builtins:
- send_async(actor, :msg, args...) -- enqueue without blocking
- schedule(ticks) -- process queued messages in round-robin
The scheduler enables concurrent actor execution:
send_async(w1, :compute, 5)
send_async(w2, :compute, 10)
schedule(100) # both workers process their messages
Sync sends (<-) still work as before for backward compat.
All existing tests pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9526197feat: property-based testing with generators
New syntax inside actors:
property "name" do
given x: gen_integer(0, 100)
given xs: gen_list(10, 0, 50)
assert_eq(reverse(reverse(xs)), xs)
end
Each property runs 100 times with fresh random inputs.
Generators:
gen_integer(min, max) random int in range
gen_string(max_len) random printable ASCII
gen_boolean() random true/false
gen_list(max_len) random list of ints
gen_list(max_len, lo, hi) random list with range
gen_one_of([a, b, c]) random element from list
Parser: property/given keywords, PropertyDef/GivenStmt AST nodes
Evaluator: property runner (100 iterations), given binds generated
value in scope per iteration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
eaa72defeat: Code/Output tabs on every lesson
Two tabs: Code (editor + Run button) and Output (canvas with
rendered result). Run auto-switches to Output tab. Tap back
to Code to edit. Visible on every lesson type.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4ea148cfix: Any type accepted in runtime type checks
checkType("Any") now returns true for all values. Previously
def foo(a: Any) followed by a <- :msg crashed because the
runtime type checker compared ActorRef.type_name with "Any"
and found no match.
All 4 bugs from the audit are now fixed:
1. and/or as expression operators -- fixed
2. Pipes with map/filter/reduce -- fixed
3. Type checker scope leak -- fixed (was the and/or bug)
4. Any-typed params in evaluator -- fixed (this commit)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9c6c3a0feat: WebSocket working in production -- graceful dead fd handling
Fixed: ws_write_frame and tcp_write return :error instead of
crashing on dead file descriptors. broadcast_fds auto-removes
dead connections. Server no longer crashes when browsers
disconnect.
WS confirmed working on Linux production server:
- Upgrade handshake (101 Switching Protocols)
- Initial state push (JSON with rendered messages + users)
- Dead fd cleanup on broadcast
- Server stays active after WS disconnect
Live at http://5.161.181.91:8080
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c51bbe3feat: Tab autocomplete in the tutorial REPL
Tab triggers completion dropdown from blimp.complete(prefix).
Shows function names with signatures, variables, actors, builtins.
Arrow keys navigate, Enter/Tab accepts, Escape dismisses.
Dropdown positioned above the input, scrollable, styled to match.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
16017bbfeat: self-hosted Blimp compiler -- 32/32 tests pass
Fixed three bugs:
1. Cons operator [h | tail] dropped the tail (evalList ignored
the tail field). Now correctly concatenates head + tail.
2. Any-typed params couldn't send messages (checker rejected them
as non-actor types). Fixed resolveActorName to accept Any/hole.
3. Test runner first-pass errors now logged instead of silent.
The self-hosted compiler (1608 lines of pure Blimp) passes all
32 tests: lexer (10), parser (11), evaluator (11).
Blimp can tokenize, parse, and evaluate itself.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d1a3c48feat: Blimp stdlib -- 185 lines replacing Zig builtins
Pure Blimp implementations of:
- Math: abs, max, min
- Lists: sum, range, flat, uniq, list_contains, zip, set_at
- Strings: upcase, downcase (char-by-char transformation)
- Views: text, heading, bold, italic, code_inline, divider,
stack_view, row_view (as pure map constructors)
empty?, nil?, not stay as Zig primitives (can't be self-referential).
51 tests (44 unit + 7 property). All green.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
19c0f35feat: reference cheat sheet pane next to state sidebar
Right column has State/Reference tabs. Reference pane covers
the full stdlib: math, strings, lists, higher-order (map/filter/
reduce), maps, views, actors, control flow, utility. Compact
format with green function names and gray descriptions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
01ccc98feat: bootstrap loop closed -- 44/44 tests, Blimp compiles Blimp
blimp_self_eval("source") runs the full self-hosted pipeline:
source string -> Blimp lexer -> Blimp parser -> Blimp evaluator -> result
12 bootstrap tests: integers, arithmetic with precedence, strings,
variables, function def/call, nested calls, builtins, comparisons,
case expressions, list ops, multi-line programs. All pass.
Full suite: lexer (10) + parser (11) + evaluator (11) + bootstrap (12) = 44
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3f4844cfix: rebuild WASM with all new builtins, gate native-only code
Native-only functions (TCP, fork, WS, file IO) are stubbed on WASM
via comptime dispatch. Hole operator returns nil on WASM. Assert
builtins skip stderr on WASM. WASM binary: 178KB (was 131KB).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
612f934feat: WASM-powered interactive Blimp tutorial at /tutorial/
14 lessons running entirely client-side via blimp.wasm (130KB).
Predict output, fill blanks, write code -- all evaluated in-browser.
Curriculum: values, variables, functions, actors, builtins, pipes.
Dark theme, mobile-friendly, progress bar.
Deploy: rsync docs/ to server, lives at blimp.bobbby.online/tutorial/
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ad0a059fix: autocomplete now includes all view primitives + new builtins
Added to completion engine: stack, row, grid, text, heading, bold,
italic, code, code_block, blockquote, divider, list, link, image,
button, input, textarea, select, form, mount_root, char_at,
char_code, from_char_code, set_at, to_atom, actor_name, assert,
assert_eq, assert_ne, refute, blimp_eval, blimp_test.
Added keywords: test, and, or, not.
'sta' now shows both 'state' and 'stack(children...) -> ViewNode'.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b85fa45test: 75 property tests across the entire compiler -- 7,500 random cases
Properties cover:
- Arithmetic: commutativity, associativity, identity, zero, negation
- Comparison: complementarity, reflexivity, negation
- Boolean: identity, absorption, De Morgan's laws
- Lists: reverse/reverse, sort idempotent, append length, cons,
sum linearity, uniq idempotent, range length, elem/head
- Strings: concat identity/length, slice identity, char roundtrip,
to_string/to_int roundtrip, upcase/downcase
- Maps: put/lookup, overwrite, keys/values length, merge identity
- Higher-order: map length, filter length, filter complement,
map identity, reduce=sum, map compose, filter idempotent
- Self-hosted compiler: lexer tokenizes random ints, self-eval of
random arithmetic (add/sub/mul), comparisons, variables
- Generators: range bounds, length bounds, type correctness
- Actors: cumulative state, reset, spawn independence
Total suite: 698 tests (623 unit + 75 property) = 15,123 test cases
(623 + 75*100). All green in 5.6 seconds.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0b96330fix: no auto-spawn on message send -- must explicitly spawn
actor Foo do ... end registers a template. Foo <- :msg is now
an error: "Message send target is not an actor." You must:
f = spawn Foo
f <- :msg
Fixed manifesto examples, dot_notation example. All tests pass.
This is the correct semantic: define is not spawn.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fca8a7cfeat: completion engine in Blimp -- replaces complete.zig logic
69 lines of Blimp replaces the completion matching logic.
Keywords and builtin names derived from lists, prefix matching
via starts_with. 8/8 tests pass, 52/52 total.
Self-hosted Blimp: 1674 lines (lexer 429 + parser 699 +
evaluator 477 + completion 69). Tests: 432 lines, 52 passing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bc6b4fbfix: nil-safe comparisons, type checker allows nil in ==/</>
char_code returns nil for nil input instead of crashing.
Comparisons (< > <= >=) return false when either side is nil.
Type checker treats nil as comparable with any type.
Lexer nil guards in is_digit, is_alpha, is_alnum, scan functions.
Lexer tests: 6/10 pass (multiline tests need further debugging
in the type checker's interaction with case-match bodies).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
26adbc0feat: <-- operator for async message sends
actor <- :msg is sync (blocks until reply)
actor <-- :msg is async (enqueues in mailbox, returns :queued)
New token: async_send (<--), parsed as MessageSend with is_async.
Lexer checks 3-char <-- before 2-char <-. Evaluator enqueues in
mailbox instead of executing inline. schedule(N) drains mailboxes.
w <-- :compute(5) # queued, returns :queued
schedule(100) # processes all queued messages
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
e1a14b2feat: THE canvas -- generative hex actors, message rays, REPL blob
Added the real BlimpCanvas from web/canvas.js to the tutorial.
Actors render as generative-filled hexagons with SHA-hashed
patterns. Message sends shoot animated rays from the REPL blob
with trailing heads and impact rings. Variables show as squares.
State changes flash white. Auto-layout in hex grid.
This is the compile-time artifact canvas that's always been
part of the Blimp REPL -- now in the tutorial.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6924581fix: add debug output for WASM load failures
0d5030ffix: and/or as expression operators, pipes with map/filter/reduce
Bug 1: 'and' and 'or' now work as expression operators alongside
&& and ||. Added kw_and/kw_or to token table and parser.
x > 0 and x < 10 # works now
Bug 2: Pipes with higher-order functions (map/filter/reduce/each)
now work. Pipe evaluator routes through evalFuncCall instead of
only checking the builtin registry.
[1,2,3] |> filter(_, fn(x: Int) do x > 1 end) # works now
[1,2,3] |> map(_, fn(x: Int) do x * 10 end) # works now
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
a8f8dd9deploy: Blimp Chat live at http://5.161.181.91:8080
Cross-compiled Blimp binary for Linux x86_64, deployed to Hetzner.
Running as systemd service (blimp-chat.service), 780KB memory.
Port 8080 opened on firewall.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
50afcf7feat: multi-actor view composition with mount()
Actors own their state via become, render via :render handler.
mount() sends :render + wraps in data-actor boundary for routing.
JS DOM walk finds nearest actor boundary on button click.
New builtins: mount_root, actor_name, to_atom
Demo: Counter + Greeter composed in one page
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2c7cbeefeat: canvas output pane on every lesson
Every lesson shows an Output canvas that displays the running
system's result: values for expressions, rendered views for view
code, errors in red, print output in blue. Canvas always visible
with "Hit Run to see output" placeholder. Consistent Run button
across all lesson types.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bfeabd0test: 623 tests -- comprehensive coverage of the entire language
Builtins: 231 tests -- every string/list/map/math/logic/HOF builtin
with edge cases (empty, nil, zero, out-of-bounds)
Operators: 142 tests -- all arithmetic, comparison, logical, pipe,
send, concat operators with type combinations
Language: 125 tests -- actors, become, guards, case, for, def, fn,
closures, cons lists, maps, interpolation, scoping,
dot notation, actor interaction, edge cases
Lexer: 36 tests -- all token types and edge cases
Parser: 34 tests -- all AST node types
Evaluator: 31 tests -- all eval paths
Completion: 8 tests
Bootstrap: 16 tests -- full self-hosted pipeline
4014 lines of tests. 1.5 seconds to run. All green.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
e0396f2feat: ExUnit-inspired test runner for Blimp
New syntax: test "name" do ... end inside actor bodies.
Suite actor state fields are re-evaluated per test for isolation
(spawn Counter gives each test a fresh instance).
Assertions: assert, assert_eq, assert_ne, refute with colored
left/right output on failure.
Two run modes:
./blimp file.blimp --test (single file)
./blimp test test/ (discover *_test.blimp files)
Green dots for pass, red F for fail, failure summary, timing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b48d91dfix: reuse REPL artifact for canvas -- same styles, same rendering
Output tab now mirrors the REPL exactly:
- REPL output lines (=> result, prints in blue, errors in red)
- View pane with blimp-* CSS classes from index.html
- State pane showing vars (green names) and actors (with fields)
- Message log (arrows with target + message)
No custom SVG. Same artifact as the compiled REPL.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7bebcdcfix: autocomplete derives from builtin registry, not hardcoded list
Completions now iterate eval.builtins.entries.items directly.
New builtins automatically appear in autocomplete without
maintaining a parallel list. Higher-order builtins (map/filter/
reduce/each) added separately since they're in evalFuncCall
not the registry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
da4afa2feat: forms, websockets, concurrency builtins + string match fix
Three parallel agents' work merged as one (worktree isolation failed):
- Forms: input/textarea/select/option/form view primitives, list
flattening in makeViewNode, todo list demo replacing counter
- WebSockets: ws_accept_key (SHA-1+Base64), ws_read_frame,
ws_write_frame, view_diff tree diffing, client JS with fallback
- Concurrency: fork/waitpid/exit, tcp_set_nonblocking/tcp_poll,
poll-based concurrent_server.blimp demo
- Bug fix: string pattern matching in case expressions (lexer
stores "POST" with quotes, runtime values are unquoted)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ca21d7efeat: dot notation for actor names in message sends and spawn
Shop.Checkout <- :add(10) now parses, type-checks, and evaluates.
Parser accepts upper_identifier after dot, eval/checker flatten
DotAccess chains into dotted name strings for registry lookup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ca61a07feat: real-time broadcast -- all WS clients get updates instantly
When any user sends a message or joins/leaves, ALL connected
WebSocket clients receive the updated state immediately.
Architecture:
- HTTP handles login/send/page loads (blocking, one at a time)
- WS upgrade registers the fd in Connections actor, keeps it open
- After any state change (join/send/leave), broadcast() pushes
rendered HTML to every registered WS fd
- Client JS replaces DOM content on WS message
The accept loop handles both HTTP and WS upgrade requests.
WS fds stay open after upgrade for push-only communication.
Messages go via HTTP POST form, updates arrive via WS push.
Open two browser tabs, type in one, see it in the other instantly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bfe8565fix: reject untyped function parameters at compile time
def double(n) do ... end is now a type error:
"function parameter 'n' is missing a type annotation"
Must be: def double(n: Int) do ... end
Checker now validates def_stmt params the same way it
validates handler params. WASM rebuilt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c884d57feat: WebSocket chat -- no more page reloads
The chat room now uses WebSockets for real-time updates:
- Initial page load is HTTP (serves HTML + WS client JS)
- Client opens WebSocket to /ws
- Messages sent as JSON frames over WS
- Server pushes rendered HTML updates instantly
- Client replaces DOM content without page reload
- Exponential backoff reconnect on disconnect
Server-side: accept_loop detects Upgrade header, does WS
handshake (SHA-1 + Base64), enters ws_chat_loop that reads
frames and pushes state. JSON escaping for safe embedding.
No more setTimeout(reload, 3000). Instant.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ef1e202debug: traced elem() index bug in recursive TCP handler chain
The render_messages function works standalone but crashes when
called from the HTTP accept loop. Traced to elem(messages, idx)
receiving idx=1 when it should be idx=0.
The issue appears in slice_idx recursive calls:
slice_idx(items, start, stop, idx + 1, append(acc, elem(items, idx)))
The elem(items, idx) should use idx=0 but gets idx=1. This only
happens when called from 4+ levels deep in the TCP accept loop.
Likely a scope/environment issue in the Zig evaluator's handling
of recursive function calls with expression arguments.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
12b9018feat: WASM codegen -- Blimp compiles to WebAssembly
The self-hosted compiler now has a WASM backend (lib/codegen.blimp,
225 lines). Compiles Blimp integer expressions to valid .wasm
modules that run in any WASM runtime.
compile_to_wasm("2 + 3") -> [0,97,115,109,...] (40 bytes)
# Node.js: main() returns 5
# Browser: main() returns 5
Supported: integer literals, +, -, *, /, ==, !=, <, >, <=, >=,
&&, ||, unary negation, booleans, nested expressions.
Output: valid WASM module exporting "main" -> i32.
Bytecode: i32.const, i32.add/sub/mul/div_s, i32.eq/ne/lt_s/gt_s/
le_s/ge_s, i32.and/or.
New builtins: write_bytes(path, byte_list), read_file(path).
23 tests (18 unit + 5 property/500 random compilations). All green.
The full pipeline: Blimp source -> self-hosted lexer -> self-hosted
parser -> self-hosted codegen -> valid .wasm bytes -> runs in browser.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3bbdd09feat: real system canvas showing actors, state, messages, views
Output tab now shows the full running system:
- Actor boxes (purple name, green state fields)
- Message log (arrows with target + message name)
- Rendered views in a light preview pane
- Return value
- Variable pills
All pulled from WASM getState() which exposes the full
actor registry, state fields, and message log.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
99b1febfeat: cookie-based session identity for Blimp HTTP server
Pure Blimp string parsing — no Zig changes. Each browser gets its
own session via Set-Cookie: blimp_session=<token>; HttpOnly; SameSite=Lax.
Token from random()+now(), Sessions actor stores per-session state.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7b23f3afeat: visual actor canvas with boxes, state fields, and message rays
Output tab now shows a real visual diagram:
- Actor nodes as purple-bordered boxes with state fields in green
- Message rays as animated dashed yellow lines from "you" to actors
- :message labels on each ray
- Staggered ray animation (0.2s delay per message)
- Diagram auto-layouts actors in a row with SVG overlay
- State text and view pane below the diagram
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c77779efeat: SVG system canvas with actor nodes, message rays, state
Output tab now renders a live SVG diagram:
- Actor nodes as purple-bordered rounded rects with state fields
- Message rays (yellow animated lines) from REPL to target actors
- "you" node as message origin
- Ray pulse animation on each message send
- Variables as pills, print output, rendered views below the graph
- Canvas paint happens before validate to avoid state clobber
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d2b1898test: comprehensive coverage -- 125/125 tests pass
Lexer: 36 tests (was 10) -- all tokens, operators, delimiters,
keywords, comments, line/col tracking, edge cases
Parser: 34 tests (was 11) -- all literals, all operators,
unary, parens, func calls, defs with return types,
actors, handlers, dotted names, message sends,
lists, case, spawn, multi-statement, empty input
Evaluator: 31 tests (was 11) -- all literals including nil/bool/atom,
all arithmetic, all comparisons, && and ||, variables,
function def/call/nested, builtins, lists, case with
wildcard and no-match, spawn
Completion: 8 tests
Bootstrap: 16 tests -- full pipeline source->lex->parse->eval
Also fixed: lexer handles underscore via char code (95) to
avoid conflict with Blimp's wildcard pattern.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6261950fix: add type annotations to function params in tutorial lessons
Blimp requires typed parameters: def double(n: Int), not def double(n).
Fixed lessons 5 (double) and 18 (profile_card).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
810967cdocs: add zero-to-running README and update CLAUDE.md with architecture notes
README covers installing Erlang/Elixir/Postgres from scratch on
macOS, Ubuntu, and Windows, plus setup, controls, and project structure.
CLAUDE.md updated with architecture decisions, style rules, and notes
on what strategies worked during parallel development.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
33b3690Hole operator: situation _ # directive shells out to Claude
- lexer.zig: capture comment text in last_comment (not reset on newlines)
so parser can read directives like `_ # Hole: fill this in`
- parser.zig: hole branches now store directive text from the comment
body contains a hole node with directive instead of being empty
- eval.zig: evalHole() called when situation hits a directive-only _ branch
- builds prompt: directive + subject value + visible bindings + syntax notes
- shells out to `claude -p <prompt>` as subprocess
- strips markdown fences from response
- parses response with parseFilePublic, evaluates all nodes, returns last
- graceful nil fallback if claude not found or parse fails
- Works at REPL time and file evaluation time (both contexts)
Semantics: situation = incomplete code with Holes, case = complete dispatch
20d8541Merge blimp-core/view-dsl: View DSL actors render to DOM, interactive tutorial, mobile playground
Resolved conflict in builtins.zig by keeping both math/util builtins from main
and view primitive registrations from view-dsl. Took view-dsl WASM binaries.
5238c23docs: web framework handoff guide for next session
a23d476Hole: auto re-exec after patch + diff output
After patching the source file, execv() replaces the current process with
a fresh run of the patched file — zero user interaction required.
Diff output shows exactly what changed:
╔═══ Hole filled: file.blimp:42 ══════
║ - _ # Hole: directive text
║ + _ ->
║ + generated line 1
║ + generated line 2
╚═════════════════════════════════════
The full cycle: hit hole → call Claude → print diff → patch file → re-exec.
Second run uses the real implementation, no hole, no Claude call.
f0435a1Typed lists and record types: [Item] and %{key: Type, key: Type}
types.zig: add record_type variant to the Type union
- RecordField struct: {name, ty}
- recordField(name) method for O(n) lookup by field name
- record_type and map are mutually compatible (subtyping both directions)
since records are just typed maps at runtime
- parseTypeName now handles %{key: Type, ...} format (record)
alongside the existing %{K => V} format (homogeneous map)
- parseRecordField helper splits "key: Type" into name + type
parser.zig: %{key: Type, ...} accepted as a type annotation
- detects homogeneous (%{K => V}) vs record (%{key: T}) by presence of =>
- handles multi-line record type annotations with newlines between fields
- trailing comma allowed
checker.zig: lookup() on record type returns specific field type
- if key is a string literal, resolves the declared field type
- lookup(profile: %{name: String}, "name") infers String return
- falls back to Any for non-literal keys or unknown fields
4a847abFix docs and hole prompt: lambdas/filter/reduce/map all exist and work
f9f865fweb server working: escape sequences, auto-spawn actors, file evaluation
- main.zig: file mode now evaluates (was only printing AST); --ast flag for old behavior
- eval.zig: string literals process \r \n \t \\ escape sequences
- eval.zig: actor definitions auto-spawn a singleton + bind actor_ref in env
- value.zig: add ViewNode to typeName() exhaustive switch
- builtins.zig: ArrayListUnmanaged for Zig 0.15 compat in to_html
- .tool-versions: zig 0.15.2
- Makefile: build commands for macOS 26 (zig build runner broken)
- server.blimp: case (not situation) for complete dispatch
b0bef0eweb framework: TCP/HTTP builtins in Zig, server.blimp in Blimp
- tcp_listen/accept/read/write/close builtins (POSIX sockets, native only)
- to_html builtin: renders view_node trees to HTML strings
- Handles all 17 view primitives
- row gets data-row attr for flexbox direction
- button sends: attr becomes data-sends + onclick handler
- HTML-escapes string content
- web/server.blimp: HTTP/1.1 server written entirely in Blimp
- HTTP.Server actor: tcp_listen loop, accept, read, dispatch, respond
- Sessions actor: in-memory session store (map of id -> state)
- Pure render_app(data) -> view_node
- Pure handle_event(data, msg) -> data
- html_page wraps view HTML in a full document with styles + client JS
- Client JS: blimpSend() submits button clicks as form POSTs
- PRG pattern: POST handler -> redirect -> GET
a496725Fix type checker issues, remove --no-type-check escape hatch
types.zig: List → [Any], Map → %{Any=>Any}, ViewNode → Any
Previously these fell through to actor type, causing false errors
checker.zig: length() accepts list, map, tuple, string, nil — any collection
parser.zig: multi-line map literals — skipNewlines() after % and after {
allows %{\n key: val\n} syntax to parse correctly
case/situation as expression on RHS of assignment (x = case foo do...)
builtins.zig: set_at(list, index, value) — list element replacement
main.zig: remove --no-type-check flag entirely, type checker is mandatory
examples: add missing type annotations, use set_at instead of replace_at
683dfb7examples: three nontrivial Hole operator demos
rate_limiter.blimp — adaptive token bucket with missing backoff strategy,
burst abuse detection, and priority request overdraft logic
content_pipeline.blimp — staged moderation pipeline: sanitize → classify →
score → publish/reject. Classification heuristics and scoring edge cases
are holes; the pipeline wiring and decision dispatch are implemented.
game_rules.blimp — tic-tac-toe engine with missing win detection, score
calculation, illegal move handling, and AI opponent move selection.
Good example of domain-specific reasoning Claude can fill in from context.
8acd934Hole source patching: living codebase — holes fill themselves permanently
- lexer.zig: preserve last_comment across newline tokens so parser can read
directive text from the line AFTER the hole token is consumed
- parser.zig: save `_` token's line/col BEFORE advancing (correct loc for patch)
new parseHandlerBodyPublic() allows parsing handler-body statements in holes
- eval.zig: evalHole() now patches the source file after filling in
- finds the hole line by its stored loc
- detects original indentation from that line
- builds replacement: `_ ->\n <generated lines>`
- writes patched source back to disk
- subsequent runs hit the real implementation, not the Hole
- main.zig: set evaluator.source_path from resolved file path
--no-type-check flag to skip type checker for exploratory code
7a33020View DSL: actors render to DOM, interactive tutorial, mobile playground
- view_node JSON serialization in wasm_api.zig (blimp_has_view, blimp_get_view_ptr/len)
- JS DOM renderer maps view primitives to HTML elements
- Buttons send messages back to actors via <- syntax, triggering re-render
- Parser fix: skip newlines inside () argument lists for multi-line view calls
- dom_playground.html: mobile playground with live sim loop, 5-actor coffee shop demo
- tutorial.html: 14-section interactive tutorial from zero to coffee shop, all code blocks runnable
- docs/lang_design/view-engine.md: capabilities document
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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 (207d 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".
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???