# gustavo.is > Personal site of Gustavo Gallegos: about, project retrospectives, a blog, and a contact form. Every retrospective and post also has a markdown mirror at https://gustavo.is/llms.mdx/. Gustavo Gallegos is a software engineer generalist in Los Angeles with 26 years in tech. He has shipped everything from Microsoft Office features to AI-powered health apps, and the agents behind them, across software engineering, QA, product management, and engineering program management. Career, one employer per line, earliest first: - Microsoft (Seattle): Software Design Engineer, Software Design Engineer in Test. Products: Word, Office, Natural Language Group, Natural UI, VSTO. - slide.com (San Francisco): Software Design Engineer in Test, Director of Quality Assurance, Product Manager. Products: Slide Photo Sharing App, Top Friends, SuperPoke, FunWall, SuperPoke Pets, Superpocus. - Jawbone (San Francisco): Product Manager, Sr. Engineering Program Manager. Products: UP Fitness App, UP24, UP 2, UP 3. - Jawbone Health Hub (Los Angeles): Sr. Engineering Program Manager. Products: Jawbone Health. - Meaning (Los Angeles): Software Design Engineer / CTO. Products: Ponder team collaboration, Ponder blogging platform. - Tartle (Los Angeles): Staff Software Design Engineer, Staff Software Engineer. Products: Tartle Marketplace, Datavault, Mirror AI Health Coach. ## Pages - [Home](https://gustavo.is/): who Gustavo is and the work history, told as a scroll story - [Blog](https://gustavo.is/blog): Notes from Gustavo Gallegos on building software, music, movies and life. - [Contact](https://gustavo.is/contact): send Gustavo a message ## Retrospectives - [Ponder, a group blogging platform](https://gustavo.is/llms.mdx/remembering/ponder): A look back at Ponder: what it was, the technologies behind it, and the lessons I took away from building it. - [Ponder Blogs, a public blog destination](https://gustavo.is/llms.mdx/remembering/ponder-blogs): After sunsetting Ponder Blogs, I spent some time reflecting on the lessons I learned building it. ## Blog posts - [Loop de loop.](https://gustavo.is/llms.mdx/blog/agent-circuit-breaker): This DeepSeek Harness plugin stops Qwen's unrecoverable loopiness. (published 2026-09-04) - [Hi!](https://gustavo.is/llms.mdx/blog/hello-world): Shiny new things. (published 2026-07-28) ## Optional - [Full text of every page](https://gustavo.is/llms-full.txt) - [RSS feed](https://gustavo.is/feed.xml) - [LinkedIn](https://www.linkedin.com/in/gustavogallegos) - [Bluesky](https://bsky.app/profile/pricklywiggles.bsky.social) - [GitHub](https://github.com/pricklywiggles) --- # Ponder, a group blogging platform > A look back at Ponder: what it was, the technologies behind it, and the lessons I took away from building it. - Years: 2019 to 2021 - My contributions: Client development, server development and devOps. - Page: https://gustavo.is/remembering/ponder ## Inception and purpose Founded in early 2019 by [Kristen Pavle](https://twitter.com/khpavle), [Dave Gorum](https://twitter.com/davegorum) and me (Gustavo Gallegos), Ponder was a blogging platform focused on simplicity aimed at people that wanted to publish a blog collaboratively. We built a product where friends could create content together, have private discussions and publish their work to the web. We worked hard to design a product that would promote meaningful content and meaningful discussions as a small counterbalance to prevailing social media trends. ## Features ### Editor - Chatlog-style blog post authoring - Optimistic updates - Continuous auto-save - Independent inputs can be reordered, edited or deleted - Images can be uploaded via file upload or drag and drop - Unlimited image uploads - Images stored in DigitalOcean Spaces via the AWS S3 driver Walkthrough video: https://player.vimeo.com/video/482506828 ### Conversations - One-on-one conversations for more meaningful discussions - Private to the group: conversations are not published to the blog - Message inbox - Real-time in-app notifications powered by GraphQL subscriptions (urql client, apollo server) - Email notifications via Postmark Walkthrough video: https://player.vimeo.com/video/482506771 ### Collections - Organize your content by adding posts to collections shared with all members of the blog - View collection feeds - Personalize your collection with cover image and metadata - Assign a unique url to a collection feed to share with anyone Walkthrough video: https://player.vimeo.com/video/482505654 ### Groups - Create up to 10 different blogs - Invite any number of members - Each blog is private and isolated from the rest, with its own set of members - A privacy-first model gives you a different identity for each blog while still being able to context switch between them from any screen - Owner can assign (and revoke) admin privileges to any member - Pinnable announcements for member feeds Walkthrough video: https://player.vimeo.com/video/482507258 ### Publishing - Once a blog is made public, all published content is available at a personalized ponder.to/[blog] url - Public blogs can be personalized by admins by adding moods (color themes, layout, font and styling presets) from the app.ponder.to site at any time, making each blog unique - The public-facing blog site is a separate SSR Next.js application, covered in the Ponder Blogs retrospective Walkthrough video: https://player.vimeo.com/video/482507338 ## Lessons learned ### Utility is paramount. Although finding my co-founders was not only unexpected but also quick, the process of distilling our purpose and ideas into a cohesive product plan took some time. Refining the market need and its proposed solution must happen as soon as humanly possible to begin testing your assumptions. The details of establishing a company and its principles can be a small side project or postponed in favor of small, incremental rounds of development to test utility in order to validate the product idea. ### Ask for help and honor the need of being part of a community. Being the only technical founder sometimes felt like a lonely affair, especially being the first time back as a developer after several years of working as a Technical Program Manager. Even the technologies I knew had changed drastically in just a few years (just look at javascript), not to mention the new ones like GraphQL and graph databases. As time passed I became more excited about what I was learning, but sometimes I felt there wasn't someone to effectively share that excitement with. Thankfully this led me to search out communities where I could not only ask for learning help but also share the way I felt in general, mostly in Discord groups (shout out to [Kent C. Dodds](https://kentcdodds.com/)). This helped me stay in touch with like-minded people I could learn from. ### Be decisive when choosing a stack. The good news about being the technology officer is that you get to call the shots about what tech to use, the bad news is having to face the tyranny of choice. I learned that you should time-box doing due diligence and research, get feedback from people you trust, make a decision and stick with it. It is very unlikely that the benefits of switching to a new framework, language, or tech once you've made significant progress will outweigh the compound gains of having learned your original choice. Consistency and mastery trump perfection. ### Be open to change. Situations change. My understanding of situations also changes, I must always be open to change my assumptions of what the product should be based on the available evidence. At times it was difficult to change course when it involved the loss of work that was already done, especially because development time was our most needed resource. I learned to analyze the data at hand and course correct to the reality that it presents, no matter the sunk costs. ### Open communication is essential. 2019-2020 in hindsight was not the best time to start a company (understatement of the year). Even though remote collaboration has come a long way, prior to the pandemic it was easy to get together with my partners and hash out big ideas and lay out a direction and plan of action, course correcting as we went. Even small amounts of face to face interaction quickly became impossible come 2020. I learned that for a team to charge ahead in the same direction at such an early stage, everyone must be frank about not only their technical challenges but their emotional state and personal relationship with work. When building a company with others, it's important to help people understand how you feel about the work and how they can help you make things better. ### Continuously learn with clear direction informed by excitement. I've never learned so many things and applied them in such a short period of time. I learned you have to start before you feel confident, and incrementally refactor as you learn more. When looking at old code I learned to stop cringing and instead thank myself for having taken that first step. I learned that learning itself is addictive so it must be done with focus and direction towards a goal or it can become an obstacle to producing results. Finally, I learned that I must factor in excitement as a compass to help guide me on what areas to focus, making the work feel more like play. ## Technologies ### React (Client framework) - React SPA - Bundled with Parcel - Modern hook-based architecture ### Urql (GraphQL client) - Lightweight GraphQL client - Normalized cache - Homegrown auth exchange - Subscriptions for real time notifications ### Neo4j Aura (Graph database) - Cypher resolvers for complex queries - Simple analytics scripts - Cypher GraphQL directive for simple queries ### Apollo GraphQL Server (GraphQL server) - JWT expiration and refresh auth - Authentication directives - PubSub based subscriptions for real time notifications ### Vercel (Client hosting and deployment) - SPA client deployment - Utility lambda functions (JS) - Domain management ### DigitalOcean (Server and media hosting) - GraphQL server hosting - Production, development and staging environments - AWS S3 compatible storage ### Styled Components (CSS in JS library) - CSS-in-JS to power Dave Gorum's beautiful design ### Integrations (Services used) - Postmark (email notifications) - Segment (analytics) - Unsplash (photos) - DigitalOcean (storage) - Sentry (exception reporting) --- # Ponder Blogs, a public blog destination > After sunsetting Ponder Blogs, I spent some time reflecting on the lessons I learned building it. - Years: 2020 to 2021 - My contributions: Client and server development. - Page: https://gustavo.is/remembering/ponder-blogs ## Inception and purpose Ponder Blogs was a destination site where anyone could read the public content authored with Ponder. Powered by Next.js, Ponder Blogs was a mixture of SSR (server side rendered) and SSG (statically generated) content, making it blazingly fast while still allowing for dynamic elements and instant publishing as well as advanced features like allowing authors to choose theme and layout variations. I was in charge of development, while the beautiful design was the work of my co-founder [Dave Gorum](https://twitter.com/davegorum). ## Features ### Walkthrough - Simple and elegant design by Dave Gorum to showcase content from Ponder communities - Blazing fast load times thanks to SSR and SSG - Chronological, collection-based and member-based content streams per blog - Personalized blog info page - Personalized member profiles - Built-in high-fidelity OpenGraph metadata for beautiful social media unfurls Walkthrough video: https://player.vimeo.com/video/484970796 ### Customization - Customize your blog's color palette with Moods - Personalize your typeface with font family presets - Preset layout options - Show the world what your group blog is all about through taglines, description, logos and a special link Walkthrough video: https://player.vimeo.com/video/484967092 ## Lessons learned ### Cutting edge technologies are not always the best solution. Perhaps this is better explained through example: Next.js is an amazing framework. After writing the Ponder client in standalone React, writing the blogs site with Next.js was a revelation. It allowed me to build fast and focus on the important aspects of the product. As we were beginning to build, Next released a new feature called Incremental Static Regeneration (ISR), which did on-the-fly static site generation at request time instead of compile time. It was way faster than SSR, worked like magic and had minimal setup. Unfortunately our feature-set included the ability for authors to change the theme of their site, and there was no way of making that feature "feel" right with ISR, since one couldn't invalidate the existing cache across all the blog's pages at once. It was a painful but right decision to use SSR instead no matter how much better ISR was in every other respect (someday I'm sure they will introduce partial cache invalidation). ### Don't let the ideal be the enemy of the good. In a way I think both me and Dave (co-founder) really like polished experiences (in design and code respectively). This being our company and it being a startup we learned that good and working is better than perfect and under development. This also led me to develop better practices for incremental refactoring. ### Incremental refactoring is almost always better than rewrites. The drive to rewrite something is especially strong when you are new at something. You're learning so much so fast that pretty soon you realize you could've done things so much better. This feeling felt like a trap. What is paramount is results in the form of having a working product. However, I got much better at achieving the same result by instead doing incremental refactoring which helped me keep the speed of development while also increasing stability. ### Code clarity through consistency is better than perfection. Even in a development team of one I sometimes faced the issue of wanting to change the way I did something, either stylistically or syntactically, because I learned new things or people showed me better ways of expressing things. When you're iterating fast though, I found 99% of the time it's better to stick to a correct (if not perfect) set of rules, have a linter enforce them and just forget about it. ### As time spent working grows, so should my mindfulness practice. Last but probably the most valuable lesson for me was that it is not enough to maintain my mindfulness practice as my work volume fluctuates. It is imperative that my practice grows proportional to it. There's a certain momentum (what I've heard being referred to as "codebrain") that my mind builds when programming that if left unchecked will continue on and bleed into the rest of my day (or most often, night), resulting in a too active mind, less clarity and less sleep, in turn affecting the work. Ironically, I've found it's especially necessary for me to do this when the work is the most fun. I learned to stop frequently and take some time to meditate, then go back to work or go back about my day. ## Technologies ### Next.js (Client framework) - Server side rendering for speedy yet up to date member content - Static site generation for non-dynamic content - OpenGraph metadata in all pages for social site unfurling ### Apollo GraphQL Server (GraphQL server) - Fully directive-based model for cypher queries, no explicit resolvers - Shared codebase from the Ponder client, but a separate schema ensures privacy of non-published data ### Neo4j Aura (Graph database) - Optimized indexes for speedy blogs data retrieval ### Styled Components (CSS in JS library) - CSS-in-JS powers customized author-side moods, or themes ### Vercel (Client hosting and deployment) - Native Next.js deployment solution (from CLI) - Lambda function for waitlist signup - Domain management --- # Loop de loop. > This DeepSeek Harness plugin stops Qwen's unrecoverable loopiness. - Published: 2026-09-04 - Tags: ai - Page: https://gustavo.is/blog/agent-circuit-breaker Perplexity has been my Google replacement for search and deep research for a while but I wasn't getting the depth I wanted, so I decided to replace it with a locally run solution. I've been running Qwen 3.8 with Opencode and Hermes, and I noticed early on that 3.8 agents would go into these tool call loops you couldn't recover from even by interrupting them. I tried changing the llama.cpp flags thinking something might help with no luck. After looking into it, this is what I found out:

Repetition self-reinforces into a loop no instruction can break, and Qwen's linear-attention layers, with their lossy precision-sensitive recall, fall in more easily. Agent loops repeat whole tool calls, too far apart for any sampler penalty to notice.

So that's why setting up a deep research skill using this model will leave your harness making thousands of tool calls and getting nowhere. ## Breaking the cycle [#breaking-the-cycle] I could probably fix this by using `tool.execute.before` in Opencode, but I'd been wanting to try [DeepSeek Harness](https://deepseekharness.io/) to see if its plugin system is as easy and powerful as 11,000 overenthusiastic tech bros will tell you on YouTube without backing it up with examples. And it was. It only took 100 lines of code. The plugin sits between the harness and its tools and fires before each tool call. The same call with the same significant arguments six times inside a sliding window gets denied, with an explanation handed back to the model. A per-agent lifetime cap stops loops that vary their arguments. It also strips annotation-only fields like bash's `description` before comparing, because the model rewrites those every call, and it can log each first denial to a JSONL file so a supervising agent can notice a stuck child and interrupt it. There's probably a plugin for this already but this was a fun project for understanding how to make one. I can see why DSH is getting so much traction. There have been many times when I've wanted to switch the plumbing in the Claude Code harness outside of hooks and skills. ## Try it out [#try-it-out] Find it here: [dsh-circuit-breaker](https://github.com/pricklywiggles/dsh-circuit-breaker), to install: ```sh dsh plugin --profile web add github:pricklywiggles/dsh-circuit-breaker ``` Knobs (limits, exemptions, the incident log) are documented in the readme, and the defaults are loose: normal repeats pass, only degenerate ones die. It's not specific to Qwen 3.8 but it works well with it. --- # Hi! > Shiny new things. - Published: 2026-07-28 - Tags: random - Page: https://gustavo.is/blog/hello-world Every five years or so I am compulsively driven to do a full personal website redesign, this is the latest iteration. I've always considered adding a blog because I love torturing myself with a never ending list of things I should be doing, this time I actually did it, let's see if I can keep it up.