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
+700-204 notactuallytreyanastasio/deciduous/main Apr 08 11:28
c06a5da chore: update deciduous tooling to v0.14.0 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+188-51 notactuallytreyanastasio/deciduous/main Apr 08 11:26
236c8c5 release: 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>
+49-12 notactuallytreyanastasio/elixir/add-hole-operator Apr 07 01:04
f24f307 Rewrite 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>
+63-17 notactuallytreyanastasio/elixir/add-hole-operator Apr 07 00:55
2bc621b Add 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>
+20-1 notactuallytreyanastasio/elixir/add-hole-operator Apr 07 00:52
af3498c Strip 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>
+17-4 notactuallytreyanastasio/elixir/add-hole-operator Apr 06 23:58
6996fc6 Filter 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>
+32-1 notactuallytreyanastasio/elixir/add-hole-operator Apr 06 23:45
a63639d Add 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>
+120-38 notactuallytreyanastasio/elixir/add-hole-operator Apr 06 23:15
ce1f489 Enrich 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>
+15719-180 notactuallytreyanastasio/blimp/main Mar 30 18:59
3bbdd09 feat: 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>
ba0e10f feat: 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>
d2b1898 test: 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>
50afcf7 feat: 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>
09b06e5 feat: 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>
17e3527 feat: 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>
6261950 fix: 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>
1f7478c feat: 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>
57205b0 fix: 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>
c57724f fix: 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>
99b1feb feat: 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>
612f934 feat: 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>
d1a3c48 feat: 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>
ef9b0c2 feat: 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>
c51bbe3 feat: 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>
949a13a feat: 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>
6924581 fix: add debug output for WASM load failures
fdc1689 feat: --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>
5e6441d Merge branch 'worktree-agent-a29a62a7' # Conflicts: # chunks/lang/web/server.blimp
8b2911d ship: 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>
0d5030f fix: 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>
b6a40a0 feat: 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>
4ea148c fix: 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>
785a030 feat: 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>
63dac0f feat: 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>
b48d91d fix: 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>
7bebcdc fix: 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>
4c80350 feat: 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>
c77779e feat: 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>
a7c6b52 fix: 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>
396f630 fix: 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>
01ccc98 feat: 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>
16017bb feat: 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>
fc29d3c fix: 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>
26adbc0 feat: <-- 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>
3f4844c fix: 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>
19c0f35 feat: 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>
65988cd feat: 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>
e62b8d4 fix: 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>
6ba6da7 fix: 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>
c884d57 feat: 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>
fca8a7c feat: 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>
bc6b4fb fix: 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>
12b9018 feat: 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>
e1a14b2 feat: 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>
3841a17 feat: 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>
0b96330 fix: 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>
2c7cbee feat: 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>
3b7a55b feat: 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>
a8f8dd9 deploy: 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>
f9ac5f7 feat: 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>
bfeabd0 test: 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>
e0396f2 feat: 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>
54bff04 fix: 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>
eaa72de feat: 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>
da4afa2 feat: 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>
ca21d7e feat: 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>
ca61a07 feat: 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>
bfe8565 fix: 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>
ef1e202 debug: 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>
ad0a059 fix: 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>
fcd258c fix: remove Google Fonts import that blocks page rendering
b85fa45 test: 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>
9526197 feat: 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>
7b23f3a feat: 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>
d364115 Merge branch 'worktree-agent-a34cbc3d' # Conflicts: # chunks/lang/src/builtins.zig # chunks/lang/web/server.blimp
9c6c3a0 feat: 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>
0001b87 fix: 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>
+485-0 notactuallytreyanastasio/lumines-clone/main Mar 28 22:49
738e81b update claude with elixir stuff
+196-11 notactuallytreyanastasio/lumines-clone/main Mar 28 22:45
40b2e58 Merge pull request #2 from notactuallytreyanastasio/liveview-engine Liveview engine
+196-11 notactuallytreyanastasio/lumines-clone/liveview-engine Mar 28 22:43
810967c docs: 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>
eb63143 add decidous db
+1768-0 notactuallytreyanastasio/lumines-clone/main Mar 28 22:41
26a8986 Merge pull request #1 from notactuallytreyanastasio/liveview-engine Lumines game engine + LiveView UI
8bb02d1 feat: implement Lumines engine in Phoenix LiveView with shared CSS - 7 engine modules: Board (sparse map), Piece, Gravity, Scanner, Sweep, Scoring, Game - LiveView at /game with keyboard input and dual timers - Integrated shared CSS design system (lumines-* classes) - 72 ExUnit tests, all passing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+442-44 notactuallytreyanastasio/lumines-clone/liveview-engine Mar 28 22:37
7a1b355 Address PR feedback + add property-based testing - board.ex: replace nested ifs with multi-clause functions using guards - board.ex: use `not is_nil()` instead of `!= nil` - game.ex, piece.ex, sweep.ex, scoring.ex: convert to Ecto embedded_schema - Add 27 property-based tests using stream_data covering: - Board: put/get roundtrip, nil clearing, out-of-bounds, occupied? consistency - Piece: 4-rotation identity, color preservation, 2x2 area, hard_drop validity - Gravity: cell count preservation, color preservation, idempotency, no floating cells - Scanner: only marks valid squares, preserves non-square cells - Sweep: bounds, 16-tick wraparound - Scoring: monotonic score, combo tracking, reset preserves score - Game: valid init, game_over handling, input safety Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
+9346-78 notactuallytreyanastasio/blimp/main Mar 27 23:00
b4ae6b6 finish up some more typing concerns
fb5466b more stuff
33b3690 Hole 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
9c5c74d more chugging along with the hole operator
20d8541 Merge 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.
5238c23 docs: web framework handoff guide for next session
a23d476 Hole: 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.
f0435a1 Typed 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
8acd934 Hole 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
4a847ab Fix docs and hole prompt: lambdas/filter/reduce/map all exist and work
f9f865f web 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
b0bef0e web 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
a496725 Fix 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
683dfb7 examples: 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.
+3119-21 notactuallytreyanastasio/blimp/blimp-core/view-dsl Mar 27 15:52
7a33020 View 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>
+182-24 notactuallytreyanastasio/blimp/main Mar 25 04:26
c557e98 LLVM O3 + native CPU, TCO, LTO, Elm-style compiler errors - O3 + native CPU targeting: Blimp matches/beats C, Rust, Zig - fib(40): 433ms (C: 444ms), btree(25): 162ms, KNN: 160ms - Tail call optimization: recursive def calls annotated, tailcallelim pass - LTO: --lto flag emits bitcode, links with -flto - Rich error messages: title bars, source lines, region underlines, hints - Type checker wired into blimp-compile
17 pushes github.com/notactuallytreyanastasio
phangraphs — Phish 3.0 Jam Analytics
phangraphs
Golden Age
.410
BATTING AVG
34 JC · 83× played
Avg 12.2m · Peak 26:30 · 🎧 55/83
Longest: 26:30
2025-06-27 · Moody Center
Most Loved: 59 likes
2016-10-28 · MGM Grand Garden Arena
📊 95% Set 2 · 33/34 JCs from Set 2
Last: 2026-01-31 (67d ago) · avg every 72d
Best year: 2017 — 2/2 JC
"> in from ""MFMF."" In the Phish debut version, the bulk of the jamming is conta..."
TAP TO SEE AND PLAY JAMS
Golden Age .410
TAP TO FLIP BACK
34 jams
2009-11-27 9:33
Times Union Center · Albany, NY
> in from ""MFMF."" In the Phish debut version, the bulk of the jamming is contained within structure of the song, except for a brief cacophonous outro.
2011-07-02 13:03
Watkins Glen International · Watkins Glen, NY
Staccato funk jam before delays/effects creep in, foreshadowing the "Storage Jam" to come later in the night. > to "Prince Caspian."
2012-06-24 11:13
Blossom Music Center · Cuyahoga Falls, OH
A very good, psychedelic jam including an introspective ambient section in which Trey uses his delays/pedals to great effect. > to "Ghost."
2012-06-30 10:25
Alpine Valley Music Theatre · East Troy, WI
> in from "Wilson." Rhythmic funk held together by a really fun, loose beat from Fish, with a nice -> to "2001" to finish it.
2012-07-03 13:47
Nikon at Jones Beach Theater · Wantagh, NY
-> in from "Sand." There is fantastic interplay between Page and Trey throughout this jam, and Mike also does his part to punctuate the groove. Concludes with a beautiful ambient passage led by Page on the Wurlitzer. A top "GA."
2012-08-25 11:03
Aaron's Amphitheatre at Lakewood · Atlanta, GA
> in from "KDF." Dark, space funk with Mike at the forefront for much of the jam. Mike also plays around with an exotic motif towards the end of the jam. > to "Free."
2012-09-01 13:37
Dick's Sporting Goods Park · Commerce City, CO
The band wastes no time in hooking up on a mid-tempo groove with a slightly mysterious feel at the start of this jam. From there, it gradually gains intensity, and becomes a bit more rocking as Trey quickens his playing. Ends with a > to an exceptional "Prince Caspian." One of the many strong jams from the monumental 2012 Dick's run.
2013-07-03 13:55
Darling's Waterfront Pavilion · Bangor, ME
Laid-back and funky jamming abounds in this one (including a "Manteca" tease). > to "Twist."
2013-07-30 12:57
Lake Tahoe Outdoor Arena at Harveys · Stateline, NV
A pretty locked-in version including funk, rock, and upbeat melodic jamming. > to "46 Days."
2013-10-20 17:10
Hampton Coliseum · Hampton, VA
> in from "Tweezer" as the second half in a pair of phenomenal jams. The usual funk-rock elements are present, but the jam gets taken to another level when it bleeds into an intense, psychedelic ambience. Fishman on Marimba Lumina. > to "Piper."
2013-10-27 16:39
XL Center · Hartford, CT
Ferocious start-to-finish, with magnificent accompaniment by Page, Mike and Fish as Trey solos.
2014-07-18 16:37
FirstMerit Bank Pavilion at Northerly Island · Chicago, IL
Fish keeps this jam in high gear as it alternates between segments of funky and upbeat jamming until a wave of ambient effects are introduced around the 15 minute mark and concludes with a > to "The Mango Song."
2015-08-14 13:13
Walnut Creek Amphitheater · Raleigh, NC
Begins with some bouncy funk work and then builds into a rocking groove. Brief ambient interlude before a > to "Reba".
2015-09-04 15:58
Dick's Sporting Goods Park · Commerce City, CO
An intriguing version which drops into some contemplative space and eventually gains upbeat energy without ever totally taking off.
2016-07-18 12:41
Bill Graham Civic Auditorium · San Francisco, CA
After leaving the song's structure, a darkish groove quickly develops with great direction and intensity until a > to "Twist".
2016-10-28 25:38
MGM Grand Garden Arena · Las Vegas, NV
A multi-section, "Type II" behemoth which covers a lot of ground and peaks twice in the process. > to "Simple". Longest version to date.
2016-12-28 20:48
Madison Square Garden · New York, NY
Coming effortlessly out of the song proper and oozing with wah-funk, the band comes running out of the gates. A thoughtful, almost ambient jam emerges before descending into a Page-led section; Fish consistently building up the percussive attack and Trey doing much the same on guitar. The transitions are seamless throughout, and the end result is a cohesive revelry of celebration. Like 10/28/16, > to "Simple."
2017-07-14 5:43
Huntington Bank Pavilion at Northerly Island · Chicago, IL
Acts as the "meat" of a "Your Pet Cat"/"Golden Age" sandwich, with nifty segues into and out of the aforementioned "YPC".
2017-08-01 20:07
Madison Square Garden · New York, NY
A bit slow to get going, but really takes off when an uptempo groove kicks in around 11:30 with Trey and Page providing leads over the swiftly moving rhythm section. Continues to pick up steam as Trey takes charge with some exciting playing and peaks the jam before it ends with some brief space.
2018-08-05 18:39
Verizon Wireless Amphitheatre at Encore Park · Alpharetta, GA
Begins with a familiar swinging rhythm and Trey playing echoing, organ-like leads before switching to a heavy auto-wah tone. The next segment brings a shift to major and coalesces at 14 minutes when the jam begins its trajectory to a buoyant peak before briefly heading back to the song's riff with added "Reba" whistling/teasing.
2018-09-02 15:25
Dick's Sporting Goods Park · Commerce City, CO
Nice -> from "Tweezer". This jam is funky throughout and brightens into a bouncy, feel-good groove as it comes down the home stretch.
2018-10-19 23:51
Hampton Coliseum · Hampton, VA
Aggressively experimental "anti-bliss" jamming begins with angular grooves and then takes a rare deep dive into the abyss with plentiful space effects and "Shipwreck" quotes. Resurfaces > "Twist".
2018-10-26 17:31
Allstate Arena · Rosemont, IL
> from "Tweezer." The jam embarks on a dynamic ride, traveling from cascading ear candy loops via Trey, to an effect-drenched minor key groove that patiently builds to a rousing peak. The music then cools into chilly ambience before appropriately moving into "Frost."
2020-02-23 17:47
Moon Palace · Quintana Roo, Cancun, Mexico
The second half of a deadly 1-2 punch with "Simple". Immediately moves into a bouncing calypso-y shuffle as Fish takes point and Page goes to work on the clavinet. The jam settles down and gets more funky as Fish taps away on his woodblock, Trey in particular laying down some thick nastiness. They then move into soaring anthemic territory, then as the jam dies away a darker and more unsettling mood takes over thanks to Page's synths and Trey's effects. Trey utilizes a guitar line very similar to Chest Fever to fine effect, much as he did in the 8/3/18 "Carini". Tremendous version.
2021-07-30 11:55
Oak Mountain Amphitheatre · Pelham, AL
Doesn't stray very far from the usual boundaries of "Golden Age", but does make feints towards "Mind Left Body" and features some very fancy rhythmic games from Fishman and lovely piano work from Page before very briefly blooming into major key and settling into "Mountains in the Mist".
2021-10-20 16:21
Matthew Knight Arena · Eugene, OR
> from "Lonely Trip". All four members of the band are locked in from the start; some really nifty and cool playing. At 12:00, the jam takes a serene, light turn which features some beautifully patient playing. Page and Trey enjoy some fun interplay.
2022-02-27 19:35
Moon Palace · Quintana Roo, Cancun, Mexico
A non-stop rollicking groove delivered with an assured confidence, as Mike and Fish set a good pace and Page and Trey fill in all the gaps with tasty detail, then takes a darker turn for the last few minutes before > "Lonely Trip".
2022-05-28 18:36
The Wharf Amphitheater · Orange Beach, AL, US
Takes a little bit of time to get going, but then resolves into a funky and bouncy jam not far away from "YPC", grows in power slowly and steadily, and nicely peaks before heading home. As with the 8/11/21 "BOAF" or 11/23/97 "Gin", finds its pocket and stays in it to very nice effect.
2022-08-12 14:55
Alpine Valley Music Theatre · East Troy, WI
A light and breezy, highly danceable groove is followed by some soul-piercing guitar when Trey gets out in front on the backend.
2023-04-14 17:32
Climate Pledge Arena · Seattle, WA
Tight, airy play hews closely to the song proper for quite some time before Trey calls for improvisational departure. Fish breaks the beat - listen, a bit after the 8:00 mark, for this wonderful moment - before the groove bleeds to become hushed, restrained play, evoking early (as in 60s) psychedelic experimentation. And then... memorable almost for what doesn't happen as opposed to what does, this is Phish at their seemingly effortless best, bathing the base with another dose of the finest in the nation.
2023-08-26 13:15
Broadview Stage at SPAC · Saratoga Springs, NY
A guest appearance and surprising cover selection lead to shimmering play that transcends expectations. Even in the composed section, what the estimable Derek Trucks brings to this special flood recovery benefit performance makes this version, and what follows, must-hear.
2023-10-08 16:25
Bridgestone Arena · Nashville, TN
Standard but quality play breaks for new directions after the 7 minute mark. Ambient synths, Trey's bevy of effects, and big drawn out waves of bass are all anchored by Fish's expert dynamics. The stew grows ever weirder, as a beat switch leads to a bizarre, carnival-esque dissonant passage before collapsing > "The Well". Excellent.
2025-06-27 26:30
Moody Center · Austin, TX
Narrowly surpasses 10/28/16 for the longest version to date, and it's a doozy. Opening with minimalist funk which becomes increasingly reliant on synths and distortions of all shapes and manner, the jam seems to be crawling to a stop around 15:00, but is then resuscitated with a half-time, super-duty march of doom, and carries that same power as it transitions triumphantly to an ecstatic hose-peak finale.
2025-07-13 16:11
North Charleston Coliseum · North Charleston, SC
A spirited, high-energy take that is particularly dominated by Trey and Page's nimble play early on. The syncopated jazz-funk-isms that are familiar to "Golden Age" are particularly tight here and inspired as this feel eventually rides to an anthemic major-key rock out. This then builds to a lovely peak before the "Golden Age" beat barges in to wrap it up.
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???