52c431afix: reset for-loop variable on each iteration in Rust async state machine
Fixes #378
When a `for (var i = 0; ...)` loop is inside a while loop and the for
body contains an `await`, the Rust backend's coroutine-to-state-machine
transformation extracts the variable declaration to a persistent struct
field but drops the initializer from the case body. This means `i = 0`
only runs once (at generator creation), so the inner loop silently
never executes after the first outer iteration.
The fix: don't extract the initializer for ValueLeaf (simple value)
declarations. Extract just the declaration to persistent storage, and
leave the `i = 0` assignment in the state machine case body so it
re-executes every time the case is entered.
Before:
persistent: var i: Int = 0 (runs once)
case body: (nothing)
After:
persistent: var i: Int (declaration only)
case body: i = 0 (runs on each case entry)
This is safe for non-loop declarations too — the assignment just runs
once when the case is entered, same as before.
Minimal reproduction (pure Temper, no deps):
while (outerCount < 3) {
outerCount = outerCount + 1;
for (var i = 0; i < items.length; ++i) {
totalLoopBodyRuns = totalLoopBodyRuns + 1;
await resolved();
}
}
JS (correct): total loop body runs: 9
Rust before: total loop body runs: 3
Rust after: total loop body runs: 9
All existing be-rust and be-js tests pass.
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
48c6bf8fix: reset for-loop variable on each iteration in Rust async state machine
Fixes #378
When a `for (var i = 0; ...)` loop is inside a while loop and the for
body contains an `await`, the Rust backend's coroutine-to-state-machine
transformation extracts the variable declaration to a persistent struct
field but drops the initializer from the case body. This means `i = 0`
only runs once (at generator creation), so the inner loop silently
never executes after the first outer iteration.
The fix: don't extract the initializer for ValueLeaf (simple value)
declarations. Extract just the declaration to persistent storage, and
leave the `i = 0` assignment in the state machine case body so it
re-executes every time the case is entered.
Before:
persistent: var i: Int = 0 (runs once)
case body: (nothing)
After:
persistent: var i: Int (declaration only)
case body: i = 0 (runs on each case entry)
This is safe for non-loop declarations too — the assignment just runs
once when the case is entered, same as before.
Minimal reproduction (pure Temper, no deps):
while (outerCount < 3) {
outerCount = outerCount + 1;
for (var i = 0; i < items.length; ++i) {
totalLoopBodyRuns = totalLoopBodyRuns + 1;
await resolved();
}
}
JS (correct): total loop body runs: 9
Rust before: total loop body runs: 3
Rust after: total loop body runs: 9
All existing be-rust and be-js tests pass.
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
3683385fix: reset for-loop variable on each iteration in Rust async state machine
Fixes #378
When a `for (var i = 0; ...)` loop is inside a while loop and the for
body contains an `await`, the Rust backend's coroutine-to-state-machine
transformation extracts the variable declaration to a persistent struct
field but drops the initializer from the case body. This means `i = 0`
only runs once (at generator creation), so the inner loop silently
never executes after the first outer iteration.
The fix: don't extract the initializer for ValueLeaf (simple value)
declarations. Extract just the declaration to persistent storage, and
leave the `i = 0` assignment in the state machine case body so it
re-executes every time the case is entered.
Before:
persistent: var i: Int = 0 (runs once)
case body: (nothing)
After:
persistent: var i: Int (declaration only)
case body: i = 0 (runs on each case entry)
This is safe for non-loop declarations too — the assignment just runs
once when the case is entered, same as before.
Minimal reproduction (pure Temper, no deps):
while (outerCount < 3) {
outerCount = outerCount + 1;
for (var i = 0; i < items.length; ++i) {
totalLoopBodyRuns = totalLoopBodyRuns + 1;
await resolved();
}
}
JS (correct): total loop body runs: 9
Rust before: total loop body runs: 3
Rust after: total loop body runs: 9
All existing be-rust and be-js tests pass.
Signed-off-by: Robert Grayson <bobbbygrayson+github@gmail.com>
a2270c2fix: reset for-loop variable on each iteration in Rust async state machine
Fixes #378
When a `for (var i = 0; ...)` loop is inside a while loop and the for
body contains an `await`, the Rust backend's coroutine-to-state-machine
transformation extracts the variable declaration to a persistent struct
field but drops the initializer from the case body. This means `i = 0`
only runs once (at generator creation), so the inner loop silently
never executes after the first outer iteration.
The fix: don't extract the initializer for ValueLeaf (simple value)
declarations. Extract just the declaration to persistent storage, and
leave the `i = 0` assignment in the state machine case body so it
re-executes every time the case is entered.
Before:
persistent: var i: Int = 0 (runs once)
case body: (nothing)
After:
persistent: var i: Int (declaration only)
case body: i = 0 (runs on each case entry)
This is safe for non-loop declarations too — the assignment just runs
once when the case is entered, same as before.
Minimal reproduction (pure Temper, no deps):
while (outerCount < 3) {
outerCount = outerCount + 1;
for (var i = 0; i < items.length; ++i) {
totalLoopBodyRuns = totalLoopBodyRuns + 1;
await resolved();
}
}
JS (correct): total loop body runs: 9
Rust before: total loop body runs: 3
Rust after: total loop body runs: 9
All existing be-rust and be-js tests pass.
7de9814fix: nullable string comparison in spectator handshake for Rust backend
The Rust codegen can't compare String? directly to a string literal.
Use `is String` type check first, then compare the narrowed value.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0329d61feat: randomize snake spawn positions with edge buffer
Spawn positions are now PRNG-driven instead of cycling through 4
fixed quarter positions. Each snake gets a random position at least
5 cells from any edge (so it has room to react before hitting a
wall) and a random direction. The seed is mixed with the player
index for deterministic but spread-out placement.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
be3cf48feat: add spectator mode and join/spectate handshake protocol
Clients now send a handshake message on connect:
- "join" → player (spawns a snake)
- "spectate" → spectator (receives frames, no snake)
Server waits for the first message to decide. Spectators get added
to the broadcast list but no PlayerSnake is created. They see the
full board with all players and bots but don't affect the game.
New file: bot/spectate.js — minimal spectator client.
Updated: client sends "join", bot sends "join", spectate sends
"spectate".
Usage:
node bot/spectate.js # watch the game
node bot/spectate.js ws://host:8080 # watch a remote game
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d6f31aafeat: add AI snake bots powered by local LLMs via Ollama
Each bot connects as a regular WebSocket client — the server can't
tell it apart from a human. The bot receives rendered ASCII frames,
strips ANSI escapes, sends the board to a local Ollama model with a
personality-specific system prompt, parses the response for a
direction (u/d/l/r), and sends it to the server.
6 personalities: greedy (chase food), cautious (survive), aggressive
(hunt other snakes), chaotic (unpredictable), hunter (target the
leader), wall_hugger (patrol edges).
Usage:
node bot/snake-bot.js greedy mistral-small
bash bot/swarm.sh llama3.2:3b # launches 4 bots at once
All bots share one model in Ollama (~2GB for 3B params). Each bot
decides every ~1-2s. Between decisions, the snake keeps moving in
its current direction — gives a natural "thinking" feel.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4dc6928feat: bots randomly pick JS, Rust, or Python compiled client
Each AI bot spawns a random compiled Temper client (JS, Rust, or
Python) as a subprocess and controls it by piping directions to
stdin and reading rendered frames from stdout.
The bot wrapper:
1. Picks a random backend (or accepts one as CLI arg)
2. Spawns the compiled client as a child process
3. Reads ASCII frames from the child's stdout
4. Sends frames to Ollama with personality prompt
5. Writes the LLM's chosen direction to the child's stdin
This means each bot is genuinely running a different language's
compiled output — a Rust binary, a Node.js script, or a Python
program — all connecting to the same server via WebSocket.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
11a0d08fix: update compiler branch refs to do-more-crimes-to-play-snake-multiplayer
CI and build instructions now point to the new Temper compiler branch
that includes std/ws (WebSocket) and std/io terminal size detection.
Updates the git clone in the GitHub Actions workflow, the generated
child repo READMEs, and the manual build instructions in README.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
cdcf29ddocs: update bug report with minimal repro on Temper main
Confirmed the for-loop variable reset bug on Temper main (cb8c3d5)
with a pure-Temper reproduction — no std/io, no WebSocket, no
external dependencies. Just PromiseBuilder + await inside a for
loop inside a while loop.
JS: "total loop body runs: 9" — PASS
Rust: "total loop body runs: 3" — FAIL
Root cause: `for (var i = 0; ...)` compiles the init as a struct
field default (runs once at generator creation), not as a
per-iteration assignment in the state machine.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4860666fix: avoid await inside broadcast loop (Rust codegen state machine bug)
The Rust backend's state machine doesn't reset for-loop variables when
the outer loop iterates after an await inside the inner loop. Work
around this by using for-of (forEach) without await for the broadcast,
since wsSend is synchronous in the Rust backend (channel push).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c52a6fcdocs: rewrite bug report referencing only Temper main
Clean report with no references to snake, WebSocket, or multiplayer
code. Minimal reproduction uses only core Temper primitives
(PromiseBuilder, async/await, for loop). Tested on main at cb8c3d5.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8f1bc83docs: detailed report on Rust backend broadcast loop await bug
Documents a codegen bug where for-loop variables inside outer loops
don't reset when the inner loop awaits a synchronously-resolved
Promise. Includes root cause analysis (re-entrant generator.next()
from inline on_ready callbacks), the exact state machine case flow,
evidence from debug logging, the workaround, and scope analysis.
Verified the bug does not reproduce with async-resolved Promises
(sleep(0)) — only with @connected functions that call pb.complete()
synchronously (like wsSend). The JS backend is unaffected.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ca39530docs: add JS, Rust, and Python multiplayer setup instructions
Complete setup and run instructions for all three backends with
server and client commands. Documents mix-and-match interop.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
aaf8625feat: add multiplayer snake over WebSockets
Add networked multiplayer to the snake game. One player starts a server,
others connect as clients, and everybody shares the same board. The
entire multiplayer stack — game logic, protocol, server, client — is
written in Temper and compiles to every backend.
This commit covers the game-side changes. The compiler-side changes
(adding std/ws and terminal size detection to std/io) live on the
`do-more-crimes-to-play-snake-multiplayer` branch in the Temper repo.
## What changed
### Multi-snake game logic (src/snake.temper.md, +437 lines)
New types:
- `PlayerStatus` (sealed): `Alive` / `Dead`
- `PlayerSnake`: id, segments, direction, score, status
- `MultiSnakeGame`: width, height, list of snakes, food, rng, tick count
New functions:
- `newMultiGame(width, height, numPlayers, seed)` — spawns snakes at
spread-out positions around the board (quarters, facing inward)
- `multiTick(game, directions)` — the core multiplayer tick. Handles:
- Per-snake direction changes (rejects opposite)
- Wall collision (per snake)
- Self collision (per snake)
- Head-to-body collision (your head hits another snake's body)
- Head-to-head collision (two snakes move to the same cell — both die)
- Food eating (first alive snake to reach food gets the point)
- Food respawning (avoids all snake segments)
- `multiRender(game)` — renders the board with per-player symbols:
P0: @/o, P1: #/+, P2: $/~, P3: %/=, P4+: &/.
Shows score and alive/dead status per player below the board.
- `changePlayerDirection(game, playerId, dir)` — updates one player
- `isMultiGameOver(game)` — true when <=1 snake alive (2+ players)
- `addPlayer(game, seed)` — adds a snake to a running game
- `removePlayer(game, playerId)` — removes a disconnected player
- `directionToString` / `stringToDirection` — serialization helpers
All single-player code is untouched. The 18 original tests still pass.
### Server (server/server.temper.md)
A WebSocket server using the new `std/ws` module. Architecture:
- Accept loop (async block): listens on port 8080, accepts connections,
calls `addPlayer` to spawn a new snake, then spawns a per-connection
recv loop as another async block
- Per-connection recv loop (async block per player): reads single-char
direction messages (u/d/l/r), calls `changePlayerDirection`
- Game loop (async block): ticks every 200ms, builds the directions
list from current snake states, calls `multiTick`, broadcasts the
rendered frame to all connections via `wsSend`
The board size is calculated from the server's terminal dimensions
minus a 10-character margin on each axis, using the new
`terminalColumns()` and `terminalRows()` from `std/io`.
Players can join at any time. The server handles disconnections
gracefully (the snake just stops getting direction updates and
eventually hits a wall).
### Client (client/client.temper.md)
A WebSocket client that connects to the server. Two async blocks:
- Input loop: reads w/a/s/d via `readLine()`, maps to single-char
direction codes (u/d/l/r), sends via `wsSend`
- Recv loop: receives messages via `wsRecv`, prints them directly
(the server sends fully-rendered frames as plain text)
The client is intentionally dumb. It has no game logic. It sends
keypresses and displays whatever the server sends back.
### Protocol
Deliberately minimal, no parsing required:
- Client → Server: single characters "u", "d", "l", "r"
- Server → Client: complete rendered ASCII frames (the output of
`multiRender`), sent as-is over the WebSocket
No JSON. No message framing. No serialization library. The server
renders the board, sends the string, the client prints it.
### Tests (test/snake_test.temper.md, +13 tests)
New tests covering: multi-game creation, snake count, alive status,
different spawn positions, segment count, both snakes moving on tick,
wall collision killing a snake, game-over detection, direction changes,
opposite direction rejection, addPlayer, removePlayer, render output,
and direction serialization round-trips.
Total: 31 tests (18 single-player + 13 multiplayer). All pass.
## How to play
# Terminal 1: start server
cd temper.out/js && node snake-server/index.js
# Terminal 2: player 1
cd temper.out/js && node snake-client/index.js
# Terminal 3: player 2
cd temper.out/js && node snake-client/index.js
Connect as many players as you want.
## Compiler changes required (separate branch)
The Temper compiler gained a new `std/ws` module with 6 @connected
functions and 2 opaque types, wired for JS (`ws` npm package) and
Rust (`tungstenite` crate). Also `terminalColumns()`/`terminalRows()`
in `std/io`. 13 files changed, 554 insertions. Committed on branch
`do-more-crimes-to-play-snake-multiplayer` in the Temper repo.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d46f2f7docs: detailed report on Rust backend broadcast loop await bug
Documents a codegen bug where for-loop variables inside outer loops
don't reset when the inner loop awaits a synchronously-resolved
Promise. Includes root cause analysis (re-entrant generator.next()
from inline on_ready callbacks), the exact state machine case flow,
evidence from debug logging, the workaround, and scope analysis.
Verified the bug does not reproduce with async-resolved Promises
(sleep(0)) — only with @connected functions that call pb.complete()
synchronously (like wsSend). The JS backend is unaffected.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bbe65f6docs: add JS, Rust, and Python multiplayer setup instructions
Complete setup and run instructions for all three backends with
server and client commands. Documents mix-and-match interop.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1e0cf3cfix: avoid await inside broadcast loop (Rust codegen state machine bug)
The Rust backend's state machine doesn't reset for-loop variables when
the outer loop iterates after an await inside the inner loop. Work
around this by using for-of (forEach) without await for the broadcast,
since wsSend is synchronous in the Rust backend (channel push).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2365282docs: update bug report with minimal repro on Temper main
Confirmed the for-loop variable reset bug on Temper main (cb8c3d5)
with a pure-Temper reproduction — no std/io, no WebSocket, no
external dependencies. Just PromiseBuilder + await inside a for
loop inside a while loop.
JS: "total loop body runs: 9" — PASS
Rust: "total loop body runs: 3" — FAIL
Root cause: `for (var i = 0; ...)` compiles the init as a struct
field default (runs once at generator creation), not as a
per-iteration assignment in the state machine.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
07dec9cdocs: rewrite bug report referencing only Temper main
Clean report with no references to snake, WebSocket, or multiplayer
code. Minimal reproduction uses only core Temper primitives
(PromiseBuilder, async/await, for loop). Tested on main at cb8c3d5.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1fe9a5aAdd Neovim plugin source, build output, and CI workflow
- nvim/: plugin source files (ftdetect, plugin, highlighting logic)
- temper.out/lua/: committed build output for CI testing
- .github/workflows/: CI that runs Lua tests and publishes to
nvim_temper_syntax_highlighter on success
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bc2e9fdfeat: add backend-specific compiler change details to child repo READMEs
Each of the 6 published repos now explains exactly what had to change
in the Temper compiler to make that backend work:
- JS: auto-connected pattern, setTimeout + process.stdin raw mode
- Python: ThreadPoolExecutor futures, tty/termios raw mode
- Lua: cooperative coroutine scheduler, non-blocking IO polling
- Rust: cross-crate FunctionCall paths, dependency detection fix
- C#: native async/await, net8.0 framework, namespace fixes
- Java: CompletableFuture + ForkJoinPool, timeout fix, stty raw mode
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d27a2fdfix: update CI workflow with correct run commands for all backends
- Python: add std to PYTHONPATH, update prereqs to 3.11+
- Java: add run.sh script (installs local Maven deps then runs)
- Java run_cmd in README now points to run.sh instead of incomplete mvn command
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4e085e3fix: 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>
ca3191ctest: add functional test for `std/io` `sleep()` across backends
Adds `control-flow/io-sleep/io-sleep.temper.md` to the functional test
suite, verifying that `sleep()` from `std/io` works correctly:
- Sleep returns and execution continues after `await`
- Multiple sequential sleeps work
- Zero-ms sleep resolves immediately
- Sleep interleaved with computation produces correct results
Uses short delays (5-10ms) to avoid slowing the test suite.
Passes on: JS, Python, Lua, Java 17, C#.
Skipped on Rust (`@Ignore`) because the Rust functional test
infrastructure only links `temper-core`, not `temper-std`, so
`import("std/io")` produces an unresolved crate at cargo build time.
The Rust `sleep` implementation itself works (verified manually via
the snake game with `cargo run`).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8356001docs: add detailed compiler modification context for Rust backend
Explains what was changed in the Temper compiler (commit 0f31c89) to make
this game possible — RustSupportNetwork.kt, RustBackend.kt, and
std/io/support.rs with thread::sleep + PromiseBuilder pattern.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
644acf8docs: add detailed compiler modification context for C# backend
Explains what was changed in the Temper compiler (commit 0f31c89) to make
this game possible — StandardNames.kt, CSharpSupportNetwork.kt,
CSharpBackend.kt, and std/Io/IoSupport.cs with native async Task.Delay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
e647da7docs: add detailed compiler modification context for Python backend
Explains what was changed in the Temper compiler (commit 0f31c89) to make
this game possible — PySupportNetwork.kt and temper_core/__init__.py with
ThreadPoolExecutor-based sleep and Future-based readLine.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
212eed0docs: add detailed compiler modification context for Lua backend
Explains what was changed in the Temper compiler (commit 0f31c89) to make
this game possible — temper-core/init.lua with synchronous blocking sleep,
temper.TODO() async stub, and make_resolved() pattern for await translation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
75a4c9ddocs: add detailed compiler modification context for JavaScript backend
Explains what was changed in the Temper compiler (commit 0f31c89) to make
this game possible — JsSupportNetwork.kt, JsBackend.kt, and temper-core/io.js
with setTimeout-based sleep and raw mode stdin readLine.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
389ab33docs: add detailed compiler modification context for Java backend
Explains what was changed in the Temper compiler (commit 0f31c89) to make
this game possible — StandardNames.kt, JavaSupportNetwork.kt, and Core.java
with ForkJoinPool Thread.sleep + CompletableFuture.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c8c27abdocs: add KNOWN_ISSUES.md for Rust backend dep resolution bug
Documents the temper-std missing dependency issue when multi-module
projects import from std/io in a secondary module.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9218db1feat: real-time keyboard input via two async blocks
Split into 3 pure Temper modules:
- src/ (snake library): pure game logic, types, render, PRNG
- game/ (snake-game runner): two async blocks for stdin input + game loop
- test/ (snake-test): 18 tests, separated to avoid readLine blocking
Game uses w/a/s/d + Enter for direction control. Input loop and game
loop cooperate via shared mutable direction variable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
38e266aFix native test detection: install pytest, use pipefail
Two bugs prevented Python test failures from being caught:
1. pytest was never installed — pip only installed the ORM packages
2. pipe to tee swallowed exit codes — tee always succeeds, masking
the actual test runner exit code
Fixes: add `pip install pytest` before running tests, add
`set -o pipefail` to all native test steps so failures propagate.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
106f24aRun native runtime tests on generated code before publishing
Test matrix now runs both `temper test -b <lang>` AND native tests
(pytest, npm test, cargo test, etc.) against temper.out/<lang>/.
Publish is gated on native test results. Issues auto-opened only
when temper tests pass but native tests fail (codegen bug signal).
Reverts notify-app-template to simple vendor push since all testing
now happens in the top-level alloy repo.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8e45223Add per-backend test gating with auto-issue on failure
- New test matrix job: runs `temper test -b <lang>` for all 6 backends
in parallel (js, py, rust, java, lua, csharp)
- Publish job gated per-backend: only pushes to lib repo if that
backend's tests passed, preventing broken code from cascading
- Auto-opens GitHub issue with test output on failure, comments on
existing issue if one is already open
- Reverts notify-app-template to simple vendor push (testing moved
upstream to avoid PAT requirement for cross-repo issue creation)
- Build job uploads Temper compiler + ORM source as artifacts for
test matrix consumption
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2023-04-17 · William Randolph Hearst Greek Theatre, University of California, Berkeley
♥ Most Loved: 237 likes
2013-07-31 · Lake Tahoe Outdoor Arena at Harveys
📊 80% Set 2 · 65/70 JCs from Set 2
Last: 2025-09-19 (178d ago) · avg every 36d
Best year: 2021 — 7/7 JC
🔥 JC Streak: 2 in a row
""Theme from the Bottom" jam for a bit."
TAP TO SEE AND PLAY JAMS
Tweezer
.419
TAP TO FLIP BACK
70 jams
★
2009-05-31
13:30
Fenway Park · Boston, MA
"Theme from the Bottom" jam for a bit.
★
2009-06-07
17:07
Susquehanna Bank Center · Camden, NJ
The "Camden Tweezer." Old school, repetitive, amazing groove. Like a '92-'94 version.
★
2009-06-19
12:44
Verizon Wireless Music Center · Noblesville, IN
A very good jam eventually segues into a spacey interlude before "2001" kicks in.
★
2009-07-31
12:25
Red Rocks Amphitheatre · Morrison, CO
Diverse, tight, melodic jams.
★
2009-11-25
12:30
Wachovia Center · Philadelphia, PA
Similar to Camden's "Tweezer."
★
2009-12-29
16:34
American Airlines Arena · Miami, FL
"Manteca"-like jam into space.
★
2010-07-03
13:11
Verizon Wireless Amphitheatre at Encore Park · Alpharetta, GA
Reaches a pretty good peak and segues beautifully into "Slave."
★
2010-12-30
18:14
Madison Square Garden · New York, NY
Kind of a mixed bag until this spell-bindingly intricate, spectacular "staccato-esque" improvisation takes over.
★
2011-07-02
11:06
Watkins Glen International · Watkins Glen, NY
Unusually staccato-esque, repetitive jam, with some "elephant-like" noises from Trey thrown in.
★
2011-08-06
12:14
Gorge Amphitheatre · George, WA
Blistering jam, in part, largely Mike-driven, that segues into some serene spacey jamming, that in turn goes into "Caspian" and "Sand" before "Tweezer" returns for a minute.
★
2011-08-12
11:14
Polo Fields, Golden Gate Park · San Francisco, CA
Very well-played, with an excellent peak, and Page grooving on the clavinet as the jam goes spacey.
★
2011-09-03
14:21
Dick's Sporting Goods Park · Commerce City, CO
"Green-Eyed Lady" teases in the intro composed section by Page, and Fish teases the "Golden Age" drum line in what is a magnificently melodic jam that is quite stunning in parts. Brief hints of "Lovelight" and "Jessica." It's excellent from the very start of the jam, too. Must. Fucking. Hear.
★
2011-12-28
12:39
Madison Square Garden · New York, NY
Segues nicely out of "Carini" and features a tight, melodic, soulful jam that dissolves beautifully into "My Friend."
★
2012-08-26
13:17
Verizon Wireless Amphitheatre - Charlotte · Charlotte, NC
Enchanting, even stunningly beautiful, jam to which each band member contributes powerfully. (Listen carefully for Mike's tease of "Cars Trucks Buses" as well.)
★
2012-12-28
20:09
Madison Square Garden · New York, NY
A mesmerizingly incandescent psychedelicious soundscape of elephantine proportion.
★
2013-07-12
12:31
Nikon at Jones Beach Theater · Wantagh, NY
Page drives the jam into an outstanding peak in the final few minutes, and an excellent segue into "Cities" occurs with Fish playing the rhythm of the "Wedge."
★
2013-07-31
36:16
Lake Tahoe Outdoor Arena at Harveys · Stateline, NV
One of the most magnificently focused, sustained, and enchanting improvisations in Phish history, with several discrete sections, and audience participation taboot.
★
2013-10-20
23:46
Hampton Coliseum · Hampton, VA
Exceptional, diverse "type II" action, ending in a mellow, spacey haze.
★
2013-10-27
17:29
XL Center · Hartford, CT
Overrated by your friends, this version captivates with brilliantly melodic soloing by Trey for several minutes, before flaking out a bit, and becoming aimless. (Still worth your while to hear to be sure.)
★
2013-11-02
15:23
Boardwalk Hall · Atlantic City, NJ
Very repetitive, melodic, spirited, funky jam... check. this. OUT!
★
2014-07-13
16:00
Randall's Island · New York, NY
Slow, steady, melodic climb to a triumphant peak, and then an old school ending with a few twists.
★
2014-07-27
4:27
Merriweather Post Pavilion · Columbia, MD
Acting as the improvisational meat of a "Tweezer-fest", the jamming here takes on an uplifting, "TFTB"-esque vibe and then gets wonky and atonal before sliding into "Waiting All Night".
★
2014-12-31
17:07
American Airlines Arena · Miami, FL
Beautifully-interactive melodic jam that soars for quite awhile!
★
2015-08-01
26:01
Aaron's Amphitheatre at Lakewood · Atlanta, GA
The longest version since Tahoe is gorgeous, in part, but does meh-ander now and then, despite a section where Trey repeats a "Born On The Bayou"-esque riff, and despite the final few minutes where the jam picks up momentum before petering-out with a loop'ed noise from Trey's guitar.
★
2015-08-07
19:17
Blossom Music Center · Cuyahoga Falls, OH
Spectacular improvisation that traverses titillating terrain before mellifluously mellowing into "Lizards."
★
2015-08-09
14:17
Alpine Valley Music Theatre · East Troy, WI
Textural, repetitive improv eventually morphs into major key bliss, as Trey repeats a catchy melodic theme and the band reach a glorious peak before the jam dissolves into Dirt.
★
2015-08-22
17:36
Watkins Glen International · Watkins Glen, NY
Fierce, punchy version that soars from the get-go, with Trey employing killer effects. The jam then plateaus, and then launches into melodic, major key mode for a while before dissolving into Caspian.
★
2016-01-02
22:26
Madison Square Garden · New York, NY
With thrilling, melodic contributions from each band member, this version requires repeated listenings to fully appreciate, and peaks wondrously well.
★
2016-09-02
16:57
Dick's Sporting Goods Park · Commerce City, CO
Great intro with Trey using a wah pedal to create a cool swelling effect and the jam builds to a coordinated peak with piercing guitar and pounding drums before > to "Jim".
★
2016-10-19
16:47
Ascend Amphitheater · Nashville, TN
Funky, powerful start transitions to a melodic plateau with soaring improv.
★
2016-12-30
16:40
Madison Square Garden · New York, NY
The jam slowly, patiently builds before (similar to 10/19/16) plateauing mellifluously, exploding triumphantly, and seguing into "Sparks" (after Trey arguably teases "Midnight Rider" for a measure or two!).
★
2017-12-30
19:31
Madison Square Garden · New York, NY
Key modulates a few mins into the jam, and a bright, effortlessly soaring groove transpires. Excellent interplay by the band as well, including as the jam mightily peaks before they return to the theme and conclude it old school.
★
2018-08-03
16:26
Verizon Wireless Amphitheatre at Encore Park · Alpharetta, GA
Effect-heavy improv with layers of sounds eventually climbs, and builds, soaring to a blissful, thematic peak before grooving to an albeit brief return to the "Tweezer" theme.
★
2018-09-02
14:27
Dick's Sporting Goods Park · Commerce City, CO
An atypical (very improvisational) intro that heads into the jam segment about a minute early is just the start of a melodically-blessed version in which each band member is inspired and contributes mightily to a stellar version with heavy Manteca teases into Golden Age.
★
2018-10-20
18:40
Hampton Coliseum · Hampton, VA
Punchy from the start, this version cooks for several minutes before a major-key improvisation occurs, in which Trey hoses everyone down mellifluously. The jam then segues smoothly into a spacey, divinely-melodic interlude, and a patient, steady build transpires, eventually reaching a spectacular peak. The improv then dramatically melts down, but instead of concluding, the jam surprisingly shoots skyward to a second powerful-but-fleeting peak, before "Dirt" abruptly begins.
★
2018-10-26
20:13
Allstate Arena · Rosemont, IL
The band, like one organism, seemingly processes varying properties of a periodic waveform, or signals that contain vital information, to be shared with some other, astral, life forms. Trey shines, but all four clearly articulate, or inform the several structures, or forms of this "Tweezer's" many "pieces," which, so sutured, create a sonic sort of euphoria (the audience reactions are truly memorable).
★
2018-12-29
19:52
Madison Square Garden · New York, NY
First section features an extended, fiery jam that is akin to "I Know You Rider" (Grateful Dead) before funkily dissolving into "Death Don't Hurt Very Long."
★
2018-12-29
7:36
Madison Square Garden · New York, NY
Second section is melodic, patient, and mystical, and includes a smooth transition to "No Quarter."
★
2019-12-30
2:26
Madison Square Garden · New York, NY
Punches out of "Steam" and soars triumphantly, hearkening back to the peak of the set's opening version, before seguing into "Ruby Waves."
★
2019-12-30
35:33
Madison Square Garden · New York, NY
Symphonic in scope, this version features a host of strikingly disparate sections with tempo and key and harmonic and melodic changes galore. Inarguably among the most sublime masterpieces of improvisation in Phish's illustrious history.
★
2021-08-01
33:50
Ameris Bank Amphitheatre · Alpharetta, GA
Among the most magnificent versions in Phish history, this one's improvisation traverses a host of gloriously bedazzling galaxies that are, at times, as mind-expandingly thrilling as they are soulful and divine.
★
2021-08-13
22:22
Atlantic City Beach · Atlantic City, NJ
Soulful, soaring soloing by Trey with fierce accompaniment, this second-set-opening version arguably stays "Type I" but still delivers. Oh, if every 20 min version could pay off like this.
★
2021-09-01
34:00
Shoreline Amphitheatre · Mountain View, CA
Yet another exploratory "type II" adventure, this version's jam goes all over the globe, with segments that at times seem to have vigorous "Manteca" and "Jingo-Va" themes, and even "Lizards" and "Dave's Energy Guide" teasing and a cacphonous "Split Open and Melt" jam, that are separated by a mellow, spacey-but-mellifluous and playful, improvisation. Best listened to, closely, with headphones.
★
2021-10-24
6:16
The Forum · Inglewood, CA
It's not every day that Tweezer features a full-blown jam on another song, so this version gets charted simply for its uniqueness, segueing into "L.A. Woman" only about eight measures after the start of the jam segment (don't miss the tease of "Walk This Way" at the end of the composed opening section too).
★
2021-10-24
7:21
The Forum · Inglewood, CA
This version (which completes formation of this set's Tweezer "sandwich") begins the way any other version would though launches quickly into a jam that grooves along for a few minutes, jazziliciously yet with some melodic loops, before dissolving into a mellifluous haze, a serene code from which Birds erupts.
★
2021-10-29
19:34
MGM Grand Garden Arena · Las Vegas, NV
After beginning ordinarily enough, the jam eventually takes-on a Trey-led melodic theme reminiscent of "hose" improvisation, yet the "type I" form is maintained in a compellingly fierce manner. This theme-jam takes over four minutes to begin peaking, soaring, in a dizzyingly beautiful fashion, and then Trey turns on the syrupy envelope-filter effect, and Mike begins playing lead fucking bass, with fantastic accompaniment from Page, who then begins soloing a bit over this incredible groove being laid down by Mike, Trey and Fish around 16 mins in. Spine-tinglingly cool, repetitive, grooving takes over, and Trey begins soloing melodically o'er it before Fish returns to Tweezer's drum line, and the jam dissolves away as Trey nearly teases "Lifeboy" before Bitch begins. It's a safe bet that if this sick improv doesn't move you, then 4.0 Phish is not for you.
★
2021-10-29
3:59
MGM Grand Garden Arena · Las Vegas, NV
After Sand peaks and "goes type II," Trey leads the full-band back into Tweezer at 11:53 of the Sand (LivePhish timing; fwiw the fact that this isn't tracked on LivePhish explains why Phish.net does not rely on LP tracking for setlist purposes---it can be demonstrably, objectively, Wrong). This renewed Tweezer jam cooks for many minutes before the key modulates in "type II" fashion and the groove melodically soars anew, with a wondrously smooth segue into Sigma Oasis.
★
2022-02-24
21:37
Moon Palace · Quintana Roo, Cancun, Mexico
It's no wonder that a version that explores a variety of fantastic universes includes soaring improv heavily teasing "Lizards" for a spell.
★
2022-04-21
13:58
Madison Square Garden · New York, NY
Although "average-lengthed" among all versions e'er performed, this gem-of-a-version shines, with the first few minutes of the jam featuring steady, intermittent, "Your Pet Cat"-esque chording and comping by Trey, and a melodically charming/glittering section during which Trey sustains a note for many measures (a modest peak) over excellent accompaniment (that's never dark), before the version concludes atypically with a single chord from Trey that is sustained into the first note > of "2001."
★
2022-04-21
1:43
Madison Square Garden · New York, NY
Your Pet "Tweezer" returns, buzzing, if not quite purring, for a few more minutes.
★
2022-05-29
22:13
The Wharf Amphitheater · Orange Beach, AL, US
Jam is fairly straightforward for the first few minutes, but then there's a key modulation (type II activity afoot) and a funkaliciously melodic bridge of sorts occurs, before Page hops on the synth and Trey deploys some echoflex and then envelope filter effects. Soon melodic tension builds--slllowwwly though--courtesy of Page Mike and Trey, until there's a massive Floyd-esque echoplextastic dissonant sustained release/peak, of sorts. OF SORTS. Make no mistake: communities of ALIENS were contacted during this jam.
★
2022-07-31
18:50
Merriweather Post Pavilion · Columbia, MD
Straightforward jam until 9:15, when the key modulates and an "All Along The Watchtower"-esque progression takes shape (an ajamakinto "Watchtower," but no musical quote of its melody so no tease). They jam on this "Watchtower" progression for many measures, going "type II" to an extent in the process though Fish returns briefly within it here and there to "Tweezer's" drum line. Then there's another key modulation and Trey begins soloing melodically o'ertop beautiful accompaniment from Page, Mike and Fish. This improv eventually gels around an enchanting theme before the key modulates yet again and a steady, dark, heavy "type II" jam ensues. Fish soon brings back "Tweezer's" drum line, and Trey Mike and Fish briefly to "Tweezer's" melodic line and comping, as this jam fizzles out and "Wingsuit" begins after sustain.
★
2023-04-17
43:37
William Randolph Hearst Greek Theatre, University of California, Berkeley · Berkeley, CA
Continuing along its 30 year trajectory of functioning as a great excuse to jam, the Greek Tweezer is another historic version that not only overflows with ideas in showcasing the band's commitment to excellence, but also swells and soars with (at times) wonderfully weird improvisation, brimming with dynamic reverence for proximity to the burning shore.
★
2023-07-15
29:14
Ameris Bank Amphitheatre · Alpharetta, GA
Phish's 2023 "Tweezer" rampage continues with yet another monster version from Alpharetta. Stutter-step delay grooves, kaleidoscopic psych-bliss, and big-boned muscular funk form this delightfully hearty stew before a heroic, guitar-laden hard rock strut brings it all home. ->"Golden Age".
★
2023-07-23
27:32
St. Joseph's Health Amphitheater at Lakeview · Syracuse, NY
Begins with a brief major tangent but then reverts to a typically rocking "Tweezer" jam, albeit in a different key, then finds its footing again with a segment anchored by Trey's off-kilter, cyclical lead. From there, it builds more conventionally until the main riff returns, seemingly to bring things to a close, but the band really makes a meal out of this denouement by running through different permutations of the "Tweezer" theme, reintroducing Trey's mid-jam riff, and closing with a Moog-ified final volley, then -> "Oblivion".
★
2023-08-05
5:19
Madison Square Garden · New York, NY
Opening composed section and early part of the jam segment before Mike begins "Guy Forget."
★
2023-08-05
0:46
Madison Square Garden · New York, NY
"Type II" improv continues after the "Guy Forget" silliness ends, sounding absolutely nothing like "Tweezer" for several minutes (and then only Fish temporarily returns to "Tweezer's" drum line for a few measures). Collective "full-band" improv at its finest, with each band member complementing each other so well the improv at times sounds like it could have been composed, even as it soars through several key modulations and time signatures. Yet another masterful version, providing further evidence that "Tweezer" is Phish's most consistently wondrous jam-vehicle since 2009.
★
2023-10-13
15:55
United Center · Chicago, IL
> from "Waves". In a rare spot as the third song in the second set, this (relatively) compact version packs a big punch. The band locks into the jam quickly and seamlessly. Around 11:20, Trey weaves back to the Tweezer riff, giving off this version might be incredibly compact. Instead, he pivots on a dime to a life-affirming major key jam. > into a fierce "Crosseyed".
★
2024-04-18
25:22
Sphere · Las Vegas, NV
> from "Sand." As if the band wasn't going to drop a huge version of "Tweezer" at the Sphere. A fun and bouncy jam becomes triumphant around 17:00 with an incendiary Trey peak. Immediately afterward, things slow down and the "Tweezer" riff emerges. What follows is must-hear as the band has an extended outro, staying within the bounds of "Tweezer" until it has been fully deconstructed. The deconstruction eventually -> into "My Friend, My Friend."
★
2024-07-30
41:06
Chaifetz Arena, Saint Louis University · St. Louis, MO
Another massive entry in the (almost) 40 min club spends ample time mining deep crevices, discovering diverse bits of melodic beauty, and exploring riff laden spaces, before Trey and the band finally lock onto an ecstatic progression that takes the band through a series of peaks so gorgeous and gratuitous, the stunned crowd responds with a full minute and a half of ravenous applause
★
2024-08-09
24:08
Bethel Woods Center for the Arts · Bethel, NY
Like a labyrinthine Hall of Mirrors, this "Tweezer" shifts through several
moods and themes in impressionistic fashion. Fishman's cerebral, yet
grounded grooving keeps the ship afloat as the band modulates between
locked-in funk, abrasive dissonance, nearly rudderless psychedelia and
finally a super catchy, Allman Brothers-inflected country rock section that
turns anthemic. This then resolves back to the "Tweezer" theme and > a
powerful "Pillow Jets".
★
2024-08-09
2:49
Bethel Woods Center for the Arts · Bethel, NY
-> from "Pillow Jets," Trey and Fish work their way into a snappy, musical and inventive "Tweezer" segment featuring rather cool contributions from Mike and Page. Fish is just fantastic and clearly having a blast, while Trey does his thing. A bit by way of noise drops; Trey strums; and the band -> into just what you'd want: "Piper." // Part "Piper" and "song-"outro, a return to the iconic "Tweezer" riff unquestionably caps this incendiary Summer 24 segment.
★
2024-08-17
19:30
The Woodlands · Dover, DE
The second of a potent 1-2-3 punch, this "Tweezer" initially stews
in layered psychedelic funk fitting for its festival setting, before shifting
towards eruptive, celebratory rock. Mike's seismic bass bombs provide a
platform for Trey's pumped-up blues rock heroics, before a return
to the "Tweezer" theme signals a denouement, dissolving into scratchy
guitar loops and > "Scents and Subtle Sounds".
★
2025-04-23
30:35
Bill Graham Civic Auditorium · San Francisco, CA
In contrast to some of the other monsters of recent years, this version stays tethered to "Tweezer" (or something close to it) for an extended period before it gradually peels away, but even while the jam remains within arm's reach of home, the play is fresh and engaging. From there the band embarks on an adventurous journey marked by constant evolution which flows remarkably well, making every new section feel like an organic extension of the same piece, all without relying on any of the well-worn paths one might expect a jam of this length to indulge in. And while this dynamic does not lend itself to a singular peak, the jam is ripe with recurring motifs and themes despite its freewheeling nature, perhaps culminating around 24:30 with Trey's long sustained note over a "MLB"-esque descent. > "Lonely Trip" to end this exhilarating ride.
★
2025-06-22
21:06
SNHU Arena · Manchester, NH
The first leg of a three-part "Tweezer" begins with a playful, bouncy groove buoyed by chunky bass and chugs along in an easy-going manner until briefly slowing as it transitions back to minor for more typical "Tweezer" riffing. After 12:45 the jamming steadily gains traction with a new direction as an excellent rocking theme is developed and driven home with great aplomb until it dissolves > "Mercury".
★
2025-06-22
7:44
SNHU Arena · Manchester, NH
> from a strong "Mercury" as the second leg of a three-part "Tweezer" bonanza. This section is largely "Type I" but with plenty of synthy flourishes and adds in a splash of ambience in the finals minutes before > "Pillow Jets".
★
2025-06-22
13:05
SNHU Arena · Manchester, NH
Slowly emerges > from "Pillow Jets" for the third and final time in a "Tweezer"-dominated set, and is quickly reduced to an eerie hush. Creepy effects are gradually added to the mix as the off-kilter energy builds until eventually Fish kicks back in and the riff returns to usher in a climactic finale, after which it dwindles in the old-fashioned way to put a capper on a collective 42 minutes of "Tweezer" action.
★
2025-07-13
29:47
North Charleston Coliseum · North Charleston, SC
Leaves the station after a bit of funk, coalescing around a spacey synth section over which Trey solos melodically. The jam then seems poised to return home at 15:00, but relaunches with more rugged riffing before eventually closing strongly with a celebratory peak and the reemergence of the "Tweezer" riff which unravels -> "Ghost".
★
2025-09-19
27:58
Hampton Coliseum · Hampton, VA
More than anything, this jam is defined by the wall of loops Trey builds from around 11-16min wherein the band executes one of the most unique peaks of the year. It's dimly lit as Mike roots everything through ominous playing, but the combo of wild loops and synths on top gives the impression of contained madness akin to the HAL 9000 systematically betraying the Discovery One. Moving from the peak of the jam, the back half is fairly standard in nature but accentuated by each member giving it their all. Perhaps not the most transgressive music you've heard from The Phish From Vermont, but the A for Effort is real here. Closing with a shreddy, psychedelic, 2.0 style peak, we return to the "Tweezer" riff on a high before fading > into a perfectly placed "Ruby Waves."
★
2025-09-19
5:05
Hampton Coliseum · Hampton, VA
Returns > from "NMINML" with plucky synth-funk which transitions to a more calming, upbeat vibe before concluding > "Waste".
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???