8b92a5fAdd LLVM codegen: compile Blimp expressions to native executables
New blimp-compile target using LLVM 20 C API via Zig's @cImport:
- codegen.zig: AST -> LLVM IR (integers, floats, binary/unary ops, comparisons)
- compile_main.zig: CLI that parses, compiles, emits object, links with cc
- runtime.c: minimal C runtime (blimp_print_int, blimp_print_float)
- build.zig: separate blimp-compile target linking libLLVM, does not affect REPL
Tested: "1 + 2 * 3" compiles to native binary, outputs 7.
REPL continues to work without LLVM dependency.
All 214 Zig tests pass, no regressions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
21f7ed2Add compilation pipeline design document: AST to LLVM IR via C API
Comprehensive design doc covering: Blimp IR (typed SSA), lowering passes
for all constructs (pipes, actors, become, message send, situation/case),
LLVM C API integration from Zig, runtime type representation, actor
runtime architecture (mailbox, scheduler, per-actor arenas), and five
build phases from expressions to WASM.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b4ddbd7Fix last failing tree-sitter pipe test: hole in chained pipe args
61/61 tree-sitter corpus tests now pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
a1fff0dAdd REPL design document: architecture, evaluator, state sidebar, errors
Comprehensive design doc covering the dual-mode REPL (TUI + plain),
expression evaluator, actor runtime, Elm-style errors, multi-line input,
state sidebar, and LiveView integration. Living document.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
463c4aaAdd /repl route: LiveView REPL explorer consuming blimp --introspect JSON
Smalltalk-style: the tool IS the environment. New route inside term_diff
renders Blimp source alongside a structured actor sidebar.
- Blimp module: shells out to blimp binary, parses introspection JSON
- ReplLive: file picker bar, source pane with line numbers and keyword
highlighting, actor sidebar with state fields/types/defaults, handler
signatures with params/return types/guards/bubbles, hole locations
with directives and [Fill] button, hole-fill prompt panel
- Zero warnings, clean compile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0ad5a20Update all .blimp examples with explicit type annotations
Every handler param typed, every handler has a return type,
every state field has Type :: default. Tuple and map return types
used where structurally verifiable. All 12 examples pass the
type checker.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
a52cabdAdd expression evaluator, actor runtime, and REPL
New modules:
- value.zig: runtime Value type (int, float, string, atom, bool, nil, list, tuple, map, hole, actor_instance)
- env.zig: lexically scoped variable environment with allBindings()
- eval.zig: tree-walking interpreter for all expression and actor nodes
- builtins.zig: 9 built-in functions (length, max, min, append, reverse, lookup, put, keys, now)
- errors.zig: Elm-style rich error reporting with source context and hints
Evaluator handles: literals, binary/unary ops, assignments, function calls,
pipes with _ substitution, lists, tuples, maps, dot access, orelse, situation/case
pattern matching, actor definitions, message send (<-), become, reply, guards.
REPL features:
- TUI mode with 75/25 split (REPL left, state sidebar right) when TTY
- Plain mode with parseable output when piped (for LiveView consumption)
- Multi-line input: tracks do/end depth, accumulates until balanced
- State sidebar shows all variables after each evaluation
- Elm-style errors: UNDEFINED VARIABLE, TYPE MISMATCH, DIVISION BY ZERO,
UNKNOWN FUNCTION, NOT AVAILABLE IN REPL, NO MATCHING HANDLER, etc.
Actor semantics: become updates state for next message (not current scope).
214 Zig tests pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b517f52Document type system decisions D10-D12, add open questions Q7-Q8
D10: case keyword for exhaustive matching
D11: explicit types everywhere, no inference
D12: type checker first pass and known limitations
Q7: type aliases / struct definitions needed for nominal types
Q8: map key atom vs string semantics
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3b0e8c6Add zig-out/ to gitignore
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
efb3983Update tree-sitter grammar: case, typed params, return types, tuple/map types
- case_expression and case_branch rules
- handler_param rule with name: Type syntax
- return_type rule with -> Type syntax
- type_name now recursive: [T], {A, B}, %{K => V}
- Updated corpus tests for typed handler syntax
- 56/59 tests pass (3 pre-existing pipe hole/identifier issues)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b566fffAdd case keyword, type checker, and enforce explicit types
- case keyword: exhaustive pattern matching counterpart to situation
Separate case_expr AST node, parseCase mirrors parseSituation
- Type system (types.zig): Type tagged union with structural equality,
subtyping (Int->Float, nil->list/map/actor, hole as wildcard),
tuple {A, B} and map %{K => V} parsing, scoped TypeEnv
- Type checker (checker.zig): validates state defaults, become fields,
handler param types (required), return types vs reply, binary ops
- Handler params now typed: on :charge(payment: Payment) -> Receipt do
- parseTypeName extended for tuple {A, B} and map %{K => V} syntax
100 Zig tests pass, zero warnings.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c375931Rewrite README: showcase all implemented language features
Updated to reflect current state: actors, typed state, pipes, message send,
guards, situations, holes, bubbles, orelse, dot-notation supervision.
Added implementation status section listing what actually parses.
Updated tooling section: diff follower, agent multiplexer, decision graph.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d2e6c5eSync tree-sitter grammar: add actor_name for dot-notation, fix pipe hole tests
- Add actor_name rule supporting dotted names (Shop.Checkout, Shop.Checkout.Tax)
- Update all corpus tests for new actor_name node wrapping upper_identifier
- Add dot-notation actor name corpus tests
- Fix pipe tests to expect (hole) for _ in function call args
- 58/61 tree-sitter tests pass (3 pipe tests pending hole/identifier resolution)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b46d1d6Add --introspect JSON API for REPL sidebar consumption
New introspect.zig module walks AST and outputs structured JSON:
- Every actor with state fields (name, type, default value)
- Every handler signature (params, return type, guard, bubbles)
- Every Hole with location, directive comment, and context
- Guard expressions rendered back to human-readable strings
Usage: blimp file.blimp --introspect
62 introspect tests, all 13 examples produce valid JSON.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
b7b8e8dAdd actor registry: cross-actor type checking, builtins, message send validation
Two-pass checking: pass 1 collects actor state fields and handler
signatures into ActorRegistry, pass 2 type-checks with full cross-actor
knowledge.
- Message sends validated: arg count, arg types, return type resolved
- Dot access resolves actor state field types from registry
- 10 built-in functions typed: length, max, min, remove, append,
lookup, insert, keys, now, validate
- Pipe expression inference threads through right-side calls
- 124 checker tests (24 new: registry, message send, dot access,
builtins, cross-actor integration)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ce1b0a2Merge multiplexer from blimp-termdiff worktree into main
Brings in the agent multiplexer system:
- Agent orchestrator, runner (Claude Code subprocess), workspace
- AgentLive: 2x2 split-pane grid with streaming output per pane
- AgentRunLive: per-run detail view
- AgentComponents: pane rendering, sidebar, prompt bar
- EventProcessor: maps raw runner output to structured blocks
- DiffLive: line selection for diff-to-agent flow
- JS hooks: agent auto-scroll, prompt submit
- Routes: /agents, /agents/:id
- Tests: line_selection, agent_live
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8eff600Add when guards, bubbles() annotation, dot-notation actor names
on :msg(args) when guard bubbles(Strategy) do. Dot-notation
actor names: actor Shop.Checkout do. 38 tree-sitter tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
52d5535Merge pull request #14 from notactuallytreyanastasio/blimp-core/handler-syntax
Add when guards, bubbles(), dot-notation actors
433a23fAdd message send <- and orelse for bubble recovery
actor <- :message(args) for sending. orelse catches bubbles.
Precedence: orelse lowest, then send, then binary ops.
27 Zig tests, 39 tree-sitter.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ce9b27bAdd situation keyword and _ as Hole
Hole is a first-class construct: identity at runtime, agent
directive via comments. situation is ambiguity-aware branching
where Holes are valid. 29 Zig tests, 38 tree-sitter.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c26666fMerge pull request #12 from notactuallytreyanastasio/blimp-core/situation-holes
Add situation keyword and _ as Hole
dc4dca1Add pipe operator |> (#11)
* Add typed state and tree-sitter corpus tests
Typed state syntax: state name: Type :: default
New :: token in lexer, type_name parsing for Int/String/[Item].
Backwards compatible with untyped state.
Tree-sitter corpus: 34 tests across actors, expressions,
collections, statements, and complete programs.
Zig parser: 21 inline tests. All green.
* Add pipe operator |> with left-associative chaining
Pipe parsing at lowest binary precedence. _ placeholder
in pipe calls filled by pipe value. 26 Zig tests, 38 tree-sitter.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9e4556efeat: add Tauri desktop wrapper for term_diff
Bundle Phoenix LiveView as a native macOS app using Tauri v2
and Burrito. Sidecar pattern: Tauri spawns the Burrito binary,
polls localhost:4123 until Phoenix is ready, then navigates
the webview to the LiveView.
- Add Burrito dep and release config (macos_silicon target)
- Configure prod for desktop: port 4123, localhost, auto-start
- Remove force_ssl (desktop runs HTTP)
- Scaffold Tauri v2 project at desktop/src-tauri/
- Rust lifecycle: spawn sidecar on Ready, kill on ExitRequested
- Loading spinner while Phoenix boots
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6d1db3anote that rev-parse is in fact just already plumbing
e5bc1ecAdd 26 LiveView integration tests on real git repos
Every test creates a tmp_dir git repo with commits and working tree
changes, mounts DiffLive pointed at it, and exercises the full flow.
Coverage:
- Navigation: j/k movement, Enter/q focus, Tab toggle, log view
- Stage/unstage: s stages, u unstages, rapid s/u/s/u, s from diff_view,
u on unstaged-only is no-op
- Commit mode: cc with nothing staged (error), cc with staged (editor),
Escape exits, empty message (error), valid message (creates real commit)
- Amend mode: a pre-populates message, shows amend diff, Escape/cancel
exits, submit updates real commit message
- Click to select, follow mode toggle, unknown keys survive,
rapid multi-key sequences don't crash
Also fixes diff parser crash on optional hunk header captures
(nil/empty string from regex groups).
183 total tests, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ea59594Fix amend mode: pre-populate message, show last commit diff
Three bugs fixed:
1. Textarea used value= attribute (ignored by browsers for textarea).
Changed to inner content: <textarea>{@commit.message}</textarea>
2. Amend mode now fetches and displays the diff of the commit being
amended in the right pane (full unified diff with hunks).
3. amend_diff cleared on cancel/escape/complete.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dc4c2d8note that rev-parse is in fact just already plumbing
9116bb9Fix amend mode: pre-populate message, show last commit diff
Three bugs fixed:
1. Textarea used value= attribute (ignored by browsers for textarea).
Changed to inner content: <textarea>{@commit.message}</textarea>
2. Amend mode now fetches and displays the diff of the commit being
amended in the right pane (full unified diff with hunks).
3. amend_diff cleared on cancel/escape/complete.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2f52939Add 26 LiveView integration tests on real git repos
Every test creates a tmp_dir git repo with commits and working tree
changes, mounts DiffLive pointed at it, and exercises the full flow.
Coverage:
- Navigation: j/k movement, Enter/q focus, Tab toggle, log view
- Stage/unstage: s stages, u unstages, rapid s/u/s/u, s from diff_view,
u on unstaged-only is no-op
- Commit mode: cc with nothing staged (error), cc with staged (editor),
Escape exits, empty message (error), valid message (creates real commit)
- Amend mode: a pre-populates message, shows amend diff, Escape/cancel
exits, submit updates real commit message
- Click to select, follow mode toggle, unknown keys survive,
rapid multi-key sequences don't crash
Also fixes diff parser crash on optional hunk header captures
(nil/empty string from regex groups).
183 total tests, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8ba4c79Add blog post: The Construction of Blimp
Second design journal entry walking through the grammar piece by piece.
Covers actors, typed state (Type :: default), Holes as first-class
agent directives, situation for ambiguity-aware branching, bubbles as
supervision actors, no shared memory, and supervisor-as-namespace with
both flat dot-notation and nested forms.
Also updates parser.md with decisions D4-D9 from this session.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2b1f934WIP: Blimp grammar, lexer, parser, and tree-sitter grammar
Zig parser (chunks/lang/src/):
- token.zig: 50+ token types with keyword lookup
- lexer.zig: single-pass lexer, line/col tracking, 9 test blocks
- ast.zig: tagged union AST with 16 node types
- parser.zig: recursive descent with Pratt precedence, 8 test blocks
- main.zig: CLI reads .blimp files, prints S-expression AST
Tree-sitter grammar (chunks/lang/tree-sitter-blimp/):
- grammar.js: actors, state, on/become/reply, expressions
- highlights.scm: syntax highlighting queries
7 example .blimp programs all parse successfully.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
53d7404Riff on human-as-driver in blog post intro
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c0584edAdd blog post: The Construction of Blimp
Second design journal entry walking through the grammar piece by piece.
Covers actors, typed state (Type :: default), Holes as first-class
agent directives, situation for ambiguity-aware branching, bubbles as
supervision actors, no shared memory, and supervisor-as-namespace with
both flat dot-notation and nested forms.
Also updates parser.md with decisions D4-D9 from this session.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3e992e9Fix nav pipeline clobbering refreshed state after stage/unstage
handle_nav_change was using the pre-stage nav, overwriting the
freshly synced nav from refresh_now. Now re-reads socket.assigns.nav
after handle_stage_actions so downstream steps see the real state.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
13d528bConvert CommitState to embedded Ecto schema
Uses Ecto.Enum for phase and mode fields instead of plain @type.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
84b75f5Extract CommitState pure state machine from Navigation
Moves commit workflow (idle->editing->submitting->complete/error) into
its own module with explicit phases. Navigation no longer tracks
commit_mode/amend_mode. Errors shown inline instead of flash messages.
Nothing-staged and no-previous-commit cases blocked at entry.
108 tests, 0 failures, 0 warnings.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d8440d2Migrate Runner from System.cmd to Erlang Port
All git commands now execute via Port.open with :spawn_executable.
Supports expected_exits option for commands like diff --no-index
that return exit code 1 on success. Adds 10s timeout.
Includes first Runner test suite (8 integration tests with tmp_dir).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
16392f7Add --json-schema support for forced structured JSON output
Claude.build_args now accepts :json_schema option, passing
--json-schema flag to claude -p for validated structured output.
Prompt module defines the review schema (summary + annotations array
with file, start_line, end_line, comment, severity enum).
Server's default_caller passes the schema automatically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
61f9a8dSplit Commentary.Types into one type per file
Annotation, ReviewResult, FileCommentary each get their own module
file under commentary/. Updated all alias references.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4a19037Add Elixir/HEEx style rules to CLAUDE.md
Codifies preferences from PR #1 review: HEEx curly brace syntax,
:if/:for attributes, no nested if/case, no Process.sleep in tests,
one type per file, embedded Ecto schemas, supervision patterns.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5a7898aFix Runner stripping leading whitespace from git status output
String.trim() was removing the leading space from porcelain status
lines like " M file.ex", causing Status.parse to fail on files with
only unstaged changes. Changed to String.trim_trailing() to preserve
the significant leading column characters.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9abc7cfFix Commentary.Server supervision and eliminate Process.sleep in tests
Replace async_nolink with start_child + explicit message passing.
Task sends {:review_complete, result} back to GenServer on completion.
Tests use assert_receive instead of Process.sleep for determinism.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f399bd4Modernize HEEx syntax and refactor submit_commit
Replace <%= if/for with :if/:for attributes across all templates.
Replace <%= expr %> with {expr} curly brace syntax throughout.
Break nested if-inside-case in submit_commit into separate functions:
execute_commit, run_git_commit, handle_commit_result.
Fix alias ordering (alphabetical within groups).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
31d07c1Fix cursor drift after stage/unstage with path-based tracking
Navigation.sync_to_files/2 resolves file_index from selected_file
path instead of blindly trusting the index. After refresh, the
cursor stays on the same file even when the list reorders.
Removes ad-hoc selected_file resolution from keydown handler.
The refresh handler now syncs nav to the new file list properly.
6 new tests for sync_to_files covering: path resolution, file
removal, empty list, nil selected_file, list shrink clamping.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8335c10Watch .git/index and refs for stage/commit/branch changes
Watcher was ignoring ALL .git/ paths. Now watches specific git
internal files: index (stage/unstage), refs/ (commits/branches),
HEAD (checkout), MERGE_HEAD/REBASE_HEAD (merge/rebase).
External git operations (staging from another terminal, git hooks)
now trigger UI refresh automatically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
69f47c7Update build-test skill for Elixir project quality cycle
Replaces cargo build/test with mix compile/test/credo pipeline.
Adds TDD reminder, frontmatter metadata, and mix.exs auto-discovery.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
efcdeedFix stale state after stage/unstage: synchronous refresh
After a git stage/unstage command, immediately re-fetch repo state
instead of relying on async send(self(), :refresh). This prevents
the next keypress from seeing stale file states where a just-staged
file still appears as unstaged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2af65dbAdd plumbing_status/1 using diff-index, diff-files, ls-files
New Runner.plumbing_status/1 returns [FileState.t()] directly
from three plumbing commands instead of parsing porcelain output.
Runs alongside the existing status/1 for now.
9 integration tests covering all file states: untracked, staged_new,
unstaged_modified, staged_modified, partial_modified, staged_deleted,
unstaged_deleted, and mixed multi-file scenarios.
157 total tests, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
67f5c13Fix unstage on newly added files
git restore --staged fails on :added files (no prior version to
restore to). Now checks staged_status: :added files use
git rm --cached, :modified files use git restore --staged.
DiffLive passes the file's staged_status from RepoState.
Three new Runner tests covering the exact bug scenario.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4c7302dAdd FileState state machine for git staging lifecycle
Every file is in exactly one state (untracked, staged_new,
unstaged_modified, staged_modified, partial_modified, etc).
Each state returns the correct git command for stage/unstage
via stage_command/1 and unstage_command/1.
DiffLive now derives FileState from the file entry and delegates
to Runner.exec_file_command/2 instead of ad-hoc conditionals.
All Runner errors are logged and surfaced via put_flash.
24 new FileState tests. 142 total, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d152c17Remove LLMChain/CodeReviewer code entirely
Deleting the Ollama-based code reviewer and langchain dependency.
Will revisit AI review via claude -p CLI approach later.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
98faa5aFix s/u keybindings: work from both file_list and diff_view
stage_selected and unstage_selected were restricted to :file_list
focus only. Now they fire from :diff_view too (anywhere a file is
selected). Guards on nil selected_file prevent empty commands.
Log_view/log_detail still no-op (no file context there).
6 new Navigation tests for s/u across focus states.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9c373bcFix amend mode: pre-populate message, show last commit diff
Three bugs fixed:
1. Textarea used value= attribute (ignored by browsers for textarea).
Changed to inner content: <textarea>{@commit.message}</textarea>
2. Amend mode now fetches and displays the diff of the commit being
amended in the right pane (full unified diff with hunks).
3. amend_diff cleared on cancel/escape/complete.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0b8029cnote that rev-parse is in fact just already plumbing
cbc418dAdd 26 LiveView integration tests on real git repos
Every test creates a tmp_dir git repo with commits and working tree
changes, mounts DiffLive pointed at it, and exercises the full flow.
Coverage:
- Navigation: j/k movement, Enter/q focus, Tab toggle, log view
- Stage/unstage: s stages, u unstages, rapid s/u/s/u, s from diff_view,
u on unstaged-only is no-op
- Commit mode: cc with nothing staged (error), cc with staged (editor),
Escape exits, empty message (error), valid message (creates real commit)
- Amend mode: a pre-populates message, shows amend diff, Escape/cancel
exits, submit updates real commit message
- Click to select, follow mode toggle, unknown keys survive,
rapid multi-key sequences don't crash
Also fixes diff parser crash on optional hunk header captures
(nil/empty string from regex groups).
183 total tests, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
a2add80Fix nav pipeline clobbering refreshed state after stage/unstage
handle_nav_change was using the pre-stage nav, overwriting the
freshly synced nav from refresh_now. Now re-reads socket.assigns.nav
after handle_stage_actions so downstream steps see the real state.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
046d9d6Watch .git/index and refs for stage/commit/branch changes
Watcher was ignoring ALL .git/ paths. Now watches specific git
internal files: index (stage/unstage), refs/ (commits/branches),
HEAD (checkout), MERGE_HEAD/REBASE_HEAD (merge/rebase).
External git operations (staging from another terminal, git hooks)
now trigger UI refresh automatically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4d68766Fix stale state after stage/unstage: synchronous refresh
After a git stage/unstage command, immediately re-fetch repo state
instead of relying on async send(self(), :refresh). This prevents
the next keypress from seeing stale file states where a just-staged
file still appears as unstaged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9f8b342Add plumbing_status/1 using diff-index, diff-files, ls-files
New Runner.plumbing_status/1 returns [FileState.t()] directly
from three plumbing commands instead of parsing porcelain output.
Runs alongside the existing status/1 for now.
9 integration tests covering all file states: untracked, staged_new,
unstaged_modified, staged_modified, partial_modified, staged_deleted,
unstaged_deleted, and mixed multi-file scenarios.
157 total tests, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dc37df7Fix s/u keybindings: work from both file_list and diff_view
stage_selected and unstage_selected were restricted to :file_list
focus only. Now they fire from :diff_view too (anywhere a file is
selected). Guards on nil selected_file prevent empty commands.
Log_view/log_detail still no-op (no file context there).
6 new Navigation tests for s/u across focus states.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c6da445Add FileState state machine for git staging lifecycle
Every file is in exactly one state (untracked, staged_new,
unstaged_modified, staged_modified, partial_modified, etc).
Each state returns the correct git command for stage/unstage
via stage_command/1 and unstage_command/1.
DiffLive now derives FileState from the file entry and delegates
to Runner.exec_file_command/2 instead of ad-hoc conditionals.
All Runner errors are logged and surfaced via put_flash.
24 new FileState tests. 142 total, 0 failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8ed2fd4feat: replace tungstenite with hand-rolled WebSocket over raw TCP
tungstenite corrupts internal state when read/write are interleaved
from different threads, even with Mutex protection. Replace it with
a minimal WebSocket implementation (~150 lines) that:
- Does HTTP upgrade handshake byte-by-byte (avoids BufReader read-ahead)
- Uses TcpStream::try_clone() to split into independent read/write halves
- Reader thread owns the read half, writer Mutex holds the write half
- No shared internal framing state — reads and writes are independent
- SHA-1 for the accept key via sha1_smol (only external dep)
Also removes the sleep() debug logging.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9a9b350fix: set read timeout on WS connections for Rust backend
Both server-accepted and client connections now have a 50ms read
timeout. This prevents the recv loop from holding the socket Mutex
indefinitely, allowing send operations to interleave. Without this,
the Rust server couldn't send frames because recv blocked the lock.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3a512b1fix: use dedicated threads for Rust ws operations
Temper's Rust runtime uses a single-threaded task runner. Blocking
ws operations (accept, send, recv) would block the runner and
prevent other async blocks (like readLine) from processing.
Spawn dedicated threads for ws_accept, ws_send, and ws_recv instead
of going through crate::run_async. This lets the WS operations
block independently while other async work continues.
Also adds error logging to ws_recv for debugging.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
561c49afeat: add Python backend for std/ws and std/io terminal size
Wire WebSocket support (wsListen, wsAccept, wsConnect, wsSend, wsRecv,
wsClose) and terminal size detection (terminalColumns, terminalRows)
for the Python backend.
Uses hand-rolled WebSocket over raw TCP (same approach as Rust) with
socket.dup() for read/write split and a dedicated reader thread per
connection. No external dependencies — just stdlib socket, hashlib,
base64, struct, threading.
Terminal size uses shutil.get_terminal_size().
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
936910dfix: guard wsSend against closed WebSocket connections
Check readyState before calling send(), and wrap in try/catch to
prevent synchronous throws from crashing the server when a client
disconnects mid-broadcast.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
73b848dfix: Rust ws support - rename functions, fix visibility and stream types
- Rename support functions to std_ws_* to avoid colliding with
Temper-generated panic stubs (same pattern as std_sleep/std_read_line)
- Change visibility from pub(crate) to pub for cross-crate access
- Accept &dyn WsServerTrait/WsConnectionTrait instead of &WsServer to
work with the Rust backend's interface deref codegen
- Use WsStream enum to handle both WebSocket<TcpStream> (server-accepted)
and WebSocket<MaybeTlsStream<TcpStream>> (client-connected)
- Use temper_core::cast() for downcasting instead of manual as_any chain
- Add .into() for tungstenite 0.26 Message::Text(Utf8Bytes) change
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
e76ab32fix: add ws npm dependency to temper-core package.json
The ws.js support file dynamically imports the 'ws' package, but it
wasn't listed as a dependency. After temper build regenerated the
output, npm install wouldn't install ws, causing wsListen/wsConnect
to fail silently at runtime.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7718c2ffix: spawn OS thread for Rust nextKeypress to avoid blocking async runner
The Rust backend uses a SingleThreadAsyncRunner, so the blocking
crossterm::event::read() call was starving the game tick coroutine.
Spawn a real OS thread for the blocking read and complete the promise
from there, allowing other async tasks to proceed concurrently.
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
03f6b99feat: add std/ws WebSocket module and std/io terminal size detection
Rebased onto do-crimes-to-play-snake: resolved conflicts with std/keyboard,
updated Rust terminal size to use crossterm instead of libc, added ws to
stdSupportNeeders set.
d9f3020fix: channel-based I/O for Rust WebSocket connections
Replace Mutex-shared WebSocket with a dedicated I/O thread per
connection that communicates via mpsc channels. The I/O thread
owns the WebSocket exclusively and polls for both send and recv,
avoiding tungstenite's internal state corruption from concurrent
access. Send is now non-blocking (channel push), recv blocks on
the channel receiver in a spawned thread.
This fixes the ResetWithoutClosingHandshake error that occurred
when the server's recv loop and send loop competed for the socket.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7fceb70test: update snapshots for io.js and keyboard.js in CLI tests
JsRunFileLayoutTest: add io.js and keyboard.js to expected file trees
in both std/ and temper-core/ directories.
ReplTest: allow scheduler call in Lua translation output.
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
9bb8efachore: remove debug logging from Rust ws support
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
769ab8ffix: make all 6 backends run the snake game correctly
Lua:
- Replace temper.TODO stub with cooperative coroutine scheduler
- async {} now compiles to temper.async_launch() (was "TODO")
- LuaTranslator emits temper.run_scheduler() after top-level code
- Non-blocking IO: sleep uses deadline-based promises, readLine uses
stty min 0 time 0 for polling
- Round-robin scheduler drives multiple async blocks cooperatively
Rust:
- Fix missing temper-std dependency in generated Cargo.toml
- Connected functions (stdSleep, stdReadLine) reference temper_std::
paths but bypassed the import-based dependency scan
- RustTranslator now tracks usedSupportFunctionPaths
- RustBackend scans these after translation to inject temper-std dep
with correct features
- Also fixes missing temper_std::init() in generated lib.rs
- Add raw terminal mode for single-keypress input
Java:
- Fix waitUntilTasksComplete() 10-second hard timeout
- Now loops until ForkJoinPool is truly quiescent
- Add raw terminal mode via stty for single-keypress input
C#:
- Update target framework from net6.0 to net8.0 (current LTS)
- Namespace-qualify OrderedDictionary and AsReadOnly in RegexSupport.cs
to avoid conflicts with System.Collections.Generic.OrderedDictionary
introduced in .NET 9+
- Add single-keypress input via Console.ReadKey
Python:
- Add raw terminal mode for single-keypress input via tty/termios
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4d44c8fbe-lua: debug shift operator wrappers
Signed-off-by: Mike Samuel <mikesamuel@gmail.com>
a3fa212specialize lua bitops so we can mask shift distances
Signed-off-by: Mike Samuel <mikesamuel@gmail.com>
70b29eaTokenSourceAdapter works with margin characters
Signed-off-by: Mike Samuel <mikesamuel@gmail.com>
09dfee2remove debug cruft
Signed-off-by: Mike Samuel <mikesamuel@gmail.com>
53e5d99fix test goldens
Signed-off-by: Mike Samuel <mikesamuel@gmail.com>
91cebe8astbuild: Reworked expression inversion for MQ strings
Previously, TokenSourceAdapter assumed brackets, (`{:` ... `:}`)
around statement fragments.
Now we have margin characters that, in a left to right scan, give
enough context.
This reworks *TokenSourceAdapter* to cue off the margin characters
when inverting statements in complex string expressions, and to
differentiate between `~` and `"` margin characters when stripping
incidental whitespace.
It also updates documentation around string expression syntax,
semantics, and whitespace elision.
Signed-off-by: Mike Samuel <mikesamuel@gmail.com>
6d83930Define missing shift and bitwise operators (#375)
Previously, Temper was missing some bit-twiddling operators:
- Shift operators: `<<`, `>>`, and `>>>`.
- Bitwise negation: `~`
- Exclusive or: `^`
In keeping with JavaScript for syntactic choices, this commit defines
these operators with that punctuation.
Unlike JavaScript, our semantics are the same as C-like languages that
do not have undefined behaviour on over/under flow, e.g. Java and C#.
This commit also defines a functional test that exercises these
operators.
Some bugs were flushed out as a result:
- C#'s *System.Text.Convert.ToString* when used to format numbers as
non-decimal, formats as if cast to unsigned: no `-` sign for negative
numbers.
- be-js does not always render *Int64*s as bigints.
- Lua's number formatting ran into trouble with *math.mininteger*
because of the 2's complement fixed point around negation with the
smallest representible integer.
## Caveat
~~Lua, Rust, and C++ do not currently pass.
This commit will remain as part of a draft PR until they do.~~
4d4c3d0fix: simplify readLine to actual line reading across all 6 backends
Address PR review feedback: readLine was doing raw TTY single-keypress
reading instead of actual line reading. This simplifies all backends to
do buffered line input, removes all process-exit calls (System.exit,
process.exit, os.kill, Environment.Exit), fixes the Java
completeExceptionally bug, and reverts the incidental net8.0 bump in
the C# csproj back to net6.0.
The keyboard/keypress functionality will be provided by a separate
std/keyboard module.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
"Intensely melodic, gorgeous, charming version that gets repetitious and nearly t..."
TAP TO SEE AND PLAY JAMS
Simple
.413
TAP TO FLIP BACK
38 jams
★
2010-08-06
15:45
William Randolph Hearst Greek Theatre, University of California, Berkeley · Berkeley, CA
Intensely melodic, gorgeous, charming version that gets repetitious and nearly transcendent.
★
2011-01-01
11:45
Madison Square Garden · New York, NY
Glorious version that, while not departing particularly far from the typical "Simple" structure, does have a unique closing coda-like structure that almost sounds like a new song. Rave reviews from fans.
★
2011-07-01
14:16
Watkins Glen International · Watkins Glen, NY
A straightforward but delicately played "Simple" fades away, leading to 6 minutes of '99-esque space.
★
2012-06-23
9:21
First Niagara Pavilion · Burgettstown, PA
The typical jam breaks into a short dreamy, lightly pulsing abstraction, before settling into extended transition space and > to "Light."
★
2013-07-13
8:43
Merriweather Post Pavilion · Columbia, MD
Much more of a rocking outro jam than the standard with solid Trey who develops a great riff.
★
2013-12-30
10:24
Madison Square Garden · New York, NY
Essentially straightforward, but the outro jam is a little different than the norm, is nicely played, and includes teases of "The Line," "Fuego," and "Magilla" from Page.
★
2014-08-29
21:53
Dick's Sporting Goods Park · Commerce City, CO
The Rhythm Department gets the credit for propelling this jam beyond the standard and into a rocking and increasingly euphoric groove that recalls several standout '96 versions. Then Fish, Page and Mike drive the jam into a funky and rhythmic realm.
★
2015-07-22
14:09
Les Schwab Amphitheater · Bend, OR
The typically joyful "Simple" jam makes a turn to the Dark Side, as Trey leads the band into a stark exploration with a somewhat Pink Floyd-like tone. Listen for Mike's approval bell.
★
2015-08-21
10:15
Watkins Glen International · Watkins Glen, NY
The Magnaball-opening "Simple" wastes no time in getting the festivities underway. After some standard jamming in the typical chord progression, the band opts not to resolve to F and instead stays in B-flat, churning out a fuzzy, pulsating groove led by the rhythm section.
★
2016-09-03
15:47
Dick's Sporting Goods Park · Commerce City, CO
For the second time in three years, the Dick's "Simple" is a real treat. Some great melodic delay work and alien noises from Trey provide a backdrop to interwoven melodies from Page and Mike (who also drops some bombs of approval), and Fish finds a fun marching beat to lead the way.
★
2016-10-22
16:02
Verizon Wireless Amphitheatre at Encore Park · Alpharetta, GA
The first "Simple" of Fall Tour picks up right where Dick's left off. The jam moves to dark but mellow space, and after some probing, Trey finds a magical riff that he just won't let go. By the 11 minute mark, his bandmates have all hopped the gravy train and the gearshift is set for Interstellar Overdrive. Fishman aptly suggests "Saw It Again" in the post-peak decompression, but Trey has other ideas (> "46 Days").
★
2017-07-15
27:10
Huntington Bank Pavilion at Northerly Island · Chicago, IL
A wide-ranging improvisational monster that moves from low-key grooves to powerful heavy rocking to a "Timber (Jerry)"-esque tribal zone to a majestic major-key finale with some lovely Trey trills. Must-hear stuff, no ifs, ands, or buts.
★
2017-08-06
25:26
Madison Square Garden · New York, NY
A multifaceted capstone, assuredly anchoring the final show of the historic Baker's Dozen run. Luxuriating in each movement, the playing morphs from dark, electro-funk, to brighter, swinging, groovy fun, and then to appropriately celebratory hose. The final winding down is a fitting glaze for this big doughnut.
★
2017-09-02
13:46
Dick's Sporting Goods Park · Commerce City, CO
After running through familiar ground, the jam gets rocking, then gradually settles down into some lower intensity grooving, including some nice Page/Trey interplay. Lacking a peak or other point of punctuation, the jam seemingly winds down over several minutes.
★
2018-07-20
14:44
Gorge Amphitheatre · George, WA
Quickly leaves blissful "Simple" jamming behind and steadily gains intensity with a dark undercurrent en route to a rocking peak and then returns to the song's riff to close.
★
2018-07-27
10:36
The Forum · Inglewood, CA
Gets beyond standard "Simple" in a hurry, first taking on a more rocking vibe and then traversing a groove producing themes reminiscent of the Island Tour Roses before spacing out and > "Ghost".
★
2018-10-21
21:05
Hampton Coliseum · Hampton, VA
A creeping late-night stroll accented by a descending progression and mysterious Trey soloing then smoothly transitions to bliss and ignites at minute 17 for a joyous, trill-filled peak before slamming back into "Simple" to end.
★
2019-06-25
19:34
Darling's Waterfront Pavilion · Bangor, ME
The typical outro dissipates into spacious twilight and then very gradually heats up while retaining its late-night feel as Trey's riffs get more rocking en route to a peak. A funky staccato section caps the jam before > "Piper".
★
2020-02-23
15:30
Moon Palace · Quintana Roo, Cancun, Mexico
Departs "Simple" with an "Under Pressure" tease and smoothly coasts through multiple short-lived grooves before another tease ("In-A-Gadda-Da-Vida") sets the table for the final climb.
★
2021-07-28
14:13
Walmart Arkansas Music Pavilion · Rogers, AR
-> out of "DWD". The playing grows delicate at first, then Trey switches to a heavier tone and effects start flying. The jam grows nastier and more atonal, with Fish really going to work, as things get sludgy and strange in a way reminiscent of certain Summer 2003 jams. Resolves into a surprising but superb -> into "Fuego". A real harbinger for "Simple"'s glorious Summer 2021.
★
2021-08-06
24:39
Ruoff Music Center · Noblesville, IN
Why we travel from points far and wide to Noblesville, Indiana. Pick a timestamp. 6.37 finds Trey alighting upon a lovely, carefree vibe. Jump to 10.35, and the band is moving through a passage of gnarly, tripped-up disco funk. 12.45 finds Trey (and listen to Page!) working his pedals like it's 1995. Or something. 15.15 features Trey shearing sound, the band deep in psychedelic play that makes recent Melts blush (the focus / the cohesion). Pick a point and it just might be your favorite .... Before the band, taking a victory lap, returns to simply sing us back home.
★
2021-09-05
8:34
Dick's Sporting Goods Park · Commerce City, CO
Launches a tremendously fun segment and lays down the musical bones that carry through to -> "Catapult", back to "Simple", and later "Meatstick".
★
2021-10-16
12:01
Chase Center · San Francisco, CA
A kaleidoscopic outro of interweaving delay riffs then shifts at 7:00 to a pumped-up syncopated groove, drawing similarities to "Simple's" 1996 heyday.
★
2022-02-26
12:53
Moon Palace · Quintana Roo, Cancun, Mexico
At 7:30 a sweet, easy-going bluesy groove takes hold (think "Spooky") and brings the jam to a close -> "SaSS". Not a style often seen, but wonderfully employed here.
★
2022-04-23
14:48
Madison Square Garden · New York, NY
Initially an upbeat jam that pleasantly bobs along until a switch is flipped around 13:30, launching into a segment of terrifying power and space-age effects -> "Egg in a Hole Jam"
★
2022-04-23
1:25
Madison Square Garden · New York, NY
-> Trey pulls out of the "Egg in a Hole Jam" with a deft return to the "Simple" riff for a triumphant conclusion to a mind-blowing segment.
★
2022-06-01
23:45
Credit One Stadium · Charleston, SC
Multi-faceted shapeshifter cruises through an array of styles ranging from heavenly bliss to industrial funk, eventually ascending to a sizable peak and then briefly returns to "Simple" to close.
★
2022-07-20
14:57
TD Pavilion at the Mann · Philadelphia, PA
> from "Soul Planet." Jam begins in familiar melodic territory...but then the band rips a portal in space and
time, finding themselves back in the psychedelic murk that occupied the previous set's "Split Open and Melt"
jam. Mike and Fishman consistently challenge the rhythm as Page's textural work and Trey's low octave
synth effect punctuate the whole affair. The Phish machine churns into a pulsing, monstrous
polyrhythmic jam that grooves like a mutha and pulls off a nice -> into "Light."
★
2022-08-06
12:42
Atlantic City Beach · Atlantic City, NJ
An "Under Pressure" tease shakes things loose, allowing for a wispy, cyclical jam to take hold, which ratchets up moderately before an eerie alien outro possibly setting up a > "2001" but instead > "BDTNL". Quite a nugget of improvisation.
★
2023-04-17
19:08
William Randolph Hearst Greek Theatre, University of California, Berkeley · Berkeley, CA
-> from another MASSIVE, must-hear Bay Area "Tweezer". The tempo is slow at first, then picks up as effects from multiple band members are toyed with. A change at 11:15 sends the jam to a gloriously rollicking place. The play from Trey is anthemic as the band takes a proverbial victory lap after dropping an hour of seriously impressive improv. The joy from the stage is audible. Things eventually wind down before > "Rock and Roll".
★
2023-08-25
21:51
Broadview Stage at SPAC · Saratoga Springs, NY
-> from an expansive "AWoH". This multi-sectioned journey initially takes off in a minor key and plants its flag there as Trey's looping and Mike's cascading high octave wash apply density and complexity. The grooves grow polyrhythmic before coalescing into a dark, intense, effects-laden attack. A seemingly composed rhythm shift then leads the band towards anthemic territory with fluid Trey playing, before yielding to an extended passage of midnight-dark ambience to close. Fantastic.
★
2023-12-28
14:01
Madison Square Garden · New York, NY
A tale of two "Simples". Providing a great contrast from a notable "Mike's", the band drops quickly into less by way of bebop to traverse more bucolic terrain. A welcome approach, the version rewards repeated listens-given that the extended improvisation is ineffable-before Trey subtly signals a change, leading the band with unusual, restrained soloing that builds but doesn't break.
★
2024-02-24
?
Moon Palace · Quintana Roo, Cancun, Mexico
This show-opener allows the band to stretch their jamming legs with a version that fluidly transitions beyond typical "Simple" and finds a spunky, synth-backed groove over which Trey riffs thematically before a final turn towards bliss and then -> "Sanity".
★
2024-07-27
40:51
Alpine Valley Music Theatre · East Troy, WI
This mammoth jam never drags or seemingly missteps while flowing so well that it may come across as deceivingly simple and stands as one of 2024's most illustrative testaments to the supremely complementary modern-day play style. More notable for the overall journey than individual moments as it reaches out in myriad directions and successfully latches onto practically each one. Longest "Simple" ever.
★
2024-12-28
13:03
Madison Square Garden · New York, NY
Opens the NYE run with a bang right out of the gates with a jam that first plays on the usual "Simple" theme with gusto and then flows directly into a more rhythmic transition segment. From there, the intensity quickly rises to a frenzy and concludes with a celebratory peak before returning home.
★
2025-07-16
13:10
TD Pavilion at the Mann · Philadelphia, PA
From the jump, bouncy summer synth-funk smacks against the walls of the Mann's pavilion as Page's synths sizzle in the hot summer air, before the groove coalesces around the "Macarena", of all things. Suddenly the crowd is transported back to the mid/late 90s as Trey uses the "Macarena" melody as the linchpin of an upbeat groove-fest, before the time portal then finally dissipates and > "Ether Edge".
★
2025-09-20
18:17
Hampton Coliseum · Hampton, VA
At a time when "Simple" seems more comfortable as a supportive piece of a set (7/27/24 notwithstanding) here it serves as the centerpiece of a Saturday Night Special in Hampton. A bubbly and bright exit from the song proper defined by Trey's use of chords and Page's cloud-like Rhodes playing, the jam rolls along in a dream-like space moving from hopeful melodies to creepy Phrygian tones. Coalescing around a snarling, effect-driven riff from Trey around 12min, Page's contrasting baby grand soon elevates the jam towards a more rock-driven peak that latches onto a sustained note from Trey before a choice fade > into a high-energy "A Wave of Hope."
★
2025-09-20
1:50
Hampton Coliseum · Hampton, VA
-> from AWOH. More than a simple return, this coda caps off a thick 40 min of improv that gives way to a notable "Beneath a Sea of Stars part 1".
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???