[uv-cocoaheads] Upper Valley Cocoaheads: remote meeting 7pm, Thursday, 10 April

5 views
Skip to first unread message

Jim Matthews

unread,
Apr 3, 2025, 11:37:44 AMApr 3
to noreply-spamdigest via Upper Valley Cocoaheads
We'll gather remotely to talk about tech news.

We'll meet on Zoom:
Thanks,
--
Jim Matthews
Fetch Softworks
http://fetchsoftworks.com

James Murdza

unread,
Apr 4, 2025, 8:40:16 AMApr 4
to noreply-spamdigest via Upper Valley Cocoaheads
I wasn't able to make it to the meeting (timezones) but I wanted to update you all on what I'm working on/struggling with at the moment:

I'm currently working in AI/DevRel/education but as you may know, I also have an indie macOS app, Endurance, written years ago in Objective-C that I sell and makes about $800-1000/month. I actually enjoy maintaining it, but I don't, because it gets buried under other projects and I rarely open Xcode anymore.

The past couple years, I've been particularly worried that I’m not maintaining the app or making minor updates, so I put out a LinkedIn post for a paid internship and I got a ton (100+) of replies. Of those, many had done iOS/Swift development, and only one had used Objective-C. I had a couple calls with the guy who had Objective-C experience, (a really nice guy) I sent him the code, and he disappeared. (My code isn't that bad, I swear!).

At this point I'm literally down for anything—open sourcing the app, selling it, paying all the revenue to a contractor or intern—as long as the users are happy. I'll be considering all of these options. But thought I would write to this group for any possible emotional support and advice.

James

--
You received this message because you are subscribed to the Google Groups "Upper Valley Cocoaheads" group.
To unsubscribe from this group and stop receiving emails from it, send an email to uv-cocoahead...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/uv-cocoaheads/D36C3300-C84A-450B-AEF7-E609D40FC8D1%40fetchsoftworks.com.

Jim Matthews

unread,
Apr 4, 2025, 11:35:30 AMApr 4
to uv-coc...@googlegroups.com
Hi James,

I’m in a somewhat similar situation. Fetch brings in $1-2k/mo, and I have a sentimental attachment to keeping it going, but I haven’t had much time to devote to it since getting a full time job eight years ago. Recently it’s bothered me that I couldn’t even fix simple bugs because I’d upgraded my personal laptop to Xcode 16 while the Fetch project was back at Xcode 13. When I tried compiling the project in Xcode 16 I ran into lots of mysterious C++ errors.

I’m off work this week for other reasons, which has given me some time to pursue various projects, including Fetch. So I put Xcode 13 on a spare laptop and step by step moved it to Xcode 14, then 15, then 16. Some of the errors that came up were easy to fix, but others had me stumped. I heard that Google’s new Gemini 2.5 Pro LLM model was good at coding, and free, so I made it my assistant. Whenever I got an error I’d paste the relevant source files and errors into Google AI Studio and let it propose the solution. I went down some blind alleys, but ultimately got the code compiling, linking and running on Xcode 16. I am uncomfortable with the fact that I don’t really understand some of the changes Gemini proposed, but then I never really understood the code in question in the first place. It was written by Iris Artin, a former employee who’s a C++ whiz, and I could have paid Iris for help updating it, but using Gemini saved me time and money.

I expect that even with LLM help, at some point I’m going to have to shut Fetch down. I’ve thought about open sourcing it, but to do that responsibly I’d need to audit the code, and that in itself would be a project. I don’t think it brings in enough money for someone to want to buy it. So for the time being my plan is to look for ways to keep it going more cheaply, both in terms of my time and various expenses, and hope that I’ll know when it's time to pull the plug.

I don’t have any words of wisdom to offer, but I can offer sympathy with the choices you face — it’s hard to let go of a good thing.

Jim

James Murdza

unread,
Apr 7, 2025, 2:00:59 AMApr 7
to uv-coc...@googlegroups.com
I always find it frightening to open an old dusty project and click build...and holding my breath until it succeeds or fails...never knowing what monsters might have crept in.

Great to hear that you were able to fend them off for now with the help of AI! And I hope that you're able to come to a solution you're happy with for Fetch.

I still have a few ideas for how to appease my users with my limited time. I will play around and let you know in a month or so how it went. Thank you for your reply!

James

L Carl Pedersen

unread,
Apr 7, 2025, 3:13:27 PMApr 7
to uv-coc...@googlegroups.com
This discussion is interesting to me on several levels.  I've often worried about the sustainability of software, both my own and that of others.  One of my co-workers at DHMC had a very low resistance to purchasing packages from various companies I'd never heard of and using them in mission-critical software.  I always thought that was a bad idea.

Even as a homeowner, I worry about buying expensive appliances from companies that might not stay in business long enough to support them.

When I was at Vicinity (find the nearest McDonalds and get directions) circa 2001, I was assigned to enhance a piece of network software, written in Perl.  There was a chunk of code related to managing sockets that I found inscrutable.  I talked to the guy who had worked on it before me, and he said, "Oh yeah.  I never understood that code.   I copied it from something Jerry wrote.".  So, I went to Jerry, who said, "Oh yeah.  I never understood that code.  It was originally written by Dwight."  Well, Dwight had left the company before I was hired, but I knew Dwight was not proud of his coding skills.  There was a recommended piece of code in the Camel book that seemed to solve the problem and was much shorter and clearer, so I replaced the inscrutable code with that and a bunch of comments, and it worked fine at least for the rest of the time I was there.  But, I never knew for sure that I was not missing some subtle aspect of the old code.

Do I understand Jim correctly?  You are getting $1000 to $2000 every month from sales of Fetch?  I don't know how old you are but it seems like it would be very nice if you could sustain that into retirement.  It looks to me like Fetch costs $29, so that means 50 or more people are buying new licenses every month?   I assume these people are managing websites?  I did a little bit of that myself when I was at Vicinity.  The group I was in used the version control system to deploy new web code.  (Kind of like a Git push, but we were not using Git.)  I'm guessing there are a lot of alternatives for that?

A friend of mine who is not a developer asked me if any of the new AI tools could take code written in one language and convert it to another.  I've no experience with any of the AI stuff for coding.  Could the C++ code be converted to Swift using AI?  I'm guessing that's a little beyond the bleeding edge?

I'm also curious about the open source option.  Have any of you ever participated in an open source project?


Brett Tofel

unread,
Apr 7, 2025, 4:48:45 PMApr 7
to uv-coc...@googlegroups.com
I asked Google's Gemini 2.5 Pro for a sample of 25 lines of C++:

#include <iostream> // For input/output streams (like std::cout)
#include <vector>   // For using the std::vector container
#include <numeric>  // For std::accumulate (to easily sum vector elements)
#include <iomanip>  // For std::fixed and std::setprecision (output formatting)

// Function to calculate the average of numbers in a vector
// Takes a constant reference to a vector of doubles to avoid copying
// Returns a double (the calculated average)
double calculateAverage(const std::vector<double>& vec) {
    // Handle empty vector case to avoid division by zero
    if (vec.empty()) {
        return 0.0;
    }

    // Calculate the sum using std::accumulate
    // numbers.begin(): iterator to the start of the vector
    // numbers.end(): iterator to the end of the vector
    // 0.0: initial value for the sum (use 0.0 for doubles)
    double sum = std::accumulate(vec.begin(), vec.end(), 0.0);

    // Calculate the average
    return sum / vec.size(); // vec.size() gives the number of elements
}

int main() {
    // Create a vector of doubles
    std::vector<double> myNumbers = {10.5, 20.0, 15.3, 7.8, 30.1};

    // Print the numbers in the vector using a range-based for loop
    std::cout << "Numbers: ";
    for (double num : myNumbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl; // New line

    // Call the function to calculate the average
    double average = calculateAverage(myNumbers);

    // Print the average, formatted to two decimal places
    std::cout << "Average: " << std::fixed << std::setprecision(2) << average << std::endl;

    return 0; // Indicate successful execution
}

then I asked it to translate it to Swift:

import Foundation // Needed for String(format:) though often implicitly available

// Function to calculate the average of numbers in an array
// Takes an array of Doubles
// Returns a Double (the calculated average)
func calculateAverage(vec: [Double]) -> Double {
    // Handle empty array case to avoid division by zero
    // `guard` is a common Swift pattern for early exits
    guard !vec.isEmpty else {
        print("Warning: Array is empty, returning 0.0 for average.")
        return 0.0
    }

    // Calculate the sum using the `reduce` higher-order function
    // 0.0 is the initial result
    // `+` is the combining operation (sums the current result and the next element)
    let sum = vec.reduce(0.0, +)

    // Calculate the average
    // `vec.count` gives the number of elements (an Int)
    // We need to convert it to Double for floating-point division
    return sum / Double(vec.count)
}

// --- Main part of the script (top-level code executes directly) ---

// Create an array of Doubles using type inference
let myNumbers = [10.5, 20.0, 15.3, 7.8, 30.1]

// Print the numbers in the array using string interpolation and map/joined
// `map { String($0) }` converts each Double to a String
// `joined(separator: " ")` joins these strings with spaces
print("Numbers: \(myNumbers.map { String($0) }.joined(separator: " "))")

// Call the function to calculate the average
let average = calculateAverage(vec: myNumbers)

// Print the average, formatted to two decimal places
// Swift uses String(format:) which is similar to C's printf formatting
print("Average: \(String(format: "%.2f", average))")

// Alternative modern Swift formatting (requires iOS 15+, macOS 12+, etc.)
// print("Average: \(average.formatted(.number.precision(.fractionLength(2))))")

// No explicit `return 0` needed at the end of a Swift script


Brett Tofel
+1-802-371-7183


Jim Matthews

unread,
Apr 7, 2025, 6:40:36 PMApr 7
to uv-coc...@googlegroups.com
Thanks, Brett, for that example — it does look like the LLMs can translate between programming languages (though I’d definitely double-check their work). I believe that one reason that LLMs are getting so good at coding problems is that it’s possible to fine-tune them with automated tests. You can feed them lots of coding problems, run the resulting code, and check the results. Fine-tuning more subjective work (e.g. art or poetry) is harder to automate. By the way, I recommend this video on how LLMs work; it’s long but I found it very well done and informative (I watched it at 1.5x speed):


Yes, Carl, Fetch is earning me between $1-2k a month (the 2024 total was $20k), but that number is dropping 20-40% a year, so I don’t expect it to contribute much to my retirement, which I hope will be 5-10 years from now. I don’t think it’ll ever be translated to Swift, unless the LLMs get so good that they can do it without much help from me :). I expect that if I try to keep Fetch going indefinitely, at some point Apple will make a change that will require major work before it will work on a new OS release. It took me a year and a half of nights and weekends to rewrite the UI so that Fetch could run on macOS 10.15 Catalina (that version dropped support for the Carbon UI framework). If another change like that comes down the pike, I will throw in the towel.

I have reported bugs in open-source projects, but haven’t really participated in any as a contributor. Which is a bit embarrassing, since I’ve gotten so much value out of open-source software.

Jim


Dave Kopec

unread,
Apr 7, 2025, 7:40:12 PMApr 7
to uv-coc...@googlegroups.com
Hi All,

This is a really interesting discussion about the sustainability of your Mac apps. I appreciate you sharing the inside-baseball. I am a long-time lurker on this list. I think I have been on the list for about a decade, but never attended a meeting.

By way of introduction, I went to Dartmouth undergrad in economics, and then a year later after hating a job on Wall Street, went back to Dartmouth to do a master's degree in computer science. After a couple failed startups I ended up doing software development consulting and writing a book on programming and that led me to adjunct teaching which eventually led me to taking a full-time CS teaching job at a college in Burlington. That was 9 years ago and that's probably when I joined this list, thinking I would make the trek to come to some meetings. I ended up starting an iOS/macOS dev meetup group in Burlington and that lasted for a couple years before fizzling during the pandemic.

Anyway, this is all to give background to say that I long have dreamed of being an indie Mac app developer. I released my first apps when I was teenager in the early Mac OS X days in Objective-C around 2001. I still release some small hobby apps (https://oaksnow.com) but nothing with a large enough addressable market to be more than about $1000/year in sales.

I'm now thinking about what's next (both career wise and. hobbyist app development wise). Should I go all-in trying to build a new indie app? Something much more ambitious than I've built before? The zeitgeist makes it seem like the indie golden days on the Mac are over and your emails seem to confirm it's a diminishing market. That's good intelligence since even when following social media it's hard to really get the pulse.

Anyway, thank you to all of you for sharing in this thread.

Best,
David

Reply all
Reply to author
Forward
0 new messages