https://github.com/nsevent/tilt-sim-experiment
A tilt simulator toy for Macbook. Tilt your Mac to change the direction of gravity.
https://github.com/nsevent/tilt-sim-experiment
Last synced: about 2 months ago
JSON representation
A tilt simulator toy for Macbook. Tilt your Mac to change the direction of gravity.
- Host: GitHub
- URL: https://github.com/nsevent/tilt-sim-experiment
- Owner: NSEvent
- License: mit
- Created: 2026-02-21T20:27:26.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-02-21T21:34:00.000Z (4 months ago)
- Last Synced: 2026-02-22T01:23:25.377Z (4 months ago)
- Language: Swift
- Homepage: https://kevintang.xyz
- Size: 5.3 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# TiltSim
A falling-sand game where you physically tilt your MacBook to control gravity.
Built in Swift with zero dependencies. Reads the Apple Silicon accelerometer directly via IOKit to turn your laptop into a particle physics toy.
12 elements (sand, water, lava, gunpowder, acid, ...) interact with each other — fire ignites wood and oil, lava solidifies on water contact, gunpowder chain-explodes, acid dissolves everything. Tilt your MacBook and watch it all flow.
## Quick Start
```bash
git clone https://github.com/NSEvent/tilt-sim-experiment.git
cd tilt-sim-experiment/tilt-sim-claude
make run
```
That's it. `make run` builds and launches the app. Tilt control works automatically on Apple Silicon MacBooks.
> **No MacBook?** The app still works — gravity just always points down.
### Requirements
- macOS 14+ (Sonoma)
- Swift 5.9+ (ships with Xcode or Xcode Command Line Tools)
- Apple Silicon MacBook for tilt control (M1/M2/M3/M4)
## Controls
| Input | Action |
|-------|--------|
| **Left click + drag** | Draw selected element |
| **Right click** (or Ctrl+click) | Erase |
| **Scroll wheel** | Adjust brush size |
| `[` / `]` | Decrease / increase brush size |
| `1`–`9`, `0`, `-`, `=` | Select element |
| `Space` | Pause / resume |
| `D` | Toggle drain mode (particles removed at edges) |
| `Cmd+Delete` | Clear all particles |
## Elements
| Element | Behavior |
|---------|----------|
| **Sand** | Falls, piles up, sinks through liquids |
| **Water** | Flows and spreads laterally |
| **Stone** | Immovable wall (destroyed by acid) |
| **Wood** | Solid, flammable |
| **Fire** | Rises, ignites wood/oil/gunpowder, melts ice |
| **Smoke** | Rises and drifts, fades after 120 ticks |
| **Lava** | Ignites flammable materials, turns to stone on water contact (+ steam) |
| **Oil** | Floats on water, highly flammable |
| **Acid** | Dissolves everything it touches |
| **Steam** | Produced by lava+water, condenses back to water |
| **Ice** | Melted by fire/lava into water |
| **Gunpowder** | Explosive — chain detonation with radius 6, up to 20 chain reactions |
## How the Tilt Works
Apple Silicon MacBooks have a built-in accelerometer (`AppleSPUHIDDevice`). The app reads raw sensor data via IOKit HID, applies exponential moving average smoothing, and maps the tilt angle to one of 8 gravity directions.
The gravity indicator in the top-right corner shows a dot representing the current tilt vector.
No special permissions required — the IOKit HID service is accessible without root.
## How This Was Made
The code in `tilt-sim-claude/` was generated in a single shot by [Claude Code](https://claude.ai/claude-code) (Opus 4.6), using only [`SOURCE.md`](SOURCE.md) as input — a detailed spec describing the simulation rules, element interactions, rendering approach, and accelerometer integration. No manual editing afterward.
## Regenerate It Yourself
The real source code is [`SOURCE.md`](SOURCE.md). The Swift files are just one possible output.
Feed `SOURCE.md` to any AI model and ask it to generate the application:
```
Given this spec, generate a complete macOS Swift Package Manager application.
```
Future models will likely produce a better version than what's here today. The spec encodes the intent; the code is disposable.
For more on this idea, see [Backwards Compatible for Life](https://kevin.md/backwards-compatible-for-life.md) — on why specs and tests outlast implementations.
## Architecture
~1,500 lines of Swift across 10 files. No Xcode project — just Swift Package Manager.
- **Grid**: 320x240 cell grid, each cell stores element type, color offset, lifetime, tick counter
- **Simulation**: 60 ticks/sec fixed timestep. Processes cells bottom-up (flipped when gravity reverses). Random left/right scan order prevents directional bias
- **Rendering**: Direct pixel buffer to `CGImage` with nearest-neighbor scaling. 60fps display timer
- **Accelerometer**: Dedicated thread reading IOKit HID reports, EMA-smoothed (alpha=0.15)
- **UI**: SwiftUI toolbar + AppKit `NSView` canvas. Bresenham line interpolation for smooth brush strokes