Highrise Heist
How to play

1. Click stands to place blocks (up to 3 on 2 stands)

2. Transfer — hold a stand to start transfer, tap destination

3. Completing — stand with 11 blocks is complete. Top group color = owner

Golden stand breaks 5:5 ties

Close 6+ stands out of 10 to win

Detailed rules — Rules tab
Mods:

Online

Play with a friend via link — no registration

Or enter friend's code:

QR — open on phone

Scan to play on mobile

💬 Global Chat
Connecting…
Login to participate

Live games

Failed to load — tap Refresh

Home/Changelog
Open development · weekly updates

Changelog

Every change to the platform — public. Security, features, fixes — without embellishment or marketing.

47
releases
298
changes
v5.10.0
2d ago
DISTRIBUTION
Security23
New121
Improved83
Fixed43
Performance9
Refactor4
47 releases
Latest
01
v5.10.02d agoLink

Pre-game menu, background music & English by default

NewPre-game screen: opening the “Play” tab no longer drops you straight onto the board — you get a menu with the scene background, the game logo and New Game / Settings / City Style buttons. Take in the background, listen to the music, pick a style, then start. Online, daily challenge and tournaments still start immediately.
NewBackground music: every scene has its own dynamic track. It plays in the pre-game menu and while you switch themes (change the theme and both the background and the music change). During a match the music gently fades out so it never covers the sound effects — like the satisfying tower completion.
NewIn-game audio: procedural sound effects for placing a block, transferring, completing a stand, winning and losing. On iOS the audio is audible even with the silent switch on.
NewThe app now defaults to English. Your language choice is remembered if you switch it manually.
FixedFixed Russian text leaking into the English UI: the scoreboard (Player), the result screen (Moves, Rematch, Switch side, Play again), online, replays, timer settings, the error screen and dozens more — added 175 missing translations and closed hardcoded strings across 19 screens.
ImprovedEmojis across the UI were replaced with clean vector SVG icons in one consistent style. Buttons and sections look more premium and less cluttered.
ImprovedFull support for every orientation on iPhone and iPad (portrait and landscape) — as required by the App Store for universal apps.
ImprovedApp icon is now the raccoon mascot instead of the text logo.
02
v5.9.243w agoLink

Reward security, iOS stability & responsive polish

SecurityReward anti-cheat: AI difficulty is locked by a signed token before the game starts, rewarded ads are verified server-side (Google SSV), and daily-mission progress is granted only by the server from verified actions. Difficulty spoofing and reward farming are closed.
SecurityUpdated the ws networking package to 8.21.0 (DoS + memory-leak fixes); full dependency audit — 0 known vulnerabilities. Added SECURITY.md, CONTRIBUTING.md and an audit document.
FixediOS: fixed an app crash on launch — ad init triggered the App Tracking Transparency prompt without the required Info.plist key. iOS ads now initialize only when AdMob is configured.
FixedAndroid: restored the release build — a missing release {} block in build.gradle broke R8 minification. Signed AAB and APK build again.
FixedThe game result panel in landscape on phones no longer clips the “Play again”/“Rematch” buttons — scroll and safe-area padding (notch / home indicator) added.
FixedToasts (day streak, achievements, cookie banner) no longer slip under the notch / Dynamic Island or the home indicator — screen safe areas are respected.
ImprovedAccessibility: 9 modal dialogs (share, tutorial, shortcuts, rating and more) got proper screen-reader semantics — role="dialog", aria-modal and labels. Icon buttons are labeled, decorative icons hidden from narration.
ImprovedResponsive polish: touch targets bumped to 44px (Apple/Google guidelines), long names in the scoreboard truncate cleanly, board chips use a “brick” shape on mobile, modals no longer clip in landscape.
ImprovedBuild quality & stability: blocking test-coverage gate + blocking typecheck in CI, +28 new unit tests (806 passing). Reproducible dependency installs (npm ci).
03
v5.9.232mo agoLink

Customization Rework Part 2 + Snappy Block + Style Twin + Premium Blocks

NewSnappy Block: if you and your opponent have identical blocks in an online match, the mascot quips "Change your blocks!" 1.5 seconds after the start. 5 RU/EN phrases for the skin_collision event.
ImproveddetectSkinCollision compares blocks (new key) and chipStyle (legacy) — ignores stands and background. Backward compat between old and new clients.
ImprovedTrigger at both match start points: findMatch (rated matchmaking) and join (private room).
NewAchievement "Style Twin" — for your first online match with identical blocks. Rare, diamond colour. Progress shown in the profile.
Improvedusers.style_twin_count column added by migration 15. Incremented for both players when detectSkinCollision fires (if players are logged in).
ImprovedstyleTwinCount now returned in the profile API via formatUser/formatPublicUser.
NewPremium Blocks legendary tier: 4 new block skins — Gold (800 bricks), Diamond (1200), Holographic (1500), Galaxy (2000). Long-term grind targets.
ImprovedCSS gradients with 5 stops + inset highlight + outer glow — premium material feel. Server catalogue updated via INSERT OR IGNORE, no DB migration needed.
ImprovedDB migration 14: refunds bricks to anyone who bought paid stand skins (after the Stands tab was removed from UI). Transactions recorded in brick_transactions with reason="refund_skin:stands_*".
NewUnit tests for detectSkinCollision: 20+ cases (positive, negative, edge cases with null/undefined/empty, realistic classic-vs-classic scenarios). Regression guard for Snappy Block.
ImproveddetectSkinCollision extracted into server/skin-helpers.js — single source of truth, no duplicate inside ws.js (DRY).
ImprovedWhat's New list updated to v5.9.23 — describes all 6 key changes from this and the previous session.
04
v5.9.222mo agoLink

Customization Rework Part 1 + Edge Swipe + Victory City

ImprovedThemes and Backgrounds merged into a single entity: pick a theme — the background applies automatically. Every theme has a linkedBgId. Preview now shows the theme together with the background.
NewThemes expanded: "Sunny Day in Park" (Light + day background) and "Night City" (Dark + night) — both free. Others cost bricks.
ImprovedBackgrounds tab removed from SkinShop — it's now part of Themes.
ImprovedStands tab removed from SkinShop — stands had no gameplay logic. Previously purchased stands keep applying via legacy settings.standStyle.
ImprovedGame header reshuffled: mode toggle (Online/AI/2P) is now centered, Settings and City Style sit to the right of New Game.
NewGameModeBar — dedicated component for switching game modes with clear icons.
NewGameActionsTop — Settings (⚙) and City Style (🎨) on a single row, to the right of New Game.
ImprovedVictory City: ground colour shifts with time of day (green in the morning, orange at sunset, deep blue at night).
NewSnappy now shows up in Victory City — comments on achievements.
ImprovedSnappy variant 'anchored' — mascot pinned to a corner when shown on Victory City so it doesn't cover towers.
NewSwipe from the left edge of the screen returns to the previous section (Game → Profile → Online → Lobby etc). Works both in browser and in the native app.
FixedApp.jsx: typo removEventListener → removeEventListener (was causing a dangling listener on unmount).
FixedProfileAnalytics: hour/minute and win/loss labels localised in Russian (ч/м, П/П instead of h/m, W/L).
ImprovedMobileGameBar turned into a null stub (deadcode cleanup) — functionality long since moved to GameActionsTop/Bottom.
05
v5.9.212mo agoLink

Android release pipeline + security hardening + observability

NewAndroid: release signing and AAB workflow for Play Store. Keystore via GitHub Secrets, signed AAB builds on demand in Actions.
NewAndroid: auto-sync of versionCode/versionName from package.json to build.gradle. No more editing versions in two places.
NewAndroid: if google-services.json is configured in Firebase Console, FCM push enables automatically from secret.
ImprovedAndroid: ProGuard rules for Capacitor, WebView JS bridge, Cordova plugins and Google Ads (minification temporarily off — will re-enable after logcat testing).
ImprovedAndroid: AAB bundle splits by density/language/abi — smaller install size for users installing via Play.
ImprovedAndroid: NN weights (.bin) not compressed in APK — WebView maps them directly instead of unpacking to memory.
SecurityMinimum password length raised from 6 to 8 chars (NIST 800-63B). Applies to new registrations only — existing accounts unaffected.
SecurityAdMob IDs moved from hardcoded placeholders to env vars. Production pulls from GH Secrets, dev uses Google test IDs.
NewSentry integration (optional): stack traces with source maps, breadcrumbs, replay on error, release tracking. Activates via VITE_SENTRY_DSN, without DSN the existing /api/error-report keeps working.
NewSnappy analytics: each mascot phrase reveal tracked with event/pose/lang — admin sees which lines land best, prevents spam.
FixedCI: fixed broken yaml syntax in deploy.yml that prevented the entire deploy workflow from parsing on GitHub Actions — site was not updating on push. secrets.X moved to job-level env.
FixedCI: sync-android-version is idempotent — does not fail if versions already in sync.
FixedCI: release-android.yml — same secrets.X fix in if-conditions via env.HAS_FCM/HAS_ADMOB.
06
v5.9.202mo agoLink

Asphalt noticeably lighter + emissive glow

ImprovedAsphalt lighter still: #30303a -> #4a4a55. Added emissive 0x0a0a12 @0.6 - asphalt is visible even far from lamps.
ImprovedBlock quartals lighter #1a1a22 -> #28282f to avoid blending with the new brighter asphalt.
ImprovedSidewalks lighter still #7a7570 -> #9a9590. Contrast sidewalk (light-gray) / asphalt (gray) / blocks (dark-gray) now 3 clearly distinguishable tones.
ImprovedAsphalt: roughness 0.9 -> 0.75, metalness 0.1 -> 0.15 - reflects light a bit more, gets brighter highlights from lamps.
07
v5.9.192mo agoLink

Beefed roads: contrast and visibility

ImprovedAsphalt lighter: #1a1a22 -> #30303a. Roads now clearly stand out against the black ground instead of blending in.
ImprovedSidewalks lighter (#4a4540 -> #7a7570) and taller (0.08 -> 0.12m). Curbs read as clear stripes along each street.
ImprovedYellow markings brighter (#ffcc40 -> #ffdd50) and thicker (0.05 -> 0.08). White dashes pure white (#e0e0e0 -> #ffffff) and thicker (0.04 -> 0.06).
ImprovedCars larger (front 0.5 -> 0.9, back 0.4 -> 0.75) and brighter (red #ff2040 -> #ff3050 opacity 0.9 -> 1.0). Headlights read from far away.
ImprovedCamera is lower (dist * 0.55 -> 0.42) and further (0.7 -> 0.75). Roads occupy more of the frame, buildings don't dominate the top.
ImprovedGround and background darker (#05050a -> #02020a). Reinforces contrast with the brightened roads.
08
v5.9.182mo agoLink

Fix building caps and intersection markings

FixedRemoved the "brick" artifacts on tops of intermediate floors. Previously every floor's BoxGeometry top/bottom used the coloured capMat, so the top of each middle floor was visible at isometric angle as a coloured brick. Now the coloured top cap is drawn only on the very top floor; the rest use a dark internalCapMat for top/bottom.
FixedRoad markings no longer cross through intersections. Yellow double line and white dashes are now segmented — separate strips of length SPACING − (ROAD_WIDTH + 2·SIDEWALK_WIDTH) between adjacent intersections, with no markings over the crossings themselves, matching real-world streets.
ImprovedWhite dashes rarer (dashLen 0.5→0.6, gap 0.4→0.8) — less "fence" effect. Yellow double slightly wider (offset 0.06→0.07).
09
v5.9.172mo agoLink

NY-style: real roads, sidewalks, traffic lights

NewFull street infrastructure redesign for realistic NYC night city. Roads now look like real streets, not slabs or cyber-lines.
NewRoads: dark-grey asphalt #1a1a22 without textures (no mipmap aliasing). Markings as separate meshes on top: yellow double centerline #ffcc40 + white dashed lane edges (dash 0.5 / gap 0.4). Like real NYC streets.
NewSidewalks: raised BoxGeometry curbs 0.08m height on both sides of each road. Beige #4a4540 (warm concrete). Real geometric curbs visible by separate height, not texture.
NewTraffic lights at every internal intersection (4 on 5x4 grid). Pole + box + 3 spheres (different phases: green 3s -> yellow 1s -> red 3s = 7s cycle). Each works independently with seeded phase.
NewBlock-quartals: each building stands on its own "block" plane between roads. Clear geometric structure like real cities.
ImprovedNeons reduced: 55% -> 30% buildings, vertical signs removed (that was Asian style, not NY). Coloured wall lighting still works via PointLight.
FixedRemoved: cyber-lines (off-style), smoke over golden buildings (distracting), roof beacons (excess), plaza-slab (replaced with structure of blocks+roads+sidewalks).
10
v5.9.162mo agoLink

Cyber streets: thin neon lines

FixedIn v5.9.15 we removed the 8 road-stripe rectangles to kill the “tile” effect, but roads then became invisible. The city looked like it was standing on an empty black slab.
NewAdded cyber-streets: thin cyan lines (#00d4ff) 0.3m wide with AdditiveBlending. Placed between rows of buildings and along columns — read like hi-tech tracks in Tron/Cyberpunk style.
ImprovedLine width is only 0.3 units vs 2.4 of the old stripes — too thin to create a “tile” feel or mipmap aliasing.
ImprovedLines slowly pulse (opacity 0.4 ± 0.1) for a living effect. Compatible with the PointLight system — lamps and neons still light the slab as before.
11
v5.9.152mo agoLink

Roads → single plaza slab

FixedPreviously roads were rendered as 8 separate stripe rectangles (rows+1 horizontal + cols+1 vertical) crossing into intersections. That created the “tile border” effect around the city. Now it is one large plane slab under the whole city (like a real urban plaza or parking lot).
ImprovedThe slab uses MeshStandardMaterial (was MeshBasicMaterial) — real light from lamps/neons now falls on the asphalt as round bright spots. Lamp intensity 2.5 → 3.0 for crisp light pools.
ImprovedFar ground around the slab is darker (#070710 → #040408) and matte — dissolves into fog and stops competing with the city.
ImprovedCars are kept — they drive along virtual lanes between rows of buildings (no visual road planes). The yellow/red moving dots read as headlights/tail lights on a shared parking plaza.
12
v5.9.142mo agoLink

Wow pack 3: real lights + traffic

FixedRemoved light puddles under lamps. They produced light "plates" on asphalt like a border around the city — that was perceived as "bad roads". Asphalt lighting is now a real PointLight, not a texture.
NewEach street lamp now has a real THREE.PointLight (warm-orange, intensity 2.5, range 14m). The light actually falls on building walls, the ground, and other objects — this creates a proper night atmosphere.
NewLamps enlarged: height 3m → 4m, bulb 0.16 → 0.28, halo 1.8 → 3.5. In previous versions they were microscopic at the isometric angle.
NewNeon signs enlarged: 1.7×0.5 → 2.4×0.8 for horizontal. Added vertical signs 0.7×2.5 (Tokyo/Hong Kong style). Neon frequency 40% → 55%.
NewEach neon now has a matching-colour PointLight attached (intensity 1.8, range 5m). Pink neon lights the wall pink, cyan cyan, and so on. This is the main wow effect — buildings come alive, colours blend.
NewCar lights on streets! 10 cars move along roads — each is a pair of sprites (yellow headlights ahead + red tail lights behind) with additive blending. Different speeds, directions, lane offsets. On perimeter exit — wraps around.
ImprovedScene lighting rebuilt for real night: sun 0.9 → 0.55 with cool moon colour #aab0d8, ambient 0.5 → 0.35 with bluish #3040a0, exposure 1.2 → 1.35. Low ambient lets colored accents shine through brighter.
ImprovedGround made nearly black (#0a0a16 → #070710). Fog tightened (40→140 → 28→110) — distant buildings softly dissolve into mist. 500 stars instead of 400.
13
v5.9.132mo agoLink

Wow pack 2: lamps and neons

ImprovedRoad rewritten as a calm dark background: #0e0e16 asphalt, light grain, one barely visible centerline. No thick curbs, no double markings. The road no longer dominates — lamps and buildings are now the focus.
FixedCrosswalks fully removed. At this isometric angle and scale they looked like bright plates, destroying the wow effect.
NewNew: 6 street lamps. Each is a thin 3m cylinder pole, sphere bulb on top, warm halo sprite (128×128 with lens-flare rays, additive blending) and a large light puddle on the asphalt (4×4 plane with orange radial gradient). This is what delivers real night-city vibe.
NewNeon signs on ~40% of buildings (except golden ones). 6 colours (pink, cyan, green, orange, purple, yellow), deterministically placed on a random wall face at 35-70% building height. Additive blending + sinusoidal flicker + random glitch drops.
ImprovedGround darker (#0a0a16 instead of #16162a) for stronger contrast with glowing buildings and light puddles. Scene fog also darker #05050c.
ImprovedMore stars on the sky: 300 → 400. Sun intensity and ambient lowered so emissive elements (lamps, windows, neons) come through stronger.
14
v5.9.122mo agoLink

Roads are dark again

FixedAfter v5.9.11 the asphalt looked like light-grey concrete slabs in screenshots. Root cause: too many thin details in the texture (sidewalk tile 0.5px, cracks 0.8px, edge lines 1px) — at distance mipmap averaged them into a light tone together with white markings and light curbs. Result: roads appeared grey instead of dark-blue asphalt.
ImprovedRoad canvas size 256×256 → 512×512. Mipmap starts from a more detailed base — less blurring at distance.
ImprovedAsphalt is now flat-dark #12121c (was vertical gradient with edges 0x0c→0x1c). Previously those dark edge bands turned into LIGHT bands during downsampling (contrast flip).
ImprovedCurb-sidewalks widened 5px → 16px. Thick enough not to disappear under mipmap, color #252532 (dark grey, not concrete). Added a black separator line #08080f between curb and road surface — crisp contour.
ImprovedMarkings beefed up: thickness 2 → 4px, dash length 24 → 48px, gap 28 → 40px. Larger segments = each dash stays black-and-white instead of blending into grey.
ImprovedAnisotropy 8 → 4. Removed: sidewalk tile, cracks, edge lines, vertical asphalt gradient. Grain made chunkier (1.2–3.7px instead of 0.3–1.7px) and moved outside curb zones.
15
v5.9.112mo agoLink

Wow-upgrade for Landing 3D visuals

ImprovedLanding page building facades now use canvas textures with windows drawn directly on walls. Previously they were flat cubes with small sprite-windows overlaid via InstancedMesh + AdditiveBlending. Now each window is part of the material map+emissiveMap: 3×3 grid per floor, random states off (15%) / dim (25%) / bright (60%), frames, mullions, gradient highlights, reflection on dark glass. The scene immediately looks like actual night skyscrapers instead of painted boxes.
NewAdded moon in the sky corner: 10×10 sprite with halo, 4 craters and terminator (phase). AdditiveBlending — moon softly glows through fog.
NewAdded zebra crosswalks at 4 road intersections. Texture with transparent background, 12px stripes with 8px gaps.
ImprovedNew shared textures in victoryCityTextures.js: makeFacadeTexture, makeCrosswalkTexture, makeMoonTexture. Available for use in VictoryCity.jsx in future iterations.
ImprovedRoad is more detailed: 1400 grain particles instead of 900, 3 small cracks added, sidewalk tile pattern (seams every 20px), anisotropy raised 4 → 8.
ImprovedStar above golden highrises now has 4 sparkle rays (horizontal + vertical + two diagonals), achieving proper lens-flare effect.
16
v5.9.102mo agoLink

Landing: roads in the preview city also fixed

FixedThe Victory City 3D preview on the landing page (highriseheist.com) also had the yellow-gold roads issue — LandingCity3D had its own copy of texture factories with bright yellow #ffe14a markings and emissive glow. The component now uses the same shared textures from victoryCityTextures.js as the real profile city.
RefactorRemoved 3 local duplicated texture functions (makeRoadTexture / makeStarTexture / makeSoftDotTexture) from LandingCity3D.jsx. They are now imported from shared victoryCityTextures.js. Minus 82 lines (701 → 618).
FixedRoad material — MeshStandardMaterial with yellow emissive 0xffe14a replaced by MeshBasicMaterial. Texture rotated 90° via rotation+center, markings now run ALONG the road instead of across (this component orients its plane lengthwise along Y/V, unlike VictoryCity).
17
v5.9.92mo agoLink

VictoryCity: roads stop going gold at sunset

FixedRoads stop turning yellow-gold under the warm directional light. Material switched from MeshStandardMaterial to MeshBasicMaterial — the texture now renders as-is, without being tinted by sun 0xfff0c8 + ACES tone mapping. Building shadows are still visible on the ground plane underneath.
ImprovedLane markings softened: color #b8b8c8 → #8a8a96, dash length 32px → 22px, gap 22 → 30, thickness 2 → 1.5 px. Curb edge lines dimmed further. The markings no longer dominate the frame under isometric perspective.
18
v5.9.82mo agoLink

Victory City: cleaner roads and stars

ImprovedRoad texture in the 3D Victory City fully rebuilt. It used to be a narrow 16×256 strip with near-white dashes — on the night scene it turned into a washed-out light-purple "mattress" with yellow dash blobs brighter than the buildings themselves. Now it is a 256×256 tile = 6 m of road: dark asphalt with subtle grain, thin grey sidewalk curbs on the edges, double white dashed centerline, and lane edge lines. Roads now read as roads, not as a light source.
ImprovedCrown star texture above golden highrises redone. Used to be a large yellow blob with an orange outline and heavy glow that dominated the frame and hid the building silhouette. Now a compact white 5-pointed star on a soft warm halo with a center highlight. The accent stays, but stops fighting the spires.
FixedRoad material: color 0x222230 → 0xffffff. Previously the texture was multiplied by dark grey and lost contrast; now texture colors render correctly.
19
v5.9.72mo agoLink

Lint cleanup: 0 errors, 0 unused-vars

RefactorCleared all 17 no-unused-vars warnings across the project (9 files: Game, GameHighlightReel, GoldenRushLeaderboard, Online, Changelog, SeasonPass, Profile, server/server.js, server/routes/games.js). Dead functions and vars removed, unused destructuring replaced with [ , setter], dormant startDaily renamed to _startDaily.
RefactorRemoved the obsolete // eslint-disable-line comment from Profile.jsx — the rule no longer triggers after the useEffect deps cleanup.
ImprovedCI lint gate now passes with 0 errors and 0 no-unused-vars warnings. The remaining 55 warnings are all react-hooks / react-refresh and need a separate architectural refactor — they do not block the build.
20
v5.9.62mo agoLink

Golden Rush: admin panel, tutorial, rate limit

NewNew Golden Rush tab in /admin: live rooms with online indicators, matchmaking queue, top-10 players, last 20 matches, plus a playtest summary (resign-rate, draws, center captures, avg turns, avg duration). Auto-refreshes every 10s.
New4-step tutorial overlay on first visit to /goldenrush-online: the 9-stand cross, order-gate (close 1 before 2), FIFO queue for the center, scoring and rewards. Saves a flag stolbiki_gr_tutorial_seen. Can be replayed from the lobby via the «How to play» button.
SecurityPer-user rate limit on gr.findMatch: at most once every 2s. Protects the queue from client bugs or intentional spam. The client shows «too many requests, wait a moment».
ImprovedfindMatchLastAt is cleaned up in cleanupGoldenRush every 2 minutes to prevent the Map from growing indefinitely.
21
v5.9.52mo agoLink

Golden Rush: leaderboard + rewards in UI

NewNew “GR Top” tab (/goldenrush-top) — leaderboards by wins / games / center captures, your personal stats (games, wins, win-rate, centers) and a feed of recent matches
NewGR Online gameover screen now shows the earned bricks with a breakdown: participation (+2), win (+10), center capture (+3)
NewUses the already-shipped server endpoints: GET /api/gr/leaderboard, /api/gr/my, /api/gr/recent
FixedAppRoutes.jsx: MoreTabPage received undefined instead of onShowSkinShop (typo onSkinShop) — the native “More” tab could not open the skin shop
ImproveduseGoldenRushWS now exposes resignedBy and myReward from the gameover payload so components can show the resigner and the reward breakdown
22
v5.9.42mo agoLink

Golden Rush Online: edge case fixes + monitoring

FixedGR Online: client no longer tries to reconnect to a deleted room after gameover (used to show a false error banner 5+ minutes later)
FixedGR Online: auto-reconnect is now strict to playing/queued statuses. gr.error: no_room on a dead room is ignored silently
New20+ server-side unit tests for validateAction: structural checks, transfer cap, placement (too_many_stands, bad_idx/count, over_cap, over_max, closed stand), combined transfer+placement with post-transfer state check
NewAdmin endpoint GET /api/admin/golden-rush: live rooms with turn counters, player online status, lastActivity; matchmaking queue with waitTime
NewGR block in /api/health and /api/stats: {rooms, queue, activeGames} for real-time load monitoring
Improved/api/admin/overview and /api/admin/server now expose GR stats alongside 2p metrics
23
v5.9.32mo agoLink

Golden Rush Online: 2v2 and 4-FFA over the internet

NewGolden Rush Online: online matches for 4 players with matchmaking. Tab /goldenrush-online. Modes 2v2 and 4-FFA, teams in 2v2 are across the diagonal (slots 0+2 vs 1+3)
NewServer-authority logic: the server validates every move via validateAction (transfer cap, placement max stands/count/order-gate, current player, game over) — engine cannot be faked on the client
NewMatchmaking waits for 4 players of the same mode, randomizes seating. Queue shows position and a cancel button
NewTeam chat in 2v2: messages are visible only to your teammate. Reactions (👍 🔥 💪 🎉) visible to all
NewResign button: in FFA disables the player and gives victory to whoever has the most points; in 2v2 — win goes to the opposing team
NewAuto-reconnect: on connection drop the client auto-reconnects after 2s and restores state. Server keeps the room for 2 minutes after full disconnect
NewEphemeral reactions: emojis float at the bottom of the board and disappear after 2.5s. Team chat keeps the last 20 messages
Improved2-player infrastructure untouched — grRooms and grMatchQueue are kept separately from rooms/matchQueue. Legacy ranked matches and AlphaZero AI v7 work as before
ImprovedWS connection is shared between all modes (dispatched by type.startsWith('gr.')). No separate connection for online Golden Rush
ImprovedGR Online menu entry with a NEW badge in the site header
24
v5.9.22mo agoLink

Golden Rush — playable hot-seat version

NewGolden Rush is playable! Hot-seat on a single device: 4 players take turns, 4-FFA or 2v2 modes. Tab /goldenrush
NewNew goldenRushEngine.js with generic N-player board, FIFO queue for the center, transfer/placement validation with cap rules
New20+ unit tests for the engine: topology, effective cap, order=1/2 closure gates, eligibleForCenter FIFO, scoring (+1 block, +5/+8 order, +15 center, 2v2 team bonus), game over, turn rotation
NewSVG cross UI: slot-owner markers, order 1/2 numbers, chips stacked bottom-up, flags on closed stands, golden glow around the center when there are eligible players
NewLobby with mode selector and editable player names. Scoreboard highlights the current player and shows eligible-queue position for the center
NewAction panel: counter mode for placement (tap a stand — 1→2→3→0 blocks), two-phase transfer (pick-src → pick-dst), reset and commit buttons
ImprovedGameOver screen: winner name or team for FFA/2v2, final scores, new game button
ImprovedHot-seat code is fully decoupled: base server/game-engine.js and AlphaZero AI v7 untouched, 2p play works exactly as before
25
v5.9.12mo agoLink

Announcing Golden Rush — new 4-player mode

NewGolden Rush: new 4-player mode. 9 stands form a cross, 2 stands on each arm + 1 central golden stand. Slogan: Race to the center. Control the gold
NewSame move mechanics as the base game (swap, transfer, placement). Only the board topology and lock order change: your 2 stands lock in order 1→2, the central one — only after both of yours are locked
NewTwo variants: 4-FFA (free-for-all) and 2v2 (teams across the diagonal). Team bonus +10 if both teammates closed their lines. Central tower = king-maker moment worth +15 points
NewPhysical version: existing box + cheap colored flags (4 per set) + replaceable cardboard cross-field. Fits the current insert
ImprovedDigital roadmap: Phase 1 hot-seat (2-3 weeks) → Phase 2 online 2v2 (3-4 weeks) → Phase 3 AI partner via transfer learning from v7 AlphaZero (2-3 months compute) → Phase 4 4-FFA with MaxN (optional)
ImprovedLiving design document: docs/modes/golden-rush.md in the repo. Edits and questions via PR
26
v5.9.02mo agoLink

Big security sweep: leaderboard antibypass, transactions, AdMob SSV

SecurityPOST /api/buildings now cross-checks a recent verified win (games row within 120s) and takes is_ai/ai_difficulty/result FROM THE SERVER. Previously any curl could create a max-weight building and reach the Hall of Fame top-20 within 10 minutes
SecurityUNIQUE index on victory_buildings.game_id: one win = one building, duplicates impossible
SecurityPOST /api/bricks/purchase wrapped in db.transaction() with INSERT OR IGNORE first — closed the TOCTOU race where two parallel requests charged bricks twice for one skin
SecurityAdMob Server-Side Verification (SSV): real ECDSA P-256 SHA-256 Google signature check in the new endpoint GET /api/bricks/admob-ssv. You can no longer curl 100 bricks a day through /award-rewarded when ADMOB_SSV_ENABLED=1
SecurityTransaction_id uniqueness + timestamp freshness (≤1h) in SSV callback — replay protection
SecurityPOST /api/bp/quests/:id/claim: UPDATE reward_claimed + bricks award + INSERT brick_transactions — all in one transaction. Previously a server crash could lose the reward forever
SecurityawardBricks() wrapped in db.transaction() — balance UPDATE and brick_transactions INSERT can no longer diverge
SecurityWS handleServerGameOver: UPDATE bricks + INSERT brick_transactions for online wins in a single transaction
SecurityClubs create/join/leave/kick: all operations in db.transaction() + UNIQUE index on club_members.user_id. A player can only be in one club, member_count always matches actual COUNT(*)
SecurityClub owner can no longer demote themselves to member — closed the bug with a club left ownerless
SecurityChat filter v2: NFKC normalization + zero-width removal + Latin confusables mapping to Cyrillic + stem-based matching. Previously bypassed in 5 seconds (Latin y, dots, zero-width between letters)
ImprovedGlobal timer tick in WS server (1s): clock now decrements in real time across all rooms. Previously if the opponent went offline their time did not run — now auto-loss on timeout
ImprovedRematch and next tournament game: correct reset of playerTime and lastMoveTime for the new game
ImprovedPush notifications: send errors are now logged to console.warn (previously .catch(() => {}) swallowed everything)
Newadmin_audit table + new endpoint GET /api/admin/audit: all critical admin actions (user changes, mute, password reset, content delete, etc.) are now recorded with metadata, IP, admin and timestamp
NewAdMob SSV callback GET /api/bricks/admob-ssv: 7 layers of checks — signature, timestamp, ad_unit, user exists, transaction_id unique, reward clamp, daily limit
Newworkflow_dispatch in GitHub Actions deploy: manual redeploy from the UI with inputs (skip_tests, reason) — fast hotfix redeploy without waiting for tests
PerformancePUT /api/admin/users/:id is now async: bcrypt.hash instead of hashSync on reset_password — does not block the event loop for ~70ms
PerformanceGET /api/admin/training/export-gpu: response byte limit (default 50MB, max 200MB) + truncated flag. Previously could return 500MB and kill server memory
ImprovedGET /api/bricks/history: limit is now clamped via Math.max(1, ...) — closed the SQLite LIMIT -1 semantics (all rows)
ImprovedUTC dates in getDailySeed() and ensureCurrentSeason() — clients in different time zones no longer see different daily seeds around UTC midnight
ImprovedBattle Pass seasons: start and end of month are now in UTC, not in server local TZ
27
v5.8.12mo agoLink

Security, engine invariants and monster-file split

SecurityEngine invariant: a tower with 11+ blocks is ALWAYS closed now. Fixed the real-game bug from the screenshot where a stack with 11 blocks and 4 open ones stayed open due to the canClose gate
SecurityPer-IP limit of 5 WebSocket connections — protects against amplification DoS and connection flood
SecurityMatchmaking requires authentication. Anonymous ranked flow is closed (without a user ws-token findMatch is rejected)
SecurityOnline games now require moves[] to record a result. Closed the loophole where isOnline=true let you record wins without validation
SecurityBrick rewards for online wins are now only awarded server-side via handleServerGameOver (+5 through brick_transactions reason="win:pvp_verified"). Client-reported gameOver handler removed
SecuritySanitization of msg.timer from the client in critical WS handlers
SecurityJWT token versioning: on password change all old tokens are automatically invalidated
RefactorApp.jsx split into 4 components (SiteHeader, SiteFooter, AppRoutes, LazyFallback). Was 54KB, now 14KB — only pure orchestration (state + effects) left
NewEngine regression tests: 4 cases + invariant-fuzz on 20 random games with post-move validation
NewWS integration tests updated for authentication + new negative test for findMatch without a token
ImprovedChangelog page redesigned: hero with release stats, gradient type-distribution bar, filters and live search across all releases
28
v5.8.02mo agoLink

Victory City: full rebirth + viral previews

NewNew concept: 1 win = 1 to 5 bricks (instead of an entire skyscraper). 11 bricks = closed highrise. Just like in the game itself
NewBrick bonuses: +1 vs human opponent, +1/+2/+3 for Hard/Extreme/Impossible AI, +1 for golden victory. Floor color = skin used in that win
NewGolden crown spire on highrises where the last brick was a special win (golden victory or Impossible AI). Star and smoke above the crown
New“Share city” button — link /embed/city/:id gives a beautiful PNG preview card in Telegram/Discord/Reddit with name, 4 stats and city silhouette
NewShare modal has three different links (embed widget, profile, iframe snippet) plus a system Share button (Web Share API)
Newiframe snippet to embed in blogs. Supports ?theme=day|night and ?nocontrols=1 query parameters
New“Compare with…” button: 3 tabs — Friends, Top from leaderboard, Search by exact username. Opens a side-by-side page with both cities, score and crowned leader
NewCompare score = towers × 100 + crowns × 50 + bricks. Same formula in Hall of Fame “Size” tab
New“Compare cities” button on another player’s public profile — one click
New“Share comparison” button on the compare page itself — copies a link with SSR preview for messengers
NewSeparate PNG preview card for compare — in Telegram you see names, score and both cities side-by-side
New8-second city flythrough video recording (.webm/.mp4, codecs vp9→vp8→h264). Where Web Share is supported — straight to system share sheet, otherwise downloads a file. REC indicator with progress bar and countdown
NewHall of Fame: top 20 by 4 metrics (city size, bricks, towers, crowns) + global player/brick/tower counters. Medals 🥇🥈🥉 for top-3, your row is highlighted with “(you)”
NewClick on a row in Hall of Fame — navigate to that player’s profile (via global open-profile event)
NewMini-preview of cities in Hall of Fame — lightweight SVG silhouette without WebGL, you instantly see the shape
NewOn an empty city: “See top cities” button — you instantly see what to aim for
New“Next highrise: 7/11 bricks” indicator under city stats
NewClick on a tower — modal with the full list of wins it was built from, with brick count from each (grouped by source_id)
NewHover on a floor: opponent, AI difficulty, date. Hover on the whole tower: closed/building status, period from first to last win, number of wins in this stack
NewHovered tower is highlighted and slightly scaled up (1.06)
NewTower filters: all / crowned / contains Impossible AI / last week. Non-matching towers go semi-transparent
NewTime-lapse “History” — plays back city construction chronologically with a date in the corner. Stop with any button
New4 camera presets: Iso, Top, Cinematic (low angle), FPV-flythrough + auto-rotate. Smooth transition between presets
New4 time of day presets (Night, Morning, Day, Sunset) — sky color, fog, sun and exposure all change. At night windows light up and stars come out
NewSeasonal weather: snow in winter, rain in spring, leaves in autumn (off in summer). Toggled with a separate button
NewCity snapshot with filters (Vivid, B&W, Sepia) and watermark “Highrise Heist · Name · N wins”. Where Web Share is supported — share sheet, otherwise downloads
New6 saved camera view slots in localStorage. Found a nice angle, saved with a name, come back in one click
NewMinimap in the corner: gold = crowned, purple = under construction, blue = regular, dim = filtered out. Click a dot — camera flies to that tower. Hide with × button
NewFullscreen mode for the city + “ESC to exit” hint
NewSmoke particles above crowned towers (additive blending), lit windows with emissive glow, road textures with markings, ground texture, stars at night
NewIntro camera animation on first load and tower grow from the ground with a slight stagger
NewESC closes any modal (Share, Compare, Hall of Fame)
NewNew endpoint /api/buildings/leaderboard: top-20 by 4 metrics + global counters + cache age. 5-min cache
NewNew endpoint /api/buildings/feed/recent: feed of last 20 wins of all players + 24h and all-time stats. Brick total computed via SQL CASE expression. 30-sec cache
NewNew index idx_victory_buildings_recent (created_at DESC) — speeds up /feed/recent on large volumes
NewSSR page /embed/compare/:id1/:id2 for crawler bots: serves og:image and redirects user to SPA
ImprovedPOST /api/buildings returns the updated city right away — UI updates without a second request. Saves a round-trip after every win
Improved2D fallback for non-WebGL devices rewritten for the new towers model — SVG isometric, wheel zoom, drag-pan, tap to select
ImprovedMobile/low-power mode: fewer windows, basic shadow map, no tone mapping, devicePixelRatio=1, 250 weather particles instead of 600
Improvedprefers-reduced-motion: disables auto-rotate, crown pulsing, smoke and weather
PerformanceOG previews via @resvg/resvg-js (Rust binding, ~50ms) instead of headless chrome (saves ~195MB of dependencies). LRU cache 500 images / 1h. After a new win invalidates both city and compare images
PerformanceIntersectionObserver pauses rendering when city is off-screen. visibilityState — when tab is in the background. Tower windows are rendered as a single InstancedMesh
PerformanceVersioned OG cache keys (v1:userId, cmpv1:id1-id2). Bumping the prefix on SVG redesign — old previews refresh
ImprovedTower windows now light up at night on first profile load, not only after clicking a time-of-day preset
ImprovedWindows no longer hang in the air while towers grow from the ground (intro and time-lapse) — they appear only after the city is built
Improved8-second flythrough recording no longer “eats” the enabled auto-rotate — after the video it is restored if it was active
PerformanceRoads (~10 pieces) now share one geometry, material and texture instead of cloning each — saves ~10 GPU textures and geometries on every profile open
PerformanceVictory City correctly releases all WebGL resources when the profile is closed: fixed leaks of recording progress timer, mouse handlers and a race condition between unmount and the animation loop
29
v5.7.22mo agoLink

Tournaments: rating no longer counted twice

FixedWhen both players hit “I won” at the same time — rating sometimes counted at double size. The second click is now politely ignored
FixedSame problem could duplicate matches in the next round — fixed
FixedTop-3 XP in the final could also be credited twice — fixed
FixedFirst-round draw is now properly random — there used to be a slight bias in pairings
30
v5.7.12mo agoLink

Wins playing red are now counted

FixedCritical: every win playing the red side was rejected when saving stats. Fixed — they are now counted properly
FixedRemoved a duplicate server endpoint that had no flood protection
PerformanceOld clients keep working — backward compatibility preserved
31
v5.7.03mo agoLink

Achievement rarity is shown in the profile

NewEach achievement in your profile now shows the percent of players who also have it
NewFour rarity tiers: Common, Rare, Epic, Legendary — a gold frame means you pulled off something cool
NewRarity is also visible on other players profiles — you instantly see who is a grinder and who is a clever collector
NewPercent recalculates every 5 minutes from the full player base
FixedPush notifications now branded “Highrise Heist” (was old name in four places)
32
v5.6.13mo agoLink

Bunch of small fixes

FixedYour-turn notifications no longer point to the old domain after the rebrand
FixedLess often asks to log in again after long idle — fixed session refresh
FixedVictory City no longer crashes on a building click right after opening the tab
FixedMatchmaking stopped occasionally losing free rooms
FixedSmall server-memory and browser-cache cleanups — fewer oddities during long sessions
33
v5.6.03mo agoLink

Photo mode, day/night and 3D on the home page

New4 times of day in Victory City: dawn, day, sunset, night
NewPhoto mode: 3 camera angles and auto-rotate — makes it easy to capture nice shots
NewBuildings grow out of the ground one by one when you enter the city, you can save a snapshot
NewA mini Victory City preview is now on the home page
34
v5.5.03mo agoLink

3D Victory City and live skin previews

NewVictory City is now in 3D: rotate, zoom, with shadows
NewSkin Shop: selected skin shown in 3D right in the store
35
v5.3.03mo agoLink

Small stats and reward fixes

FixedMissing wins in stats are now counted properly
Fixed+10 bricks ad reward reliably credits to balance
FixedAutomatic server deploy works as expected
36
v5.0.03mo agoLink

Clubs, global chat and skin equip

NewClubs: create, join, Owner / Officer / Member roles, separate leaderboard
NewGlobal chat in lobby — chat while waiting for an opponent
NewEquip block and stand skins
37
v4.7.03mo agoLink

Stronger AI and Android app

NewAI trained from scratch on millions of self-play games — sees positions deeper and trickier with transfers
New5 difficulty levels: Easy / Medium / Hard / Extreme / Impossible
NewNative Android app — the game works even offline
38
v4.6.23mo agoLink

Impossible difficulty and profile redesign

NewImpossible difficulty — around 6s per move, 5000 variants, ~99% wins vs humans
NewProfile and settings redesign — everything in sight
NewPrivacy Policy, Terms of Service, cookie consent
NewRefreshed home page design
39
v4.6.13mo agoLink

10M AI self-play games and spectator chat

NewAI played 10M self-play games — first/second move balance is 36.35% / 36.33%
NewSpectator chat — watchers discuss moves
New4 more Hard puzzles
NewAuto rewards for top 10 players at season end
40
v4.6.03mo agoLink

Friend challenge and UI polish

NewChallenge button in friend list — no links, straight to game
FixedUI polish: cleaner buttons, consistent fonts, no layout jumps on mobile
FixedBackup SSL certificate + automatic DB backups every 6 hours
41
v4.5.13mo agoLink

Result sharing and referrals

NewShare button after a match — generates an image with result and rating
NewPersonal referral code/link — +100 XP for both when a friend joins
42
v4.5.03mo agoLink

Optimization and ELO tiers

PerformanceGame loads faster, first-load size reduced
NewELO chart in profile shows tiers: Bronze, Silver, Gold and so on
FixedServer upgraded to a fresh Node version — faster and safer
43
v3.53mo agoLink

Browser neural network and Extreme mode

NewAI neural network runs right in the browser — sees positions several moves deeper
NewNew Extreme difficulty (up to half a minute per move)
44
v3.43mo agoLink

Rematches, spectator and public profiles

NewOne-click rematch after any online match
NewSpectator mode — list of live games in the lobby
NewPublic player profiles from the leaderboard
NewBrowser “your turn” notifications when tab is in background
45
v3.04mo agoLink

26 achievements, seasons and ranked play

New26 achievements, ranked seasons, resign and draw offers, fast matchmaking
46
v2.04mo agoLink

Online with friends and puzzles

NewPlay with a friend by link, 50 puzzles, 4 visual themes
47
v1.05mo agoLink

First release

NewSingle-player vs AI, ELO rating, profile, full rules