Chronodget 3.0.0

| Tags: dev, app, widget, ios

Chronodget 3.0.0 has landed in the app store. As every year I’ve raised the minimum required iOS to the current one — 17 — and updated the code accordingly.

The usage of the Observable macro that was introduced at WWDC 2023 enabled me to change the code to work as it was originally intended. When I started developing Chronodget in October 2020 I had some expectations regarding how the declarative UI would react to changes in the data model. I was somewhat disappointed that it did not react to changes in nested objects and had to add workarounds and restructure the code to match the capabilities of SwiftUI at that time. With the Observable macro I could get rid of most of those workarounds and make the code much cleaner.

This update comes with two new templates one of which is named “Abstract Timepiece”. It’s not really meant to show an exactly readable time. It just conveys an impression of how time flows. The background changes from morning to evening and also from the start of the year to its end. And the rounded rectangles show the progress of the month, week, day and current hour.

Chronodget Abstract Timepiece

While working on it I noticed that the percentage calculation for monthly time frames was buggy and fixed that.

Also while working on this widget, I noticed not for the first time that when using background objects filling the whole widget, neither the selected cell background nor the crosshairs are visible. Therefore there is now an additional button in the navigation bar to add translucency to every component in the widget making everything behind them also visible.

If you’ve already installed Chronodget, you should have gotten the update by now. Otherwise you can always get it in the App Store.

WeightGlance 4.0.0

| Tags: dev, ios, app, weight, health

Last week I released an update of my weight tracking app WeightGlance.

It’s now at version 4.0.0. The major version jump from 3.0.0 to 4.0.0 is due to the fact that it now requires at least iOS 17 which is somehow a breaking change from version 3.0.0 requiring only iOS 15 and later. As with each such update I modernized the code to be up to date with swift 5.9 and iOS 17.

But there are also two new things in version 4.0.0.

The biggest new change is that with iPadOS 17 the Health app and with that HealthKit comes to the iPad. And WeightGlance now also runs on iPads. It looks like it does on iPhones but on a bigger screen. But it also supports split view and slide over. Getting it on iPads wasn’t just adding that device type and checking all boxes on portrait and landscape modes, though. On the iPhone the app only supports portrait mode, but on an iPad all those possible size changes that occur as you rotate your iPad and use split view or slide over need to be handled, and even though the app uses auto layout, that alone does not suffice here. Also strange was that I had to remove HealthKit from the required device capabilities. Apparently that device capability is now used to constrain HealthKit using apps to only run on iPhones.

The second change adds a bit more information to the overlay that appears when you put and move your finger on the screen. Before it only showed a vertical line and the weight at that length. This is useful to find out what your weight was on a day or during a week in the past. But to find out for which week exactly a bar displayed the average weight was a bit complicated. You had to count the weeks yourself. Now the overlay also displays the start and end date of the week your finger is currently on.

As always you can get WeightGlance on the AppStore.

Epigraver 3.0.0

| Tags: dev, macos, screensaver

The last update to Epigraver in 2021 added support for running on Apple Silicon and there was no need to update it since then.

This year I updated early to the new macOS release macOS 14 Sonoma. At first Epigraver seemed to run just fine on Sonoma as it did on Ventura earlier, but after some time I noticed that the screen went blank showing only the background or that the animations looked odd and broken. Trying to investigate whether it was just broken on one kind of animation, I changed the settings to only use that one animation. But the settings change did not have any effect. It still ran all animation kinds that had been selected before. Now I knew that something was really amiss.

I found this post by a developer of another macOS screensaver who vented about Apple breaking the screensaver framework to be able to run their own screensavers as desktop backgrounds. That post also presents the fix I needed.

With version 3.0.0 Epigraver now also runs on macOS Sonoma. That release increases the minimum requirement to Sonoma, but you won’t miss much if you run 2.0.0 on earlier macOS releases. There is only one additional change which randomizes the animation timing function to add a bit of variation to the animations.

Chronodget 2.0.0

| Tags: dev, app, widget, ios

Chronodget 2.0.0 has landed in the app store. The reason for the major version increase from 1.2.0 to 2.0.0 is that 2.0.0 requires iOS 16. That enabled me to remove some hacks and workarounds and make the code cleaner.

But there are also some visible changes here. The first one is a link to a usage manual on the main screen of the app. You’ll notice a question mark icon in the navigation bar when opening the app after the update. Depending on the localization used by the app this opens your browser on the English or German usage manual for Chronodget. At the start of 2022 I decided to write a step by step documentation after some relatives of mine downloaded the app and told me they had no idea how to actually use it. Having worked on it for a half year and knowing the reasons for all the design decisions that shaped the app, I had hoped that how to use it would be evident, but the feedback spoke for the opposite. I first wrote the German manual and then translated it into English. Both variants have their own localized screenshots and both sets of screenshots are available in a light and dark mode version. So when you open the manual while having dark mode switched on, the website switches to dark mode as it does for any other page and the screenshots shown are from the dark mode variant of the app. I couldn’t resist the opportunity to tweak the code of the website to add dark mode images.

This version of Chronodget also brings two bugfixes. The first one fixes color handling. It has been a known bug since the beginning that sometimes the displayed colors were somewhat different than what was chosen in the color picker. This was most annoying when trying to fake a transparent widget. One way to do it is to make a screenshot and use the right part of it as the background of the widget. A better way for backgrounds that use one color without any gradients or any other effects is to just use the color picker to pick the background color of the screen and use that as the background color of the widget. Doing that isn’t easy but manageable. You open the picker, tap and hold the eyedropper icon, close Chronodget by swiping up from the home indicator and then release the eyedropper while over the background. Back in Chronodget the background color will be selected in the color picker. But now the background of the widget would look slightly different from the background of the screen. It turned out that mixing up color spaces was the problem. The color picker uses display P3 by default and the widgets used sRGB. Now colors are always converted to display P3 and interpreted as display P3 and colors look as expected.

Another bug that existed since the first release of Chronodget was a somewhat broken font handling on some devices. While working on Chronodget I created several widgets with it. One purpose of this was to afterwards have some templates to ship with the app. The other was to test the app and to improve it based on the insights I got from creating more complex widgets with it. At the time as I worked on the binary clock that is included as a template, the app had no copy&paste feature. That widget contains 11 components that look very similar. Recreating it again and again became boring. So that’s how the app got its copy&paste features. Then after adding the text component type I started to implement a clock I had seen somewhere. You have 4 rows of digits for the hour part and 4 rows of digits for the minute part. The digits for the current time light up while the others remain visible and seem to be switched off. It worked out pretty well and I liked that widget. I had to rework it several times because the first version was too complex and would stop working or not even load on the home screen. But in the end I succeeded to create a version that worked fine. It looked good on my iPhone and my iPad. The app was ready to be put in the app store. As I started to make screenshots of the required sizes I noticed that on the simulators for some device types that last widget looked totally broken. I had not idea why. It looked just fine in the app on those simulators but on the home screens it looked horrible. I retained it as a template because it worked on at least some devices, but I had to remove it from the screenshots. With version 2.0.0 I found a fix. The way I used to set the font is affected by dynamic type adjustments. Why that affected the widget on some devices and not on others and why only on the home screen I have no idea. But finally that bug is gone.

Chronodget 2.0.0 does not have lock screen widgets and currently I have no plans to add lock screen widgets. There is literally not much space for customization there. If the standard clock could be replaced with a widget, I would add that to Chronodget.

iOS 17 will be unveiled next month. Let’s see what changes it will bring for widgets. Even without any exciting changes there, I have some ideas for Chronodget. So maybe version 3.0.0 won’t take as long as 2.0.0.

20th Anniversary of beeger.net

| Tags: blogging

Some days ago this blog turned 20 years old. In the first 10 years I changed it frequently. The theme changed, the blogging engine changed and the code changed quite a bit during that time as I gained more experience with HTML and CSS. You can read all about that in the 10th anniversary post.

In the last 10 years the theme hasn’t changed as much and as often as in the first 10 years. The colors only got adjusted a bit and it got dark mode support and the buttons at the top were replaced by simple icons.

Shortly after the post about the 10th anniversary, I changed back again to static publishing. At first with Octopress and finally after updating to Octopress 3 and moving on to using Jekyll directly I ended up with Hugo. With the change to Octopress, Jekyll and Hugo, I have no longer a blogging web application on my server. The website is generated on my computer at home and then uploaded to the server. There is no blogging web application any more needing frequent updates to prevent security issues. As I’m not into live blogging and my blogging frequency is rather low, this setup is perfect for me.

GDPR was a challenge when it was introduced. I already had a somewhat wordy privacy policy and with GDPR it would need to become even longer. This is mainly a private blog. Sometimes I write about the apps I create. That is the only commercial usage. I decided that I wanted to have a simple privacy policy and changed it to

This website does not collect any personal data.

I think it’s fun when you compare it to the long texts you usually see on websites. And it’s true. There is no tracking here. There are no external resources and no social network buttons that notify their networks each time someone visits a page here. I dislike trackers and decided that I really don’t need the insights they generate.

Another bigger change was the restructuring which resulted in the creations section. Before I have been using subdomains or separate domains for my apps and other things I created. Now I can use this section as a kind of portfolio of the things I created.

In some years I write a blog post nearly every month and then there are years like this one when a blog post in June is the first one of the year. I highly recommend using the atom feed or json feed if you don’t want to miss my infrequent posts.

I’m looking forward to the next 10 years. Will it still be HTML and CSS then? We’ll see.

Chronodget

| Tags: dev, app, widget, ios

Chronodget Binary Clock

iOS 14 brought us widgets. I started playing around with widgets just after iOS 14 was released last year, but I soon decided that I really don’t need any of those widgets the apps I used offered. It might be useful to have a calendar widget, a todo widget and a weather widget if you have a tight schedule and much on your todo list, but gladly that is almost never the case for me.

But one day I was in a grumpy mood and thought that a widget showing me a progress bar to the end of that pandemic year 2020 would be useful.

As I wanted to learn SwiftUI, a new way to build UIs for iOS apps, and generally to again do more iOS development than I had the chance to do in my job at that time, I decided to write an app for that.

Clocks aren’t that much different from yearly progress bars. They also change over some period of time. The idea for the app expanded to be a widget builder for widgets that somehow periodically or in a fixed time frame change. Progress bars would get filled and clock hands would move.

With that the name for the app — “Chronodget” — didn’t take long to manifest itself. It derives from “chronos” as the greek word for time and “dget” which is the suffix of “widget”.

At first development was rather slow. I only tinkered with the app on weekends. But after quitting my job in April, I began a sabbatical phase and started really working on the app.

And now it’s here. It’s free and available for iPhones and iPads running iOS/iPadOS 15 and you can get it from the App Store.

As with all things I create, there’s a new creations page with some more screenshots.

The Midnight Library

| Tags: book, fiction

In “The Midnight Library” by Matt Haig a 35 year old woman decides to end her life. In her opinion that life has been a series of bad decisions. And nobody needs her anyways. So there is no reason to keep going on.

But instead of just dying after taking some tablets, she awakes in the Midnight Library where she can try out all those lives she might have had, had she made some other decisions.

It’s a deeply philosophical book ending with a predictable conclusion. But the way to that conclusion is a nice story worth reading.

Alif the Unseen

| Tags: book, fiction, fantasy, sci-fi

“Alif the Unseen” by G. Willow Wilson is a nice mix of fantasy, science fiction and something I’ll call islamic mythology.

Alif is a hacker living in an unnamed emirate. He and his fellow hackers are fighting for their freedom against a hacker working for state security known as “the Hand”. The Hand tries to enforce total control over the citizens of the emirate.

Alif writes code. That code seems to be some form of machine learning software. Later a book named “The Tousand And One Days”, which is somehow a counterpart to “The Tousand And One Nights”, appears and seems to contain some hidden instructions that enable Alif to code an artificial intelligence.

It’s quite a ride with djinns, references to Star Wars and other nerdy stuff. Some compared it to the Harry Potter books, but it’s actually a different kind of story. There is something that resembles the “Diagon Alley” in the Potter books, but that’s about it. And that’s Ok. It does not need to be some new Harry Potter thing. It’s good as it is — on its own.

The Raven Tower

| Tags: book, fiction, fantasy

“The Raven Tower” by Ann Leckie is a strange book. The strangeness starts with the usage of the second person singular. I actually don’t remember to ever having read a book where the narrator tells the protagonist his story.

The narrator is a god who lives in a stone. The chapters alternate between those where the god tells its own story and those where it tells the story of the protagonist.

As a god living in a stone or being a stone, it is a very patient god who takes its time to think things through. The world in this book has no real magic. But there are many gods and gods can make things true. If a god says that something is some way or another, then it becomes that way. But each such statement costs the god some energy. And some statements may continually drain energy from a god or may require more energy than the god has. If that is the case the god dies. So gods are normally very cautious what statements they make. Gods get their power from prayers and offerings.

It’s a quite interesting system. People pray for things and make offerings to their gods. The gods gain energy. But now they need to consider whether to fulfil the wishes the people pray for or not. Making the wishes come true costs energy, but not doing anything will eventually diminish the number of worshipers.

After the first bewilderment about that usage of the second person singular, I got really fascinated by the stories. This is not another Tolkien-like story where a group of companions fight against some dark power.

I recommend it to anyone looking for fantasy that breaks out of the box.

The Queen's Gambit

| Tags: book, fiction

I saw that there is a new series on Netflix called “The Queen’s Gambit” but ignored it. It’s something about chess players. I’m not overly interested in chess although I know the basic rules. Then the book appeared in Amazon’s English Kindle deal of the month for just 0.28 € and I bought and started reading it on a whim.

The author — Walter Tevis — tells the story of the orphan girl Beth Harmon, who discovers her talent and passion for chess while living at an orphanage.

It’s a coming-of-age story with an emphasis on dealing with the pressure to strive for ever greater successes and the fear of failure. There are phases of drug and alcohol abuse, of desperation and of again finding the power to keep going.

Even though the book is full of chess technicalities — a great part of the book is about people playing chess and trying to predict the next moves of the opponent — it turned out to be very engaging and fun.