Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Tired of Block Blast ads? Leaves of Blocks is the privacy-first block puzzle game for iOS with more than twenty unique shapes. Fill rows and columns to clear lines and score. Zero ads. Zero data. Free
GamesSwift · ShellGitHub @timveilOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A Whitman-inspired, privacy-first Block Blast alternative for iOS — zero ads, zero tracking, zero in-app purchases. Playable in English, German, Spanish, French, Japanese, Korean and Dutch.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A Whitman-inspired, privacy-first Block Blast alternative for iOS — zero ads, zero tracking, zero in-app purchases.
Players drag and drop block shapes onto an 8x8 grid to clear lines while the game adapts to their skill level
Intelligent Gameplay
• Smart Difficulty System: Advanced tiered block generation that responds to player skill
• Player Analytics: Comprehensive efficiency metrics and performance tracking
• Solvability Guarantee: Advanced algorithms ensure every puzzle is solvable
• Progressive Challenge: Consequence-based difficulty that maintains engagementRead the full README ↗A Whitman-inspired, privacy-first Block Blast alternative for iOS — zero ads, zero tracking, zero in-app purchases.
Players drag and drop block shapes onto an 8x8 grid to clear lines while the game adapts to their skill level
Website · Play in browser · vs. Block Blast · Support · Instagram · X · Bluesky · Issues
.locales gets the interface, the App Store listing and the screenshots — not just the menusThe app, its App Store listing and its screenshots ship in every locale declared
in .locales. Whitman's verse is the deliberate exception: it is
quoted in the original English on every screen that cites it, because
translating a poem is authoring one.
Which locales ship is declared once in .locales and enforced by
scripts/check-locales.sh, which fails the build
if the string catalog, knownRegions, the screenshot languages and the App
Store metadata disagree. How translations are made and reviewed is written down
in conventions/translation.md.
Built as a privacy-respecting alternative to ad-heavy puzzle games in the same genre. The full pitch — including a try-it-now web build — lives at leavesofblocks.com. The headline:
Zero ads. Zero data collected. Zero in-app purchases. The puzzle is the puzzle.
| Leaves of Blocks | Block Blast | |
|---|---|---|
| Ads | ||
| In-app purchases | ||
| Data collection | ||
| Network required | ||
| Developer |
For the full side-by-side (and a less serious version of the comparison), see leavesofblocks.com/vs.
# Clone the repository
git clone https://github.com/timveil/leaves-of-blocks.git
cd leaves-of-blocks
# Use the interactive development menu (recommended)
./menu.sh
# Or build manually
xcodebuild -project "LeavesOfBlocks.xcodeproj" -scheme "LeavesOfBlocks" build
Or open LeavesOfBlocks.xcodeproj in Xcode and press ⌘+R.
The project includes a comprehensive development menu for streamlined workflow:
./menu.sh
Features:
All utility scripts are organized in the scripts/ directory for advanced users.
@Observable macro with @MainActor isolationLeavesOfBlocks/
├── App/ # Application entry and navigation
├── Views/ # SwiftUI screens and components
│ ├── Components/ # Cross-screen reusable UI
│ ├── Game/ # Board, overlays, game-specific UI
│ ├── History/ # Game history and analytics
│ ├── Statistics/ # Aggregate stats screens
│ ├── Home/, About/, HowToPlay/, Settings/
│ └── ViewModifiers/ # Shared style modifiers
├── Models/ # Game state and Core Data entities
├── Logic/ # Game algorithms, grid analysis, behavior tracking
├── Services/ # Configuration, Core Data, GameKit, gameplay services
├── SpriteKit/ # GameScene, nodes, particle effects
├── Extensions/ # Foundation, SwiftUI, UIKit extensions
├── Resources/ # Themes, Localizable.xcstrings, PrivacyInfo
└── Documentation/ # Coding standards and project docs
scripts/ # Development utilities
├── build.sh # Unified build/test entry point
├── cleanup-project.sh # Comprehensive project cleanup
└── generate_icons.sh # Icon generation and copying
menu.sh # Interactive development menu
Automated builds and testing via GitHub Actions (.github/workflows/ios.yml):
main and pull requestUse the interactive menu for streamlined deployment:
./menu.sh
# Select option 7: Deploy Beta (TestFlight)
# Select option 8: Deploy to App Store
For advanced users, direct Fastlane commands are available.
The Fastlane lanes that talk to App Store Connect (TestFlight, App Store, Game Center) need an API key. Set these env vars (typically in fastlane/.env — see .env.template):
LOCAL_APP_STORE_CONNECT_API_KEY_ID=...
LOCAL_APP_STORE_CONNECT_ISSUER_ID=...
LOCAL_APP_STORE_CONNECT_API_KEY_PATH=/abs/path/to/AuthKey_XXX.p8
The API key role must be App Manager or higher to manage Game Center entries.
bundle install # install fastlane + gems
bundle exec fastlane ios test_api_auth # smoke-test the API key
bundle exec fastlane ios setup_game_center # register Game Center leaderboards & achievements (idempotent)
setup_game_center reads from fastlane/GameCenterConfig.rb and POSTs any missing leaderboard or achievement entries to App Store Connect. Re-run it any time you add or rename entries in that file.
bundle exec fastlane ios preflight # read-only: can a release run right now?
bundle exec fastlane ios beta # TestFlight upload
bundle exec fastlane ios deploy # ship the version the project states
bundle exec fastlane ios deploy_and_submit # deploy and submit for review in one shot
bundle exec fastlane ios deploy version:minor # change train first, then ship
bundle exec fastlane ios submit # submit a previously-uploaded build for review
bundle exec fastlane ios metadata_only # listing changes only (no binary)
bundle exec fastlane ios screenshots_only # screenshots only
deploy and deploy_and_submit regenerate the changelog from your commits, ship the version the project already states, upload, then tag vX.Y.Z, attempt a matching GitHub Release, and move the project on to the next patch for development (best-effort — if gh is unavailable it logs the command to run by hand rather than failing a shipped release). The build number comes from App Store Connect at archive time rather than the project file, so one version string identifies the App Store submission, the tag and the release. For the daily TestFlight loop, beta is enough.
See CLAUDE.md for full lane internals and deployment procedures.
Build-time tuning lives in Services/Configuration/:
AppConfiguration — feature flags, performance constants (e.g. animation frame rate), and runtime flags driven by launch arguments (UI testing, screenshot mode)BuildConfiguration — compile-time DEBUG/RELEASE detectionGameCenterPreference — UserDefaults-backed opt-in toggle (gameCenter.enabled, default false)This project is licensed under the MIT License.
Tim Veil — @timveil