• Easy Porkbun DDNS

    I’m liking Porkbun as my registar. One nice thing: they have an API and formal DDNS support. And good docs. However their recommended DNS client is some absurd persistent process which runs a web server. Give me a break! I’m using mietzen’s porkbun-ddns instead. It’s a simple Python client that you can easily run from cron. Seems to work fine. The configuration is a bit of a PITA but once it’s set up it runs with no hassle.

  • Looking at Health Connect data for InBody, etc

    Tinkering with Android’s Health Connect data, the hub for fitness data in the Android ecosystem. I don’t want to mess with their formal APIs so I’m looking to use the nightly full database backups I have it making to Google Drive. They seem to work and contain real data. (This may be a mistake: Health Connect has some semantics implicit in their API I’m having to rediscover by looking at the raw data.)

    The result is a .zip file with a single .db file in it, a sqlite3 database. That database has some 73 tables in it but many are empty. So my sexual_activity_record_table shows 0 records, rude!

    I’m mostly interested in data from my InBody scale. But I may also have data written from a Amazfit writsband, a WiThings scale, Cronometer diet tracker, maybe the phone itself. Don’t know! Here’s some tables that do have interesting data in them, data that was updated in the last day or two.

    Tables seems to come in a couple of types. Some are very simple tables with no app or device identifier and no timezone info. Other tables have complex data with time zone offsets and app and device identifiers. These often are recording cumulative counts for the interval or the like. My theory is the simple data is for old Google Fit APIs and the more complex data is coming from apps using Health Connect APIs. It may be something else.

    One thing I’ve learned doing this is Health Connect allows multiple devices and apps to record to the same record of, say, your weight. For my purposes I want to separate those out by ID so I can know whether a weight measure came from the WiThings scale or the InBody scale. Or whatever.

    InBody Data

    Bottom line: the only useful things this is writing are weight and body fat. I bought the fancy H30 scale that does more precise measures of skeletal muscle mass. They are not recording this data to Health Connect, disappointing. (I do wonder if they can: Health Connect seems to have fixed categories of data.) InBody doesn’t seem to have any other data export options, either. Ugh.

    • weight_record_table (WiThings also writing data)
    • body_fat_record_table (Inbody writes twice, WiThings also writing data)
    • basal_metabolic_rate_record_table (AmazFit also writing this)

    Amazfit Data

    Bottom line: this is recording a lot of stuff. Steps, Oxygen, Calroies burned, Heart rate, Sleep.

    Data is often logged every 10 minutes, but not always. Its data seems to be coming from app ID 1 (Google Fit) and device .

    Simple data recorded every N minutes

    • heart_rate_record_series_table
    • speed_record_table
    • activity_date_table
    • sleep_stages_table (contains an interval but is simple data)

    Complex data recorded every N minutes

    • steps_record_table (both phone itself and Amazfit / Zepp)
    • distance_record_table
    • oxygen_saturation_record_table
    • total_calories_burned_record_table (Amazfit and Phone)
    • resting_heart_rate_record_table
    • sleep_session_record_table (naps vs. full sleep)

    Tables with lots of rows but no actual measurements, just time intervals

    • heart_rate_record_table
    • SpeedRecordTable

    Cronometer data

    • nutrition_record_table (many columns!)

    Phone-originated data

    • height_record_table (written once a day)
    • activity_intensity_record_table (contains no data?)

    Administrative tables and misc data

    • read_access_logs_table
    • change_log_request_table
    • sqlite_sequence
    • preference_table
    • health_data_category_priority_table
    • device_info_table
    • application_info_table
    • android_metadata

    From this I learned some device and app IDs.

    Devices

    • 1: ? (seems to be my AmazFit)
    • 2: Withings
    • 3: ? (also my AmazFit?)
    • 4: my Pixel 8 phone

    Apps

    • 1: Google Fit (coming from other systems?)
    • 2: Withings
    • 3: Google Play services (???)
    • 4: Android Shell (???)
    • 5: Zepp, which is the Amazfit fitness band
    • 6: Cronometer
    • 7: InBody
    • 8: OMRON Connect, a blood pressure monitor
    • 9: Health Sync, an app I installed
  • Setting the stupid clock on my Viking VSOE530

    I have a fancy oven with a stupid digital clock and twice a year I have to look up how to set the stupid time. The trick is which two magic buttons you have to hold down at once. Here’s the instructions

    Setting the time-of-day:

    • Push and hold the “min/sec timer” and ‘bake time” buttons simultaneously.
    • Turn the “Set” knob until correct time is displayed on the digital clock.
    • Release hold from “min/sec timed’ and “bake time” buttons.
      The analog clock’s time will automatically set to match the digital clock.

    There’s also elaborate instructions for synchronizing the analog clock hands to the digital clock. But usually they will sync themselves.

    Daylight savings time is fucking stupid.

  • Getting the smaller, cheaper Google One plans

    If you want to buy Google’s smallest Google One plans, you may have to go to the settings page, cancel Google One first and then buy again. In particular they don’t show you cheaper options unless you cancel first. Don’t worry: the cancellation isn’t immediate, it comes effective when your current month is up. You have time to re-enable a new smaller plan.

    I use about 40GB on Google One and have paid $2/mo for years for the 100GB plan. I upgraded a few months ago to some AI Premium plan that came with 2TB for $20/mo. I hated the AI so I switched back to what was the smallest plan on offer, the 2TB no AI plan for $10/mo. They weren’t showing me the 100GB $2/mo plan. I found the workaround to cancel in a Reddit discussion.

    Google dropped the “Don’t be Evil” ethos more than a decade ago. Stuff like hiding cheaper plans is clearly on the evil side. Dumb and sleazy.

  • Getting data from Google Fit and Health Connect

    Health Connect is Google’s data platform for fitness info: weight, steps, etc. Summary: Health Sync is a humane way to get at the data stored in it, so are Health Connect backups.

    Health Connect replaces Google Health, a very old product. It also sort of envelops Google Fit. Health Connect isn’t really a consumer product. The consumer product is the Fit app where you can see some records and history. But it’s pretty minimal. Health Connect is more of a database for developers that Google maintains. Various things can store data into Google Fit, various things can take it out. In my case my scale (an InBody) stores my weight in Google Fit and my diet tracker (Cronometer) pulls that data out. Sometimes, it doesn’t seem very reliable.

    Worth noting that Health Connect happens on your phone. I don’t think much if anything happens in the cloud.

    There’s no simple CSV data export from Health Connect. Shocking oversight, I know. Google Takeout also has no entry for Health Connect. Here’s four alternatives to getting your data:

    The Health Connect app in Android has a way to set up a nightly backup to Google Drive. The resulting Health Connect.zip is about 20MB in my case. It contains a sqlite database that is unencrypted. It’s pretty straightforward to get weight, steps, etc out of it. It works for me.

    Google Takeout for Google Fit does work. This gives you data in a messy pile of small JSON files with names like raw_com.google.weight_com.inbody2014.inbody_he.json. My actual weight data is stored in there, it would not be hard to write a tool to convert the data into a clean CSV. Maybe someone has.

    Health Sync is a third party app that syncs health and fitness data between apps. Sort of Zapier for health data. I connected Google Fit to Google Drive with it and it seems to be creating nicely formatted CSV files for me. It also has a Health Connect sync to Google Drive which should sync everything all at once, but may not be able to get at data history. I’ve got it turned on as well and am not clear what it is doing.

    There’s a fourth alternative I haven’t explored.. Google Fit does have a cloud platform and API and it should be possible to write software to fetch data from it to a server. Maybe someone’s done this. But Google Fit appears to be on its way out, I wouldn’t invest in this. Health Connect does not have any sort of cloud API, it’s all running on Android only.

    Needless to say this is all a big mess. Part of the problem is Google is trying to meet privacy requirements, health data is particularly sensitive. It’s the same with location tracking, like Google Timeline. They’re moving all this stuff to only live on the user’s Android devices so they are less responsible for it. It’s awkward.

  • New email setup

    Email is the most important Internet service I use. I’ve been using something like email since the mid-80s on BBSes. I had my first networked email in 1988, a very rickety UUCP setup to a local BBS. 1989 at college got me real email, first uunet!ogicse!reed!minar, then minar@reed.bitnet, and finally nelson@reed.edu and proper SMTP. I moved on to santafe.edu and then media.mit.edu along with monkey.org which was my personal email home for nearly 30 years.

    Names

    This week I’ve moved on from monkey.org. I’m now using somebits.com as my primary email domain. I’ve owned that domain for 20 or 25 years now but have only used it for my web stuff. Now it’s my email address, hopefully for the rest of my life.

    I’m not in a hurry to change my email address everywhere. I’m still not fully trusting the somebits.com setup but it seems reliable so far! But it’s an enormous task to change every single Internet account over to a new login email. I’ll be receiving mail at monkey.org and gmail.com for yeas.

    SMTP services

    Currently I’m hosting somebits.com email on Google Workspace via the usual MX setup. They do a good job of accepting mail for my preferred mail user agent. They also do a good job of delivering email for me. All the DKIM and other antis-apm stuff a modern domain needs works fine on Google Workspace. And the company has a good reputation, so most sites will accept their mail.

    Before this switch my monkey.org address was being handled by hostedemail.com, a TUCOWS service. It worked OK for many years but not perfectly. Some of my mail got bounced for not being properly DKIM signed, and some mail never got delivered. Part of my problems were I was just having hostedemail forward to Gmail and that was not 100% reliable.

    Mail User Agent

    I’ve used Gmail since 2004, when it launched. Before then I used Thunderbird on a self hosted SMTP and IMAP setup. And before then various Unix local mail delivery systems with an emacs mail reader, Berkeley mail, etc. I’m still using Gmail today as my primary email archive and all my mail is sent to or through it.

    But this week I switched to Shortwave as a frontend to Gmail. It uses Gmail as the archive and mail services but has its own web app. The webapp is pretty Gmail-like but nicer in lots of little ways. And it’s married to a very good LLM and RAG system so I can do natural language queries about my email like “when is the potluck today?” or “what recipes did I share with my friend Jack?” I’ve written a bit about it already and have more to say. It’s very good but not perfect.

    Future changes

    This is enough change for awhile! But I still have a couple of other things I’d like to do.

    I have old email archives in mbox format going back to 1990 or so. I never did get around to importing them into Gmail and would like to. Now that Shortwave can do a good job talking about those mails maybe it’s finally time.

    I’d still like to write my own email search system. Shortwave is a good product, I don’t need to. But I think I could learn something tinkering with my own RAG system. Also maybe do some specialist things Shortwave doesn’t do, like analytics.

  • Starlink latency got worse, then better

    Interesting change in my Starlink performance August 30 – September 7. The jitter on latency went significantly up, as did max latency and average. I think the packet loss also went up a bit but I’m less certain.

    This change was noticed by other users, particularly gamers. Some users also reported seeing higher speeds in this interval: I don’t think I did.

    Picking random days…

    2025-09-02: average latency 30ms, packet loss 0.09%
    2025-09-11: average latency 27ms, packet loss 0.06%

    But the big thing is how the blue line jumps around so much more in those days. I don’t have a numerical measure of standard deviation but you can eyeball it.

    Overall I’d prefer more predictable latency and less pocket loss even if it costs a little throughput. Starlink regularly exceeds the 100 Mbps I think of as “good enough” but I sure wish the transport was a little more reliable and predictable.

  • Shortwave AI email

    I decided to give Shortwave a try. It’s a better email client with significant AI features. I mostly want it for better LLM-powered search of my old email, something Google cannot do. So far I’m impressed. Only drawback is its expensive for a consumer product: starts at $288 a year, I’m paying for the $432 a year version. There is a free trial.

    First impression is very good. It works fine as a Gmail replacement, with two-way sync to Google data that seems to work.

    The onboarding is a bit slow. Recent email works immediately. It’s pulling in archives. After four hours it has indexed some mail but I can’t tell how much, there’s a progress bar showing 10%. I do have 12GB of email over 21 years, I can imagine it takes awhile. They don’t have a way to just upload a Google Takeout dump.

    My first AI query went very well. I sent a bunch of emails today about hosting a party. It read them all and summarized them usefully. There was more below this post, details of RSVPs from specific people in a very nice summary. This is the kind of magic I am expecting in an LLM with my email.

    Asking it for “what is my oldest email” didn’t go as well. I have email back to April 2004. It didn’t find the older ones at all at first. Finally with a lot of prompting it found April 29, 2004. Then I had to ask more and it finally, finally got to the April 2, 2004 emails it should have found in the first place. Ie they’re there, but the AI retrieval didn’t work well. I’m wondering if “oldest” is just not something they optimized for.

    Update: support replied quickly with an excellent reply that boils down to “oldest doesn’t work well”. They suggest giving explicit date ranges. That matches what I’ve observed.

    Various other freeform queries show some remarkable comprehension of my emails. It’s not perfect, I feel some things are occasionally missing. And the whole system is a little too business-tuned whereas I’m often using this for personal correspondence. But overall it’s useful.

    It also has features to write emails for you and promises to do that in my own style. I don’t really want this, it seems rude to have a robot write my email for me. But it is interesting as an editing tool.

    Party details

    Just for laughs, here’s what Gmail / Gemini offered me

    This is the second wrong answer I got from Gemini. The first one earlier today was about a friend who is having a birthday the same day. It has nothing to do with my party at all. I did finally got a right answer when I prompted it “the party is saturday sep 13. I sent a lot of email about it today. can you find that”. This suggests the retrieval part of the pipeline is what failed here, not the summarization.

  • WattBox hacking

    My new TV has an expensive power strip called a WattBox. It’s kinda neat, has an Internet interface and you can individually monitor and turn outlets off and on, also can accept a UPS status as input, etc. It’s overkill for me but it’s neat.

    Also it has REALLY BRIGHT LEDs above each socket to indicate if power is on. Yes, the thing that’s designed to sit next to your TV shines bright lights. I was hoping I could dim the LED level via software but I can’t. So black stickers it is. But I did learn a bit about hacking it.

    The key thing is to go to the support page and grab the API docs, It has a simple telnet interface: you type ?Firmware at it and it responds ?Firmware=2.3.0.2. There’s this simple control interface for most functions.

    The product does also have a basic webapp interface and a fancy custom software tool called OvrC that doesn’t seem to be free. There’s also a bunch of open source wrappers for the API, including Home Assistant support. Would be nice if you really want to monitor or control the power.

    I just want to turn the LEDs down. There doesn’t seem to be that ability. There are FaceplateLedLevel commands but that seems to apply to an accessory I don’t have installed. Mine reports a level of -1 and ?FaceplatePresent=0.

  • Gemini AI in Gmail is terrible

    I keep musing over the idea of using an LLM to work with my 20+ years of email archives, currently in Gmail. I finally realized a couple of days ago Google has this product. It’s part of Google AI Pro, also sometimes called Google AI Premium and often labelled “Google Workspace” (where the AI was first deployed). It includes a Gemini-in-Gmail system. It’s not just the product naming that’s such a mess though: the Gemini-enhanced Gmail is just terrible.

    The problem seems to be the retrieval part of the RAG that I imagine is powering this product. Gemini only seems able to see about 6 months of my email archives. Even with very specific queries like what’s the oldest email if you search for “steam purchase” in 2021? it doesn’t actually find that oldest email. Gmail keyword search works fine and finds about 10 or 15 emails. But then Gemini can’t find them.

    I started using Gmail April 2, 2004, the day after it launched. If I ask it for the oldest email of all it can see it gives me something from mid 2025 and provides a subject line. If I ask for the oldest email from 2003 it hallucinates an email from April 17, 2003 with that same recent subject line. It’s just not useful.

    I get that RAG is hard. I’m sure the Gmail team was asked to launch an AI feature very fast. But what they’ve deployed is terrible and should not have been released. The only excuse I can think of is if somehow this “show me the oldest” query is perversely hard for their system. Maybe it’s more useful on other types of queries? Not in my experience.

    I’ll tell you what’s really annoying: all the extra UI popups offering AI help where none is wanted. Including summaries of emails which are distracting and sometimes wrong. It’s like Clippy but worse. Just terrible all around.

    ChatGPT is doing way better. Too bad they don’t have the email product I want.

    Update: another example, Gemini can’t even keep track of the context of “3 emails I sent”.
    How many emails have I sent to this person today?
    You have sent 3 emails (This is correct)
    Can you summarize those three emails?
    It looks like there are only two emails in this thread.
    (Proceeds to summarize my mail and his reply, ignoring my other two sent emails.)