Run serve.command once so copied commands include your full project path. Until then, cd to the repo root first or double-click run-ios.command.
Double-click run-ios.command (full build) or run-metro.command (next sessions). On iCloud, scripts sync to /tmp/tessra-mobile automatically.
./run-ios.command
Double-click serve.command or run manually. Port 8877 — opens public landing at /; dev hub at /hub.html.
python3 -m http.server 8877
open http://127.0.0.1:8877/
open http://127.0.0.1:8877/hub.html
open http://127.0.0.1:8777/index.html
open http://127.0.0.1:8877/penrose/versions/v3.3-stable/Penrose%20Mosaic.html
open http://127.0.0.1:8877/penrose/versions/v3-daily-levels/Penrose%20Mosaic.html
open http://127.0.0.1:8877/penrose/versions/v3.1-hidden-order/Penrose%20Mosaic.html
open http://127.0.0.1:8877/penrose/versions/v3.2-soft-atlas/Penrose%20Mosaic.html
open http://127.0.0.1:8877/levels-etalon.html
Level etalon must be served from the repo root (same as serve.command), not penrose/versions/.
npm run ios builds native shell and opens Simulator. Use Metro (expo start --ios) when you only need hot reload.
cd penrose-mobile && npm run ios
cd penrose-mobile && npm run web -- --localhost
cd penrose-mobile && eas build --platform ios --profile production
cd penrose-mobile && npm run build:apk