Archive for the ‘Software’ Category

GPSTrack 3.1.1 Released

Sunday, November 2nd, 2025

Today, I released an update to GPSTrack, my privacy-focused GPS tracking app. It is available on the App Store.

  • Improvements
    • Add search filters for Any Tag and No Tag
    • Attempt to retry generating track thumbnails (such as if they don’t initially render because you’re offline) without restarting the app.

  • Bug Fixes
    • If there are no Recent Tracks widgets, do not schedule a background task to update.
    • Fix new track snapshots not always appearing immediately in the tracks list.
    • Fix possible unlikely crash when starting tracks.
    • Other minor UI fixes and improvements.

GPSTrack 3.1 Released

Tuesday, October 14th, 2025

Today, I released an update to GPSTrack, my privacy-focused GPS tracking app. It is available on the App Store.

  • New Features
    • Add Tracking Control widget: Now you can control GPSTrack from your home or lock screen.
    • Add saved searches. You can now save and quickly retrieve frequent search queries.
    • Add Recent Tracks widget. Show your most recent tracks, or all of the tracks in a saved search.
    • Allow sorting tracks by date and distance.
    • Add support for Siri shortcuts. Control GPSTrack with your voice!

  • Improvements
    • Live Activity: Add duration, speed, elevation, and action buttons.
    • Add searching tracks by relative date range.
    • Improved support for iOS 26.

  • Bug Fixes
    • Improve iPad interface at small widths.
    • Other minor UI fixes and improvements.

GPSTrack 3.0.2 Released

Thursday, August 14th, 2025

Today, I released an update to GPSTrack, my privacy-focused GPS tracking app. It is available on the App Store.

  • New Features
    • In Track Details, added chart grid lines for minimum/maximum elevation and speed.
    • Restore support for sharing tracks via email.
      • This feature is available with a GPSTrack Plus subscription, and for users who purchased the app before GPSTrack 3.0 was released.
  • Improvements
    • Allow swipe to unarchive for archived tags
    • Performance improvements
    • Improvements and bug fixes for upcoming features
  • Bug Fixes
    • When adding a track to the map, if the track was the most recently recorded track and still on the map (blue), its color wouldn’t be changed (to red).
    • Fixes the current track not drawing in some cases.
    • Improve handling of upgrading v2.x databases with no saved tracks.
  • Other
    • This is the last version supporting iOS 17. Future versions will require iOS 18.

GPSTrack 3.0 Released

Tuesday, June 10th, 2025

Today, I released GPSTrack 3.0, my privacy-focused GPS tracking app for iOS. It is available on the App Store. This is the first public release since 2014.

GPSTrack 3 is a complete rewrite from the last released version, now in Swift and (mostly) SwiftUI. The changelog is so long it’s almost better to think of this as a completely new app.

This version switches from being paid-up-front to a subscription model. While paid-up-front worked in the early era of the app store, it’s no longer a sustainable approach for most developers, and as much as I dislike subscriptions myself, switching to subscriptions is the only way I can justify further development.

Users who purchased GPSTrack while it was previously on sale have full access to all functionality that was available in the last public release (2.2.1). Some (but not all) new features require a subscription. If you previously purchased GPSTrack and are not sure if the app is recognizing your prior purchase, please feel free to reach out.

SwiftUI Memory Leak Workaround

Thursday, October 12th, 2023

The new Observation framework in iOS 17 (and aligned macOS, tvOS, and watchOS releases), with its @Observable macro, provides a fantastic and higher-performance way for SwiftUI applications to trigger view updates, compared to the older ObservableObject approach.

To do this, the framework retains strong references to reference objects that are being tracked. However, this combines with a bug in SwiftUI that causes objects in views to not always be released when the view is dismissed.

[Update: The bug in SwiftUI was fixed sometime after iOS 17.1, so this tool is no longer needed. It is available for historical insight.]

The Problem

This manifests when a SwiftUI view presents a sheet or fullScreenCover and the view captures an object. The object is retained by the system, but is not released when the presented view goes away.

For small objects, this may not be a problem, unless they’re also tracking notifications or other external events.

Larger objects are the main problem; I discovered this issue when I noticed one of my apps using several gigabytes of memory when it had no open windows.

This bug is present in at least iOS 17.0 .. 17.1b3.

To solve this problem, I created the SwiftUIMemoryLeakWorkaround package. This package provides a way to resolve the problem in a way that should be relatively backwards-compatible when the OS bug is eventually fixed.

The Solution

The solution is to instead have a UIViewController handle the presentation of sheets. This is accomplished by injecting a coordinator object into the SwiftUI environment that has a UIViewController that is the parent of the SwiftUI view. Then, the SwiftUI view is modified to call the coordinator, rather than sheet or fullScreenCover directly. The coordinator uses its stored view controller to present a new view, and creates a new coordinator to inject into the sheet view with the child view controller.

An extension on View provides accessors (leak_workaround_sheet and leak_workaround_fullScreenCover) that create a view modifier that uses the coordinator to trigger presentation. In the event the coordinator is not set or is set to nil, it falls back to the system behavior.

The included Example.xcodeproj demonstrates both the problem and the solution.

This is not a perfect solution. Sometimes, the coordinator itself is leaked. The coordinator object contains two weak references and an optional UUID, and so is relatively tiny compared to the view models that would likely be leaked instead.

Announcement: php[tek] 2017 Conference Talks

Thursday, January 12th, 2017

I’m pleased to announce that in May, I will be giving two talks at the excellent php[tek] conference in Atlanta, GA. One will be a technical talk on computational algorithmic complexity. The other is a comparison of long-distance hiking and software development, which I developed over the course of my Appalachian Trail thru-hike, and which I’m particularly looking forward to giving.

I missed last year’s php[tek] because I was on the Appalachian Trail at the time. This was the first tek I’ve missed since 2010, so I’m happy that I get to go this year partially to talk about why I wasn’t there last year!

For more information on my Appalachian Trail thru-hike, please feel free to see my hiking blog, longstride.net.

BowerBundle Released

Monday, November 24th, 2014

Last night, I released BowerBundle, a super-simple bundle for Symfony that enables running Bower update/install automatically after running Composer update/install. I’ve used this for several different Symfony apps, and now it’s available for your use as well.

You can download it via GitHub, or via jbafford/bower-bundle in Composer.

GPSTrack 2.0 released

Wednesday, November 17th, 2010

Today, the first major update to GPSTrack, my iOS GPS tracking application, made its way to the App Store, now with support for the iPad (WiFi + 3G).

I didn’t make too big a fuss about the 1.0 version, knowing it would have the sort of annoying bugs that every 1.0 release has, and while 2.0 still doesn’t have all the features I wanted — I severely underestimated how much time adding iPad support was going to take, and some of which I hope to blog about soon — I’m pretty happy with the improvements I’ve made so far, but now that 2.0’s released, I can actually get back to adding new functionality.

Twitterslurp open source release

Tuesday, June 30th, 2009

Last month, I wrote about Twitterslurp, the twitter searching tool I developed at The Bivings Group, which displays a constantly-updating stream of tweets, as well as a leaderboard and stats graphs.

Today, we are very happy to release it as open source. You can download Twitterslurp from its Google Code project page at http://twitterslurp.googlecode.com/.

Since last month, I’ve made a lot of changes to improve the quality (and ease of configuration) of the Twitterslurp code. Twitterslurp’s error handling has been improved, and I added the ability to start and stop the tweet stream and show more than the most recent 20 tweets. Our graphics team also created a spiffy logo.

Yesterday and today, Twitterslurp has been driving a video wall of tweets at the Personal Democracy Forum conference in NYC. The conference, which just ended, had over 17,000 tweets in the last two days.

Previously, we ran test versions of Twitterslurp during mysqlconf and php|tek, and officially on behalf of the Dutch PHP Conference. Twitterslurp started as a project for a client to allow them to track tweets, and give members of their website rewards for tweeting with a particular hashtag.

We’ve also set up a copy of Twitterslurp tracking itself.

We’d love for you to check out Twitterslurp, and we’re open to any and all feedback.

Aggregate Map Tools, Part 1: GlobalMapTiles

Thursday, February 26th, 2009

My fourth open source release this week comes from work I’ve done for my employer, The Bivings Group. Today, we are releasing a set of code that assists with aggregating markers on a Google Map. Our clients wanted to be able to display markers on a map reflecting the locations of people who provided their location (city, state, zip, and in some cases, street address), but with tens of thousands of expected sign-ups, it’s not feasible to display all the points on the map at once.

(more…)