Programming

What we learned running internal workshops on Tailwind and TypeScript

PRG

Rolling out Tailwind CSS and stricter TypeScript settings across the team happened faster than our documentation could keep up with, since both changes touched nearly every active project within the same couple of months, so we started running short internal workshops instead of relying on written guides alone to carry the whole burden of getting everyone up to speed.

Why written docs weren't enough on their own

Written documentation is good at answering questions someone already knows how to ask, but a developer new to Tailwind's utility-first approach, or to TypeScript's stricter null-checking, often doesn't yet know what question to ask; they just know their code isn't compiling or their layout looks wrong, and a reference doc structured around specific topics doesn't help much when the actual gap is a different mental model of how the tool wants you to think. A workshop format, where someone can watch an experienced developer work through a real problem out loud, closes that specific kind of gap in a way a written guide structurally can't.

Live coding sessions with real project code, rather than toy examples, got noticeably better engagement and follow-up questions than any written guide we'd tried previously. Working through an actual component from an actual project, warts and all, including the parts that don't fit neatly into a clean tutorial example, showed people how the tool behaves under real constraints rather than in a sanitized demo, and it meant every question asked was grounded in code the attendees would recognize and possibly need to touch themselves the following week.

  • Live coding sessions with real project code, rather than toy examples, got noticeably better engagement and follow-up questions than any written guide we'd tried.
  • Recording sessions for async viewing turned out to matter as much as running them live, since half the team ended up watching on their own schedule.

What made the format actually work

Recording sessions for async viewing turned out to matter as much as running them live, since half the team ended up watching on their own schedule rather than attending the live session, whether because of timezone differences on distributed projects or just competing meeting schedules that week. We initially treated recording as a minor nice-to-have and nearly skipped it for the first couple of sessions; in hindsight, the recorded library became one of the most-referenced internal resources we have, since new hires months later would work through the backlog of recordings as part of onboarding rather than us having to run a dedicated session just for them.

Keeping each session scoped to one specific, narrow topic rather than a broad survey also mattered more than we expected. Early sessions that tried to cover "Tailwind basics" broadly lost people partway through, since attendees at different skill levels needed different depth on different sub-topics. Once we narrowed each session to something like "responsive variants and the container queries we're piloting" or "TypeScript's strictNullChecks and what it actually catches," attendance and engagement both improved, and it became much easier to pick a presenter who was genuinely deep on that one narrow thing rather than needing someone comfortable presenting the whole surface area of a framework.

What the cost actually looked like

Workshops cost more upfront time than writing a doc, both in preparation and in the presenter's time during the live session itself, and that cost is real and worth being honest about rather than pretending the format is free. A well-prepared forty-five minute session realistically takes several hours of preparation for the presenter, more if it's their first time presenting internally, and that's time not spent on other project work. We made the tradeoff explicit rather than treating workshop prep as something that should happen invisibly around the edges of someone's regular workload; presenters get that prep time counted as real allocated work, not an unpaid extra.

Choosing presenters mattered more than we expected

We initially assumed the most senior engineer on a given topic should always present, but that assumption didn't hold up in practice. A couple of our most effective sessions were led by someone who'd learned the specific tool just a few weeks earlier, since they still remembered exactly which parts were confusing and could anticipate attendee questions a true expert had long since forgotten were ever confusing at all. We now deliberately mix presenter seniority depending on the topic, favoring recent learners for onboarding-style sessions on a new tool and reserving deep-expert presenters for advanced, edge-case-heavy sessions where genuine mastery is the actual point.

Measuring whether the format was actually working

We didn't want to keep running workshops just because they felt engaged and well attended if they weren't actually changing behavior, so we started tracking a couple of concrete signals alongside the usual attendance numbers: the rate of a specific class of pull-request review comment, style or pattern issues the most recent workshop had covered, before and after each session, and a quarterly survey asking developers to self-rate confidence with the tools we'd run sessions on. Comment rates for covered patterns dropped noticeably in the weeks following a relevant session, which gave us more confidence in the format than attendance numbers alone ever could have, since attendance measures interest, not whether the material actually stuck.

Handling questions that go beyond the session's scope

A recurring challenge was keeping a live session from derailing into an extended debugging session for one attendee's specific, unrelated problem, which happens naturally once people are in a room together and comfortable asking questions. We started explicitly parking out-of-scope questions in a shared doc during the session, with a promise to follow up individually or in a future session, rather than letting one person's edge case consume time the rest of the room didn't come for. That small facilitation change noticeably improved how much of the planned material each session actually covered without making anyone feel like their question had been dismissed.

Building a library of session topics based on actual gaps, not guesses

Rather than planning an entire quarter of workshop topics in advance based on what we assumed the team needed, we started sourcing topics directly from patterns in code review comments and from a simple recurring survey asking what people were currently finding confusing or slow to work with. That data-driven approach surfaced a couple of topics we wouldn't have prioritized otherwise, generic constraints in TypeScript in particular came up as a source of real confusion far more often than we'd have guessed, and running a session on it produced some of the strongest engagement and most positive feedback of the whole year.

Extending the format beyond Tailwind and TypeScript

Once the format proved itself on these two rollouts, other teams internally started requesting the same treatment for their own tooling changes, a new internal design token pipeline, a change to our testing conventions, which we take as the clearest evidence the format earned its place rather than being a one-off reaction to two unusually large changes landing in the same quarter. We're now treating "does this warrant a workshop" as a standard question during the planning phase of any team-wide tooling or process change, rather than something that only gets considered after written documentation has already visibly failed to get the message across.

We've also started cross-posting the recorded sessions to new-hire onboarding checklists directly, rather than leaving them as something a new hire might stumble across if they happened to browse the right internal folder. That small change alone increased viewership of the recorded library meaningfully, and it's turned what started as a reactive response to two fast-moving tooling rollouts into a standing piece of how the team documents and transfers tacit knowledge more generally.

For anything the whole team needs to internalize quickly, a major framework shift, a new linting standard, a tooling change that affects daily workflow, the format has earned a permanent place in how we roll out new tooling going forward. We wouldn't use it for narrow, single-project knowledge that only affects a couple of people; a quick conversation or a short doc still wins there. But for anything genuinely team-wide, the workshop format, recorded, narrowly scoped, and built around real project code, has consistently outperformed written documentation as the primary way we get a new practice to actually stick. What started as a stopgap for two fast-moving rollouts has quietly become one of the more durable pieces of how this team learns from itself.

← Back to the journal

Have a project in mind?
Let’s talk.

Tell us where you are and where you want to go. We'll map the fastest route between the two.

Currently accepting new clients