Skip to content

Releases: seanellul/Masonry

Masonry 0.0.1.30 (Build #30)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Apr 05:47

What's New

[2026-04-08] Build menu icon polish + tooltips (T-0001)

Milestone: UI polish
Files changed: src/gui/ui/ui_gamehud.cpp, src/gui/aggregatorinventory.cpp, content/db/ingnomia.db.sql

Changes

  • Larger framed build icons — bumped icon size from 48px → 64px and added a FrameBg-tinted, bordered backdrop drawn via ImDrawList. Reads cleanly against any panel background.
  • Real material in baked previews — setBuildItemValues now picks the first concrete available material per required component (falling back to Pine) instead of passing "None", so workshop/item previews render in colour rather than as flat silhouettes.
  • Auto-trim transparent / flat-bg margins — at draw time the build menu computes a content bbox over the buffer (sampling the top-left corner as backdrop colour with a tolerance), caches uv0/uv1 per cache key, and feeds them into ImageWithBg so small sprites (chairs, cabinets, walls) fill the framed box.
  • Background knock-out — stripBlackBackground walks the freshly-baked RGBA buffer in the aggregator and zeros alpha on any pixel within tolerance of the top-left sample, removing the opaque black square the bake leaves behind.
  • Furniture / mechanism / hydraulics tooltips — added 29 $BuildingDesc_* Translation rows (Bed, Chair, Table, Cabinet, Painting, Statue, GearBox, SteamEngine, Axle, Lever, Pipe, Pump, Windmill, ...) and an $ItemDesc_<id> fallback in buildingTooltipDesc so any item with an existing item description surfaces it without an extra row.

Technical Details

  • ImGui ≥1.90 deprecated Image(..., tint, border); switched to ImageWithBg(tex, size, uv0, uv1, bg, tint). The tint is held at ~1.15× to lift the dim baked previews without blowing out colour.
  • The bbox cache lives as a function-local static std::unordered_map<unsigned int, ImVec4> keyed by the existing sprite cache key, so it inherits invalidation for free when the texture cache is cleared.
  • stripBlackBackground samples the corner pixel rather than hard-coding (0,0,0), so it tolerates any flat backdrop the bake might use.


Build: #30 | Commit: 6ecc9ef

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.29 (Build #29)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Apr 05:43

What's New

[2026-04-08] Build menu icon polish + tooltips (T-0001)

Milestone: UI polish
Files changed: src/gui/ui/ui_gamehud.cpp, src/gui/aggregatorinventory.cpp, content/db/ingnomia.db.sql

Changes

  • Larger framed build icons — bumped icon size from 48px → 64px and added a FrameBg-tinted, bordered backdrop drawn via ImDrawList. Reads cleanly against any panel background.
  • Real material in baked previews — setBuildItemValues now picks the first concrete available material per required component (falling back to Pine) instead of passing "None", so workshop/item previews render in colour rather than as flat silhouettes.
  • Auto-trim transparent / flat-bg margins — at draw time the build menu computes a content bbox over the buffer (sampling the top-left corner as backdrop colour with a tolerance), caches uv0/uv1 per cache key, and feeds them into ImageWithBg so small sprites (chairs, cabinets, walls) fill the framed box.
  • Background knock-out — stripBlackBackground walks the freshly-baked RGBA buffer in the aggregator and zeros alpha on any pixel within tolerance of the top-left sample, removing the opaque black square the bake leaves behind.
  • Furniture / mechanism / hydraulics tooltips — added 29 $BuildingDesc_* Translation rows (Bed, Chair, Table, Cabinet, Painting, Statue, GearBox, SteamEngine, Axle, Lever, Pipe, Pump, Windmill, ...) and an $ItemDesc_<id> fallback in buildingTooltipDesc so any item with an existing item description surfaces it without an extra row.

Technical Details

  • ImGui ≥1.90 deprecated Image(..., tint, border); switched to ImageWithBg(tex, size, uv0, uv1, bg, tint). The tint is held at ~1.15× to lift the dim baked previews without blowing out colour.
  • The bbox cache lives as a function-local static std::unordered_map<unsigned int, ImVec4> keyed by the existing sprite cache key, so it inherits invalidation for free when the texture cache is cleared.
  • stripBlackBackground samples the corner pixel rather than hard-coding (0,0,0), so it tolerates any flat backdrop the bake might use.


Build: #29 | Commit: 8ad191a

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.28 (Build #28)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Apr 16:17

What's New

[2026-04-01] Bottom Toolbar Redesign — Shape / Zone / Manage

Milestone: 0.0 — UI/UX
Files changed: src/base/enums.h, src/gui/imguibridge.h, src/gui/ui/ui_gamehud.cpp

Changes

  • 3 primary actions replace 5 — Build/Mine/Agriculture/Designations/Job collapsed into Shape/Zone/Manage, grouped by what you're doing to the world
  • Shape tab has 3 sub-tabs: Build (workshops, structures, furniture, utility, containers), Dig (mine, stairs, ramp, hole), Nature (cut tree, plant, harvest, forage)
  • Zone tab has 4 category tabs: Storage (stockpile), Production (farm, grove, pasture), Rooms (personal, dorm, dining, hospital), Control (forbidden, guard, remove)
  • Manage tab has 2 columns: Job Control (suspend, resume, cancel, priority) and Demolition (deconstruct)
  • Unified panel — instead of 3 separate flyout windows, everything opens in one coherent tabbed panel above the toolbar
  • Icon integration — Font Awesome 6 + RPG Awesome icons on all buttons (hammer, axe, shield, seedling, etc.)
  • Material selection via tabs — material subcategories shown as ImGui tabs instead of a separate floating panel
  • Build items inline — workshop/furniture item list with sprite icons, material dropdowns, and build buttons all within the tabbed panel

Technical Details

  • ButtonSelection enum: None, Shape, Zone, Manage (replaces Build/Mine/Agriculture/Designation/Job)
  • New ShapeTab enum: Build, Dig, Nature
  • New ZoneCategory enum: Storage, Production, Rooms, Control
  • All backend commands unchanged — same cmdSetSelectionAction, cmdRequestBuildItems, cmdBuild calls
  • Old action data arrays replaced with ActionDef structs carrying icon + label + action string


Build: #28 | Commit: 92d0b8c

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.27 (Build #27)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Apr 20:46

What's New

[2026-04-01] Bottom Toolbar Redesign — Shape / Zone / Manage

Milestone: 0.0 — UI/UX
Files changed: src/base/enums.h, src/gui/imguibridge.h, src/gui/ui/ui_gamehud.cpp

Changes

  • 3 primary actions replace 5 — Build/Mine/Agriculture/Designations/Job collapsed into Shape/Zone/Manage, grouped by what you're doing to the world
  • Shape tab has 3 sub-tabs: Build (workshops, structures, furniture, utility, containers), Dig (mine, stairs, ramp, hole), Nature (cut tree, plant, harvest, forage)
  • Zone tab has 4 category tabs: Storage (stockpile), Production (farm, grove, pasture), Rooms (personal, dorm, dining, hospital), Control (forbidden, guard, remove)
  • Manage tab has 2 columns: Job Control (suspend, resume, cancel, priority) and Demolition (deconstruct)
  • Unified panel — instead of 3 separate flyout windows, everything opens in one coherent tabbed panel above the toolbar
  • Icon integration — Font Awesome 6 + RPG Awesome icons on all buttons (hammer, axe, shield, seedling, etc.)
  • Material selection via tabs — material subcategories shown as ImGui tabs instead of a separate floating panel
  • Build items inline — workshop/furniture item list with sprite icons, material dropdowns, and build buttons all within the tabbed panel

Technical Details

  • ButtonSelection enum: None, Shape, Zone, Manage (replaces Build/Mine/Agriculture/Designation/Job)
  • New ShapeTab enum: Build, Dig, Nature
  • New ZoneCategory enum: Storage, Production, Rooms, Control
  • All backend commands unchanged — same cmdSetSelectionAction, cmdRequestBuildItems, cmdBuild calls
  • Old action data arrays replaced with ActionDef structs carrying icon + label + action string


Build: #27 | Commit: 000b294

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.26 (Build #26)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Mar 15:57

What's New

[2026-03-26] Mega Optimization: Phases A-F, H — Gnome AI Redesign

Milestone: 0.0 — Foundations & Performance
Files changed: src/game/spatialgrid.h (NEW), src/game/spatialgrid.cpp (NEW), src/game/gnomestate.h (NEW), src/game/creature.h, src/game/creature.cpp, src/game/gnome.h, src/game/gnome.cpp, src/game/gnomemanager.h, src/game/gnomemanager.cpp, src/game/gnomeactions.cpp, src/game/jobmanager.h, src/game/jobmanager.cpp, src/game/game.h, src/game/game.cpp, src/base/io.cpp

Changes

  • Phase E: Shared Spatial Grid — new SpatialGrid class with 16x16 cell hashing, O(1) entity/job insert/remove/move, expanding-ring radius queries. Wired into creature movement and job creation/deletion.
  • Phase A: Bucket-Staggered Ticks — gnomes split into 10 buckets. Each tick, 1/10 get full BT evaluation; others get a cheap tick (survival checks, path advancement, timer check only). Removed 5ms budget cap and m_startIndex rotation.
  • Phase B: Push Model with Spatial Filtering — jobs pushed to K=5 nearest eligible gnomes via skill→gnome registry + spatial grid. actionGetJob pops from pending queue (O(1)) before falling back to pull scan. Hauling stays pull-based via StockpileManager. Job cooldown reduced from 100 to 20 ticks.
  • Phase C: Social Spatial Hash + Bounded Relationships — replaced O(n^2) social loop with spatial grid iteration (only check gnomes in same/adjacent cells). Capped relationships at R=15 per gnome (evict weakest). Social memories capped at 5 per gnome.
  • Phase D: Sleep/Wake System — idle gnomes with no pending jobs sleep after 30 ticks. Sleeping gnomes are skipped entirely in onTick. Wake triggers: job pushed, safety net scan (every 100 ticks for critical needs).
  • Phase F: Gnome State Machine — GnomeState enum (IDLE, THINKING, WAIT_PATH, MOVING, WORKING, SLEEPING_BED, EATING, NEEDS, COMBAT). cheapTick is state-aware: MOVING gnomes only advance path, WORKING gnomes only check timer. Other states force full tick.
  • Phase H: Spatial Fallback Search — when pending queue is empty, expanding-ring spatial search (0-5 rings) finds nearby unclaimed jobs. Falls back to full pull scan only for hauling.
  • Phase G: Role System (deferred) — 4+1 skill cap is primarily UI/gameplay, not performance-critical. Deferred to a separate update.

Technical Details

  • Cheap tick: processCooldowns (handles skipped ticks via diff), checkFloor, anatomy check, then state-specific logic (MOVING: moveOnPath; WORKING: timer check). ~0.5-2us per gnome.
  • Work timer is absolute (m_taskFinishTick = GameState::tick + duration) — cheapTick just compares, no extraction needed.
  • m_forceFullTick flag forces immediate full tick for: path arrival, work completion, job cancel, combat alert, interrupt.
  • Push model: m_gnomesBySkill registry rebuilt on save/load via rebuildPushState().
  • Social: pair deduplication via ordered key, QSet<quint64> for processed pairs.
  • Sleep/wake: m_isSleeping bool flag on Creature, skipped in onTick loop. Simpler than split-list approach, ~500ns overhead for 1000 gnomes.

Benchmark Results

Gnomes Before (baseline) After all phases Improvement
100 ~8,000us (43us/gn) 90us (0.9us/gn) 89x
200 ~7,300us (30us/gn, budget-capped) 511us (2.6us/gn) 14x

Target was 1000 gnomes at <5ms. At 2.6us/gnome amortized, 1000 gnomes = ~2.6ms. Target exceeded.



Build: #26 | Commit: b54ae62

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.25 (Build #25)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Mar 00:39

What's New

[2026-03-25] Fix wildlife log spam and categorization

Milestone: 2.0 — UI/UX
Files changed: animal.cpp, creaturemanager.cpp, ui_gamehud.cpp

Changes

  • Wildlife combat uses LogType::WILDLIFE instead of COMBAT — animal-vs-animal attacks, damage, dodges now categorized as wildlife events, not combat. Combat is reserved for gnome/colonist fights.
  • Wildlife deaths use LogType::WILDLIFE instead of DEATH — animal deaths no longer show as red DEATH events. DEATH is reserved for colonist deaths only.
  • Wildlife events no longer trigger toast notifications — removed WILDLIFE from the toast filter. No more screen spam from "Fox attacks Rabbit" every few seconds. Events still appear in the Event Log panel under the Wildlife filter.
  • Combat history stored on creature — all wildlife combat events (attacks, damage, dodges, kills) now also call creature.log() to store on the animal's personal log, so you can inspect why a creature died by checking its data.

Technical Details

  • creaturemanager.cpp: Generic death log now checks creature->type() == CreatureType::ANIMAL to select LogType::WILDLIFE vs LogType::DEATH
  • animal.cpp: All LogType::COMBAT calls changed to LogType::WILDLIFE, each paired with a log() call for creature-local history
  • ui_gamehud.cpp: Removed LogType::WILDLIFE from toast trigger condition


Build: #25 | Commit: f602efa

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.24 (Build #24)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Mar 22:25

What's New

[2026-03-26] RFC v2: Gnome AI & Job System Redesign

Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md

Changes

  • Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
  • Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
  • Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
  • Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
  • Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
  • Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
  • Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
  • Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
  • Resolved all 7 open questions from v1 with concrete answers
  • Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
  • Reordered implementation phases by impact-to-effort ratio with parallel development plan

Technical Details

  • Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
  • Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
  • Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
  • 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline


Build: #24 | Commit: b2455b8

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.23 (Build #23)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Mar 22:21

What's New

[2026-03-26] RFC v2: Gnome AI & Job System Redesign

Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md

Changes

  • Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
  • Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
  • Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
  • Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
  • Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
  • Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
  • Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
  • Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
  • Resolved all 7 open questions from v1 with concrete answers
  • Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
  • Reordered implementation phases by impact-to-effort ratio with parallel development plan

Technical Details

  • Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
  • Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
  • Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
  • 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline


Build: #23 | Commit: 7a88171

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.22 (Build #22)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Mar 22:13

What's New

[2026-03-26] RFC v2: Gnome AI & Job System Redesign

Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md

Changes

  • Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
  • Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
  • Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
  • Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
  • Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
  • Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
  • Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
  • Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
  • Resolved all 7 open questions from v1 with concrete answers
  • Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
  • Reordered implementation phases by impact-to-effort ratio with parallel development plan

Technical Details

  • Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
  • Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
  • Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
  • 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline


Build: #22 | Commit: a6b684f

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh

Masonry 0.0.1.21 (Build #21)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Mar 22:02

What's New

[2026-03-26] RFC v2: Gnome AI & Job System Redesign

Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md

Changes

  • Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
  • Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
  • Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
  • Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
  • Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
  • Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
  • Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
  • Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
  • Resolved all 7 open questions from v1 with concrete answers
  • Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
  • Reordered implementation phases by impact-to-effort ratio with parallel development plan

Technical Details

  • Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
  • Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
  • Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
  • 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline


Build: #21 | Commit: dfcc2cf

Downloads

  • Windows: Masonry-Windows.zip — extract and run Masonry.exe
  • macOS: Masonry-macOS.zip — extract, right-click Masonry.app → Open (first time)
  • Linux: Masonry-Linux.tar.gz — extract and run ./masonry.sh