Skip to content

Instantly share code, notes, and snippets.

@joshualyon
joshualyon / serializeToMarkdown.ts
Created October 29, 2025 02:07
TipTap ProseMirror Markdown Serializer with ABBA inner-outer nesting
/**
* ProseMirror JSON to Markdown Serializer
*
* Converts TipTap/ProseMirror JSONContent (ProseMirror document format) to
* markdown text with proper mark nesting.
*
* Fixes the mark nesting bug in @tiptap/markdown where marks are serialized
* in AABB pattern (++**text++**) instead of proper ABBA nesting (++**text**++)
*
* Usage:
@joshualyon
joshualyon / wsclaude.sh
Created June 20, 2025 15:41
Open or foreground a dedicated 'claude' instance of Ghostty
#!/usr/bin/env bash
PROJECT_DIR="${1:-$(cd "$(dirname "$0")/.." && pwd)}"
APP_BUNDLE="/Applications/Ghostty.app"
WINDOW_TITLE="Claude WebStorm" # must match the --title you pass below
GHOSTTY_ARGS=(
--initial-command="claude /ide"
--title="$WINDOW_TITLE"
--working-directory="$PROJECT_DIR"
--macos-icon="retro"
@joshualyon
joshualyon / dynamicLinkCT.html
Last active June 10, 2024 17:22
Dynamic Link Custom Tile
<a id="link">...</a>
<script src="https://cdn.sharptools.io/js/custom-tiles/0.2.1/stio.js"></script>
<script>
var anchorEl = document.getElementById("link")
stio.ready(function(data){
var urlVar = data.settings.urlVar;
var textValue = data.settings.textValue;
<div id="main">
<img id="icon" />
<div id="value"></div>
</div>
<script src="https://cdn.sharptools.io/js/custom-tiles/0.2.1/stio.js"></script>
<script>
var valueEl = document.getElementById("value")
var iconEl = document.getElementById("icon")
<!-- Do not edit below -->
<script type="application/json" id="tile-settings">
{
"schema": "0.2.0",
"settings": [
{
"type": "THING",
"name": "myThing",
"label": "Your Thing",
"filters": {"capabilities": ["switch"]}
<!-- Do not edit below -->
<script type="application/json" id="tile-settings">
{
"schema": "0.2.0",
"settings": [
{
"type": "VARIABLE",
"name": "myString",
"label": "Your Text Variable",
"filters": {"type": "String"}
@joshualyon
joshualyon / InternationalClock.html
Last active November 1, 2022 19:54
Basic International Clock for SharpTools
<!-- Do not edit below -->
<script type="application/json" id="tile-settings">
{
"schema": "0.1.0",
"settings": [
{
"name": "timezone",
"label": "Timezone (IANA format)",
"type": "STRING",
"default": "America/Chicago"
@joshualyon
joshualyon / openWeatherTile.html
Last active December 22, 2025 20:50
Open Weather Map POC Tile
<script>
/*
VERSION: 2025-12-22
Multi-provider weather tile supporting:
- Open-Meteo (no API key required - default)
- OpenWeatherMap 2.5 Multi-endpoint
- OpenWeatherMap 3.0 OneCall
The API Key, Latitude, and Longitude are now set in the Tile Settings
@joshualyon
joshualyon / svgTechnicalProofHubitat.groovy
Last active May 15, 2020 14:37
Technical Proof of Concept rendering a dynamic SVG directly to the browser from Hubitat
/**
* SharpTools SVG Rendering Technical Proof of Concept for Hubitat
* Author: Josh Lyon (support@sharptools.io)
* Version: See getVersionMap()
*/
/*
Additional information can be found at:
https://community.sharptools.io/t/best-approach-for-irrigation-schedule-tile/3215/14?u=josh
*/
@joshualyon
joshualyon / simulated-illuminance.groovy
Created April 18, 2020 23:57
Simulated Illuminance (with Switch Mappings)
metadata {
definition (name: "Simulated Illuminance Sensor", namespace: "sharptools-io", author: "Josh") {
capability "Illuminance Measurement"
capability "Switch"
capability "Switch Level"
capability "Sensor"
command "setLux"