WRDashboard

Fork Me on Gitlab

Articles

Glynn Stewart

State of the Author May 2026

To give you a sense of how my schedule is structured, I schedule edits for a year in September of the prior year. So at that point, I usually know what I am writing and have time slots set up for each book.

The goal is to publish a novel every second month and to write a book in seven to eight weeks. There is an intentional disconnect between those two cycles, intended to let me get ahead and allow for projects that won’t get published straightaway.

Right now, I am burning up all of the headway I’ve built over the last couple of years to write Fated Skies, the last of the Aether Spheres trilogy. It’s a fun book but it is very long.

And you may note that nothing in that planned cycle above is adjusted for the expected length of the book. April was a busy month and May isn’t slowing down yet. I have no major concern about finishing Fated Skies on schedule, but it’s definitely eating, well, all of my time.

I’m also being very, very mean to my Shaman, Captain, and Archmage. I feel a bit bad it, but hopefully it will make for a good book!

The schedule for 2026 remains unchanged:

May 21 – Spirit Blade (Spirit Knight 1)

June 18 – l’Honneur du Noble (Sang du Changelin 3)

July 23 – Alien Olympus (Starship’s Mage 19 / Mars Unconquered 1)

September – Keepers of the Flesh (Saints of the Void 2)

November – Wildcard (House Adamant 6)

As I said last month, I’m hoping to get the Fated Skies Kickstarter live this fall, but we’ll see if I manage to come up for air that long!

Happy reading everyone,

-Glynn

The post State of the Author May 2026 appeared first on Glynn Stewart.


Brickhouse Guitars

So this happened!

-/-

Cordial Catholic, K Albert Little

Believers vs. Disciples: What's the Difference? #shorts

-/-

The Backing Bookworm

Our Perfect Storm


Canadian author Carley Fortune, known for her romance novels that celebrate beautiful parts of Canada, has set this latest book in stunning Tofino, British Columbia (Heads up Tofino!! Prepare for the clamouring of many romance lovin' vacationers to visit you! Just ask PEI. #iykyk)
Our Perfect Storm is a story about complicated family dynamics centred around BFFs since childhood, George and Frankie. George gives off Clark Kent vibes - hot, strong, and sensitive - complimenting the more immature and frenetic nature of Frankie. This book grabbed me from the start and is the kind of story that you can sink into. It balances complex family issues, atmospheric descriptions that set the reader in place and its banter is perfection! 
It also has one of my all-time favourite tropes - Friends to Lovers! There's just something about the bond between friends and that awkward and thrilling jump into romance that gets me every time - perhaps it's because my husband and I were friends for years before adding romance into the mix. 
I really enjoyed this book but had a wee beef or two: - miscommunication trope (but it wasn't too bad)- romance happened at a breakneck pace (1 week)- the second half wasn't as strong as the first (I missed the amazing secondary cast who added depth and humour)- the ending felt a bit rushed
With its similar vibes, this would be a great pick if you loved Emily Henry's People We Meet On Vacation. It's a great summer romance set in beautiful B.C and I hope it's on YOUR summer TBR! 

My Rating: 4.25 starsAuthor: Carley FortuneGenre: Romance, CanadianType and Source: Hardcover, personal copyPublisher: BerkleyFirst Published: May 5, 2026Read: May 5-10, 2026

Book Description from GoodReads: Best friends have one week in paradise to fix their friendship or fall apart in this heart-stopping, utterly romantic new novel from the #1 New York Times bestselling author of Every Summer After and One Golden Summer.
Frankie and George have been best friends since they were eight years old. Both passionate, impulsive, and headstrong—they’ve always clashed . . . and come back together. Until now. It’s the eve of Frankie’s wedding weekend, and she doesn’t know where they stand or even if George will show up as her best man.

Then, at the start of the festivities, in walks George. For one glorious evening, surrounded by her loved ones, Frankie’s life is finally perfect. But it all comes crashing down when her fiancé dumps her the next morning, leaving only a note as an explanation.

Crushed and confused, Frankie returns to her family’s home to wallow. But George has a different idea and a plan for healing Frankie’s broken heart. He wants her to go on her honeymoon. With him. For one week, to the lush rainforests and misty beaches of Tofino.

Frankie agrees, seeing the trip for what it really is: one last chance to repair their friendship. Even if it means unearthing secrets and long buried feelings neither knows how to handle. Even if it means falling apart for good.


Kitchener Panthers

Kiefer clutch for Kitchener in home opening win

KITCHENER - Petey Kiefer could not be stopped.

The second-year infielder hit two home runs and drove in five runs, leading the Kitchener Panthers to a 9-5 win over the Chatham-Kent Barnstormers Sunday at Jack Couch Park.

Kiefer hit a three-run jack as part of a six-run fourth inning, and a no doubter two-run shot in the eighth to give the home side some late insurance as the Barnstormers inched closer.

Owen MacNeil went four innings in his second start of the season. He gave up two runs on four hits and collected five strikeouts.

Ben Hewitt and Jake Liberta also saw their first action of 2026 on the bump. 

Bawin Colon had some command issues in the ninth and had the tying run at the plate with two away, but was able to get a ground ball and closed it out.

Another highlight of the game came in the ninth, when Mateo Zeppieri took away a home run, robbing Austin Gurney at the left field fence.

Greyson Barrett and Yushin Ohta both hit dingers for the Barnstormers.

Kitchener improves to 2-1, while Chatham-Kent moves to 1-1.

Kitchener is home to London on Thursday night at 7:05 p.m.

GET YOUR TICKETS NOW and #PackThePack for some Kitchener Panthers baseball!

BOXSCOREGAME REPLAY

Github: Brent Litner

brentlintner starred inertiajs/inertia

♦ brentlintner starred inertiajs/inertia · May 17, 2026 11:07 inertiajs/inertia

Inertia.js lets you quickly build modern single-page React, Vue and Svelte apps using classic server-side routing and controllers.

TypeScript 8k Updated May 13


James Davis Nicoll

Relentless! / Non-Stop By Brian W. Aldiss

Brian Aldiss’ 1958 Non-Stop is a stand-alone science fiction novel.

Roy Complain is unhappily married to Gwenny. This is only one of the many ways in which Complain’s life is not what he might hope. His nomadic tribe, the Greenes, is surrounded by ever-growing greenery and hostile rival tribes. Life is unpleasant and short, defects which curiously do not compensate for each other.

Among her unwomanly characteristics, Gwenny is consumed with a passion for hunting. Complain grudgingly gives in to her demands to accompany him. Consequences follow.

Github: Brent Litner

brentlintner starred hanthor/bluefin-cli

♦ brentlintner starred hanthor/bluefin-cli · May 16, 2026 16:36 hanthor/bluefin-cli

Go 13 Updated May 8


Code Like a Girl

Understanding continue and break in Java (With Clear Examples)

When working with loops in Java, controlling the flow of execution is very important.♦

When I was working with Java, I learned about two powerful keywords- break and continue that help change how loops behave. I mean, they help either stop loops completely or skipp certain parts.

Let’s clearly explore both in a simple and practical way.

What are continue and break?

Both continue and break are jump statements used to alter the normal flow of loops. They help to control the loop execution by terminating the loop early or skipping specific iterations.

  • continue — Skips the current iteration and moves to the next one
  • break — Terminates the loop completely
♦continue and breakWhat is continue in Java?

The continue keyword is used to skip the current iteration of a loop and move to next loop.

Example 01: Use continue keyword in a for loop

class ContinueExample{
public static void main(String[] args){
for(int i=0;i<5;i++){
if(i==2){
continue;
}
System.out.println(i);
}
}
}

Explanation:

When i == 2, the continue statement is executed. So, the loop skips printing 2 and moves to the next iteration.

Output:

0
1
3
4
What is break in Java?

When you use the break keyword in a Java program, it immediately exits a loop or switch statement — no matter how many iterations are left.

Example 01: Use break keyword in a loop

class BreakExample{
public static void main(String[] args){
for(int i=0; i<10; i++){
if(i==5){
break; // stops the loop when i=5
}
System.out.println(i);
}
}
}

Explanation:

When i == 5, the loop stops immediately.

Output:

0
1
2
3
4

Example 02 : break in a while loop

class BreakExampleWhileLoop{
public static void main(String[] args){
int i=1;

while(i<=10){
if(i==7){
break;
}
System.out.println(i);
i++;
}
}
}

Explanation:

The loop runs until i == 7. When i == 7, the loop immediately stops and ignores all remaining code.

Output :

1
2
3
4
5
6

Difference between break and continue:

♦Final Thoughts
  • Use continue when you want to skip specific values or conditions.
  • Use break when you want to stop the loop entirely.

Both keywords are simple but powerful tools that make your code cleaner and more efficient.

Understanding continue and break in Java (With Clear Examples) was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Brickhouse Guitars

Boucher SG 132 UV WT 1192 D Demo by Roger Schmidt

-/-

Agilicus

The False Choice of NERC CIP-003-9: Keep Remote Access and Stay Compliant

-/-

Cordial Catholic, K Albert Little

A Mother's Journey to Faith Through Her Daughter #shorts

-/-

James Bow

Electric Wessels

♦The image to the right is by Denis Vermeirre, and is used in accordance with their Creative Commons License (Own work, CC BY-SA 4.0)

There's been an interesting development in the games we play with Ontario license plates.

As well as the old game of Bumper Stumpers (remember that?), one game I play (and I know my friend Andrew plays), is trying to log the "highest" Ontario license plate possible. Standard Ontario license plates follow the pattern of four letters, followed by three numbers, with license letters and numbers raised incrementally. I remember when (roughly 1997) there was a mild kerfuffle over the fact that our old license plate system, which used three letters followed by three letters, was running out of 'numbers", as we were nearing ZZZ 999, so what were we going to do then?

The answer, of course, was to flip over to AAAA 000. And, since then, the highest license plate I've seen is in the DA region. According to Wikipedia, as of December 8, 2025, the highest license plate number is DJVP-046. Given that this pattern allows for 456,976,0009 variants, it should be about a century or so before we have to update this system with five letters.

(Actually the total number of variations is significantly smaller than nearly 457 million. The letters G, I, O, Q, and U aren't used because they're too similar to each other and to other numbers, and this brings the number of variants down to 21 to the power of four, multiplied by a thousand, or 194,481,000. Legislation also prevents the use of certain letter combinations because they spell bad words or are reserved for government officials)

A wrinkle in this game comes in the form of green license plates for electric and plug-in hybrid vehicles. When these license plates were introduced, back in 2010, they had green lettering instead of blue, and gave you additional perks, such as the ability to use high occupancy vehicle lanes without the requisite number of passengers. All of the green license plates followed the four letter and three number pattern of regular Ontario license plates, with the exception that they all started with GV ("Green Vehicle" -- although FrancoOntarian drivers had the option of picking up VE license plates for "Véhecule Écologique").

Because the total number of possible GV licenses is significantly smaller than the total number of regular license numbers (441,000), I couldn't help but notice that we were running up the alphabet quite quickly, and I wondered what would happen when we tipped over the edge. A few days ago, I got my answer. I found myself driving behind another electric vehicle with a green license plate, but there was something strange about it. Then I realized: the license plate was in the GWAB 000 format.

I pointed this out to younger child, who shrugged, but laughed when I said, "I guess the guy is driving a Green Whe-hecle." She came up with one better, saying, "It stands for Green Wheels".

But now, in my head, I hear Chekov's voice, referring to the license plate as "Green Wessel".


Elmira Advocate

REGION'S DESPERATION BECOMING MORE AND MORE CLEAR

 Well I knew that the Region of Waterloo had been eyeing previously shut down water wells due to industrial contamination which was absolutely not confidence inspiring but here they go now looking at wells in Baden long closed due to Nitrate contamination. Nitrates result from over fertilizing farm fields with manure, sewage, hog, cattlle and sometimes even Sewage Treatment Plant solids.  Sounds yummy doesn't it? Yours truly has actually seen fields after dumping...oops I mean after fertilizing farm fields with biosolids including needles and other stuff that shouldn't have gone down the toilet in the first place but does anyways. Nitrates are basically nitrogen combined with some oxygen.

Today's K-W Record carries the following story titled "The search for clean water". Who exactly are they kidding. Possibly the clean water is long gone and the best we can do now is simply to a) find water that can be treated somehow and b) treated fully at a price that won't bankrupt us. We are advised that the Region are hoping to drill deeper through the contaminated aquifers to find a less contaminated aquifer. This action will of course increase our water costs as deeper wells mean bigger pumps and greater electrical costs to bring the water to the surface. Other issues pointed out in the article have to do with well interference in the Baden and New Hamburg areas as both farms and residents homes there are already dealing with lower water levels. 

Essentially what has happened is that citizens and residents have been subsidizing polluting industries throughout Waterloo Region for decades as they have contaminated our waters with solvents, pesticides and other industrial chemicals. We have also known that manure, nitrates and nitrites have been getting into our surface waters for decades from farm and feedlot runoff. This of course affects our drinking water as we attempt to treat Grand River water for human consumption. For decades even wells near our three biggest cities have been showing Nitrates and Nitrites at alarming levels. Further to the mix is Sodium from salt (NaCl-sodium chloride) put on our roads and sidewalks.

All in all the Region of Waterloo politicians have been playing fast and loose with our water and not keeping citizens informed as to the severity of the problems. We are now beginning to see the big picture and it's not a pretty picture.


Kitchener Panthers

Panthers spoil Hamilton opener, get first win of 2026 season

HAMILTON - Zane Skansi drove in three runs, and Yosuke Fujie brought home two more as the Kitchener Panthers took down Hamilton 7-4 Friday night.

It's Kitchener's first win of the year, and brings their record to 1-1.

Hamilton looked like they were in cruise control to start. They took the 2-0 lead, and Owen Boon had yet to surrender a hit through three innings.

But the Panthers got to last year's MVP in the fourth, courtesy a two-out two-run double from Skansi to tie the game.

Kitchener continued to get it done offensively. 

Mateo Zeppieri walked three times, and stole three bases on the night. Josh Williams went two-for-four and drove in a run.

Evan Elliott went four innings in his first start of the year, giving up two runs on four hits.

Hamilton got as close as getting the go-ahead run to the plate in the eighth, as Elian Serrata struggled with command and walked three batters and clunked one with the bases juiced.

But they got out of it, and Bawin Colon earned his first CBL save, striking out two batters in the ninth to seal it.

Kitchener pitching surrendered just five hits on the night.

The Panthers host Chatham-Kent for the home opener Sunday afternoon at 2 p.m.

The first 500 fans in the park get a free Panthers toque! GET YOUR TICKETS NOW and #PackTheJack!

BOXSCORE

Brickhouse Guitars

Dontcho Ivanov Snow Parlor #62 Demo by Roger Schmidt

-/-

The Backing Bookworm

Mother Tongue


Part non-fiction history book with its focus on Deaf culture, language deprivation and Deaf experience and part memoir, this book was a great exploration of the author's experiences and a crash course in oppression and advocacy.
Sara Nović was born hearing and became deaf in her early teens. In Mother Tongue, she shares her experiences, struggles and successes as a friend, daughter, and mother, helping readers to better understand what it feels like to not fit in; the exhausting and constant battle to be seen and valued in a society that is heavily influenced by ableism, devaluing anyone different from the status quo. 
I went into this book knowing a lot about Deaf culture, history and ASL as a former ASL interpreter, but I appreciated Novic's deep dive into the politics, her experiences with adoption and the dark hold ableism still has over society. She goes into a lot more detail with some subjects than I was expecting, giving the book a nonfiction feel, but brings it back to how history and today's politics impact her and her young family. She keeps readers a bit at arm's length, but I respect  how she draws the line, sharing with her readers only the bits of her life she's comfortable with. 
Compelling and informative, Mother Tongue is an exploration of disability, oppression, Deaf advocacy and history, motherhood and the long-lasting impact of language deprivation. It will be an eye-opening read for many readers, giving them a better understanding of what it means to be Deaf in today's world.  
Disclaimer: Thanks to the publisher for the complimentary digital advanced copy of this book which was given to me in exchange for my honest review.

My Rating: 4 starsAuthor: Sara NovićGenre: Memoir, History, DeafType and Source: ebook from publisher via NetGalleyPublisher: Random HouseFirst Published: May 5, 2026Read: May 1 - 5, 2026

Book Description from GoodReads:The New York Times bestselling author of True Biz retraces her path out of the hearing world and into the deaf community—and seeks to understand what it means to raise children who are different from her—in this emotionally rich memoir.
Sara Nović’s early years were steeped in music, Bible study, and a strong desire to fit in. But when she failed her school’s mandated hearing test, her worldview was thrown into chaos. Desperate not to be marked as different, she told no one, staying in the hearing world for as long as she could by brute force.

Eventually unable to ignore the fact that she was deaf, Nović sought out other deaf people and was welcomed into a tight knit community rooted in the beauty and joy of American Sign Language. Nović realized that rather than maintaining the facade of her old life or trying to straddle two worlds, she would need to cultivate an existence in the space between.

Now the mother of two young sons—one, biological and hearing, the other, adopted and deaf—Nović reflects on her life both before and after parenthood. She’s raising her children within the deaf world, offering them things her younger self needed, all the while knowing that as her children grow, their own paths will branch off from hers in ways she cannot fully predict or plan for.

Interwoven with Nović's personal story is a remarkable portrait of America through reflections on some of its most complex the rise of the Christian right, the thorny world of international adoption, and above all, the deaf and disabled communities’ stubborn survival in the face of persistent oppression.

Nović’s clear, bold voice is one readers will hold onto, learn from, argue with, and be inspired by, as she asks us to recognize difference as a source of opportunity rather than fear, as a chance to draw families and communities together, and to build something new.


Agilicus

The False Choice of NERC CIP-003-9: Keep Remote Access and Stay Compliant

-/-

Brickhouse Guitars

Coffee Break with Kyle & the Furch Rainbow

-/-

Elmira Advocate

LIGHTNING & HOCKEY BIAS STRIKE ELMIRA AGAIN!

 

Maybe that's why I'm having a hard time with this one .An obviously wealthy family (check out the mansion, the number of acres owned and the size /cost of the friggin fully equipped hockey rink and infrastructure) made the decision not to follow fairly normal municipal rules and regulations regarding constructing buildings, hooking up to municipal services etc. Now at first blush their excuse was well it's only a hockey rink for kids and hockey is a good thing here in Canada, right. Hmm well maybe O.K.   Although this is no outdoor rink, watered with a hose and used plywood for the ten inch high boards.  This is a full indoor rink and building including a commercial ice /refrigeration system, a commercial ice cleaner (zamboni??), washrooms etc. etc. A friend's first question to me was : How did this family get a professional contractor (plumber, electrician, carpenter, concrete specialists etc. ) to build all this without a Building Permit much less other paperwork to prove this is a documented, legitimate, built to code safe building. 

Now my friend can be enthusiastic at times and he considered that maybe somebody, somewhere got paid off. The more I think about it the more I wonder too. Is our municipal system so lax that a major building built between the mansion and the roadway can be expected to be ignored? This is Woolwich Township not Mississauga or Toronto where I expect buildings come and go all the time without proper paperwork.  O.K. somebody caught this "nice" undocumented building to be used for kids healthy entertainment. The last time Woolwich got an extra rink it was at the proposed new Rec Centre and cost us an experienced councillor (Pat McLean-no loss really) in exchange for a novice (Sandy Shantz) who went on to three terms as mayor totally ensuring that Uniroyal Chemical and successors got away with paying the absolute minimum to "clean up" their chemical nightmare including  Dioxins, DDT, NDMA etc.  

So is this as bad a decision as my gut is telling me or am I still leery of ice rinks after the last one  Woolwich voters wanted and what it really cost us all?

The story was in the K-W Record this week yet I did not see it in the Observer this week. Odd!



Capacity Canada

Outta Work Actors Inc.

♦ Volunteer Opportunity Are you interested in serving on our Board of Directors?

We are a new not for profit theatre group dedicated to project that encourage meaningful engagement and advance a socially just society.

Our expertise spans drama, dance, music, and related arts – especially applied theatre, role play, improvisation, and storytelling.

Through collaboration and open communication, we harness the arts to spark positive social change and promote equity and inclusion. We view theatre as a space where barriers are understood, and diverse perspectives are embraced.

By amplifying marginalized voices and by sharing overlooked stories, we inpire empathy and connection, fostering a sense of belonging for all.

our current main progamming initiative is the Kaleidoscope Two Minute Play Laboratory which is a project that has evolved in collaboration and partnership with the Social Development Centre Waterloo Region. We are searching for three new board members to serve for the next year.

Our first Annual General Meeting June 8, 2026 at 8pm online.

If you are interested in joining our governance team please contact us at ad.outtaworkactors@gmail.com

 

The post Outta Work Actors Inc. appeared first on Capacity Canada.


Code Like a Girl

How AI Gave Me the Confidence of a Man

I have a PhD in Computer Science from UCL. I’ve published papers on privacy-preserving machine learning. I build systems that protect sensitive medical data.

And for years, I was convinced I was missing some fundamental knowledge that everyone else had.

The Secret Knowledge I Didn’t Have

I didn’t do a Computer Science undergrad. I studied Mathematics.

This shouldn’t matter. But it mattered to me, in a way I couldn’t shake.

My colleagues would throw around acronyms. SOLID. DRY. Design patterns I’d never formally learned. They’d reference CS fundamentals like old friends: “Oh, that’s just a classic producer-consumer problem.” I’d nod along, then quietly Google it later. They’d swap LeetCode war stories from interview prep — problems they’d grinded through in university or before job hunts. I never did that. I didn’t even know it was a thing until I was already working.

I knew my stuff. I could build the systems, solve the problems, ship the code. But I always felt like I was doing it wrong somehow. Like there was a “proper” way that everyone else learned in their second-year algorithms class, and I was just hacking my way through with mathematical intuition and Stack Overflow.

Here’s the thing people don’t tell you about imposter syndrome: it’s not about whether anyone believes in you. My managers praised my work. My colleagues respected my contributions. My PhD supervisor told me I was a good researcher.

I chose not to believe any of them.

Every compliment got filtered through a lens of suspicion. “They’re just being nice.” “They don’t want to discourage me.” “They haven’t figured out yet that I don’t know what I’m doing.” I had built an airtight defense system against evidence of my own competence.

The problem was never external validation. It was my refusal to accept it.

The research on this is well-documented. There’s a popular claim that women only apply for jobs when they meet 100% of the qualifications, while men apply at 60%. The exact statistic is probably apocryphal since it’s traced back to a speculative comment at Hewlett Packard rather than rigorous data. But the underlying pattern is real: LinkedIn data shows women are more selective when applying, particularly for senior roles. Harvard Business School research confirms that women are more likely to shy away from opportunities when they’re concerned they aren’t qualified enough.

I wasn’t even thinking about job applications. I was worried about speaking up in code reviews.

The Rubber Duck That Knew Everything♦

I started using AI as a coding assistant about a year ago. At first, it was just convenience — autocomplete on steroids.

Then I started asking it questions.

Not complex architectural questions. Dumb questions. The questions I was too embarrassed to ask colleagues.

“What does SOLID actually stand for and why do people care?”

“Is this the ‘right’ way to structure this, or am I doing something weird?”

“I’m about to suggest X in this meeting. Is that a reasonable approach or am I missing something obvious?”

The AI didn’t judge. It didn’t give me a look. It just answered. And more often than not, the answer was: “Yes, that’s a standard approach” or “That’s called [pattern name], and here’s why it works.”

It turned out the secret knowledge wasn’t that secret. I’d been doing things the “right” way all along — I just didn’t know the names for them.

Filling Gaps That Weren’t Really Gaps

The thing about imposter syndrome is that it’s not about actual gaps in knowledge. It’s about perceived gaps. The fear that everyone else has a foundation you’re missing.

AI let me test that fear without anyone watching.

“Is it normal to not remember how to implement a binary search from scratch?”

Yes. Most engineers look it up.

“Should I know what a monad is?”

Only if you’re writing Haskell. Otherwise, don’t worry about it.

“Am I the only one who finds this codebase confusing?”

No. This codebase IS confusing. Here’s why.

Each answer chipped away at the mythology. The “real” engineers I’d been comparing myself to? They also Googled things. They also forgot syntax. They also found complex systems confusing.

The difference wasn’t knowledge. It was confidence.

“But That’s How I Feel All the Time”

A few months into working with AI daily, I was talking to my husband.

“I feel different,” I said. “I’m not scared to speak up anymore. I feel like I could build anything.”

He looked at me, genuinely confused.

“But… that’s how I feel all the time.”

Reader, I married a man who did a Computer Science degree. Who never published a paper. Who has less experience than me. And he walks around feeling like he can build anything, always has, and was baffled that I ever felt otherwise.

That’s the confidence gap in one conversation.

What Actually Changed

AI didn’t teach me anything I couldn’t have learned elsewhere. The information was always available — in books, in documentation, in colleagues’ heads.

What AI changed was the cost of accessing it.

Before: Every question was a confession of ignorance. Every Google search felt like evidence of my inadequacy. Asking a colleague meant admitting I didn’t know.

After: Questions cost nothing. I could fill perceived gaps instantly, privately, without judgment. I could validate my instincts before meetings instead of doubting them during.

The gaps weren’t real. But the fear of exposing them was. AI made the fear irrelevant.

The Irony

I have a PhD. I’ve published in peer-reviewed journals. I’ve given talks at security conferences. I work on systems that require genuine expertise in cryptography, privacy, and distributed systems.

And I needed an AI to convince me I wasn’t faking it.

That’s absurd. It’s also true.

The research calls it “stereotype threat” — when you’re aware of negative stereotypes about your group, you’re more likely to underperform or hold back. Women in technical fields. Non-traditional backgrounds in CS. The awareness itself becomes a weight.

AI didn’t remove the stereotypes. It just gave me a private space to build confidence without them.

What I’d Tell Younger Me

If you’re a woman in tech, or anyone with imposter syndrome, here’s what I’ve learned:

The secret knowledge doesn’t exist. The people who seem confident aren’t drawing from a deeper well of fundamentals. They’re just not questioning themselves as much.

Your instincts are probably right. If you’ve been shipping code and solving problems, you know more than you think. You just don’t trust it yet.

The cost of asking matters. If asking questions feels expensive — socially, emotionally, professionally — you’ll ask fewer questions. If you can reduce that cost, you’ll fill gaps faster and build confidence sooner.

AI is a judgment-free zone. Use it. Ask the dumb questions. Validate your instincts. Get the 2am reassurance that your approach is reasonable.

The Confidence of a Man

I used to think confidence was about knowledge. Know enough, and you’ll feel confident.

It’s not. Confidence is about permission. Permission to not know everything. Permission to figure it out as you go. Permission to trust your judgment even when you can’t name the design pattern you’re using.

Some people are handed that permission early. Others have to find it.

AI didn’t give me knowledge I was missing. It gave me permission I didn’t know I needed.

Now I speak up in architecture reviews. I propose approaches without disclaimers. I trust that my mathematical intuition is just as valid as someone else’s CS degree.

I feel like I can build anything.

Apparently, that’s how men feel all the time.

If this resonates, I’d love to hear your story. What gave you permission to trust yourself?

How AI Gave Me the Confidence of a Man was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Code Like a Girl

Deep dive into context engineering for AI agents

How to optimize context: a precious finite resource for AI agents♦Image by Hans-Jurgen Mager from Unsplash

We talk a lot about better models, larger context windows, and more capable agents. But most real-world failures don’t come from model capability — they come from how context is constructed, passed, and maintained.

This is a hard problem. The space is moving fast and techniques are still evolving. Much of it remains an experimental science and depends on the context (pun intended), constraints and environment you’re operating in.

In my work building multi-agent systems, a recurring pattern has emerged: performance is far less about how much context you give a model, and far more about how precisely you shape it.

This piece is an attempt to distill my learnings into something you can use.

It focuses on principles for managing context as a constrained resource — deciding what to include, what to exclude, and how to structure information so that agents remain coherent, efficient, and reliable over time.

Because at the end of the day, the strongest agents are not the ones that see the most. They are the ones that see the right things, in the right form, at the right time.
TerminologyContext engineering

Context engineering is the art of providing the right information, tools and format to an LLM for it to complete a task. Good context engineering means finding the smallest possible set of high signal tokens that give the LLM the highest probability of producing a good outcome.

In practice, good context engineering usually comes down to four moves. You offload information to external systems (context offloading) so the model does not need to carry everything in-band. You retrieve information dynamically instead of front-loading all of it (context retrieval). You isolate context so one subtask does not contaminate another (context isolation). And you reduce history when needed, but only in ways that preserve what the agent will still need later (context reduction).

A common failure mode on the other side is context pollution: the presence of too much unnecessary, conflicting or redundant information that it distracts the LLM.

Context rot

Context rot is a situation where an LLM’s performance degrades as the context window fills up, even if it is within the established limit. The LLM still has room to read more, but its reasoning starts to blur.

You would have noticed that the effective context window, where the model performs at high quality, is often much smaller than what the model technically is capable of.

There are two parts to this. First, a model does not maintain perfect recall across it’s entire context window. Information at the start and the end is more reliably recalled than things in the middle.

Second, larger context windows do not solve problems for enterprise systems. Enterprise data is effectively unbounded and frequently updated that even if the model could ingest everything, that would not mean it could maintain a coherent understanding over it.

Just like humans have a limited working memory capacity, every new token introduced to the LLM depletes this attention budget it has by some amount. The attention scarcity stems from architectural constraints in the transformer, where every token attends to every other token. This leads to a n² interaction pattern for n tokens. As the context grows, the model is forced to spread its attention thinner across more relationships.

Context compaction

Context compaction is the general answer to context rot.

When the model is nearing the limit of it’s context window, it summarises it’s contents and reinitiates a new context window with the previous summary. This is especially useful for long running tasks to allow the model to continue to work without too much performance degradation.

Recent work on context folding offers a different approach — agents actively manage their working context. An agent can branch off to handle a subtask and then fold it upon completion, collapsing the intermediate steps while retaining a concise summary of the outcome.

The difficulty, however, is not in summarising, but in deciding what survives. Some things should remain stable and nearly immutable, such as the objective of the task and hard constraints. Others can be safely discarded. The challenge is that the importance of information is often only revealed later.

Good compaction therefore needs to preserve facts that continue to constrain future actions: which approaches already failed, which files were created, which assumptions were invalidated, which handles can be revisited, and which uncertainties remain unresolved. Otherwise you get a neat, concise summary that reads well to a human and is useless to an agent.

Agent harness

A model is not an agent. The harness is what turns a model into one.

By harness, I mean everything around the model that decides how context is assembled and maintained: prompt serialization, tool routing, retry policies, the rules governing what is preserved between steps, and so on.

♦Drawn by author

Once you look at real agent systems this way, a lot of supposed “model failures” now look different. I’ve encountered many of such at work. These are actually harness failures: the agent forgot because nothing persisted the right state; it repeated work because the harness surfaced no durable artefact of prior failure; it chose the wrong tool because the harness overloaded the action space; and so on.

A good harness is, in some sense, a deterministic shell wrapped around a stochastic core. It makes the context legible, stable, and recoverable enough that the model can spend its limited reasoning budget on the task rather than on reconstructing its own state from a messy trace.

Communication between agents

As tasks get more complex, teams have defaulted towards multi-agent systems.

The mistake is to assume that more agents means more shared context. In practice, dumping a giant shared transcript into every sub-agent often creates exactly the opposite of specialisation. Now every agent is reading everything, inheriting everyone else’s mistakes, and paying the same context bill over and over again.

If only some context is shared, a new problem appears. What is considered authoritative when agents disagree? What remains local, and how are conflicts reconciled?

The way out is to treat communication not as shared memory, but as state transfer through well-defined interfaces.

For discrete tasks with clear inputs and outputs, agents should usually communicate through artefacts rather than raw traces. A web-search agent, for instance, does not need to pass along its entire browsing history. It only needs to surface the material that downstream agents can actually use.

This means that intermediate reasoning, failed attempts, and exploration traces stay private unless explicitly needed. What gets passed forward are distilled outputs: extracted facts, validated findings, or decisions that constrain the next step.

For more tightly coupled tasks, like a debugging agent where downstream reasoning genuinely depends on prior attempts, a limited form of trace sharing can be introduced. But this should be deliberate and scoped, not the default.

KV cache penalty

When AI models generate text, they often repeat many of the same calculations. KV caching is an inference time optimisation technique that speeds up this process by remembering important information from previous steps instead of recomputing everything again.

However, in multi-agent systems, if every agent shares the same context, you confuse the model with a ton of irrelevant details and pay a massive KV-cache penalty. Multiple agents working on the same task need to communicate with each other, but this should not be via sharing memory.

This is why agents should communicate through minimal, structured outputs in a controlled manner.

Keep the agent’s toolset small and relevant

Tool choice is a context problem disguised as a capability problem.

As an agent accumulates more tools, the action space gets harder to navigate. There is now a higher probability of the model going down the wrong action and taking an inefficient route.

This has consequences. Tool schemas need to be far more distinct than most people realise. Tools have to be well understood and have minimal overlap in functionality. It should be very clear on what their intended use is and have clear input parameters that are unambiguous.

One common failure mode that I noticed even in my team is that we tend to have very bloated sets of tools that are added over time. This leads to unclear decision making on which tools to use.

Agentic memory

This is a a technique where the agent regularly writes notes persisted to memory outside of the context window. These notes get pulled back into the context window at later times.

The hardest part is deciding what deserves promotion into memory. My rule of thumb is that durable memory should contain things that continue to constrain future reasoning: persistent preferences. Everything else should have a very high bar. Storing too much is just another route back to context pollution, only now you have made it persistent.

But memory without revision is a trap. Once agents persist notes across steps or sessions, they also need mechanisms for conflict resolution, deletion, and demotion. Otherwise long-term memory becomes a landfill of outdated beliefs.

To sum up

Context engineering is still evolving, and there is no single correct way to do it. Much of it remains empirical, shaped by the systems we build and the constraints we operate under.

Left unchecked, context grows, drifts, and eventually collapses under its own weight.

If well-managed, context becomes the difference between an agent that merely responds and one that can reason, adapt, and stay coherent across long and complex tasks.

Thank you for staying with me till the end, and I hope this was useful for you. Subscribe to my content to follow along my journey.

Deep dive into context engineering for AI agents was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Code Like a Girl

The Scheduling Boundaries Behind Responsive UI

This is the last article in a series on how JavaScript actually runs. You can read the full series here or on my website.♦

We now know how the event loop and rendering pipeline behave.

The browser:

  • Runs a macrotask to completion.
  • Drains all microtasks.
  • Executes any scheduled requestAnimationFrame callbacks.
  • Drains all microtasks.
  • Performs layout and paint to produce the next frame.
  • Moves on to the next macrotask.

Given that environment, how should we write UI code?

Long Tasks Block Everything

If you want the UI to stay responsive, your tasks must yield quickly.

Consider this:

button.addEventListener("click", () => {
const start = performance.now();

while (performance.now() - start < 3000) {
// busy loop for 3 seconds
}

console.log("done");
});

Once the button is clicked, the page becomes unresponsive. The click handler is a macrotask and nothing can interrupt it. Everything else has to wait: there is no re-rendering, no new input, no requestAnimationFrame callbacks.

Long-running tasks monopolize the main thread. While they run, rendering pauses, input waits, animations stall and timers are delayed. Responsive UI depends on cooperation.

Microtasks Do Not Yield to Rendering

Chaining promises look like a way to break work into pieces:

button.addEventListener("click", () => {
Promise.resolve()
.then(() => heavyWork())
.then(() => {
status.textContent = "Halfway...";
})
.then(() => moreHeavyWork())
.then(() => {
status.textContent = "Done";
});
});

However, each .then() callback becomes a microtask when its associated Promise resolves. Because the browser must drain the entire microtask queue before rendering, chaining Promises does not create render opportunities. As a result, the user sees nothing until “Done” shows up on screen.

If you want to let the browser render, you must introduce a scheduling boundary:

button.addEventListener("click", () => {
Promise.resolve()
.then(() => heavyWork())
.then(() => {
status.textContent = "Halfway...";

return new Promise(resolve => {
// setTimeout used to introduce a scheduling boundary
setTimeout(resolve, 0);
});
})
.then(() => heavyWork())
.then(() => {
status.textContent = "Done";
});
});

Alternatively, we can consider:

button.addEventListener("click", () => {
Promise.resolve()
.then(() => heavyWork()
.then(() => {
status.textContent = "Halfway...";

return new Promise(resolve => {
// requestAnimationFrame used to introduce a scheduling boundary
requestAnimationFrame(resolve);
});
})
.then(() => heavyWork()
.then(() => {
status.textContent = "Done";
});
});

Both approaches work because a .then() callback is only queued once its associated Promise resolves. By returning a Promise that resolves later, we delay when the next microtask is created. setTimeout yields to the next macrotask, while requestAnimationFrame yields to the next frame.

Choosing Between Promises, setTimeout and requestAnimationFrame

These mechanisms signal different intentions to the browser. They are not interchangeable.

Use a Promise when you need to continue work immediately after the current macrotask completes, but before the browser moves on. They are ideal for continuing work that logically depends on previous work. They help to preserve order, transform results and update state after completion. They are not a yielding mechanism.

Use setTimeout when you need to create a real scheduling gap. They are useful for breaking up long computation, deferring non-critical work and yielding cooperatively. They are general purpose yields.

Use requestAnimationFrame when you are performing visual updates. It is ideal for animations and layout-sensitive work.

♦Different scheduling APIs solve different coordination problems in the browser event loopAlign Visual Updates to Frames

Consider this approach:

document.addEventListener("mousemove", (event) => {
box.style.left = event.clientX + "px";
});

If the mouse fires 200 events per second, this code attempts 200 DOM updates per second. But on most displays, the refresh happens about 60 times per second. Visual work that exceeds that rate is simply wasted.

Instead, consider:

let latestX = 0;
let scheduled = false;

document.addEventListener("mousemove", (event) => {
latestX = event.clientX;

if (!scheduled) {
scheduled = true;

requestAnimationFrame(() => {
box.style.left = latestX + "px";
scheduled = false;
});
}
});

We use requestAnimationFrame to update at most once per frame, no matter the rate at which input can fire.

Respect the Frame Budget

requestAnimationFrame guarantees alignment to the frames but it does not guarantee smoothness. On a 60fps display, the browser has roughly 16ms per frames. That 16ms must include all JavaScript and rendering work.

If the JavaScript executed alone takes longer than that, the browser cannot complete rendering in time:

requestAnimationFrame(() => {
const start = performance.now();

while (performance.now() - start < 40) {
// 40ms of work
}
});

This callback runs before the browser renders but it blocks for 40ms and therefore exceeds the frame budget. Since the browser cannot display partial frames, if the 16ms window is missed, that frame is dropped. Instead of rendering at 60 frames per second, the browser renders less frequently: Animations can appear jerky, motion uneven and interactions delayed.

So while requestAnimationFrame helped with alignment, we must still finish the frame work within the frame window. Either work fits inside the budget or it is spread across multiple frames. For instance, this could mean animating in steps or deferring non-critical computation.

Responsive UI requires both correct scheduling and work that fits inside the budget.

Guard Against Stale Asynchronous Work

Asynchronous code creates delays. During this window, state can change:

function loadData() {
fetch("/data")
.then(response => response.json())
.then(data => {
render(data);
});
}

This looks harmless but imagine the user clicking twice quickly and loadData() is called twice in succession. If the second request finishes first, the first request would render stale data and the UI would then be incorrect.

One common pattern is to guard against outdated work:

let currentRequestId = 0;

function loadData() {
const id = ++currentRequestId;

fetch("/data")
.then(response => response.json())
.then(data => {
if (id !== currentRequestId) return;
render(data);
});
}

Now each request captures its own response and only the most recent request is allowed to update the UI.

Designing With the Browser, Not Against It

Responsive UI emerges from working within the browser’s execution model.

In practice, that often means:

  • Keeping tasks short so the browser can continue scheduling
  • Remembering that microtasks do not yield to rendering
  • Aligning visual updates to frame boundaries
  • Ensuring that work fits within the frame budget.
  • Verifying that delayed work is still relevant before applying it

I started this series because I had code that used Promises, setTimeout, and requestAnimationFrame. They all felt “asynchronous” and interchangeable. Turns out they weren’t.

Good UI code knows which scheduling boundary to use and when.

This article was originally published on my website.

The Scheduling Boundaries Behind Responsive UI was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Code Like a Girl

You are doing two jobs. You are only being evaluated on one.

Performance Frameworks that Recognize Invisible Second Shift in Tech

Continue reading on Code Like A Girl »


Code Like a Girl

5 Concepts Most Developers Mix Up in System Design

System Design Advanced #4 — Encoding, hashing, encryption, serialization, and compression explained simply

Continue reading on Code Like A Girl »


Code Like a Girl

Commit To Equal Employment Opportunity, and Other Actions for Allies

Better allyship starts here. Each week, Karen Catlin shares five simple actions to create a workplace where everyone can thrive.♦1. Commit to equal employment opportunity

Last week, the U.S. Equal Employment Opportunity Commission (EEOC) filed a discrimination lawsuit against the New York Times, alleging that the organization passed over a white man for a promotion in favor of a less qualified woman.

A spokesperson for the Times responded that race and gender did not factor into the decision and that they hired the most qualified candidate.

Former EEOC commissioner Chai Feldblum also weighed in, noting that many of the lawsuit’s allegations describe legal efforts to diversify a workforce. And that there is no proof the Times crossed the line into unlawful discrimination.

Feldblum added, “Thank goodness for all the employers who are still holding true to their moral compass, to their commitment to equal employment opportunity.”

If we serve on a hiring or promotion committee, let’s do the same.

Define the qualifications needed for the role. Determine how to evaluate candidates accordingly. Apply those standards consistently. And then select the most qualified person.

Share on Instagram, LinkedIn, or YouTube.

This week’s Better Allies content is sponsored by:

As our industry evolves, Femgineer is here to help you stand out as a technical leader who can communicate and influence — not just build. We do that through coaching, courses, and content. Visit femgineer.com and subscribe to our newsletter to learn more!

2. Rebuild psychological safety (when it’s been broken)

My friend Minette Norman and her coauthor Karolin Helbig are publishing their latest book, The Psychological Safety Playbook for Changemakers next week. I read an advanced copy (it’s fantastic) and asked Minette to summarize a section especially relevant to better allies. Here is what she shared:

Psychological safety is slow to build and quick to break. Even small breaches can trigger a deep sense of threat.

Neuroscience explains why: when psychological safety is disrupted, the brain reacts as if we’re in physical danger, flooding our system with stress hormones and launching us into fight–flight–freeze.

Repairing a rupture requires more than a sincere apology. It requires sustained, visible effort, including:

  • Recognition: Name the breach clearly and acknowledge its impact without justifying the behavior.
  • Responsibility: Take full accountability. Focus on impact, not intent: “I see how what I said hurt you.”
  • Remedy: Recommit through consistent, observable behavior. Words alone won’t rebuild trust.
  • Relationship Rebuilding: Create space for continued, honest conversation. Consistency is key.

Even with genuine commitment, it may take significant time before people feel safe to speak up again. There is no magic formula. However tempting it may be to declare that “this is a safe space,” people believe it’s safe only when they have seen consistent proof over time that when they speak up, ask a question, make a mistake, or offer a divergent viewpoint, they will not be embarrassed, marginalized, or punished.

3. Create inclusive social media posts

In honor of Global Accessibility Awareness Day on May 21, here are three simple things we can do to promote digital access and inclusion with our social media posts:

  • Limit emojis. Screen readers read emoji descriptions aloud. Ten “Smiling face with sunglasses” emojis in a row means someone hears “smiling face with sunglasses” repeated ten times. A good rule of thumb: no more than three emojis per post.
  • Describe photos, images, and videos. Alt text and image descriptions help people using screen readers understand visual content and participate more fully.
  • Avoid “fancy fonts” to create bold, italics, or other text treatments for emphasis. Special characters can be difficult for screen readers to interpret correctly.
4. Read banned books

I recently joked with my daughter that her twin babies already have an impressive library of banned books.

We’ve been reading titles like Antiracist Baby (by Ibram X. Kendi, illustrated by Ash Kwak Lukashevsky) and Dolls and Trucks Are for Everyone (by Robb Pearlman, illustrated by Eda Kaban).

It reminded me why banned books matter. They often explore histories, identities, and experiences that some people would rather ignore or erase.

As PEN America said last year, after the U.S. Naval Academy removed hundreds of books about racism, sexism, LGBTQ+ topics, the Holocaust, the Ku Klux Klan, and other subjects from their library:

“Books are not the enemy; ignorance is the enemy.”

(I should note that the Naval Academy reversed its decision after public outcry.)

Let’s keep reading broadly, especially books that challenge us, expand our perspective, or tell stories that have historically been marginalized.

5. Community spotlight: Avoid words that minimize harm

Sometimes the words we use can unintentionally minimize systemic harm.

Subscriber Joel Lesko told me that he uses Justice AI GPT, a tool that checks his posts, emails, and more for bias. He recently used it while drafting an article about attacks on DEI efforts.

The tool flagged terms like “bias” and “microaggressions,” prompting him to reflect on whether those words softened the seriousness of what he was describing. As Lesko explained:

“It prompted me to consider that language can make systemic problems sound like accidents or just interpersonal issues.”

He added,

“Deeper in the audit process, Justice AI brought up the two battles that DEI is waging — keeping the work legal and making sure the words we use to talk about DEI still tell the truth. It prompted me to consider if my language was a carrier of truth or a cover for harm and systemic damage.”

Thank you for sharing 🙏. It’s a timely reminder to choose words that accurately reflect the impact of what’s happening.

That’s all for this week. I’m glad you’re on this journey with me,

Karen Catlin (she/her), Author of the Better Allies® book series

Copyright © 2026 Karen Catlin. All rights reserved.

Together, we can make a difference with the Better Allies® approach.

  • Say thanks to Karen and buy her a coffee (Need a receipt for educational reimbursement? Reply to this email, and we’ll take care of it.)
  • Sponsor an edition of this newsletter
  • Follow @BetterAllies on Instagram, Medium, or YouTube. Or follow Karen Catlin on LinkedIn
  • Read the Better Allies books
  • Tell someone about these resources
♦♦

Commit To Equal Employment Opportunity, and Other Actions for Allies was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Children and Youth Planning Table of Waterloo Region

Adan Imran Portrait

The post Adan Imran Portrait appeared first on Children and Youth Planning Table.


Code Like a Girl

Her Edge: The Job Search Playbook You Learned Doesn’t Work Anymore

Most people in tech have only searched for jobs in a hot market. Here’s the playbook for when it’s not.

Excerpt from my paid Substack column, Her Edge. Read the full post here.

If you’ve sent out dozens of applications and heard nothing, that’s not a reflection of your worth or your skills. The game just changed, and nobody told you.

If you entered tech after 2007, you’ve mostly job-searched in a market that was working in your favor. For fifteen years, almost any approach to getting a job worked.

Then 2022 happened. And it’s only gotten harder since.

I know what this feels like. I graduated into the last market that was this bad.

It was 2003.

Five Guys and a Co-op (No, not those 5 guys)

I was finishing my Master’s degree in Cryptography and planning a wedding.

My wedding!

To my lovely husband of 22 years now, Gareth. We met in the very first week of our Master’s program in September 2002 at the University of Waterloo. He was also a mathie.

He was from New Zealand, on a student visa that would run out eight months after our wedding. To sponsor him for Canadian permanent residency, I needed to prove I could financially support us both.

To do that, I needed a job.

The only problem was that the job market had completely fallen apart.

The dot-com bubble had burst three years earlier, and by late 2003, the tech sector was still at rock bottom. The workforce had shrunk 17.8% from its peak.

My background was narrow. I had an undergraduate degree in Math with some CS courses. Three co-op terms as a security software developer at the Communications Security Establishment, Canada’s version of the NSA, and a Master’s in cryptography from the University of Waterloo.

That’s not the typical resume for a Software Developer. I needed a security role, and in that market, finding one felt almost impossible.

I applied to every job I could find online. I got crickets.

I’d originally planned to work at the CSE after graduation. Top secret work doing leading-edge crypto and cybersecurity work.

It’s why I got a master’s degree in the first place. But those positions were all in Ottawa, and Gareth still had eight months left of his degree at UW.

Ottawa wasn’t an option anymore.

So there I was. No job. A wedding in December. And a husband-to-be, whose legal right to stay in Canada depended on me figuring it out.

That summer, my supervisor had suggested I attend a small cryptography conference hosted on campus. At the conference, I met five guys who worked at a company called Research In Motion (RIM). The company that created the BlackBerry and would eventually change its name to match.

In Waterloo, RIM was already a hot employer. The place everyone wanted to get into. Outside of Waterloo, almost nobody had heard of it yet.

These guys worked on a team called CryptoDev, responsible for all cybersecurity programming on the BlackBerry device and its backend servers.

At the conference dinner, they invited me to sit at their table.

What happened at that dinner was one of the strangest things I had ever seen.

All five of them sat there with their heads down, looking at their BlackBerries and typing. The entire meal! Not talking. Not conversing. Just typing.

I didn’t even own a cell phone yet. It would be like a time traveler from 1990 sitting at our dinner tables today.

Normal now. Bizarre then.

I also met a UW co-op student working with CryptoDev that night. We chatted, the conference ended, and I went back to school and kept working on my Master’s thesis. They went back to RIM.

By October, I was applying to jobs in a panic. RIM had done major layoffs in late 2002 and had a hiring freeze all of 2003. I applied to their site anyway.

I went to job fairs and handed in my resume. Nothing. Not even an acknowledgment.

November arrived. Gareth and I were getting married on December 27th. I was running out of time.

♦Cartoon version of me and the co-op student generated with ChatGPT.

Then one day, I was walking to school and ran into the co-op from the conference in a parking lot. He asked how things were going.

I told him the truth.

I had been applying everywhere and hearing nothing. I was getting married in weeks. My future husband wasn’t a Canadian citizen, and I needed a job to sponsor him.

He said:

“Why don’t you email me your resume? I’ll forward it to my boss. I don’t know if there are any openings on the team, but he’s a good guy and he’s always looking for talented people.”

That was the whole conversation. A few minutes in a parking lot in November 2003.

A week later, I entered the RIM buildings for an interview. It went well and a few weeks later, the call came. They were offering me a position.

The salary they quoted was $62,000.

That was the only time in my career I did not negotiate. Not even a little. I simply said yes.

I was a grad student who had never made more than $20,000 a year. When someone offers a number like that, your jaw drops and your brain stops working.

I got married Dec 27, 2003, and started at RIM on January 10th, 2004. I was one of the first people hired after their major freeze lifted, and I worked there for eight years.

The year I started, we celebrated selling one million BlackBerrys. Our Christmas party had the slogan: 2 million thumbs can’t be wrong. By the time I left, over 80 million people were using BlackBerries. My code lived on every one of them.

But here’s the part I want to stay with.

I had already applied to RIM. Nothing happened. What opened the door was a conversation at a conference dinner and five minutes in a parking lot with someone willing to say my name to the right person.

The market heated up after that. But I kept using the same approach because it worked in a hot market, too.

They Came Looking

I didn’t find my second job. It found me.

A recruiter was actively poaching people from RIM. They found me on LinkedIn. I had kept my profile current with my title, my work, and my skills all up to date. That’s why they called.

A lot of people only updated LinkedIN when they are thinking of moving on to a new job. Every year, I would take a look at mine and update it. It paid off.

Sadly, the job wasn’t a good fit. Within ten months, I knew I needed to move on. That’s a story for another day — a juicy one — but not for today.

But the lesson stayed with me: be findable. Keep your profile current. You never know who is looking.

An Old Connection

In the spring of 2012, I started looking. I applied online for a development manager position at a local company called D2L and heard nothing for two weeks.

So I went to LinkedIn to see if I knew anyone at D2L.

I did. There was a director there that I had worked with at BlackBerry.

I sent him a message:

“Hey, I’ve applied to this dev manager position. I don’t know if you know the hiring manager, but I was wondering if you’d be willing to put in a good word.”

He walked over to the hiring manager’s desk that same day and said:

“Dinah Davis applied for the dev manager job. I worked with her at BlackBerry. She’s really good. You should give her an interview.”

That’s all he did. He got me my foot in the door. I did the rest. The interviews went so well that in the end, two directors were fighting over which one would get me.

I spent two and a half years at D2L and was promoted to Senior Manager while there. But I could see the glass ceiling from where I was standing.

So I started quietly looking.

I Told Her I Wanted Her Job

I was clear about one thing: I would only leave for a director title or above. I liked my teams. I just couldn’t see a future where the promotion was coming on any timeline that made sense to me.

I also knew what I was looking for.

I had watched BlackBerry grow from under a million users to hundreds of millions in eight years. I contributed to that, even if in a small way. I wanted to do it again, but this time in a more influential seat.

So I built a pitch around it. Specific and honest. And I started going to local events and telling people exactly what I was looking for.

Not just “I’m looking for a new job.”

Something much more specific than that. My pitch was:

“I’m looking for a company just coming out of startup chaos. One that needs someone to build the scaffolding to grow and scale software teams.
I build software teams that are happy, high-performing, and focused. I remove the chaos. I protect their time. My teams at BlackBerry were the top teams. My teams at D2L are the top teams.
That’s what I do and I’m looking to do it again.”

My network connected me with three companies. All three had something like the role I was describing.

One was a cybersecurity company I was genuinely interested in. But it became clear through the process that they weren’t going to give me anything above manager.

I passed.

The second was Thalmic Labs, one of the hottest companies in Waterloo at the time. They wanted a director of engineering for a secret project they couldn’t tell me about.

I interviewed.

The third was Arctic Wolf.

The same week I started looking, I was volunteering at a Think About Math event for Grade 9 girls, the same event where Code Like a Girl was born. We sat at tables with posters behind us listing our job titles and what we did. Small groups of girls rotated through to talk to us.

Across the room, I noticed a poster that said VP of R&D.

Before the end of the night, I walked over and introduced myself to the woman sitting in front of it. Her name was Kim Tremblay. I told her I wanted to do her job someday and asked if she’d have lunch with me.

She said yes, and we set up a time. Then a snowstorm hit, and our first lunch got canceled. We pushed it back two weeks.

The day of the rescheduled lunch, one hour before I was supposed to meet Kim, my CTO pulled me into a room and told me I would not be getting the director role I had been working toward. In front of my product manager.

I wasn’t entirely surprised. I had felt the ceiling for a while. It’s why I started looking for a new role. But hearing it out loud, in that room, in front of a colleague, made it real.

I was so frustrated and hurt that he would do that in front of my product manager.

I walked into that lunch and told Kim everything. What had just happened. What I was looking for. And why I was ready.

About halfway through, she stopped me and said.

“You should come work for me.”

I thought she was joking. Little did I know that Kim does not joke. Not about things like this. She looked at me and said:

“I’m serious. I need a dev manager to help me grow and scale. You want a director title? I have no problem giving you that. Our CEO is actually in town this week. Come meet him.”

A week later, I had two offers in my hands. One each from Arctic Wolf and Thalmic Labs.

Thalmic had more local name recognition and momentum; they were doing cool things. The downside was that it was run by three twenty-something guys in their first company. Great guys, but they didn’t have a lot of previous experience running a company.

No one I knew had even heard of Arctic Wolf. The whole company was only 35 people.

But it had two seasoned and previously successful entrepreneurs. Arctic Wolf offered me more stock and 50% more salary. On top of that, Kim told me her goal was to retire in two or three years, and then I’d be taking over for her. Finally, it would allow me to go back to my roots, back to cybersecurity.

That wasn’t a hard decision. I chose Arctic Wolf.

It turned out to be the right one.

Arctic Wolf hit unicorn status in 2020. When I left in 2023, the company was valued at four billion dollars. The sale of my privately held stocks allowed me to retire and work on Code Like a Girl full-time.

Four corporate jobs. Four different doors.

Every one of them opened by staying visible, staying connected, and knowing what I was looking for.

Why I’m Sharing this with You Now

I’ve been thinking about all of this lately because of the women I’m mentoring right now. Many of them are weighing whether to stay or go. Some have been waiting years for promotions that aren’t coming. They’re qualified. They’re ready. And they’re watching a job market that has made moving feel terrifying.

They’re not wrong to be scared.

In 2025, 245,953 tech workers were laid off. So far in 2026, another 121,111 have already been cut. That’s 961 people a day, and the year has barely started.

Tech job postings in the U.S. are down 36% from February 2020 and recent CS grads are facing 6.1% unemployment, more than double the overall rate.

Last week, even Arctic Wolf laid off 250 people. This week, I posted on LinkedIn asking if anyone was hiring. Within four hours, eleven employers had reached out looking for talent. The network works both ways.

One of the 250 people laid off from Arctic Wolf last week is a friend of mine. A few days later, I heard he already had a verbal offer and four interviews in progress.

He hadn’t applied for a single job.

That’s the network working in real time.

This is not the hot market of 2021. This feels a lot like 2003. And in 2003, applying online was about as effective as shouting into the void. Employers are struggling too. They’re drowning in applications and don’t know where to look.

That’s why networking is so powerful. Both ways.

What worked then still works now.

To read more about the framework I used and how you can use it too follow the link below.

Her Edge: The Job Search Playbook You Learned Doesn't Work Anymore

Her Edge: The Job Search Playbook You Learned Doesn’t Work Anymore was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Agilicus

De-Risking Operational Technology: 5 Security Investments That Deliver Disproportionate Returns

-/-

James Davis Nicoll

Owe My Soul / The Last Contract of Isako By Fonda Lee

Fonda Lee’s 2026 The Last Contract of Isako is a stand-alone science fiction dystopia.

Isthmus Isako is an atier (think samurai). Isako is primarily a bodyguard, but her duties also include informing soon-to-be former Astrocom employees that their positions are terminated. Why assign this duty to an armed killer? Because on the barely habitable planet of Aquilo, job termination and personal termination are the same thing.

Since Astrocom just lost its infra-corporate battle with SatOps, job termination may soon be personally relevant to Isako.

Code Like a Girl

The Progesterone Tax: The Invisible Cost of Being Productive as a Woman

Why our ambition seems to “disappear” every 28 days, and the psychological price we pay for trying to remain consistent.♦The masquerade of consistency: Living in a body that moves like a tide inside a world built for machines. (Image generated by the author using Google Gemini)

Last Tuesday, I was convinced I could rebuild my entire life before the end of the year.

I answered emails before breakfast. I cleaned my apartment while listening to a podcast about discipline. I replied to messages immediately. My future felt organized, expandable, almost obedient to effort. I even opened a blank Notion page titled “The Next Version of Me” with the kind of optimism usually reserved for people who have never experienced burnout.

Three days later, I stood in my kitchen staring at a sink full of dishes and felt an almost irrational urge to cry.

Nothing catastrophic had happened.

No tragedy. No crisis. No dramatic life event.

Just a body quietly changing its chemistry.

That is the part nobody prepares women for — not the period itself, but the psychological whiplash of becoming unfamiliar to yourself every few weeks. One version of you is articulate, ambitious, socially resilient. Another version struggles to answer a text message that simply says, “Hey, are you free to talk?”

And because we live in a culture obsessed with consistency, women are trained to interpret this shift as a personality defect rather than a biological rhythm.

You must be lazy now.

Undisciplined.

Too emotional.

Not mentally strong enough.

I used to believe ambition was a fixed trait, something permanently wired into the architecture of personality.

Now it feels more like a subscription service my body renews — or quietly suspends — every twenty-eight days.

♦Ambition isn’t a fixed trait; it’s a subscription service that biology sometimes quietly suspends. (Image generated by the author using Google Gemini)

The strange thing is that the ambition itself does not fully disappear. The dreams remain intact. The goals still matter. You still care about your work, your future, your relationships. But suddenly everything feels farther away, as though someone inserted glass between you and your own momentum.

Replying to one email feels like dragging furniture uphill.

A simple “Can we chat?” notification lands in your nervous system like a threat.

You reread messages three times before answering because your brain suddenly feels padded with cotton.

And perhaps the most isolating part is that outwardly, you still look functional.

You go to work.

You attend meetings.

You smile politely during conversations while internally feeling as though your battery has been stuck at 12% for days.

People assume you are fine because you are still performing fine.

But performance and ease are not the same thing.

The dangerous myth of “consistent women”

I think this is why so many women quietly believe they are inconsistent people. We keep comparing ourselves to previous versions of ourselves without realizing those versions existed under completely different hormonal conditions.

One week, you were clearing an inbox of fifty emails before lunch. This week, you are staring at one unanswered notification as though someone asked you to solve a hostage negotiation before coffee.

The shift feels absurd until you understand that hormones are not just reproductive chemicals. They are neurological instructions.

They affect sleep, emotional regulation, memory, stress tolerance, motivation, and the way the brain processes reward itself. During the first half of the menstrual cycle, rising estrogen often creates a sense of cognitive expansion. Many women describe feeling sharper, quicker, more optimistic, more socially capable. Thoughts connect faster. Decisions feel easier. The future appears manageable.

Then ovulation passes.

Progesterone rises.

And for some women, it feels like the internal operating system suddenly switches into low-power mode.

Not enough to stop functioning entirely. Just enough to make every ordinary task feel emotionally overclocked.

We are trying to run extraordinarily sophisticated biological software on social systems designed around uninterrupted output and twenty-four-hour resets. Eventually the server overheats. The crash is not evidence of weakness. It is feedback.

But modern life does not leave much room for biological nuance.

We are taught to romanticize endurance instead.

To push through exhaustion.

To remain pleasant while depleted.

To continue nurturing, producing, responding, organizing, soothing, smiling.

Even our language around burnout sounds suspiciously moral. We call ourselves lazy when we cannot maintain impossible levels of output. We call ourselves dramatic for reacting honestly to chronic exhaustion. We accuse ourselves of failing at adulthood because the body eventually asks for recovery.

And women become frighteningly good at disguising this collapse.

We attend meetings, pack lunches, answer Slack notifications, and maintain relationships with a practiced smile, all while progesterone quietly dims the lights inside the nervous system. Technically, we are still productive. But internally, many of us are performing a high-stakes masquerade no one explicitly requested, yet everyone somehow expects.

♦The luteal phase doesn’t lower your intelligence — it lowers your tolerance for the performative. (Image generated by the author using Google Gemini)PMS is not always irrationality — sometimes it is honesty

The most misunderstood part of this experience is what happens emotionally during the luteal phase.

People often reduce PMS to mood swings or irritability, as though women temporarily lose contact with reality every month. But I no longer think that explanation is entirely true.

I think progesterone lowers tolerance before it lowers intelligence.

· Tolerance for noise.

· Tolerance for emotional labor.

· Tolerance for pretending everything is fine.

Tiny injustices suddenly become unbearable. Relationship imbalances you previously brushed aside begin flashing like error messages in your brain. You notice how often you are the one remembering birthdays, initiating conversations, soothing conflict, absorbing stress, managing emotions — your own and everyone else’s.

The resentment does not appear out of nowhere.

It was already there.

Your nervous system just loses the energy required to keep editing it into something socially acceptable.

That realization changed the way I think about PMS entirely.

What if the body is not manufacturing false emotions? What if it is simply removing the anesthetic?

Because many women are not emotionally unstable during this phase.

We are emotionally unmasked.

And there is a difference.

A woman who suddenly feels overwhelmed by unequal emotional labor is not necessarily irrational. She may simply be too depleted to continue romanticizing her exhaustion. A woman questioning her career, relationship, or lifestyle right before her period may not be “crazy.” She may temporarily lose access to the adrenaline that usually helps her tolerate situations that quietly hurt her.

That possibility makes people uncomfortable because it reframes hormones entirely. It suggests the issue is not always female fragility. Sometimes the issue is the amount of silent adaptation women perform every single day just to keep social life running smoothly.

The internet made women feel broken for being human

Social media only sharpens this pressure. Everywhere online, women are surrounded by highly curated performances of optimization — morning routines, productivity hacks, color-coded schedules, “that girl” aesthetics, endless encouragement to become better, faster, more disciplined versions of ourselves.

Meanwhile, some of us are sitting on the bathroom floor at 9 p.m. trying to understand why answering one email suddenly feels emotionally catastrophic.

The gap between those realities creates shame.

Especially because women are often comparing themselves not just to strangers online, but to earlier versions of themselves from entirely different hormonal phases.

One version feels magnetic.

Another feels fragile.

One can conquer the world before noon.

Another wants silence, carbohydrates, and emotional invisibility.

Both are real.

That may be the most important thing women need to hear.

The exhausted version of you is not fake.

The softer version is not broken.

The version that suddenly needs rest is not failing some invisible moral test.

Maybe ambition was never supposed to feel identical every day. Maybe the body was never designed for permanent acceleration. And maybe the real “Progesterone Tax” is not the hormone itself, but the psychological cost of living in a world that demands uninterrupted performance from people whose biology has always spoken in cycles.

The Progesterone Tax: The Invisible Cost of Being Productive as a Woman was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Cordial Catholic, K Albert Little

This Book By C.S. Lewis Makes Catholic Converts (w/ Dr. Andrew Swafford)

-/-

Brickhouse Guitars

Bouchereau Mistral C12 #342 Demo by Roger Schmidt

-/-

Elmira Advocate

GOVERNMENT INCOMPETENCE DOES NOT ALWAYS EQUAL CORRUPTION

 

Unfortunately though it does make many citizens believe that government corruption is a normal thing. Is our provincial Conservative government inherently corrupt? I'm going to be nice today and suggest that ideological stupidity combined with zero sense of history may be driving Doug Ford's most recent attempts to make his corporate sponsers greener. By greener I am not suggesting that Ford's government love the environment nearly as much as they love money and Ford by trying to make them "greener" is trying to make them wealthier at the public's expense. There is absolutely no attempt here to actually make, develop or improve upon a product. It's simply yet one more way to legally transfer wealth to those already expert at sucking at the government's udders. 

The Opinion Page in today's Record has an excellent article by Joel Bakan and Jim Standford titled "Was nothing learned from Walkerton" The straightforward answer is indeed NOTHING ! Below that article is one by Susan Koswan both reiterating recent posts of mine here but also adding information concerning pollutants in our Grand River. She also comments on how the Region of Waterloo were mishandling our water supply back in 1992 and none other than Dr. John Cherry so advised them of that fact.

We as citizens have been far too complacent and we've already paid too high of a price for that complacency. For the love of all that's holy why doesn't Doug Ford get his Conservative back up about the federal government's ongoing attacks against honest citizens including threats of criminalization? Other provinces have done so and while Doug's environmental failures will cost him votes he could recoup many if he took similar steps to those of Saskatchewan, Alberta and Newfoundland who will not allow our federal government to steal lawful property and criminalize honest citizens who have followed firearms laws and rules for decades. 


Code Like a Girl

I Let Claude Code Refactor 3,000 Lines of Legacy Java…

Nobody Warned Me It Would Find Things I Was Not Ready to See…

Continue reading on Code Like A Girl »


Aquanty

CWRA SK Branch Webinar: Advancing Water Intelligence: Real-Time Forecasting and Data Integration with HydroClimateSight and Canada1Water

We’re pleased to share the recording of the recent CWRA Saskatchewan Branch webinar, Advancing Water Intelligence: Real-Time Forecasting and Data Integration with HydroClimateSight and Canada1Water. Presented by Jag Phagura of Aquanty Inc., this session explores how integrated forecasting tools and national-scale datasets are helping improve modern water resource management across Canada.

The webinar highlights how HydroClimateSight supports real-time and forecasted streamflow analysis to improve decision-making during floods, droughts, and seasonal transitions, while Canada1Water provides a centralized platform for discovering and accessing water datasets to support collaboration, planning, and long-term water intelligence initiatives.

Key Highlights:

  • Learn how HydroClimateSight supports real-time hydrologic forecasting and situational awareness.

  • Explore how forecasted streamflow insights improve decision-making during extreme events and seasonal variability.

  • Discover how Canada1Water enables streamlined access to national-scale water datasets across Canada.

  • See how integrated forecasting and data platforms support modern water management workflows and collaboration.

This session is especially valuable for watershed managers, conservation authorities, researchers, and water resource professionals seeking tools that enhance forecasting confidence and improve access to integrated hydrologic information.

Watch the recording now to learn how HydroClimateSight and Canada1Water are advancing water intelligence and supporting more informed water management decisions.

Watch The Recording


Greater Kitchener Waterloo Chamber of Comerce

2026 Spring Economic Update: What does it mean for local businesses?

The federal government released its Spring Economic Update on April 28, 2026, outlining a series of fiscal and policy measures aimed at strengthening Canada’s economic outlook and supporting long-term competitiveness. Coming at a time of continued uncertainty in global trade and domestic affordability pressures, the update signals a cautiously improved fiscal position, with a reduced deficit and targeted investments in skills, housing, innovation, and community infrastructure.

The Greater Kitchener Waterloo Chamber of Commerce is sharing this summary to help members understand the key announcements and what they may mean for employers across Waterloo Region, particularly as businesses continue to navigate labour shortages, housing constraints, and evolving regulatory and trade environments.

Canada Strong For All

As the Carney Government delivered their Spring Economic Update in the legislature on Tuesday, it was much more upbeat than predicted. The top line is that there have been reductions to the budget deficit bringing it down to $66.9 Billion (Down by over $10B from $78.3 Billion). Finance Minister François-Philippe Champagne also said that Canada has narrowly avoided a recession.

The economic update which has flipped in annual cycle because of the new fall budgets also came with some new spending aimed at keeping Canada Strong.

Key initiatives include:

Canada’s Own Sovereign Wealth Fund – Canada Strong Fund

  • This $25B fund will allow the government to choose winners to invest in strategic Canadian projects and companies.
  • Canadians will have the opportunity to invest and share in the returns.

$6B for the Skilled Trades

  • There are several initiatives here aimed at recruiting trades people and helping them through their apprenticeship.  The initiatives will help cover the wages of pre apprentices, providing wage incentives for hiring first year apprentices, completion bonuses, EI top ups when in school and enhanced tax credits.

Making education more affordable

  • Extend for the 2026-27 academic year the increases to Canada Student Grants and interest-free Canada Student Loans—571,000 students are expected to benefit from the increase to non-repayable grants, and 422,000 students could benefit from the weekly loan limit increase.

Encouraging shared ownership

  • Making the Employee Ownership Trust tax exemption permanent will help more workers share in the success of the businesses they help build.

Making Life More Affordable & Increasing Housing Supply

  • Cutting Red Tape to Build Faster
  • Streamlining regulations and modernizing building codes to accelerate construction, including factory‑built, modular, and panelized housing.

Regulatory Modernization & Innovation ($41.9M over 5 years, starting 2026‑27)

Funding for the National Research Council, Standards Council of Canada, and ISED to:

  • Modernize National Model Codes and reduce regulatory friction (e.g., eliminating duplicative inspections, introducing performance‑based approvals, improving code interpretation consistency).
  • Support innovation and productivity in homebuilding, including faster approvals for prefabricated products and more flexible building options (e.g., engineered wood).
  • Improve housing data collection, tracking, and sharing to enhance market responsiveness.

Additional Housing Measures

  • Accelerating over $7 billion in low‑cost financing through CMHC’s Apartment Construction Loan Program to support construction of up to 16,500 new rental homes.
  • Extension of the Unsheltered Homelessness and Encampments Initiative with $125 million in 2026‑27 to support those most in need.

Building Stronger and Safer Communities

  • Investing in Sport and Community Infrastructure
  • $755 million over five years (starting 2026‑27) and $118 million ongoing to strengthen Canada’s sport system:
    • $50M to attract world‑class sporting events with long‑term community legacies.
    • $45M + $8M ongoing to support high‑performance athletes, including mental health and safe sport measures.
    • $660M + $110M ongoing to increase participation through National Sport Organizations and better utilization of community infrastructure.

Community Safety and Inclusion

  • 9M more for FINTRAC to help fight extortion.  It looks like more money just for the organization, but it does call out that it is for detection, deterrence and disruption of the illicit financing that supports extortion and perpetuates fentanyl trafficking in Canada and to advance a technology and AI roadmap.
  • To help address rising hate-related crimes, the Spring Economic Update 2026 proposes to provide $75 million over five years, starting in 2026-27, to Public Safety Canada for the Canada Community Security Program. This additional funding will allow the program to continue to help eligible organizations implement physical security enhancements and foster safer, more inclusive communities.

Despite the stronger financial footing, early feedback from economic focused organizations and municipalities has been mixed, with some noting the government may have missed the mark in certain priority areas, while others, particularly in labour and construction sectors, have welcomed the significant investments in skilled trades. Overall, the Spring Economic Update reflects ongoing debate about where federal investments should be most effectively directed to support economic growth and productivity. As always, the impact of these measures will depend on how they are implemented and how quickly they translate into tangible benefits for employers, workers, and communities.

The Greater Kitchener Waterloo Chamber of Commerce will continue to support our members through advocacy with all levels of government to assist Waterloo Region employers in maintaining and expanding their operations in the face of evolving economic conditions and trade measures impacting southwestern Ontario. We will continue to ensure that relevant updates and information are shared with members as they become available.

The post 2026 Spring Economic Update: What does it mean for local businesses? appeared first on Greater KW Chamber of Commerce.


KW Predatory Volley Ball

Congratulations Kimberlee Nicholson. St. Clair College Commit

Read full story for latest details.

Tag(s): Home

Code Like a Girl

Drawing Text & Emoji in Win32

C++ A Complete Beginner’s Guide

Continue reading on Code Like A Girl »


Code Like a Girl

Is Everyone Really This Productive?

Software and the City — Episode 2

Continue reading on Code Like A Girl »


James Davis Nicoll

All Jump In / Unquenchable Fire (Unquenchable Fire, volume 1) By Rachel Pollack

1988’s Unquenchable Fire is the first of Rachel Pollack’s Unquenchable Fire modern occult series.

The Founders’ Revolution overthrew the bad old order [1], replacing it with the modern illumination. Magic has been returned to the world — or possibly, the magic that was there all along is now visible again. While there are one or two drawbacks (curses, possession, that sort of thing) the Spiritual Development Agency is standing by to set matters back on course.

None of which is of any particular use to Poughkeepsie resident Jennifer Mazdan. Arguably, it makes her life worse.


KW Music Productions

Audition Call for RENT

♦ No Day but Today!

K-W Musical Productions (KWMP) invites you to audition for our upcoming production of RENT. Join us as we transform the Conrad Centre for the Performing Arts into New York City’s East Village, following a year in the lives of seven artists and friends struggling to pursue their dreams while grappling with addiction, illness, and the soaring cost of staying true to themselves.

Where: Conrad Centre for the Performing Arts (36 King St. W., Kitchener)

Performances: December 3–12, 2026

KWMP welcomes adult performers (19 years +) to be part of this production.

KWMP’s community is enriched by diversity and inclusion. We recognize that every person brings a unique perspective and experience. When individuals feel respected, included, and fully welcomed to participate; our community becomes more inspired, innovative, and fulfilled — creating greater art. 

KWMP is committed to increasing equal opportunity, diversity and a future of inclusivity.  We welcome and encourage persons of any identity, orientation, and ability to audition.

It’s a ‘Season of Love’

One of our fellow community theatre companies, K-W Little Theatre (KWLT), is also mounting a production of RENT at the same time as ours. This was an unfortunate situation where both companies were granted rights for the same show at the same time. We had both undertaken extensive planning and had committed financially, by the time we became aware of the conflict, and we were simply too far down the road to change direction.

RENT, at its core, is a musical about community, and we are committed to working with KWLT to ensure that we honour that vision. Our hope is to work cooperatively with KWLT and are confident that when we work together, the synergies of both our productions can amplify the “Season of Love” in our community.

Audition Details

Audition Dates: June 8–10, 2026; 6-9 pm (may be extended if needed)

Callback Dates: Sunday, June 14, 2026; 2–5 pm

Location: KWMP Arts Centre, 14 Shaftsbury Drive, Kitchener

KWMP is holding in-person auditions for adult performers 19+.

What you need for your audition:

  • Your completed Audition Google form. 
  • Book your audition slot Here.
  • Attach a recent photo or headshot (with your name as the file name) to the Audition form.
  • OPTIONAL: Attach a theatre resume (with your name as the file name) to the Audition form.
  • Up to 2 minutes of a contemporary musical theatre or pop/rock song 
  • Sheet music or a backing track. 

For the full audition details, including a cast of characters, performance dates, rehearsal dates, audition panel and more, please see our full Audition Call Sheet.

View Full Audition Call

Fill Out Audition Form

Book Audition Time Need Help or Have Questions?

If you have any questions or concerns at any time during the audition process, please contact auditions@kwmp.ca

RENT

Book, Music and Lyrics by Jonathan Larson

Musical Arrangements, Original Concept/Additional Lyrics by Steve Skinner and Billy Aronson
Music Supervision and Additional Arrangements by Tim Weil
Dramaturgy by Lynn Thomson

Originally produced in New York by New York Theatre Workshop and on Broadway by Jeffrey Seller, Kevin McCollum, Allan S. Gordon, and New York Theatre Workshop.

Is presented through special arrangement with Music Theatre International (MTI). All authorized performance materials are also supplied by MTI. 
www.mtishows.com 

 

The post Audition Call for RENT appeared first on K-W Musical Productions.


Brickhouse Guitars

A Visit to Boucherau Guitars (Loic Bortot)

-/-

Code Like a Girl

10 Books That’ll Actually Make You Better at Building Stuff (Not Just Feel Smart)

Most “must-read” lists are garbage. Here are the books that changed how I write code, design systems, and ship products.

Continue reading on Code Like A Girl »


The Backing Bookworm

Christine Falls


I grabbed the audio format of this book after chatting with a library staffer at the central branch of the Dublin Public Library. Chosen as their community read, I thought it would be a nice listen when I returned home from my trip.
Right away I loved the dark atmosphere which only got better from Timothy Dalton's narration. Eerie, a bit sinister and set in 1950's Dublin, the story centres around Dr. Garret Quirke, a grumpy morgue pathologist who catches his brother-in-law Malachy meddling with the files of a recently deceased woman, Christine Falls. This pulls Quirke (and the reader) into a mystery of the young woman's death.
Initially, I loved Quirke's character and how the story began to unfold. This was atmospheric with a capital A! But this is the sloooowest of slow burn reads (definitely not my jam) and when you add in a lot of page time devoted to Quirke's backstory, things become convoluted with a lot of characters and how they're all connected to each other. Honestly, Quirke's 'quirks' (namely his curmudgeonly demeanor and regular inebriation) felt like they overshadowed what I had hoped to be, a competent sleuth. Perhaps his skills will be seen in future books?
Final Thoughts: Loved the 1950's Dublin setting and the eerie vibe but wanted more mystery and less family/character dysfunction.

My Rating: 3 starsAuthor: John Banville (aka Benjamin Black)Genre: Suspense, HistoricalSeries: Quirke 1Type and Source: eAudio from public libraryNarrator: Timothy DaltonRun Time: Publisher: Macmillan AudioFirst Published: Jan 1, 2006Read: 

Book Description from GoodReads: It's not the dead that seem strange to Quirke. It's the living. One night, after a few drinks at an office party, Quirke shuffles down into the morgue where he works and finds his brother-in-law, Malachy, altering a file he has no business even reading. Odd enough in itself to find Malachy there, but the next morning, when the haze has lifted, it looks an awful lot like his brother-in-law, the esteemed doctor, was in fact tampering with a corpse, and concealing the cause of death.It turns out the body belonged to a young woman named Christine Falls. And as Quirke reluctantly presses on toward the true facts behind her death, he comes up against some insidious and very well-guarded secrets of Dublin's high Catholic society, including members of his own family.

Set in Dublin and Boston in the 1950s, the first novel in the Quirke series brings all the vividness and psychological insight of Booker Prize-winner John Banville's fiction to a thrilling, atmospheric crime story. Quirke is a fascinating and subtly drawn hero, Christine Falls is a classic tale of suspense, and Benjamin Black's debut marks him as a true master of the form.


Capacity Canada

May 2026 Edition

Leadership Updates

Capacity Canada releases Annual Report at AGM

Capacity Canada gathered board members, staff, and community partners for its AGM, unveiling key achievements and sparking forward‑looking conversations at the Generosity Summit.

Read More ♦ Thank You to Our Conestoga College Graphic Design Students

Capacity Canada is proud to extend a heartfelt thank  you to Conestoga College Graphic Design students Mansi Patel and Elías Guzmán, along with their professor John Baljkas, for helping bring our 2025 Annual Report to life.

Read More Board News and Transition ♦ Welcome Our New Board Chair

Capacity Canada introduced Michael Lanteigne as its new Board Chair while celebrating Joanna Lohrenz’s decade of dedicated leadership and the contributions of long‑serving board member Jeanette Bancarz.

Read More New Leaders Join Our Network ♦ New EIRs Join Capacity Canada

Capacity Canada is growing its Executive‑in‑Residence team, welcoming Dave Barrett and Liz Forsberg, two leaders bringing deep expertise and a passion for strengthening the Nonprofit sector.

Read More Team Member Updates ♦ EIR Fred Galloway Honoured With Capacity Canada Cornerstone Award

Executive in Residence Fred Galloway was honoured with Capacity Canada’s Board of Directors’ Cornerstone Award at the Annual General Meeting and Generosity Summit on April 24th this year.

Read More Community Partner Spotlight ♦ KPL: Putting People at the Centre of their Work

Kitchener Public Library is embracing design thinking through Capacity by Design, helping staff and volunteers make more intentional, people‑focused decisions.

Read More

 

  1. Advocacy That Works: Navigating Government, Rules, and Real-World Influence – May 28, 2026 – Learn More and Register Today!
  2. Effective Board Support for Executive Assistants – June 3 & 5 – Learn More and Reserve Your Spot Today!
  3. Project Management for Nonprofits – June 15, 19, & 22 – Learn More and Secure Your Spot Today!
  4. Board Chair Peer-to-Peer Group – In-person and Online Cohorts – Apply Now To Connect With Fellow Board Chairs!
  5. Annual Board Governance BootCamp – November 24-26, 2026 – Learn More!

The post May 2026 Edition appeared first on Capacity Canada.


Code Like a Girl

Decision Doc vs POC -Stop Writing, Start Building

“Talk is cheap. Show me the code.” — Linus Torvalds

Continue reading on Code Like A Girl »


Github: Brent Litner

brentlintner starred anthropics/claude-for-legal

♦ brentlintner starred anthropics/claude-for-legal · May 13, 2026 13:32 anthropics/claude-for-legal

A suite of plugins for legal workflows

Python 7.1k Updated May 18


Code Like a Girl

requestAnimationFrame: The Missing Scheduling Layer

This is the sixth article in a series on how JavaScript actually runs. You can read the full series here or on my website.

In the last article, we established that:

The browser will not render while a macrotask is running nor while microtasks are draining.

Instead, rendering only happens at stable boundaries. But this creates a new problem: If rendering only happens at specific boundaries, how do we run code just before a render? If we want smooth animation, frame-aligned updates, or visual state that reflects the latest input, we need something that runs once per frame right before the browser renders.

That is the scheduling gap that requestAnimationFrame fills.

Running the Experiments

These experiments rely on the browser’s rendering behaviour.

  1. Create a simple HTML file with the following content:
<div id="box">Initial</div>

2. Open the file in your browser

3. You can run all code snippets in this series by pasting them into the browser console.

These examples will not work in Node.js because they depend on the DOM and browser rendering.

The Problem Before requestAnimationFrame

Developers originally faced a challenge:

How do I animate smoothly without freezing the UI?

We may run a naive loop like this where we want update() to advance state and render() to mutate the DOM or canvas:

let gameRunning = true;

function update() {
console.log("update");
}

function render() {
console.log("render");
const box = document.getElementById("box");
box.textContent = `Updated at ${new Date().toLocaleTimeString()}`;
}

while (gameRunning) {
update();
render();
}

This will freeze your browser. Be prepared to close the browser tab after running this.

This code completely blocks rendering. Since the call stack never empties, the browser never regains control and no rendering can occur. The page never updates.

So developers sliced work into smaller chunks to allow for breathing space for the browser to render:

function update() {
console.log("update");
}

function render() {
console.log("render");
const box = document.getElementById("box");
box.textContent = `Updated at ${new Date().toLocaleTimeString()}`;
}

function loop() {
update();
render();
setTimeout(loop, 16); // Use setTimeout() to chunk work
}
loop()

While this doesn’t freeze the browser, be prepared to refresh the browser tab after running this.

Now, the page renders the updates (the time shown on the page updates) to the box content. Since most screens refresh at 60 Hz, 16 ms (1000 ms / 60 Hz) seemed like the right delay. This allowed the stack to clear between iterations so that the browser could render.

But this was still guesswork.

But this approach was not without its problems. First, timers are minimum delays, not guarantees. The callback may run for 20ms, 30ms or later. Also, if the callback took longer than 16ms, we would miss frames and accumulate jitter and drop frames. Consequently, the callback may run before or after the render.

Fundamentally, rendering is framed-based while timers are time-based, and therefore do not know when the browser is about to render.

Enter requestAnimationFrame

requestAnimationFrame solves exactly this problem:

function update() {
console.log("update");
}

function render() {
console.log("render");
const box = document.getElementById("box");
box.textContent = "Updated at " + new Date().toLocaleTimeString();
}

function loop() {
update();
render();
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);

This also doesn’t freeze the browser but be prepared to refresh the browser tab after running this.

As before, the page renders the updates on the page. However, unlike timers, this runs before rendering. This sounds great but where exactly does it fit in the event loop model? Let’s find out.

Test 1: Does requestAnimationFrame Cut Ahead of Microtasks?

If requestAnimationFrame runs just before rendering, it must not violate our previous rules:

Promise.resolve().then(() => {
console.log("microtask");
});

requestAnimationFrame(() => {
console.log("raf");
});

The output in the console would be:

microtask
raf

As established, the browser does not render while microtasks are pending. Microtasks still run first and requestAnimationFrame does not change that.

Test 2: Is requestAnimationFrame Just Another Task?

If requestAnimationFrame were simply another macrotask, it would behave like setTimeout and follow the ordering of tasks:

console.log("start");

setTimeout(() => {
console.log("timeout");
}, 0);

requestAnimationFrame(() => {
console.log("raf");
});

console.log("end");

In practice, you will often see the following in the console:

start
end
timeout
raf

However, you may also see:

start
end
raf
timeout

The ordering is not guaranteed. Even if your environment consistently shows one ordering, the key point is that the model does not enforce it. The browser is allowed to process another task first, or perform a render before continuing with tasks. Because of this, there is no fixed ordering between setTimeout and requestAnimationFrame.

This might seem surprising. If requestAnimationFrame were just another macrotask, we would expect it to follow a consistent ordering relative to setTimeout. But it doesn’t, suggesting that requestAnimationFrame is not part of the task queue at all. Instead, it runs during the browser’s rendering phase, which is scheduled separately from tasks.

Test 3: Do Microtasks Inside requestAnimationFrame Run Before Paint?

What if requestAnimationFrame also created microtasks?

requestAnimationFrame(() => {
const box = document.getElementById("box");

box.textContent = "Frame start";

Promise.resolve().then(() => {
box.textContent = "Microtask update";
});
});

The typical output is for the page to show “Microtask update”

When the requestAnimationFrame callback runs, the DOM updates and a microtask is queued. The requestAnimationFrame callback completes and microtasks drain. Only then can rendering occur.

Even inside requestAnimationFrame, microtasks must drain before rendering.

What requestAnimationFrame Actually Guarantees

requestAnimationFrame guarantees that the callback runs before the browser’s rendering. It runs at most once per frame and is aligned to the display’s actual refresh rate, regardless of whether it is 60Hz or 120Hz. It pauses automatically in background tabs and skips frames when the browser is busy.

The Complete Ordering

We can now state the model:

  1. Macrotask
  2. Drain microtasks
  3. requestAnimationFrame callbacks
  4. Drain microtasks
  5. Render

This is the complete scheduling turn. Rendering is not part of task queue but is gated by it. requestAnimationFrame is the only public API designed to hook into that pre-render phase.

What This Prepares Us For Next

Now that we understand this structure, what do we do with it?

In the final article of this series, we move from mechanism to consequence:

What happens when a macrotask runs too long?

What happens when microtasks never stop?

Why does the UI freeze?

Why are some updates never visible?

Why do we sometimes need cleanup guards?

One we understand who gets to run and when, we can reason about performance, responsiveness and architectural trade-offs with precision.

This is where we go next.

This article was originally published on my website.

requestAnimationFrame: The Missing Scheduling Layer was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.