Pillar 03 — Triskelle 3D
3D Printing, Micro-Electronics & Smart Home
The making side of the practice — printed parts, wired microcontrollers, and home automation that actually holds together.
3D Printing
Functional and decorative prints — enclosures, brackets, wearable mounts, and prototypes. Designed to fit real builds, not just shelf pieces.
Micro-Electronics
Microcontrollers, sensors, relays, and LED drivers wired into interactive pieces and practical devices. Firmware, soldering, and systems integration.
Smart Home / Home Assistant
Home Assistant installs and automations — sensors, relays, and dashboards tying a space together so it responds to how you live in it.
Prototyping for Art
Much of the maker work feeds the art side: quick prototypes for festival pieces, wizard staff electronics, and projection rigs before they go on site.
Sauna Temperature Monitoring
A retrofittable temperature monitoring system for wood-fired saunas. An ESP32 with waterproof probes and a high-quality humidity and temperature sensor, paired with a web app and a 3D-printed QR code for installation. Built for sauna owners who want real readings from a stove that currently runs on feel.
Instagram
Build progress, studio work, and tech experiments from Triskelle 3D.
GitHub
Open builds, code, and project notes — Triskelle 3D on GitHub.
// =====================================================================
// Theme toggle — persist light/dark preference across pages
// =====================================================================
(function() {
const btn = document.getElementById('theme-toggle');
const root = document.documentElement;
const key = 'roadhouse.theme';
function get() { try { return localStorage.getItem(key) || 'system'; } catch { return 'system'; } }
function set(m) { try { localStorage.setItem(key, m); } catch {} }
function apply(mode) { mode === 'light' || mode === 'dark' ? root.setAttribute('data-theme', mode) : root.removeAttribute('data-theme'); }
function cur() { return root.getAttribute('data-theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); }
function updateLabel() {
const m = cur(); btn.setAttribute('aria-label', m==='dark' ? 'Switch to light theme' : 'Switch to dark theme');
btn.setAttribute('aria-pressed', String(m==='dark'));
}
btn.addEventListener('click', () => { const n = cur()==='dark' ? 'light' : 'dark'; apply(n); set(n); updateLabel(); });
const init = get(); if (init==='light'||init==='dark') apply(init); updateLabel();
})();
// =====================================================================
// Stream / page-specific scripts
// =====================================================================