<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://harryadel.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://harryadel.github.io/" rel="alternate" type="text/html" hreflang="en-US" /><updated>2026-05-12T18:47:38+03:00</updated><id>https://harryadel.github.io/feed.xml</id><title type="html">Harry Adel</title><subtitle>A personal blog documenting things that I&apos;ve learned, meet me &lt;a href=&quot;https://github.com/harryadel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@harryadel&lt;/a&gt;.</subtitle><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><entry><title type="html">Dev Diary #27 - Async Accounts, OTPAuth, Migration Docs, and Ecosystem Maintenance</title><link href="https://harryadel.github.io/dev-diary-27/" rel="alternate" type="text/html" title="Dev Diary #27 - Async Accounts, OTPAuth, Migration Docs, and Ecosystem Maintenance" /><published>2026-05-03T00:00:00+03:00</published><updated>2026-05-03T00:00:00+03:00</updated><id>https://harryadel.github.io/dev-diary-27</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-27/"><![CDATA[<p>Long time no see. It feels like it has been a while since I had my usual sit-down with you guys to tell you about my latest OSS endeavors. Thankfully, this month has been immensely fruitful, and I feel that I’ve contributed positively to the ecosystem.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14267">#14267</a> — Improve v3 migration guide with real-world migration insights</strong> — The final brick in the wall, where I took all of the learnings I had accumulated over my many Meteor migrations, especially the latest WeKan migration, and centralized them in one place. I even got Nacho’s stamp of approval, which makes me a tiny bit happier.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14321">#14321</a> — Replace node-2fa with OTPAuth in accounts-2fa</strong> — Another mini PR that I’m proud of. While delving deeper into Meteor accounts, I noticed the usage of an old and unmaintained library, so I decided to replace it with a modern alternative. This is where LLM power shines the most. A contribution like this might have taken me a day or two, but thanks to LLMs, it was done in 10–20 minutes, most of which went into actually planning out the change, picking the alternative library, and deciding on the migration strategy, where I, of course, emphasized the importance of backward compatibility. A case in point for proper usage of LLM-powered development.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14069">#14069</a> — Asyncify client-side calls</strong> — One of the biggest PRs that I’ve been waiting for and actively trying to push finally made it into 3.5. This is another step toward a truly async-compliant and ES6-friendly framework.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14070">#14070</a> — Add loginWithTokenAsync, loginWithPasswordAsync</strong> — The third Meteor accounts contribution that helps us move the needle and make the DX of working with Meteor accounts in an async environment a true joy!</p>

<hr />

<p>That was it for core. Now onto the Meteor Community Packages.</p>

<p><strong><a href="https://github.com/Meteor-Community-Packages/meteor-mocha/pull/188">meteor-mocha #188</a> — Deps: meteor 3.4</strong> — Jan updated the dev dependencies, bumped Meteor to 3.4, moved CI to Node 22 and Meteor 3.4, and updated the test drivers. Testing packages are never the flashiest part of the ecosystem, but if they lag behind, everyone else feels it.</p>

<p><strong><a href="https://github.com/Meteor-Community-Packages/meteor-timesync/pull/60#issuecomment-4263430653">meteor-timesync #60</a> — Meteor 3 compatibility release</strong> — This one has been around for quite a while, but it got another push. The PR targets Meteor 3 compatibility, and <code class="language-plaintext highlighter-rouge">1.0.0-beta.2</code> was published thanks to BastienRodz’s contribution. The Cordova/Capacitor path got special attention, with tests ensuring mobile clients force DDP transport while regular browser clients still use HTTP.</p>

<p>Lastly, general community packages:</p>

<p><strong><a href="https://github.com/quavedev/meteor-packages/pull/21">quave:synced-cron #21</a> — Preserve synced-cron userId in nested method calls</strong> — This came out of a subtle context problem. Cron jobs were executed directly through <code class="language-plaintext highlighter-rouge">entry.job(...)</code>, so nested server-side <code class="language-plaintext highlighter-rouge">Meteor.callAsync</code> calls didn’t have a current DDP method invocation. The result: <code class="language-plaintext highlighter-rouge">this.userId</code> inside the nested method became <code class="language-plaintext highlighter-rouge">null</code>.</p>

<p>The PR preserves the cron job <code class="language-plaintext highlighter-rouge">userId</code> across nested server-side method calls and adds a regression test to make sure the context doesn’t get lost again.</p>

<p><strong><a href="https://github.com/quavedev/meteor-packages/pull/22/changes">quave:slingshot #22</a> — Replace deprecated Buffer constructors in meteor-slingshot</strong> — Very small, very clean. Replaced deprecated <code class="language-plaintext highlighter-rouge">Buffer()</code> / <code class="language-plaintext highlighter-rouge">new Buffer()</code> usages with <code class="language-plaintext highlighter-rouge">Buffer.from()</code> and bumped <code class="language-plaintext highlighter-rouge">quave:slingshot</code> to <code class="language-plaintext highlighter-rouge">2.0.4</code>.</p>

<p>This is the type of change that won’t make anyone clap, but it removes warning noise and keeps packages healthier on newer Node versions.</p>

<p><strong><a href="https://github.com/cult-of-coders/redis-oplog/pull/424">redis-oplog #424</a> — Meteor 3.4 compatibility</strong> — Still open, but I pushed follow-ups here too. The main work rewrites <code class="language-plaintext highlighter-rouge">ObserveMultiplex.js</code> to match Meteor 3.4’s callback semantics, updates <code class="language-plaintext highlighter-rouge">observeChanges</code> to the newer signature, and uses <code class="language-plaintext highlighter-rouge">collection.direct</code> to avoid collection hooks re-triggering on already-processed selectors.</p>

<p>I also added a regression test for direct collection refetch, fixed optimistic update ordering so it no longer flickers, replaced the old Redis GitHub Action with a native Redis service, and added Meteor 3.4 to the CI matrix. Locally, tests pass on 3.1.2, 3.2, and 3.4. Hopefully this gets reviewed soon because redis-oplog remains important for serious Meteor apps.</p>

<p><strong><a href="https://github.com/monti-apm/monti-apm-agent/pull/149/changes">Monti APM agent #149</a> — Skip pubsub error tracking for deactivated subscriptions</strong> — A tiny PR against the fiberless branch. The fix avoids tracking pubsub errors when the session or subscription has already been deactivated. In practical terms, don’t try to report useful subscription error metadata after the subscription is already gone. Sometimes the best fix is just refusing to pretend dead state is alive.</p>

<hr />

<p>There was also a small Android side quest.</p>

<p><strong><a href="https://github.com/banjerluke/capacitor-meteor-webapp/pull/1">capacitor-meteor-webapp #1</a> — Use AGP 9 compatible default ProGuard file</strong> and <strong><a href="https://github.com/capacitor-community/keep-awake/pull/87">capacitor-community/keep-awake #87</a> — fix: AGP 9.0 no longer supports proguard-android.txt</strong> — Both PRs switch Android library config to <code class="language-plaintext highlighter-rouge">getDefaultProguardFile("proguard-android-optimize.txt")</code>.</p>

<p>Android Gradle Plugin 9 rejects <code class="language-plaintext highlighter-rouge">proguard-android.txt</code> because it bundles <code class="language-plaintext highlighter-rouge">-dontoptimize</code>, which can make project configuration fail before you even get to the build. I hit this while testing downstream mobile work, fixed it in <code class="language-plaintext highlighter-rouge">keep-awake</code>, and opened the same fix for <code class="language-plaintext highlighter-rouge">capacitor-meteor-webapp</code>.</p>

<p>Again, not Meteor core directly, but this is the kind of ecosystem papercut that matters if we want Meteor apps to keep working well on mobile.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><category term="wekan" /><category term="migration" /><summary type="html"><![CDATA[Long time no see. It feels like it has been a while since I had my usual sit-down with you guys to tell you about my latest OSS endeavors. Thankfully, this month has been immensely fruitful, and I feel that I’ve contributed positively to the ecosystem.]]></summary></entry><entry><title type="html">How I Increase My Surface Area of Luck</title><link href="https://harryadel.github.io/how-I-increase-surface-area-of-luck/" rel="alternate" type="text/html" title="How I Increase My Surface Area of Luck" /><published>2026-05-03T00:00:00+03:00</published><updated>2026-05-03T00:00:00+03:00</updated><id>https://harryadel.github.io/how-I-increase-surface-area-of-luck</id><content type="html" xml:base="https://harryadel.github.io/how-I-increase-surface-area-of-luck/"><![CDATA[<p>Not too long ago, I stumbled across <a href="https://blog.kowalczyk.info/article/4682085af50b41f88460593d21db6182/find-programming-work-by-increasing-luck-surface-area.html">this article</a> during one of my visits to Hacker News.</p>

<p>I noticed that I had already been implementing most of the points mentioned in one way or another, but the article elegantly highlighted them in a way that made me want to pinpoint how I’ve been executing on them.</p>

<p>Hopefully, this can serve as an example for future developers looking to improve their position among their peers.</p>

<h2 id="11-a-dedicated-website">1.1 A Dedicated Website</h2>

<p>It’s quite ironic when I see people tout themselves as web developers yet have no dedicated online presence!</p>

<p>I’m not talking about X, LinkedIn, or even GitHub, but an actual dedicated space that you fully own and no one can take away from you. This also has the added benefit of letting you use your secondary social media presence to funnel an audience into your website, instead of other websites using you, or whatever you write, for their own benefit.</p>

<p>Now you can write whatever you wish on your website and merely use other platforms for wider exposure.</p>

<p>Getting started is trivial. You can use <a href="https://docs.github.com/en/pages">GitHub Pages</a>, grab any <a href="https://jekyllrb.com/docs/themes/">Jekyll theme</a>, and use it. You can even purchase the domain at a later step!</p>

<h2 id="12-a-hire-me-page">1.2 A Hire Me Page</h2>

<p>The requirements are pretty straightforward:</p>

<blockquote>
  <p>The important basics of such a page:</p>

  <ul>
    <li>It should be short and concise; this is a decent business proposal, not a novella.</li>
    <li>A way to contact you, i.e. your e-mail address.</li>
    <li>Describe what you can do. In my case, it was programming in Go.</li>
    <li>Provide proof that you’re good at it. In my case, I linked to my past writing about Go, my open source Go libraries, and a Go contract I successfully completed.</li>
    <li>Social proof, such as a list of well-known companies I worked at.</li>
    <li>My time zone, because it’s important in remote work.</li>
    <li>A photo for that human connection.</li>
  </ul>
</blockquote>

<p>Here’s <a href="https://harryadel.com/hire-me/">mine</a> for reference.</p>

<h2 id="2-publish-technical-articles">2. Publish Technical Articles</h2>

<p>Now that you’re <a href="https://landchad.net/">landed gentry</a>, your next step is to start cultivating that <del>land</del> website.</p>

<p>Start by publishing tutorials and technical articles. People often have a hard time figuring this part out, but it’s incredibly trivial.</p>

<p>Here are multiple ways I use to find ideas for what to post:</p>

<ul>
  <li>What would your former self have wanted to know but didn’t? What would you explain if you could travel back in time?</li>
</ul>

<p>Picking and choosing the right path and the right web courses to follow was a tiring process for me, so I put together what I’d mark as an ideal path for others to tread on:</p>

<p><a href="https://harryadel.com/js-roadmap/">JS Roadmap</a></p>

<ul>
  <li>What is a piece of information you recently stumbled upon and found interesting?</li>
</ul>

<p>While poking around Meteor internals, I came across a few interesting pieces of information about how Meteor publications work, so I put it in writing in case someone else finds it useful:</p>

<p><a href="https://harryadel.com/auto-publications/">Meteor’s Hidden Auto Publications: The Free Data You Never Asked For</a></p>

<ul>
  <li>Is there something that has been on your mind and you want to get out? Get it out in writing.</li>
</ul>

<p>The relationship between open source and how others perceive the developers maintaining it. Should they be grateful? Should they not be? I was so frustrated with this that I put it into writing:</p>

<p><a href="https://harryadel.com/opensource-gratefulness-selfishness/">Open Source, Gratefulness and Self-interest</a></p>

<h2 id="21-turn-experience-into-lead-generating-artifacts">2.1 Turn Experience Into Lead-Generating Artifacts</h2>

<p>AKA the “describe” method: just describe what you did recently in layman’s terms. Nothing fancy!</p>

<p>This shows up in two main ways for me:</p>

<h3 id="dev-diary">Dev Diary</h3>

<p>By far, this is the best and easiest way to do it, especially if you’re an active OSS developer like me.</p>

<p>I basically take all of my monthly contributions and put them into article form to share with the community at the end of each month. I literally describe what I did, no more, no less, and it has been amazing for getting me more exposure and letting others know about the work that <del>always</del> often goes unnoticed each month.</p>

<p>Here’s the latest dev diary:</p>

<p><a href="https://harryadel.com/dev-diary-27/">Dev Diary #27 - Async Accounts, OTPAuth, Migration Docs, and Ecosystem Maintenance</a></p>

<h3 id="migration-stories">Migration Stories</h3>

<p>Another one I tend to enjoy the most is taking a very lengthy and huge Meteor migration and distilling that knowledge into articles describing what I did, the problems I went through, and how I overcame them.</p>

<p>I did <a href="https://harryadel.com/dev-diary-26/">WeKan recently</a>, and also <a href="https://dev.to/meteor/the-meteor-30-migration-a-space-exploration-mission-3gb5">Medbeauty</a>.</p>

<h2 id="3-specialize">3. Specialize</h2>

<p>It’s a bit of common knowledge these days that, when promoting yourself as a developer, you shouldn’t tie yourself to a single technology because it might make you look like an “if-else developer.”</p>

<p>But I’m here to offer an alternative path.</p>

<p>There’s a lot to be gained from specializing and promoting yourself as an expert in one specific thing.</p>

<p>Imagine someone looking for a Meteor developer. Yes, Meteor developers know Node.js and MongoDB, and you can promote yourself as such, but how likely are they to pick a generalist Node.js developer over someone who clearly labels himself as a Meteor developer?</p>

<p>That generalist might be a very capable Meteor developer, but if he doesn’t label himself as such, he might not even be considered.</p>

<p>I’m not against the generalist path per se, and I believe there are multiple ways to skin the cat. What I’m highlighting here is that it’s okay to promote yourself as a specialist in a certain topic, and sometimes in that topic only.</p>

<h2 id="4-enjoy-the-fruits-of-your-labour--promote-your-stuff">4. Enjoy the Fruits of Your Labour / Promote Your Stuff</h2>

<p>Did you try out <a href="https://firely.app/">Firely</a> yet?</p>

<p>It’s my awesome personal finance app. I bet you didn’t know about it, but now you do.</p>

<p>Thanks to the previous steps I took to build a dedicated online presence, I can now promote my stuff in a way that feels earned rather than random.</p>

<p>And that’s exactly the point.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="oss" /><summary type="html"><![CDATA[Not too long ago, I stumbled across this article during one of my visits to Hacker News.]]></summary></entry><entry><title type="html">Dev Diary #26 - WeKan Reaches Meteor 3.4, The Great Package Purge, and Community Migrations</title><link href="https://harryadel.github.io/dev-diary-26/" rel="alternate" type="text/html" title="Dev Diary #26 - WeKan Reaches Meteor 3.4, The Great Package Purge, and Community Migrations" /><published>2026-03-24T00:00:00+02:00</published><updated>2026-03-24T00:00:00+02:00</updated><id>https://harryadel.github.io/dev-diary-26</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-26/"><![CDATA[<p>I’m super duper glad to announce WeKan now runs on 3.4! This has been a long time coming, finally closing the curtain on work that started in dev diary #24. Here’s the big <a href="https://github.com/wekan/wekan/pull/6205">PR</a> if you want to check it out! Now onto the details:</p>

<p>The first order of business was continuing the package removal spree that started last month. Meteor 2 apps tend to accumulate Atmosphere packages the way old houses accumulate junk drawers – you don’t notice how many there are until you try to move.</p>

<ol>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6173">#6173</a> — Fix FilesCollection findOneAsync errors for Avatars and Attachments</strong> — Quick fix to kick things off. <code class="language-plaintext highlighter-rouge">ostrio:files</code>’s <code class="language-plaintext highlighter-rouge">FilesCollection</code> provides <code class="language-plaintext highlighter-rouge">findOne()</code>, not <code class="language-plaintext highlighter-rouge">findOneAsync()</code>, so we were calling a function that didn’t exist. Switched to the sync method and moved on.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6174">#6174</a> — Replace konecty:mongo-counter with inline implementation</strong> — Removed the package and replaced it with a minimal <code class="language-plaintext highlighter-rouge">incrementCounter</code> function using raw MongoDB <code class="language-plaintext highlighter-rouge">findOneAndUpdate</code>. Also added an async version for Meteor 3.0 compatibility.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6175">#6175</a> — Replace templates:tabs with inline Blaze implementation</strong> — Swapped the <code class="language-plaintext highlighter-rouge">templates:tabs</code> Atmosphere package for a lightweight inline <code class="language-plaintext highlighter-rouge">basicTabs</code>/<code class="language-plaintext highlighter-rouge">tabContent</code> Blaze template pair. Zero changes to consumer templates – drop-in replacement.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6178">#6178</a> — Remove peerlibrary:blaze-components</strong> — This was a big one. Removed the unmaintained <code class="language-plaintext highlighter-rouge">peerlibrary:blaze-components</code> and all six of its peer dependencies. Migrated every component from <code class="language-plaintext highlighter-rouge">BlazeComponent.extendComponent()</code> to native Meteor <code class="language-plaintext highlighter-rouge">Template.onCreated/helpers/events</code> patterns. Replaced the Mixins global with standalone utility modules.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6188">#6188</a> — Fix list add-card actions and sort persistence</strong> — The blaze-components migration (#6178) broke list header and popup add-card actions. This PR restored them, fixed the inlined add-card form reopening, and removed duplicate list sortable initialization so list moves persist correctly.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6190">#6190</a> — Replace underscore with native JavaScript utilities</strong> — Replaced ~250 underscore.js calls across ~45 files with native JS equivalents. Added a small shared helper module for patterns that don’t have a clean native one-liner. Removed <code class="language-plaintext highlighter-rouge">underscore</code> from local packages and <code class="language-plaintext highlighter-rouge">.meteor/packages</code>.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6191">#6191</a> — Remove raix:handlebar-helpers</strong> — Removed the package and re-implemented the operator helpers (<code class="language-plaintext highlighter-rouge">$eq</code>, <code class="language-plaintext highlighter-rouge">$neq</code>, <code class="language-plaintext highlighter-rouge">$gt</code>, <code class="language-plaintext highlighter-rouge">$lt</code>, etc.) as native Blaze helper registrations in a new <code class="language-plaintext highlighter-rouge">blazeHelpers.js</code> file.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6195">#6195</a> — Replace useraccounts packages with communitypackages alternatives</strong> — A big step for both WeKan and the community. Migrated from the unmaintained <code class="language-plaintext highlighter-rouge">useraccounts:*</code> packages to community-maintained <code class="language-plaintext highlighter-rouge">communitypackages:*</code> drop-in replacements. I migrated all three packages and chose <a href="https://github.com/Meteor-Community-Packages">Meteor Community Packages</a> as their new home so the community can benefit and carry the torch. Also took the opportunity to remove dead packages like <code class="language-plaintext highlighter-rouge">coffeescript</code> which was no longer needed after the blaze-components removal.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6196">#6196</a> — Remove unused meteorhacks:aggregate</strong> — The only aggregation call was already using <code class="language-plaintext highlighter-rouge">rawCollection().aggregate()</code> directly, so the package was dead weight. Also converted <code class="language-plaintext highlighter-rouge">getBoardTitleWithMostActivities</code> from <code class="language-plaintext highlighter-rouge">Promise.await</code> to <code class="language-plaintext highlighter-rouge">async/await</code>.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6197">#6197</a> — Replace Email.send with Email.sendAsync</strong> — Replaced all <code class="language-plaintext highlighter-rouge">Email.send()</code> calls with <code class="language-plaintext highlighter-rouge">await Email.sendAsync()</code>. This also fixed a bug where email sending errors were silently swallowed as unhandled promise rejections instead of being caught by surrounding <code class="language-plaintext highlighter-rouge">try/catch</code> blocks.</li>
</ol>

<p>And then came the big one.</p>

<p><strong><a href="https://github.com/wekan/wekan/pull/6205">#6205</a> — Incoming Impact</strong> — This is the PR that bumps WeKan to Meteor 3.4. I had a few days left before my Claude and Codex subscriptions ran out, so I decided to put what remained of them to good use. We could’ve attempted a gradual bump, but that would’ve only lengthened the pain – death by a thousand paper cuts. The application restructuring was by far the lengthiest part of this whole migration journey, mostly because of the overuse of globals and the lack of separation between server and client responsibilities (the classic isomorphism trap).</p>

<p>I don’t want to restate what is already in the PR description — I highly recommend reading it, it’s almost another dev diary of its own! What I’d like to highlight though is I did actually migrate the <code class="language-plaintext highlighter-rouge">simple</code> REST packages over at <a href="https://github.com/Meteor-Community-Packages/meteor-rest">Meteor Community Packages</a>, but ultimately decided it was better for WeKan to drop them entirely. This change specifically is partially why I was itching to bump to 3.4 directly – some changes can only be done when you’ve already upgraded and cannot be done on 2.0. Maybe the core team ought to move the Express change to 2.0 to ease this burden a bit.</p>

<hr />

<p>On the Meteor core side, this was a busy month too:</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14222">#14222</a> — Fix puppeteer test runner console output</strong> — When puppeteer was bumped from 20.4.0 to 23.6.0, <code class="language-plaintext highlighter-rouge">msg._text</code> (underscore-prefixed property) became a private ES2022 <code class="language-plaintext highlighter-rouge">#text</code> field. This meant test names and pass/fail results were never printed in CI logs – you’d just see “Test number: N” with no useful information. Tracked it down and fixed the property access.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14223">#14223</a> — Docs: guide LLMs to use test-in-console for package tests</strong> — Added documentation directing LLM agents to use <code class="language-plaintext highlighter-rouge">./packages/test-in-console/run.sh</code> instead of <code class="language-plaintext highlighter-rouge">./meteor test-packages</code>, which hangs waiting for a browser connection and produces no terminal output.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14224">#14224</a> — Add test-headless driver for headless package testing</strong> — Born out of the frustration with <code class="language-plaintext highlighter-rouge">test-in-console</code>. This is a new test driver package that doesn’t rely on console scraping – results flow via DDP methods instead. Server calls <code class="language-plaintext highlighter-rouge">Tinytest._runTests()</code> directly, and if no browser connects within 10 seconds it gracefully prints server-only results. Supports <code class="language-plaintext highlighter-rouge">TINYTEST_FILTER</code> for regex filtering. Still open.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14221">#14221</a> — Remove unused ejson dependency from packages</strong> — Removes direct <code class="language-plaintext highlighter-rouge">ejson</code> dependency from <code class="language-plaintext highlighter-rouge">accounts-password</code>, <code class="language-plaintext highlighter-rouge">accounts-passwordless</code>, and <code class="language-plaintext highlighter-rouge">session</code> since they get it transitively. Still open.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14234">#14234</a> — Integrate collection hooks into core</strong> — This one’s been brewing in my mind for a while. Over the course of 3.0 migrations, I kept running into <code class="language-plaintext highlighter-rouge">collection-hooks</code> everywhere – it even turned up inside redis-oplog. The depth of its penetration into third-party packages made it clear this belongs in core. Bringing it in means it won’t get left behind in future migration cycles (as happened with the fibers/async transition), and we get to shed the monkey-patching workarounds the community package relied on. Still open.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14262">#14262</a> — Backport express for 2.17</strong> — This one came directly out of the WeKan migration pain. Every time I do a 3.0 migration, the same problem stares me in the face: <code class="language-plaintext highlighter-rouge">communitypackages:picker</code> and WebApp need Express, but you can’t use Express until you’re on 3.0. This PR ports the Express change back to 2.x (targeting a possible 2.17 release) so apps can adopt the new WebApp API before making the full 3.0 jump. Still open.</p>

<hr />

<p>And finally, some community package work:</p>

<p><strong><a href="https://github.com/Meteor-Community-Packages/meteor-partitioner/pull/38">meteor-partitioner #38</a> — Meteor 3.0 migration</strong> — Work in progress on migrating the meteor-partitioner package to Meteor 3.0. This is the package that enables multi-tenant data partitioning in Meteor apps.</p>

<p><strong><a href="https://github.com/RocketChat/meteor-streamer/pull/44">meteor-streamer #44</a> — Upgrade to Meteor 3.0</strong> — A substantial migration of RocketChat’s meteor-streamer package. Converted permissions, methods, and emit to async/await, replaced <code class="language-plaintext highlighter-rouge">findOne</code> with <code class="language-plaintext highlighter-rouge">findOneAsync</code>, restructured the repo with a separate test app, wrote 87 new tinytest tests, added ESLint config, and removed the <code class="language-plaintext highlighter-rouge">arunoda:streams</code> dependency. This one lives in my <a href="https://github.com/harryadel/meteor-streamer/tree/master/packages/rocketchat-streamer">fork</a> for now while the PR is reviewed.</p>

<hr />

<p>Looking back at this month, the numbers tell the story: eleven WeKan PRs, five Meteor core PRs (two merged, three open), and two community package migrations. LLMs have been a huge factor in this. I don’t want to use the term “AI” as there’s no inherent intelligence, just cool mathematical tricks that have been there for a long time, only enabled by the massive leap in data and processing power. Yet it’s an incredible tool in our arsenal as developers. We like to think of ourselves as great engineers — which we are in a sense — but our work also contains lots of grunt work like copying files, moving directories, validating words. Stuff that’s not only better suited for a computer but that also frees us to think more about the critical stuff. So don’t get trapped in the doom and gloom as I was, pondering my future as a software developer in the new era, but be optimistic. Think about all the new doors that’ve been opened instead of the closed windows!</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><category term="wekan" /><category term="migration" /><summary type="html"><![CDATA[I’m super duper glad to announce WeKan now runs on 3.4! This has been a long time coming, finally closing the curtain on work that started in dev diary #24. Here’s the big PR if you want to check it out! Now onto the details:]]></summary></entry><entry><title type="html">Dev Diary #25 - WeKan Auth Package Blitz, FullCalendar Migration, and Meteor Security Audits</title><link href="https://harryadel.github.io/dev-diary-25/" rel="alternate" type="text/html" title="Dev Diary #25 - WeKan Auth Package Blitz, FullCalendar Migration, and Meteor Security Audits" /><published>2026-03-01T00:00:00+02:00</published><updated>2026-03-01T00:00:00+02:00</updated><id>https://harryadel.github.io/dev-diary-25</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-25/"><![CDATA[<p>The WeKan migration train keeps chugging along. This month I tackled the authentication packages, which are the gnarliest part of any Meteor app because they tend to rely on Fibers, <code class="language-plaintext highlighter-rouge">Meteor.wrapAsync</code>, and synchronous HTTP calls – all things that Meteor 3.0 wants nothing to do with.</p>

<p>I went through them one by one:</p>

<ol>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6111">#6111</a> — Migrate wekan-oidc to async API for Meteor 3.0</strong> — Fairly straightforward. Replaced the deprecated HTTP package with fetch and asyncified the server-side calls. Nothing too wild.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6112">#6112</a> — Migrate wekan-accounts-sandstorm to async API for Meteor 3.0</strong> — Similar treatment here. Added missing <code class="language-plaintext highlighter-rouge">await</code> statements and converted HTTP to fetch. Sandstorm is a niche platform but WeKan still supports it, so it had to be done.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6114">#6114</a> — Migrate wekan-accounts-cas to async API for Meteor 3.0</strong> — This one was more involved. Had to rip out the <code class="language-plaintext highlighter-rouge">Npm.require('fibers')</code> call entirely, switch the login handler to async/await with <code class="language-plaintext highlighter-rouge">findOneAsync</code>, and wrap the WebApp handler with <code class="language-plaintext highlighter-rouge">Meteor.bindEnvironment</code>. Also replaced underscore with native JS while I was at it. Bumped it to 0.2.0.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6115">#6115</a> — Migrate wekan-ldap to async API for Meteor 3.0</strong> — The biggest of the auth package migrations. Replaced <code class="language-plaintext highlighter-rouge">Meteor.wrapAsync</code> with native Promises, swapped ldapjs for ldapts (v4.2.6 to stay compatible with WeKan’s current Node version), and replaced the slugify dependency with limax. Bumped to 0.1.0.</li>
</ol>

<p>With the auth packages out of the way, I moved onto other migration work:</p>

<ol>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6139">#6139</a> — Migrate @wekanteam/meteor-reactive-cache</strong> — This was a meaty one. The reactive cache is WeKan’s caching layer that prevents repetitive database calls. I moved the package into the WeKan codebase itself via filesystem path rather than keeping it as an external npm dependency. This lets us iterate faster during the migration without needing separate package releases. Converted all the server-side ReactiveCache methods to async and updated every call site. One snag: allow/deny calls had to stop using reactive cache since those remain synchronous in Meteor 2.x. I also added a <code class="language-plaintext highlighter-rouge">METEOR3_MIGRATION.md</code> file at the repo root to track our overall progress.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6153">#6153</a> — Fix unhandled Promise rejection in cron migration job callback</strong> — A fun one to debug. The <code class="language-plaintext highlighter-rouge">createCronJob</code> callback wasn’t async and wasn’t awaiting <code class="language-plaintext highlighter-rouge">this.runMigrationStep(step)</code>. This created a floating Promise that, when rejected, triggered the global error handler in quave:synced-cron, which helpfully calls <code class="language-plaintext highlighter-rouge">process.exit(0)</code> and crashes the whole app on startup. The fix was just making the callback async and awaiting the promise. Classic async migration gotcha.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6162">#6162</a> — FullCalendar NPM + Moment migration</strong> — Discovered that moment.js was being pulled in through the fullcalendar package, so I consolidated the FullCalendar migration and moment removal into one PR. Migrated to FullCalendar v5.11.5 (v6 has ESM/Node constraints that don’t play nice with our current setup, something to revisit post-3.0). Added a template-bound autorun to prevent Blaze errors, cleaned up the calendar UI labels and modal styling, and added missing translation keys.</li>
</ol>

<hr />

<p>On the Meteor side, I had a couple of PRs and a nice milestone to share.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14168">#14168</a> — Add NPM security audit</strong> — I introduced automated npm security vulnerability scanning into Meteor’s CI/CD pipeline. Rather than waiting for community reports about security issues, this proactively scans packages like meteor-node-stubs, meteor-babel, meteor-installer, and others. Using a phased enforcement approach where only meteor-node-stubs is currently enforced, with plans to progressively expand as existing vulnerability debt gets resolved.</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14167">#14167</a> — fix(meteor-node-stubs): patch bn.js bundled transitive versions</strong> — This one got closed because Italo beat me to it with <a href="https://github.com/meteor/meteor/pull/14173">#14173</a>. Fair enough!</p>

<p><strong><a href="https://github.com/meteor/meteor/pull/14153">#14153</a> — Improve LLM access to documentation</strong> — Added absolute URLs, enriched metadata, and generated an API reference JSON to make Meteor’s v3 docs more accessible to LLMs. Grubba liked the codegen approach, and Italo requested we dynamically generate version info rather than hardcoding it. Still open, will address the feedback.</p>

<hr />

<p>And finally, a milestone I’m quite proud of: the <a href="https://github.com/meteor/meteor/issues/13866#issuecomment-3923681691">Meteor Guide migration</a> is essentially complete. This issue was opened back in July 2025 asking whether the guide was up to date, and the answer was a resounding “no”. Since then, the community has been cherry-picking content from the old guide and migrating it to the new VitePress docs. Collections, publications, methods, accounts, testing, routing, Angular, Tailwind, React Native, hot code push, build system, deployment, and performance – all checked off. I’d say we’ve accomplished this with flying colors.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><category term="wekan" /><category term="migration" /><summary type="html"><![CDATA[The WeKan migration train keeps chugging along. This month I tackled the authentication packages, which are the gnarliest part of any Meteor app because they tend to rely on Fibers, Meteor.wrapAsync, and synchronous HTTP calls – all things that Meteor 3.0 wants nothing to do with.]]></summary></entry><entry><title type="html">Dev Diary #24 - WeKan Migration Journey, Meteor Core Updates, and Redis-Oplog Fixes</title><link href="https://harryadel.github.io/dev-diary-24/" rel="alternate" type="text/html" title="Dev Diary #24 - WeKan Migration Journey, Meteor Core Updates, and Redis-Oplog Fixes" /><published>2026-02-09T00:00:00+02:00</published><updated>2026-02-09T00:00:00+02:00</updated><id>https://harryadel.github.io/dev-diary-24</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-24/"><![CDATA[<p>Most of my work this month has been focused on WeKan. WeKan is the poster child for Meteor and I was extremely appalled that it’s still running on version 2. I reached out to Lauri on the official Discord to speak to him because I theorized that the work on 3.0 must have been started but not made public. Yet he told me unfortunately no. 3.0 is such a tremendous undertaking that he wasn’t sure he’d be able to pull it off, and WeKan as is is already sucking up all of his time with no contributors helping around. He did try before to create 3.0 prototypes in the hopes of migrating the existing 2.0 codebase to it, but I recommended against it.</p>

<p>Over my time in the OSS sphere and lately with the 3.0 migration shenanigans, I’ve found myself becoming increasingly aligned with Joel Spolsky’s <a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/">stance on rewrites</a> – don’t do it!</p>

<p>I decided to take the plunge and dedicate my OSS efforts for the foreseeable future to migrate WeKan. It’d be immensely beneficial for WeKan itself and for the Meteor community as a whole to witness a 3.0 migration out in the wild and how the sauce is made.</p>

<p>Ideally when starting out with 3.0 migrations, you should aim to first:</p>
<ol>
  <li>Get your app to the latest 2.x version, currently 2.16</li>
  <li>Prune your Meteor packages. Generally speaking, the fewer Meteor packages you have, the better. This includes:
    <ol>
      <li>Replacing Meteor packages with NPM alternatives or outright removing them.</li>
      <li>Replacing any Meteor packages with either 3.0-friendly alternatives that are better maintained (e.g., kadira:flow-router to ostrio:flow-router-extra)</li>
    </ol>
  </li>
  <li>Enable <code class="language-plaintext highlighter-rouge">WARN_WHEN_USING_OLD_API</code>, introduced in <a href="https://guide.meteor.com/2.12-migration">2.12</a>, and start migrating your server-side app code to async.</li>
  <li>Decouple your front end and back end code, and restructure it to allow for <a href="https://forums.meteor.com/t/meteor-rspack-integration-a-modern-bundler-meets-meteor-3-4/63696/20?u=harry97">separate entry points</a> for client and server. This is a necessity for 3.4 migration.</li>
  <li>Flip the switch and migrate to 3.0 and do <a href="https://v3-migration-docs.meteor.com/breaking-changes/#changes-in-webapp">the necessary grunt work</a>. Certain APIs have been outright removed and you can’t do anything about them in 2.16, so you gotta update to 3.0 and flip the switch!</li>
</ol>

<p>Steps 2 &amp; 3 don’t necessarily need to be done synchronously. You can do them interchangeably. Migrate a package here and some application code there. So adjust accordingly.</p>

<p>I started my work with the lowest hanging fruit to test the waters, then as I gained confidence I moved onto bigger stuff:</p>

<ol>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6067">#6067</a> — Migrate kadira:flow-router to ostrio:flow-router-extra</strong> — Replaced the abandoned <code class="language-plaintext highlighter-rouge">kadira:flow-router</code> client-side routing package with <code class="language-plaintext highlighter-rouge">ostrio:flow-router-extra</code>, its actively maintained successor that supports Meteor 3.0. A very simple change yet a foundational migration step since the router touches nearly every route in the app.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6072">#6072</a> — Update 2.16</strong> — A broader update PR, likely bumping WeKan’s Meteor version or dependencies to 2.16 as part of the incremental upgrade path toward Meteor 3.0. Thankfully going from 2.x to another 2.x isn’t a challenge since there are no breaking changes.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6080">#6080</a> — Migrate from percolate:synced-cron to quave:synced-cron</strong> — Swapped the unmaintained <code class="language-plaintext highlighter-rouge">percolate:synced-cron</code> scheduled job runner for <code class="language-plaintext highlighter-rouge">quave:synced-cron</code>, its Meteor 3-compatible fork maintained by the Quave team.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6082">#6082</a> — Replace mousetrap</strong> — Replaced the Mousetrap keyboard shortcut library with a modern NPM alternative. This is a case in point of how you can decrease your Meteor packages while improving the overall health of your app.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6083">#6083</a> — Remove kadira:dochead</strong> — Removed the <code class="language-plaintext highlighter-rouge">kadira:dochead</code> package (used for dynamically setting <code class="language-plaintext highlighter-rouge">&lt;head&gt;</code> tags like title and meta) and replaced it with a simple <code class="language-plaintext highlighter-rouge">document.title</code>.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6084">#6084</a> — Replace cottz:publish-relations with reywood:publish-composite</strong> — Replaced the <code class="language-plaintext highlighter-rouge">cottz:publish-relations</code> reactive join publication package with <code class="language-plaintext highlighter-rouge">reywood:publish-composite</code>, a more widely used and Meteor 3-compatible package for publishing related/nested documents from multiple collections.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6086">#6086</a> — Replace mquandalle:collection-mutations with collection helpers</strong> — Swapped <code class="language-plaintext highlighter-rouge">mquandalle:collection-mutations</code> (which added mutation methods directly to collections) with a collection helpers approach, removing dependency on an unmaintained package. Hopefully with 3.4 to use the <a href="https://github.com/meteor/meteor/pull/13830">native way</a>. ;)</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6087">#6087</a> — Replace ongoworks:speakingurl with limax</strong> — Replaced the Meteor-wrapped <code class="language-plaintext highlighter-rouge">ongoworks:speakingurl</code> slug generation package with <code class="language-plaintext highlighter-rouge">limax</code>.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6088">#6088</a> — Remove mquandalle:autofocus</strong> — Removed the <code class="language-plaintext highlighter-rouge">mquandalle:autofocus</code> package, which provided auto-focus behavior for form inputs in Blaze templates, replacing it with native HTML <code class="language-plaintext highlighter-rouge">autofocus</code> attribute or a simple manual implementation.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6093">#6093</a> — Migrate createIndex to createIndexAsync</strong> — Converted synchronous <code class="language-plaintext highlighter-rouge">createIndex</code> calls on MongoDB collections to their async counterparts (<code class="language-plaintext highlighter-rouge">createIndexAsync</code>), which is required by Meteor 3.0’s move to an async-first MongoDB driver. This is what I mean by doing steps 2 and 3 interchangeably. During the package work I shifted focus to do a little app code change then reverted back to packages without interruption whatsoever.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6095">#6095</a> — Remove idmontie:migrations</strong> — Removed the <code class="language-plaintext highlighter-rouge">idmontie:migrations</code> package (used for running database schema migrations) and either replaced it with a Meteor 3-compatible alternative or handled migrations differently.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6096">#6096</a> — List on body for global onRendered</strong> — Fixed a Blaze template lifecycle issue, likely moving a global <code class="language-plaintext highlighter-rouge">onRendered</code> callback to properly attach to the body/list template level, ensuring correct initialization behavior after Meteor 3 rendering changes.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6113">#6113</a> — Migrate wekan-accounts-lockout to async API for Meteor 3.0</strong> — Converted WeKan’s account lockout package (which locks accounts after failed login attempts) from synchronous to asynchronous APIs, required by Meteor 3.0’s async-first architecture.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6120">#6120</a> — Fix async/await in copy/move card operations</strong> — Fixed async/await issues in the card copy and move operations, where the migration to Meteor 3’s async MongoDB calls caused unhandled promises.</li>
  <li><strong><a href="https://github.com/wekan/wekan/pull/6126">#6126</a> — Await async setDone before closing popup in copy/move dialogs</strong> — A follow-up fix to #6120, ensuring the <code class="language-plaintext highlighter-rouge">setDone</code> callback is properly awaited before the popup dialog closes during card copy/move operations, preventing the UI from closing prematurely before the database operation completes.</li>
</ol>

<p>The work is still far from over, so keep an eye on the WeKan repo for future PRs ;)</p>

<hr />

<p>With WeKan out of the way, I also had the privilege to do some work on Meteor itself.</p>

<p>I revived the async hooks <a href="https://github.com/meteor/meteor/pull/14069">PR</a>. It was mostly done but the tests were failing. Hopefully it gets merged in the upcoming 3.4.1, which I anticipate is going to be an amazing release. I’d also like to highlight Italo’s <a href="https://x.com/italojs_/status/2019386522756362569">work</a> in spreading the word about Meteor. The amount of PRs rolling in has been increasing, which is something that Meteor direly needs.</p>

<p>Also, the Meteor docs got some <a href="https://github.com/meteor/meteor/pull/14123">love</a>. Ever since the core team decided to move to VitePress and the 2/3 split, things haven’t been super good for the docs, so hopefully that PR gives the little push needed to close out this chapter. Although I theorize that the docs work will never be over because Meteor is always evolving and the changes to track are a moving target. I hope the new <a href="https://github.com/meteor/meteor/pull/14126#issuecomment-3872948173">LLM core changes</a> can help us in that regard.</p>

<hr />

<p>Lastly, Redis-oplog got some 3.4 <a href="https://github.com/cult-of-coders/redis-oplog/pull/424">compatibility fixes</a>. I hope Jan can have a look pretty soon.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><category term="wekan" /><category term="migration" /><summary type="html"><![CDATA[Most of my work this month has been focused on WeKan. WeKan is the poster child for Meteor and I was extremely appalled that it’s still running on version 2. I reached out to Lauri on the official Discord to speak to him because I theorized that the work on 3.0 must have been started but not made public. Yet he told me unfortunately no. 3.0 is such a tremendous undertaking that he wasn’t sure he’d be able to pull it off, and WeKan as is is already sucking up all of his time with no contributors helping around. He did try before to create 3.0 prototypes in the hopes of migrating the existing 2.0 codebase to it, but I recommended against it.]]></summary></entry><entry><title type="html">Dev Diary #23 - Packosphere, Partitioner, and Collection Hooks</title><link href="https://harryadel.github.io/dev-diary-23/" rel="alternate" type="text/html" title="Dev Diary #23 - Packosphere, Partitioner, and Collection Hooks" /><published>2026-01-05T00:00:00+02:00</published><updated>2026-01-05T00:00:00+02:00</updated><id>https://harryadel.github.io/dev-diary-23</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-23/"><![CDATA[<p>This month has been exceptionally intense for Meteor’s OSS.</p>

<p>Starting off with the meatiest of all is the <a href="https://github.com/Meteor-Community-Packages/Packosphere/pull/40">new release</a> of Packosphere. I was motivated to start this PR since whenever I’m using Claude Code or any other LLM, it fails to notice the latest Meteor package releases as it attempts to do so by a usual search lookup which might not detect the beta releases, which are nothing but PRs on the GitHub repos. So I thought it’d be a good time to do a facelift on the Packosphere repository. It’s now updated to the latest RC 3.4-rc.2. Also, a couple of sub-packages were updated too:</p>
<ul>
  <li><a href="https://github.com/copleykj/socialize-base-model/pull/26">socialize:base-model</a></li>
  <li><a href="https://github.com/copleykj/grapher-link-executor/pull/1">copleykj:grapher-link-executor</a></li>
  <li><a href="https://github.com/Meteor-Community-Packages/meteor-packages/pull/19">peerlibrary:meteor-packages</a></li>
</ul>

<p>Collection Hooks is nearing <a href="https://github.com/Meteor-Community-Packages/meteor-collection-hooks/pull/320">another release</a> which attempts to improve its underlying structure to make future improvements much easier. It’s also worth noting that a bug with Accounts.onLogin is <a href="https://github.com/Meteor-Community-Packages/meteor-collection-hooks/issues/323">now fixed</a>.</p>

<p>Partitioner package also received another mini-update which is aimed at fixing a bug with <a href="https://github.com/Meteor-Community-Packages/meteor-partitioner/commit/dfccf20e2200edbd16edf3960aea25b458e7aa74">projection field</a>.</p>

<p>As for Meteor itself, a few PRs were made to help improve the async experience when working with accounts packages:</p>
<ul>
  <li><a href="https://github.com/meteor/meteor/pull/14070">Add loginWithTokenAsync, loginWithPasswordAsync</a></li>
  <li><a href="https://github.com/meteor/meteor/pull/14069">Asyncify client side calls</a></li>
</ul>

<p>Lastly, there’s a very important thing which the community hasn’t been made aware of, which is that <a href="https://docs.montiapm.com/">Monti APM docs</a> is now <a href="https://github.com/monti-apm/docs">open source</a>. These docs represent a treasure trove of Meteor-specific knowledge on how to deal with performance, scaling, and more. It used to be part of the official Meteor docs but wasn’t updated, and now since Meteor gave up its own APM in favor of Monti becoming the de facto APM for the entire Meteor community.</p>

<p>I’m quite grateful for this month’s work as it helped push the narrative of many Meteor packages out there, and I was quite delighted to help out with Packosphere. Be sure to <a href="https://github.com/sponsors/copleykj">support Kelly</a> so that he may continue his awesome work.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><summary type="html"><![CDATA[This month has been exceptionally intense for Meteor’s OSS.]]></summary></entry><entry><title type="html">Dev Diary #22 - NonEmptyString Landing, Hash URLs, and Email Template Warnings</title><link href="https://harryadel.github.io/dev-diary-22/" rel="alternate" type="text/html" title="Dev Diary #22 - NonEmptyString Landing, Hash URLs, and Email Template Warnings" /><published>2025-12-09T00:00:00+02:00</published><updated>2025-12-09T00:00:00+02:00</updated><id>https://harryadel.github.io/dev-diary-22</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-22/"><![CDATA[<p>Hi, did you miss me?</p>

<p>This entry is much smaller in terms of contributions as I’ve been struggling with balancing work commitments.</p>

<p><a href="https://github.com/meteor/meteor/pull/12852">Add NonEmptyString to check package</a> finally landed. This PR was started on Oct 30, 2023. That’s more than 2 years in the making for a very simple feature. If OSS has taught me any lesson, it’d be patience and perseverance. You can make all the right steps and still your contribution won’t land, as maintainers might have other commitments. So you just have to continue pushing for it, and if the case is in your favor, you might be rewarded someday and get it merged!</p>

<p>I also made two quick contributions in succession:</p>

<p><a href="https://github.com/meteor/meteor/pull/14043">Document how to work with hash URLs</a>. It was an interesting job finding out how Meteor goes about generating reset URLs. Turns out preceding URLs with hashes forces the browser to handle such calls on the client side instead of server side to avoid sensitive tokens being shown in server logs.</p>

<p><a href="https://github.com/meteor/meteor/pull/14044">Warn if Accounts.emailTemplates.from isn’t set</a>. This resulted from a real-life problem where email sending was failing, and no matter where we looked, we couldn’t pinpoint the problem until a developer suggested adding <code class="language-plaintext highlighter-rouge">Accounts.emailTemplates.from</code> as Meteor defaults to <code class="language-plaintext highlighter-rouge">Accounts Example &lt;no-reply@example.com&gt;</code>. While digging, I also came across a change that was undone recently. Hopefully we can get to the bottom of it soon.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><summary type="html"><![CDATA[Hi, did you miss me?]]></summary></entry><entry><title type="html">Firely.app is out!</title><link href="https://harryadel.github.io/firely-app-is-out/" rel="alternate" type="text/html" title="Firely.app is out!" /><published>2025-11-29T00:00:00+02:00</published><updated>2025-11-29T00:00:00+02:00</updated><id>https://harryadel.github.io/firely-app-is-out</id><content type="html" xml:base="https://harryadel.github.io/firely-app-is-out/"><![CDATA[<p><a href="https://firely.app/">Firely.app</a> is out!</p>

<p>It’s a personal SaaS I’ve built to better track my spending. If you’ve followed my writing, you’ll know I’m big on personal finance - I even wrote an article <a href="/on-lending">on lending money</a>.</p>

<p><strong>How I discovered FIRE</strong></p>

<p>My journey into financial independence started after being laid off from a job. It got me thinking: would I be working my entire life? Is there an end to this? To live with dignity, do I have to trade my time infinitely, even into old age?</p>

<p>I started looking up resources on managing money better and stumbled upon <a href="https://yourmoneyoryourlife.com/">“Your Money or Your Life”</a>. The book delivers on its title - your relationship with money and how you deal with it can either supercharge or drain your life.</p>

<p>Reading it was a life-defining moment. It reframed everything by equating your hourly rate with how many hours you’re trading for certain items. Does your phone feel worth it when it cost you an entire week of work? Are you happy giving a “friend” a gift worth 10 hours of your life when he wouldn’t give you 10 minutes of his time? Does spending an hour’s worth of money on a personal hobby feel satisfying?</p>

<p><strong>Building a foundation</strong></p>

<p>My journey then led me to <a href="https://www.goodreads.com/book/show/43345855-quit-like-a-millionaire">Quit Like a Millionaire</a> and JL Collins’ <a href="https://jlcollinsnh.com/2025/04/18/a-new-edition-of-the-simple-path-to-wealth/">The Simple Path to Wealth</a>. Both books formed a great foundation and an all-encompassing philosophy without requiring me to grok thousands of pages of literature.</p>

<p>They did arrive at a key point: the need to invest in stocks and bonds. I thought, well, I need to dive even deeper - so I read <a href="https://www.porchlightbooks.com/products/etfs-for-the-long-run-lawrence-carrel-9780470138946">ETFs for the Long Run</a> and Abner’s <a href="https://onlinelibrary.wiley.com/doi/book/10.1002/9781118258194">The ETF Handbook</a>.</p>

<p>Finding an investment platform was a big hurdle since I’m Egyptian and live in Egypt. Most trading platforms outright ban or don’t allow Egyptians. I’d love to share that experience, but perhaps in another post. With much luck, I eventually found <a href="https://heygotrade.com/referral?code=561766">GoTrade</a> and more recently <a href="https://nsave.com/">Nsave</a>.</p>

<p><strong>Beyond finances: a life philosophy</strong></p>

<p>Another instrumental book was <a href="https://earlyretirementextreme.com/">Early Retirement Extreme</a>, which I consider more of a life philosophy than a finance book. To give you an idea, it lists Miyamoto Musashi’s <em>Book of Five Rings</em> as an inspiration.</p>

<p>I was particularly struck by the concept of being a renaissance man - excelling in multiple areas of life instead of being a one-dimensional cog in our capitalistic society, easily replaced. There’s so much you can discern about someone’s view of life, work, and everything else by how they view money’s role. This is something I’d like to expand on in future posts.</p>

<p><strong>Why I built Firely</strong></p>

<p>Now, back to <a href="https://firely.app/">Firely</a> - sorry, I couldn’t help sharing what led me here!</p>

<p>I’d been tracking my finances for a couple of years in a simple ODS spreadsheet. I like keeping things simple, but this method had a few flaws:</p>

<ul>
  <li><strong>Memory burden</strong>: If I was out, I had to memorize or write things down. I believe cognition is like RAM - it’s not made to hold information, but to quickly process it.</li>
  <li><strong>Complex calculations</strong>: Any fancy analysis required equations and formulas - another skill and time investment I wasn’t ready to make.</li>
  <li><strong>Accessibility</strong>: I could only access it from my computer.</li>
  <li><strong>No automatic backup</strong>: Everything had to be done manually.</li>
</ul>

<p><strong>Enter LLMs</strong></p>

<p>Thankfully, with the rise of LLMs (thank you, dear Claude), I was able to spin up a prototype during a weekend and host it on Vercel. I believe this is one of the real benefits of LLMs: personal micro-SaaS is the next big thing. Now anybody, developer or not, can spin up an app that solves their niche need.</p>

<p>The very first commit was on January 1, 2025, but I’ve been slowly iterating to reach a stable version. The app may still contain bugs, which I’d gladly like to learn about. You can report any issues via <a href="https://x.com/harryadel2">X</a> or email me at harryadelb@gmail.com.</p>

<p>Looking forward to hearing what you think!</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="sass" /><category term="personal" /><category term="money" /><category term="finance" /><category term="others" /><summary type="html"><![CDATA[Firely.app is out!]]></summary></entry><entry><title type="html">Dev Diary #21 - Collection Extensions Merged, Jobs Package Update, and Apollo Improvements</title><link href="https://harryadel.github.io/dev-diary-21/" rel="alternate" type="text/html" title="Dev Diary #21 - Collection Extensions Merged, Jobs Package Update, and Apollo Improvements" /><published>2025-10-25T00:00:00+03:00</published><updated>2025-10-25T00:00:00+03:00</updated><id>https://harryadel.github.io/dev-diary-21</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-21/"><![CDATA[<p>We’re wrapping up an intense month this time. Right off the bat, <a href="https://github.com/meteor/meteor/pull/13830">lai:collection-extensions</a> has been merged into the core finally, and now it’s <a href="https://github.com/Meteor-Community-Packages/meteor-collection-extensions/commit/0d4bb5ab5f3f720be6f98f3ffa8fab3ed87aa58a">stated</a> clearly to use the core utilities instead of the package.</p>

<p>This marks the death of a second collections-related package; the first was <a href="https://github.com/Meteor-Community-Packages/mongo-collection-instances#warning">mongo-collection-instances</a>. This was touched upon in a previous <a href="https://forums.meteor.com/t/collection2-future/61294">community post</a> where I discussed whether Astronomy should be merged into collection2 or not. But now two of the big collection utilities are offered directly by the core.</p>

<p><a href="https://github.com/wildhart/meteor.jobs/pull/31">wildhart:jobs</a> has been made 3.x friendly. Hopefully the original author has some time to look into it and approve it!</p>

<p>Meteor Grapher is pending <a href="https://github.com/bhunjadi/grapher/pull/5/">quality of life changes</a>.</p>

<p>Orderlion’s ddp-apollo, which is a fork of swydo:ddp-apollo, also got a <a href="https://github.com/orderlion/ddp-apollo/pull/1/commits/db66091212cae2cf7c459cbae011b3dc07142b1d">nice set of updates</a> that should make it more efficient and independent. Their fork had an underlying package that wasn’t published, so I published it under <a href="https://www.npmjs.com/package/meteor-apollo-link-ddp">meteor-apollo-link-ddp</a>.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><summary type="html"><![CDATA[We’re wrapping up an intense month this time. Right off the bat, lai:collection-extensions has been merged into the core finally, and now it’s stated clearly to use the core utilities instead of the package.]]></summary></entry><entry><title type="html">Dev Diary #20 - Meteor-Files 3.0, Collection2 Zod v4, and Partitioner Progress</title><link href="https://harryadel.github.io/dev-diary-20/" rel="alternate" type="text/html" title="Dev Diary #20 - Meteor-Files 3.0, Collection2 Zod v4, and Partitioner Progress" /><published>2025-10-04T00:00:00+03:00</published><updated>2025-10-04T00:00:00+03:00</updated><id>https://harryadel.github.io/dev-diary-20</id><content type="html" xml:base="https://harryadel.github.io/dev-diary-20/"><![CDATA[<p>Whew, another month has passed! This officially marks my twentieth blog post, or in other words, a consistent 20-month effort of conducting open source work. I’m glad I’ve stayed consistent enough.</p>

<p>Now onto the changes:</p>

<p>Probably the biggest highlight of this month is the release of Veliovgroup’s Meteor-Files <a href="https://github.com/veliovgroup/Meteor-Files/pull/895">v3.0.1</a>. While my <a href="https://github.com/veliovgroup/Meteor-Files/pull/903">PR</a> didn’t get merged, I’m glad it inspired Dmitriy. Huge shoutout to Dmitriy for his consistent work. You might want to check out his service <a href="https://ostr.io/">Ostr.io</a>.</p>

<p>My efforts to migrate <a href="https://caught.nu/">Caught</a> to 3.0 are still underway, and thanks to their patronage, I’ve been religiously migrating the Meteor-partitioner package. The latest beta currently out is <a href="https://github.com/Meteor-Community-Packages/meteor-partitioner/pull/38/commits/cf8cf53c564b8d7907d9b0cb18f7a4d67723fc26">0.7.0-beta-12</a>. I’ve noticed that bumping the minor version is suboptimal, so I’ll probably do a major bump once I’m done.</p>

<p><a href="https://github.com/harryadel/apollo-live-client">apollo-live-client</a> is now async compliant and ready for Meteor 3.0.</p>

<p>I also decided to do a little side quest and feature Meteor on the parcel-bundler repo: https://github.com/parcel-bundler/watcher/pull/214</p>

<p>A new beta version of collection2 that supports Zod v4 is out: https://github.com/Meteor-Community-Packages/meteor-collection2/pull/447#issuecomment-3250047107 I’m awaiting your feedback so I know what the next steps are.</p>

<p>Lastly, I did fiddle a bit with Meteor packaging system and came up with a <a href="https://github.com/meteor/meteor/pull/13923">PR</a>. It’s still in the works, and <a href="https://github.com/meteor/meteor/pull/13923#issuecomment-3301075850">zodern’s comment</a> made me doubt it a bit, but hey, it was fun looking into Meteor’s internals.</p>]]></content><author><name>Harry Adel</name><email>harryadelb@gmail.com</email></author><category term="meteorjs" /><category term="oss" /><summary type="html"><![CDATA[Whew, another month has passed! This officially marks my twentieth blog post, or in other words, a consistent 20-month effort of conducting open source work. I’m glad I’ve stayed consistent enough.]]></summary></entry></feed>