AI & Thermometers

I have a number of Thermopro thermometers at the office and at my house. They are accurate thermometers with Bluetooth and no Wifi — exactly what I wanted.

Until an HVAC issue at the office left me desiring to know the temperature there, even when I wasn’t.

In the olden days I might have Googled around a bit to see if someone had written an app to do what I wanted (read the Bluetooth and show it as a webpage) but in the golden age of 2026 I just asked Claude if a python library existed to read them.

Yes.

Great, now could it please build out a dashboard?

Yes.

It worked so fast and so perfectly that I had a second version built out at home with some basic alarms, so I can get a heads up if I’ve got fridge or HVAC problems at the house. It runs on an old but working Raspberry Pi.

Total time investment, ~15 minutes across both projects combined.

Thermometer readings for three locations: Bedroom at 72.0°F and 51% humidity, Fridge at 38.3°F and 17% humidity, Main at 72.3°F and 50% humidity. A graph shows temperature and humidity trends over 24 hours, with Bedroom and Main temperatures stable around 70°F, and Fridge temperature around 40°F.

So What?

To some degree (heh), there is no so what, there isn’t anything particularly special about this in and of itself.

Except anyone could have done it.

Sure, I had head start simply by knowing that things such as Bluetooth libraries for python exist, but there wasn’t anything particularly technical that I did. I knew what I wanted and asked Claude to build it. And it did.

I think that this is — in part — the future of software development. Where non-technical people are able to describe a thing that they wished existed, and AI will create it. It doesn’t need to be fancy SaaS software or even for more than a single purpose. No one else will ever have need of this application.

But if they did, they can now build their own, probably faster than even downloading and setting up my copy. “Hey Claude, build this.”

Felix Rhys

Post date: 2026-06-13, 0830

Felix Rhys was born on June 12th, 2026, 4lbs and 11oz. Mom is good, Felix is less so.

Felix was born breech at 7:32 PM, and probably spent 2-3 minutes stuck in the birth canal, and it took another minute or so for him to begin breathing*. He came out a grayish purple.

It wasn’t far from a scene out of a TV show, with at least half a dozen nurses in the room, the doctor, nearly everyone over Katie, shouting, then everyone over Felix trying to get him breathing and giving him oxygen.

It was a terrifying moment.

He seemed to stabilize quickly, but we weren’t able to hold him for more than two minutes until 10:30 PM, after they’d monitored his vitals, and they were concerned about his blood sugar which dipped down to 40 by 10:30.

After eating it went up to 55, but then dropped again overnight as this morning, around 7:00, the nursery nurse came to tell us it was in the 20s and that Felix is headed to Children’s NICU. They are working on getting him on an IV drip right now.

I’ll be headed there as soon as the transport is ready, Katie will have to stay at Parkwest, about 20 minutes away, for right now.

Felix is expected to be there between 2 and 3 days, but this seems like a fluid situation still.

Neonatal isn’t my area of medical knowledge, but I think this is at “concerning, not scary,” right now. At the same time, babies don’t end up in NICU for fun.

We’ll take prayers, I don’t know what else we need yet.

*My estimates, things were chaotic in the room and we didn’t get a debrief.

Export Apple Notes to XML

This AppleScript (written by Claude) will export ALL of your Apple Notes to a file on your desktop.

-- Export all Apple Notes to a single XML file.
-- Output: ~/Desktop/AppleNotes.xml  (change OUTPUT_PATH below if you want)
-- Run from Script Editor (Run button) or Terminal:
--    osascript ~/path/to/export-notes-to-xml.applescript
-- First run: macOS will prompt to allow automation access to Notes.

property OUTPUT_PATH : (POSIX path of (path to desktop folder)) & "AppleNotes.xml"

on replaceText(theText, oldStr, newStr)
	set saveTID to AppleScript's text item delimiters
	set AppleScript's text item delimiters to oldStr
	set theItems to text items of theText
	set AppleScript's text item delimiters to newStr
	set theText to theItems as text
	set AppleScript's text item delimiters to saveTID
	return theText
end replaceText

on escapeAttr(s)
	try
		set s to s as text
	on error
		set s to ""
	end try
	set s to my replaceText(s, "&", "&")
	set s to my replaceText(s, "<", "&lt;")
	set s to my replaceText(s, ">", "&gt;")
	set s to my replaceText(s, "\"", "&quot;")
	set s to my replaceText(s, (ASCII character 13), " ")
	set s to my replaceText(s, (ASCII character 10), " ")
	return s
end escapeAttr

on escapeCData(s)
	try
		set s to s as text
	on error
		set s to ""
	end try
	-- Guard against ]]> sequences inside the body breaking the CDATA section.
	return my replaceText(s, "]]>", "]]]]><![CDATA[>")
end escapeCData

on writeLine(fileRef, theText)
	write (theText & linefeed) to fileRef as «class utf8»
end writeLine

on run
	set fileRef to open for access POSIX file OUTPUT_PATH with write permission
	set eof of fileRef to 0
	my writeLine(fileRef, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
	my writeLine(fileRef, "<notes exported=\"" & ((current date) as string) & "\">")

	set noteCount to 0
	tell application "Notes"
		set allNotes to every note
		repeat with n in allNotes
			set noteCount to noteCount + 1
			try
				set noteName to name of n
			on error
				set noteName to ""
			end try
			try
				set noteBody to body of n
			on error
				set noteBody to ""
			end try
			try
				set noteId to id of n
			on error
				set noteId to ""
			end try
			try
				set noteCreated to (creation date of n) as string
			on error
				set noteCreated to ""
			end try
			try
				set noteModified to (modification date of n) as string
			on error
				set noteModified to ""
			end try
			try
				set noteFolder to name of container of n
			on error
				set noteFolder to ""
			end try
			try
				set noteAccount to name of account of n
			on error
				set noteAccount to ""
			end try

			set openTag to "  <note id=\"" & my escapeAttr(noteId) ¬
				& "\" name=\"" & my escapeAttr(noteName) ¬
				& "\" folder=\"" & my escapeAttr(noteFolder) ¬
				& "\" account=\"" & my escapeAttr(noteAccount) ¬
				& "\" created=\"" & my escapeAttr(noteCreated) ¬
				& "\" modified=\"" & my escapeAttr(noteModified) & "\">"
			my writeLine(fileRef, openTag)
			my writeLine(fileRef, "    <body><![CDATA[" & my escapeCData(noteBody) & "]]></body>")
			my writeLine(fileRef, "  </note>")
		end repeat
	end tell

	my writeLine(fileRef, "</notes>")
	close access fileRef
	return "Exported " & noteCount & " notes to " & OUTPUT_PATH
end run

Posts in This Category