Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Clearstackification - #1

Open
techninja wants to merge 19 commits into
mainfrom
clearstackification
Open

Clearstackification#1
techninja wants to merge 19 commits into
mainfrom
clearstackification

Conversation

@techninja

Copy link
Copy Markdown
Owner

Move to Clearstack base, and updates for HA integration base

techninja added 19 commits May 7, 2026 09:49
- firmware: scrollText lockup fix (remove handleClient from scroll loop)
- firmware: slow scroll speed 40ms -> 80ms per pixel
- firmware: add index page at port 80 with config form (SSID, pass, config URL)
- firmware: charset=utf-8 on all HTML responses (emoji SSID support)
- server: unify env files - merge .env.local into .env, delete .env.local
- server: standardize on PORT (drop SERVER_PORT fallback)
- server: update dev script to single --env-file=.env
- .env.example: complete template with all vars documented
- deps: upgrade clearstack 0.3.27 -> 0.4.21
firmware:
- Add ESPmDNS, advertise _thinclock._tcp on port 80
- TXT records: version, ip
- Device reachable at thinclock.local
homeassistant/custom_components/thinclock/:
- __init__.py: setup entry, forward to sensor/select/number/button platforms
- coordinator.py: DataUpdateCoordinator polling /api/device/info, /sensors, /active, /screens
- config_flow.py: manual URL entry + zeroconf async_step for auto-discovery
- sensor.py: temperature, humidity, light entities
- select.py: current screen select
- number.py: brightness slider
- button.py: left/middle/right physical button entities
- manifest.json: zeroconf _thinclock._tcp.local. declaration
- strings.json: UI strings for config flow steps
homeassistant/addon/:
- config.yaml: add-on manifest, options schema, ingress on 3232, aarch64/amd64/armv7
- Dockerfile: Node 22 on hassio-addons base, /data symlinked for persistence
- run.sh: translates HA options.json -> env vars, wires SUPERVISOR_TOKEN as HA_TOKEN
- build.yaml: multi-arch build targets
src/api/adapters/homeassistant.js:
- Full WebSocket implementation (was a stub)
- Auth handshake, fetch all states on connect, subscribe to state_changed
- Auto-reconnect on disconnect
- GET /data/ha/:entity_id and GET /data/ha list endpoints
repository.yaml: repo root manifest for HA add-on store
homeassistant/README.md: full install guide + architecture + options table
- Move addon from homeassistant/addon/ -> thinclock-addon/ (repo root, required by HA store)
- Fix Dockerfile COPY path after move
- Add icon.png (resized from thinclock_logo.png) to addon folder
- repository.yaml at repo root for HA custom repo discovery
- README: full rewrite covering firmware flash, standalone server, HA add-on,
integration install, monorepo structure, screen authoring, device API
Spec fixes:
- clearstack.spec.js: firmware C++ check via runExtCmd (clearstack 0.4.26)
- firmware/.cppcheck-suppress: suppress ArduinoJson/display false positives
- firmware: default member initializers, constructors, const refs, C++ casts
- JS: file splits under 150 lines, empty JSDoc removal, unused var fixes
- .configs/eslint.config.js: remove jsdoc/require-jsdoc, ignore firmware/.pio
docs/TESTING.md: full pre-merge test checklist covering server, firmware,
device web UI, server-device integration, browser UI, HA integration,
HA add-on sideload, and known deferred items
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@techninja