<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Viget Articles</title>
    <link>https://www.viget.com/</link>
    <atom:link href="https://www.viget.com/feeds/articles.rss" rel="self" type="application/rss+xml" />
    <description>Articles written by Viget</description>
    <language>en-us</language>
    <pubDate>Tue, 31 Mar 2026 17:08:36 -0400</pubDate>
    <lastBuildDate>Tue, 31 Mar 2026 17:08:36 -0400</lastBuildDate>

    
          <item>
        <title>From Scrum Master to UX Researcher, Or: How I Learned to Stop Worrying About Velocity and Love the User</title>
        <link>https://www.viget.com/articles/from-scrum-master-to-ux-researcher-or-how-i-learned-to-stop-worrying-about-velocity-and-love-the-user/</link>
        <guid>https://www.viget.com/articles/from-scrum-master-to-ux-researcher-or-how-i-learned-to-stop-worrying-about-velocity-and-love-the-user/</guid>
        <pubDate>Tue, 24 Mar 2026 10:00:00 -0400</pubDate>
        <author>Liza Chabot</author>
                  <category>News &amp; Culture</category>
                  <category>User Experience</category>
                  <category>Research</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>In the summer of 2019, I was an Associate Scrum Master, and I found myself alone in the office, standing on a chair to tape long printouts of screens and modals from my development team’s application onto the wall. I was preparing a game in which team members would be given objectives and take turns navigating the website to complete them. Every time they achieved their goal, they would win points. Every time they hit a user error, they would lose points, and their turn would pass to the next player. The developers and product manager weren't prioritizing usability issues in the development backlog, so I devised this board game to make them feel the impact of poor UX. I was desperate to make our users’ pain a reality for them. The thought 'maybe I'm in the wrong role' did not even cross my mind.</p><h2><strong>The Job I Thought I Loved</strong></h2><p>I loved being a Scrum Master. I found the <a href="https://agilemanifesto.org/principles.html">organizing principles behind Agile</a> sensible and helpful in making work more efficient and valuable. I believed in technical excellence, sustainable development, self-organizing teams, and a cyclical process of examination and improvement. But most of all, I loved the focus on people. Individuals and interactions over processes and tools. Customer collaboration over contract negotiation. At its heart, Agile aims to put real humans at the center of the development process, and I loved the idea of a role whose purpose was to coach that principle, ask hard questions, and make sure teams were building the right thing to solve a real user problem.</p><p>But the longer I was a Scrum Master, the more the role drifted from that ideal. I won't add to the pile of "death of Agile" think pieces — but what I lived through was a slow reduction of something principled into something purely mechanical. Story points reported to leadership. Consequences for missing velocity goals set by people outside the development team. KPIs and features handed down from internal roles miles away from our actual users. Questions like, "Is this feature actually valuable to our users?" became unwelcome. Leadership didn't want user-centered thinking. They wanted more code, faster.</p><p>I started missing the days when I'd been allowed to do the real work — an afternoon user discovery workshop, a ride-along with the drivers we were building an app for, or yes, the day I turned our application into a game board so my developers could finally feel what they were putting our users through.</p><h2><strong>The Accidental Researcher</strong> </h2><p>I had always described myself as a Scrum Master who was “UX curious.” Even as an Administrative Assistant back in 2016, I had devised a way to get involved in a UX project, improving our employee intranet. But I thought actually holding a UX role required a fancy degree and experience I didn’t have. Instead, I thought I could lean into the people-first aspect of the Scrum Master role. I sought to partner with UX teams at every point, looking to ensure my development teams were engaging with UX research, testing, and best practices.</p><p>Looking back, I realize I was already playing the user researcher: synthesizing information and patterns across retrospectives, designing discovery workshops, and asking, “Why?” so many times in a root cause analysis, one leader joked we were going to get to the bottom of all human weakness. </p><p>I thought I wasn’t qualified for a UX role, but I could be a Scrum Master who championed UX and coached my development teams to center the user in everything they did. </p><h2><strong>The “Death” of Agile</strong></h2><p>I was a Scrum Master for six years, working my way into a Senior role at a large, well-respected company. I thought I had made it. And then in the spring of 2024, my entire department was cut overnight without warning. It was a complete surprise, and I was devastated. I had thrived as a Scrum Master, producing strong outcomes and growth for my teams and winning awards as a result. I thought excelling at my job would save me from the layoffs sweeping the industry. But the profound misunderstanding of Agile as a shortcut to high output and low costs, and the overly high investment in undertrained, untenured Scrum Masters had caught up with Agile as an industry. If Scrum Masters were just glorified note takers and story point counters, were they really necessary? Companies were abandoning the Agile ship right and left, and mine had finally followed suit. My love for Agile principles and my above-and-beyond work to teach those principles to guide development hadn’t saved me. </p><p>Suddenly, I found myself with no obligation to my current role, and I started to dream. What if I could find a role that truly did seek to understand and represent user needs in the technology sector? What if my role was seen and respected as one that could help prioritize features based on actual research and help ensure designs were based on real humans and the way they interact with technology? What if I could practice UX?</p><p>Even after working around development teams for six years, helping facilitate UX workshops and user interviews, supporting project and product managers, coordinating and wrangling stakeholders, and running design and prioritization workshops, I didn’t think I could make the leap. Did I really know enough?   </p><h2><strong>Conquering Doubt</strong></h2><p>I started by talking with UX practitioners I had worked with in the past and quickly gained confidence. The resounding feedback was “you’ve been doing this all along” and “I’m surprised you didn’t transition into UX sooner.”</p><p>I realized I had a lot of the skills and experience to become a UX Researcher. Six years of facilitation — running retrospectives, designing discovery sessions, wrangling stakeholders through collaborative prioritization — translated almost directly into the mechanics of UX research. Moderated user interviews, it turns out, are not so different from a well-run retro. Both require enough psychological safety that people will tell you something true, and enough structure that the conversation stays purposeful without shutting down room for surprise.</p><p>The analytical muscle was there, too. I had spent years tracing patterns across retrospective data and running root cause analyses. Synthesizing research findings and turning them into something a product team could act on? I had been doing a version of that every time I helped a team define and prioritize a backlog. And the cross-disciplinary collaboration — the constant negotiation between developers, product managers, designers, and stakeholders — which was a prerequisite for surviving as a Scrum Master, turned out to be equally essential in research. Most practically, the project management habits that had kept sprints on track and backlogs groomed turned out to be exactly what's needed to plan and execute a research project. Scoping a research plan, recruiting participants, keeping a study on schedule — it's a different kind of work, but the organizational instincts are the same.</p><p>Uncertain of my next steps, I sat down with a UX designer I admired and had worked with in the past. “Oh yeah!” she said, “you’d make an amazing UX Researcher!” I talked with her about the possibilities of a boot camp, which many had warned me against. “Oh no, do it,” she said. We talked about it, and both agreed a program would help solidify the foundational knowledge behind my experience and position me perfectly for the role I wanted. As long as I chose a program that would help me develop a portfolio, I had nothing to lose. Within days, I enrolled in a boot camp. Two years later, I’m a practicing UX Researcher with a range of experience behind me that has only made me stronger in the role. I have no regrets for having made the leap.</p><h2><strong>Agile, Done Right, Should Produce Great UX </strong></h2><p>Sometimes I think the decision to transition to UX took me so long, not simply because of self-doubt, but also because of my sense of hope in Agile’s intentions. The Agile Manifesto, the document on which Agile frameworks and practices are based, explicitly values customer collaboration over contract negotiation, and individuals and interactions over processes and tools. The very first of the 12 principles states that the highest priority is to satisfy the customer through early and continuous delivery of valuable software. So the intent to center human users and their needs is there. If I was a good Scrum Master, shouldn't I be able to be a good UX advocate?</p><p>However, the problem lies not in Agile’s intentions, but in how Agile is so often misunderstood in practice. Let’s take Scrum, the most popular Agile framework, as an example. UX Researchers don't formally exist in Scrum. The framework only recognizes three roles: Scrum Master, Product Owner, and Development Team member. That means user advocacy gets diffused across the whole team rather than owned by anyone, which in practice usually means no one owns it at all.</p><p>Many argue that the prescribed practice of user story formatting for describing work to be done helps ensure the team thinks from the user’s standpoint. Though admirable in intention, this makes the grave error of mistaking Scrum Team members as stand-ins for the user. Finally, sprint timelines and a culture of code releases seen as the only valuable output to the customer means that UX research and other deliverables don’t fit neatly into a sprint plan, goal, or timeline. When is UX research and design supposed to happen? And how can the UX team member fit into the Scrum Team? None of these questions has been answered neatly or satisfactorily by Agile frameworks. </p><p>Ideally, the Scrum Master should help the team learn to center the user, but most Scrum Masters are trained to optimize process, not to ask uncomfortable questions about whether the right thing is being built or if we’re truly designing something with a real user in mind. In addition, the Agile certificate culture actively selects against curiosity. Someone drawn to measuring success according to ticket completion and velocity metrics is never going to become a user advocate — but I’m wired a little differently, drawn more to the people-first aspects of the role and the use of facilitation and coaching to help a team wade through ambiguity and uncertainty. In other words, the Scrum Masters best positioned to become UX advocates are the ones who probably aren’t quite comfortable with what Scrum and other Agile frameworks have become. Which makes my own transition out of the Agile space less of a leap and more of an inevitability.</p><h2><strong>What I'd Tell a Scrum Master (or Anyone) Considering a Transition to UX</strong></h2><p>Though I fully believe Scrum Masters are uniquely poised to make the transition to UX roles, I also know I’ve been lucky in doing so. I have made this transition when both the Agile and UX industries are experiencing profound disruption due to AI and an oversaturation of undertrained professionals. But I’ve been asked what I would say to anyone considering a similar move, and here it is:</p><h3><i><strong>Be honest with yourself. </strong></i></h3><p>If you’re looking to make this move because you think UX roles mean automatic riches, you’re about eight years too late. You need to be making this move because you love understanding how and why users interact with technology, you love solving interesting problems, and you love the challenge of making technology more human-focused.</p><h3><i><strong>Don’t assume a boot camp is your next step.</strong></i></h3><p>Don’t automatically sign up for a boot camp and expect a miracle. A boot camp happened to be a perfect fit for me, but most boot camps cover a lot of material very lightly and result in very generic portfolios. </p><h3><i><strong>Find ways to practice UX now.</strong></i></h3><p>Find ways to expose yourself to UX experience in your current role. Scrum Masters have access to so many different disciplines that contribute to technical output. If you’re cooling on Scrum Mastery like I was, find what interests you and get involved.</p><h3><i><strong>Recognize that it will be an uphill battle.</strong></i></h3><p>The UX hiring landscape is <a href="https://www.nngroup.com/articles/state-of-ux-2026/">particularly tough right now</a>. This is especially true for entry-level positions. Call me an optimist, but I think there is reason to hope, especially as the AI boom reveals that good tools must first be grounded in real user problems and respond to real user needs. Our roles aren’t going anywhere; just know it won’t be easy. </p><h3><i><strong>Large companies will likely ignore your resume.</strong></i></h3><p>No matter what you do to make your resume stand out or demonstrate your experience, any automated resume scanning program will likely reject you outright. Either use your network to get introductions or find a company that can value your unique experience and that cares about hiring enough to have their applications evaluated by a human who can see the nuance and value in your varied background.</p><h2><strong>No Regrets</strong></h2><p>It may have taken me six years to figure out that what I really wanted was to be a UX Researcher. But standing on that chair in 2019, taping screenshots to the wall, I was already doing it — I just didn't know it yet. And I don't regret the detour. Being a Scrum Master gave me the skills, the instincts, and the drive to do this work well.</p><p>Today I'm a UX Researcher at Viget, which means I spend my days diving into ambiguous problem spaces, untangling what users actually need from what businesses assume they need, and asking the question: what do we really need to build here? Right now, that includes helping ensure AI tools are grounded in real user workflows rather than impressive-looking features that nobody actually wanted. And the best part is, I’m working with teams that are agile in spirit – curious, iterative, and user-focused – without being overly framework-dependent.</p><p>The UX field is facing real challenges, and I won't pretend otherwise. But I believe the researchers who will thrive are the ones who can move past simply providing deliverables and offer something harder to come by: genuine insight into what makes technology useful to the humans who have to live with it. That, it turns out, is what I always wanted to do. I just needed six years and one very memorable game board taped to a wall to figure it out.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Using Claude Code More Intentionally</title>
        <link>https://www.viget.com/articles/using-claude-code-intentionally/</link>
        <guid>https://www.viget.com/articles/using-claude-code-intentionally/</guid>
        <pubDate>Thu, 19 Mar 2026 10:00:00 -0400</pubDate>
        <author>Max Myers</author>
                  <category>Code</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>Most people who try Claude Code start the same way: open a terminal, describe a problem, watch it generate some files, feel vaguely impressed, then slowly drift back to their old workflow because it doesn't quite fit into how they actually work.
The problem isn't really Claude Code itself. It's that we treat it like a smarter ai chat - something you prompt when you're stuck - rather than a collaborator you set up to work with your project, your conventions, and your process.</p>
<p>This article is about the setup - the effort you can put in that gets you big returns. Specifically, the handful of things that changed how I use Claude Code from "occasionally useful" to "runs in the background while I do something else." I'll use a small demo project throughout - a Node.js CLI task manager called <code>task-pilot</code> to make the ideas concrete.</p>
<hr>
<span id="the-core-insight-context-is-a-resource"></span><h2>The core insight: context is a resource <a class="anchor" href="#the-core-insight-context-is-a-resource" title="Direct link to The core insight: context is a resource" aria-label="Direct link to The core insight: context is a resource">#</a></h2>
<p>Claude Code's context window isn't infinite. Every session starts fresh. Every sub-agent spawned during a run starts fresh. If you treat context like an unlimited whiteboard, you'll constantly be re-explaining your project, your conventions, and what you're trying to do.</p>
<p>The developers getting the most out of Claude Code aren't the ones writing the most clever prompts. They're the ones who invest in the <em>environment</em> — the files, structures, and tools that mean Claude always has what it needs without you having to provide it manually every time.</p>
<p>Think of context as infrastructure. The sections below are the specific pieces of that infrastructure: a project memory file, a pattern for externalizing plans and artifacts to disk, skills that encode repeatable expertise, hooks that connect Claude to your existing workflow, and a few features that change the practical experience of longer tasks.</p>
<hr>
<span id="start-with-claude-md-but-write-it-properly"></span><h2>Start with <code>CLAUDE.md</code> — but write it properly <a class="anchor" href="#start-with-claude-md-but-write-it-properly" title="Direct link to Start with CLAUDE.md — but write it properly" aria-label="Direct link to Start with CLAUDE.md — but write it properly">#</a></h2>
<p><code>CLAUDE.md</code> is the first file Claude Code reads when it opens your project. Most people treat it like a system prompt. Maybe a few sentences describing what the project does. That's underselling it significantly.</p>
<p>A better mental model: <code>CLAUDE.md</code> is an onboarding document for a smart new hire who forgets everything between shifts. It should answer the questions you'd answer in a first day walkthrough: project structure, naming conventions, patterns to follow, things not to touch, how tests are run and written, what the exit codes mean.</p>
<p>For <code>task-pilot</code>, the thin CLAUDE.md we started with looked like this:</p>
<pre><code class="language-md"># task-pilot
A CLI tool for managing local tasks in a JSON file.

## Conventions
&lt;!-- TODO: fill this out — naming, error handling patterns, test approach --&gt;
</code></pre>
<p>After asking Claude Code to interview the codebase and improve it, we got a full document covering the task schema, storage conventions, test patterns, CLI command structure, and more.</p>
<p>The interesting thing: it documented <code>saveTasks()</code> normalizes every task on write — a behavior buried in <code>storage.js</code> that you'd only know from reading the code carefully. Which it did.</p>
<p><a href="https://github.com/maxdmyers/task-pilot/commit/db1f07d65ba7197b3eda33ee615ea85c05de3c5b">That CLAUDE.md</a> now means every new session (and every parallel instance) starts with a complete picture of the project. You write it once and it will remember the important details you need it to across all future sessions.</p>
<p><strong>One sibling worth knowing about:</strong> <em>nested <code>CLAUDE.md</code> files</em>. Where your root <code>CLAUDE.md</code> acts as onboarding docs for a new hire, a subdirectory <code>CLAUDE.md</code> is like a laminated instruction sheet bolted to a specific machine; explicit guidance for anyone working in that exact spot. Drop one into a directory with legacy code, sensitive security implications, or just any area that needs a little extra explanation. It's useful documentation for both humans and ai agents. An added benefit: Claude Code will only pull it in when it actually needs to work there – keeping your context as clear as possible.</p>
<hr>
<span id="claudeignore-what-claude-doesnt-see-matters-too"></span><h2><code>.claudeignore</code>: what Claude doesn't see matters too <a class="anchor" href="#claudeignore-what-claude-doesnt-see-matters-too" title="Direct link to .claudeignore: what Claude doesn&#039;t see matters too" aria-label="Direct link to .claudeignore: what Claude doesn&#039;t see matters too">#</a></h2>
<p>This one is easy to overlook. Claude Code respects a <code>.claudeignore</code> file structured exactly like <code>.gitignore</code>. Excluding <code>node_modules</code>, build artifacts, generated files, and data directories keeps context clean and focused.</p>
<p>For <code>task-pilot</code> we excluded the <code>data/</code> directory entirely. The actual task data is user-specific and irrelevant to any coding task. A comment in the <code>.claudeignore</code> explains why, which is useful both for humans and for Claude when it reads the project:</p>
<pre><code># We exclude /data because task data is user-specific and
# not relevant context for code tasks
</code></pre>
<p>What Claude doesn't see is as important as what it does. Context hygiene isn't just a performance concern, it also shapes what Claude focuses on.</p>
<hr>
<span id="externalizing-artifacts-context-that-outlives-the-session"></span><h2>Externalizing artifacts: context that outlives the session <a class="anchor" href="#externalizing-artifacts-context-that-outlives-the-session" title="Direct link to Externalizing artifacts: context that outlives the session" aria-label="Direct link to Externalizing artifacts: context that outlives the session">#</a></h2>
<p>Before getting into specific tools and skills, there's a pattern worth understanding that makes everything else work better: writing important outputs to disk rather than leaving them in the conversation.</p>
<p>Claude Code's context window resets between sessions. In a long agentic run it can also fill up mid-task, forcing Claude to summarize and compress earlier parts of the conversation. If your plan, your decisions, and your progress state only exist in chat history, they're fragile — subject to compression, loss, and the hard limit of the window itself.</p>
<p>The alternative is to treat files as your persistent memory layer. Any artifact worth referencing later: a plan, a product requirements document (PRD), a spike document, a decision log, a progress checkpoint - they get written to disk immediately. The next session reads the file, not the chat history. Parallel sessions read the same file simultaneously. Sub-agents get pointed at the file directly. Nothing important lives only in the conversation.</p>
<hr>
<span id="skills-packaging-your-expertise"></span><h2>Skills: packaging your expertise <a class="anchor" href="#skills-packaging-your-expertise" title="Direct link to Skills: packaging your expertise" aria-label="Direct link to Skills: packaging your expertise">#</a></h2>
<p>This is the one that changed my workflow most meaningfully.</p>
<p>Skills are markdown files that define a repeatable, invocable process. It's like packaging up your expertise (or lack of) and saving it to distribute to your agent. You store them in <code>.claude/skills/</code>, each in its own folder with a <code>SKILL.md</code>. The frontmatter gives Claude Code the metadata it needs: name, description, argument hint, allowed tools.</p>
<p>The right question when building a skill: <em>what do I keep re-explaining to Claude?</em> That is your candidate for a skill.</p>
<p>I'll walk through two that I used in the <code>task-pilot</code> demo.</p>
<span id="the-prd-skill"></span><h3>The <code>prd</code> skill <a class="anchor" href="#the-prd-skill" title="Direct link to The prd skill" aria-label="Direct link to The prd skill">#</a></h3>
<p>Sometimes you leave a placeholder for yourself to come back to later. You create a feature request with no acceptance criteria, no data model, no edge cases. The code Claude writes based on it will be underspecified. The <code>prd</code> skill bridges that gap. Running <code>/prd #1</code> against <code>task-pilot</code>'s placeholder issue fetches it via the GitHub CLI, reads the codebase, and <a href="https://github.com/maxdmyers/task-pilot/commit/6f64cd0cdbce7fd9af45d6e60c89f94007f8b6a2">produces a full product requirements document</a>: problem statement, goals and non-goals, user flows, data model, open questions.</p>
<p>The more interesting result: the generated PRD included a "Current State" note at the bottom catching that basic priority support was <em>already implemented in the app</em>. It cross-referenced the issue against the code rather than just filling a template. Output is written to <code>docs/prds/</code> — immediately available as input for the actual implementation session.</p>
<span id="the-debug-skill"></span><h3>The <code>debug</code> skill <a class="anchor" href="#the-debug-skill" title="Direct link to The debug skill" aria-label="Direct link to The debug skill">#</a></h3>
<p><code>task-pilot</code> has a bug: <code>storage.js</code> silently truncates any task description over 200 characters on every save. No error thrown, operation looks successful, data loss only visible by inspecting the JSON file directly. Issue #3 describes the symptom with no debug, logging, or line numbers to go off.</p>
<p>Running <code>/debug #3</code> produces a structured diagnostic report before touching any code and ranked hypotheses. </p>
<pre><code class="language-bash">This is not a Claude Code issue — it's a bug in the project code. No relevant errors in the debug log.             
                                                                                                                                     
  Root cause: storage.js:24 — entry.description = entry.description.slice(0, 200) runs on every save, not just on creation. When     
  completeTask() calls saveTasks(), all existing descriptions get re-truncated to 200 chars, silently corrupting any longer
  description.                                                                                                                       
                                                                                                                                     
  The fix: remove the truncation from saveTasks() and validate at input time in addTask() instead — or remove the 200-char limit     
  entirely. Want me to implement the fix?  
</code></pre>
<p>It then stops and asks whether to implement the fix. That pause is intentional — diagnosis and implementation are separate decisions, and seeing the reasoning before approving it is the point.</p>
<span id="skills-compound-and-so-does-the-library-you-build"></span><h3>Skills compound — and so does the library you build <a class="anchor" href="#skills-compound-and-so-does-the-library-you-build" title="Direct link to Skills compound — and so does the library you build" aria-label="Direct link to Skills compound — and so does the library you build">#</a></h3>
<p>These are just two examples. The real power is what happens as you accumulate them — each skill is a process you never have to re-explain, each one increasing your effectiveness.</p>
<p>Over time your skills directory stops looking like a collection of prompts and starts looking like a team's knowledge, bottled. A new developer joining a project can run <code>/prd</code>, <code>/debug</code>, and <code>/spike</code> on day one and immediately work at the level it took you months to reach. That's the compounding effect of skills done well — not just that <em>you</em> get faster, but that the expertise becomes transferable.</p>
<hr>
<span id="connecting-to-your-tools-cli-integration-and-mcp"></span><h2>Connecting to your tools: CLI integration and MCP <a class="anchor" href="#connecting-to-your-tools-cli-integration-and-mcp" title="Direct link to Connecting to your tools: CLI integration and MCP" aria-label="Direct link to Connecting to your tools: CLI integration and MCP">#</a></h2>
<p>Claude Code can call any CLI tool available in your terminal, which makes the GitHub CLI (<code>gh</code>) a natural starting point. You can point Claude at an issue, let it read the spec, implement against it, and open a PR — all in one prompt, all without leaving the terminal.</p>
<p>For <code>task-pilot</code>'s <a href="https://github.com/maxdmyers/task-pilot/issues/2">Issue #2</a> — a feature request with acceptance criteria, data model changes, CLI flag specs, and backward compatibility requirements — the prompt was:</p>
<pre><code>Read GitHub issue #2 using the gh cli, then implement everything described.
Make all necessary changes to tasks.js, storage.js, cli.js and format.js,
write tests covering the acceptance criteria, then open a PR against main.
</code></pre>
<p>It fetched the issue, read the codebase, <a href="https://github.com/maxdmyers/task-pilot/pull/4">touched four files, and wrote 17 new tests</a> covering the new feature addition, overdue detection edge cases. All 27 tests passed — 17 new, 10 existing. The acceptance criteria in the issue drove the test coverage directly.</p>
<p>That said, CLI integration via <code>gh</code> is really the floor, not the ceiling. The more powerful version of this is <strong>MCP — Model Context Protocol</strong>.</p>
<p>Where the GitHub CLI lets Claude <em>run shell commands</em> against GitHub, an MCP server gives Claude <em>structured, authenticated access</em> to an external system as a set of typed tools it can call directly. The difference matters: typed inputs, scoped permissions, consistent interfaces, and no reliance on parsing CLI output. Claude isn't shelling out and hoping, it's calling a well-defined API.</p>
<p>For a project management workflow, the benefits are significant. With the <a href="https://github.com/github/github-mcp-server"><strong>GitHub MCP server</strong></a>, Claude can read issues, fetch file contents at a specific ref, check PR review status, and reason about the state of your repository. It's not just executing git commands.</p>
<p>MCP Servers work with the tools your team already uses — Slack for async context, Notion for documentation, GitHub for tickets, or even your own internal APIs. MCP is the mechanism by which Claude Code stops being a smart terminal assistant and becomes an agent with actual access to your working environment. The developers investing in MCP integrations now are building something that will compound as the ecosystem grows; every major tool will have an MCP server eventually, and knowing how to wire them together is increasingly a core skill.</p>
<hr>
<span id="hooks-participating-in-your-existing-workflow"></span><h2>Hooks: participating in your existing workflow <a class="anchor" href="#hooks-participating-in-your-existing-workflow" title="Direct link to Hooks: participating in your existing workflow" aria-label="Direct link to Hooks: participating in your existing workflow">#</a></h2>
<p>Hooks are shell commands that Claude Code fires automatically at defined points in its lifecycle. Most people don't know they exist.</p>
<p>The most immediately useful pattern: a post-task hook that runs your test suite automatically every time Claude finishes editing code. If tests fail, Claude sees the output and knows to fix before considering the task done. You don't have to tell it to run tests and try again when they fail — it just happens.</p>
<p>Other practical uses: auto-committing to a working branch after each completed subtask (giving you a clean git history of what Claude did and when) or running a lint check before Claude starts work to ensure the environment is clean.</p>
<p>Hooks are how Claude Code participates in your existing workflow rather than sitting beside it. It stops being a separate ai tool and starts being a step in your pipeline.</p>
<hr>
<span id="remote-control-and-model-switching"></span><h2>Remote control and model switching <a class="anchor" href="#remote-control-and-model-switching" title="Direct link to Remote control and model switching" aria-label="Direct link to Remote control and model switching">#</a></h2>
<p>Two features worth mentioning that change the experience of longer running tasks.</p>
<p><strong><code>claude rc</code></strong> (remote control) lets you start an agentic run on your machine and supervise it from your phone via the Claude app. It's easily my favorite new feature. You're not babysitting Claude; you're checking in. It keeps running while you're away. This changes your relationship with long-running tasks in a meaningful way: you can kick off a substantial job, step away, and get notified when it's done.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=9ff7077a35b7847315c1db4bcf6efe9e68b212d1fa023bd8bfe75f3d85ae86af" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=9ff7077a35b7847315c1db4bcf6efe9e68b212d1fa023bd8bfe75f3d85ae86af 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3edd549983ae2a1f7990951e5f15e004680148689446b6e971987f3c2a0bad95 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=7c9b2eab02934b195f11157dd784971ad20f732d941b713ca77a7322f4a2e956 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=571963fc56badc310de7c7b8994ecc5bbd8d0fbcfcceeae074c2eb7ff6d6a94c 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9a44d8f07e20584f4fba1b378f06e88099fb1e66429ab2f3c2278e214b8e4f26 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=550492ed382ba664eaa0654e5916626a0c7791b357a9edb7d61eda33a57b84a7 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a6e1307ac9bd364aaf440a703cb9bef26108e2080590f583feda9164bb48af1e 1470w" width="360" height="244" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wtaU9TLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0ecc1934d77ad17eb09b4bc62bee3725604afd7d94f655f60453a33ff68a2f11" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wtaU9TLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0ecc1934d77ad17eb09b4bc62bee3725604afd7d94f655f60453a33ff68a2f11 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wtaU9TLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1f8b73cafe5058bdd1bdb20621092ce3820ae0c8ed1fcec49c2c2c54f36bb156 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvQ2xhdWRlLUNvZGUtUmVtb3RlLUNvbnRyb2wtaU9TLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjcyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b9aac3a2050bf772454e40910811332d5ec9f7e42f868fb936c7eb80af2a4f9c 720w" width="360" height="626" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p><strong>Model switching</strong> matters when cost is a concern. Not every task needs your most capable model. Haiku for mechanical work like renaming files, generating boilerplate, formatting output. Sonnet for most coding tasks. Opus for genuine reasoning and thinking; architecture decisions, writing the <code>CLAUDE.md</code> itself, debugging something complex. In a normal workflow this can add up: lower cost, lower latency, no quality loss on the steps that don't require it.</p>
<hr>
<span id="the-compounding-effect"></span><h2>The compounding effect <a class="anchor" href="#the-compounding-effect" title="Direct link to The compounding effect" aria-label="Direct link to The compounding effect">#</a></h2>
<p>Each of these things is useful on its own. Together they create something different: a Claude Code setup that reflects your project's specific knowledge and your own expertise, not generic AI capability.</p>
<p>After a few months of building skills, the <code>CLAUDE.md</code> becomes an accurate picture of how you actually work. The <code>.claudeignore</code> reduces your project's noise. The hooks run your real test suite. The skills encode the processes you'd otherwise explain from scratch every time.</p>
<p>That's the actual investment. Not better prompts — a better environment for the prompts to run in.</p>
<hr>
<p><em>The <code>task-pilot</code> demo repo and all skills referenced in this post are <a href="https://github.com/maxdmyers/task-pilot">available on GitHub</a>. The <code>prd</code>, <code>debug</code>, and <code>spike</code> skills are in <a href="https://github.com/maxdmyers/task-pilot/tree/main/.claude/skills"><code>.claude/skills/</code></a> if you want to adapt them for your own projects.</em></p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>Time, Tools, and Permission to Experiment: A 2026 Pointless Palooza Recap</title>
        <link>https://www.viget.com/articles/time-tools-and-permission-to-experiment-a-2026-pointless-palooza-recap/</link>
        <guid>https://www.viget.com/articles/time-tools-and-permission-to-experiment-a-2026-pointless-palooza-recap/</guid>
        <pubDate>Fri, 13 Mar 2026 11:00:00 -0400</pubDate>
        <author>Aubrey Lear</author>
                  <category>News &amp; Culture</category>
                  <category>Employee Engagement</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>A few weeks ago, we paused client work for Pointless Palooza, our internal hackathon. It was our largest and most successful Palooza to date! Eight teams shipped projects, prototypes, and explorations in roughly 48 hours. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8080f0815bbe64b67876ce757576eb35a93023aee36c74c547f93362add4d9bc" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8080f0815bbe64b67876ce757576eb35a93023aee36c74c547f93362add4d9bc 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=944312be627aae94a056871d3129a3bda2c99954a19c5e0ca88b60c78a7e91f2 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=cbf6a488cfc6afe6e0b951f1ff5af975042af914e24d99d8ae71ef18f940b245 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=32a92796a53aaabbab863c655560b7745866e3f6c8683081abfce9eb3701bbd0 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d5654c2ce6b62aaa7c07a866089eaeab4fff58d417cbf00ac9a7b173f170c129 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=7a7657e62e74f8d9e1957faafec03cd8f23bfed2941a93af27366fc242dd02c2 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=2f69952e96cd0df5472e8b9b31f3aa6afe96f48d4667b8fcbefc02eff5fb245d 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d75d3a584633119464aa1b006f7e35136e0011bb477368233b8580cf445fb6d8 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a90c28203061d03d0fb389052ecec5af53c30de1e08c19d3e20c560e15e6ac5f 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMS1hdC01LjA3LjI1LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjA1MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=863c10ee95e67cd5bc4b8fe7585a02c55b5a2880860db37508882b046f59aced 2050w" width="360" height="386" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Hacking in 2026</h2><p>Pointless Corp. is Viget's long-running innovation lab, <a href="https://pointlesscorp.com/">neither pointless nor a corporation</a>. It's how we make space to try, fail, and learn without the constraints of client deliverables. <a href="https://www.viget.com/articles/the-point-of-pointless-corp-in-the-ai-age/">In past years</a>, Pointless projects required carefully assembled teams with dedicated developers. The mission was the same, but the output looked drastically different. </p><p>For example, in <a href="https://www.viget.com/articles/glimpsee/">2021</a>, our hackathon hosted a similar number of participants, who formed 3 teams and shipped 3 prototypes, all less functional and polished than what we accomplished this time around. In 2026, tools like Replit, Lovable, Bolt, and Claude Code enabled small teams and even individuals to accomplish far more than ever before. </p><h2>What We Built </h2><h4><a href="https://www.viget.com/articles/pointless-explorations-of-obsidian-claude-code/">A Custom Obsidian Plugin</a></h4><p>Viget's Obsidian enthusiasts used Pointless to explore what happens when you point AI coding agents at your personal knowledge base. The team experimented with Claude Code inside Obsidian, building a plugin that connects your web clipper and file tree to cheap, targeted LLM calls. Their finding: AI tools are becoming effective general-purpose assistants for managing information, not just producing it.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c82a75215f3eb68f6f2580135b6e1132c2e6e81836eab59704eab364f830e427" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c82a75215f3eb68f6f2580135b6e1132c2e6e81836eab59704eab364f830e427 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ebe28a59335d0e546eb83db1044670ab5c8de9a3edac442b4a78b37411fafa87 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=268b5644ede773b669cf45373b09575006e1560b136cc0654f150dd2a58e91e6 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a4758cfdad84b5384d44045b2495f17c7b50d9a4f12f8c3d697409708251df05 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=ce15ceaac1f816572d1a39bb172af160fc06367dea21e98831b98b568b1f01e7 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=785403998725e10a263345830e14bcb770ce49264dd12e0aa3f9308b1fb4c9fe 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlN0YXJ0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ0MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f4d5a1dfcb9e2c8d0b39a8c31cd4b83a59ec680508b92739a76955f41e19c742 1440w" width="360" height="256" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h4><a href="https://www.viget.com/articles/pointless-lessons-how-we-built-scooter-commuter/">Scooter Commuter</a> </h4><p>A browser-based game that helps remote workers mentally arrive at their workday through playful moments: waking up, grabbing coffee, or hopping on a scooter. The five-person team of designers, project managers, and strategists went from idea to interactive prototype in 48 hours, tackling a universal remote-work challenge with creativity and warmth. They leveraged agentic tools, eliminating the need for a dedicated developer to get past the starting line. </p><h4><a href="https://www.viget.com/articles/shelf-help/">Shelf Help</a></h4><p>Born from Viget's thriving book culture, Shelf Help delivers smarter, more personalized reading recommendations. The team researched what existing platforms get wrong, mapped MVP features, and built a working prototype—starting with a personal pain point and validating a better solution in a short sprint.</p><h4><a href="https://www.viget.com/articles/building-pointless-flf/">A Slack-Based Weekly All-Hands Production Tool </a></h4><p>Seeking to cut down on coordination overhead, this solo exploration set out to build a Slack-first tool to manage presenter slots, nudge people through prep, and keep the run-of-show coherent for our internal weekly all-hands meeting. </p><h4><a href="https://www.viget.com/articles/the-art-of-doing-nothing-building-the-to-dont-list/">To-Don’t List </a></h4><p>Flip the script on productivity: instead of tracking what you do, track what you successfully <i>don't</i> do. This gamified habit tracker rewards restraint with collectible pixel plants for an isometric garden, all wrapped in a cozy 8-bit aesthetic inspired by Stardew Valley and Tamagotchi. The four-person team used an agentic workflow and AI image generation to build the experience, a great example of a cross-disciplinary group turning a playful concept into something polished and cohesive.</p><h4><a href="https://www.viget.com/articles/big-prompts-beagle-power-how-we-built-an-ai-language-app-in-24-hours/">Barnaby</a></h4><p>An AI-powered language app that replaces grammar drills with contextual conversation practice, like ordering food or meeting a friend, and adapts to the learner's level. The functional app was built entirely by three UX researchers (no developers) using Lovable and Supabase. Their takeaway: prompt engineering is its own kind of UX design.</p><h4><a href="https://www.viget.com/articles/where-were-you-how-ai-and-human-instinct-built-wereabouts-at-pointless-palooza-2026/">Wereabouts</a> </h4><p>This werewolf-themed location-sharing app blends playful branding with real utility. The team used AI to spark creativity, starting with their mascot. Shipping a working prototype by the end of Day One. Their key insight: AI handled speed, but human judgment handled direction.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=bca992834c48bdb96928bc5b9ace74b1236a8e474f369d5e9eb22327c9bc5f1c" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=bca992834c48bdb96928bc5b9ace74b1236a8e474f369d5e9eb22327c9bc5f1c 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6a726dee4ea25303580bf5018c08c68488f5105791da8fb2af2acf16b4255fa6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b3cac58397c19fea9b29670efe58746e9c5c6c118bbfa30b8edf1c13a82be1ac 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=02c23344120ce2623faad5d9a3244aa5c20a4c5bb6d27ae0a3cf5bf3866fa7e8 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=d327186cbe9fbc5ebf52c669ef2f040d338fe37107e1d48ddbfaa5c172cf9d87 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a91d1f772d29476009caf8059179d7c38613136f337c5580ef1a1bdc57046083 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=bb7d86897aebb49a1d84d3561607a73d95dac8fb65f0124495f03a205b950027 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8d996edcd831b18fc16206db8c0e93bcd360c3bf8e6e378d9440957e1a87240d 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxOTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=39f5e1ed1b3b434fd5f1c051e81918c0f5728486de642f636679b66f917dc51a 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImRhdmVzbXlzdGVyeXByb2plY3QuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyMDUwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=afe4ad4a6b3d7252f174174dffe57d5424450a1fcaa72b15dd762b3cdccd901d 2050w" width="360" height="173" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h4>Another Awesome, to-be-announced, Project </h4><p>The last project, internally dubbed <i>Dave’s Mystery Project,</i> has not yet hit the Viget blog. What we can reveal is that a cross-disciplinary team worked to combine digital and physical tech advancements to foster connection and friendship, all with an 8-bit spin. We’ll share more in the months ahead. The team remains hard at work and plans to unveil their experience at our upcoming spring all-hands retreat. </p><h2>Takeaways </h2><p><strong>AI didn't replace anyone; it changed who could build what. </strong>The most striking pattern this year was who was shipping software. A team of three UX researchers built a fully functional language learning app. A DevOps engineer inspired a team of designers to create a gamified habit tracker with pixel art. A client strategist helped architect a location-sharing app. AI tools didn't eliminate the need for expertise; they redistributed what's possible across roles.</p><p><strong>Human judgment remains the critical ingredient. </strong>Every team used AI to accelerate their build and reported the same thing: knowing when to redirect, override, or step away from AI output was just as important as generating it. Teams treated AI as a capable collaborator that still needs a clear-eyed human in the loop.</p><p><strong>Solving real problems creates the best energy. </strong>This year's projects tackled genuine needs: coordinating a weekly all-hands meeting, finding the right book, and creating a sense of balance for remote workers. Pointless projects don't need a <i>business</i> case, but we find that solving problems rooted in real frustrations tends to generate the most momentum and learning.</p><h2>What’s Next </h2><p>Pointless Palooza has always been one of Viget's most valuable investments. A chance to step outside the day-to-day, experiment freely, and come back sharper. This year, teams moved faster, the diversity of who built what expanded, and the sophistication of what got shipped increased. All reflecting the real shift in what’s possible in our industry today.</p><p>The point of Pointless has never been the projects themselves. It's what we carry back: new skills, stronger relationships across disciplines, and a clearer picture of what's possible. This year, what's possible got a whole lot bigger.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Where Were You? How AI and Human Instinct Built Wereabouts at Pointless Palooza 2026</title>
        <link>https://www.viget.com/articles/where-were-you-how-ai-and-human-instinct-built-wereabouts-at-pointless-palooza-2026/</link>
        <guid>https://www.viget.com/articles/where-were-you-how-ai-and-human-instinct-built-wereabouts-at-pointless-palooza-2026/</guid>
        <pubDate>Tue, 10 Mar 2026 10:57:00 -0400</pubDate>
        <author>Dan Allen</author>
                  <category>News &amp; Culture</category>
                  <category>Tooling</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>It was 9AM on the first day of <a href="https://www.viget.com/articles/the-point-of-pointless-corp-in-the-ai-age/">Pointless Palooza 2026</a>. A product manager, a client strategist, and a JavaScript developer had a raw concept and 12 hours blocked out to create something usable. Think of a reality competition cooking show, but for an app.</p><p>By 5PM, we had a working prototype for our core concept: a map showing where people have lived over time, with a slider that lets you drag through the years and watch locations appear and disappear. When two people were in the same place at the same time, you'd see it. The ultimate goal was to identify these overlaps quickly, spark connections, and inspire conversations.</p><p>This was Matt's and my first <a href="https://www.viget.com/articles/the-enduring-point-of-pointless-corp/">Palooza</a>. Maria had participated before, but this was the first year where AI played such a big role. This is the story of building <strong>Wereabouts</strong>. The decisions we made, the problems we hit, and what we learned about the balance between AI assistance and human judgment.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><strong>AI as Creative Partner for Ideation</strong></h2>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImR1bmNhbi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=194f0d2428f947c64145069211916147e54a8b8de0e81e9fa1b295213b0d7f1e" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImR1bmNhbi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=194f0d2428f947c64145069211916147e54a8b8de0e81e9fa1b295213b0d7f1e 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImR1bmNhbi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=983c56ba998949c50a5c91ff26fd8876019813cfe002a7ca8871ca492271430d 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImR1bmNhbi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjcyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d927f6f0c484d907ae00b8f27741da988123e464cb810d93aea46075e2073b7e 720w" width="360" height="360" alt="" sizes="(max-width: 46em), 100vw" style="width: 720px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The concept creator, Matt (our JavaScript developer), has always had a unique affinity for werewolves. He used Gemini’s Nano Banana to generate visual inspiration with the prompt: "<i>friendly werewolf holding a pocket watch</i>." The result was a funny image of a werewolf holding a watch that we dubbed Duncan. Something about Duncan sparked the werewolf theme: hidden identities, transformation, finding your pack.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>I ran Matt's 90-second pitch video through Granola to create a summary, then fed it to Claude to generate a brainstorming document and project brief. <br /><br />From there, I used this prompt to generate name options:</p>
  </div>

</div>

          
            <div class="px-24 md:px-40 bg-gradient-code-bg" data-component="_partials/blocks/code">
  <pre class="code-block line-numbers"><code class="language-markup">&lt;task&gt;
Generate 20 creative, memorable, and marketable app names for my new product.
&lt;/task&gt;

&lt;description&gt;
[Interactive timeline map that visualizes location histories and reveals serendipitous overlaps]
&lt;/description&gt;

&lt;keywords&gt;
[serendipity, connections, timeline, travel, mapping, shared experiences, location history]
&lt;/keywords&gt;

&lt;target_audience&gt;
[Frequent travelers, remote workers, expats, socially connected professionals]
&lt;/target_audience&gt;

&lt;brand_vibe&gt;
[Minimalist, Friendly, Playful]
&lt;/brand_vibe&gt;</code></pre>
</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>After reviewing the options, we landed on <strong>Wereabouts</strong> which was a slight modification of "whereabouts" that we refined ourselves. The wordplay was perfect: "whereabouts" (location) + "were" (past tense) + "werewolf" (hidden reveal). Ironically, it was very close to "Werewhen," an internal name Matt had already come up with on his own from the start.<br /><br />AI (Nano Banana again) also helped us quickly generate logo ideas. We landed on a map pin with wolf ears.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfbG9nb190ZWFsXzkwMHg5MDAucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=d51411c2eedfe369a9b18688c32143dc6659f4635a6fb70b27f7c8332fe1f15e" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfbG9nb190ZWFsXzkwMHg5MDAucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=d51411c2eedfe369a9b18688c32143dc6659f4635a6fb70b27f7c8332fe1f15e 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfbG9nb190ZWFsXzkwMHg5MDAucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c7127e5b4ed8adfe7a930b84674b3fbebeed7ad0d9027061a31a388831e13e06 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfbG9nb190ZWFsXzkwMHg5MDAucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3MjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=39017673e28b7f6e1105f42de036fe7e3079d2beda4c5ba4b59fdb8f4c5a3960 720w" width="360" height="360" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Human Judgment: The Critical Decisions</h2>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>While AI accelerated our creative process, every strategic decision required human judgment:</p><p><strong>Tech Stack - Learning Over Speed</strong>: Pointless Palooza is dedicated time to experiment. Matt wanted to learn Ruby on Rails, so we chose Rails over faster alternatives. Prioritizing <a href="https://www.viget.com/articles/craft-winning-speeches-with-hypt/">learning goals over efficiency</a> isn't a call AI can make.</p><p><strong>Maps - Google vs. Mapbox</strong>: We debated costs, customization, and brand fit. With 12 hours and a limited budget, we chose Google Maps over the <a href="https://www.viget.com/articles/mapbox-next-level-mapping/">more customizable (but more expensive) Mapbox</a>. This required industry knowledge, budget constraints, and timeline assessment.</p><p><strong>Community - Based Architecture</strong>: This was our biggest insight, and it was entirely human-driven. We realized that if everyone can see everyone's location history, it's just meaningless noise. Who cares if a random stranger was in Houston in 2015?</p><p>The solution: pack-based communities. You join specific groups (e.g.,  your company, alumni network, soccer league, etc…) and see overlaps within those communities. This required understanding human behavior, social dynamics, and the privacy/value tradeoff. These are judgment calls rooted in experience, not something AI could have navigated.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><strong>AI as an Extension of the Team for Execution</strong></h2>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>In the afternoon, we divided the remaining tasks and used AI to accelerate the work. While Maria built an early prototype in Bolt and explored color palettes, I used Claude to develop brand guidelines by feeding it Granola notes from our morning stand up and curated brand prompts. Matt built the Rails backend, leaning on AI only for autocomplete and to speed up some of the code writing, since the goal was to learn the framework himself.</p><p>When we met later that afternoon, we had:</p><ul><li>Completed branding guidelines</li><li>An interactive prototype in Bolt</li><li>The app live on AWS</li></ul>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=bbe62e23a83a44dffa937478719b016575bcd529a750355db6563855f3a34522" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=bbe62e23a83a44dffa937478719b016575bcd529a750355db6563855f3a34522 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=39806e3c60439aa1bc51c9213d05e6d4dbe688e1bfc0c51320017f1e5b62f321 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5634b4165ac9f49cb338863c00d997e6001f1ff8d962b2339177b84a80e7ebea 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=0b6539f0e5a1c093dd6f53c66a9ed61c410639625df2468da4aef7507f83836b 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=09adc2b4d3649f59aee4d37bbc9dc864111f4363d290627cf5ff5378cf534959 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8a54f7590d6a9836c18337527948e1f295a63727b74e2ba44c55d90a142985b8 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJvbHQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=d3327c9877dd9369aa570f1ab2da4427dfb4fa8dc48bdf6bcc72ff50f879e5ab 1470w" width="360" height="173" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a91adc76ed54b662fff1d20a2a345c3803458a33540f73fcf1bea55a4b774195" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a91adc76ed54b662fff1d20a2a345c3803458a33540f73fcf1bea55a4b774195 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=833511c5a28267ad81d3cea1360739f9c38136543137d7d003a034b5f66994e4 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ebc3874af7d42d50a63df904da8ed52f7b1f5b5cb02160454f35bb7e78f9d317 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1412b0e63d84b5d1f05ad7ceb7d89350980926e203397b5f4da952ae37229010 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6daa11239a9a999ee44f158efa02218eeeeef1fa7769962cf3af67b134b79fbc 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c243783b449c7e7a725361b0e4b57aa442460a72b2182579ae98a4c7bbd48937 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF93ZXJlYWJvdXRzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=bc42aa77a4c9e158474899792aec28a42d1f2246e982dd86ecd7c410ab1031e1 1470w" width="360" height="205" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>For six hours of work, this was remarkable. That evening, I created a marketing page from scratch using <a href="https://v0.app/">V0</a>. It took nine iterations to get right.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a61172c2a7b02cdd13a6c4fabc424583f4536893be0e68578a905a7ba3b09823" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a61172c2a7b02cdd13a6c4fabc424583f4536893be0e68578a905a7ba3b09823 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b1501ab1e277b6c0a3a56bafebab2f9bd090eddb98e54a511d9ece0fa3d080f4 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=eb854b2ce849ba8d04b27d740b0ba90076d35bb4506da43cd58d0002483ebc0f 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=2d8411818f31a965ab7308605ccdd82e975661e3703c1967e5f4adaedc4b534a 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6419f5e82a99157e338d68141b937dad2fbc06ff1757346a9dfdd2e7673f9f8c 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=da59610b52bc30d112cc09a42ce6b9a2976374fab4848cf9ebd4f4eb235265a3 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1hcmtldGluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f6abd4779f80b56d5acafd114238bb45c1215291e0588895897240598d88df82 1470w" width="360" height="214" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><strong>What We Learned About AI + Human Collaboration</strong></h2>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The through-line of this whole project: <strong>AI generates options rapidly; humans make the calls that matter</strong>.</p><p>AI gave us speed on names, brand voice, marketing page variations, and visual prototypes. Humans made the strategic calls on the architecture, the feature cuts, the emotional resonance. The magic wasn't in either alone. It was in the combination.</p><p>Using Granola + Claude, we went from pitch video → summary → brainstorm doc → project brief → 20 name options → brand guidelines in under two hours. Without AI, that takes days. But without human judgment, the output is generic and misses the nuance that makes something worth building.</p><p>Time constraints forced useful clarity: some things AI could handle, and some things we had to decide ourselves. Speed reveals what matters.</p><p>What AI still can't do is validate whether people will care. We built faster, but we still need to find out if the concept resonates.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=45c2be4b38b177539617ab841da186f10e7d6d75346b1e1445629ded9d59222e" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=45c2be4b38b177539617ab841da186f10e7d6d75346b1e1445629ded9d59222e 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=2192d8f6357564057fbaaa554e228d91b2c3d23a95ff15c8a3ea6aa03d0fd4a6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=fc89b9562ee0e14e62181b9c8ce4dc340064cc5d18161ba77ddff270f3f970df 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ce2ac7347cda07e9c53f16aead41eba915e9f62d2112b1cc28c5c6c40f8e3982 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9efaa4fdb91a09b3563da9f50af8159186e1c3c933c00ba6270770f0239ef293 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ed94a91971aa47eb3df9ff17f36c4300c94b37f6f9b0ecf3cc4185f44866c03e 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IndlcmVhYm91dHNfaW5mb2dyYXBoaWMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=833209c8df7895ad7f1f192b7d11888192ccc9deae8cbe33480bb03bdc62e228 1470w" width="360" height="360" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><strong>The Result</strong></h2>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>We're going to keep working on Wereabouts. Because in 1.5 days, we proved:</p><ul><li>The concept resonates (people care about discovering shared history)</li><li>It's technically feasible (we built a working prototype)</li><li>The AI + human workflow works (it genuinely accelerates ideas)</li></ul><p>Where were you when the moon was full? Where were they?</p><p>We built the tool to find out. The point of Pointless Palooza isn't just to build something fun. It's to <a href="https://www.viget.com/articles/building-a-blog-with-ai/">experiment</a> with new workflows, tools, and ways of working. AI is an incredibly powerful creative partner when guided by human judgment, experience, and heart.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><strong>Closing Thoughts from the Team</strong></h2>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p><strong>Dan</strong><br />The knowledge sharing across teams was one of the highlights I really loved, from early ideation and kickoff through to the presentations and retrospectives. I came away feeling like I'd done an intensive "PhD" crash course in Claude, and I'm now going deeper with Claude Code via Terminal, building out custom Skills and learning more about Plan Mode and MCP. Beyond this, I'm embracing GitHub and Docker and how I can use those tools as I learn more about implementing AI into my own workflow.</p><p><strong>Maria</strong><br />My favorite thing about Pointless this year was how dramatically the bar for what's possible in a short amount of time shifted. I felt empowered to tackle things normally outside my skill set, like building a fully functional prototype. With AI moving so fast it's easy to feel behind, but a few hours of experimenting can really move the needle on your confidence. More than anything though, what stood out most was how much the human element still mattered. Connection is ultimately what made this such a great experience for all of us.</p><p><strong>Matt</strong><br />My most valuable takeaway is how helpful AI proved as both an <i>ideation engine</i> and as a <i>communication tool</i>. AI allowed us to really lean into the idea that it is easier to modify what is written than to write from scratch.  Separately, if a picture is worth a thousand words, an interactive prototype is worth hundreds of pictures. AI creating fully realized, working demos streamlined our communication and encouraged active collaboration before sunk costs trapped us - psychologically if not literally - in a single approach.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Big Prompts &amp; Beagle Power: How We Built an AI Language App in 24 Hours</title>
        <link>https://www.viget.com/articles/big-prompts-beagle-power-how-we-built-an-ai-language-app-in-24-hours/</link>
        <guid>https://www.viget.com/articles/big-prompts-beagle-power-how-we-built-an-ai-language-app-in-24-hours/</guid>
        <pubDate>Fri, 06 Mar 2026 10:00:00 -0500</pubDate>
        <author>Laura Lighty</author>
                  <category>Code</category>
                  <category>News &amp; Culture</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>The Pitch</h2><p>Stuck grinding through grammar drills and decontextualized vocabulary lists with no easy way to just start speaking? That's where one of our Viget teammates found herself when trying to level up her K-Drama watching experience.</p><p>For <a href="https://pointlesscorp.com/">Pointless</a>, our internal Viget hackathon, UX Researcher Megan pitched a different approach: a language learning app that teaches the way children actually learn—through simple, high-frequency words in context, not endless grammar exercises. Start with common 1–3 syllable nouns and verbs, drop them into 3–5 word sentences, and let users hear proper pronunciation while quizzing themselves.</p><p><br />Fellow UX Researchers Laura and Liza were hooked. We dove into Pointless to see what the three of us could experiment with and build in 24 hours using AI, without developers. We all agreed to adopt a "throw spaghetti at the wall" approach—see how much we could experiment with an AI-forward approach. </p><hr /><h2>The Evening Before</h2><p>We wanted the right setup so hackathon day would run smoothly. Megan turned to Claude as our technical advisor, who generated a project plan with detailed instructions on tools and how everything would connect.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ad85ca4f1084a039d06d2d6a1e1ab7bb95f8386db3b9e5c5feac509fdfcd17a8" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ad85ca4f1084a039d06d2d6a1e1ab7bb95f8386db3b9e5c5feac509fdfcd17a8 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1a02bcfbde81fec58fae3727e1fa3bb80f1227bed1a3e280cc24dd33018090ba 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=cec7453554c64acaf7082508d1d99f17b48ac5c17bd02903855fed8a040a41f7 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=bfb7c0730b0fad78dbae71d14d5ad9c10b80ec2375046ac9bde08ead34cfe19c 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6997ae50045bdb070452bf385753b8910a2a81a83cbf34f47e981c8c40653483 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=55dc18480e0ef2e0d2abecba43c8db13490b13324f4c0adf3c34c29ced8ead44 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMi1hdC00LjE3LjMyLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6875c7765af3c07676db391f3c0e1a651842890c4cdf0faa73b2626675853f79 1470w" width="360" height="203" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>She wrote up a prompt and tested Bolt that night, immediately hitting the credit limit. She decided to come back to tooling in the morning. </p><p>On the brand side, Laura asked Gemini to generate mascot ideas and immediately fell for Barnaby the Beagle, who excitedly helps users "sniff out new words." Our mascot was born!</p><p>In the morning, we agreed we would see how far AI development could take us, then pivot from there.</p><hr />
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Pointless Begins!</h2><h3>First 2 Hours</h3><p>Instead of small, iterative prompts, we decided to approach development with big, detailed prompts that laid out the entire plan and functional requirements upfront.</p><p>Claude had recommended experimenting with Replit and Google AI Studio, in addition to Bolt. Megan fed the same prompt into Replit and Google AI Studio and both churned out functional prototypes <i>within</i> <i>minutes. </i>We were shocked! </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=db0f50958288a583c72dea0789802a218d85800e8112330989e29935af31704f" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=db0f50958288a583c72dea0789802a218d85800e8112330989e29935af31704f 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=17fef08bbb732e3b0d396e2eb2ab232690b5d453d51123bdbd7e7a78c707d92a 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=8f8767ae13cc20f8350fb02d581c040e0d14509ab8b0202acf6075c915bd6b13 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5bb12400a4a35defcd96c1c19e9e0fee8d976b16596fee527db7ecaac3750e7f 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6272b8a5aef334c6de75a4291474a26dbe18e341d30b2df10225eed7622ca41f 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=aed38637b9e90fb04a754a65372704520de99a2fcce3b6bdfd778ce4085eec5e 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTEtNC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f229911f4b16433fd45633b0baa9752b7f8b7d03e8cd25c9b9260581a7dfd698 1470w" width="360" height="138" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>We went with Google AI Studio because we had credits, the app it produced was closer to our end goal, and its code organization was far more intuitive than Replit. This was crucial since we knew we'd need to make smaller, more specific code edits rather than just vibe-coding our way through. </p><p>Now that we knew AI could deliver functionality so quickly, we started parallel-pathing our efforts more strategically.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3>Next Few Hours</h3><h4>UX Strategy</h4><p>Google AI Studio leapt into action with a fully functioning prototype quickly, but it also started filling gaps the prompt didn’t cover, like what metrics should appear on the homepage.</p><p>Aside from what information should be highlighted to the user, playing around on the working prototype uncovered a lot of new questions particularly around how users cycle through vocabulary:</p><ul><li><i>When is a word considered "mastered?"</i></li><li><i>When can someone ask Barnaby to fetch new vocabulary words?</i></li><li><i>What happens with inactive words that users have already learned?</i></li></ul>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f855390e89016b37c9a7a7e7861660226ac9e310bf464704f179fb05644fdfa2" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f855390e89016b37c9a7a7e7861660226ac9e310bf464704f179fb05644fdfa2 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0b3f7d1207f78d534e98d43541830ea8d29f530ceff14ebd9be6a26353b516a5 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c9b0d03ac177b5dafb9c218279a0f8c3f684b8a8be75069ce6063bd59cff6e60 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=7af37e6646dc216278482e72bfef1583c76b2ebde9e86d4eaa943ebd1add0606 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=19ab24c5d59c7c63a4a355f8358111690d893f9bc5a0f97a632a82a186893bfb 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=4a3b7eea313c23c15bd789aae544d49840deba1adc1cd45facbd6966699544dd 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMy0wMy1hdC0xMS4zNS4xOS1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6ba1b3fb73db0d8ef05d16ee748d421695d4dfa0bf1d327e515a17abb1ad68d5 1470w" width="360" height="95" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>We needed to come together and streamline our UX strategy, to decide on definitions, learning states, and what information felt most important to a language learner. Megan and Laura huddled together, running through the prototype as a catalyst to define the parameters of the app moving forward.</p><p>The rest of the collaboration was asynchronous. Laura audited screenshots in FigJam to revise designs and copy. A few wireframes emerged when they were warranted, but mostly we shared annotations back and forth.</p><h4>Branding</h4><p>Now that we'd fallen for our mascot, it was time to riff on Barnaby!</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9e6a7ce72d6354e5d020fcef3204f8d8dc3689ac0a5a20ff0c38892941aea386" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9e6a7ce72d6354e5d020fcef3204f8d8dc3689ac0a5a20ff0c38892941aea386 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=67ecf98121dd8aff3de728105a5738dc002fc0caf1137e2c8478926c5ea86534 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6a18f13c9f03c5ff7e02656cafbc67fd9240bf46abd2701eaf763f12f0f061fd 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a8d3bf5302e26d9e926f215ba9ce5bec7b31fb8f003ef8beafa29b357c324f4f 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=0602f6d442c627bbbad7ae2f062a152fa4c70d2b7446e9ef9fa72a23121838bf 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=02b0691406d823df9bb040e18969979ba785b90753610afb0a39fb7b2c6f1767 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJyYW5kLVRpbGUtMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NTQsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f2d15d0220b46b16bf48c3e64fcb3cf71e4b3b9976cfa3ca9c7d5fa9e70f0afc 1454w" width="360" height="227" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Priority one: pick colors and font families so they wouldn't block development. Liza took the beagle + "learn like a child" concept and ran with it, using AI tools to speed up the generative process and land on a simple, fun, whimsical palette.</p><p>Using Gemini to generate imagery was both fun and challenging—sometimes difficult to nail the right feel, until it would suddenly click. We had to muddle through a few versions that were, well, strange. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=8fca2261f8ea6268b59b41a24d2e0a5a3056a3b0326684a39df11ea4a9ef15ae" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=8fca2261f8ea6268b59b41a24d2e0a5a3056a3b0326684a39df11ea4a9ef15ae 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ef5cbb59630649bfd4d233e1753cf5b2a328dad7822660a82b68fc1d44b48ea8 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=fe00ba883fa414dcd96e8de7ade54bf1264b4f60aa699401433a0660e8c84d70 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b349987528b464ee9b6a3b962bb6f56b9b6a6c16665384b930d8df71f0215acf 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=60cf18a025d7af7aea94cc2d50329f520efda34d591c0d397d912a49f1b851d5 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=2e92adb4d2998f819df3566f302748dd5db5463d102414337038e8161dfeb477 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZyYW1lLTIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=97507eb453b30a40ec8dd6e7f4472335dc63f4c1b0d32622a52c10b4cc0c90f2 1470w" width="360" height="94" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>We loved the idea of utilizing the childlike element of crayons and finally generated one image of Barnaby that felt perfect. Using that as a jumping off point, we created a few more poses for Barnaby and the perfect logo. Barnaby's lil face now appears all over the app!</p><h4>Development</h4><p>As our stand-in developer, Megan confirmed we could build the right technical implementation. Our first version’s biggest flaw: Gemini’s TTS made a fresh API call on every speaker button click. Five clicks? Five calls, five slightly different audio clips. Our free tier was gone in minutes.</p><p>Megan used Claude to connect Google Cloud Text-to-Speech and debug, quickly learning that AI solutions can sometimes create new problems—like a caching function that cached and played all audio files at once.</p><p> </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=cc19a2c79228f2ac76867edc607e486f06a720aa14e9caf88b7faa9f3b304bdc" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=cc19a2c79228f2ac76867edc607e486f06a720aa14e9caf88b7faa9f3b304bdc 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5927a539c886f435be009360a392404354bf2bc4e665a65fdde414fa2aac213a 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d890a4cd05ce931b69903cbb708f915ed2b5d20019b546671adea611fb60fd38 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=34e2064234f5f75a251fa87a621062dfdf37076803ac1e3349d0365dd7a3e754 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c45b12a015d0113ae0667f0d17660a20e30344b9adcf65e21d0a376bc32dd071 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=4530811d0ccbb27add11798fdba67dec1c3f002b8ffc6f68d381d9073d440ff7 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTItMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzOTYsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a00fa24421908a1208a22e0f9725427c4c12de903a76b227780463c162b3ce5c 1396w" width="360" height="72" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Once she refined the code to batch-pull from Google Cloud TTS, she moved to bigger UX/UI changes. Guided by Laura’s auditing, Megan fed Google AI Studio a lengthy change list. To our horror, Google AI Studio promptly started over, which unfortunately undid some manual edits, but lesson learned!</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://assets.viget.com/tinywow_Screen-Recording-2026-02-12-at-5.25.27-PM_88347062.gif" srcset="https://assets.viget.com/tinywow_Screen-Recording-2026-02-12-at-5.25.27-PM_88347062.gif 800w" width="800" height="402" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>After addressing the key technical bugs, the evening was spent implementing other UX/UI changes and migrating from Google AI Studio to GitHub + Vercel for the next day’s demo.</p><p>The morning of the demo became a frantic push for branded elements, font changes and UI fixes. Jumping Barnaby on the loading screen became a personal favorite and a surprise to the team!</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <hr /><h2>The Result</h2><p>A working app supporting 14 languages (Arabic to Turkish), where users can practice vocabulary, quiz themselves, and have Barnaby fetch new words on demand! </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://assets.viget.com/Barnaby4.gif" srcset="https://assets.viget.com/Barnaby4.gif 1376w" width="1376" height="926" alt="" sizes="(max-width: 125em), 100vw" style="width: 1376px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <hr /><h2>What We Learned</h2><ul><li><strong>Use AI as a technical advisor:</strong> Having Claude as our technical advisor meant we could move fast in unfamiliar territory. Rather than writing app code independently, Claude helped us architect the system, debug in real time, understand our code, and make tool/API decisions. This "pair programming with AI" workflow meant even team members without deep web dev experience could move quickly and confidently.</li><li><strong>Rapid prototyping can unlock creativity:</strong> Getting a working prototype in minutes (not weeks) let us spend more time on strategy, UX refinement, and branding as a small team.</li><li><strong>Don't forget your strategic thinking:</strong> Google AI Studio filled in any gaps, making decisions about functionality, UX, and UI but not always in the right way. Moving forward, it’s important to remember to leave the strategy up to us, not AI. </li></ul><p>And yes, three UX Researchers can build a working language learning prototype in 24 hours!</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Labshares: Internal Talks that Build Skills, Connection, and Culture</title>
        <link>https://www.viget.com/articles/labshares-internal-talks-that-build-skills-connection-and-culture/</link>
        <guid>https://www.viget.com/articles/labshares-internal-talks-that-build-skills-connection-and-culture/</guid>
        <pubDate>Wed, 04 Mar 2026 13:10:00 -0500</pubDate>
        <author>Brian Williams</author>
                  <category>News &amp; Culture</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Most people would rather be locked in a dark room with a poisonous snake dressed as an evil clown holding a giant spider than give a speech.</p><p>And yet, the ability to speak clearly, confidently, and thoughtfully in front of other people is one of the biggest career advantages a person can have. It doesn’t require unique talent, it takes practice. It’s something we’ve practiced at Viget for more than 25 years.</p><p><strong>What’s a Labshare?</strong></p><p>Every week, we gather for Free Lunch Friday (FLF), our weekly staff meeting. The schedule is simple: 15 minutes of unstructured social time, 30 minutes of company updates, ending with a 15-minute Labshare. That’s a full hour of otherwise billable time for the full team – an expensive investment that continues to be worth every penny.</p><p>Pre-Covid, FLF was mostly an in-office experience, so a presenter would enjoy a live studio audience of a dozen or two, with another 50 or so folks joining via video. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Impvc2VwaF9sYWJzaGFyZS5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c5ad36e5831429b730cf7af1c41822316ecac6953ec5a3cd764c6e618fbf9e13" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Impvc2VwaF9sYWJzaGFyZS5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c5ad36e5831429b730cf7af1c41822316ecac6953ec5a3cd764c6e618fbf9e13 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Impvc2VwaF9sYWJzaGFyZS5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0a8f0c2ff4efdbc6d25c059d2b42d91cd399640ef2084473dba3733f300dfa00 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Impvc2VwaF9sYWJzaGFyZS5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=39d2c3779e5d142b5a3ea045aa8ebf52e8b2727dcc30008bb27a823313cdb8fa 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Impvc2VwaF9sYWJzaGFyZS5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=594c6fdf5592d1ef84b46d3faa0771b46357570d11560e98b948eac1eb842d1a 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Impvc2VwaF9sYWJzaGFyZS5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEwMjQsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=9d9406671321835bf922a3c56a564595ac87fb99ce2fe2b068231c2547696105 1024w" width="360" height="295" alt="" sizes="(max-width: 125em), 100vw" style="width: 1024px; object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">Joseph Le giving his Labshare “Getting Into Making Films” in 2015</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Labshares are 10-12 minute talks followed by a few minutes of Q&amp;A. Everyone at Viget – from interns to 20 year vets – is asked to participate, with new hires prioritized within their first few months. Topics are entirely self-selected and don’t need to be work-related, as long as the speaker is passionate about the subject.</p><p>I’ve enjoyed well over 1,000 Labshares in our quarter-century of business. To give you a sense of the variety, a few favorites include:</p><ul><li><i>Ruby &amp; Mid-90s Hip Hop</i>, by David Eisinger</li><li><i>Our Brains, the Invention of Reading, and the Internet</i>, by Blair Culbreth</li><li><i>Finding &amp; Eating Wild Mushrooms</i>, by Todd Moy</li><li><i>Emotional Processing + Conflict Resolution</i>, by Nathan Long</li><li><i>Dreams</i>, by Maria Taborda</li></ul><p>Some presenters hand-draw their slides, like the legendary Chris Jones did in his 2016 Scurvy Labshare.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-2000" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4d128f38a58757b8cdcf7701984cb78d62d7b2de2a575c394ab3250ff3ecc7bd" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4d128f38a58757b8cdcf7701984cb78d62d7b2de2a575c394ab3250ff3ecc7bd 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6e6519ae6975c8ad622c86d1f46d6146af17fb350445558be7cfcf8656537ec6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=74b1553f888e2b24d2e77b2d7a203acdb9fd8139d3d5abd38fe3b484e93687ea 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=07c05b9e86041a52ce92f8438bf4188018c73c842f8b339148b4181e8d05d68b 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a1dda81129948fd7d8dc48ded0dbe3912ad2331801d3885d19db20e854034990 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=7934f252496003469b82be0a16b823e8b0a4e6a55d881b8c67b83602d741f080 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=dac65cada88471143b062c9a4c7685f51c4e6cb5b22253bc6efaffbd86159c78 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=2cb173e43706db647f5fe4190056f0f97e6613339600eb5b4c27a16789388754 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=62b83b48e9b28ae46a5c2623d2700d68ac9647b2d46a17d9d4e66b3a021e28ff 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjIxNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ea818ee9e564ac49286754c1f5ffb25b4b935bf91524d66b353cb7f51de3a2a8 2160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNjdXJ2eS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjIzMTYsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ee3f08269d0549271425058fcef445d2b6f050d7fd52ec094bfab78cb8790065 2316w" width="360" height="181" alt="" sizes="(max-width: 125em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The only person who could outdo 2016 Chris Jones was 2025 Chris Jones, who supplemented his slides with a live demo of his desktop (no, that’s not AI) to give us real-world explanations for why color doesn’t exist.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a07f3e2a82b279a375791d24974e021662c6741e30d473358e14bc452bbdfac1" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a07f3e2a82b279a375791d24974e021662c6741e30d473358e14bc452bbdfac1 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1ee4e7e3dd09e14697a04f58d0ef4f49d4ac20e842d3f5d4fcb463fa2768faeb 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=43aa8daee46432f11be948998ce35067e005476a02bc6c024bf9f8e9d056cf28 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=69d40f86c52f76a4b8c7a5bdd3573ed095b39356de8fa825e86f2edf700106c3 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=2b39d0221fe0a62172ad3692be38cfc372343e8cb207c3e9c9a7194e9cf736cd 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6cb56de329d5cdcfd4a1716bf9e02c4a64f129fe005269e1a482a336e6858641 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=927ef6cd35c43ece9d012e969f2265ae3ea44ddd2c2555c90028ee680c65a36b 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4796397182a8493015d37d1804c354f6ee85b16fbadae1032a780edd1e46583f 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNvbG9yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTgyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a6ab6e11aeb500b9c2786b343053baecfc22d59e86bec841395be7dcb669e486 1820w" width="360" height="205" alt="" sizes="(max-width: 125em), 100vw" style="width: 1820px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Most presentations aren’t this fancy, so don’t let the high bar discourage you, future Labshare presenters. Great visuals are awesome, but not core to what makes the Labshare tradition so special.</p><p><strong>Why encourage knowledge sharing?</strong></p><p>Similar to our article writing approach here on viget.com, a lot of the value is in the prep. When an ambitious person challenges themselves to teach their peers about a topic, they’re going to make sure they know their stuff. This forces clarity, conviction, and judgement – skills we rely on daily in our client work. While the topics aren’t always work-related, the process helps foster our culture of learning and sharing.<br /> </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5c58f044561f007b818b59a2dd5dd37a2a7877adbf296728285f9d66dd5a2353" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5c58f044561f007b818b59a2dd5dd37a2a7877adbf296728285f9d66dd5a2353 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=d0252f4c997e1d2a1753d06aa2676d707fb291658372514b2ed0f35c7dfc8390 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f426dc887a641320572946510517601c89b7b50b40f31f27d076f4004a720178 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e445e27de79b6f6f9491c5e6de47b9baac7659119c8eb117e4aa0435674aa471 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=53292c80c32ad6edb61da57f451bbc997c1d67e52632127b01f29c556d2cd3ed 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ed27590f841c8761449145796b03c1af079913d67d04a427503c685fafc70e45 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1615461cd3c34f52812e15521e2c5d90a58a1d8a4beb7f241ca7006b861bf7e7 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWNhcHRjaGEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNzEwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9600e4aa38438cfbbb8e2fe0f471533e246789eec1d5b7bdbf622d66736583c8 1710w" width="360" height="240" alt="" sizes="(max-width: 125em), 100vw" style="width: 1710px; object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">Tom Osborne taught us all “Why Captcha is Awesome” back in 2011</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>When curious people see a peer they respect excited to share insights about a topic they’re into, they perk up, ready to soak it in. These aren’t boring training topics from HR or repetitive vision statements from the CEO (ahem). The topics are usually a surprise to the audience, and one of the things that makes our culture unique – we love learning new things.</p><p><strong>How do Labshares foster connections?</strong></p><p>It’s hard to get to know each other, especially for remote teams. Encouraging new staff to present within their first few months gives everyone a chance to put a face, voice, and personality to a name.</p><p>What’s shared is often personal. It might be a hobby, like Billy French’s <i>Magic</i> or Ben Travis’ <i>Salsa Dancing</i>. An interest, like Kevin Powers on <i>Pangolins</i> or Danny Brown on <i>Squirrels</i>. Or something more meaningful, like <i>Queer 201</i> by Matt Sontag or <i>Immigrants</i> by Leo Bauza.  </p><p>Inevitably, we all get to know the presenter better – not just what they know, but who they are.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=75a6774887365256c768291368e0268103d1ce891feb7cc3e31568ce2d7d3286" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=75a6774887365256c768291368e0268103d1ce891feb7cc3e31568ce2d7d3286 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=bb686031d76b7e2442cca9947863a922fa4151dc5738207d8b868db0069ce8ed 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=ca731392bbd26ffbf7204a31390a25a1e3842b1b237c5e347937c70508c24674 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=8a3469939f3854effa51c764500a031f6a250af74c15ac7b9781e979ea761f92 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=16294172d5d941c26e4ae71f40a8574502442c9e76af8922df35fc5dfe1ce7f7 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=4a0244d6f6edf6700ea9cedab63046171b92ef2a2ba8a0782ec8f75c2ce40ae0 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3d4df0de0305e59c7c694abe79ea5f8e11026decbf536ee43b4cd03befa75015 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWZyaWVuZGxpbmVzcy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE3NDYsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f1aa34fa61d2919bfa607426079588836935bc9358048c60042c0181685f99e0 1746w" width="360" height="151" alt="" sizes="(max-width: 125em), 100vw" style="width: 1746px; object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">The very friendly Emily Dieu gave her 2025 intern Labshare on Friendliness</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>For the presenter, preparation matters. A required practice run, including coaching from our People Team, sets them up to succeed. It’s a friendly audience, so even the occasional technical difficulty or misstep is met with encouragement. Speakers can read through the positive (often hilarious) Slack comments and emojis that mirror the timeline of the talk. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-2000" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=476d540a5e63e94b078522cefb90242906f76839cb42179f6c551a7cefda3516" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=476d540a5e63e94b078522cefb90242906f76839cb42179f6c551a7cefda3516 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=d4bf7b7d5a8df9b7f7078d71e0c2038faf8dae33feb4a4f83d7ae2d0eb02b537 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=172d023b4aa64d6635ca6ddda7a7618ca69be82bdeffc2dceecbc1bf0fd02307 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=22c692dd8750b410186ca426232137d826c27a36465a27f5b24d45364470f8b9 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6440c6dc3212ae5a3b6fbc4d941f0927f401882e77d913216cc6011b26d2cef6 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d67ac12c0e5f3faecfc934ee31796697fa243e95ee388ead9752f10e854910d2 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=8471ba920f2760d3837612ed624c1a46f83c8ba86f693acf20d5cb8e6eb95221 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c1e80444d995930b6378458a53d8d07e1313620af634a1444a216e011a2f1f32 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4a88c5fdaafdc32496a9a74d29ca0d74ee5d79c3bed4b418101c232925d072d0 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=303ac3ebd66a2d7cc8900f65e707241ab44741cb85ab51cc74b0860bf61481ca 2160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3aae57d70d544b73a55039381e76f9d19b78c5d7efbf48527a00d8f8ab3a06ea 2360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=bff8770c456375b16d76a4ddea341a592ace9df8a8840dfd1185431b8abf6854 2560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6Mjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=479dcc595742b3b0881127c5d458043fa13eef213200910683c8755f7e5e6b96 2760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLXNsYWNrLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjgwMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=da04843a33394e8ebcd124e0c0bfed57203b5383193d2dee460cf16964ec92e4 2800w" width="360" height="133" alt="" sizes="(max-width: 125em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The accomplishment of delivering a quality Labshare is a confidence-boosting professional development milestone and a team-connecting culture event.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f0cd344476c839ebc49282057c08b8f4935aa2f5cdfcbb0248341fa23d48b94d" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f0cd344476c839ebc49282057c08b8f4935aa2f5cdfcbb0248341fa23d48b94d 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8517cf6f4a03dc5c1825ea71af58d00c5ae8a0fe24e211a80ad2a5a90bf3ec3b 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=855ea36b927058a9f35007359687ad24f76ce12b6d62a1cd98821a9042476175 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=0c723cfe8295bda9339ab45567d145784889e50861942fb22a59c5c900a8b875 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0311b6f2626b82a2fe0f362873fb8d0caa915c20a7dbf3948818f06bfd268c7e 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxhYnNoYXJlLWVtLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTIyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=44ef5fb186d674188d2f214f6266f3a419648ea8eec237a0fc93dd0786781d49 1220w" width="360" height="362" alt="" sizes="(max-width: 125em), 100vw" style="width: 1220px; object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">In 2013, Emily Bloom gave a meta-Labshare called “Making LabShares Better”</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Like most things at Viget, the quality of Labshares has improved over time. Early on, we often skipped rehearsal and didn’t emphasize a strict time limit, leading to exhausting overruns and frustrated audiences. So much so, we almost scrapped the tradition entirely.</p><p>What ultimately saved Labshares wasn’t lowering the bar, it was adding structure. Clear time limits, required practice runs, and direct coaching didn’t stifle creativity. They provided support, reduced stress, showed respect for everyone’s time, and improved the experience for both presenters and audiences.</p><p><strong>Why is public speaking important?</strong></p><p>We’re all client-facing consultants. The bizdev team pitches to prospects. PMs present kickoff decks. Designers share concepts and screens. Developers walk through code and demo software. These are all high-stakes client interactions, and they go better with practice. Labshares provide a great format for us all to improve not just presenting, but handling live Q&amp;A as well.</p><p>Bigger-picture, Viget is a place where people grow professionally. Public speaking is an important part of that growth. I received this email from a Viget alum recently, and it made me proud for us both:</p><p><i>"[At our company all-hands meeting] I was invited to speak to a room of ~160 folks. It went great. I felt confident, got lots of positive feedback, and earned some public kudos from the CEO.</i></p><p><i>It got me reflecting on how much I've developed my public speaking confidence and skill-set over time. That's due, in very large part, to the trust and stretch opportunities you provided when I worked at Viget. Between Labshares, client presentations, and State of the Web's, I learned so much and had so many opportunities that have continued to pay dividends in the years since.</i></p><p><i>So... thank you! Thanks for creating such a great company, where learning and growth aren't just encouraged but are expected. And where a young, nervous data analyst could be pushed outside his comfort zone to grow in unexpected ways."</i></p><p>Reflecting on the weekly Labshare tradition, I’m reminded how much creativity, curiosity, and care exists in the people I’ve been fortunate to work with, past and present. With just enough structure to ensure consistency and plenty of freedom to let people be themselves, Labshares are one of the most reliable ways we grow skills, build camaraderie, and stay genuinely interested in each other.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-2000" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f735725177072f5c0a4807496189b828d95ef863701fcc322f17d786875deda3" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f735725177072f5c0a4807496189b828d95ef863701fcc322f17d786875deda3 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=74811503aa8c4866ac901343e7b6cb66bd3f1f3697c999ef57bf7cbb37108ca9 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=703631aa95bef850ea874f9fa2bd17cd9d26c096f1c42da6311181e162c39f18 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d1f0f70257fa4834d85f102709e8a15f0bb50183f25ec3faf272e4111de1649d 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ca6ba8ad822b77c98382d2d27a7b24670b2e677a919626def66d6507eadc3231 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=093c965ed8641ad121216f6071fd106b19ae16918a9f736f72424baf8499e7bd 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=eedbc8dc6d50c342b135f94a31b3293c0866976c6f3e0549a72f420d18592aa9 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=0ad0713b9df547a9366fc17ea0c6dec24efaeb0a92a601bb64238281a56ee6e3 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=dce1a8e8691360c060876053386a55f49b604cd738fa100817000ec5248ee4bf 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjIxNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c1f48ce16d97dd02f7ad16b0e612b4e0f26c559c417103f9d23eec7f791bf271 2160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjIzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6fcde00f37299ebf781582682b5553003e9076f2668953463b2b0bb401f8aabc 2360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImxleGllMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjI1MzIsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=78134d2dc427e1e8d5c755dab10d3137e43af8e7712b1a404bc63489afa89813 2532w" width="360" height="340" alt="" sizes="(max-width: 125em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">Lexie got us all hyped for Unrivaled - Designing a Better League just last week!</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>I’m already looking forward to the next 1,000.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>The Art of Doing Nothing: Building the &quot;To-Don’t&quot; List</title>
        <link>https://www.viget.com/articles/the-art-of-doing-nothing-building-the-to-dont-list/</link>
        <guid>https://www.viget.com/articles/the-art-of-doing-nothing-building-the-to-dont-list/</guid>
        <pubDate>Wed, 04 Mar 2026 11:20:00 -0500</pubDate>
        <author>Annalisa Kleinschmidt</author>
                  <category>Design &amp; Content</category>
                  <category>Tooling</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Rethinking the concept of your to-do list and ever-growing checklists, our <a href="https://www.viget.com/articles/the-point-of-pointless-corp-in-the-ai-age/">hack-a-thon</a> team decided to flip the script. We didn't want to build another app that tells you what to do; we wanted to build one that rewards you for what you don't do.</p><p>Meet the To-Don’t List: Productivity’s mischievous twin. It’s a gamified habit tracker where "doing nothing" is the ultimate achievement. Instead of checking off tasks, you’re resisting temptations. Whether it's "Don’t check social media before noon" or "Don’t eat the whole cake," every moment of restraint earns you progress.</p><h3><strong>Design &amp; Experience</strong></h3><p>We wanted the app to feel like a cozy garden, inspiring growth and mindful habits. We leaned heavily into an 8-bit pixel art aesthetic, drawing inspiration from <i>Stardew Valley</i>, <i>Pokémon, and Tamagotchi</i>. We crafted a logo with a pixel script font paired with a delicate plant sprout. Riffing on the garden elements, we included falling cherry blossom petals for a login transition. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0b94c6938cc5fb29053584e8fdace98a3b3078f9207845a8df6d3ee953831090" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0b94c6938cc5fb29053584e8fdace98a3b3078f9207845a8df6d3ee953831090 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=017f47b6c898e781dc8a6bdb9a7cc9f697b97f202619dfe176158ca9a7d53e06 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=e69687293bfc4378bafe4b6a76be596cbf19499c4f534e267f1cb5b301186d7e 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=458e42ee068458715886a4b8aa6773e3bea3518a621ebfc4bb6eef2a74bd829d 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f4adcd37112d20cc8621b843c5a0537bb8f50f7981c39e60a2a4ccb1a2785521 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6e5738b830f30c0abd2a2f0eb56509268993ec413c840a81d536bcadaf43f94e 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e356367d4735d3db9e4d30534df83f8f0daff4014668c7526b0c469dcb8d5792 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b56b0743006ac720d72b49b4e271d147c2c9edce9e197017be1e553acf676284 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=bad0a60d7c1032e9bd87e7d2a39d27a01e29e351a80a6636844764239b305661 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5OTksImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=2f38d200352ec9033736c19a2b09cfc3b456a7ac5deb4b07df503f9021d5de21 1999w" width="360" height="283" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Our rewards system was devised around giving users plants they can collect and add to a garden when they succeed at resisting an item on their to-don’t list. Instead of checking boxes, users choose between "Resisting" or "Caving In.” As users level up in their habit tracking journey, they’ll collect plants and grow an ever-expanding isometric garden. Our pixel plant garden was grown with the help of AI image generation using ChatGPT and Nano Banana. As users progress, they’ll receive increasingly rare and unique plants. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d5260916653bec1035142dcaafea855d560dbed6fb199e79a4be439f09370c85" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d5260916653bec1035142dcaafea855d560dbed6fb199e79a4be439f09370c85 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=111ee15fb197f7ee171d945374a6bda9890ee5c9ce8b44bc4dfbb1bb01997736 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5dc747372e91186fdb32b3f86eafdd5d6ab389ce04d504c218068c3114f13edd 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b0f9f265e204f6f01bea2874caf3d7ebc728cd154ccc0f1e8b595291878fcec6 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=f0addf2d74ff45c1ed0d5ae94b28f484dfbf4088170a55cb75a17d5ee3cdaf03 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=74f303855686519dbd7dcd10dc123d7623ae0864c6445abd645924dbe9173944 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=628be474e9f91944cf90d7ed700fefea45cd976a379344b794824171e3b93d6f 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=28ddb53e534d569bf3bfb30051b42240d3102432e9d347fc6dc50a44ec463318 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a09e88dc8abdf5f1cb3d7befb47b6b440662572d0a63051d8a42212dc1646482 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZpZ21hMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5OTksImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=722967933ae7a9ad12e1d69dbcd698a706a8dba5548ccec8b15b1e7811063128 1999w" width="360" height="184" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3><strong>The Build: Surfing the "Vibe-Coding" Waves</strong></h3><p>We used this hackathon as a laboratory for agentic workflows. Rather than writing every line of code manually, we leaned into a "vibe-coding" approach, iterating through prompts and managing a fleet of AI agents.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a5e57d6c0724fd77c6683d4681a1867e9657c79896d81b9e03407f40f58873dd" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a5e57d6c0724fd77c6683d4681a1867e9657c79896d81b9e03407f40f58873dd 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=d560ef6dcdc8e5c590f138280740b2ef8b14ded6d990aab78220f777413c1f08 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1fe4497bb9a5c1253d9824f173c50c1df872d293fa04f6704488ebad7e3dff93 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=62817ae26e16d5496228a386d7fe1ff20a8e32531842cde19601a4b4ab755c22 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=94e5294c6d32d8539ef26373aec1db103ea8e71c748740f8f6d426d68159e42e 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=73a1fb3b842ac49b3abdb1c79d0bcc416e9127600ac987d1913bbcb1c55cf190 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=e8fa272bc2e4cb4b2912ca5179c7b3aedeb80b29a2c062544b0636847f7685b7 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9e4e39383697e51bb1bf682ee24409698f0bfe5db9dc8dee0ebad9f6539d58ee 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlZlcnNpb24yLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTgwOCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=57399399fa1be3187f4ced55e423c988f92046072fb54e716d0e07c8d8191bc0 1808w" width="360" height="118" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Starting out with wireframes in Figma, we decided to feed the core app flow into Gas Town to begin building the app. As we continued iterating on wireframes and getting into high-fidelity design comps, we continued to feed our Figma output into Gas Town for a rapid iterative development process. Claude was the main agent under the hood supporting this. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d5f79e22533c7bf1657ffbfd622bb659e07ffff31dff3bb46a381026a76f718e" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d5f79e22533c7bf1657ffbfd622bb659e07ffff31dff3bb46a381026a76f718e 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=ede9872542d90235be0911ff18188fa6d977fcda4b9fa721732d275a50321eb6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a68a3712b2a778218894b6b7a3e6fdf8094ca2da17f2956210a07dc0a53630b2 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1bec5739d0002301676299865a05927d6e1da8da3d29a67acf203e8c3fc548a3 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=8c7cb0da869da6cda43ebf8cb5971f3e72cb55eb3dc5c8ce8401ed0c06d6cc35 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=7a8b592b6b752bdbbecf97c22c82a975a252eced5f59175134be7057c017b4c6 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkNvZGVfMjAyNi0wMi0yNC0yMjIxNTRfaG51bC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0MjIsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6cc8cb7487df4b1f88c7bfea9cda337370bbbc38b669f93e95614f14fca9c3cc 1422w" width="360" height="107" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3><strong>The Gas Town Experiment</strong></h3><p>Our experimental agentic framework used Gas Town, with Claude Code as the agent runtime. For deployment and hosting, we used Vercel. While this framework allowed us to bring the app live almost immediately, it wasn't without its quirks.</p><p>Overall, this approach is pricey and burns through usage tokens at record pace. While a significant amount of progress was made over a short period of time, it still requires a skilled human in-the-loop to supervise and troubleshoot.</p><p>Gas Town is a strange place on your machine where you act as an Overseer. At its core it is a workspace manager that is trying to help you coordinate multiple agents working on different things across multiple projects with a git-backed context persistence layer. For this experiment, we were only working on a single project, or what Gas Town calls a Rig.</p><p>Our Gas Town "workforce" consisted of a plethora of agents. Some of those agents were persistent and are still around, while others joined for a little while before disappearing into the ether.</p><p>Here’s what our workforce ended up looking like with some agent counts for context:</p><ul><li><strong>Town Agents:</strong><ul><li><strong>The Mayor (1):</strong> The primary AI coordinator who knows about all the projects and agents. Their job is to oversee the town.</li><li><strong>The Deacon (1): </strong>A patrol agent whose whole job is to remind the town's workers to do their job.<ul><li><strong>The Dogs (3): </strong>The Deacon’s personal crew, they handle maintenance and handyman work so the Deacon can stay focused on the patrol.</li></ul></li></ul></li><li><strong>Rig Agents:</strong><ul><li><strong>Witness (1): </strong>The Witness patrols the Polecats and the Refinery to make sure they keep their work moving along.</li><li><strong>Refinery (1): </strong>A dedicated engineer agent who handles the Merge Queue to make sure that all the changes are merged to main one at a time and that none of the work is lost to a bad merge.</li><li><strong>Polecats (0 - 15+): </strong>Ephemeral workers who show up to work on a ticket, produce a Merge Request, and hand it off to the Merge Queue.</li><li><strong>Crew (2): </strong>The Crew are persistent agents on the Rig who work directly for the Overseer (human in the loop). They are similar to the long lived sessions you might already be having with your favorite coding agent.<ul><li><strong>Jimmy: </strong>Jimmy acted as a dedicated coding escape hatch when a complex enough task like the garden rendering system needed a human in the loop to handle, or when it was faster to work directly with an agent instead of opening a ticket for a Polecat to handle.</li><li><strong>The Planner: </strong>Planner was the most important member of the Crew. They were where we went to have context-aware planning and architecture design sessions. The Planner was responsible for building the tickets, assembling them into Convoys (units of work that are tracked for delivery), and eventually mailing the Mayor to let them know that a Convoy was ready to dispatch.</li></ul></li></ul></li></ul><p>A word of caution: Gas Town is fascinating, but weird, and we would echo its author’s own disclaimers “WARNING DANGER CAUTION” and “You probably don’t want to use it yet.” We wouldn’t recommend this app development approach, but it was an interesting exploration in rapid prototyping. At the end, we netted out with 140 commits and 108 tickets to build the final result. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=fc1f4f59f9473f7a71087e6455558749de6cc16c55725eda7722da9610b06c95" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=fc1f4f59f9473f7a71087e6455558749de6cc16c55725eda7722da9610b06c95 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=0ded015e81c0faf76c556e99687ff0b1c1da2ec79aa13507ac6e13484b6da348 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=25b32d8d4edd85bab469e8ef9ab810b63992548a4d996e9d9048d04be481c5a8 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=7b64971216e90a48f5f58a77220ecd347f7bb3fd20a471a416423f08a52080c8 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a38971b129e36e268654802c49049ad307ce87e855e055e44f080e6f60abc422 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=efc4dfbf1c74e0ae4b8e9e76556715ff4b9a91ef8d2f2b149f8b6a3fc809f858 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=71d8bae8ff0aa4ffb92e7344a556a33202970ae445b22537560f855ca2048325 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=0af253a24b8806e9ba18f1ccd4186be12c9828516f2fedca86570cde15206d81 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxOTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=28755817a4157cfd802ad7b4213ab9f9517a8fc81342abf4505882183254b870 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRvLURvbnQucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyMDUwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c5ba01fd78c6742a0d201acd3b1680ce6949b559dcb53418ae5c3ec063a12310 2050w" width="360" height="253" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3><strong>Key Takeaways &amp; Lessons Learned</strong></h3><p>Building with a fleet of AI agents changed the way we thought about rapid prototyping. Here’s what we walked away with:</p><ul><li><strong>AI as a Spark Plug</strong>: AI-generated outputs often provided a "twist" on an idea that sped up some iteration and brainstorming.</li><li><strong>The Cost of Speed</strong>: Agentic workflows get you to an MVP incredibly fast, but they come at a price premium. High token usage means you need to be strategic about when to let the agents run.</li><li><strong>Human-in-the-Loop is Mandatory</strong>: Agents can build the skeleton, but crafting the core experience and polished interface requires nuanced expertise and guidance from a human. </li></ul><h3><strong>The Verdict</strong></h3><p>Is the world ready for a fleet of AI agents to build our apps? Maybe not entirely. But for a hackathon project, it allowed us to dream big, move fast, and build a cozy garden to help you grow good habits. </p><p>Try it out: <a href="https://todontlist.vigetx.com">https://todontlist.vigetx.com</a> </p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Building Pointless FLF</title>
        <link>https://www.viget.com/articles/building-pointless-flf/</link>
        <guid>https://www.viget.com/articles/building-pointless-flf/</guid>
        <pubDate>Mon, 02 Mar 2026 10:00:00 -0500</pubDate>
        <author>Solomon Hawk</author>
                  <category>Code</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>Pointless FLF is a Slack-first tool for coordinating our weekly internal live show called Free Lunch Friday (FLF). Think: recurring segments, rotating presenters, and a producer brain trying to keep the whole thing from going off the rails.</p>
<p>The product focus wasn’t “make the show better.” The show is already <em>pretty good</em>. The focus was <strong>everything around the show</strong>: the coordination overhead that repeats every week, like slot filling, gentle nudges, run-of-show drift, and the constant “wait, what’s the plan right now?” when state is distributed across humans and Slack scrollback.</p>
<p>This is the story of building the app <em>and</em> the workflow used to build it with agents: what worked, what didn’t, where tests helped (later), and what it feels like when your tools have an internal state you can’t inspect.</p>
<p><br />
<figure style="max-width: 46em; margin: 0 1.5rem;">
<video autoplay loop muted playsinline width="960">
  <source type="video/mp4" src="https://assets.viget.com/pointless-flf-overview-compressed.mp4">
</video>
<figcaption class="rich-text" style="margin-top: 1em;">
  A quick whirlwind tour of some of the app's feature.
</figcaption>
</figure></p>
<span id="the-problem-the-uncertainty-tax"></span><h2>The problem: the uncertainty tax <a class="anchor" href="#the-problem-the-uncertainty-tax" title="Direct link to The problem: the uncertainty tax" aria-label="Direct link to The problem: the uncertainty tax">#</a></h2>
<p>Most of the work isn’t “doing the show.” It’s maintaining shared state: who’s in, what’s next, what changed, and what’s still missing. When the shared state is implicit, the system generates extra traffic, pings, follow-ups, and duplicate questions just to keep reality synchronized.</p>
<p>Every week someone needs to:</p>
<ul>
<li>find people to fill “quickshare” slots</li>
<li>nudge presenters through prep (opt-in, non-annoying… ideally)</li>
<li>keep a run-of-show coherent as it changes</li>
<li>handle last-minute swaps without melting the producer</li>
</ul>
<p>In the baseline workflow, state lives in two places:</p>
<ol>
<li>Slack messages (scattered, non-authoritative, and sometimes poetic)</li>
<li>people’s heads (authoritative, but not queryable)</li>
</ol>
<p>This works until it doesn’t. The cost spikes right when you want stability: during the live show, when everyone’s attention is already spent.</p>
<p>So the goal was simple: <strong>reduce ongoing cognitive load and coordination labor</strong> without creating a new job titled “person who maintains the coordination tool.”</p>
<span id="product-philosophy-assist-dont-overwhelm"></span><h2>Product Philosophy: assist, don’t overwhelm <a class="anchor" href="#product-philosophy-assist-dont-overwhelm" title="Direct link to Product Philosophy: assist, don’t overwhelm" aria-label="Direct link to Product Philosophy: assist, don’t overwhelm">#</a></h2>
<p>I set constraints early and treated them like product requirements, not vibes:</p>
<ul>
<li><strong>Assist, don’t enforce.</strong> No readiness policing. No mandatory status updates.</li>
<li><strong>Opt-in by default.</strong> It should help even if adoption is partial.</li>
<li><strong>Tolerate mess.</strong> Reordering, missing info, and late changes are all normal, not error states.</li>
<li><strong>Low-noise.</strong> If the tool spams the channel, congratulations: you made Slack worse.</li>
</ul>
<p><strong>Tools that try to do too much can become more of a hindrance than a help.</strong> The “feature ceiling” matters as much as the feature floor.</p>
<span id="what-i-built"></span><h2>What I built: <a class="anchor" href="#what-i-built" title="Direct link to What I built:" aria-label="Direct link to What I built:">#</a></h2>
<p>The system ended up as three pieces, intentionally biased toward Slack.</p>
<span id="slack-bot"></span><h3>Slack bot (primary surface) <a class="anchor" href="#slack-bot" title="Direct link to Slack bot (primary surface)" aria-label="Direct link to Slack bot (primary surface)">#</a></h3>
<p>Slack already held the social reality of coordination, so the bot needed to live there:</p>
<ul>
<li>one weekly <strong>anchor message</strong></li>
<li><strong>the thread is the control plane</strong></li>
<li>updates via <strong>message edits</strong> (so the channel doesn’t become bot confetti)</li>
<li>slot claim/unclaim + producer controls + live “what’s next” state</li>
</ul>
<span id="web-app"></span><h3>Web app (producer control + visibility) <a class="anchor" href="#web-app" title="Direct link to Web app (producer control + visibility)" aria-label="Direct link to Web app (producer control + visibility)">#</a></h3>
<p>Slack is great for quick actions; it’s not great for “dense editing.” The web app is for:</p>
<ul>
<li>producer management</li>
<li>schedule editing / reordering</li>
<li>clearer overview of current state for contributors</li>
</ul>
<span id="notion"></span><h3>Notion (optional, read-only archive) <a class="anchor" href="#notion" title="Direct link to Notion (optional, read-only archive)" aria-label="Direct link to Notion (optional, read-only archive)">#</a></h3>
<p>It’s very easy for a Notion integration to turn into “maintain the Notion integration,” which I expressly didn’t want so the rules were strict:</p>
<ul>
<li><strong>read-only</strong></li>
<li>auto-generated from Slack-backed state</li>
<li>no manual data entry required, ever</li>
<li>tool works fully without Notion</li>
</ul>
<span id="the-process"></span><h2>The process: <a class="anchor" href="#the-process" title="Direct link to The process:" aria-label="Direct link to The process:">#</a></h2>
<p>Agent workflows have a brutal property: they amplify whatever you give them. If the inputs are vague, you don’t get “a vague result”—you get a very confident, very detailed version of the wrong thing. Classic Garbage In, Garbage Out.</p>
<p>So I deliberately didn’t start by “letting the agent code.” I started by tightening the inputs: a PRD, explicit acceptance criteria, and a technical plan that forced decisions into daylight. That up-front definition work wasn’t process theater; it was how I kept the build from iterating quickly in the wrong direction.</p>
<blockquote><p><strong>ideas → specs → plans → milestones → tasks</strong></p>
</blockquote>
<p>This process should be familiar. It’s a pattern that already works outside of agentic workflows but it’s also a superpower. If you want agent-driven development to stay coherent, you need a pipeline that actually produces durable artifacts.</p>
<p>Here’s how I approached it.</p>
<span id="1-ideation-prd-acceptance-criteria"></span><h3>1) Ideation → PRD + acceptance criteria (ChatGPT) <a class="anchor" href="#1-ideation-prd-acceptance-criteria" title="Direct link to 1) Ideation → PRD + acceptance criteria (ChatGPT)" aria-label="Direct link to 1) Ideation → PRD + acceptance criteria (ChatGPT)">#</a></h3>
<p>I used ChatGPT early to convert a fuzzy idea into something testable:</p>
<ul>
<li>problem framing</li>
<li>PRD draft</li>
<li>acceptance criteria</li>
</ul>
<p>Acceptance criteria are the difference between shipping vibes and shipping something that actually meets its goals.</p>
<span id="2-prd-technical-implementation-plan"></span><h3>2) PRD → technical implementation plan (Codex, Plan Mode) <a class="anchor" href="#2-prd-technical-implementation-plan" title="Direct link to 2) PRD → technical implementation plan (Codex, Plan Mode)" aria-label="Direct link to 2) PRD → technical implementation plan (Codex, Plan Mode)">#</a></h3>
<p>Next, those docs became inputs for GPT-5.2-Codex in <strong>Plan Mode</strong>. The job here was not “write code.” It was:</p>
<ul>
<li>propose architecture</li>
<li>surface risks (Slack mechanics, state, integrations)</li>
<li>iterate on decisions until the plan was coherent and sequenced</li>
</ul>
<span id="3-technical-plan-milestones-scopes"></span><h3>3) technical plan → milestones/scopes (Codex + a custom skill) <a class="anchor" href="#3-technical-plan-milestones-scopes" title="Direct link to 3) technical plan → milestones/scopes (Codex + a custom skill)" aria-label="Direct link to 3) technical plan → milestones/scopes (Codex + a custom skill)">#</a></h3>
<p>I used Codex again for decomposition. I wrote a custom skill that turns the technical plan into milestone-shaped scopes of work.</p>
<p>The output wasn’t just a document. It became operational: <strong>epics and tasks</strong>, ready to execute.</p>
<span id="4-milestones-execution"></span><h3>4) milestones → execution (Beads) <a class="anchor" href="#4-milestones-execution" title="Direct link to 4) milestones → execution (Beads)" aria-label="Direct link to 4) milestones → execution (Beads)">#</a></h3>
<p>Those tasks were created in <a href="https://github.com/steveyegge/beads"><strong>Beads</strong></a>, which gave me a real work graph. This mattered because:</p>
<ul>
<li>“what’s next?” stopped living in my skull</li>
<li>tasks had acceptance targets, not just vague intent</li>
<li>the agent loop stayed anchored to explicit outcomes</li>
</ul>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOC1hdC00LjMxLjA2LVBNLWFpLWJlYWRzLXRhc2tpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5e43819dbdd47ed249908efc1a656622434481a2dfd4a8cef1811ed948dfb150" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOC1hdC00LjMxLjA2LVBNLWFpLWJlYWRzLXRhc2tpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5e43819dbdd47ed249908efc1a656622434481a2dfd4a8cef1811ed948dfb150 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOC1hdC00LjMxLjA2LVBNLWFpLWJlYWRzLXRhc2tpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=63eeb4ed419ac513c97a3e76a5746126e799856dc520868456aafb045914c12c 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOC1hdC00LjMxLjA2LVBNLWFpLWJlYWRzLXRhc2tpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3MjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a608ad39d2b5896407248cbac2f003c7e8115a3a7901583660b36a44bf0b4ce6 720w" width="360" height="543" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="execution-lets-jam-verify"></span><h2>Execution: “let’s jam” (custom skill) → verify <a class="anchor" href="#execution-lets-jam-verify" title="Direct link to Execution: “let’s jam” (custom skill) → verify" aria-label="Direct link to Execution: “let’s jam” (custom skill) → verify">#</a></h2>
<p>I leaned heavily on a custom skill I wrote and cheekily called <strong>“let’s jam”</strong>, a nod to a wonderful tune: Yoko Kanno’s Tank, performed by The Seatbelts, for the show Cowboy Bebop. It’s basically a structured loop that pushes for:</p>
<ul>
<li>a robust “find the next task” setup</li>
<li>a strong initial attempt</li>
<li>iterative steering (with less re-explaining)</li>
<li>a deliberate “land the plane” finish (integrate, run checks, clean up)</li>
</ul>
<p>One whimsical side effect was that VS Code titled our chat sessions assuming we were in a band, which was fun.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC0zLjU4LjE0LUFNLWNvcGlsb3QtY2hhdC1zZXNzaW9ucy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3add1ed896e8bc7451d81e581a282a4d97c7ffd538f4631590f39f1164f8608c" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC0zLjU4LjE0LUFNLWNvcGlsb3QtY2hhdC1zZXNzaW9ucy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3add1ed896e8bc7451d81e581a282a4d97c7ffd538f4631590f39f1164f8608c 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC0zLjU4LjE0LUFNLWNvcGlsb3QtY2hhdC1zZXNzaW9ucy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4fe1cce2ef608e67c3550e1e639e3c04f35fc50aedba7a3c9908b8b0bf390d4c 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC0zLjU4LjE0LUFNLWNvcGlsb3QtY2hhdC1zZXNzaW9ucy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjcyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=74f282c865a7fcd828f5c74537ec9c1062d209203e7f1b6b282cec9a607445ac 720w" width="360" height="571" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="a-note-on-tests"></span><h3>A note on tests (timing matters) <a class="anchor" href="#a-note-on-tests" title="Direct link to A note on tests (timing matters)" aria-label="Direct link to A note on tests (timing matters)">#</a></h3>
<p>Tests weren’t the first lever I pulled. Early on, speed came from getting the architecture standing and tightening the integration loop. Once the feature set stabilized, tests became a force multiplier: they made refactors safer, caught regressions quickly, and reduced the “did I just break something?” tax.</p>
<p>They did add friction. Writing and maintaining tests slows the loop slightly, but by the time they showed up, that tradeoff was exactly what I wanted.</p>
<p>A rough phase split:</p>
<ul>
<li><strong>Early:</strong> architecture + feature shape + integration loops</li>
<li><strong>Later:</strong> verification + refactor confidence + fewer regressions</li>
</ul>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=585fcf909c59e1f450ec5d13a9f498c040449565acdbc16d52e3c4e9dd1c6292" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=585fcf909c59e1f450ec5d13a9f498c040449565acdbc16d52e3c4e9dd1c6292 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a3c6634222da060d76df05cdf0205985082103d74cd7344c20152be4eb1647b0 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=dc8b5e00dc43dcadf6b4c654bb25923babcd2721978c10b226cc166a6c14108c 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e653401a14aa07bbc55b5104d3f3981af2af0b7cfc33105edcad1d3774075426 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=77ecd5617d0d59a9fe478fae6861f241c2a85caa70d8522f9422ec099a24e4df 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=53e06f0e73bb5b9ad27032eac284d3c0c722f33b2fe61256055955ef71134d54 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjAxLjIyLUFNLWd1YXJkLXJhaWxzLXdvcmtpbmcucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=5e392b45abf27b3e8f199df6230b211fd3dec11378f24aae7993870bc0979d5a 1470w" width="360" height="172" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="what-got-weird-failures-friction-and-the-shadow-realm"></span><h2>What got weird: failures, friction, and the Shadow Realm™ <a class="anchor" href="#what-got-weird-failures-friction-and-the-shadow-realm" title="Direct link to What got weird: failures, friction, and the Shadow Realm™" aria-label="Direct link to What got weird: failures, friction, and the Shadow Realm™">#</a></h2>
<p>This part isn’t “lessons learned” so much as “what you should expect if you do this” (at least today).</p>
<span id="context-window-decay-orchestration-overhead"></span><h3>Context window decay + orchestration overhead <a class="anchor" href="#context-window-decay-orchestration-overhead" title="Direct link to Context window decay + orchestration overhead" aria-label="Direct link to Context window decay + orchestration overhead">#</a></h3>
<p>Late in long sessions, especially around ~¾ context usage, I saw quality drop. Not total collapse, but enough that I had to steer more and be more explicit. Conversation summarization (compaction) effectiveness varied in my experience. Sometimes it led to another round of good productive work and other times it lost important context.</p>
<span id="task-granularity"></span><h3>Task granularity <a class="anchor" href="#task-granularity" title="Direct link to Task granularity" aria-label="Direct link to Task granularity">#</a></h3>
<p>Some tasks were too small. That sounds tidy on paper, but it increased overhead and made context management worse: more session switching, more repeated setup, more opportunities for drift, and less benefit from the agent holding a coherent mental model of the system.</p>
<span id="intermittent-platform-failures-safety-filter-hiccups"></span><h3>Intermittent platform failures + safety filter hiccups <a class="anchor" href="#intermittent-platform-failures-safety-filter-hiccups" title="Direct link to Intermittent platform failures + safety filter hiccups" aria-label="Direct link to Intermittent platform failures + safety filter hiccups">#</a></h3>
<p>I hit the usual “tooling is still maturing” stuff:</p>
<ul>
<li>responses cleared due to content safety filters (in contexts that were… not spicy)</li>
<li>intermittent 500s / request timeouts</li>
<li>occasional retry loops that just drain momentum</li>
</ul>
<p>These aren’t catastrophic, but they can be frustrating.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC00LjE5LjM3LUFNLWNvcGlsb3QtZXJyb3JzLWFuZC1zYWZldHktd2FybmluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d2a4870b36bd2da2d1b4a4ed10859d631f36f88568567538b7e3533f1ead164d" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC00LjE5LjM3LUFNLWNvcGlsb3QtZXJyb3JzLWFuZC1zYWZldHktd2FybmluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d2a4870b36bd2da2d1b4a4ed10859d631f36f88568567538b7e3533f1ead164d 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC00LjE5LjM3LUFNLWNvcGlsb3QtZXJyb3JzLWFuZC1zYWZldHktd2FybmluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=965654d3f12e5de92a7046acdb1f678558305edf8ffea83657a808817caf6d62 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC00LjE5LjM3LUFNLWNvcGlsb3QtZXJyb3JzLWFuZC1zYWZldHktd2FybmluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=e6bc1fd765f409428f12ebfc87bb1b2378109b9da12608bc30166e94e9464f05 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC00LjE5LjM3LUFNLWNvcGlsb3QtZXJyb3JzLWFuZC1zYWZldHktd2FybmluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=cd1c4ded4534375741d42c8d71ced37faa08f3ccd2bf6a28118732df17e821ce 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0wOS1hdC00LjE5LjM3LUFNLWNvcGlsb3QtZXJyb3JzLWFuZC1zYWZldHktd2FybmluZy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNDIsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=1b337985166be550094702a929bb560b72a3aa26db2fc3c5129c4a5df1f68df6 1142w" width="360" height="290" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="when-something-breaks-and-you-cant-see-why"></span><h3>When something breaks and you can’t see why (aka: debugging the Shadow Realm) <a class="anchor" href="#when-something-breaks-and-you-cant-see-why" title="Direct link to When something breaks and you can’t see why (aka: debugging the Shadow Realm)" aria-label="Direct link to When something breaks and you can’t see why (aka: debugging the Shadow Realm)">#</a></h3>
<p>The gnarliest failure mode wasn’t “the code is wrong.” It was “the harness is wrong and I can’t prove why.”</p>
<p>I got stuck in persistent patch application failures that didn’t match the filesystem reality I was seeing. I tried to debug it like a normal developer: is the agent working against a cached index? Is there a stale workspace view? Is there an internal representation that drifted from the repo?</p>
<p>The problem is: <strong>that layer is mostly opaque.</strong> You can observe symptoms: patches failing, weird state drift, but you can’t instrument the internal machinery to confirm the root cause. It’s a “shadow realm” because it’s real, it affects everything, and you can’t open the door and look inside.</p>
<p>That changes how you work:</p>
<ul>
<li>keep diffs smaller</li>
<li>checkpoint more often</li>
<li>treat renames and big refactors as higher-risk moves</li>
<li>assume some failures are environmental, not logical, and respond accordingly</li>
</ul>
<p>This is also where “agent trust” gets nuanced. It’s not “I trust the agent.” It’s “I trust the loop <em>when the environment is behaving</em> and I have verification hooks.”</p>
<span id="integration-iteration-friction"></span><h3>Integration iteration friction (ngrok limits + proxying) <a class="anchor" href="#integration-iteration-friction" title="Direct link to Integration iteration friction (ngrok limits + proxying)" aria-label="Direct link to Integration iteration friction (ngrok limits + proxying)">#</a></h3>
<p>To iterate on Slack/Notion integrations locally, I used ngrok which worked great until I hit the free plan limit. I ended up paying $10 for the hobby plan, which kept everything going. With more contributors, it can be annoying to juggle ngrok-based authorized callback and redirect URLs in external systems (Slack), but flying solo worked out just fine.</p>
<span id="late-game-ui-overhaul-models-as-specialists-screenshots-as-critique-input"></span><h2>Late-game UI overhaul: models as specialists + screenshots as critique input <a class="anchor" href="#late-game-ui-overhaul-models-as-specialists-screenshots-as-critique-input" title="Direct link to Late-game UI overhaul: models as specialists + screenshots as critique input" aria-label="Direct link to Late-game UI overhaul: models as specialists + screenshots as critique input">#</a></h2>
<p>Early on I brought in brand hints from viget.com’s codebase which led to a reasonable first look.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-2000" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=79b3d529e3ae0b1338425406f665b219305867d04fe9845bdc0017380154562b" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=79b3d529e3ae0b1338425406f665b219305867d04fe9845bdc0017380154562b 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=13c8b23d1fc758a7725deb7b8ec2286f9c83bcadd98c0651619f574df5db71bf 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f198afe2522e2ef22aaef007994679bd6783e0dd45f462450f42a655c7bf3d78 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=3c9ad54d6d64f4ad424de42512bce22b7dc0db597f1e080de9ce4577cae5b3c6 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=caaf23d3195aa1a663a95a0bf2780b3f4da09ea1d3144c6edcbdac73529a48aa 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c8df19e42d7b75831b721daa834e915a5ab2d1db9fc6fe5e5d40b64f9081248d 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=78baadc30a716b7f5b58db3d80b92484f13e52b19d8e5baab9c8932376863843 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=e37e65706692a2e1bfe3c3715c5698a42bc2ca0b0e1adcc0249d3547aa6df338 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=eaf8bc038fed49e7b4eac8c605c3c0d91da2bed4b6f969409d24ef226a2495ac 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9aeefa4caf190bfe0deb2d418240e4845706954db3948df7cc382bdd9dac0d62 2160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=425a1236d89506b771418434924f9ea01c81f7a01f0bc0b9e06c7487842618dc 2360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4c18a7268b41c86450a588aa91c44806a7ed9511125d5eb9faf9654957f75cbe 2560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6Mjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=08f5ad195b35df0eec8e8128d3c5e08dbf3fd5b403376e2dd0c6e69a9d783256 2760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0yLjQwLjA4LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6Mjc2MiwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=490cb7a2781e90226f59456f018c15fcd36d4cdeff1d06cea814521c99f36f13 2762w" width="360" height="195" alt="" sizes="(max-width: 125em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>Once the core feature set stabilized, I did a UI system pass aiming for a “productivity tool” feel:</p>
<ul>
<li>reduce excessive roundness</li>
<li>unify interactive element styling</li>
<li>strengthen typography hierarchy</li>
<li>harmonize color usage</li>
<li>remove “AI slop” (extra labels, redundant info, awkward density)</li>
</ul>
<p>And here’s where things settled by the time FLF rolled around:</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-2000" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e7c44c74356f44f7f56e3a5852a745f495c5da003e47d750869a17b59dec5c5a" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e7c44c74356f44f7f56e3a5852a745f495c5da003e47d750869a17b59dec5c5a 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3995f968010b1a3e21c86de4206f6683b358606e20fd0a008de14d24e3af517c 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=98b8ac4036775c3c93496fe747b9ad6e1c47a83fc58158c9eb97e800435e6253 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=19f509c1e9fd827d36a48d7d94561f560584c716860a7fe52a6e1b1d3aef9b3f 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4134c121261fcd94201bc21e941a22d864b0c7c85c538c2d11c53c933512adf9 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1a62b96e81695bc581ba32dde7a1a7ee1026e223c40e667a696d77a8356e39a2 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8d566256abc12726fb17913a6ac3ccc4a4b44c5079b6ec0af6c936c67ae7f5a8 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=3abb30c0436b5b2f42deb460c51eb0dbdfe20efe04183d3514304274f9300680 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxOTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=fb2f7c3e059c2c79d112a27a746946cb341f5ce316c2894165bea0c856b6eb2c 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4a09424ca961cea9058b73dc71444dbfca5aaaac477aeb54aca8fa79dd039e8b 2160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ae70631ef132fd3bf774f959b5e4ce73ece969f16929eca7d43f744930da2a60 2360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyNTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=e82f21533865575ad8df75cd68b3adfb8f0997412bd7790178c934151fe0acb4 2560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyNzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8a8487c2423b03256e82ece0fc4a2ab1f2668bc45168db75e96ae02ac05b8700 2760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoyOTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=425c2fc4f6a9d79994dd85bae655ce24ecd796f369f09efe1b912969113021d4 2960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlXzIwMjYtMDItMTMtMjAzNjM1X2x4aWsucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozMDE2LCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c5a0ffb8d8e302e2e467b8bbf0dbbdabece674f717219c8e2c2bfdecc7c96ae4 3016w" width="360" height="204" alt="" sizes="(max-width: 125em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>A practical discovery: different models are better at different jobs.</p>
<ul>
<li>Codex was great at systematic code changes</li>
<li>Gemini was useful as a screenshot-based design critic, especially for calling out:<ul>
<li>redundant UI elements / duplicate dates</li>
<li>“mystery meat” icon actions</li>
<li>empty state bloat and low information density</li>
</ul>
</li>
</ul>
<span id="results-and-reflection"></span><h2>Results and reflection <a class="anchor" href="#results-and-reflection" title="Direct link to Results and reflection" aria-label="Direct link to Results and reflection">#</a></h2>
<p>It probably won’t surprise you to hear that I wrote less than 1% of the code. I did end up having to make <em>many</em> small, surgical edits mostly to help steer Codex to avoid certain patterns (lead by example) or help debug complex edge cases at the intersection of layout motion and drag interactions. However, there was still a lot of effort involved in getting to this end result which required strong domain expertise (DOM quirks, preferred tools/libraries, application architecture).</p>
<p>One fun thing I did while waiting on a loop is have Codex build a dev metrics report skill that uses scripts for deterministic measurement.</p>
<p>Here are some stats:</p>
<ul>
<li><strong>36,094</strong> total application LOC    </li>
<li><strong>248</strong> commits over <strong>6 active commit days</strong> (2026-02-08 → 2026-02-13)</li>
<li>Tests:<ul>
<li><strong>67</strong> unit/integration test files (<strong>11,076 LOC</strong>)</li>
<li><strong>347</strong> unit/integration test cases (test/it)</li>
<li><strong>8</strong> E2E spec files (<strong>698 LOC</strong>)</li>
<li><strong>11</strong> E2E tests</li>
</ul>
</li>
<li>Coverage highlights:<ul>
<li><strong>apps/api:</strong> <strong>94.87%</strong> lines</li>
<li><strong>apps/web:</strong> <strong>91.38%</strong> lines</li>
<li><strong>packages/db:</strong> <strong>87.08%</strong> lines</li>
<li><strong>packages/slack-workflows:</strong> <strong>97.36%</strong> lines</li>
<li><strong>packages/api:</strong> <strong>100%</strong> lines</li>
</ul>
</li>
<li>Scope/docs alignment:<ul>
<li><strong>8/8</strong> planned feature groups built</li>
<li><strong>4/4</strong> acceptance docs verified</li>
</ul>
</li>
</ul>
<span id="costs"></span><h3>Costs <a class="anchor" href="#costs" title="Direct link to Costs" aria-label="Direct link to Costs">#</a></h3>
<ul>
<li><strong>1 Copilot Pro subscription</strong> (<strong>$10/mo</strong>, includes <strong>300 premium requests</strong>)</li>
<li>plus <strong>at least $60</strong> in additional inference</li>
</ul>
<span id="closing-the-pipeline-is-part-of-the-product"></span><h2>Closing: the pipeline is part of the product <a class="anchor" href="#closing-the-pipeline-is-part-of-the-product" title="Direct link to Closing: the pipeline is part of the product" aria-label="Direct link to Closing: the pipeline is part of the product">#</a></h2>
<p>If you want to improve your agentic workflows, invest in building the pipeline that converts ideas into well-defined tasks.</p>
<p><strong>PRD → acceptance criteria → technical plan → milestones → tasks → evals → verified changes</strong></p>
<p>What makes that workflow hold up in practice:</p>
<ul>
<li><strong>Docs make intent durable.</strong> You can’t iterate on a vibe.</li>
<li><strong>Plans force decisions early.</strong> I’d rather argue about architecture in text than reverse-engineer it from git history.</li>
<li><strong>Milestones/tasks create a work graph.</strong> “What’s next?” stops living in your head.</li>
<li><strong>Verification is a phase tool.</strong> Bring tests and gates in when they accelerate refactors and reduce regression risk, not when they’d just slow exploratory shaping.</li>
<li><strong>Design for imperfect tools.</strong> Expect intermittent failures, and expect some failures to be opaque.</li>
</ul>
<p>That last point is the weird one. Agent-driven development often feels like normal software engineering… right up until it doesn’t. Sometimes you’re debugging code; sometimes you’re debugging a partially hidden runtime: caches, indexes, or tool state you can’t fully inspect.</p>
<p>If you plan for that reality, you can ship something genuinely usable without turning the project into a full-time job: bigger task slices (less orchestration tax), smaller diffs, tighter checkpoints, late-stage verification, and a low-noise product surface.</p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>Shelf Help: A better book recommendation tool</title>
        <link>https://www.viget.com/articles/shelf-help/</link>
        <guid>https://www.viget.com/articles/shelf-help/</guid>
        <pubDate>Thu, 26 Feb 2026 10:00:00 -0500</pubDate>
        <author>Melissa Foley</author>
                  <category>Design &amp; Content</category>
                  <category>News &amp; Culture</category>
                  <category>Tooling</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>One of the problems I have as a romance novel enthusiast is finding my next favorite read. I have very specific book interests, but struggle to find exactly what I’m looking for. The book recommendations I get on Goodreads or Amazon don’t really help. Despite knowing what’s in my digital library, they often direct me to books I’ve already read or authors I keep rejecting. </p><p>Like me, many Viget employees are passionate about books, and we even have a #books channel on Slack, a book club, summer books bingo, and an <a href="https://www.viget.com/articles/vigets-favorite-books-of-2025/">annual books roundup</a>. With so many avid readers, I found it fitting to tackle a book-related challenge during Pointless Palooza and pitched a better book recommendation tool.</p><p><a href="https://www.viget.com/about/team/trehnert/">Tommy Rehnert</a> and our top book lover, <a href="https://www.viget.com/about/team/lsweltz/">Laura Sweltz</a>, joined me in the challenge of bringing <i>Shelf Help</i> to life during Viget's <a href="https://pointlesscorp.com/">annual hackathon</a>. Over the course of a few days, we had the opportunity to explore new tools, build something fun, and advance our personal skills. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9e496a14e30aa9f9fc9c7dd001da6aa6b1c46fba9bc78cbe64d6de12c6403fe3" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9e496a14e30aa9f9fc9c7dd001da6aa6b1c46fba9bc78cbe64d6de12c6403fe3 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=eb4c4d62309beafd751f615be62e555838615ac8733c0656a3192b4b4a2067bf 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1592d6831bac6caf6e198c9328d4142b297fc52c988d792ccb6216e34648d3dd 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4397e8353790a4014aa41b8dd1931f356bc94ae4596fa908229b74bd81693399 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=fede6d7f21c8a487d617f2686ba2c5c342a6a7531515d79cbfe9657b7e034836 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6808a324253c60466edc3b5b53ea8575e518078d5290c9e6a2e27ad25884bb8f 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0xMS40OS40MC1BTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=eb6e2bf75e7dc7dcc2f21446965bc1f535073f52a961764c40dbbfe84acd299a 1470w" width="360" height="240" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Researching What’s Out There</h2><p>We started by mapping out the key features of our MVP (minimum viable product), the problems with current options, and the features from the better tools. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=92abc76a392843ad55e26549d7533193ce7e4af6dea1bf4059e9a11b750f52af" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=92abc76a392843ad55e26549d7533193ce7e4af6dea1bf4059e9a11b750f52af 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=7cdb6451996a0987050cd58400bed32ae9c239cc8fb12380ba519a1e97adb83d 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8e79999fbd13bdad769c2bb220bcd1a41ca58f12ef4d0e66309567cbde0eeafc 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=3bb8798f7f55603b98fbbd06d9d7a4f98e6b6fe888b40db2f57659a3436da022 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5d2aab062bf55c4c7ec38753b57d9b8b7bb40bb1c15b050e78b9dacc5a8d6019 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3e9f43dd71454482339a1c3c130a6a2f765d12ebfd5501e0b1e9eb39c246cb47 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1281f1d9b667a27395838f1f803342dfc724a8de2d816f9420264223efdf378d 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=12848c55975da1d4871482aa529723cff1e4d13fe3d79295b600bf21dc594b3f 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=edc324a789f1004a32d90880449d0ab6063b360bd44b04fc5d7c6998fec77a8a 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjA5LjU3LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjA1MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=74672cc58c3e39fcdaf012dce0e1047c9b50651be3d324e8ce35dc4ba0a11d20 2050w" width="360" height="196" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>We reviewed several book recommendation tools. Ones like Goodreads let you pick from a list of pre-determined genres, but don’t let you get more granular than that. A tool like Storybook lets you pick up to five genres and add a list of books and book characteristics you like, but it seems to focus a lot of attention on excluding topics you aren’t interested in. </p><p>This more nuanced approach is definitely a step in the right direction, but book preferences can be fluid and change over time, so it might not be the best way to narrow down what you want to read right now.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE3LjQ0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=52840cf748f38326aba669b53637490cf31e6d1bcf9cb8476041d5c1072cadd7" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE3LjQ0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=52840cf748f38326aba669b53637490cf31e6d1bcf9cb8476041d5c1072cadd7 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE3LjQ0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=957c8211c0cb7cc34ddf3d9d51f620f48949133a798c62339fba1dc21e581f4b 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE3LjQ0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzIwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=e2ba6719bb90f0340b8f43289e14d6df501f319b635527eeba76ab324bb09f1a 720w" width="360" height="494" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>A tool like Whichbook doesn’t provide personalized recommendations but does offer unique ways to browse for books. You can use sliders to refine your preferences across a wide range of moods and emotions, locations, plots, and character traits, including age, race, and sexuality.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=aa8723f6785b8bed79395d1186f74c300ef279666ce50cee5bd20a7af9881bb0" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=aa8723f6785b8bed79395d1186f74c300ef279666ce50cee5bd20a7af9881bb0 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=568609c121f470597ea8d4e4ede651c8329ecc37c7caf427b24d0d44f5e873d5 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=d35fd919ac7e1df7e51213054c289d0bf403e80ad7a227ff2ff1c9d9b949f217 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1ba0812b1bd1b711cd18f4c68c1bad9961de169160db4e45354767baeb6a6575 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=76f392ff13c5e21a0f1af920381d02db16132a4b77af8e7df520a233a91f9f50 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c15f1d2a5f67fdfe5ccd95004b3bc68048a73eace77e1e4a8357eb0506ae1e47 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC00LjE4LjA0LVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=dfe343eb889125ce8b4b59a816dccdf0d077fd33bd951793db169950345cd810 1470w" width="360" height="220" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Determining What We Wanted</h2><p>We wanted to build an AI-led product that lets you use plain language to find book recommendations. The open query format lets you combine variables to focus on the most important things to you in that moment. Things like genres, but also sub-genres and specialties; topics of interest; locations; times of year; styles of writing; authors similar to those you like; length of the book; ease of reading; etc.</p><p>We want to go down the proverbial reading rabbit hole. Right now, these kinds of granular recommendations are common on message boards, social media, and Reddit. But often, they are limited to who is responding in the moment, causing you to miss out on some really good books.</p><blockquote><p> “Give me a cold, atmospheric 'Locked Room' mystery set in a remote snowy location, ideally in Scandinavia or the Swiss Alps. I want the prose to be 'Sparse' and 'Gritty'—nothing cozy. Crucially: do not suggest anything by Agatha Christie or Lucy Foley, and ensure none of the results are in my 'Already Read' library. I’m looking for a book under 350 pages that focuses on psychological tension rather than a police procedural.”</p></blockquote><p>In addition to a plain-language interface, we wanted the ability to import your library to help the AI understand the types of books and authors that interest you most. You can already easily download a CSV file of the books you’ve read from Goodreads. Adding a library also removes any books you’ve already read from your recommendations.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4080bca89f8e2ec9e1edbb5075a7a2799f05d3a4ababc6ffd797411c0f4d6c22" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4080bca89f8e2ec9e1edbb5075a7a2799f05d3a4ababc6ffd797411c0f4d6c22 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f96e3cfb36067cc68f3e0708fa82fa3ef23cb2013488fd886289f85b0f4700c6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=97f96d0751c253d1b94835669cc6044317415b5006853a7a5777f49a22411e72 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=b78b227bf4b870b79d120b208c2d56deea3a91f204920ac69a6ba26a4278d6e7 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=8fe14dc1d6c44cc71ca3c1a35e95bec230fe888a64bb3fdc2c910aab89094c44 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=cb3cd3d9e2e03eb71efbd7c570f8459bbb103c1880c880521060d95c57641904 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c3fd9aa06c238f6cb9a7ec9a81f5a9c55bcfbf05482554504caae2236f81340f 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=521200550cce38bfcd8c84b4e2c94fc3bcb5bf07bfda1b233c1fbe7f9e39567b 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9d554e24bd5a8a76648020a1e70a8369cd76cc6d33451ef2a0830740456386bd 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMi1hdC0yLjEwLjQwLVBNLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MjA1MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=ea70e096be658688223966367b4445deeb7e22b69f2ee10cc239862968c235ce 2050w" width="360" height="160" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Bringing <i>Shelf Help</i> to Life</h2><p>With only a few days to complete the project, simplicity was key. With the list of requirements and potential future enhancements in hand, we got to work making <i>Shelf Help</i> a reality.</p><p>Tommy jumped into Figma to design the screens that would become <i>Shelf Help</i>. Leading with an open query and using an interface similar to most AI products, such as ChatGPT, Claude, and Perplexity, felt like following a pattern users would be familiar with and would help with ease of adoption. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=1ac16760190ee93bc5212dfb018f0502c9d031ac67d81541f9ac2bc325a7e2d3" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=1ac16760190ee93bc5212dfb018f0502c9d031ac67d81541f9ac2bc325a7e2d3 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e1815fd214d8e5811e42595bb337fae6c76a4e68741c089e6b8ca3f76fcc4393 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=93096193eebd9b947288b74badf158669716ea77a5f65be0fa7b98561faa1077 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=667d05547250ededbc6337c2ea7bc4c14b019eb9eff59d604b6f9351f9374cfb 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a48e821087be3c6fb14be88f7301789c7f4cb85037980e3665a274fedd122232 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9a07a58e3d362cacba06b8878a9d8b3847cf9a778fce0714a7baba9b0d81cf4c 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkRpc2NvdmVyeS1Bd2FpdHMucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=2b7d5b11853f2d13ec35c0b43e05ee85424d031276c6467519915766cc8c776f 1470w" width="360" height="234" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The results page provides you with a list of very tailored recommendations, while also showing you how many results have been excluded that you’ve already read. You can click a book to view more details, including a full description, page count, prose style, and publication year.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f0c9c8c89cc77963f8b5716abe48ffeab0c5a26854f7abfeaa8e3253f2245b42" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f0c9c8c89cc77963f8b5716abe48ffeab0c5a26854f7abfeaa8e3253f2245b42 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=cc78435abd135152b3b1b0312671f58d3f9d54c4a3773dfca6b5f072130bd64f 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9e72996ddc7bc4eece17b66d43a35867fa98103bb3695b5b13c47153f55ab763 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=699fc3b6ea19426418134d659b7a30cc4eeadbf1c705a8d119759ea307a052ec 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6f2b50fc98885babcc94ea244726d76dbe8d4f2f4b2a63a721a9e0452eeb7894 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=885fc7fe5b63786aa3cdd41e6aa2b6ff028a0e06b0ca128e00da9cdaf0dea71b 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNwYXJzZS1BcmN0aWMtTXlzdGVyaWVzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=7e7d2815627e0f53d94ecf603edabb9f028395d914d1cea8a74dd6eb6c3604dd 1470w" width="360" height="234" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>If you have read the book, but it’s not in your library, you can click “mark as read” to add it to your library and remove it from your recommendations. The thumbs-up and thumbs-down buttons let you add the book to your to-be-read list in your library or remove it from future recommendations. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=764568d668dc1eb4c2ef2ae636d368349bca41a5cf99ec079468bd8f82b89e03" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=764568d668dc1eb4c2ef2ae636d368349bca41a5cf99ec079468bd8f82b89e03 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a94bd8d28185d2bc29cc69fd9ef5bcf12623b0c388b93939ce17d70fd2e5d3d6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c14674de39c80029b1ea11f8cd0afb465974cf3abee5eb501462b7126a2db0a0 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=7c9cd44b29ddf8ee8e6aacb9936e26c867f640937adb5abe3267c08e2d8b4f36 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=60f9b34676fd3792b43dd0c56c48cd9c20230b41551294f476ce9c728b9f055b 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=60cd2d21dd55c858df1a15330438f492ca017d4e3dfb069f842cfeebada840a7 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFybGVzcy1TZWEucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=90f4ded1c4d780577aa6481dbf7010faa9e9196284aed56ed094d3d17c67b649 1470w" width="360" height="337" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The design also indexes your recent searches on the home screen, allowing you to review recommendations. You can see all your past searches in “The Stacks,” which is organized by query and allows you to search for specific queries, books, or authors.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=1df938c6f7b39929e7f73bac80be5b3edfc3316b7b6398624a23a81b4420a204" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=1df938c6f7b39929e7f73bac80be5b3edfc3316b7b6398624a23a81b4420a204 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e8ca14ba32e16685b8822f666a0f965a089d8e1077f135f5c585a9391dad8f07 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=2ee815f4fb5b878d32ac35631f241204a2ad53f1231db3c8a42c518833496370 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b17fdc8084ae8d7cb68397389631a892aeb25cc1cb6a0a55766ebc87a2ac9037 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=7f34c0198fbe52e369b7649900e007ab0adb0f905413088df689830d5b2b2522 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9128dfa054af77b0dfa55bb6e1622bee502344e3b7ea4682eb369be75ea7b625 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlRoZS1TdGFja3MucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=d6e0679ba33bb2ed69cfbc9f26f98e8cf1b810b14749afc13f304982483f7d41 1470w" width="360" height="234" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Collaborating via Figma, Slack, and Huddle, we worked out the details. Once the design felt good, Tommy used Base 44 to convert the Figma designs into a functional app using a series of prompts, refining as he went.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJhc2U0NC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=61930812afb6a7dda3041de5f67c22489b5ff50cc85e4241338edae1a7b81803" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJhc2U0NC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=61930812afb6a7dda3041de5f67c22489b5ff50cc85e4241338edae1a7b81803 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJhc2U0NC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fa3d482c81065bb7c2397d2f890c94e6a2d5db284d574ec6609bf88f05ac2403 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkJhc2U0NC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjcyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c0a00a372a417eb48ab2954f9de6ca97874c0134a8ea15f647f87e1063fef163 720w" width="360" height="338" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Pros of using Base 44 for this project:</p><ul><li>Easy to build and update through the chat feature</li><li>No coding required</li><li>Produced a fully functional app quickly</li></ul><p>While the process was pretty smooth, there were some cons that developed:</p><ul><li>Not all of the prompts were followed</li><li>Images didn’t load for the book covers</li><li>Unclear what content was scraped to “teach” the AI</li><li>Most book recommendations were fairly dated, with only a few suggestions published after 2020.</li><li>Some book recommendations were for books that don’t exist</li></ul><h2>The Result</h2><p>You can import books you’ve already read to your library, ask for specific book recommendations, save your search results in the stacks, and add books that sound interesting to your to-be-read shelf.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=750793d3b97e4534cee6947f83eae6da153cc72a30f18b60ec95c7b23ee4cb85" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=750793d3b97e4534cee6947f83eae6da153cc72a30f18b60ec95c7b23ee4cb85 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=15a7ce294a4a13bc065c66b3bff68530390d95f9dddd36d5854f3e57fbfdc157 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=2d32e8ea6d1a41114a49fe8919ec25ae63caf3cd45d8fa8151571d2c4ae197b8 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5f79f73f9b413af4d290a6a7ddbc1799dd7076e7be30b083b8f714e6b3f81872 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=645d4ea74e828f03c7dd27d765271c3a9f678a0c283674c85656f9693828a2f8 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=96df1fca6857f10d2e4b1a68ca20b3be4fffd3c05d97af767c345453e3cb050e 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=0b220f5c9a531be3668678fe2ff7455e59d35d421b4b7f9b58e8acfd0bef9fee 1560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b6ba32682e47d9465bffa19a1efddd37c65516dc2ea4d0c67094200c65243002 1760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c2e76ed9d9adb51eb351b94656589044162d67d254481c6b3e07c6a69b9a8f37 1960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNoZWxmSGVscC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE5OTksImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6658e094c789a70791ebde7db4299ab961446c7df93e8fb88bc45b3e08732e32 1999w" width="360" height="218" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>What started out as a way to fix my own book-finding problem turned into something real. Building this app with Tommy and Laura’s help during Pointless Palooza gave me a chance to finally create something that could end our frustration. </p><p><a href="https://shelfhelp.base44.app/"><i>Shelf Help</i></a> might only be a working prototype, but it’s proof that finding your next favorite read doesn’t have to be a guessing game. Using plain language to ask for exactly what you want, and having an AI actually understand your preferences, feels like the kind of tool readers have been waiting for. It’s not perfect yet, but it’s a solid start toward reinventing how we discover books that truly fit.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Pointless Lessons: How We Built Scooter Commuter</title>
        <link>https://www.viget.com/articles/pointless-lessons-how-we-built-scooter-commuter/</link>
        <guid>https://www.viget.com/articles/pointless-lessons-how-we-built-scooter-commuter/</guid>
        <pubDate>Tue, 24 Feb 2026 10:00:00 -0500</pubDate>
        <author>Bre Corn</author>
                  <category>Code</category>
                  <category>News &amp; Culture</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Remote work removed the need for a commute and allowed people to clock-in from anywhere, but it also blurred the boundaries between work and home life. For employees craving a separation, <a href="https://www.viget.com/about/team/asmith">Abby Smith’s</a> idea of Scooter Commuter is the answer. </p><p>Abby pitched the idea of creating a ritual that makes the invisible commute visible by simulating the feeling of waking up, taking a yoga class, getting ready, grabbing a coffee, and commuting to the office while never leaving your house. <a href="https://www.viget.com/about/team/catwell/">Claire Atwell Eisinger</a>, <a href="https://www.viget.com/about/team/jyu">Jackie Yu</a>, <a href="https://www.viget.com/about/team/sfinn">Sadie Finn</a>, and <a href="https://www.viget.com/about/team/bcorn">Bre Corn</a> joined the team and helped make the game come to life in 48 hours for our annual hackathon, <a href="https://www.viget.com/articles/the-enduring-point-of-pointless-corp/">Pointless Palooza</a>. In this short time we went from idea to innovation as we explored new skills and tested new tools.</p><p>Scooter Commuter is a lightweight game played in the browser and designed to help remote workers mentally transition into their workday. Players move through a series of small, playful moments which creates the mood for intention, boundaries, and a healthier start to the day.</p><h2>Game Inspiration</h2><p>Before building, we tested some popular, nostalgic, and niche games to see what game style and elements we wanted to incorporate in Scooter Commuter.</p><ul><li><a href="https://freepacman.org/">Pac Man</a></li><li><a href="https://dailydungeon.net/">Daily Dungeon</a></li><li><a href="https://www.nytimes.com/games/wordle/index.html">NYT Wordle</a></li></ul><p>We discussed core elements that make these games exciting for us to play and that we wanted to nail in our own project. These were our top 10:</p><ol><li>Clear and simple rules</li><li>Meaningful user choices</li><li>A reasonable challenge curve</li><li>Consistent feedback loops</li><li>Intrinsic motivation</li><li>Accessibility</li><li>Curiosity gaps</li><li>Social connection &amp; <s>competition</s></li><li>Visual clarity</li><li>Reactive controls</li></ol><h2>Brainstorming</h2><p>After nailing down our inspiration and requirements, we got to work on visualizing our ideas. We created shared <a href="https://www.viget.com/articles/notion-certified-exam-a-study-guide/">Notion</a> and <a href="https://www.viget.com/articles/make-wireframing-easier-faster-stronger-with-whimsical/">Whimsical</a> workspaces to individually think through our ideas before collectively deciding on a direction.</p><p>Sadie leveled up our conceptual <i>Viget inspired commute</i> by suggesting we help players jump start their day by using the game to prompt players in real life. They are encouraged to grab snacks, do sun salutations, hydrate, get dressed, and turn on their favorite playlist. </p><h2>Creating</h2><p>With a solid idea, guidelines, and benchmarks, we got started bringing this idea to life. We created a version plan of the game that would lead to the best results before the deadline.</p><p>Abby completed the heavy lift of developing the entire game. She took a crash course on <a href="https://phaser.io/box2d">Phaser</a>, handled repository setup, and refactored a 1000-line code base to help our vision come to life. Claire took on the work of not only containing this project but literally containing the game by converting the wall system from rectangles to individual tiles, using Copilot.</p><p>Their work resulted in a final tech stack of: JS / React, Phaser.js, and Vercel.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ada5ebfe6a5f5aa531379742ca82def0b652d7e30eb5a7de32c7926887a70c1d" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ada5ebfe6a5f5aa531379742ca82def0b652d7e30eb5a7de32c7926887a70c1d 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=2e092f58278b699832a0c1ebbc99d07f45e51d004e5a58fbcf4a91d6528ce243 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=19f8684656cf8c15597670a6bf543ad4e8a13b10036d13c3be680590240037b8 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=496b327683b2eae35831c54790720997f4838ddf896bd50dd83b9d8b1a196b21 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=42702df4ec59740c3e491cf915f9dfeecc9b4890b2136f8de59b3c0cd69910ed 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=25fa7e60c736429ee8c2a89ce2539d8684f592cd1f5e0f8ee01e297c32e846fa 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IkZMRi1ab25lLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fa2f2e69846fbe27cc4a8e25fb4fae07f7f8f87e6e14774a798a9d0855403251 1470w" width="360" height="218" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Sadie, Bre and Jackie handled game design, pixel visual elements, documentation, and concept definition. We collaborated in Figma and Notion to asynchronously coordinate on the activity prompts, room design, character aesthetics, and splash screens that helped bring the game to life. </p><p>The 48-hour hackathon was a huge success. Palooza culminates in a company-wide work showcase, and we're proud to say the idea resonated with many of our peers. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto border w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvUG9pbnRsZXNzLTI2LVNjb290ZXItQ29tbXV0ZXItbG92ZS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=44452d03b6d4a8f0fde22969d4c07d04ad12530a9e4adcbeba6fd6ea2a0f7729" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvUG9pbnRsZXNzLTI2LVNjb290ZXItQ29tbXV0ZXItbG92ZS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=44452d03b6d4a8f0fde22969d4c07d04ad12530a9e4adcbeba6fd6ea2a0f7729 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvUG9pbnRsZXNzLTI2LVNjb290ZXItQ29tbXV0ZXItbG92ZS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=00c86ded7f4741c958ce8ecd5bd0d4c80a9eee36b0780e6f14e87ca1b0b47716 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvUG9pbnRsZXNzLTI2LVNjb290ZXItQ29tbXV0ZXItbG92ZS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjcyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=8ba01eef57acc53d5395589ad63ffa56902fe8629fec620cdf9310a7afc16b58 720w" width="360" height="220" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>The Scooter Commuter build doesn't stop here. The team has plans to add a more complex map, additional playable characters, and maybe even a leaderboard to track your daily score. Go check out <a href="https://pointless-26-idea3.vercel.app/">Scooter Commuter</a> before you start your next work day and read some takeaways from the team!</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=089579e5d190fc60cdf80e121de134ec21a5a55b167f1f564a5d8d2f3df26f6c" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=089579e5d190fc60cdf80e121de134ec21a5a55b167f1f564a5d8d2f3df26f6c 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=356848119231fc2e2542a20b0d5d18e7355f0ecea288b87a040591c7b128c369 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4d2eae3c09f9115ae62361972bcb1f7212b032fd3a4b32c8c283b76d0e9d8d41 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=887b4c2779a4b7c47e9105e81c8aabca3d422c9cdbd9b9d4853d9f14f754a92f 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=44000f5184e5a89bfe390360e4547641b6456f5d4b9ec335ad40272a7fe93a0f 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e699e970ab14b2205aa42ee91d66f48d5c90ce69cd677d723e9e60078b6fce9a 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNi0wMi0xMy1hdC0xMi4wMS4yNC1QTS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e3818c9227695ec5235204faded49127a3b71be6c1ff53987a4c4681785f3a1b 1470w" width="360" height="174" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>Takeaways </h2><p><a href="https://www.viget.com/about/team/asmith">Abby</a>: Don't let your AI work in one file. Force it to do file structuring based on functionality as it works ... or else face the consequences.</p><p><a href="https://www.viget.com/about/team/bcorn">Bre</a>: Constraints push the limits, breed creativity, and force me to be realistic about what I can and learn in 48 hours. With a great team supporting you, it can be a lot!</p><p><a href="https://www.viget.com/about/team/catwell/">Claire</a>: It’s fun to solve hard problems with smart people.</p><p><a href="https://www.viget.com/about/team/jyu">Jackie</a>: Figma has its limits. I have never approached them before, but it can do a lot more than I thought, especially in the visual graphic space compared to the UI space that I usually work in.</p><p><a href="https://www.viget.com/about/team/sfinn">Sadie</a>: Share your ideas, even if you think they're bad! I almost deleted my idea because it was a different direction than we had initially talked about, but it ended up resonating the team and we transformed it to make something super cool!</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Pointless explorations of Obsidian &amp; Claude Code</title>
        <link>https://www.viget.com/articles/pointless-explorations-of-obsidian-claude-code/</link>
        <guid>https://www.viget.com/articles/pointless-explorations-of-obsidian-claude-code/</guid>
        <pubDate>Fri, 20 Feb 2026 15:57:00 -0500</pubDate>
        <author>Joshua Pease</author>
                  <category>Code</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>At Viget, we have a sizable group of <a href="https://obsidian.md/">Obsidian</a>
enthusiasts. During this year's <a href="https://pointlesscorp.com/">Pointless Palooza hackathon</a>, our
three-person team of Natalie, Jackson, and Joshua (that's me!) explored ways to
integrate LLM features into Obsidian and empower our coding agents to work
within our content vaults. Each of us brought different experience levels and
workflows to the table, but we shared two things: curiosity about pushing Claude
Code to its limits and an Obsidian habit that keeps on growing.</p>
<span id="claude-code-obsidian"></span><h2>Claude Code + Obsidian <a class="anchor" href="#claude-code-obsidian" title="Direct link to Claude Code + Obsidian" aria-label="Direct link to Claude Code + Obsidian">#</a></h2>
<p>If you've never used it, Obsidian is a local-first, Markdown-based knowledge
management app. It's flexible, extensible, and an excellent digital junk drawer. Obsidian vaults are just Markdown files and folders on your computer. It's the
perfect fodder for an AI agent to churn through.</p>
<p>Tools like Claude Code are surprisingly effective as a general agent for
knowledge work. Open it inside of an Obsidian folder and say: "You're in my
Obsidian vault. Let's talk about it." It already knows what Obsidian is, how
Markdown works, and what frontmatter means. For ad hoc queries, this requires
zero setup. Being grounded in a local filesystem moves you from one-off chat
threads to a durable workspace that evolves over time.</p>
<p><strong>Here’s an example:</strong> Every Friday, I photograph my
<a href="https://ugmonk.com/pages/analog">Analog to-do list</a> cards and run a Claude
skill. It asks me questions about my messy todo list, cross-references my
yearly goals and past performance reviews to generate a weekly summary. You
could do all these steps without AI, but automation eliminates all the busywork
that killed my consistency. This context builds up over time and becomes more
useful to Claude as it grows.</p>
<span id="the-limits"></span><h3>The Limits <a class="anchor" href="#the-limits" title="Direct link to The Limits" aria-label="Direct link to The Limits">#</a></h3>
<p>Despite their usefulness, an AI agent isn't a silver bullet. Naively pointing
Claude Code at a raw vault has real limitations:</p>
<ul>
<li><strong>Large vaults are slow.</strong> With 3,000-4,000 notes, Claude Code burns through
tool calls and tokens just searching for relevant content.</li>
<li><strong>General-purpose means wasteful.</strong> Just now I asked Claude Code to summarize
a YouTube video. It used yt-dlp to download a VTT transcript, wrote a Python
script to parse the VTT, and finally summarized said transcript. Running
<a href="https://ccusage.com/">ccusage</a> shows this session took almost 500k tokens and
would have cost $1.02 in API calls. Claude Code is powerful, but expensive for
routine tasks.</li>
<li><strong>Token budgets disappear fast.</strong> A typical Claude Pro subscription can hit
usage limits in a single ambitious session, leaving no budget for coding.</li>
</ul>
<p>What if we could write an Obsidian plugin to help?</p>
<span id="our-pointless-pitch"></span><h2>Our Pointless Pitch <a class="anchor" href="#our-pointless-pitch" title="Direct link to Our Pointless Pitch" aria-label="Direct link to Our Pointless Pitch">#</a></h2>
<p>We wanted common LLM operations to be automatic and affordable. Summarizing
clips, tagging notes, and synthesizing across files could happen inside Obsidian
rather than through an expensive, general-purpose agent session.</p>
<p>No more copy-pasting YouTube transcripts. No more burning Claude Pro credits on
tasks a $0.001 API call can handle.</p>
<span id="what-we-built"></span><h2>What We Built <a class="anchor" href="#what-we-built" title="Direct link to What We Built" aria-label="Direct link to What We Built">#</a></h2>
<p>We built an Obsidian plugin that connects your web clipper and file tree to
cheap, targeted LLM calls. The following two user journeys nicely sum up our
plugin's features.</p>
<span id="web-clipper-auto-summarize-on-save"></span><h3>Web Clipper: Auto-Summarize on Save <a class="anchor" href="#web-clipper-auto-summarize-on-save" title="Direct link to Web Clipper: Auto-Summarize on Save" aria-label="Direct link to Web Clipper: Auto-Summarize on Save">#</a></h3>
<p>At this point in your knowledge work adventure, you're browsing the web and
gathering resources to read later or archive for future reference.</p>
<p>The <a href="https://obsidian.md/clipper">Obsidian Web Clipper</a> already lets you
bookmark pages into your vault, but our plugin takes it further. The moment a
clipped page lands in your vault, it auto-generates a structured summary and
tags. If the clip is a YouTube video (or eventually a podcast URL), the plugin
fetches the transcript, appends it to the note, and uses it to inform the
summarization task.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a042d0f9fdb0364aa4eb1a7d37b219f9af469defad51288ddb0984dbaba45f33" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a042d0f9fdb0364aa4eb1a7d37b219f9af469defad51288ddb0984dbaba45f33 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=0a76a741a56bfdcc8b4c862504ed8d78c9b2a21de277e79e827dcd738ea2c2da 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b9fb07e9e3d1aeb85c8aa30cf960f9b7fbc543ca5bb57ed39fd2a037db18e209 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=601fb60cb22b43f589623de99108e2920953d563acac1d99da018f0a92663207 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c0a010aac31b1d6019482cb52733f857b4d26a633ef277157d4a7126a981f60d 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=a570d0a77661a2e4011bd42260b1629042dbdc2b626f4d222b7d46c349529357 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLWNsaXBwZXIucG5nIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=54eb16855cc428de457462cd1b6d247281c7af07663fbff61eee7feb40c54a4c 1470w" width="360" height="203" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="synthesize-multi-file-prompts"></span><h3>Synthesize: Multi-File Prompts <a class="anchor" href="#synthesize-multi-file-prompts" title="Direct link to Synthesize: Multi-File Prompts" aria-label="Direct link to Synthesize: Multi-File Prompts">#</a></h3>
<p>Now that your collection of clippings and reference material has grown, you'll
probably want to synthesize that information into new Obsidian notes. Here's how
this feature works.</p>
<p>Select one or more files, write a custom prompt (or reuse a saved one), and the
LLM creates a new note from your input.</p>
<p>Examples: "Summarize these three articles and give me one snarky take on each."
or "Turn this YouTube transcript into a learning guide with clear section
headers and with relevant timestamps."</p>
<p>This kind of cross-note synthesis is tedious by hand, wasteful with a coding
agent, but trivial with a simple LLM call.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d73082fdc6a3697f1a540dce2bbfa1cb8f3228b04faa3c5d32e5dda47cc08896" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d73082fdc6a3697f1a540dce2bbfa1cb8f3228b04faa3c5d32e5dda47cc08896 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4c9213c322f01808019395d5afe3f33fa804b826ec087da77758b251dd67544d 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=67c1038ddd13d1ec2a9e79219b12ad0ba7bbbfb9af723786ad706b6fdfa1f254 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a314da5d860001ae8ff321e1156ab23233ab3505f630436e319c0693ba1a6d50 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3c86cd878e2696593dbf53e2c8916c35a9e29ff27aa0406efdc3ecda1ba672b9 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=4832499dc4e56135d6314ee6dbcaff89487c7f43e43e732878e7898c873d0d04 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL29ic2lkaWFuLXN5bnRoZXNpemUtMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=92297eb372c237e7ac2944a9ac381d516620495348f883183cfac93d2e392518 1470w" width="360" height="203" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="multi-select-file-explorer"></span><h3>Multi-Select File Explorer (Bonus Plugin) <a class="anchor" href="#multi-select-file-explorer" title="Direct link to Multi-Select File Explorer (Bonus Plugin)" aria-label="Direct link to Multi-Select File Explorer (Bonus Plugin)">#</a></h3>
<p>The Synthesize feature revealed a frustrating gap in Obsidian. Multi-file
prompts require selecting multiple notes, but the file explorer only lets you
interact with one file at a time.</p>
<p>As a side quest, Natalie built a separate plugin with checkboxes, count badges,
and right-click actions for batch operations.</p>
<span id="how-we-built-it"></span><h2>How We Built It <a class="anchor" href="#how-we-built-it" title="Direct link to How We Built It" aria-label="Direct link to How We Built It">#</a></h2>
<p>The
<a href="https://www.viget.com/articles/the-point-of-pointless-corp-in-the-ai-age">point of Pointless</a>
has always been to learn by doing in a focused yet risk-free sandbox. We decided
to go all-in on Claude Code and see how far we could get with purely agentic
development.</p>
<span id="tech-stack"></span><h3>Tech Stack <a class="anchor" href="#tech-stack" title="Direct link to Tech Stack" aria-label="Direct link to Tech Stack">#</a></h3>
<p>The tech stack was mostly straightforward, but a few key choices helped Claude
Code work effectively.</p>
<p><strong>TypeScript + Vitest.</strong> One of the best ways to set your coding agent up for
success is to give it a way to verify its own code. Strongly typed languages and
automated tests do exactly that. If your LLM hallucinates a library API, the
type checker catches it immediately.</p>
<p><strong>Obsidian Plugin API.</strong> Building an Obsidian plugin dictates your tech stack,
but we already wanted to use TypeScript, so it's a win-win. A plugin is a couple
of TypeScript files and a manifest, compiled down to a single bundle. Symlinking
the build output to any Obsidian vault makes live testing painless.</p>
<p><strong>youtubei.js.</strong> We used this library for client-side access to YouTube's web
APIs. We hit a few CORS issues, but Claude replaced the default <code>fetch()</code> with
Obsidian's <code>requestUrl()</code> to bypass them.</p>
<p><a href="https://ai-sdk.dev/"><strong>Vercel AI SDK</strong></a> <strong>+
<a href="https://vercel.com/ai-gateway">AI Gateway</a>.</strong> These libraries got us building
LLM features fast. Vercel's gateway gives you access to nearly any model you can
think of. It's great for hackathons where you need to evaluate multiple LLMs,
compare pricing, and pivot fast. As a bonus, Gateway includes $5.00 in free API
credits per month — more than enough for a short hackathon.</p>
<span id="ai-development-techniques"></span><h3>AI Development Techniques <a class="anchor" href="#ai-development-techniques" title="Direct link to AI Development Techniques" aria-label="Direct link to AI Development Techniques">#</a></h3>
<p>The process of working with Claude Code ended up being the most valuable part of
this project.</p>
<p>We set two ground rules at the start. Minimal code written by hand and minimal
code review. Instead, we focused on manual and automated tests to verify that we
were on the right path.</p>
<h4>Compound Engineering</h4>
<p>The real game-changer was the concept of compound engineering. If you've read
much about coding with AI agents, you might have seen folks recommend following
a <strong>plan → build → review</strong> process for each feature.</p>
<p>By chance, I had read
<a href="https://every.to/guides/compound-engineering">this guide on compound engineering</a>
a few days before the hackathon. Compound engineering introduces a fourth step
called <strong>compound</strong>.</p>
<p>Whenever you find yourself coaching your LLM through a bug, fixing a common
performance issue, or noticing a pattern that has broad use, run the <code>compound</code>
step at the end of your session.</p>
<p>Compounding updates your AGENTS.md and adds "solutions" docs explaining the
issue.</p>
<p><strong>A practical example:</strong> Claude kept installing v4 instead of v6 of the Vercel
AI SDK, even with <a href="https://github.com/upstash/context7">an MCP server</a> pulling
up-to-date docs. Rather than fix the version manually, we had Claude update its
own CLAUDE.md with specific instructions to prevent the mistake for other npm
packages. Small investment, permanent payoff.</p>
<h4>Dividing Up Work</h4>
<p>What shocked us was the speed. Claude Code took us from a three-bullet-point
development plan to a working MVP in about thirty minutes. Normally, this would
have taken half the hackathon. The speed left us scrambling to come up with new
features and figure out how to divide work among three AI-assisted developers,
all coding at once.</p>
<p>Like any development project, a bit of planning goes a long way in reducing git
conflicts. When our file changes collided, Claude Code did a great job resolving
conflicts as well.</p>
<p>We moved fast because the stakes were low. Claude picked some patterns we
wouldn't have chosen, like
<a href="https://ai-sdk.dev/docs/ai-sdk-core/generating-structured-data">adding structured output schemas</a>
to our LLM output without us being aware (that was a fun bug). A more serious
project needs tighter guardrails and more thorough review.</p>
<span id="where-do-we-go-from-here"></span><h2>Where Do We Go from Here? <a class="anchor" href="#where-do-we-go-from-here" title="Direct link to Where Do We Go from Here?" aria-label="Direct link to Where Do We Go from Here?">#</a></h2>
<p>Pointless got us excited about AI agents all over again. They're not just for
software development; they're also truly useful for everyday knowledge work.</p>
<p>Writing Claude skills that leverage the new metadata in our Obsidian vaults
opens up powerful workflows. Obsidian's recently released CLI tool also pairs
well with agents that live on the command line. During Pointless, Jackson had
Claude run <code>obsidian help</code> and
<a href="https://gist.github.com/jacksonfox/bc870b0efd636b14691a85b7e80c016a">write a skill</a>
for interacting with the Obsidian Command Line.</p>
<p>Over the coming weeks and months, we'll continue to refine how we work with
Obsidian and Claude Code within our content vaults.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=337c9b3118bf8afb3bbdb521e6912ee2913145786befd45a22f3c47f89ac3750" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=337c9b3118bf8afb3bbdb521e6912ee2913145786befd45a22f3c47f89ac3750 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9139f69dc31f67f94c50fc10a267dbc730aee936430e0bfcac8fcbdc23e11052 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b17dff84598b6e858521fe7c219d4030776f7371846fcfe04a7c2ba03aab210e 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=8bfc13cc6f5b35bc079a100d65563adaf8b44aedd97a36fa3a8939fa928d4724 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=746380a9f79cb93d5c8c0d357735e36b1d9ee550a0ce093ae25f4b21bba43721 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=13e093672e27c361a4ba17ec31c3d941b61f360740c2eb85f3061e3d18e702ef 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJsb2cvcG9pbnRsZXNzLW9ic2lkaWFuL0lNR18xMTMyLmpwZWciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=67321e84be4f08a1e9cae8c94df526a088f70b15bfce31ea8ecd0d2fe8572a9f 1470w" width="360" height="270" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="closing-thoughts-from-the-team"></span><h2>Closing Thoughts from the Team <a class="anchor" href="#closing-thoughts-from-the-team" title="Direct link to Closing Thoughts from the Team" aria-label="Direct link to Closing Thoughts from the Team">#</a></h2>
<span id="jackson"></span><h3>Jackson <a class="anchor" href="#jackson" title="Direct link to Jackson" aria-label="Direct link to Jackson">#</a></h3>
<p>I enjoyed the opportunity to expand on my experience
<a href="https://www.viget.com/articles/building-a-blog-with-ai">using Claude Code for personal projects</a>
and collaborate with a team. This project was very fast, but I came away from
the experience thinking harder about how to instill good (and consistent)
behaviors in our robot friends.</p>
<span id="joshua"></span><h3>Joshua <a class="anchor" href="#joshua" title="Direct link to Joshua" aria-label="Direct link to Joshua">#</a></h3>
<p>The Plan, Work, Review, Compound loop is what I'm taking away from this project.
LLMs need clear instructions and lots of context. Taking the time to help coding
agents avoid repeating mistakes pays dividends.</p>
<p>Tools like Claude Code can unlock some big efficiency gains. I don't feel we're
at the point where I'd blindly trust AI-generated code on a high-stakes client
project. But for a lower-risk project (an MVP or a tool like this Obsidian
plugin) it's a fast path from idea to finished product.</p>
<span id="natalie"></span><h3>Natalie <a class="anchor" href="#natalie" title="Direct link to Natalie" aria-label="Direct link to Natalie">#</a></h3>
<p>I was new to Claude Code and had never used AI for coding at this scale. I found
that the QA was quite fun and I never got stuck. I'd identify a bug, describe it
vaguely — "sometimes the command doesn't run, maybe it has to do with my cursor
being in the title?" — and Claude would have an answer and a fix on the first
try.</p>
<p>We were able to modify Obsidian for exactly how we want to use it. When we
needed multiple files as input for a content vault command, we realized Obsidian
had no good way to select them. So we built the Multi-Select Plugin — a
standalone tool, completely separate from the Content Vault Plugin. Tinkering
led us to a real UX pain point, and we solved it!</p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>Bringing Parakeet to Life: The Long Process of &quot;Finishing It Up&quot;</title>
        <link>https://www.viget.com/articles/bringing-parakeet-to-life/</link>
        <guid>https://www.viget.com/articles/bringing-parakeet-to-life/</guid>
        <pubDate>Fri, 13 Feb 2026 10:00:00 -0500</pubDate>
        <author>Natalie Dixon</author>
                  <category>Code</category>
                  <category>News &amp; Culture</category>
                  <category>Internships and Apprenticeships</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Avid followers of the Viget blog may remember the announcement of a particularly exciting-sounding Viget intern project called Parakeet <a href="https://www.viget.com/articles/breaking-the-silence-in-meetings-a-peek-at-parakeet/">back in August</a>, which came with the promise that “it’s going to be available for everybody to use… eventually.“ I’m very happy to report that “eventually” has finally come!</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>In case you haven’t been on the edge of your seat the past 6 months waiting for it, you may be wondering, <i>What is Parakeet?</i> </p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h4>Parakeet is both a digital soundboard website, where you can upload and organize sounds, <strong>and</strong> a Chrome extension, specifically tailored for Google Meet, to play sound effects in virtual meetings. </h4>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>It was an ambitious project for the 2025 intern cohort. We set out to solve the problems of disorganized, unattractive soundboard websites <strong>and</strong> to make it easy to share audio in Google Meet (typically, you can only share audio by sharing a tab). It was a huge success! </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=7c6f612c71345c9fffc8382c6cc098188a7ee7e2a56423194c207e873792c2ab" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=7c6f612c71345c9fffc8382c6cc098188a7ee7e2a56423194c207e873792c2ab 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=9d22c9882a0b67c18bc4c75bb5fc3635691fa31f1548dd14c8e5c0e87bef2573 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=0f8636dafd8fc20e331ef41a0a6668924827b33b4542e99288d8b1b8f8b140d0 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=3cb2886752cb013854a2307ab53d32fb06aecf2666d2692248c2844d0053b3a6 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fe16a2449e19bf051f75c45a990b93967ced90ec4063aa9a1f3260d3cd80a21a 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=037dbf31561258165bfd8fb2e35839fca5f6683e34154f38dc574c3e9b642f20 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBhcmFrZWV0X3NsYWNrX21lc3NhZ2VzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fa80df739342a86aaf127a3a0971e2524fe7a1b5b15f087596908281ec2d0a5c 1470w" width="360" height="324" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>On the very last day of the summer internship, the Parakeet website went live, and the extension had been submitted to the Chrome Web Store for approval. Parakeet was on the verge of taking over Google Meets everywhere! </p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Several weeks later, I joined Viget full-time and was glad to see that the extension had been approved. I was ready to send it off into the world, but my Viget mentors and colleagues suggested that Parakeet could benefit from a bit of polishing and user testing. There were rumors of echoing issues and a few features that weren’t so user-friendly. I was excited to dive back in and make some improvements!</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>This polishing and user testing effort officially kicked off Phase 2 of Parakeet Development: <i>Finishing It Up</i>. You know what they say about the last 20% of a project taking 80% of the time? Well, that was incredibly accurate in this case. Though in defense of the interns’ original timeline and scope, Parakeet did go from being the main focus of a dedicated, multi-skilled team of 5, to a professional development (and passion) project in between client work for a single developer.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h4>	So what did this 20% consist of?</h4>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Phase 2 started off with some repository housekeeping - things that a group of interns in a 3-week sprint weren't too concerned about - like writing a good README with set-up instructions and making environment variable templates. Next, I implemented authentication to keep users logged in long-term, which is very important for quick, convenient extension use. I also needed to build a new flow for adding default sounds to folders. At the last minute of the internship, we discovered a loophole where any user could edit default sounds, and when we fixed it, we accidentally took away the "add to folder" functionality too.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>After getting things tidied up, I started planning out and running user testing sessions. I recruited a couple Viget employees and got them set up with a sneak peek version of the extension. I went into testing convinced that the echo ‘rumors’ were just user error (aka I was extremely biased towards my own work and feeling precious about the project). But by the second interview, it was clear that there was definitely an issue with echoing. I subjected my coworkers to horrible echo loops in the name of testing, and determined that the issue had been concealed before by the use of headphones. The echo problem turned out to be a fairly easy fix, thankfully, and not the potential collapse of our entire audio handling system that I’d feared.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>This user research exposed not just bugs, but opportunities for real usability improvement. One of the most important findings from the user testing interviews was that the Parakeet mute functionality was confusing for new users. In addition to clarifying copy changes, I expanded the help page that opens when you first download Parakeet to include a tutorial that guides users through using the extension. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://assets.viget.com/parakeet_tutorial.gif" srcset="https://assets.viget.com/parakeet_tutorial.gif 488w" width="488" height="318" alt="" sizes="(max-width: 46em), 100vw" style="width: 488px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>This led me towards another improvement – upgrading the mute system –  aimed at power users. I added a button that appears in Google Meet, giving users the ability to mute and unmute through Parakeet directly within the meeting tab. Previously, users had to open the extension pop-up to mute/unmute, or to check whether they were muted.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3e23f2b305ebd53e5e6f87853d68f2adf15c1aa96c20e88220b52a49a0eaf273" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3e23f2b305ebd53e5e6f87853d68f2adf15c1aa96c20e88220b52a49a0eaf273 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=213f9c3c5de0bacbd006f8193673e3f553bce56ee25f27f5bca8a155afd23768 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c253494b41e4b271d97619ed201acf344235177f0ea27a03d58249a3bdd9cb1e 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=0a06b6a734b3e5c058ee898953500785a03e22f1e31cac08189b9299c03d3f1f 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=05c663cea67fb4803b16721e794722c2c2653fff0078ed9fd044ddb823f7ac58 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=18f2f1efab7c58ea09ed7d4993883ddc973ac87dc9a4ba860dc089fd57e753cf 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImluZm8tbXV0ZS1idXR0b24tZ29vZ2xlbWVldC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=d7be29960d93e53767ad5a89fcc8eec9d149be7e8dd026d94357e4daede19a3b 1470w" width="360" height="42" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>One of the final changes (which had been explicitly included in the original Phase 2 scope) was to add the ability to toggle the Parakeet buttons in Google Meet on and off, giving users more control over the display and preventing them from covering parts of the screen.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InNldHRpbmdzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=95db26829018e429ee78fd142bb94c52d7886d1bc711f6a1ff8a0073789c79ab" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InNldHRpbmdzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=95db26829018e429ee78fd142bb94c52d7886d1bc711f6a1ff8a0073789c79ab 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InNldHRpbmdzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f1a9718030a20bd0a5f772cae38399e5e8856e8286c42ce2d8c88d4358f4d7f0 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InNldHRpbmdzLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzIwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=fc5f27f01896645e35e96abe5534aff19fafadcf47d5c11c59749d1946e0989c 720w" width="360" height="278" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>During Phase 2, I got the chance to try on each of the interns’ hats - I wrote a lot of TypeScript and GitHub issues, conducted user interviews, and iterated through designs and color choices in Figma. None of these are my specialty, or what I do on a daily basis here at Viget. But frankly, I’m young and not particularly specialized in anything, and at any point in your career it’s good to try new things, go out of your comfort zone, and be inspired to creation by a project or idea.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>It would have been possible to keep refining Parakeet and pushing off the official release forever. Especially, because in addition to bug fixes and improvements, working on the Phase 2 process also inspired me. Small iterations led to major new feature ideas. A part of me wants to always keep the project in an “almost done” status and continue tinkering on it, safe from the real world. But it’s time. While Parakeet will continue to improve, it is now ready for public use!</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <hr /><h4>You can find the website at <a href="http://parakeet.vigetx.com">parakeet.vigetx.com</a>, and <a href="https://chromewebstore.google.com/detail/nhcgnligmhnekeeboamblkkbclapnmgd">download the Chrome extension</a>.</h4><hr />
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>To celebrate the release, several new default sounds were added to Parakeet, in collaboration with Parakeet’s official Voice Talent, Viget’s <a href="https://www.viget.com/about/team/tball">Tommy Ball</a>. Just as there are a couple of niche Viget sounds on Parakeet, we hope that your company, organization, and D&amp;D group will feel inspired to come up with your own fun sounds to make meetings brighter.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>The Point of Pointless Corp. in the AI Age</title>
        <link>https://www.viget.com/articles/the-point-of-pointless-corp-in-the-ai-age/</link>
        <guid>https://www.viget.com/articles/the-point-of-pointless-corp-in-the-ai-age/</guid>
        <pubDate>Fri, 06 Feb 2026 14:36:00 -0500</pubDate>
        <author>Brian Williams</author>
                  <category>News &amp; Culture</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Next week, we’ll run our annual <a href="https://www.viget.com/articles/the-enduring-point-of-pointless-corp/">Pointless Palooza</a>. As with many things in this age of AI, this one feels different.</p><p><a href="https://pointlesscorp.com/">Pointless Corp.</a> is Viget’s innovation lab. Neither pointless nor a corporation, it’s been our <a href="http://viget.com/articles/introducing-pointless-corp">long-standing</a> answer to a simple question: how do we make space to build things without the constraints of client work? Things that aren’t revenue-driven, don’t need a business plan, and don’t even have to work to be considered a success. It’s how we try, fail, and try again in ways that make us better.</p><p>That mission hasn’t changed, but the tools we have to work with certainly have.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBjLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=2b4ff9ec621f8eec0eeef061e9875b8ca7d1fe3f1869d53ee633004c8b2dba41" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBjLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=2b4ff9ec621f8eec0eeef061e9875b8ca7d1fe3f1869d53ee633004c8b2dba41 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBjLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=ffb78e46cd639781c1e4f4b16e9805123f5f5bc833c613654bea026c421cb285 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBjLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1a235a20098f1dc39409da334786c75629fb2abec164ba8181af079f0fea0dca 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBjLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f6f743c5a80f31e3d11100533d096b72786f60b2db4e096a41746ea115fbb760 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InBjLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTAyNCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=6153a5084659845b17695c88dc2db45ea118cd552d679afd203fe996c8af310d 1024w" width="360" height="240" alt="" sizes="(max-width: 125em), 100vw" style="width: 1024px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>In the past, Pointless projects required carefully assembled teams. We could each experiment with wearing different hats, but we still needed a project lead, a designer, and at least one developer. PMs and designers often had to persuade developers to join just to give the project any chance. In prior years, we chose dates specifically to maximize developer availability, because without someone writing code, nothing shipped.</p><p>That’s no longer true.</p><p>In 2026, small teams, and even individuals, can accomplish far more. Tools like <a href="https://replit.com/">Replit</a>, <a href="https://lovable.dev/">Lovable</a>, and <a href="https://bolt.new/">Bolt</a> allow non-developers to build functional software. At a recent staff meeting, Dev Director <a href="https://www.viget.com/about/team/jpease">Joshua Pease</a> walked the team through how to get started with these platforms, part of our now weekly AI show-and-tell. That kind of open knowledge-sharing is core to what makes Pointless Corp., and Viget more broadly, a great place to work.</p><p>The skill lines are blurring in every direction. Developers can ramp up more quickly and work in a wider variety of tech stacks thanks to tools like <a href="https://claude.com/product/claude-code">Claude Code</a>, <a href="https://chatgpt.com/codex">Codex</a>, and <a href="https://cursor.com/">Cursor</a>. They can also generate interfaces, explore product concepts, and draft compelling copy in seconds. Designers and PMs can prototype real, working software. While I’m skeptical of the more extreme proclamations regarding AI’s impact on our industry, there’s no denying that this is an incredible time to be making digital products.</p><p>Viget has always valued a generalist mindset. Not everyone doing everything, but people who understand enough of the whole system to make good decisions with their part. People with the taste and agency to use new tools when their value is clear, and with the experience and wisdom to avoid an approach that creates a brittle house of cards when it matters.</p><p>That judgment only comes from experience, which is the real point of Pointless Corp.</p><p>Viget values perpetual professional development. We hire lifelong learners who want hands-on experience with real tech, not just opinions about it. It’s one thing to read about what’s new. It’s another to carve out focused time to try, break, fix, and understand it. Pointless Palooza is a company-wide time to spike on this kind of learning, with Pointless Projects often continuing throughout the year in the gaps between billable work.</p><p>Stepping away from client work is expensive. But, it’s a deliberate investment. We’re optimistic about technology, naturally curious, and eager to explore new tools. We’re also balanced by pragmatic skepticism and real-world proof. Pointless Projects are on-the-job training for skills we quickly apply to our clients, with the confidence that comes from experience rather than hype.</p><p>Agencies provide project variety. Every new client engagement is a fresh start. But client work isn’t the place to take wild swings. Learning too much on a client project risks overruns at best and failure at worst – outcomes we can’t accept.</p><p>Pointless Corp. is our no-risk, all-upside experimentation zone. It’s where we take big steps forward in our skills, develop informed opinions about what actually works, and bring that perspective back to our client work. Teams always aim to ship something by the end of Pointless Palooza, but the real value is what they learn along the way.</p><p>That’s still the point. And in an AI age where everything seems to be changing at once, learning by doing matters more than ever.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Building a Blog With AI</title>
        <link>https://www.viget.com/articles/building-a-blog-with-ai/</link>
        <guid>https://www.viget.com/articles/building-a-blog-with-ai/</guid>
        <pubDate>Fri, 30 Jan 2026 10:00:00 -0500</pubDate>
        <author>Jackson Fox</author>
                  <category>Code</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>It was hard, in 2025, not to get overwhelmed by the near-daily news around large language models, chatbots, and everything else AI-powered. I try to stay a little skeptical of the new and shiny in the tech world, but even as an AI skeptic it seemed clear that these tools were approaching an inflection point from "cool in theory, busted in practice" to "actually pretty useful." I also realized that it might be existential for me, as a designer and leader at a digital agency, to not lose sight of where these tools are going.</p><p>Staying informed was my first goal. To stay in the loop, I started curating a list of people I thought were providing a clear-eyed view of the AI-powered future. For example:</p><ul><li><a href="https://www.threads.com/@jjackyliang">Jackie Liang</a> who works in the AI tooling space, but is also building his own AI-powered side business.</li><li><a href="https://simonwillison.net/">Simon Willison</a> who dove into the AI world early and has maintained a nicely balanced perspective on the industry.</li></ul><p>I get plenty of AI boosterism through LinkedIn and other mainstream sources, so I've tried to keep that perspective out of my curated feeds. I'm also trying to ground myself by following strong skeptics and no one is more skeptical of AI than your favorite author. I'm a book nerd, so I get strong AI opinions from many of the authors I follow in sci-fi, fantasy, and romance. Balancing these voices has helped me feel like I'm keeping up on the news of the day, without getting lost in the hype.</p><p>It also became clear to me that I needed more hands-on experience if I was going to have an informed opinion about how good (or not) these tools have become. I needed a project, but I wasn't comfortable throwing these tools into the mix on a client project just yet.</p><p>To get the experience I wanted, I decided to reboot my very neglected blog (most recently living on Tumblr, if that tells you <strong>just</strong> how neglected it was).</p><h2><strong>March 2025: A Blog Exists</strong></h2><p>One reason I enjoy having a blog is that I get to play with blogging software. I'm weird that way. I've used Wordpress, Movable Type, Blogger, Blosxom, Jekyll, Tumblr, and probably a couple others I've forgotten. I wanted a static site generator like Jekyll, but new! My co-worker <a href="https://www.viget.com/about/team/deisinger">David</a> gave a great presentation at work about using <a href="https://gohugo.io/">Hugo</a>, so that seemed like a good option to try.</p><p>To kick things off, I asked three different web-based AI dev tools—<a href="https://lovable.dev/">Lovable</a>, <a href="https://bolt.new/">Bolt</a>, and <a href="https://replit.com/">Replit</a>—to build me a Hugo-based blog. I gave them some design direction and a few posts to populate this new blog.</p><ul><li><strong>Lovable:</strong> We're off to a rough start. I ran into technical issues, like the chat UI failing to load, on a regular basis. Then I found out Lovable didn't grok Go, so it built me a site using React, which wasn't really what I was aiming for. </li><li><strong>Bolt:</strong> Bolt happily built me a site in Hugo! But I noticed there were a lot of errors cropping up in the console. Turns out Bolt didn’t <strong>actually</strong> support Hugo, or Go. Bolt offered to migrate the project to Astro.</li><li><strong>Replit:</strong> Replit was quick to note that it didn't support Go and also suggested I try Astro as another option. Which is fine, but not what I wanted. A few weeks later I tried again and Replit had added Go support and I finally had my Hugo blog!</li></ul><p>While I came away with generally positive feelings for the potential of all 3 tools, my experience in March reinforced my perspective that these tools weren't yet delivering on the promises they were making.</p><h2><strong>July 2025: A Different Blog Exists</strong></h2><p>Then I got distracted for a few months. Summer rolled around and I had time to dive back in to this project. By July I had a Claude Pro account, so I rebooted the project and installed <a href="https://code.claude.com/docs">Claude Code</a>. I had Claude spin up a new Hugo setup ... and it worked flawlessly. I got my theme tweaked, imported my starter posts, and then I had Claude help me add a few extra bits. The most notable is the <a href="https://upstandingrobot.com/following/">following tab</a>, which is built from my <a href="https://netnewswire.com/">NetNewsWire</a> OPML file.</p><p>Also, Claude helped me get Netlify auto-deploys working from Github. Thanks, Claude!</p><p>It was pretty remarkable how much better the experience was working with Claude Code in July compared to my experience in March. I suspect I would have had a similarly improved experience with Lovable, Bolt, or Replit had I given them another chance.</p><h2><strong>December 2025: Have Blog, But No Blog Posts</strong></h2><p><a href="https://upstandingrobot.com">I had my blog</a>. I wasn't writing in my blog. So I decided to try building something to make the writing process easier. If my experience over the Summer showed me that these tools could be useful, my experience at the end of year demonstrated just how powerful they could be. As I explored different ideas, I realized that I could actually make them happen. I really enjoyed being able to take a wild idea and quickly(ish) translate that idea into something I could test. Here's a subset of the tools I explored:</p><ul><li>The desktop app: I tried building an electron-based app that used AI to jumpstart the writing process. I could drop in some links and the AI would write a draft post on the connections between the articles. It was fun to play with some ideas on how AI can help with writing, but ultimately this felt too heavy.</li><li>The menu bar tool: The desktop app was too much, so I pivoted to something very small. I built a small app that could live in the MacOS menubar that would make it easy to spin up a new blank post in my editor of choice. And that was it! The app itself was nice and small, but I had to install a whole lot of stuff to build it (xcode). Ultimately, I realized I just didn't want to blog in VS Code.</li><li>The Obsidian blog: I had Claude help explore an <a href="https://stephango.com/vault">integration between Hugo and (the note taking app) Obsidian</a>. This seems like it could be a neat way to manage content, but I'm not super comfortable with Obsidian just yet. I might try this again later.</li><li>The web app: Having realized I didn't want to use VS Code to write blog posts, I had Claude build me a web app that I could run locally to make the writing experience more pleasant. This tool started simple—it lets me create and update posts. I can commit changes and push them to Github to trigger Netlify builds. I like it a lot and I'm using it to write this post.</li></ul><h2><strong>From Skeptical to Less Skeptical</strong></h2><p>In retrospect, this project tracked pretty closely with some important moments in the broader <a href="https://simonwillison.net/2025/Dec/31/the-year-in-llms/">AI narrative of 2025</a>. Those early experiments showed an ecosystem with more promise than delivery. By December, the foundational models like Claude and ChatGPT had improved dramatically as coding assistants.</p><p>I can now pretty clearly see the value of an AI-powered coding tool, at least for myself. And not just for coding things! I've got Claude Code open 24/7 in a terminal tab. I've used it to build tools, do data migration and cleanup, and help me see trends in performance review data. It's not suprising that Anthropic just launched "<a href="https://claude.com/product/cowork">Claude Cowork</a>," essentially Claude Code rebranded as a personal assistant.</p><p>I still don't see myself as an AI true believer. I think the AI bubble is real and 80% of the hype is hot air. I’m also not a full-on skeptic anymore. That said, there some areas where my skepticism is still high:</p><ul><li>I don't think we'll ever see a proper reckoning over the fact that all of the foundational models engaged in intellectual property theft to develop their models.</li><li>I don't think these models can really think outside the box. They are, by nature, "average machines." That said, it turns out that being an infinitely patient average quality coding machine can be pretty darn useful.</li></ul><p>I don't think I'll be any better at posting to <a href="https://upstandingrobot.com/">this blog</a> than I have been in the past, but one can always hope. At least I have a nice new web app to help me write posts thanks to the robots (and also nice human co-workers to proofread this post).</p><p>The lesson I take away from 2025, and this project specifically, is that we can’t wait around to see how our AI era will shake-out. It’s complicated and there’s a lot going on ALL THE TIME. It’s incumbent on us, as designers, as builders, to keep experimenting and look for the signal within the noise.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Resolutions to Results: The Operations Playbook</title>
        <link>https://www.viget.com/articles/resolutions-to-results-the-operations-playbook/</link>
        <guid>https://www.viget.com/articles/resolutions-to-results-the-operations-playbook/</guid>
        <pubDate>Wed, 28 Jan 2026 16:05:00 -0500</pubDate>
        <author>Bre Corn</author>
                  <category>Strategy</category>
                  <category>Process</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Every year, businesses set ambitious goals: growth targets, efficiency gains, cultural commitments. And every year, many of those goals quietly fade, not because they were wrong, but because there wasn’t enough operational structure behind them. The same dynamic plays out at the individual level with New Year’s resolutions. </p><p>In January, I have clear eyes, a fresh outlook, and the urge to improve. It feels like I can’t lose, and this year is no different. Personally, I welcome the new year as a fresh start and a chance to reset on my priorities. Like so many other people, I set goals year after year to prioritize my health and reduce stress. </p><p>Setting goals is the easy part, but keeping them? Nearly half of us are likely to abandon our resolutions by the end of January, and only 9% will complete them by year's end (<a href="https://www.forbes.com/sites/cherylrobinson/2025/12/30/new-years-resolutions-arent-enough-developing-new-habits-is-the-real-flex/">Forbes</a>).</p><p>This means that even the best laid plans and the purest intentions need operations, not just optimism to make it to the top 10%. Goal setting is a great start, <a href="https://www.atlassian.com/blog/productivity/how-to-write-smart-goals">especially well-defined ones,</a> but once the excitement wears off, all that we’re left with is the real everyday work. </p><p>On an individual level, abandoned resolutions sting but rarely have lasting consequences. For businesses, though, the stakes are higher. Deprioritizing your stated goals may enable short-term gains, but it risks long-term damage like diminished credibility, lack of alignment, and poor morale. At any scale - personal, team, or company - translating goals into action, momentum and success is enormously powerful.  </p><p>My position as a Business Development Operations Associate here at Viget is all about operationalizing success. My job is to build the systems that help Viget’s goals actually happen. Here’s how I do it:</p><ol><li><strong>Replace Motivation with Systems.</strong> Motivation fades, systems stay, and they simplify the work. In BD ops, I don’t rely on daily inspiration to track projects or follow up on tasks. Building infrastructure with automated reminders, templates, and consistent ways to analyze criteria, makes the right actions automatic and less chaotic. Setting up Slack Canvases, for example, helps reinforce that system by keeping key context, checklists, and decision notes in one living doc that the team can update over time.</li><li><strong>Create More Checkpoints.</strong> Regular reviews beat year-end recaps. In operations and my personal life, I've learned that consistent check-ins catch issues early, which limits missed follow-ups and long stretches of misaligned priorities. Getting real-time feedback, even when it's uncomfortable, lets us actually improve instead of repeating the same mistakes. Short feedback loops also promote accountability; nothing falls off anyone’s radar for long. </li><li><strong>Secure Small Wins.</strong> One improved process compounds over time. This month I might standardize agendas and call notes, which paves the way for next month’s focus on streamlined documentation and resource management. These aren't flashy; honestly, they are quite thankless— and I like them that way. However, they add up to  quicker responses, cleaner handoffs, and hopefully higher close rates. Small operational wins build the momentum that big goals require.</li></ol><p>With that being said, resolutions can be rigid and binary; you make them or break them. But operations? Operations can bend, adapt, and build. That's how we end up in the 10%– not through willpower, but through systems that make success inevitable.</p><p>How is your company approaching 2026? </p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>A Simple Way to Power Up `git add`</title>
        <link>https://www.viget.com/articles/a-simple-way-to-power-up-git-add/</link>
        <guid>https://www.viget.com/articles/a-simple-way-to-power-up-git-add/</guid>
        <pubDate>Tue, 13 Jan 2026 08:27:00 -0500</pubDate>
        <author>Danny Brown</author>
                  <category>Code</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="spooky-season-in-december"></span><h2>Spooky Season in December?! <a class="anchor" href="#spooky-season-in-december" title="Direct link to Spooky Season in December?!" aria-label="Direct link to Spooky Season in December?!">#</a></h2>
<p>I came across an image recently that really threw me for a loop. Before I show it, I wanted to note that <strong>I do not condone doing</strong> what the next image does. You have been warned.</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=b4291d76a1fc572be04c8646284f208a18d05fdb649c91e1bafe3f955714985d" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=b4291d76a1fc572be04c8646284f208a18d05fdb649c91e1bafe3f955714985d 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=6d559f3c311738767cd6e42d4620ec61579b8ffdc68a5e20667c7a2e54f72fb8 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=49b49575ffcad7a82f1cfedc990f59ede38c120da79dbec8cbec27867b79490b 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=3f21058a8434024e9f9ebf8b1bdaffbdd48d1ddc8b4e0b4b6aec5a55f1874639 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=2bd334be49fb176b34ab79e47510e83e0813964a60913f1c2019e4ccd4aee0f6 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR3ZWV0LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTIwMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5a84f3a615d1ee3eaa42d9aa1ffc0e06b4af653f5b76b08e0e091c60759bdc95 1200w" width="360" height="300" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>While some developers would prefer something like this, I personally actively and vigorously avoid using <code>git add .</code> at all costs (completely ignoring the remaining 2/3rds of the function, which I also hate). </p>
<p>Reason being, there could be some changes that I made locally that I do not want committed, but I also don't want to throw away right at the current moment. </p>
<p>There are a ton of ways to power up how you use Git's <code>add</code> command. Rather than covering a breadth of them, I want to focus today on one (well, technically two. Apologies in advance.) that I have had learned more about this past year, with the goal of inspiring <em>just one person</em> away from <code>git add .</code></p>
<span id="enter-the-patch-flag"></span><h3>Enter the <code>--patch</code> flag <a class="anchor" href="#enter-the-patch-flag" title="Direct link to Enter the --patch flag" aria-label="Direct link to Enter the --patch flag">#</a></h3>
<p>When running <code>git add</code>, one of the first flags I was taught was <code>--patch</code>, or, shortened, <code>-p</code>. </p>
<p>What <code>--patch</code> does is lets you go patch by patch within any changes made in existing files in your repo, review the difference, and choose to add (or not) each patch of changes to the index. <a href="https://git-scm.com/docs/git-add#Documentation/git-add.txt---patch">Read more about --patch` here.</a> </p>
<p>What that means in essence is, let's say you edit three files. Two are changes you want to commit, and one has changes you do not want to commit. Here is what that flow would look like when running <code>git add -p</code>:</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=81b68d509390cde4fc702c9c91e86f991bc7797c2923f4c442b150e8956b3ad0" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=81b68d509390cde4fc702c9c91e86f991bc7797c2923f4c442b150e8956b3ad0 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f76ee4b8264bb620dd28b87e675032411b77f3b36077c22c3b3ee6d285e333ba 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=70a4faa83a67af4442bc5c297219c37ce6913bfc7e8b5c997a839bda8f33fd59 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c44f72278bbbebd4108ad71d3ab2a73be011341e966369d15b3d12f4c5ae5825 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=696c25845eb3771e064e9bc8c01692bc88199fc9dad9de3a8674e90210a9b983 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=4ef6d6933ce4c84e7f3469415d0e25d46d2c4f13a8e48e5fbcc16e2ab1667768 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMTcwMy5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c5993683261a11dd7fcef71c16ecbdb6c8aa496df873b44686f084b097fdc19b 1470w" width="360" height="157" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>Ok, I see that I deleted a bunch of stuff for a Flask app that I probably should not end up committing. The interactive mode we're in gives us seven options (eight if you count the help <code>?</code> option) for how we can handle this patch. I normally just use three: <code>y</code>, <code>n</code>, and <code>q</code>.  For more info on the options, take a look at the <code>git-add</code> link from above for the git docs; I'll just be focusing on these three. </p>
<p>So since I don't want to be committing this code that will cause an error for sure, I have two options. I either hit <code>n</code> or <code>q</code> followed by the enter key. </p>
<p><code>q</code> tells git to quit out of the interactive patch prompt without adding that patch and without looking at other patches after it. </p>
<p><code>n</code> tells git to skip over this patch; do not add it for commit, but also continue to the next patch. Here, I want to hit <code>n</code>. </p>
<p>So I typed <code>n</code> and hit enter, bringing me into the next patch:</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fb7957ef77827138532e1a296b25316a509fc9a635f4838d6b836bcf42af6442" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fb7957ef77827138532e1a296b25316a509fc9a635f4838d6b836bcf42af6442 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=cb4bc4d9d150f19ee064c5a8a0c66e3112018e1ccc373e2529ef3c228b7270aa 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=ca5c4951ca93e120f284c89d8d8e600e9de41a550fc2ae6009061a031f3e4889 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b868b9baabfa3da7e334563091890262cd4b88f4cb85d35f588c9fff208c89f2 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=d75d71b87b9c4aa9899cfbc59966da19b0f92bb786c6117fba23e46fec1876e1 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=9b2f279b2b06753629f55d8e7900f12a43dae0a664b28f314a5faccadf2559b1 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjI1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=2cd1fffd8477f909867655f6248fa7f5d665c4f45b0e9a2daae6e60eb3775888 1470w" width="360" height="93" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>This is a change I do want. I realized, for example, I do not need this index route. So now I type yes, or <code>y</code>. That adds that patch. The final patch I have is this one:</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3c2c9f2fefa99c2cf39abd243a73862bacfc94eafe86a0f3d6e0c18614bc2195" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3c2c9f2fefa99c2cf39abd243a73862bacfc94eafe86a0f3d6e0c18614bc2195 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f63b16fcfeda9a9ab7caee4a36ac75e09f706f4b2f3e9c18fccee73230d3b534 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9cbc694d1155662191ab42e99d185573d9fd7166717e6c87f9b62def8976e7d4 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=01591eab9598bfa2824b402477d13ba3ac419b4bea333639dd4b2f3ea418b854 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5ade69aad4f21904ab2e4aac69986a0da62f0d2e940eac89443c1268a4e42f80 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6b0ff27eb9a2088aca3f29859717c4d78855cf3b11ca883d35dc22136aee5400 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMjcxMi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE0NzAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=69cab5ec4f018775fcdd55b1aa9cde641683f578427cfbffa4ae1c74533452fd 1470w" width="360" height="101" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>And I want this too, so I hit <code>y</code> again. After running this, here is what my <code>git status</code> looks like:</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMzEzMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5361fe05bfee54449da6019c1292d26c111e63f808d8d16db4eb23883497ed93" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMzEzMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5361fe05bfee54449da6019c1292d26c111e63f808d8d16db4eb23883497ed93 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMzEzMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c2fd61d5e93ef882db9aa3771e2e74cd451f1632899d59c5a953ff62de27b79e 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMzEzMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=ce5f53b1e414b7632d634c4022e04c03aa6ac51278d0fb548c9df532dbf1185a 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMzEzMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d4816e462718237d1765f140ec0deb1e6ecbe9f64a929653e7c3f90c2ee8a9a2 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyMzEzMS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExMDAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ec065cb92cde84fbe03dc315da7d3d18dc9faec33e75ab59f4a336fe58fd12a5 1100w" width="360" height="191" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>With the changes I wanted ready to be committed, and the change I didn't want committed still there, just not staged for commit. </p>
<p>But...hold on a minute! What are those files under "Untracked files"? I had forgotten that I added two files with very important work that I want committed. However, <code>git add -p</code> does NOT add untracked files. There have been countless times when I push up a commit and wait for CI to finish, only for there to be an obvious issue with, for example, missing a migration file entirely.</p>
<p>So here is where needing another flag comes in. Sorry about misleading you and saying we'd have a single flag, but I promise they will eventually be combined to one command!</p>
<span id="intent-to-add-n-flag"></span><h3><code>--intent-to-add</code>/<code>-N</code> flag <a class="anchor" href="#intent-to-add-n-flag" title="Direct link to --intent-to-add/-N flag" aria-label="Direct link to --intent-to-add/-N flag">#</a></h3>
<p>Note that all credit toward this solution comes from <a href="https://stackoverflow.com/a/58274324">this StackOverflow answer</a>.
This effectively adds any untracked files to the index, without adding the stuff inside of them. The way to run this command the most conveniently is with <code>git add -N .</code>.</p>
<p>Wait, so now I am recommending to add all files with the <code>.</code>?  <code>git add -N</code> needs to be told which untracked files to track. Using the period tells it to track all untracked files in the current directory, without adding the contents of the file yet. You could just as easily do <code>git add -N app/blah.py</code> to mark that single file as being intended to add. We'll see later on why choosing to add the entire directory allows us to run a single command to track all untracked files and then go through all patches, including those newly tracked files.</p>
<p>Upon running this command <code>git add -N .</code>, here is what my <code>git status</code> looks like</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDM0OS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4741bc20f2e96628b1f93cb123e853e5e85adbe1bdc8c2a14421d0805a5d5ee4" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDM0OS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=4741bc20f2e96628b1f93cb123e853e5e85adbe1bdc8c2a14421d0805a5d5ee4 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDM0OS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b107e0d9a3f101c1e7cbc9227d2f322f035c79fc5b4807f953e4d5eba736cfc8 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDM0OS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=12a4261fc64b77978e66c47e3d0837841105b0592d15b71768b160032f8432d9 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDM0OS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a5f2510abe1bd53744349cd9e885b7394e8d66841e911146eb437c682375becf 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDM0OS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEwODQsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=70900244236a74d3adbcfe21ea9c8f42d6f6f52dd8fe69045cf4b2e770fbcb0d 1084w" width="360" height="184" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>So now they moved from "Untracked files" to "Changes not staged for commit". And how do we add changes to be committed? </p>
<p>With <code>git add -p</code>!</p>

  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a944e52e00347fb0cdf0b8f390b6f8c7805d5e5402b778b31819fee5f7d899f5" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a944e52e00347fb0cdf0b8f390b6f8c7805d5e5402b778b31819fee5f7d899f5 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3e8ffb236b9d0154b45dff0fce96c54c918ff9c4854fde0e3f1b454adc1d36db 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=df2f437fe3ddc3ac9c443ec629613bd817f750c0720a911a668f679f1ca7613d 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=281fba9d94d790b6af8676c96e69a63a62b076afe1088a27a88b4a88398fdf4f 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=ec3477c7ca7d6c73929830a49ab98bef810605c8a19f3c9624559fedf2bf1289 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQzOC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNDAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=2629170b3fc2a431b3e3f823fee0661d388a74096cba8e5570ca39b7a43bc2b0 1340w" width="360" height="123" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQ1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fd3ed7335adb82bd4f2372d01a9f9a01a4a3796191add6d9a42892bc87e269b8" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQ1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=fd3ed7335adb82bd4f2372d01a9f9a01a4a3796191add6d9a42892bc87e269b8 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQ1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=c82d4863154bdf0ff903a37b3fd91703ed63c08eebf0625366329fe01a167904 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQ1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=7408beaad2456c257d90a1253c7e0ed8a51a0cea990539e9665200348934b43d 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlBhc3RlZC1pbWFnZS0yMDI1MTIxODEyNDQ1MC5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjkxOCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a7e2ace2f8fc817cc5d0e97efce8f9b6a92609b368c04908de698cb62b088a7f 918w" width="360" height="144" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>Now I see these patches of the new files! </p>
<p>Having to run two commands is a bit annoying, and <em>remembering</em> to do so is even worse. So we add a git alias to our <code>.gitconfig</code></p>
<pre><code>[alias]
    addp = !git add -N . &amp;&amp; git add -p
</code></pre>
<p>Now, every time I run <code>git addp</code>, it adds untracked files and then runs with <code>--patch</code>, giving me the best of both worlds with just one command. Note that the <code>!</code> is a way with git aliases to tell it to interpret the command as a shell command rather than just raw git. <a href="https://git-scm.com/docs/git-config">More info on git config can be found here.</a></p>
<p>One last step is that I rarely write out git commands; I have created aliases in my (<a href="https://fishshell.com/">fish</a>) shell for them. So I updated my old fish alias (technically, a fish abbreviation) from </p>
<pre><code class="language-bash">abbr -a -- gap 'git add -p'
</code></pre>
<p>to</p>
<pre><code class="language-bash">abbr -a -- gap 'git addp'
</code></pre>
<p>So my muscle memory of typing <code>gap</code> to add files never changed; it was just augmented to now add untracked files.</p>
<p>And that is how you can make a small few changes to your <code>add</code> command to make your developer experience better. This holiday season, let's take a step back from <code>git add .</code>. </p>
<p>Please...for me?</p>
<span id="bonus-stuff"></span><h3>Bonus Stuff <a class="anchor" href="#bonus-stuff" title="Direct link to Bonus Stuff" aria-label="Direct link to Bonus Stuff">#</a></h3>
<p>In case the syntax highlighting/style of the screenshots of my <code>--patch</code> caught your eye, here is how I got that setup</p>
<p>I downloaded <a href="https://github.com/dandavison/delta"><code>delta</code></a>
And ran these commands:</p>
<pre><code class="language-bash">git config --global core.pager delta
git config --global interactive.diffFilter 'delta --color-only'
git config --global delta.navigate true
git config --global merge.conflictStyle zdiff3
</code></pre>
<p>Also, here is a full list of my git-related abbreviations in my <code>~/.config/fish/config.fish</code>:</p>
<pre><code class="language-bash">abbr -a -- gco 'git checkout'
abbr -a -- gcob 'git checkout -b'
abbr -a -- gpo 'git push origin'
abbr -a -- gap 'git addp'
abbr -a -- gst 'git status'
abbr -a -- gcm 'git commit -m'
abbr -a -- gpof 'git push origin --force-with-lease'
abbr -a -- gl 'git log --oneline'
abbr -a -- grc 'git rebase --continue'
</code></pre>
<p><strong><em>Disclaimer: Don't just blindly copy and use these without understanding what they do. Or if you do, don't blame me for when something unexpected happens.</em></strong></p>
<p><strong><em>Disclaimer 2: Also, <code>git add .</code> is fine and works for many people when used correctly. It just gives me heartburn, and seems to be used incorrectly often.</em></strong></p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>&#039;Twas the Year-End of 2025</title>
        <link>https://www.viget.com/articles/twas-the-year-end-of-2025/</link>
        <guid>https://www.viget.com/articles/twas-the-year-end-of-2025/</guid>
        <pubDate>Wed, 24 Dec 2025 10:00:00 -0500</pubDate>
        <author>Jenna Billingsley</author>
                  <category>Design &amp; Content</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p><i>Every quarter, our Design and UI Development teams meet to talk shop and see what everyone's been up to across our labs. This Q4, we shared our favorite finds—things that shaped our work or just sparked inspiration and joy. And since AI comes up in pretty much every conversation these days, we figured why not let </i><a href="https://claude.ai/"><i>Claude</i></a><i> help us share them in a way that evokes the spirit of the holidays? Hope you enjoy!</i></p><hr /><p>'Twas the end of the year, and throughout our whole team,<br /> Not a pixel was moving, not even a meme.<br /> Our Figmas were closed with their booleans set right,<br /> In hopes that good workflows soon would take flight.</p><p>The designers were nestled, all snug at their desks,<br /> While visions of <a href="https://www.tillamook.com/">Tillamook</a> danced in their heads.<br /> When out on our Slack there arose such a clatter,<br /> We sprang from our chairs to see what was the matter.</p><p>Away to our screens we flew like a flash,<br /> Opening channels and clearing the cache.<br /> When what to our wondering eyes did appear,<br /> But a list of the tools that had helped us this year.</p><p>With <a href="https://claude.ai/">Claude</a> and <a href="https://code.visualstudio.com/">VSCode</a>, so lively and quick,<br /> We knew in a moment prototyping's the trick.<br /> More rapid than sprints, our discoveries came,<br /> And we whistled and shouted and called them by name:</p><p>"Now <a href="https://www.tillamook.com/">Tillamook</a>! Now <a href="https://godly.website/">Godly</a>! Now <a href="https://pudding.cool/2025/08/onions/">Pudding</a> and <a href="https://jitter.video/">Jitter</a>!<br /> On <a href="https://www.affinity.studio/">Affinity</a>! On <a href="https://svgomg.net/">SVGOMG</a>! On <a href="https://www.yourfocusfriend.com/">Focus Friend</a> that glitters!<br /> From the top of localhost to our client call,<br /> Now optimize! Animate! Prototype all!"</p><p>The visual designers—how their eyes, they did twinkle!<br /> Using <a href="https://jitter.video/">Jitter</a> for Viget, without even a wrinkle!<br /> Their scroll-based prototypes, were no fuss to make,<br /> Showed developers motion for everyone's sake.</p><p>The product designers, with a wink of their eye,<br /> Built localhost examples (Claude didn't shy).<br /> For AI-native interfaces, this was the way—<br /> To play with ideas, not debate all the day.</p><p>The platform developers laid fingers to keys,<br /> Exporting WebP files with elegant ease.<br /> With <a href="https://svgomg.net/">SVGOMG</a> they optimized fast,<br /> From one kilobyte saved to ninety percent!</p><p>We marveled at <a href="https://pudding.cool/2025/08/onions/">Pudding</a>, their onions so fine,<br /> Where animation helped storytelling to shine.<br /> And <a href="https://antlii.work/">Antlii's portfolio</a>, patterns galore,<br /> Showed generative effects we couldn't ignore.</p><p>Then someone spoke up with a curious admission,<br /> About <a href="https://openpsychometrics.org/tests/characters/">Character Quizzes</a> and product positioning.<br /> We laughed at this wild card, so random yet true,<br /> How a personality quiz became part of our crew.</p><p>But the star of our year, our communal decree,<br /> Was <a href="https://www.tillamook.com/">Tillamook's website</a>—what brilliance to see!<br /> With brand and with motion and function combined,<br /> "What would Tillamook do?" became our refrain defined.</p><p>And so as the year comes to a close,<br /> Our team had found tools that helped us compose<br /> Better handoffs, workflows, and collaborative might,<br /> We'd refined our whole process and gotten it right.</p><p>We sprang to our channels, to the team gave a cheer,<br /> "Here's to staying curious throughout the new year!<br /> May our prototypes render, our icons align,<br /> Happy 2026 to all, and to all a good design!"</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto border w-full max-w-1024" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d59960be6c95691d0d83d3915966c1b2c0869f02377c564570b5b4344d51db0f" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=d59960be6c95691d0d83d3915966c1b2c0869f02377c564570b5b4344d51db0f 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3e4a651ea7b13b737d4669ec993fab6af57c676b88bc7df0a41e45db88eab1e6 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjc2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f03b76777326a0e5c67654cecf510272fe7d9b55c84869c52059262c5f2f92a3 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjk2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=dc0c8d3544c9ba4b997a4fe5f4ee91a9beffc661c260c0b05041b83824b03714 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjExNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=27d0d85d4fa7ad1872265a3a4e80a244b2b8dbc5f51dbfad56ab5eef106fee0b 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEzNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=33a45d9118d942ffb1a96d654066ef0902c2b57270697e7060d74250abf0803d 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImltYWdlLTJfMjAyNS0xMi0yMy0xNzEwNTRfbnBpdS5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjE1MzYsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=a92e934dfcfd368594470b89c3119e3f9c34b1eb0039a245883068509857765c 1536w" width="360" height="240" alt="" sizes="(max-width: 64em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

              ]]></description>
      </item>
          <item>
        <title>Fixing TypeScript Performance Problems: A Case Study</title>
        <link>https://www.viget.com/articles/fixing-typescript-performance-problems/</link>
        <guid>https://www.viget.com/articles/fixing-typescript-performance-problems/</guid>
        <pubDate>Tue, 23 Dec 2025 10:00:00 -0500</pubDate>
        <author>Solomon Hawk</author>
                  <category>Code</category>
                  <category>Front-end Engineering</category>
                  <category>Back-end Engineering</category>
                  <category>Performance</category>
                  <category>Tooling</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>On a recent TypeScript project, we ended up in a situation where editor performance had degraded and the TypeScript compiler (and language server) was increasingly struggling with some specific areas of the codebase resulting in sluggish intellisense, long type-checking times, occasional stale type information, and a lot of frustration.</p>
<p>This project is a monorepo with 7 TypeScript packages. To the credit of the original creators, it is already using <a href="https://www.typescriptlang.org/docs/handbook/project-references.html">project references</a> (which requires the <a href="https://www.typescriptlang.org/docs/handbook/project-references.html#composite">composite</a> setting), and <a href="https://www.typescriptlang.org/tsconfig/#incremental">incremental compilation</a> but it also has some heavy TypeScript dependencies like <a href="https://github.com/prisma/prisma">￼<code>prisma</code>￼</a>, <a href="https://github.com/kysely-org/kysely">￼<code>kysely</code>￼</a>, <a href="https://github.com/gvergnaud/ts-pattern">￼<code>ts-pattern</code>￼</a>, and <a href="https://github.com/gvergnaud/hotscript">￼<code>hotscript</code>￼</a>.</p>
<span id="diagnosing-the-problem"></span><h2>Diagnosing The Problem <a class="anchor" href="#diagnosing-the-problem" title="Direct link to Diagnosing The Problem" aria-label="Direct link to Diagnosing The Problem">#</a></h2>
<p>When doing any sort of troubleshooting, my first port of call is the docs. To my knowledge, there isn’t a dedicated page on <a href="https://www.typescriptlang.org/">https://www.typescriptlang.org/</a> for this, but a quick search leads to the <a href="https://github.com/microsoft/TypeScript/wiki/Performance">GitHub wiki page on Performance</a> which has a bunch of sage advice and useful suggestions.</p>
<p>It’s wise to begin with the usual suspects:</p>
<ul>
<li>make sure your editor is up to date including plugins and extensions</li>
<li>disable all editor extensions to eliminate them from the list of suspects</li>
<li>make sure no other processes are hogging system resources</li>
<li>use the latest version of TypeScript that you can use (many releases include performance fixes and optimizations)</li>
<li>update dependencies to the latest version whenever possible (including any <code>@types</code> declarations your dependencies need)</li>
<li>use <a href="https://www.typescriptlang.org/tsconfig/#strict">strict compilation</a> unless you have a good reason not to and you know what you’re doing (it allows the compiler to check for more kinds of potential problems and also to use certain more performant algorithms like <a href="https://github.com/microsoft/TypeScript/wiki/Performance">faster variance checks</a>)</li>
</ul>
<p>From there, you can start to dive into additional information that the TypeScript compiler can provide:</p>
<span id="validating-source-files-inclusion"></span><h3>Validating Source Files Inclusion <a class="anchor" href="#validating-source-files-inclusion" title="Direct link to Validating Source Files Inclusion" aria-label="Direct link to Validating Source Files Inclusion">#</a></h3>
<p>Ensure that only the minimal set of source files are being processed by the compiler. </p>
<p><code>$ tsc --listFilesOnly</code></p>
<p><strong>Why?</strong>: fewer files = fewer types = less work for the compiler.</p>
<p>If you see files that you don’t expect in the compilation, you can ask the compiler to tell you why they are included:</p>
<p><code>$ tsc --explainFiles &gt; explanations.txt</code></p>
<p>Tweak your <code>tsconfig</code>’s  <code>include/exclude/types/typeRoots/paths</code> as necessary if adjustments are needed to omit unneeded files from the compilation</p>
<span id="performance-metrics-and-measurement"></span><h3>Performance Metrics and Measurement <a class="anchor" href="#performance-metrics-and-measurement" title="Direct link to Performance Metrics and Measurement" aria-label="Direct link to Performance Metrics and Measurement">#</a></h3>
<p>Performance tuning requires careful planning and execution. In order for two compilations to be meaningfully comparable, it’s important to make sure they’re run on the same hardware and under the same conditions (system load, battery/power, etc.). Even under carefully managed conditions, outliers can skew results so it’s wise to run the compilation several times in order to get a good sense of variance. A rigorous approach would be to use statistical analysis to calculate significance based on standard deviations, but if compilation times are long then that can be prohibitively time-consuming.</p>
<p>Establishing a baseline is crucial when doing any sort of optimization work in order to assess whether subsequent changes have a meaningful positive impact. To do this, the TypeScript compiler offers a flag that outputs detailed metrics about the compilation: <code>tsc --extendedDiagnostics</code>. When you run that command, you’ll get an output that looks like the following (you may see more than one such report if you have multiple TypeScript projects in your compilation):</p>
<table>
<thead>
<tr><th>Metric</th><th align="right">Value</th></tr>
</thead>
<tbody>
<tr><td><strong>Files</strong></td><td align="right"><strong>6</strong></td></tr>
<tr><td>Lines</td><td align="right">24,906</td></tr>
<tr><td>Nodes</td><td align="right">112,200</td></tr>
<tr><td>Identifiers</td><td align="right">41,097</td></tr>
<tr><td>Symbols</td><td align="right">27,972</td></tr>
<tr><td><strong>Types</strong></td><td align="right"><strong>8,298</strong></td></tr>
<tr><td><strong>Memory used</strong></td><td align="right"><strong>77,984K</strong></td></tr>
<tr><td>Assignability cache size:</td><td align="right">33,123</td></tr>
<tr><td>Identity cache size</td><td align="right">2</td></tr>
<tr><td>Subtype cache size</td><td align="right">0</td></tr>
<tr><td><strong>I/O Read time</strong></td><td align="right"><strong>0.01s</strong></td></tr>
<tr><td><strong>Parse time</strong></td><td align="right"><strong>0.44s</strong></td></tr>
<tr><td><strong>Program time</strong></td><td align="right"><strong>0.45s</strong></td></tr>
<tr><td><strong>Bind time</strong></td><td align="right"><strong>0.21s</strong></td></tr>
<tr><td><strong>Check time</strong></td><td align="right"><strong>1.07s</strong></td></tr>
<tr><td>transformTime time</td><td align="right">0.01s</td></tr>
<tr><td>commentTime time</td><td align="right">0.00s</td></tr>
<tr><td>I/O Write time</td><td align="right">0.00s</td></tr>
<tr><td>printTime time</td><td align="right">0.01s</td></tr>
<tr><td>Emit time</td><td align="right">0.01s</td></tr>
<tr><td>Total time</td><td align="right">1.75s</td></tr>
</tbody>
</table>
<p>Of the many data points this analysis reports, the most useful metrics to look at are the number of files and types, amount of memory used, and the amount of time spent doing I/O, parsing, and type-checking. If I/O times are high or the number of files/lines are high look at <a href="#validating-source-files-inclusion">Validating Source Files Inclusion</a>.</p>
<span id="deeper-insights-with-compiler-traces"></span><h3>Deeper Insights with Compiler Traces <a class="anchor" href="#deeper-insights-with-compiler-traces" title="Direct link to Deeper Insights with Compiler Traces" aria-label="Direct link to Deeper Insights with Compiler Traces">#</a></h3>
<p>If the compiler is spending a lot of time in the <strong>parse, bind, or check</strong> phases, then capturing a trace can help identify which parts of your program are contributing most to this expense. The compiler offers a flag that instruments everything it does which produces a dataset that can be mined for deeper insights: <a href="https://github.com/microsoft/TypeScript/wiki/Performance#performance-tracing">￼<code>tsc --generateTrace &lt;output_dir&gt;</code>￼</a> (available since TypeScript 4.1). If this command is giving you trouble, make sure you’re not doing an incremental build by passing in the <code>-f</code> argument (for build mode) or <code>--incremental false</code> (for regular compilation).</p>
<p>Running this command will output some files into the given directory. The outputs will look a bit different depending whether you’re running <code>tsc</code> in build mode (<code>-b</code>) or not,  but either way there will be one or more JSON files for <code>types</code> and <code>trace</code>. Look for the largest of these files as a starting point or check <a href="https://github.com/microsoft/TypeScript-wiki/blob/main/Performance-Tracing.md">these docs</a> for a more complete explanation.</p>
<p>These traces can be analyzed with Chrome’s <a href="https://github.com/catapult-project/catapult/blob/main/tracing/README.md">trace viewer</a> (which should be available at <code>about://tracing</code> in Chromium-based browsers including <a href="https://arc.net/">Arc</a>). You can also try the newer <a href="https://ui.perfetto.dev/">Perfetto UI</a> but I have had better luck with the older method.</p>
<span id="issues-i-ran-into"></span><h3>Issues I ran into: <a class="anchor" href="#issues-i-ran-into" title="Direct link to Issues I ran into:" aria-label="Direct link to Issues I ran into:">#</a></h3>
<h4><code>tsc</code> fails with a Heap Out of Memory error when running extended diagnostics and/or traces</h4>
<p>By default <code>node</code> processes (since version 12) have a maximum heap size that depends on the system’s available memory. On many modern systems this defaults to ~2GB. If you run into errors related to memory, you can bump up the maximum allowed memory usage by passing a flag to node (note this command runs both the extended diagnostics and generates trace files during one compilation run):</p>
<p><code>$ node --max-old-space-size=8192 ./node_modules/.bin/tsc -b --extendedDiagnostics --generateTrace ./ts-trace</code></p>
<h4>Trace Files can’t be analyzed by trace viewer</h4>
<p>Trace files can be quite large — so much so that tools like <code>about://tracing</code> and Perfetto UI will refuse to process them. That was the case for some but not all of the trace files for me and I ended up relying on <a href="https://www.npmjs.com/package/@typescript/analyze-trace">￼<code>@typescript/analyze-trace</code>￼</a> to understand them.</p>
<h4>The recommended <code>process-tracing</code> script outputs nothing</h4>
<p>The <a href="https://github.com/microsoft/TypeScript-wiki/blob/main/Performance-Tracing.md">Performance Tracing docs</a> suggest using a <a href="https://www.npmjs.com/package/process-tracing">￼<code>process-tracing</code>￼</a> script to sample extra large traces in order to produce smaller traces that are easier to work with. In practice, this script just output empty files when I tried it. YMMV.</p>
<span id="identifying-the-root-cause"></span><h2>Identifying the Root Cause(s) <a class="anchor" href="#identifying-the-root-cause" title="Direct link to Identifying the Root Cause(s)" aria-label="Direct link to Identifying the Root Cause(s)">#</a></h2>
<p>In our specific case, <a href="https://www.npmjs.com/package/@typescript/analyze-trace">@typescript/analyze-trace</a> was the key to identify the most problematic application code. Because of the monorepo structure of this project, there were 6 or 7 trace files to consider. Not all of them contained obvious issues, but eventually I stumbled upon this one and was immediately intrigued.</p>
<p><code>$ npx analyze-trace ./ts-trace</code></p>
<pre><code>Analyzed /&lt;client&gt;/&lt;project&gt;/packages/&lt;package&gt;/tsconfig.json (trace.12493-5.json)
Hot Spots
├─ Check file [35m/&lt;client&gt;/&lt;project&gt;/packages/&lt;package&gt;/src/tasks/extractions/common.ts (80609ms)
│  └─ Check deferred node from (line 10, char 10) to (line 29, char 4) (80608ms)
│     └─ Check expression from (line 11, char 12) to (line 28, char 7) (80607ms)
│        └─ Check expression from (line 11, char 15) to (line 28, char 6) (80607ms)
│           ├─ Check expression from (line 13, char 7) to (line 27, char 8) (51716ms)
│           │  └─ Check expression from (line 14, char 9) to (line 26, char 12) (51711ms)
│           │     ├─ Check expression from (line 24, char 18) to (line 25, char 69) (38423ms)
│           │     │  └─ Check expression from (line 25, char 13) to (line 25, char 69) (38422ms)
│           │     │     └─ Check expression from (line 25, char 44) to (line 25, char 68) (14922ms)
│           │     └─ Check expression from (line 14, char 9) to (line 24, char 17) (13287ms)
│           │        └─ Check expression from (line 14, char 9) to (line 23, char 12) (13287ms)
│           │           └─ Check expression from (line 14, char 9) to (line 17, char 21) (13262ms)
│           │              └─ Check expression from (line 14, char 9) to (line 16, char 42) (13261ms)
│           │                 └─ Check expression from (line 16, char 19) to (line 16, char 41) (4364ms)
│           └─ Check expression from (line 12, char 7) to (line 12, char 32) (28891ms)
└─ Check file /&lt;client&gt;/&lt;project&gt;/packages/&lt;package&gt;/src/tasks/transforms/operation.ts (712ms)
   └─ Check expression in /&lt;client&gt;/&lt;project&gt;/packages/&lt;package&gt;/src/tasks/extractions/operation.ts from (line 46, char 50) to (line 46, char 57) (611ms)
      └─ Check expression from (line 48, char 17) to (line 191, char 10) (502ms)
         └─ Check expression from (line 48, char 17) to (line 190, char 19) (502ms)
            └─ Check expression from (line 48, char 17) to (line 190, char 13) (500ms)
               └─ Check expression from (line 48, char 17) to (line 188, char 4) (500ms)
                  └─ Check expression from (line 168, char 10) to (line 187, char 6) (322ms)
                     └─ Check expression from (line 169, char 5) to (line 187, char 6) (322ms)
                        └─ Check expression from (line 169, char 15) to (line 186, char 59) (321ms)
                           └─ Check expression from (line 170, char 7) to (line 186, char 59) (321ms)
                              └─ Check expression from (line 170, char 7) to (line 186, char 18) (320ms)
                                 └─ Check expression from (line 170, char 7) to (line 185, char 63) (320ms)
                                    └─ Check expression from (line 170, char 7) to (line 185, char 18) (320ms)
                                       └─ Check expression from (line 170, char 7) to (line 184, char 10) (320ms)
                                          └─ Check expression from (line 170, char 7) to (line 180, char 18) (319ms)
                                             └─ Check expression from (line 170, char 7) to (line 179, char 10) (319ms)
                                                └─ Check expression from (line 170, char 7) to (line 174, char 18) (317ms)
                                                   └─ Check expression from (line 170, char 7) to (line 173, char 55) (317ms)
                                                      └─ Check expression from (line 170, char 7) to (line 173, char 18) (316ms)
                                                         └─ Check expression from (line 170, char 7) to (line 172, char 40) (316ms)
</code></pre>
<p>It’s not that easy to see but there is a file in this trace that took <strong>80,609ms</strong> (80 seconds) to type-check. That’s a long time! Why did it take so long?</p>
<p>The next line shows that in this exceptional case, the top-level check is a deferred node <code>Check deferred node from (line 10, char 10) to (line 29, char 4) (80608ms)</code> which gives us some line and column numbers to check out. In this context <code>deferred</code> just means that the compiler does not have enough information yet to resolve the type and it must continue the compilation in order to gather more information (often other inferred types) so that it can fully resolve this deferred node.</p>
<p>Here’s what I discovered when I opened that file and looked at line 10, char 10 (the details here have been obfuscated):</p>
<pre><code class="language-ts">import type { Db } from '@lib/kysely/db';
import type { ExpressionBuilder, ExpressionWrapper } from 'kysely';

export const existsValidThing = &lt;
  const T extends keyof Db,
  EB extends ExpressionBuilder&lt;Db, keyof Db&gt;,
&gt;(
  thingIdRef: ExpressionWrapper&lt;Db, T, string | null&gt;,
) =&gt; {
  return ({ eb, or, exists }: EB) =&gt; {
    return or([
      eb(thingIdRef, 'is', null),
      exists(
        eb
          .selectFrom('thing as t')
          .select(eb.lit(1).as('exists'))
          .innerJoin('category', 'category', 't.category_id')
          .where('t.id', '=', thingIdRef),
      ),
    ]);
  };
};
</code></pre>
<p>It’s a bit awkward, right? Line 10, char 10 is the beginning of the anonymous lambda function that is returned from this <code>existsValidThing</code> helper function. So why is the type of this helper function so difficult for TypeScript to resolve?</p>
<p>There are a few reasons but ultimately it comes down to:</p>
<ol>
<li><code>Db</code> is a large interface filled with a mapping of ~30 database tables and their many fields (dozens per table)</li>
<li><code>kysely</code> is built in such a way that heavily relies on type inference and distributing across large unions (i.e. the tables in a database, or the fields in a table, one <a href="https://github.com/kysely-org/kysely/issues/867#issuecomment-2227324183">GitHub commenter</a> casually floated the idea that the complexity was on the order of <strong>O(n^x)</strong> in some edge cases)</li>
</ol>
<p>Even though there was an explicit type declared for the argument to the lambda (<code>EB</code>, coming from the generic), TypeScript still has to infer the return type of this lambda which is itself a complex series of nested function calls each requiring inference to determine their return types. </p>
<p>The things <code>kysely</code> lets you do with strong typing are fairly magical. However, trying to split those things off into re-usable helpers can produce unexpected type-checking bottlenecks with sufficiently large databases.</p>
<span id="the-fix"></span><h2>The Fix(es) <a class="anchor" href="#the-fix" title="Direct link to The Fix(es)" aria-label="Direct link to The Fix(es)">#</a></h2>
<p>There were a bunch of things we tweaked to improve performance but <strong>the largest gains came from just deleting these problematic kysely helper functions and inlining their queries</strong> where they were being used.</p>
<p>Other things we did that helped:</p>
<ol>
<li>fixed circular dependencies (see <a href="https://github.com/pahen/madge">madge</a>)</li>
<li>removed unused types<ol>
<li><code>prisma-zod-generator</code> generated types</li>
<li>uninstalled unused dependencies</li>
<li>deduplicated packages</li>
</ol>
</li>
<li>clean up and removed <a href="https://tkdodo.eu/blog/please-stop-using-barrel-files">barrel files</a></li>
<li>upgraded packages to newer versions</li>
<li>upgraded <code>node</code> and ensured everything was on the same version</li>
<li>added <code>syncpack</code> and set up monorepo linting rules</li>
</ol>
<span id="results"></span><h2>Results <a class="anchor" href="#results" title="Direct link to Results" aria-label="Direct link to Results">#</a></h2>
<p>Performance matters. Many factors impact the developer experience. Even when a team’s values and culture place adequate importance on maintaining and improving performance, still other elements may conspire to threaten daily productivity.</p>
<p>The tale for this specific project is one of triumph. By the numbers it was a bloodbath.</p>
<table>
<thead>
<tr><th>Metric</th><th>Before</th><th>After</th><th>Change</th><th>% Change</th></tr>
</thead>
<tbody>
<tr><td><strong>Files</strong></td><td>14,628</td><td>10,445</td><td>-4,183</td><td>-28.6%</td></tr>
<tr><td><strong>Lines of Library</strong></td><td>85,573</td><td>87,322</td><td>+1,749</td><td>+2.0%</td></tr>
<tr><td><strong>Lines of Definitions</strong></td><td>1,563,401</td><td>1,458,375</td><td>-105,026</td><td>-6.7%</td></tr>
<tr><td><strong>Lines of TypeScript</strong></td><td>205,561</td><td>89,162</td><td>-116,399</td><td>-56.6%</td></tr>
<tr><td><strong>Lines of JavaScript</strong></td><td>0</td><td>0</td><td>0</td><td>0.0%</td></tr>
<tr><td><strong>Lines of JSON</strong></td><td>197,264</td><td>197,258</td><td>-6</td><td>-0.0%</td></tr>
<tr><td><strong>Lines of Other</strong></td><td>0</td><td>0</td><td>0</td><td>0.0%</td></tr>
<tr><td><strong>Identifiers</strong></td><td>2,591,445</td><td>1,983,548</td><td>-607,897</td><td>-23.5%</td></tr>
<tr><td><strong>Symbols</strong></td><td>12,162,183</td><td>6,238,779</td><td>-5,923,404</td><td>-48.7%</td></tr>
<tr><td><strong>Types</strong></td><td>4,605,085</td><td>2,303,043</td><td>-2,302,042</td><td>-50.0%</td></tr>
<tr><td><strong>Instantiations</strong></td><td>41,244,435</td><td>25,282,289</td><td>-15,962,146</td><td>-38.7%</td></tr>
<tr><td><strong>Memory used</strong></td><td>7,065,937K</td><td>3,522,442K</td><td>-3,543,495K</td><td>-50.2%</td></tr>
<tr><td><strong>Assignability cache size</strong></td><td>7,530,942</td><td>989,151</td><td>-6,541,791</td><td>-86.9%</td></tr>
<tr><td><strong>Identity cache size</strong></td><td>36,263</td><td>41,336</td><td>+5,073</td><td>+14.0%</td></tr>
<tr><td><strong>Subtype cache size</strong></td><td>58,647</td><td>20,457</td><td>-38,190</td><td>-65.1%</td></tr>
<tr><td><strong>Strict subtype cache size</strong></td><td>111,640</td><td>147,930</td><td>+36,290</td><td>+32.5%</td></tr>
<tr><td><strong>Tracing time</strong></td><td>2.72s</td><td>0.46s</td><td>-2.26s</td><td>-83.1%</td></tr>
<tr><td><strong>I/O Read time</strong></td><td>1.30s</td><td>0.93s</td><td>-0.37s</td><td>-28.5%</td></tr>
<tr><td><strong>Parse time</strong></td><td>2.69s</td><td>1.56s</td><td>-1.13s</td><td>-42.0%</td></tr>
<tr><td><strong>ResolveModule time</strong></td><td>1.00s</td><td>0.66s</td><td>-0.34s</td><td>-34.0%</td></tr>
<tr><td><strong>ResolveTypeReference time</strong></td><td>0.03s</td><td>0.02s</td><td>-0.01s</td><td>-33.3%</td></tr>
<tr><td><strong>ResolveLibrary time</strong></td><td>0.02s</td><td>0.02s</td><td>0.00s</td><td>0.0%</td></tr>
<tr><td><strong>Program time</strong></td><td>6.59s</td><td>4.11s</td><td>-2.48s</td><td>-37.6%</td></tr>
<tr><td><strong>Bind time</strong></td><td>1.88s</td><td>0.97s</td><td>-0.91s</td><td>-48.4%</td></tr>
<tr><td><strong>Check time</strong></td><td>226.19s</td><td>38.23s</td><td>-187.96s</td><td>-83.1%</td></tr>
<tr><td><strong>transformTime time</strong></td><td>1.10s</td><td>0.24s</td><td>-0.86s</td><td>-78.2%</td></tr>
<tr><td><strong>commentTime time</strong></td><td>0.15s</td><td>0.02s</td><td>-0.13s</td><td>-86.7%</td></tr>
<tr><td><strong>I/O Write time</strong></td><td>0.40s</td><td>0.06s</td><td>-0.34s</td><td>-85.0%</td></tr>
<tr><td><strong>printTime time</strong></td><td>2.60s</td><td>0.51s</td><td>-2.09s</td><td>-80.4%</td></tr>
<tr><td><strong>Emit time</strong></td><td>2.61s</td><td>0.51s</td><td>-2.10s</td><td>-80.5%</td></tr>
<tr><td><strong>Dump types time</strong></td><td>132.73s</td><td>33.63s</td><td>-99.10s</td><td>-74.7%</td></tr>
<tr><td><strong>Config file parsing time</strong></td><td>0.08s</td><td>0.04s</td><td>-0.04s</td><td>-50.0%</td></tr>
<tr><td><strong>Up-to-date check time</strong></td><td>0.00s</td><td>0.00s</td><td>0.00s</td><td>0.0%</td></tr>
<tr><td><strong>Build time</strong></td><td>374.32s</td><td>78.55s</td><td>-295.77s</td><td>-79.0%</td></tr>
</tbody>
</table>
<span id="most-significant-reductions"></span><h3><strong>Most Significant Reductions:</strong> <a class="anchor" href="#most-significant-reductions" title="Direct link to Most Significant Reductions:" aria-label="Direct link to Most Significant Reductions:">#</a></h3>
<ul>
<li><strong>I/O Write time</strong>: -85.0% (0.40s → 0.06s)</li>
<li><strong>Tracing time</strong>: -83.1% (2.72s → 0.46s)</li>
<li><strong>Check time</strong>: -83.1% (226.19s → 38.23s)</li>
<li><strong>Emit time</strong>: -80.5% (2.61s → 0.51s)</li>
<li><strong>Print time</strong>: -80.4% (2.60s → 0.51s)</li>
<li><strong>Build time</strong>: -79.0% (374.32s → 78.55s)</li>
</ul>
<span id="resource-usage"></span><h3><strong>Resource Usage:</strong> <a class="anchor" href="#resource-usage" title="Direct link to Resource Usage:" aria-label="Direct link to Resource Usage:">#</a></h3>
<ul>
<li><strong>Memory usage</strong>: -50.2% (7.1GB → 3.5GB)</li>
<li><strong>Files processed</strong>: -28.6% (14,628 → 10,445)</li>
<li><strong>TypeScript lines</strong>: -56.6% (205K → 89K)</li>
</ul>
<span id="overall-impact"></span><h3><strong>Overall Impact:</strong> <a class="anchor" href="#overall-impact" title="Direct link to Overall Impact:" aria-label="Direct link to Overall Impact:">#</a></h3>
<p>The optimization reduced the total build time from <strong>6.2 minutes to 1.3 minutes</strong>, representing a <strong>79% improvement</strong> in compilation speed.</p>
<p>That’s nice and all but we’re rarely running a fresh, full compilation with no cache. The real impact is <strong>a responsive language server</strong> and instant intellisense.</p>
<p>If you know your tools, have a bit of time and patience, and are motivated to make things better there’s a lot you can do even when faced with what feels like an impossible task.</p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>Don&#039;t Let Vibe Code Become Legacy Code</title>
        <link>https://www.viget.com/articles/dont-let-vibe-code-become-legacy-code/</link>
        <guid>https://www.viget.com/articles/dont-let-vibe-code-become-legacy-code/</guid>
        <pubDate>Mon, 22 Dec 2025 11:30:00 -0500</pubDate>
        <author>Nick Telsan</author>
                  <category>Code</category>
                  <category>Front-end Engineering</category>
                  <category>Back-end Engineering</category>
                  <category>Tooling</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>This might be shocking coming from a developer, but I like to write code. I usually spend a good chunk of my weekend tooling around with my home server set up or building side projects that will never see the light of day. My time is limited though, so if I really want a little app for my own personal use, I'll let Cursor or Claude Code (or whatever else new and shiny that week) write the code for me. This works really well... until I come back the next weekend and realize I have no idea where to start changing code to introduce new features. All of that code has now become legacy code.</p>
<p>What is legacy code and why do we care? Can't we just let the AI continue to work on the code?</p>
<p>Legacy code is code that you cannot comfortably change because either you don't understand why it was written the way it was or it's such a mess that it easier to code around it than to fix it. </p>
<p>On a little solo project, this is probably not a big deal — just keep letting the AI build more and more legacy code. Sure, you might never understand it, but you can always just put a TODO in the repo saying you'll rewrite it in Rust anyways. </p>
<p>When you start working with a team, that code that you're generating costs someone else time and maybe a little sanity. Your colleague who was told to change something in that vibe coded feature has to spend a potentially non-trivial amount of time trying to figure where they could even start to change something, and then they have to hope that they don't break something with their change.</p>
<p>Legacy code tends to "breed," generating more legacy code. There is nothing more permanent than a temporary fix. It's easy to layer on more and more workarounds, and each of those workarounds adds more tech debt and frustrates your colleagues. At some point, you'll hit a critical mass where the only reasonable way to add a new feature is a full rewrite, costing you time that could have been spent on new features, the chance for regressions, and good will from your client.</p>
<p>You might be thinking that this is just an issue if you don't write tests, but this isn't just about test coverage. It's about unclear abstractions, inconsistent patterns, and logic that made sense to the AI but not to humans. Tests tell you <em>if</em> something breaks, but they don't tell you <em>where</em> to make your change or <em>why</em> the code does what it does.</p>
<p>Let's take a look at how to go from "vibe coding" to engineering with AI-powered tools.</p>
<span id="own-it"></span><h2>Own It <a class="anchor" href="#own-it" title="Direct link to Own It" aria-label="Direct link to Own It">#</a></h2>
<p>One of my favorite ways to use AI tools — and the reason I haven't called any of this "agentic" yet — is to just ask it questions and write the code myself. For simple or repetitive things, I'll let the agent handle the coding, but we learn best by doing. Just the act of typing the code is going to help it stick in your head and is going to give you the chance to adjust the output to be more human-friendly. This isn't necessarily very efficient if only because I'm a slow and error-prone typist, but it does seem to help me learn about how to use a new package or pattern.</p>
<p>If that's not appealing to you, own something. Something that you write. Test driven development is a great pattern for this. Write the tests yourself and don't let the AI change them except small details like parameter names. You might be a level abstracted from the code, but you'll still have a good grasp on how it should work. Another good option is to manually write integration points. This could be defining the database or endpoint schemas, or, if you're using something like TypeScript, define the inputs and outputs of the function.</p>
<p>Regardless of how you choose to approach this, the point is for you to really think about the problem you're solving and get your hands a little dirty. Just a little bit of manual work will help the ideas stick around and give you better insight into what is good code and what is not.</p>
<span id="review-your-own-pRs"></span><h2>Review Your Own PRs <a class="anchor" href="#review-your-own-pRs" title="Direct link to Review Your Own PRs" aria-label="Direct link to Review Your Own PRs">#</a></h2>
<p>Whenever you finish a feature and put up your PR, the first person to review that code should be you. If you wrote all the code yourself, you might have some writer's blindness, but hopefully you can catch silly things so your teammates can focus on the meaningful code. If the code is generated, you should scrutinize it. Your name is on these commits. If something isn't right with the implementation or if someone has a question about the feature, they're going to come to you first. Make sure the code is code that you understand and that you are comfortable having your name on it. Saying "oh, I use Codex for this" isn't going to cut it when there's a bug in production.</p>
<span id="write-commits-for-your-future-self"></span><h2>Write Commits for Your Future Self <a class="anchor" href="#write-commits-for-your-future-self" title="Direct link to Write Commits for Your Future Self" aria-label="Direct link to Write Commits for Your Future Self">#</a></h2>
<p>Your commits are not just to make your contributions chart on Github look good. They are the roadmap that tells you how you got from point A to point B all the way to point <code>1c17df6</code>. Some of the best tools you have for understanding a code base are things like <code>git diff</code> and <code>git blame</code>. Looking at the code as it currently is doesn't give you enough information to understand the "why" of the code. However, looking at change over time (especially with good commit messages), you can usually piece together the "why."</p>
<p>Whether or not you're using an AI tool, a good rule of thumb is "one logical change per commit." If you're using an AI tool, you might adapt this to "one (complete) prompt per commit". If you tell the AI to add a new function, once it's done and the functionality is right (which could take multiple prompts), write your commit. It's better to have too many commits than not enough (something I don't follow enough). You can always come back through and adjust or edit commits as you need.</p>
<span id="centralize-your-tooling"></span><h2>Centralize Your Tooling <a class="anchor" href="#centralize-your-tooling" title="Direct link to Centralize Your Tooling" aria-label="Direct link to Centralize Your Tooling">#</a></h2>
<p>Everyone on our team uses different tools — Windsurf, Cursor, Codex, Claude Code, and probably more. Each of those manages some form of rules differently. However, most tools do understand <a href="https://agents.md/">AGENTS.md</a>. You can think of <code>AGENTS.md</code> as being the <code>README.md</code> for your AI tooling. It's not as powerful as tooling-specific rules, but it is a good place to drop repo-wide context. This can be things like basic scripts and commands, style guides for code and commits, and general context about the project. If you're a monorepo, you can even nest them so that each package has their own special context.</p>
<p>Getting everyone on the same tool is also great, but we're in period of exploration and invention right now. There's a lot of value in trying a bit of everything and using <code>AGENTS.md</code> still gives you a reasonable starting place for context and rules.</p>
<span id="wrap-up"></span><h2>Wrap Up <a class="anchor" href="#wrap-up" title="Direct link to Wrap Up" aria-label="Direct link to Wrap Up">#</a></h2>
<p>The genie is out of the bottle. Agentic coding and AI tooling are here to stay. These tools open all sorts of doors for us. Designers prototype their ideas without having to learn all of React,  developers focus on the really tricky architectural problems, and everyone can get their weekend projects done (so that they can start another one).</p>
<p>Owning your code, reviewing your own PRs, committing frequently, and sharing knowledge with your team: none of this is exactly groundbreaking. That's because these principles are just best practices. Turns out that the practices our industry has been developing for decades just kind of work. We just need to update a few flows for the modern day. </p>
<p>None of us can really predict what software development is going to look like in five years or a decade, but I know I'm still going to be writing code. As these tools evolve, I'm not going to shy away from them. As long as we keep building on these principles, no matter what these tools become, we'll still be able to understand the code and get our hands dirty when we need to.</p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>Viget’s Favorite Books of 2025</title>
        <link>https://www.viget.com/articles/vigets-favorite-books-of-2025/</link>
        <guid>https://www.viget.com/articles/vigets-favorite-books-of-2025/</guid>
        <pubDate>Fri, 19 Dec 2025 10:00:00 -0500</pubDate>
        <author>Laura Sweltz</author>
                  <category>News &amp; Culture</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Another year, another favorite books roundup! These aren’t necessarily books published in 2025 — just books that we read and enjoyed this year. Without further ado, our 2025 favorites:</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZXNlLWJ1cm5pbmctc3RhcnMuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b85b29c46da725238f96a9d06f5358c87ba0ccccac52b706f149e257b1eaf364" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZXNlLWJ1cm5pbmctc3RhcnMuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=b85b29c46da725238f96a9d06f5358c87ba0ccccac52b706f149e257b1eaf364 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZXNlLWJ1cm5pbmctc3RhcnMuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozMTEsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=df81ff0e717a1c00615b70489480522f38293430cee4e55687432068e4c3ab0d 311w" width="360" height="556" alt="" sizes="(max-width: 125em), 100vw" style="width: 311px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/these-burning-stars-bethany-jacobs/3e0736b42ee03eba">The Burning Stars</a></h2><p><strong>Bethany Jacobs</strong></p><p><i>I read These Burning Stars because of a glowing recommendation. What hooked me? "Sci-fi space opera" and "morally grey characters, a.k.a., 'let women do evil things!!'" That pretty much sums it up.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/lhull">Lexie Hull</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1mYXZvcml0ZXMuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6008fb98da5e1384887696e1078a1f49aaad81015e73be63c587af7e326b7372" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1mYXZvcml0ZXMuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=6008fb98da5e1384887696e1078a1f49aaad81015e73be63c587af7e326b7372 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1mYXZvcml0ZXMuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozMTEsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=82e079075fe0674932641694f45675eb00080465ef6838082287c7856cc6eba8 311w" width="360" height="556" alt="" sizes="(max-width: 125em), 100vw" style="width: 311px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/the-favorites-a-novel-layne-fargo/cef49ddca23ea84e">The Favorites</a></h2><p><strong>LAYNE FARGO</strong></p><p><i>The Favorites is a frothy page-turner set in the world of elite ice dancing. This Wuthering Heights-inspired tale follows Kat and Heath from their early days as childhood sweethearts to their run as ice dance champions and ultimately the demise of their partnership at the Olympics. It unfolds through a series of documentary interviews that make the drama leap off the page — you’ll have to remind yourself that these are fictional characters. The audiobook is exceptionally well done and features a full cast which really brings the documentary aspect to life. You won’t want to put this one down.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/lsweltz/">Laura Sweltz</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Imhvd2xzLW1vdmluZy1jYXN0bGUuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=efb79d5a6532bd212b0320490dd4e7ca3e20485eb9970d0ea045a8eff303884e" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Imhvd2xzLW1vdmluZy1jYXN0bGUuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=efb79d5a6532bd212b0320490dd4e7ca3e20485eb9970d0ea045a8eff303884e 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Imhvd2xzLW1vdmluZy1jYXN0bGUuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozMjIsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=e4db7c1b07d6e7c9f566578d5ebc081be300a5320e02135f1777f5f724a7e3b7 322w" width="360" height="537" alt="" sizes="(max-width: 125em), 100vw" style="width: 322px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/howl-s-moving-castle-diana-wynne-jones/fa7899e763cf8c37"><strong>Howl's Moving Castle</strong></a></h2><p><strong>DIANA WYNNE JONES</strong></p><p><i>I've finally gotten around to reading Howl's Moving Castle, which, yes, inspired the movie. I like to think of the book and the movie as separate stories, since they're pretty different. It's witty, whimsical, and of course, magical. The book has characters that are flawed but fun to be around, and dives deeper into who Sophie is as she wades through her magical misfortunes. If you want a lighthearted adventure, wizard combat, characters that can be selfish but also sincere, or you just didn't know the movie was based on a book: this one's for you.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/jyu/">Jackie Yu</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1vbG9rYWkuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3fc5c106a65a3f599f5595bfc91858fa503a76fe5d0832f7268954c3840a4ae7" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1vbG9rYWkuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3fc5c106a65a3f599f5595bfc91858fa503a76fe5d0832f7268954c3840a4ae7 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im1vbG9rYWkuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozMjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=5868113965f1fbede7762e0bf6fb78561e7aca980828969379011d42c5e130bc 320w" width="360" height="540" alt="" sizes="(max-width: 125em), 100vw" style="width: 320px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/moloka-i-a-novel-alan-brennert/61935571097f062d">Moloka'i</a></h2><p><strong>ALAN BRENNERT</strong></p><p><i>This book had been on my to-read list for years, but when my mom moved to Molokai this summer for work, I knew it was finally time! Starting in 1866, anyone who showed signs of leprosy (Hansen's disease) was exiled to the island of Molokai for lifelong quarantine. This policy, along with the stigma surrounding the disease, lasted until 1969, even as scientists learned more about the disease and its actually very low transmissibility. This sweeping historical fiction follows a girl sent to Molokai as a child and takes you all the way through the 20th century, teaching you so much about Hawaiian history along the way. It's heartbreaking but focused on resilience and the question of how to continue living.</i></p><p><i>The leprosy settlement of Kalaupapa is located on a spit of land surrounded by the highest sea cliffs in the world, isolated from the rest of the island (where there's a lot more history and communities beyond the settlement). The geography wasn't something I could fully comprehend while reading until I got to see those cliffs in person from a tiny plane while visiting my mom last month. Molokai is a fascinating place in so many ways, and this book was a great read!</i></p><p>Recommended by <a href="https://www.viget.com/about/team/ndixon">Natalie Dixon</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFsbC1mb3Vycy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f20a83bff4a6399b70c21f29ab8ecbd64b839790c869f6f23ef1b89348ed27bc" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFsbC1mb3Vycy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=f20a83bff4a6399b70c21f29ab8ecbd64b839790c869f6f23ef1b89348ed27bc 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFsbC1mb3Vycy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjMwNywiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=abe19693c1f1f4a85ab6701eaf2026c3b8a7d305580a6192f8117a09835b0c47 307w" width="360" height="563" alt="" sizes="(max-width: 125em), 100vw" style="width: 307px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/all-fours-a-novel-miranda-july/b225d4652659fcc6">All Fours</a></h2><p><strong>MIRANDA JULY</strong></p><p><i>I've never encountered a book that had me laughing out loud one moment while cringing with the truthful pain of a deeply human challenge the next. Irreverent, honest, and surprising, this book follows a semi-famous artist (a thinly veiled version of Miranda July herself) as she announces her plan to drive across the country from California to New York. Though she doesn't make it further than 30 minutes from her own home, she goes on a very different kind of journey, one of self discovery and creative and sexual reinvention. Exploring themes of aging, motherhood, parenting, partnership, and how it's never too late to mine a different seam of the self, this book was so wonderful I immediately flipped it back over and reread it.</i></p><p>Recommended by Liza Chabot</p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1jb3JyZXNwb25kZW50LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8ddac778be2766c3c23a2e63c72d56ed92fc41f5568a659529ee57c80af7213b" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1jb3JyZXNwb25kZW50LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=8ddac778be2766c3c23a2e63c72d56ed92fc41f5568a659529ee57c80af7213b 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1jb3JyZXNwb25kZW50LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzIwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=70774dd974cd4b3b85683ca7bf8e51255cf9063e4b7ac5aeff3585bc3b891802 320w" width="360" height="540" alt="" sizes="(max-width: 125em), 100vw" style="width: 320px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/the-correspondent-a-novel-virginia-evans/87852b9a3587f7c2">The Correspondent</a></h2><p><strong>VIRGINIA EVANS</strong></p><p><i>This is a beautiful life story of a woman who had both a wonderful and heartbreaking life, but the twist is that it's all told through the letters she writes and receives. She writes to her friends and family, but also authors and screenwriters. She even has a teenage penpal, who's the son of a former colleague. We learned she started her letter writing early in life and has continued it because she finds it's a better way of communicating than the more modern ways like texting or emailing that many - most - others have adopted. The storytelling by interweaving the letters was quite well done, and the nuggets or pieces of stories Evans left really carried through the book. I zipped through this one in a couple of days, and found myself longing for the days of penpals and letters in the mailbox.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/ksassone">Kara Sassone</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImN1dHRpbmctZm9yLXN0b25lLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=6a41b4b97be5661c554f5be8ce240cec337ae841514006f6d37f3867bc6c429d" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImN1dHRpbmctZm9yLXN0b25lLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=6a41b4b97be5661c554f5be8ce240cec337ae841514006f6d37f3867bc6c429d 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImN1dHRpbmctZm9yLXN0b25lLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6Mjk1LCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=51cab18a3ee2ebd0ffdd133767fcb7ff7ccea54d977ae452e9a72c46ad88765e 295w" width="360" height="586" alt="" sizes="(max-width: 125em), 100vw" style="width: 295px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/cutting-for-stone-abraham-verghese/f52570f9556b9d6a">Cutting for Stone</a></h2><p><strong>ABRAHAM VERGHESE</strong></p><p><i>Cutting for Stone is a deep and complex novel that I had trouble putting down. Its narrative in beautiful prose follows the members of an ever-growing family in the tightly knit community of the "Missing" Hospital in Addis Ababa, across multiple generations. It combines the relatively recent history of Ethiopia and Eritrea with medical/surgical cases that get a little graphic, and which I might not recommend to the overly squeamish.</i></p><p><i>While I wouldn't describe it as a light or easy read, it was enjoyable in how engaging it was. It elicited a wide range of deep feelings and kept me on my toes. I'd recommend it to anyone who is a fan of medical drama (Grey's Anatomy without the soap-opera aspect?) and historical fiction with an intellectual twist.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/chack">Carolyn Hack</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1sYXN0LXN1bi5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9a97b55591c43cebdf6c6ca60b9e6da2acce2f8df5fd403f67d0c1de8cb975b0" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1sYXN0LXN1bi5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=9a97b55591c43cebdf6c6ca60b9e6da2acce2f8df5fd403f67d0c1de8cb975b0 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRoZS1sYXN0LXN1bi5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjMyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1619a159108e182caa81a3e618a6edf5b85542c275f0f394b7b53cd7ce8fc7a0 320w" width="360" height="540" alt="" sizes="(max-width: 125em), 100vw" style="width: 320px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/the-last-sun-k-d-edwards/2b716072bf9c1e19">The Last Sun</a></h2><p><strong>K.D. Edwards</strong></p><p><i>The Last Sun, the first of a series of books (three written, more promised), offers excellent writing, a consistent first person voice, lots of sarcasm/dry humor, fantastic plot twists, and a great alternate timeline premise: Much of Human mythology, but most directly the Tarot deck, originate as rumors escaping the very real magical society of Atlantis.</i></p><p><i>Forced in the 1960s to unveil themselves to humanity, the Atlanteans did so by starting and immediately losing a war with Humanity, since it doesn't matter how powerful you are if you are outnumbered a-million-to-one.  Forced to integrate, after a fashion, into the Human world, they discovered that magic can be a very lucrative profession, if you do it well.</i></p><p><i>The actual story follows the heir of a fallen Atlantean noble family as he and his BFF-since-birth try to navigate a distinctly unfriendly world of politics, intrigue, and violence, along the way somewhat unintentionally saddling themselves with a boyfriend, a gaggle of uniquely-challenging adopted kids, and some pretty nasty enemies.</i></p><p><i>This book - and indeed the entire series, so far at least - ranks among my top half-dozen favorite book series of all time. I am very optimistic that the author will keep the story going . . . and if he doesn't, each book ends well, so he won't leave us hanging if he wins the lottery and retires.</i></p><p><i>Content Warning: this book/series does explore plot lines involving abuse/assault (sexual, physical, and mental, both past and present), violence, and drug addiction. While handled with respect and in no way gratuitous, these heavy topics can for short periods make for VERY uncomfortable reading. If you find these topics challenging or triggering, this book/series might be a pass.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/msontag">Matt Sontag</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRvbW9ycm93LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=aad82ebbd953bbb5bbf32ba5e8a5ff896bbb060b2eff97340ac9b6f26c4ec1e8" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRvbW9ycm93LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=aad82ebbd953bbb5bbf32ba5e8a5ff896bbb060b2eff97340ac9b6f26c4ec1e8 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRvbW9ycm93LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzExLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=27459c587c5809201cbc930d9bd9681ef8b5c7ca311d88633643fbb05df49673 311w" width="360" height="556" alt="" sizes="(max-width: 125em), 100vw" style="width: 311px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/tomorrow-and-tomorrow-and-tomorrow-gabrielle-zevin/2338d0ae999f188c">Tomorrow, and Tomorrow, and Tomorrow</a></h2><p><strong>GABRIELLE ZEVIN</strong></p><p><i>Apart from the characters and narrative, I love the way the book evokes nostalgia for older technology and the bond we formed with that hardware. Even with all their constraints compared to modern devices, they were still capable of incredible things.</i></p><p><i>Side note, I discovered that the title comes from Shakespeare's Macbeth, reflecting the monotonous march of time, but in the novel, it also suggests the endless do-overs and possibilities found in the world of video games.</i></p><p>Recommended by Dan Allen</p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJlbGlldmUtaW4tZXZlcnl0aGluZy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=57a2096519cbf1ddb4449fb16264e17039ab9309dc5aa4a17993c55b89e52fb1" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJlbGlldmUtaW4tZXZlcnl0aGluZy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=57a2096519cbf1ddb4449fb16264e17039ab9309dc5aa4a17993c55b89e52fb1 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImJlbGlldmUtaW4tZXZlcnl0aGluZy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjMxMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=360a82ec695ae60104e913a0892b7eea041b91b0fb9e4b060bcf8c80ff75af28 310w" width="360" height="557" alt="" sizes="(max-width: 125em), 100vw" style="width: 310px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/i-believe-in-everything-a-memoir-of-illness-motherhood-and-magic-jen-dary/f2528f6540fd6648">I Believe in Everything: A Memoir of Illness, Motherhood, and Magic</a></h2><p><strong>JEN DARY</strong></p><p><i>I had the absolute honor of receiving an advance copy of Jen's debut memoir, I Believe in Everything: A Memoir of Illness, Motherhood, and Magic, which will be released January 13th, 2026. I Believe in Everything is a story about impossible magic and everyday courage. It's pages are full of grace, wonder, inspiration, humor, and in true Jen Dary style, transformational leadership lessons. </i></p><p>Recommended by <a href="https://www.viget.com/about/team/alear/">Aubrey Lear</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR1YmVyY3Vsb3Npcy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1f4ae6ee4f0261025b96275724cb13df183b225430c9b1b923b311d8ed426982" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR1YmVyY3Vsb3Npcy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=1f4ae6ee4f0261025b96275724cb13df183b225430c9b1b923b311d8ed426982 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InR1YmVyY3Vsb3Npcy5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjMxNywiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=10981ab82e5875270f8521efd45e588d22e2a871e3b3585d43cecd3e425a51db 317w" width="360" height="545" alt="" sizes="(max-width: 125em), 100vw" style="width: 317px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/everything-is-tuberculosis-signed-edition-the-history-and-persistence-of-our-deadliest-infection-john-green/57e35f61394b6daf">Everything is Tuberculosis</a></h2><p><strong>JOHN GREEN</strong></p><p><i>This is not a boring, depressing book! John Green is an adept story teller and humble narrator (he's the author of novels like The Fault in Our Stars and Turtles All the Way Down). This is a quick and accessible read that helps you see connections between things you'd never realized before. It's also a wake-up call. </i></p><p><i>As Green explains the surprising role tuberculosis has played in culture, history, and science, he also shows us how inequity and injustice operate across the globe. TB is a preventable and curable illness, rare in the US; yet it kills 1.25 million people each year. The way he weaves surprising scientific details in with the story of an individual person's health journey left me engaged and activated rather than despairing.</i></p><p><i>Read this book and learn the history of TB. Help diminish the stigma of poverty and illness, and advocate for global research, prevention, and treatment.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/ebloom/">Emily Bloom</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto border max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRlYW0tZ3RkLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=cf2f958dbea2000a4272b303c0db442f3dbde870d952d47ea83e272e63f4a52f" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRlYW0tZ3RkLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=cf2f958dbea2000a4272b303c0db442f3dbde870d952d47ea83e272e63f4a52f 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InRlYW0tZ3RkLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzE3LCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=92860caa99c181313913a9b61b8910a55f27076a0b72cf9fdc8b10b02b04885a 317w" width="360" height="545" alt="" sizes="(max-width: 125em), 100vw" style="width: 317px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/team-getting-things-done-with-others-david-allen/b2ef5aed2089c68c">Team: Getting Things Done with Others</a></h2><p><strong>DAVID ALLEN AND EDWARD LAMONT</strong><br /><br /><i>I've been a strong advocate of David Allen's GTD system for years, with varying success, but tried to get back into it for real last year. After re-reading "Getting Things Done" and "Making It All Work" I went into the audiobook of Team with a healthy skepticism that there would be anything new, but found tremendous value in the expansion of the GTD personal productivity principles (inboxes, project lists, next action lists, calendars, etc.) outward to the work done both by and within groups. I feel like this book made me a better teammate and consultant, and hope my peers agree.</i></p><p>Recommended by <a href="https://www.viget.com/about/team/maxfenton/">Max Fenton</a></p><hr />
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFudGhyb3BvY2VuZS1yZXZpZXdlZC5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a56aaa13c7715681a0fd460d85f96014323340a921dd25862bc3b88e4e8b1caf" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFudGhyb3BvY2VuZS1yZXZpZXdlZC5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=a56aaa13c7715681a0fd460d85f96014323340a921dd25862bc3b88e4e8b1caf 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFudGhyb3BvY2VuZS1yZXZpZXdlZC5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjMxNywiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=23b437efa24ae12172f1af9e7af6ac3ea19c6db481b709f1bff65efc4e92d588 317w" width="360" height="545" alt="" sizes="(max-width: 125em), 100vw" style="width: 317px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><a href="https://bookshop.org/p/books/the-anthropocene-reviewed-essays-on-a-human-centered-planet-john-green/4c790fd2c5e9caee">The Anthropocene Reviewed: Essays on a Human-Centered Planet</a></h2><p><strong>JOHN GREEN</strong></p><p><i>I finished The Anthropocene Reviewed: Essays on a Human-Centered Planet by John Green almost exactly a year ago, and honestly? It's exactly what I needed heading into 2025. The whole premise is that Green reviews random aspects of being human. He talks everything from Canada Geese to Sunsets (my personal favorite essay) on a five-star scale, which sounds kind of gimmicky... until you realize it's actually this incredibly thoughtful meditation on paying attention to life. My take away going into 2025 was how hopeful he was at a time when I admittedly was not. When he writes about anxiety or climate change or loss, he doesn't pretend everything's fine, but he also shows you how finding meaning in small, weird, beautiful things is its own kind of resistance. He shares that gratitude isn't about pretending everything's perfect, it's about choosing to notice what matters anyway. If you want something that'll recalibrate your perspective without being preachy, pick this up. Five stars, no question.</i></p><p>Recommended by Bre Corn</p><hr />
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>If you’re interested in purchasing one of these books, we encourage you to order it from an indie bookstore. If you don’t already have a go-to indie, you can check out some of our favorites <a href="https://www.viget.com/articles/vigets-favorite-indie-bookstores/">here</a>. Feel free to share your favorite books from 2025 in the comments. Happy reading!</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>What a Year of Working With ChatGPT Taught Me About Strategy</title>
        <link>https://www.viget.com/articles/what-a-year-of-working-with-chatgpt-taught-me-about-strategy/</link>
        <guid>https://www.viget.com/articles/what-a-year-of-working-with-chatgpt-taught-me-about-strategy/</guid>
        <pubDate>Mon, 15 Dec 2025 14:47:00 -0500</pubDate>
        <author>Kara Sassone</author>
                  <category>Strategy</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>This was the year that I finally embraced AI. I was previously hesitant to use it for fear of what it would do to me as a writer, thinker, and doer. However, what I’ve realized is that it makes me stronger in those places. At first, I admit I was using Chatty McChatsBot more like a faster search engine or, occasionally, a sentence-polishing tool.</p><p>But over the past several months, that relationship changed.</p><p>What I learned wasn’t just how to write faster or generate ideas more quickly. I learned how an AI tool could support strategic thinking. In order to get the good stuff out of AI, you have to put good stuff in. You have to ask it specific questions, give it details, and follow up in the same fashion I did when I was a working journalist. The first answer rarely is the one that makes it on the air or in a presentation.</p><h2>From only answers to thinking partner</h2><p>Early on, my prompts were transactional: “Can you rephrase this?”, “Can you summarize that?”, “Can you define this term?”</p><p>Over time, I started using ChatGPT less as an answer machine and more as a thinking partner. I brought half-formed ideas, competing constraints, and messy drafts into the conversation. Instead of asking for “the right answer,” I asked for alternatives, implications, and framing.</p><p>The biggest shift was realizing that the quality of the output mirrored the clarity of the input. Better questions led to better thinking. This was true of Chatty and of me.</p><h2>Strategy benefits from externalized thinking</h2><p>Most strategic work happens invisibly. It’s in your head, between meetings, or in the margins of documents. ChatGPT gave me a place to externalize that thinking quickly.</p><p>I used it to:</p><ul><li>Pressure-test assumptions before sharing them</li><li>Explore how a decision might land with different stakeholders</li><li>Translate complex ideas into clearer language</li><li>Sanity-check scope, tradeoffs, and tone</li></ul><p>This didn’t replace judgment. It sharpened it. Seeing my own reasoning reflected back—sometimes challenged, sometimes clarified—made gaps more obvious and decisions more intentional.</p><h2>Confidence came from iteration, not automation</h2><p>One unexpected outcome this year was increased confidence. This wasn’t because ChatGPT told me what to do, but because it helped me iterate faster.</p><p>I could try multiple phrasings, explore different levels of directness, and sense-check decisions before putting them in front of clients or colleagues. That repetition made patterns visible: what I consistently believed, where I tended to hedge, and when I already knew the answer but needed to hear it reflected back.</p><p>Over time, I relied less on the tool for validation and more for refinement.</p><h2>The human work stayed human</h2><p>Despite the efficiency gains, the most important parts of my role didn’t change. Relationship-building, judgment calls, empathy, and accountability all remained firmly human responsibilities.</p><p>ChatGPT helped me prepare better, think more clearly, and communicate more effectively—but it didn’t make decisions for me. It didn’t replace experience. It didn’t remove responsibility.</p><p>If anything, it raised the bar for how intentional I needed to be.</p><h2>My focus for 2026</h2><p>Looking ahead to next year, I’ll spend less time asking for polish and more time inviting friction. This year, the moments where ChatGPT pushed back, reframed a question, or exposed a blind spot were far more valuable than the moments where it simply made something sound better.</p><p>The tool was most useful when I treated it like a collaborator who could challenge me, not a service that existed to agree.</p><h2>But most of all</h2><p>Using ChatGPT helped me learn more about myself – how I think, how I decide, and it helped to validate my knowledge.</p><p>The biggest lesson this year wasn’t that AI can do my job faster. It’s that, when used thoughtfully, it can make my thinking better.</p><p>And that’s a shift that deserves attention.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Testing A11y using screen readers</title>
        <link>https://www.viget.com/articles/testing-a11y-using-screen-readers/</link>
        <guid>https://www.viget.com/articles/testing-a11y-using-screen-readers/</guid>
        <pubDate>Fri, 07 Nov 2025 11:00:00 -0500</pubDate>
        <author>Nathan Schmidt</author>
                  <category>Code</category>
                  <category>Process</category>
                  <category>Front-end Engineering</category>
                  <category>Accessibility</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Screen readers are essential tools for people who are visually impaired. They help users interact with computers and mobile devices. Automated accessibility testing can find some issues, but only real testing with a screen reader reveals all the errors.</p><p>Screen reader testing ensures a site meets accessibility standards like <a href="https://www.w3.org/TR/WCAG22/">WCAG</a> and <a href="https://www.ada.gov/">ADA</a>. True accessibility comes from designing every detail of a digital experience with inclusivity in mind. It invites people of all abilities to engage with content smoothly. </p><p>Testing with a screen reader is more than finding mistakes. It’s about understanding users as individuals. We need empathy to see their experience on a site. By doing this, we connect design and development, always keeping the user at the center.</p><h2><strong>Types of screen readers</strong></h2><p>There are three screen readers, <a href="https://support.apple.com/guide/voiceover/welcome/mac">VoiceOver</a>, <a href="https://www.nvaccess.org/about-nv-access/">NVDA</a>, and <a href="https://www.freedomscientific.com/products/software/jaws/">JAWS</a>. JAWS runs on Windows and is paid software. NVDA is free and only runs on Windows, and VoiceOver comes with MacOS.</p><p>JAWS is the most advanced screen reader and has many features that the other two don’t have. For instance, JAWS can add in words and text to help with semantics on elements. But if you know what to look for and how to test a site, using VoiceOver or NVDA will be sufficient to find accessibility errors on a site.</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InZvaWNlb3Zlci1sb2dvLndlYnAiLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b88467d21653565d904b1307d7e57dac4f5a035422985715d424ef84eba23ee5" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InZvaWNlb3Zlci1sb2dvLndlYnAiLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=b88467d21653565d904b1307d7e57dac4f5a035422985715d424ef84eba23ee5 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InZvaWNlb3Zlci1sb2dvLndlYnAiLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjU2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=2dd5563fa6041e48875ec6ce6cfbc9a848ab143af57bc19e68d5b5a412b60354 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6InZvaWNlb3Zlci1sb2dvLndlYnAiLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjcyMCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=180570325f28a3678b06880b86fb16dd4c01d7a4a977e6cca0723893b95443dd 720w" width="360" height="360" alt="" sizes="(max-width: 22.5em), 100vw" style="width: 200px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>
    <strong>VoiceOver</strong>
</h2>
<p>
    VoiceOver is for macOS and it is only available on Mac computers. VoiceOver works best with Safari. While you can use it on other browsers, you may not get the best results or accurate testing.
</p>
<p>
    To start VoiceOver, press <code>Command + F5</code>. Once VoiceOver starts, navigate to the page you would like to test.
</p>
<h3>
    VoiceOver short keys
</h3>
<figure class="table">
    <table style="border-style:none;margin:0;width:auto;">
        <tbody>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <strong>Task</strong>
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <strong>Command</strong>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Start/Stop VoiceOver
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option + A</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Pause/Resume Reading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Read next item
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option + Right Arrow</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Read previous item
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option + Left Arrow</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Next Link
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option + Command(⌘) + L</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Next heading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option + Command(⌘) + H</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Navigate table cells
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option Arrow keys</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Click a link
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Option + Spacebar</code>
                </td>
            </tr>
        </tbody>
    </table>
</figure>
<hr />
<p>
     
</p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          


  <figure class="">
    <img class="m-auto h-auto max-w-full" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im52ZGFfbG9nby53ZWJwIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3c4cd3a6c33abe9b2f3e2d9f55b7cb5bd3da375f6100c59d15aad34fd89adf32" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im52ZGFfbG9nby53ZWJwIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=3c4cd3a6c33abe9b2f3e2d9f55b7cb5bd3da375f6100c59d15aad34fd89adf32 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im52ZGFfbG9nby53ZWJwIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=c6b6e849bcd4c55031fcf0cabeb710d29216a58311d3c919a9ceec6475d192c5 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6Im52ZGFfbG9nby53ZWJwIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3MjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=4a83c7ca2055b0f74346713d4984a74dcef7302a72d2297b6bccc6163ef1e331 720w" width="360" height="360" alt="" sizes="(max-width: 22.5em), 100vw" style="width: 200px; object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/textInlineStyles">
  <div class="max-w-736 mx-auto rich-text">
    <h2>
    <strong>NVDA</strong>
</h2>
<p>
    NVDA is a free screen reader for Windows users. It works best in Firefox, Chrome, and Edge.
</p>
<p>
    If you're on a Mac, you can use<a href="https://www.browserstack.com/live"> BrowserStack</a> to test NVDA. Start a new Windows test on Firefox, Chrome, or Edge and on the left navigation turn on Screen Reader to start testing with NVDA.
</p>
<p>
    To start NVDA press <code>Control + Alt + N</code>. Once NVDA starts, open Firefox, Chrome, or Edge and navigate to the page you would like to test.
</p>
<h3>
    NVDA short keys
</h3>
<figure class="table">
    <table style="border-style:none;margin:0;width:auto;">
        <tbody>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <strong>Task</strong>
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <strong>Command</strong>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Start NVDA
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Alt + N</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Stop NVDA
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Insert + Q</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Start Reading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Insert + Down Arrow</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Stop Reading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Read next item
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Down Arrow</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Read previous item
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Shift + [Arrow, K, H, Tab]</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Next Link
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>K</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Next heading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>H</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Navigate table cells
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Alt Arrow keys </code>
                </td>
            </tr>
        </tbody>
    </table>
</figure>
<hr />
<p>
     
</p>
  </div>
</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

          

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-360" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF9qYXdzLWxvZ28ud2VicCIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=b09e95d5282b566cb87ef635ae7ab62741e1cf4637aebad29b2a9702b9c1dfc6" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF9qYXdzLWxvZ28ud2VicCIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=b09e95d5282b566cb87ef635ae7ab62741e1cf4637aebad29b2a9702b9c1dfc6 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF9qYXdzLWxvZ28ud2VicCIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=0075b72921af0cc676ca1449bf6235b9d2383dbe996d6ce71deeccfc2311a03f 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImFwcF9qYXdzLWxvZ28ud2VicCIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzIwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=17f521f532630c92dfcdae2f99c4e50024542a3f6c744d0e6033ff36bcc04697 720w" width="360" height="235" alt="" sizes="(max-width: 22.5em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>
    <strong>JAWS</strong>
</h2>
<p>
    JAWS is a paid screen reader for Windows users. It works best in Firefox, Chrome, and Edge.
</p>
<p>
    Start JAWS, open Firefox, Chrome, or Edge, and navigate to the page you would like to test.
</p>
<h3>
    JAWS short keys
</h3>
<figure class="table">
    <table style="border-style:none;margin:0;width:auto;">
        <tbody>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <strong>Task</strong>
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <strong>Command</strong>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Start reading continuously from this point on
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Insert + Down Arrow</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Stop Reading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Read next item
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Down Arrow</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Read previous item
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Shift + [Arrow, R, H, Tab]</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Go to next landmark/region
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>R</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Go to next <i>unvisited</i> link
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>U</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Next heading
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>H</code>
                </td>
            </tr>
            <tr>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    Navigate table cells
                </td>
                <td style="border-color:#000000;border-width:0.75pt;padding:5pt;vertical-align:top;">
                    <code>Control + Alt Arrow keys </code>
                </td>
            </tr>
        </tbody>
    </table>
</figure>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2><strong>How to test</strong></h2><p>Turn on the screen reader, according to the OS that you are on. When testing, do <i>not</i> use your mouse; instead, use only your keyboard to navigate the site. Refer to the short keys for <strong>VoiceOver</strong>, <strong>NVDA</strong>, and <strong>JAWS</strong>.</p><p>As you test, put yourself in the shoes of someone who is visually impaired. Can you access the content, and does it make sense without seeing the visible page? Does it take too long to get to the content you want? Can hidden content—like a tooltip—be accessed? </p><p>Turn on your preferred screen reader.</p><p>Start by having the screen reader read through the entire page and all of the content. </p><ol><li>Does it read all of the content?</li><li>Or is there content skipped which shouldn’t be?</li><li>Does it read the content in a logical order and follow the visible page layout? </li></ol><p>Once it has read through the entire page start checking these main things:</p><h3>Headings and Landmarks to Bypass Blocks of Content</h3><p>Screen readers help users navigate using landmarks. This approach bypasses content blocks and meets WCAG 2.4.1 standards. You can also use skip links, <a href="https://dequeuniversity.com/checklists/web/headings">headings</a>, and expand/collapse regions. These options work well with or instead of landmarks.</p><p>Does the name of the element match the visible element? For instance, does the screen reader say “heading” on visible headings?</p><h3>Table Headers</h3><p>Table headers should use <code>&lt;th&gt;</code>. Test this with a screen reader to ensure it reads the header before each row. Data cells must link to their matching header cells. If all cells in the first row are marked as <code>&lt;th&gt;</code> without a scope attribute, modern screen readers will usually assume the scope applies to the column beneath each header cell.</p><h3>Link Text</h3><p>Links must contain discernible text, either within the tag itself or programmatically. Many screen reader users like to listen to all the links on the page. If every link says “read more” that is not helpful to the user to distinguish between links. Ensure links have clear text. Change them to say, “read more about article x.” This gives users the info they need. Test menus with nested items to confirm the links are descriptive. Don’t forget to check the open/close menu button as well.</p><h3>Forms</h3><p>Check if “required” is read out on the form elements that are required. For checkboxes or radio buttons, does text read out telling the user what each one corresponds to?</p><p>Next, try entering wrong information into a form. Does it clearly show the error and give accurate details to fix it? Make sure it doesn’t depend on visual cues like color.</p><p>Then try submitting the form with the correct information. Is that success message informative when read with a screen reader, or is it just a visual cue like a green check mark? The message needs to clearly state to the user that the form was submitted, or that the search now has results to review. </p><h2><strong>One part of the whole</strong></h2><p>Screen reader testing is just one part of ensuring a site meets WCAG and ADA accessibility. WCAG provides a list of rules for various areas that need testing. These rules cover everything, from text to multimedia, and offer clear examples for meeting each requirement.</p><p>True accessibility happens when every part of a digital experience is designed for everyone. This lets people with different abilities engage with the content easily. The main goal is to create a digital experience that users love.</p><p>If you are not visually impaired, you can make a site compliant. However, true accessibility requires several iterations and feedback from visually impaired users. It’s important to try your best to see things from their perspective. Testing with a screen reader helps you understand how users experience the site.</p>
  </div>

</div>

              ]]></description>
      </item>
          <item>
        <title>Lessons from Upgrading a Large TypeScript App to Zod 4</title>
        <link>https://www.viget.com/articles/lessons-learned-upgrading-a-large-typescript-application-from-zod-3-to-4/</link>
        <guid>https://www.viget.com/articles/lessons-learned-upgrading-a-large-typescript-application-from-zod-3-to-4/</guid>
        <pubDate>Wed, 15 Oct 2025 10:00:00 -0400</pubDate>
        <author>Solomon Hawk</author>
                  <category>Code</category>
                  <category>Front-end Engineering</category>
                  <category>Back-end Engineering</category>
                  <category>Performance</category>
                  <category>Tooling</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <span id="pipe-is-much-stricter"></span><h2><code>.pipe(..)</code> is much stricter <a class="anchor" href="#pipe-is-much-stricter" title="Direct link to .pipe(..) is much stricter" aria-label="Direct link to .pipe(..) is much stricter">#</a></h2>
<p>If you make liberal use of <code>.pipe()</code> as a way to compose schemas then, like us, you might find yourself staring at an issue like: </p>
<p><code>The types of _zod.input are incompatible between these types: &lt;T1, T2&gt;</code></p>
<p>If you have code like:</p>
<pre><code class="language-ts">const schema = z.object({
	q: z.string(),
	sort: z
		.string()
		.transform((value) =&gt; value.split(':'))
		.pipe(someOtherSchemaExpectingValidSortParam)
});
</code></pre>
<p>A <a href="https://github.com/colinhacks/zod/issues/4778">few</a> <a href="https://github.com/colinhacks/zod/issues/4800">different</a> folks have started up discussions around the change. As Colin <a href="https://github.com/colinhacks/zod/issues/4800#issuecomment-3029123852">points out</a>, “Zod schemas aren't contravariant in their input type” which is an intentional choice but it does create some edge cases like this.</p>
<p>The change to make <code>.pipe()</code> stricter in v4 is “intentional to fix unsoundness in v3”. It should help us more easily discover if we’re creating pipelines that may not behave as expected but it also comes with the need for workarounds while we migrate our projects to v4.</p>
<table>
<thead>
<tr><th>⚠️ <strong>What does “Zod schemas aren't contravariant in their input type” mean?</strong></th></tr>
</thead>
<tbody>
<tr><td>That’s an entire other separate blog post, I’m afraid. If you’d like to explore further I’d start with <a href="https://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29">the wikipedia article on Contravariance</a>, brush up on your <a href="https://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov Substitution Principle</a>, and then look back at the classic <a href="https://www.google.com/search?q=typescript+contravariant+over+input&amp;sca_esv=c5a64250820e60ea&amp;sxsrf=AE3TifMl2FTYxQUIYfp1TwyPGWJWgHgZmQ%3A1752864809079&amp;ei=KZh6aIDSBMPoptQP_uHriQE&amp;ved=2ahUKEwiahvipiseOAxWWhIkEHbcTOa0Q0NsOegQIIxAB&amp;uact=5&amp;sclient=gws-wiz-serp&amp;udm=50&amp;fbs=AIIjpHxU7SXXniUZfeShr2fp4giZ1Y6MJ25_tmWITc7uy4KIeiAkWG4OlBE2zyCTMjPbGmMU8EWskMk2JSE__efdUJ3xRFvZ0M2vJLB0hUMk5HOE2JYHbn8EkAxflxA6nxAnoTjk4oAEbLx_kIot3fSUrLREcfN9LZ7Q2YE3_jllCcF3SYZ4e2-CUHrZASnm8ODfrjL9RpOPmwh-3ZUt-RD_JH0n4gHbUw&amp;aep=10&amp;ntc=1&amp;mtid=3Zh6aKjdFNC0ptQPnJDhsQE&amp;mstk=AUtExfD6bWDo6E4ADaD7ReVdfS8pWdaoy1QmA8aRS7AclnsG2f4Bx_CatmR-A5RSWL2d4FkOfbVfUFRldw23od5T5fNCB9hhtx3nJwl7AEb4etPX-F-8dJAOGImxEkbwUEqe7FgyH9HaMArR20eAoPDuWbdbjpNRi3ERLdkimtMPq86d2CFpFljxRACPfCoGF4tlmxXxD_8uRQAKEvLTcdOP-kzZsYOMq-Hulgxbo0HhlYre7K4OKhtg1waUw3NkaI0EVGuAALGPqUCSIh-M2WoT94VkPweDIpKD39xGwo1Fsf2b91rygKoodXj-Zq4M2DMTgfnty1oReYOuGty8q-rICwcPfgoRPhwWlcYpQnzkKYrTwYTSLU8NsLAyQyzhUc9CQy_NSr-74LMWrb7iPjJG3Fvmddude9GA02NhjLIL24OcIOKJ5XxinWmzR3ftEVNnQz6xzVwRVi4&amp;csuir=1">Animal &gt; Dog example</a> which should make a bit more sense.</td></tr>
</tbody>
</table>
<span id="workaround-1-return-unknown-from-transform"></span><h3>Workaround 1: Return <code>unknown</code> from <code>.transform(..)</code> <a class="anchor" href="#workaround-1-return-unknown-from-transform" title="Direct link to Workaround 1: Return unknown from .transform(..)" aria-label="Direct link to Workaround 1: Return unknown from .transform(..)">#</a></h3>
<p>You can do this either by annotating the transform function’s return type or type casting the value and letting inference handle it.</p>
<pre><code class="language-ts">const schema = z.object({
	q: z.string(),
	sort: z
		.string()
		.transform((value): unknown =&gt; value.split(':'))
		// Or ━┑
		// .transform((value) =&gt; value.split(':') as unknown)
		.pipe(someOtherSchemaExpectingValidSortParam)
});
</code></pre>
<span id="workaround-2-use-z-any-explicitly"></span><h3>Workaround 2: Use <code>z.any()</code> explicitly <a class="anchor" href="#workaround-2-use-z-any-explicitly" title="Direct link to Workaround 2: Use z.any() explicitly" aria-label="Direct link to Workaround 2: Use z.any() explicitly">#</a></h3>
<p>This essentially opts out of any kind of type checking at that particular interface which can be a good short-term solution if you need it but should be avoided if possible.</p>
<pre><code class="language-ts">const schema = z.object({
	q: z.string(),
	sort: z
		.string()
		.transform((value) =&gt; value.split(':'))
		.pipe(z.any().pipe(someOtherSchemaExpectingValidSortParam))
});
</code></pre>
<span id="superRefine-is-now-check"></span><h2>￼￼<code>.superRefine()</code>￼￼ is now ￼￼<code>.check()</code>￼￼ <a class="anchor" href="#superRefine-is-now-check" title="Direct link to ￼￼.superRefine()￼￼ is now ￼￼.check()￼￼" aria-label="Direct link to ￼￼.superRefine()￼￼ is now ￼￼.check()￼￼">#</a></h2>
<p>Allegedly <code>check</code> is just <code>superRefine</code> but <a href="https://zod.dev/v4/changelog?id=superrefine-deprecated">with a “cleaner API”</a>. No more <code>return z.NEVER</code> and <code>z.ZodIssueCode.custom</code>. Instead of <code>ctx.addIssue()</code> you just have to <code>ctx.issues.push(..)</code>. Just kidding about <code>z.NEVER</code> by the way… apparently it’s still used in <a href="https://zod.dev/api?id=transforms">pipes and transforms</a> to “exit the transform without impacting the inferred return type”.</p>
<p>This is an interesting choice. We can only speculate about the trade-offs that might have been considered when making this change. There are benefits to building APIs like <code>.refine()</code> by composing lower level and more versatile APIs (like <code>.check()</code>) for things like code simplicity, testability, and overall cohesiveness. </p>
<p>In terms of the user API, deciding to favor direct data manipulation (<code>ctx.issues.push(..)</code>) over function calls (<code>ctx.addIssue(..)</code>) seems like a step back in terms of level of abstraction. To use the API you need to know that “adding an issue” requires pushing a new issue value onto a list called <code>ctx.issues</code>. Those details leaking out may be a benefit if the goal is to add friction and discourage users from reaching for these specific escape hatches.</p>
<p>In practice, we only ever use <code>.superRefine</code> in a few spots and the migration was painless, so  let’s all just agree to calm down and see how this one plays out, ok?</p>
<span id="working-with-zodErrors-is-a-bit-different"></span><h2>Working with <code>ZodError</code>s is a bit different <a class="anchor" href="#working-with-zodErrors-is-a-bit-different" title="Direct link to Working with ZodErrors is a bit different" aria-label="Direct link to Working with ZodErrors is a bit different">#</a></h2>
<p>Instead of <code>error.flatten()</code> we now have <code>z.flattenError(error)</code>. Instead of <code>error.format()</code> we now have <code>z.treeifyError(error)</code>.</p>
<p>If you want a nice single string that captures all the problems on a schema you can now use <a href="https://zod.dev/error-formatting?id=zprettifyerror">￼<code>z.prettifyError(error)</code>￼</a> and it will pretty-print a summary of all the (possibly nested) issues like this:</p>
<pre><code>✖ Unrecognized key: "extraKey"
✖ Invalid input: expected string, received number
  → at username
✖ Invalid input: expected number, received string
  → at favoriteNumbers[1]
</code></pre>
<span id="migrating-away-from-merge-do-this"></span><h2>Migrating away from <code>.merge()</code>? Do this: <a class="anchor" href="#migrating-away-from-merge-do-this" title="Direct link to Migrating away from .merge()? Do this:" aria-label="Direct link to Migrating away from .merge()? Do this:">#</a></h2>
<p>The deprecation message on <code>.merge()</code> suggets replacing it with <code>a.extend(b.shape)</code>. However, the zod 4 documentation for <a href="https://zod.dev/api?id=extend">￼<code>.extend()</code>￼</a> goes on to say that there is <em>another</em> form which has better <code>tsc</code> performance (using destructuring):</p>
<pre><code class="language-ts">const foo = z.object({
	foo: z.string(),
});

const bar = z.object({
	bar: z.string(),
});

// zod 3
const fooBar = foo.merge(bar);

// zod 4 (based on deprecation message suggestion)
const fooBar = foo.extend(bar.shape);

// -- just do this instead: -v

// ✅ zod 4 (best performing, according to docs)
const fooBar = z.object({
	...foo.shape,
	...bar.shape,
});
</code></pre>
<span id="z-string-refinement-helpers-promoted"></span><h2><code>z.string()</code> refinement helpers promoted <a class="anchor" href="#z-string-refinement-helpers-promoted" title="Direct link to z.string() refinement helpers promoted" aria-label="Direct link to z.string() refinement helpers promoted">#</a></h2>
<p>A bunch of helpers that were previously on <code>ZodString</code> (like <code>z.string().email()</code>) were promoted to top-level schema types (<code>z.email()</code>).</p>
<p>With that come a few adjustments to the level of strictness for these checks. <code>z.uuid()</code> will now validate more strictly against RFC 9562/4122 (specifically, the variant bits must be 10 per the spec). For something a little more “UUID-ish” you can use <code>z.guid()</code>.</p>
<span id="z-coerce-input-is-now-unknown"></span><h2><code>z.coerce</code> input is now <code>unknown</code> <a class="anchor" href="#z-coerce-input-is-now-unknown" title="Direct link to z.coerce input is now unknown" aria-label="Direct link to z.coerce input is now unknown">#</a></h2>
<p><code>z.coerce</code> was changed so that the inferred input type is now <code>unknown</code>. This makes a lot of sense and in at least one case meant that we could remove a workaround that was put in place just so that we could get a correctly inferred input type that was accurate in how permissible it was.</p>
<span id="case-study-tsc-metrics-comparison"></span><h2>Case Study: <code>tsc</code> metrics comparison <a class="anchor" href="#case-study-tsc-metrics-comparison" title="Direct link to Case Study: tsc metrics comparison" aria-label="Direct link to Case Study: tsc metrics comparison">#</a></h2>
<p>After having gone through this migration on a fairly large project (~100k LoC) that makes significant use of zod schemas, here are the numbers:</p>
<table>
<thead>
<tr><th>Metric (agg)</th><th align="right">Before</th><th align="right">After</th><th align="right">Change</th></tr>
</thead>
<tbody>
<tr><td>Identifiers</td><td align="right">3,534,744</td><td align="right">3,373,893</td><td align="right">-160,851 (-4.55%)</td></tr>
<tr><td>Symbols</td><td align="right">4,486,388</td><td align="right">4,364,030</td><td align="right">-122,358 (-2.73%)</td></tr>
<tr><td>Types</td><td align="right">1,193,186</td><td align="right">1,028,579</td><td align="right">-164,607 (-13.80%)</td></tr>
<tr><td>Instantiations</td><td align="right">16,421,354</td><td align="right">14,147,656</td><td align="right">-2,273,698 (-13.85%)</td></tr>
<tr><td>Memory used</td><td align="right">2,747,064K</td><td align="right">2,630,832K</td><td align="right">-116,232K (-4.23%)</td></tr>
<tr><td>Build time*</td><td align="right">40.07s</td><td align="right">37.50s</td><td align="right">-2.57s (-6.41%)</td></tr>
</tbody>
</table>
<p>Well we didn’t quite hit the 100x reduction in type instantiations <a href="https://zod.dev/v4#100x-reduction-in-tsc-instantiations">claimed in the zod 4 introduction</a> but a ~14% improvement is still significant.</p>
<p>For this project, the inciting incident that precipitated the need to urgently prioritize these updates was a problem with a few particularly deeply nested discriminated unions. We were hitting TS2589 errors (“Type instantiation is excessively deep and possibly infinite”) when trying to use the inferred zod schema types as generic parameters to <code>react-hook-form</code>’s <code>useWatch</code> (and <code>useForm</code>, although you can omit it and rely on inference if you like).</p>
<p>This isn’t the first time we’ve invested in improving the TypeScript performance on this project and I’m sure it won’t be the last. Every effort leaves a trail of lessons, frustrations, and small joys. Come back once in a while, and I’ll tell you another story.</p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>5 Articles That Influenced My Career</title>
        <link>https://www.viget.com/articles/5-articles-that-influenced-my-career/</link>
        <guid>https://www.viget.com/articles/5-articles-that-influenced-my-career/</guid>
        <pubDate>Tue, 30 Sep 2025 10:30:00 -0400</pubDate>
        <author>Nathan Long</author>
                  <category>Code</category>
                  <category>Front-end Engineering</category>
                <description><![CDATA[
          

  
            
            <div class="mx-24 md:mx-40" data-component="_partials/blocks/markdown">
  <div class="max-w-736 mx-auto rich-text">
    <p>For nearly all of my career, the web has been both my employer AND my teacher. Looking back, there are a handful of articles that weren’t just bookmarks or blog posts — they marked turning points. Little pushes from fellow web workers that helped move me to where I am today.</p>
<p>Join me for a quick romp through ye olde history as I revisit five articles that helped shape my career.</p>
<span id="1-a-flexible-foundation"></span><h2>1. A ‘flexible foundation’ <a class="anchor" href="#1-a-flexible-foundation" title="Direct link to 1. A ‘flexible foundation’" aria-label="Direct link to 1. A ‘flexible foundation’">#</a></h2>
<p><strong><a href="https://alistapart.com/article/responsive-web-design/">Responsive Web Design</a></strong></p>
<p>I started my career in graphic design, and one of the biggest mental shifts in transitioning from print to web design was working with a ‘squishy’ canvas —  you could never truly guarantee what size screen a user would view your design. Not like you could with paper.</p>
<p>Ethan Marcotte’s article on responsive design back in 2010 finally made it click how we could approach this new world of tiny screens. It reshaped how I thought about web design. I feverishly rewrote my portfolio using media queries — something that I was told later helped me land a job at an agency as a hybrid designer/developer. So in a way, this article helped me get my first web job! 😎</p>
<span id="2-the-problem-with-specificity-and-portability"></span><h2>2. The problem with specificity and portability <a class="anchor" href="#2-the-problem-with-specificity-and-portability" title="Direct link to 2. The problem with specificity and portability" aria-label="Direct link to 2. The problem with specificity and portability">#</a></h2>
<p><strong><a href="https://github.com/stubbornella/oocss/wiki">Object Oriented CSS</a></strong></p>
<p>In the early days of CSS preprocessors, it was very common to see wild, zany selectors in a project’s CSS. Ultra-qualified selectors for avoiding unintentional side-effects, a mish-mash of IDs, classes, and element tags, or even unintentionally deeply nested selectors in a SCSS stylesheet. (Or maybe that was just my CSS 😅)</p>
<p>Several approaches came out during this time, like <a href="https://smacss.com">SMACSS</a>, and later <a href="https://getbem.com/naming">BEF</a>, but the first one I really understood was <a href="https://github.com/stubbornella/oocss/wiki">OOCSS</a>. It seems common sense now to ‘separate structure and skin’ and create styles that work the same everywhere, but it’s thanks to the work of Nicole Sullivan and others that these concepts are so deeply ingrained in our current approaches.</p>
<p>It was also OOCSS and its single-class approach that helped me understand the problem with <a href="https://css-tricks.com/specifics-on-css-specificity/">CSS specificity</a> and how to mitigate it. I started following OOCSS principles and watched my CSS become more durable, resilient, and portable. And waaaaaay fewer <code>!important</code> tags!</p>
<span id="3-vim-once-vim-forever"></span><h2>3. Vim once, Vim forever <a class="anchor" href="#3-vim-once-vim-forever" title="Direct link to 3. Vim once, Vim forever" aria-label="Direct link to 3. Vim once, Vim forever">#</a></h2>
<p><strong><a href="http://vimcasts.org/">Vimcasts</a></strong></p>
<p>Around this time, I also read a clickbait-y and unfortunately-named article (that I can no longer find) called “Real Developers Code with Vim”.  I, of course, being a 100% authentically real developer, took the bait. I do not agree with the original premise, but that article started my journey into learning Vim.</p>
<p>If that article piqued my interest, it was Drew Neil and his <a href="http://vimcasts.org/">Vimcast</a> series that took me by the hand and let me through a world of custom config files, modal editing, and community plugins. Vim wound up being a gateway into the command line, and I started to understand how UNIX systems worked. Things like how to customize my bash prompt and set up custom aliases naturally flowed from what I learned in Vim and turned the command line from something weird and scary into something that felt like home.</p>
<p>I'm still using Vim today (<a href="https://neovim.io/">Neovim</a> specifically), and I can trace back my <code>.vimrc</code> all the way back to <a href="https://github.com/nathanlong/dotfiles/blob/a90644862863ee4c2865cd3676fee008b1be295a/.vimrc">2012</a>. 13 years later, and I STILL feel like a wizard in the terminal. 🧙‍♂️</p>
<span id="4-a-new-layout-paradigm"></span><h2><strong>4. A new layout paradigm</strong> <a class="anchor" href="#4-a-new-layout-paradigm" title="Direct link to 4. A new layout paradigm" aria-label="Direct link to 4. A new layout paradigm">#</a></h2>
<p><strong><a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">A Guide to Flexbox</a></strong></p>
<p>Before flexbox landed in the early-to-mid 2010’s we were using CSS floats. Never heard of them? Good, let them rest quietly in the past. 🪦</p>
<p>Chris Coyier and his flexbox guide on CSS Tricks solidified my mental model of how flexbox worked and helped me start creating modern layouts. Things that were previously impossible, like re-ordering elements without altering their source order or even making items in a row the same height, were not just possible, but EASY.</p>
<span id="5-vanilla-with-sprinkles"></span><h2><strong>5. Vanilla with sprinkles</strong> <a class="anchor" href="#5-vanilla-with-sprinkles" title="Direct link to 5. Vanilla with sprinkles" aria-label="Direct link to 5. Vanilla with sprinkles">#</a></h2>
<p><strong><a href="https://www.viget.com/articles/how-does-viget-javascript/">How does Viget JavaScript</a> and 
<a href="https://www.viget.com/articles/stimulus-controllers-and-viget-modules-how-do-they-compare/">Stimulus Controllers and Viget Modules</a></strong></p>
<p>(This one is cheating a little, but the two articles go together.)</p>
<p>In 2022, I was hired at Viget, which marked the first time I was 100% a developer—my entire career had been in a hybrid role with a mix of designer/developer/director/manager.</p>
<p>This set of articles helped onboard me into a new way of thinking and writing JavaScript, and also marked my entrance into a new era of capability. Classes, modules, promises, async, destructuring, and so much more — the promise (ha, get it?) of ES6 all those years ago was not only fully realized but accelerating!</p>
<span id="honorable-mentions"></span><h2><strong>Honorable Mentions</strong> <a class="anchor" href="#honorable-mentions" title="Direct link to Honorable Mentions" aria-label="Direct link to Honorable Mentions">#</a></h2>
<p>Before publishing this article, we talked about this topic as a team (UI Development) and there were a few articles we felt we’d be remiss to leave out:</p>
<span id="the-front-end-split"></span><h3>The Front-End Split <a class="anchor" href="#the-front-end-split" title="Direct link to The Front-End Split" aria-label="Direct link to The Front-End Split">#</a></h3>
<p>Brad Frost’s <strong><a href="https://bradfrost.com/blog/post/front-of-the-front-end-and-back-of-the-front-end-web-development">Front-of-the-front-end and Back-of-the-front-end</a></strong>, along with Chris Coyier’s <strong><a href="https://css-tricks.com/the-great-divide">The Great Divide</a></strong> helped us make sense of the diverging skill sets in front-end development. What we choose to call ourselves is important, and is part of why we <a href="https://www.viget.com/articles/reorganizing-the-front-end-development-team/">reorganized the front-end development team</a> here at Viget in 2022.</p>
<span id="componentized-design"></span><h3>Componentized Design <a class="anchor" href="#componentized-design" title="Direct link to Componentized Design" aria-label="Direct link to Componentized Design">#</a></h3>
<p>Brad Frost (again) with his <strong><a href="https://bradfrost.com/blog/post/atomic-web-design">Atomic Design</a></strong> helped us start thinking about componentized design and development. This had natural knock-on effects with future tools and techniques like <a href="https://www.viget.com/articles/?category=design-systems#results">design systems</a> and <a href="https://www.viget.com/articles/component-driven-development-and-the-qa-process/">component-driven development</a>.</p>
<span id="a-call-to-share"></span><h2>A Call to Share <a class="anchor" href="#a-call-to-share" title="Direct link to A Call to Share" aria-label="Direct link to A Call to Share">#</a></h2>
<p>Looking back, I can see my career not as a straight path but as a breadcrumb trail left by generous strangers on the internet. Those articles weren’t just information — they were people, somewhere, deciding to hit “publish” instead of “maybe later.”</p>
<p>The web is funny that way. It’s not a library we visit; it’s a <a href="https://maggieappleton.com/garden-history">living garden we tend together</a>. Every tutorial, every blog post, every half-baked gist is a seed. Some quickly grow and spread, others grow quietly in corners, but ALL of them matter more than the author probably realizes at the time.</p>
<p>If the web has fed you (and if you’re reading this, it almost certainly has), think about what you can share back. Share your messy notes, your weird bug fixes, your “I finally figured this out!” revelations. Someone, somewhere, is about to trip over the same obstacle you just climbed, and your breadcrumb might be the one that leads them out.</p>

  </div>
</div>

              ]]></description>
      </item>
          <item>
        <title>Getting Good at Being Bad</title>
        <link>https://www.viget.com/articles/getting-good-at-being-bad/</link>
        <guid>https://www.viget.com/articles/getting-good-at-being-bad/</guid>
        <pubDate>Fri, 26 Sep 2025 11:11:00 -0400</pubDate>
        <author>Abby Smith</author>
                  <category>News &amp; Culture</category>
                <description><![CDATA[
          

  
            
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h2>When Perfection Becomes the Problem</h2>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>From the moment I was born until about four years ago, I was a <i>huge</i> perfectionist. From kindergarten all the way through college, I wouldn’t accept my own work until I felt like it was perfect. If I tried something and wasn’t immediately excellent at it, I would abandon it forever. That strategy worked out “just fine” for about 22 years, until I got a *insert foreboding music here* <i>real job</i>. <br /><br />The thing you have to understand about design work is that in order to come up with something really great, you must first come up with a lot of ideas that <i>aren’t</i> great. And, the thing you have to understand about me as I entered my first real job is that I was absolutely <strong>not</strong> okay with generating ideas that weren’t great.</p><p>It was around this point in my life that I realized I was, in fact, the problem. My own fear of failure was hindering my growth as a person <i>and</i> as a designer. So, I set out to practice the scariest thing ever: being bad at things.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3>Starting Small: The Great Caramel Experiment</h3>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>I started with something simple: caramel sauce. I’d always wanted to know how to make caramel, but knew that I wouldn’t get it on my first try, so I’d never tried. The mission was simple and daunting: just <i>try</i> to make caramel sauce for as long as it would take, and hopefully not bully myself in the process. </p><p>My quest began at King Soopers with two bags of sugar, cream, butter, and a glimmer of hope (which was quickly dashed by the chemistry of sugar). It took me six tries. I cried after my fourth failed attempt. But I persevered, and my final try ended with a mason jar full of smooth salted caramel sauce. </p><p>Turns out victory has a taste - it tastes like Granny Smith apples dipped in homemade caramel. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f2add19bebafb8b12e5a64bc5d5907172a56f83a0d2c691d146f2107e8ebfd32" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=f2add19bebafb8b12e5a64bc5d5907172a56f83a0d2c691d146f2107e8ebfd32 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c40884a81c310ad5e8d029dfd9e83c0abaf0279ffe840c5aa2666ef6a158af00 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=c652be7c430524fe37da3aedccd87632f56a4cadce0149181b684b578b9eef9c 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=79e02a6ab74bb5793d63475030b6326b88a168763e8e6b42865b94eb47250b72 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3e5846f30f73393138cda0c34a80d9bc579f77b821697e6a0ac0dc8606858129 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=5833f36e5e5b507afee2baf70dbfe565e39e04fee132de604f5ade9777f4f4ac 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNhcmFtZWwxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=e7016dbdd16bb74b697832b542913ff0ea25ce6213e17b8a601cbbfa42d12929 1470w" width="360" height="480" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">The final product</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Along the way, I picked up some practical lessons (only use granulated sugar, avoid nonstick pots, brush water down the sides of the pot to prevent crystallization), but more importantly:<i><strong> </strong></i><strong>maybe sucking at something wasn’t quite as scary as I’d made it out to be?</strong></p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3>Doubling Down: The Turkish Delight Challenge</h3>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>With a newfound confidence, I decided to try something harder than caramel sauce: Turkish delight. For those of you who don’t know, Turkish delight is a rose-flavored jelly-candy that’s made without gelatin and is, as I learned, an absolute nightmare to make from scratch.<br /><br />Turkish delight is my partner’s favorite candy, so I wanted to do it justice. I’ll skip the details and just tell you that I was <i>violently</i> humbled. It took me twelve hours’ worth of attempts to get it right the first time, which I couldn’t recreate right away, and another fourteen hours to be able to make it right every time. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1416b6fee99e3a4bb6269f6a6141f010c9da99e955541bcafd33015cdef6ece8" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1416b6fee99e3a4bb6269f6a6141f010c9da99e955541bcafd33015cdef6ece8 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4da1e65b992e43422991e37e823e24d31719ddcc9fed5555f985944ffdda270b 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6NzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=090ec1b5b0e2d6a65bf710e99760d604ef933ef9b2eeddfd1dabf24df104baa1 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6OTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=2c38cf778465cbb8272a52b1c88f103eca4ccf32cb87e86cc112e61cc113c76d 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTE2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=63182c0d5cbbe644e4cfc071d6a1aebc69c01eed2ccd0dfbcd61fef9050d6c20 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTM2MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=3c869735ce0fb9d96eb3ab44847a14a5c999b5ae977322b4bd7307c8bd89445e 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6IlNjcmVlbnNob3QtMjAyNS0wOS0yNS1hdC0xMi4zNy40MS1QTV8yMDI1LTA5LTI1LTE4NDMzMV9ob3diLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTQ3MCwiZml0IjoiY292ZXIifSwid2l0aE1ldGFkYXRhIjp0cnVlLCJ0b0Zvcm1hdCI6IndlYnAiLCJ3ZWJwIjp7InF1YWxpdHkiOjgwfX19?signature=e6b584931ebe6ae7270fec0e4fddc44a05fa654a950ebd1aa39f71122d019f0a 1470w" width="360" height="322" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">The first successful attempt at Turkish delight</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Here’s what I took away from Turkish delight: <strong>failure doesn’t exist if you learned something. </strong></p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3>Going Big: A Renaissance Corset</h3>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Once I had conquered Turkish delight, I was well on my way to becoming good at being bad at things. I took the resilience I had created and moved on to something I’d been wanting to do for a long time: make my own clothes. </p><p>I started, like any sane person would, by <i>drafting my own pattern for a corset</i> that I could wear to the Renaissance Festival. While I wouldn’t recommend this approach if your goal is to sew something wearable in a reasonable number of tries, I would recommend this approach if your goal is to become better at being bad at things. </p>
  </div>

</div>

          
            
  <div class="mx-24 md:mx-20" data-component="_partials/blocks/image">
    

        

  
  <figure class="">
    <img class="m-auto h-auto w-full max-w-736" src="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=dfd62d78f68e6cbb129c885a849207b8d712b079f3bce3db8835b5bb877107b9" srcset="https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjozNjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=dfd62d78f68e6cbb129c885a849207b8d712b079f3bce3db8835b5bb877107b9 360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo1NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=cca2e5e60700731fd0bb78d0a1346d99b4651b2506077a3404ccc11593e05a37 560w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo3NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=7d689bb6609c2f97fbad3308b04463f0f91a4aa4c0027f81970a13a2acf4b703 760w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo5NjAsImZpdCI6ImNvdmVyIn0sIndpdGhNZXRhZGF0YSI6dHJ1ZSwidG9Gb3JtYXQiOiJ3ZWJwIiwid2VicCI6eyJxdWFsaXR5Ijo4MH19fQ==?signature=9622aea27ffae500a24ff4359266a59fb147589eecb51fa4a6a479335632152b 960w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMTYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4a8d8d5992210eba9211d949a14a5a90e8106cd5b3faaa6c8190b375cf409a8b 1160w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxMzYwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=4663554133c30660f14605ee82a5e7988bb85dad83eadbcfb314dd8322509619 1360w, https://svc.assets.viget.com/eyJidWNrZXQiOiJ2Z3QtdmlnZXRjb20tYWxsLWFzc2V0cyIsImtleSI6ImNvcnNldDIuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjoxNDcwLCJmaXQiOiJjb3ZlciJ9LCJ3aXRoTWV0YWRhdGEiOnRydWUsInRvRm9ybWF0Ijoid2VicCIsIndlYnAiOnsicXVhbGl0eSI6ODB9fX0=?signature=1bf3cf6c179ac1b20d22f2cf5303c72c6aaeadacef6d19281d00d949f8ad92b6 1470w" width="360" height="480" alt="" sizes="(max-width: 46em), 100vw" style="object-position: 50% 50%;" loading="lazy" decoding="auto"><div class="mt-16 md:mt-24 lg:mt-32">
        <figcaption class="body-sm text-center max-w-736 mx-auto">The corset in progress</figcaption>
        <div class="w-64 md:w-80 lg:w-[175px] border-b mx-auto mt-8 md:mt-16 lg:mt-24"></div>
      </div></figure>

  </div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>What I learned: <strong>Being bad at something new feels way better than doing nothing out of fear.</strong></p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3>Freedom to Fail</h3>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>Getting good at being bad was the best thing I’ve ever done for myself. <br /><br />I started with candy and sewing, and built my confidence and resilience. Practicing on things that were “trivial” freed me from the mental traps I’d laid for myself, and I could apply what I’d learned to nontrivial things that changed my life. I was able to publish my portfolio site, which I hadn’t been able to do for three years because I never felt like it was good enough. Having my work out in the world allowed me to start freelancing, and freelancing led me to Viget. <br /><br />Because of this quest, I am constantly evolving as a person and as a designer. Practicing being bad gave me the freedom to not know, to keep trying, to fail, to learn from failure without fear or shame, and I am much better for it.</p>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <h3>To the recovering perfectionists</h3>
  </div>

</div>

          
            <div class="text-page-block mx-24 md:mx-40" data-component="_partials/blocks/text">
  

  <div class="max-w-736 mx-auto rich-text">
    <p>If you're like I was - paralyzed by the need to be perfect, abandoning things before you even start - I hope you try sucking at something. Start small. Burn the caramel. Cry over the candy. Sew a terrible seam. Because on the other side of failure is a version of yourself you've never met: someone who creates, who tries, who embraces failure in pursuit of learning. </p><p><strong>The magic isn't in getting it right; it's in giving yourself space to get it wonderfully, beautifully wrong.</strong></p>
  </div>

</div>

              ]]></description>
      </item>
      </channel>
</rss>
