Josh Goldberg
Smiling photo of Dimitri and Katharine and me in SquiggleConf 2025 shirts at the Boston harbor

2025 In Review

Mar 8, 202620 minute read

Looking back at the accomplishments and goals from my fourth and final year as a full-time independent open source maintainer.

I like looking back at large time periods and the major events that happened during them. It’s useful to reflect back on what the most important happenings were, and to learn from any missed opportunities or mistakes. Let’s do that now for 2025.

Finances

👉 2025 Finances in Review covers my 2025 finances.

My earnings in 2025 were larger than 2024 Finances in Review. I took in a total income of roughly $73k for 2025, compared to $60k for 2024.

$73k for the year is unusually high for an independent open source maintainer as well as unusually low for an developer with a decade of programming experience based in a major American city. More on that at the end.

Goals

I’d mentioned yearly goals in My Plans for 2025 last year. Many of those goals had concrete objectives. Did I satisfy those objectives?

StatusCountPercentage
Total46-
✅ Hit27~59%
⏳ Partial11~24%
❌ Miss8~17%

…for the most part! Over 80% of my objectives were at least partially done. I completely did over half my objectives.

Let’s compare with 2024’s year-long goals and 2023’s year-long goals:

YearCountMiss / %Partial / %Hit/ %
2025468 / ~17%11 / ~24%27 / ~59%
2024378 / ~22%14 / ~38%15 / ~41%
2023347 / ~21%10 / ~29%17 / ~50%

Much, much better than before! Both Miss and Partial went down in percentage. Hit jumped to the highest in my three years of tracking goals. You love to see it.

The higher total count came from me being more granular in tracking goals. Let’s take a look those specific goals, by area.

Open Source

The biggest and most important area of goals for me is my open source work. My primary occupation in 2025 was doing this full-time, and my area of focus was tooling for web developers. The following projects are the ones I saw as providing the most positive impact for the ecosystem.

typescript-eslint

My Plans for 2025 > typescript-eslint

ObjectiveStatus
Rework the website to better explain the project✅ Done: redesigned landing page
Finish the year with <250 issues✅ Close enough: ~255 open
Publish ≥4 long-requested blog posts⏳ Partial: 3 of 4 published
Close out ≥3 of 4 issues from 2019⏳ Partial: 2 of 4 closed
Close out ≥20 of 26 issues from 2019-2020⏳ Partial: 11 closed; 15 still open

typescript-eslint is the project I’m most closely associated with. I spend more time on it than any other project and receive more income from it than any other two sources combined.

One of typescript-eslint’s biggest user pain points is general confusion over what the project actually is. The project’s old, verbose landing page only somewhat helped with that. We revamped the typescript-eslint.io homepage in 2025 to be more succinct and direct with important information.

We also published 3 blog posts through the first week of January for more targeted areas of common user confusion:

I’d also wanted to trim down the issue backlog a fair bit, to make the project easier to manage. We have a lot of old long-awaited issues sitting for many years. Although we got the total number down to about what I’d hoped for, we still have many issues from 5 or more years ago.

I’d say 2025 was overall a pretty good year for typescript-eslint. We addressed some long-requested documentation points and kept the issue tracker managed. Life is good.

ESLint

My Plans for 2025 > ESLint

ObjectiveStatus
Consistently work as an ESLint team member⏳ Only consistently active some months

As with 2024, I didn’t work as much on ESLint as I’d hoped to through the year. I love the ESLint project and am in theory excited about it. Earlier in the year I had several months with consistent work.

But in practice, ESLint is a relatively older project with a technical steering committee that I differ in opinion on for many key points. There aren’t that many areas of work in it that I’m intrinsically motivated to do. I think it’s to be expected that I stabilize at a handful of hours of month.

Mocha

My Plans for 2025 > create-typescript-app

ObjectiveStatus
Release the new Mocha website✅ Shipped!
Release Mocha 12 with long-pending small breaking changes⏳ Still partially-complete and in beta
Provide first-party TypeScript types with Mocha❌ Not started

This year saw more pre-work on Mocha than real user-facing features. The biggest point of success was shipping the new mochajs.org built on Astro Starlight. That was lovely and allowed us to remove a ton of old website-only devDependencies from the Mocha repository.

But, we had less maintainer time than I’d expected, and still haven’t finished merging all the PRs for mocha/milestone/66 v12.0.0. Fixing old annoyances and removing long-deprecated features will be good for the project. It’s a bummer to not have gotten v12 or mocha#4154 🚀 Feature: TypeScript .d.ts type declarations out the door yet.

Yeoman

My Plans for 2025 > Yeoman

ObjectiveStatus
End 2025 having triaged and reviewed all Yeoman issues and pull requests✅ Roughly done
Update yo and other packages to no longer print deprecation warnings when run⏳ Still in progress
Clean up all known out-of-date information on yeoman.io❌ Not started

Yeoman is a weird one. I started 2025 with a lot of enthusiasm and work on triaging issues and reviewing PRs. I even made some progress on fixing old issues myself.

But, as the year went on, I started to fall behind on other projects, and deprioritized Yeoman work. At this point most of the feature work done on Yeoman is still from mshima, who predates my involvement.

I still harbor fond feelings for the project and would like to finish getting it stabilized. Eventually.

Bingo

My Plans for 2025 > Bingo

ObjectiveStatus
Create in-memory, Handlebars-based, and Blocks-based templating systems✅ All shipped
Create an automated repository migration flow based on GitHub Actions✅ Running on most of my repositories
Release a well-documented Bingo v1⏳ Not 1.0, but fairly stable

The Bingo project -formerly named create- is my take on a templating engine. Its feature set represents points that I think no existing engine comes close to capturing a majority of.

Bingo went pretty darn well in 2025! I figured out all of the core design principles necessary for use in create-typescript-app. CTA is now wholly built on top of Bingo, and most of my CTA-templated repositories use its transitions flow to stay up-to-date automatically.

Through working on Bingo, I discovered quite a few unexpected design questions for it that will need to be resolved before reaching 1.0. But in the meantime it’s stable and ready for general use.

create-typescript-app

My Plans for 2025 > create-typescript-app

ObjectiveStatus
Release a stable create-typescript-app@v2 built on Bingo✅ Shipped
Reduce root files from 19 to 16⏳ Down to 17
Close out 14 of the 19 open issues I’d filed through 2022 and 2023⏳ Down to 14 (closed 5)
Support monorepos❌ Not started

As with Bingo, create-typescript-app is also pretty darn stable. I’m generally happy with it: in particular using its Bingo/Stratum-based templates to keep many of my repositories up-to-date automatically.

I wish I’d had time to put more effort into housekeeping for it. It’s got several older issues and general points of cleanup I think I could close out with a little more dedicated though. Monorepo support for my other, bigger projects would be great. Ah well.

Flint

My Plans for 2025 > Mint (project renamed to Flint)

ObjectiveStatus
Publish a blog post fully describing my idealized general web linter✅ Shipped
Prototype a general web linter with first-class support for cross-file linting✅ Shipped

I absolutely crushed this set of goals.

First, I published not one but five blog posts deep diving into web linting ideals:

Then, I more than just prototyped a new linter: I started a full new project! Flint is a “fast, friendly linter for JavaScript, TypeScript, and more”. It has all sorts of goodies I’d only dreamed of for 2025:

Flint will now be my primary project in 2026. I’m thrilled. ❤️‍🔥

OctoGuide

My Plans for 2025 > Glint

ObjectiveStatus
Make a stable lint experience for GitHub repositories✅ Shipped
Onboard OctoGuide to be used in create-typescript-app✅ Shipped

This year, I finally did the thing! Octoguide is a standalone… well, we don’t want to call it a linter, because that has a bad taste for many developers. It’s a bot that helps contributors work well in repositories.

It’s shipped and stable. And even has a co-maintainer (shoutout CyleWaitForIt!). Whoohoo!

TypeStat (ts-lift)

My Plans for 2025 > TypeStat (ts-lift)

ObjectiveStatus
Rebrand, re-document, and stabilize TypeStat as a ts-lift monorepo❌ Prototyped, but not ready
Create a ts-initialize project within ts-lift❌ Not started
Create a ts-enhance project within ts-lift❌ Not started

I ran out of time and did not work on the TypeStat re-architecture. The create-typescript-app monorepo support I’d hoped to make this easier also didn’t land in 2025. Ah well.

At this point, I think it’d be better for me to:

  1. Focus on Flint, as its cross-file linting support is likely to take over some areas of ts-enhance
  2. Wait until I’m more experienced with AI agents to see how they should interact with the project

Further procrastination for this one.

Other Projects

These projects aren’t widely known names the way the larger ones. They’re smaller time investments that I think are valuable in their own right.

eslint-plugin-expect-type

My Plans for 2025 > eslint-plugin-expect-type

ObjectiveStatus
Get adopted by DefinitelyTyped❌ Not accepted

Unfortunately, I didn’t have bandwidth to work with the DefinitelyTyped (TypeScript) team on adoption in DT. They’re almost exclusively focusing on the typescript-go port. Jake Bailey also raised a good point that depending on an external plugin for such a core are of DT linting restricts their ability to iterate. So, no progress on adoption.

eslint-plugin-package-json

My Plans for 2025 > eslint-plugin-package-json

ObjectiveStatus
Objective: Finish achieving feature parity with other package.json linters✅ Done

We did the thing! eslint-plugin-package-json is at least approximately feature complete with every other tool I’d found to validate package.json files. It even boasts some newly made rules that few-to-no other tools have.

Additional shoutout to Michael Faith for joining on as a maintainer for this project, as well as dependencies like eslint-fix-utils and package-json-validator. Michael’s done a ton of work, including most of the recent activity in all three repositories over the last few months. I have passed on ownership of all three of those repositories to Michael. Hell yeah!

Other Packages

My Plans for 2025 > Other Packages

ObjectiveStatus
Objective: Maintain open source repositories in my areas of interest.✅ Done

I did the things. github.com/JoshuaKGoldberg#what-im-working-on has tables of the projects I work on.

Community Engagement

As with 2024, I again held off from traveling to a large number of events. For speaking, I only went to a total of five conferences. For organizing, I continued to work on two event series:

I also include general education work as part of community engagement, including blogging and speaking at conferences. Like it or not, I’m someone people look to for linting and TypeScript advice. Many of the ecosystem changes I push for require solid resources in both spoken -e.g. conference talks- and written -i.e. blog posts and documentation- form.

Let’s see how I did with my 2025 community engagement goals…

Conferences

My Plans for 2025 > Conferences

ObjectiveStatus
Give all conference talks I’m happy with✅ Yes, I personally think?

I was happy with my conference talks this year! By only giving on average one every two months, I was able to put a lot of craft and thought into each one. I think my conference talks have generally been objectively pretty good. I think they have clear narratives and code examples that explain useful topics around TypeScript.

That being said, I’m not great at soliciting feedback. If you have feedback for how I can improve, please let me know! 😊

Blogging

ObjectiveStatus
Publish at least one blog post every three weeks✅ On average, one every ~2.75 weeks
Publish at least one post in each blog every three months⏳ Mixed

I published a total of 19 posts in 2025 (and the first few days of January):

That’s an average of (52 weeks in 2025) / (19 posts in 2025) = ~2.737 weeks per post. Which is better than I expected! I think splitting up my “If I Wrote a Linter” series helped with that number.

On the other hand, two of my main three blog areas didn’t hit the frequency averages I’d hoped for:

More consistency would have been better for those not-so-frequent two areas. Learning TypeScript’s articles in particular are both generally useful to TypeScript developers and help with book sales. I’d have really liked to have found more time for them.

Boston TS Club

My Plans for 2025 > Boston TS Club

ObjectiveStatus
Produce ten successful monthly meetups for Boston TS Club✅ Done
Create and keep schedules for those meetups✅ Done
Step down as “director” and eliminate the singular leadership role✅ Done

💯. 🔥. Absolute success.

We held 11 monthly meetups (January through November) and one workshop in collaboration with Boston Code and Coffee. I think by now we’re all feeling very practiced with how it’s going. Multiple events went smoothly with only 1-2 core organizers in attendance.

We also did away with the “director” role. Our meetings have an autonomous system with no single person in charge. I’m very pleased about that.

SquiggleConf 2025

My Plans for 2025 > SquiggleConf

ObjectiveStatus
Successfully run SquiggleConf 2025 without any major problems✅ It went great!
Get 150 peak attendance✅ We did it!
Break even 💸✅ Depending on the math: we did!
Don’t burn out✅ I feel good!

💯. 🔥. Absolute success!

The conference was, again, awesome. I had so many great chats with attendees, speakers, and volunteers. The speakers were fantastic: we received lots of great feedback on the talks, and many of the speakers went out of their way to engage with the audience throughout the event. I thoroughly enjoyed the out-of-conference events such as the volunteering event, after-conference hangout,

Our selection of speakers, as with Boston TS Club, was more diverse than the industry’s average. Roughly 33% of the talk speakers do not identify as men. As with 2024, I would have preferred closer to 50%, but given how many conferences I’ve turned down per my speaker rider’s request to not have a supermajority of white dudes, I am not upset about this.

As for breaking even, we’ll post a 2025 finances in review post soon. The tl;dr will be: if you don’t count one-time equipment purchases (that we will eventually sell), we at least broke even! Whew!

Two even brighter notes than 2024:

We did it, Dimitri and Katharine!

Personal

Health

My Plans for 2025 > Health

ObjectiveStatus
Eat healthy, balanced meals most days of the week✅ Yes, most weeks
Reliably work out about three times a week✅ Yes, most weeks

I did well for my health in 2025! I’m now in the habit of going to bed around 10-11pm and waking up around 6-7am (this helps tremendously with my chronic insomnia). I cook most of my meals at home and work out a little over three days a week on average.

It feels really, really good to keep making progress on my personal health. Or from another perspective: I feel much less… yucky much of the time.

Progress. 💪

Personal Accountability

My Plans for 2025 > Personal Accountability

ObjectiveStatus
Have confidence in the amount of work I’ve accomplished✅ Yes
Feel good about the amount of work I’ve accomplished✅ Yes

Perhaps related to the health improvements, I actually feel very good about 2025. Although I didn’t hit most of my goals, I got a ton of great work out the door and shipped most of the impactful points.

It feels weird to think back on my mental state from two or more years ago. I was much more scattered and stressed back then. I’m relieved to not be so much now.

Closing Thoughts

2025 was a good year for me. I didn’t get everything I wanted done, but I got through a good number of the expected tasks. And I stabilized a heck of a lot of my projects. It feels really good to think about the state of them, especially compared to last year

The biggest learning from the year was that independent open source work is too independent for me. As I mentioned in my 2025 Finances in Review, it’s lonely and isolating to work independently the way I have. There are so few full-time indie open source maintainers, most of us are either spread thin across a bunch of different projects or work long-term on larger projects. But even working long-term on larger projects isn’t the same as having a dedicated team, manager, mentor, HR, etc.

Even if I were to spend several more years and get my open source sponsorships to a long-term sustainable level, I don’t think I’d be happy long-term in open source. The current nature of the industry discourages people from doing what I have. What rare maniac would forgo a real developer’s benefits+salary to work on grossly underfunded projects and get yelled at by strangers online? It’s a ridiculous endeavor.

Some other open source maintainers have had a better go at it. Many have gotten involved with fellow maintainers and projects, staving off the isolation. I’m really happy for them. But I’ve learned that I’m not made to stay in open source more than a few years at a time.

Thanks again to all the awesome people who’ve helped make my open source journey and 2025 wonderful. I appreciate you all more than I can express here, and I’m looking forward to continuing to work with you in my spare time. 💖


Liked this post? Thanks! Let the world know: