Generative urban massing for Grasshopper (Rhino 8).
Subdivide a parcel into blocks and streets, grow building typologies, allocate parks and trees, and generate terrain.
▶ Watch the Mycelium workflow demo
Mycelium takes a closed parcel boundary curve and generates complete urban massing alternatives:
- Subdivision — recursive binary space partitioning splits the parcel into building blocks separated by streets.
- Typologies — each block receives a randomly selected building type from the configurations you allow: courtyard (perimeter block), linear bar, point block, L-shape, U-shape, or tall tower.
- Open space — a chosen number of blocks become parks, populated with procedural trees; courtyards can receive trees too.
- Metrics & reproduceability — development metrics, environmental morphology indicators, and a versioned JSON case manifest for every generated alternative.
Every output is driven by a random seed, so alternatives are fully reproducible.
- Click Install in Rhino here.
- Restart Rhino.
Components appear in Grasshopper under the Mycelium tab.
Download Mycelium.gha from the latest release, unblock it, and place it in your Grasshopper libraries folder (_GrasshopperFolders > Components).
| Component | Tab / Panel | Purpose |
|---|---|---|
| Massing Generator | Mycelium / Massing | Main generator: parcel in, city block out |
| Courtyard Config | Mycelium / Building Types | Allow perimeter blocks with central courtyards |
| Linear Config | Mycelium / Building Types | Allow bar buildings along the block's long axis |
| Point Config | Mycelium / Building Types | Allow compact point blocks |
| L-Shape Config | Mycelium / Building Types | Allow L-shaped buildings |
| U-Shape Config | Mycelium / Building Types | Allow U-shaped buildings |
| Tall Building Config | Mycelium / Building Types | Allow towers |
| Tree Config | Mycelium / Vegetation | Tree density, size, and courtyard placement |
| Green Network Generator | Mycelium / Vegetation | Seeded perimeter belts, corridors, refuge patches, and schematic trees |
| Terrain Generator | Mycelium / Site | Procedural terrain from OpenSimplex noise (docs) |
| Mycelium Templates | Mycelium / Utilities | Browse and insert example definitions synced from Mycelium-Templates |
Massing Generator inputs & outputs
Inputs: Boundary (closed planar curve), FloorHeight, Divisions (subdivision depth), StreetWidth, BuildingConfigs (from the config components), NumParks, GenerateFloorSlabs, Trees (from Tree Config), Seed, and an optional horizontal AnalysisDirection used by directional frontal-area metrics.
Right-click the Massing Generator and use Street Network to select Irregular Grid, Orthogonal Grid, Diagonal Grid, or Radial–Concentric Grid. The choice is stored in the Grasshopper definition and displayed beneath the component. Irregular Grid includes the original seeded Recursive Orthogonal, a seeded Deformed Grid with displaced shared intersections, and a Staggered Grid with offset rows and T-junctions. Orthogonal Grid includes nested Regular Grid, Rectangular Grid, Cerdà Grid, and Hierarchical Superblock options. Cerdà blocks have chamfered corners; the superblock option groups a fine 3×3 local grid within a wider primary-street grid. Diagonal Grid includes Single Axis, intersecting Cross Axes, and an Orthogonal Overlay that cuts a wider diagonal boulevard through a regular grid. Radial–Concentric Grid includes a full circular Civic Core, straight-sided Polygonal Radial rings, and a one-sided Fan Plan; all three terminate at a finite focal block instead of a point.
Outputs: Footprints, Masses, Heights, Streets, FloorSlabs, Parks, Courtyards, Trees, Parcels, Metrics, MorphologyMetrics, and CaseManifest.
MorphologyMetrics reports plan area density (lambda_p), open-space and park ratios, directional gross frontal area density (lambda_f), and building-height statistics including mean, standard deviation, median, and 90th percentile. CaseManifest is schema-versioned JSON containing a deterministic SHA-256 case ID, the effective generation parameters, random seed, plug-in version, street-network selection, model units, geometry counts, development metrics, and morphology metrics. Its schema is published at docs/case-manifest.schema.json.
Each Building Type Config component exposes: floor range, corner radius, minimum footprint area, setback range, and building depth range. Feed any combination of configs into the generator — each block picks one at random.
The Green Network Generator is designed to follow the Massing Generator in the Grasshopper graph: connect the same site Boundary, connect Footprints to BuildingFootprints, and connect Parks to ExistingParks. Existing parks become anchors, new seeded refuges supplement them, and automatic corridors connect the combined network while excluding building footprints. Optional CorridorGuides override the automatic connectors when a designed route is required.
Drop a Mycelium Templates component on the canvas and click Select Template — it lists every template from the Mycelium-Templates repository, synced from the branch matching this plugin's version (downloaded and cached on first use). Click one to insert a working example graph next to the component.
Mycelium asks the Yak package registry once a day whether a newer version is published, and surfaces it in two places: a dismissible notice on the first Grasshopper canvas of a session, and an amber badge on the Mycelium Templates component (click it to open the Rhino Package Manager). The notice offers Skip This Version and Never Remind Me Again; both are remembered in %AppData%/Mycelium/update-check.json (delete that file to re-enable reminders). Right-click the templates component for Check for Mycelium Updates Now, which bypasses the daily throttle and any opt-out.
Offers follow the channel you are on: a stable install is never nudged towards a pre-release, while a -beta install is offered whichever is newer, the next beta or the stable that supersedes it. Every part of the check fails silently — being offline never blocks Grasshopper or shows an error.
Building from source
Requires the .NET SDK (8.0 or newer).
git clone https://github.com/MyceliumGH-Dev/Mycelium.git
cd Mycelium
dotnet build Mycelium.sln -c Release
# → src/Mycelium/bin/Release/net7.0/Mycelium.ghaThe project targets plain net7.0 and builds on Windows, macOS, and Linux — deliberately not net7.0-windows, so the assembly carries no Windows Desktop framework dependency. Grasshopper's API still hands components WinForms types, so System.Windows.Forms is referenced compile-time-only from the .NET Framework 4.8 reference assemblies, the identity Rhino satisfies on both platforms; dialogs go through Eto for the same reason. (A net7.0-windows build does load in Rhino for Mac — that was measured, not assumed — this is about not depending on a stack we never needed.) The Grasshopper NuGet package likewise ships .NET Framework reference assemblies and Rhino supplies the real ones at run time, so the NU1701 restore warning is suppressed intentionally.
Local development loop (.ghlink)
Every build writes a Mycelium.ghlink file into Grasshopper's Libraries folder pointing at the build output, so Grasshopper loads the freshly built .gha on the next Rhino start — no copying, no packaging:
| Platform | ghlink location |
|---|---|
| Windows | %APPDATA%\Grasshopper\Libraries\Mycelium.ghlink |
| macOS | ~/Library/Application Support/McNeel/Rhinoceros/8.0/Plug-ins/Grasshopper (b45a29b1-4343-4035-989e-044e8580d9cf)/Libraries/Mycelium.ghlink |
Set -p:MyceliumSkipGhLink=true to suppress it (CI does not need it).
Uninstall the released Mycelium package while developing. If a Yak package is installed, Grasshopper loads that folder too, the released assembly usually wins on identity, and the canvas quietly shows the released components while you are editing the local ones. Rhino restarts are required for either to be picked up — Grasshopper caches its library scan for the session.
Creating a Yak package locally
scripts/package.shThis builds the solution, assembles dist/, and produces the .yak package using the yak CLI from a local Rhino 8 installation. The package version comes from the root manifest.yml. CI runs the same staging logic (see below) as a dry-run on every push and PR to dev.
Releasing to the Package Manager
Publishing is fully automated through branch-triggered workflows (requires the YAK_TOKEN_PATRICK repository secret):
| Branch push | Workflow | Result on the Yak server |
|---|---|---|
pre-release |
Yak Pre-Release | X.Y.Z-beta.W (visible with "include pre-releases") |
release |
Yak Release | X.Y.Z.W (public) |
- Bump
version:inmanifest.yml(4-partX.Y.Z.W) and updateCHANGELOG.mdondev. - Create the matching branch in Mycelium-Templates (
git push origin main:X.Y.Z.Wthere) — the Templates component syncs from the branch named after the plugin version. - Merge / fast-forward
devintopre-releaseand push — CI builds Windows + Mac distributions and publishes the beta. - When the beta checks out, push the same state to
releasefor the public version.
Pushes are idempotent (already-published distributions are skipped), and every run verifies the version is searchable on the server afterwards. To hide a bad version, run the Yak Yank workflow from the Actions tab.
Repository layout
├── manifest.yml # Yak package manifest (version source of truth)
├── src/Mycelium/ # Plugin source (C#, .gha)
│ ├── Components/ # Grasshopper components
│ ├── Core/ # Geometry + noise logic (no GH dependencies)
│ └── Icons/ # 24x24 component icons (shipped, embedded in the .gha)
├── design/icons/ # Icon vector source, generator and glyph↔component contract
├── docs/ # Documentation and images
├── scripts/package.sh # Local Yak packaging
└── .github/workflows/ # CI, packaging dry-run, Yak release channels
Example .gh/.ghx definitions live in the separate Mycelium-Templates repository, branched per plugin version. The dataset_export.ghx example wires the morphology and manifest outputs to panels; use a panel's Stream Contents command to write the JSON sidecar.
- Dr. Ilker Karadag (@karadagi) — Associate Professor of Architecture, Sakarya University. Original author.
- Dr. Patrick Kastner (@kastnerp) — Assistant Professor, School of Architecture, Georgia Institute of Technology; Sustainable Urban Systems Lab.
Use the repository's Cite this repository menu, populated from CITATION.cff. Versioned archival DOIs are issued through the Zenodo–GitHub integration beginning with release 0.1.0.4.


