91³Ô¹ÏÍø

Watch CBS News

Model train museum brings mini Boston neighborhoods to life with intricate detail

BOSTON - There's a museum in Boston that's recreating part of the city's history with model trains.

Bay State Model Railroad Museum

The Bay State Model Railroad Museum on South Street in Roslindale is a non-profit that's run entirely by unpaid volunteers. Inside, you'll find some of the most detailed and intricate model railroads in Massachusetts.

You'll see replicas of the MBTA's commuter rail and the old electric trolleys.

boston model trains generic
A model MBTA train at the Bay State Model Railroad Museum in Roslindale on February 23, 2024. John Tlumacki/The Boston Globe via Getty Images

Volunteer Mackenzie Morrison is currently working on a model of the old Back Bay station.

"I also went to school for architecture, so I'm interested in building scale models," she told WBZ-TV.

The museum's director of open houses, Tom Landro, said he's seen a huge increase in volunteer members looking to join their club and work on the models.

"We have grown significantly in the last year or two," he told WBZ.

The displays inside have also been growing. Landro says the museum's main goal is to promote the hobby of model railroading in the Boston area.

boston model trains generic
A street car runs down a reproduction of Roslindale Square at the Bay State Model Railroad Museum on February 23, 2024. John Tlumacki/The Boston Globe via Getty Images

But what keeps visitors coming back over the decades are the scenes and places they recognize, like a triple decker home, an old movie theater, a firehouse or a neighborhood. It's all thanks to the talented volunteers.

"I like arts and crafts and this is kind of like a way to show that," Morrison told WBZ.

"It really shows what you could do, other than setting it up under the Christmas Tree," Landro said.

The museum has open houses several times a year. For more information, visit their .

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });