{"version":"https://jsonfeed.org/version/1","title":"Aaron Gustafson: Content tagged developer tools","description":"The latest 20 posts and links tagged developer tools.","home_page_url":"https://www.aaron-gustafson.com","feed_url":"https://www.aaron-gustafson.com/feeds/developer-tools.json","author":{"name":"Aaron Gustafson","url":"https://www.aaron-gustafson.com"},"icon":"https://www.aaron-gustafson.com/i/og-logo.png","favicon":"https://www.aaron-gustafson.com/favicon.png","expired":false,"items":[{"id":"https://www.aaron-gustafson.com/notebook/links/modern-css-feature-support-for-shadow-dom/","title":"🔗 Modern CSS Feature Support For Shadow DOM","summary":"This is a tremendously useful resource for anyone working with Shadow DOM and trying to understand where modern CSS features actually stand in practice, not just in theory.","content_html":"<p>Adobe has produced a tremendously useful resource for anyone working with Shadow DOM and trying to understand where modern CSS features actually stand in practice, not just in theory.</p>\n<p>What I especially like here is the framing: not simply “supported” or “unsupported,” but whether a feature is actually advisable in Shadow DOM, how it crosses boundaries, and where browsers still disagree. That’s the kind of nuance you need when you’re building real components instead of admiring specs from afar.</p>\n","social_text":"This is exactly the kind of resource the web platform needs more of: practical, test-backed guidance on how modern CSS features actually behave with Shadow DOM.","url":"https://www.aaron-gustafson.com/notebook/links/modern-css-feature-support-for-shadow-dom/","external_url":"https://shadow-dom-css.adobe.com/","tags":["CSS","web components","developer tools"],"date_published":"2026-04-29T12:25:00Z"},{"id":"https://www.aaron-gustafson.com/notebook/links/slidevars/","title":"🔗 slideVars","summary":"A lovely little utility from Chris Coyier that turns CSS custom properties into a live control panel.","content_html":"<p>This is a lovely little utility from Chris Coyier that turns CSS custom properties into a live control panel.</p>\n<p>It’s one of those tools that immediately makes me want to crack open a demo and start playing. What’s especially nice is that it doesn’t ask you to invent some parallel configuration universe if you don’t want to; it can just inspect the variables you already have and give you a UI for experimenting with them. That makes it feel less like a framework and more like a really practical enhancement to the way many of us already work.</p>\n","social_text":"slideVars feels like the kind of tiny, practical tool that makes design and front-end iteration a whole lot more fun.","url":"https://www.aaron-gustafson.com/notebook/links/slidevars/","external_url":"https://codepen.github.io/slideVars/","tags":["CSS","developer tools","web development"],"date_published":"2026-04-23T12:20:00Z"},{"id":"https://www.aaron-gustafson.com/notebook/a-web-component-starter-template/","title":"✍🏻 A Production-Ready Web Component Starter Template","summary":"I created a comprehensive starter template for creating production-ready web components with modern tooling, testing, and CI/CD—following Google’s Custom Element Best Practices.","content_html":"<p>Creating a new web component from scratch involves a lot of boilerplate—testing setup, build configuration, linting, CI/CD, documentation structure, and more. After building — and refining/rebuilding — numerous web components, I’ve distilled all that work into a starter template that lets you focus on your component’s functionality rather than project setup.</p>\n<p>The <a href=\"https://github.com/aarongustafson/web-component-starter\">Web Component Starter Template</a> is based on the architecture and patterns I’ve refined across my web component work, incorporating <a href=\"https://web.dev/articles/custom-elements-best-practices\">Google’s Custom Element Best Practices</a> and advice from other web components practitioners including the always-brilliant <a href=\"https://daverupert.com/\">Dave Rupert</a>.</p>\n<h2 id=\"what%E2%80%99s-included\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#what%E2%80%99s-included\" aria-hidden=\"true\">#</a> What’s included</h2>\n<p>The template provides everything you need to create a production-ready web component:</p>\n<ul>\n<li><strong>Interactive setup wizard</strong> that scaffolds everything for your component.</li>\n<li><strong>Multiple import patterns</strong> supporting both auto-define and manual registration.</li>\n<li><strong>Demo pages</strong> for development, documentation, and CDN examples.</li>\n<li><strong>Code quality tools</strong> including ESLint and Prettier with sensible defaults.</li>\n<li><strong>Modern testing setup</strong> with Vitest, Happy DOM, and coverage reporting.</li>\n<li><strong>CI/CD workflows</strong> for GitHub Actions with automated testing and npm publishing.</li>\n<li><strong>Publishing ready</strong> with proper npm package configuration and OIDC support.</li>\n</ul>\n<h2 id=\"quick-start-with-interactive-setup\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#quick-start-with-interactive-setup\" aria-hidden=\"true\">#</a> Quick start with interactive setup</h2>\n<p>Getting started is straightforward. If you’re a GitHub user, you can create a new repository directly from the template. Alternatively, clone it locally:</p>\n<pre class=\"language-bash\" tabindex=\"0\"><code class=\"language-bash\"><span class=\"token function\">git</span> clone https://github.com/aarongustafson/web-component-starter.git my-component\n<span class=\"token builtin class-name\">cd</span> my-component\n<span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n<span class=\"token function\">npm</span> run setup</code></pre>\n<p>The setup wizard asks for your component name and description, then automatically:</p>\n<ul>\n<li>Renames all files based on your component name,</li>\n<li>Updates all code and configuration templates with your details,</li>\n<li>Generates a proper README from the included template,</li>\n<li>Cleans up all template-specific files, and</li>\n<li>Initializes the git repository.</li>\n</ul>\n<p>You’re left with a fully scaffolded repository, ready for you to develop your component.</p>\n<h2 id=\"flexible-import-patterns\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#flexible-import-patterns\" aria-hidden=\"true\">#</a> Flexible import patterns</h2>\n<p>One of the key features is support for multiple registration patterns. Users of your component can choose what works best:</p>\n<p><strong>Manual registration for full control:</strong></p>\n<pre class=\"language-javascript\" tabindex=\"0\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ComponentNameElement <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@yourscope/component-name'</span><span class=\"token punctuation\">;</span>\n\ncustomElements<span class=\"token punctuation\">.</span><span class=\"token function\">define</span><span class=\"token punctuation\">(</span><span class=\"token string\">'my-custom-name'</span><span class=\"token punctuation\">,</span> ComponentNameElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<p><strong>Auto-define for convenience:</strong></p>\n<pre class=\"language-javascript\" tabindex=\"0\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token string\">'@yourscope/component-name/define.js'</span><span class=\"token punctuation\">;</span></code></pre>\n<p><strong>Or call the helper directly:</strong></p>\n<pre class=\"language-javascript\" tabindex=\"0\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> defineComponentName <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@yourscope/component-name/define.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">defineComponentName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<p>The auto-define approach includes guards to ensure it only runs in browser environments and checks if <code>customElements</code> is available, making it safe for server-side rendered (SSR) scenarios.</p>\n<h2 id=\"testing-made-easy\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#testing-made-easy\" aria-hidden=\"true\">#</a> Testing made easy</h2>\n<p>The template includes a comprehensive testing setup using Vitest:</p>\n<pre class=\"language-javascript\" tabindex=\"0\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> describe<span class=\"token punctuation\">,</span> it<span class=\"token punctuation\">,</span> expect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'vitest'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'MyComponent'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> el <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">createElement</span><span class=\"token punctuation\">(</span><span class=\"token string\">'my-component'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBeInstanceOf</span><span class=\"token punctuation\">(</span>HTMLElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<p>Happy DOM provides a lightweight browser environment, and the included scripts support:</p>\n<ul>\n<li>Watch mode for development: <code>npm test</code></li>\n<li>Single run for CI: <code>npm run test:run</code></li>\n<li>Interactive UI: <code>npm run test:ui</code></li>\n<li>Coverage reports: <code>npm run test:coverage</code></li>\n</ul>\n<h2 id=\"automated-publishing-with-oidc\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#automated-publishing-with-oidc\" aria-hidden=\"true\">#</a> Automated publishing with OIDC</h2>\n<p>The template is configured for secure automated publishing to npm using OpenID Connect (OIDC), which is more secure than long-lived tokens. After you manually publish the first version and configure OIDC on npm, create a GitHub release and the workflow handles publishing automatically.</p>\n<p>Manual publishing is still supported if you prefer that approach.</p>\n<h2 id=\"following-best-practices\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#following-best-practices\" aria-hidden=\"true\">#</a> Following best practices</h2>\n<p>The template bakes in best practices from the start:</p>\n<ul>\n<li>Shadow DOM with proper encapsulation</li>\n<li>Custom Elements v1 API</li>\n<li>Reflection of properties to attributes</li>\n<li>Lifecycle callbacks used appropriately</li>\n<li>Accessible patterns and ARIA support</li>\n<li>Progressive enhancement approach</li>\n</ul>\n<p>The included <a href=\"https://github.com/aarongustafson/web-component-starter/blob/main/WEB-COMPONENTS-BEST-PRACTICES.md\"><code>WEB-COMPONENTS-BEST-PRACTICES.md</code> document</a> explains the reasoning behind each pattern, making it a learning resource as well as a starter template.</p>\n<h2 id=\"why-i-built-this\" tabindex=\"-1\"><a class=\"header-anchor\" href=\"#why-i-built-this\" aria-hidden=\"true\">#</a> Why I built this</h2>\n<p>After creating components like <a href=\"https://github.com/aarongustafson/form-obfuscator\">form-obfuscator</a>, <a href=\"https://github.com/aarongustafson/tabbed-interface\">tabbed-interface</a>, and several others, I found myself copying and adapting the same project structure each time. This template captures those patterns so I — and now you — can start building components faster.</p>\n<p>If you build something with it, I’d love to hear about it!</p>\n","social_text":"Start building web components the right way with this production-ready template.","url":"https://www.aaron-gustafson.com/notebook/a-web-component-starter-template/","tags":["web components","JavaScript","open source","developer tools","best practices"],"date_published":"2026-01-02T00:06:37Z"},{"id":"https://www.aaron-gustafson.com/notebook/evernote-for-interface-inventories/","title":"✍🏻 Evernote for Interface Inventories","summary":"Earlier today, Brad Frost posted a great piece touting the usefulness of interface inventories . I’ll give him the floor to explain:","content_html":"<p>\n\tEarlier today, Brad Frost posted <a href=\"http://bradfrostweb.com/blog/post/interface-inventory/\">a great piece touting the usefulness of interface inventories</a>. I’ll give him the floor to explain:</p>\n<blockquote>\n<p>\n\t\tAn interface inventory is similar to a content inventory, only instead of sifting through and categorizing content, you’re taking stock and categorizing the components making up your website, app, intranet, hoobadyboop, or whatever (it doesn’t matter). An interface inventory is a comprehensive collection of the bits and pieces that make up your interface.</p>\n</blockquote>\n<p>\n\tInterface inventories are a great way to take stock of the design consistency (or inconsistency) of your site and are a typical first step in creating a pattern library. After all, you need to know what patterns you have before you can document them.</p>\n<p>\n\tIn his article, Brad offers a Keynote template for gathering your screenshots, but I have been living in Evernote lately, so I wanted to take a moment to show off how you might use Evernote’s tools to simplify the process of building an interface inventory. If you don’t have an Evernote account, you can <a href=\"https://www.evernote.com/Registration.action\">get a free one here</a>.</p>\n<p>\n\tOne method of getting screenshots into Evernote is using <a href=\"http://evernote.com/skitch/\">Skitch</a>. Skitch was originally developed by <a href=\"http://plasq.com/\">plasq</a>, but was acquired by Evernote in 2011. It is a general purpose screenshotting tool that supports annotations, etc.</p>\n<figure>\n<img alt=\"\" src=\"/i/posts/2013-07-10/interface-inventory-skitch.png\"/></figure>\n<p>\n\tHere’s a quick run-down on how to use Skitch to build your interface inventory:</p>\n<p>\n<strong>Step 1:</strong> Create a new Notebook for your interface inventory and adjust the Skitch preferences so it uses it.</p>\n<figure>\n<img alt=\"\" src=\"/i/posts/2013-07-10/interface-inventory-skitch-prefs.png\"/></figure>\n<p>\n<strong>Step 2:</strong> Click the “Screen Snap” button and adjust the crop tool to contain the interface object you want to capture.</p>\n<figure>\n<img alt=\"\" src=\"/i/posts/2013-07-10/interface-inventory-screen-snapping.png\"/><figcaption>Position your crosshairs and…</figcaption></figure>\n<figure>\n<img alt=\"\" src=\"/i/posts/2013-07-10/interface-inventory-skitch-screenshot.png\"/> <figcaption>…your snap is captured in Skitch</figcaption></figure>\n<p>\n<strong>Step 3:</strong> Rinse & repeat.</p>\n<p>\n\tWhen Skitch syncs up to Evernote, your screenshots will magically appear on any device you have.</p>\n<p>\n\tAnother route to go involves the <a href=\"http://evernote.com/webclipper/\">Evernote Web Clipper</a>. This add-on is available for pretty much every browser and is available as a <a href=\"http://en.wikipedia.org/wiki/Bookmarklet\">bookmarklet</a> to boot.</p>\n<p>\n\tUsing the Web Clipper is every bit as simple as it is with Skitch. Possibly moreso. One bonus is that you have the benefit of being able to direct your individual clips to different notebooks within Evernote. Simply click the Web Clipper button, select the area to clip, and choose where you want the clip to go. You can even add any tags you might find useful.</p>\n<figure>\n<img alt=\"\" src=\"/i/posts/2013-07-10/interface-inventory-web-clipper.png\"/></figure>\n<p>\n\tEither way you go, you will eventually end up with a nice little collection of interface artifacts in Evernote which are, in turn, available on the web and on any device where you have Evernote installed.</p>\n<figure>\n<img alt=\"\" src=\"/i/posts/2013-07-10/interface-inventory-evernote-inventory.png\"/> <figcaption>All your interface are belong to us.</figcaption></figure>\n<p>\n\tThe nice thing about using a tool like Evernote for creating an interface inventory is that you can share this notebook with your colleagues to speed up the documentation. Simply divide up your interface into categories and go on a scavenger hunt. All of the snaps will sync to the same place and become a part of your interface inventory. Done and done.</p>\n<p>\n\tHappy snapping!</p>\n","url":"https://www.aaron-gustafson.com/notebook/evernote-for-interface-inventories/","tags":["design","developer tools","web design"],"date_published":"2013-07-10T12:00:00Z"},{"id":"https://www.aaron-gustafson.com/notebook/subtree-merge-as-an-alternative-to-submodules-with-git-svn/","title":"✍🏻 Subtree merge as an alternative to submodules with git svn","summary":"We use Subversion as our version control system for all client work here at Easy because we absolutely love Springloops’ hosted Subversion service , but we use Git for all of our open source projects because, well, Git is a lot more fun…","content_html":"<p>We use <a href=\"http://subversion.tigris.org/\">Subversion</a> as our version control system for all client work here at Easy because we absolutely love <a href=\"http://www.springloops.com/v2?r=131284121846315085\" rel=\"external\">Springloops’ hosted Subversion service</a>, but we use <a href=\"http://www.kernel.org/pub/software/scm/git/docs/\" rel=\"external\">Git</a> for <a href=\"http://github.com/easy-designs\" rel=\"external\">all of our open source projects</a> because, well, Git is a lot more fun to work with and we love the community that’s built up around <a href=\"http://github.com\" rel=\"external\">Github</a>. In order to have the best of both worlds when working on client projects, we use <a href=\"http://www.kernel.org/pub/software/scm/git/docs/git-svn.html\" rel=\"external\">git-svn</a> as our front-end to Subversion. It’s a great tool, but it’s not without its limitations. One such limitation is its inability to translate <a href=\"http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#submodules\" rel=\"external\">Git submodules</a> into <a href=\"http://svnbook.red-bean.com/en/1.0/ch07s03.html\" rel=\"external\">svn:externals</a>. Thankfully, Git offers an alternative that is comparable and plays nicely with Subversion: <a href=\"http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html\" rel=\"external\">the subtree merge</a>.</p>\n<p>When attempting to <code class=\"shell\">dcommit</code> a Git repository containing a submodule, you’ll likely receive a message like this:</p>\n<blockquote cite=\"http://de-co-de.blogspot.com/2009/02/git-svn-and-submodules.html\">\n<p>952bee47201e87b0b0e851bcbe6c8940d429cda0 doesn’t exist in the repository at /usr/local/git/libexec/git-core/git-svn line 3787 Failed to read object 952bee47201e87b0b0e851bcbe6c8940d429cda0 at /usr/local/git/libexec/git-core/git-svn line 480</p>\n</blockquote>\n<p>That annoying message is the painful reminder that you need to find another way to add content from another project into your repository. Subtree merge to the rescue!</p>\n<p>If you’ve already hit the error, go ahead and delete your submodule folder(s) and the <code>.gitmodules</code> file and commit the changes to your repository to make the path available again. Next, from a shell within the root of your Git repository enter these commands at the prompt (replacing the capitalized phrases with your relevant information):</p>\n<ol>\n<li><code class=\"shell\">git remote add -f LOCAL_NAME PATH/TO/GIT/REPOSITORY</code></li>\n<li><code class=\"shell\">git merge -s ours --no-commit LOCAL_NAME/BRANCH_NAME</code></li>\n<li><code class=\"shell\">git read-tree --prefix=PATH/I/WANT/IT/IN/ -u LOCAL_NAME/BRANCH_NAME </code></li>\n<li><code class=\"shell\">git commit -m \"Merge of PROJECT\"</code></li>\n<li><code class=\"shell\">git pull -s subtree LOCAL_NAME master</code></li>\n</ol>\n<p>To provide a fully fleshed-out example for you, I used the following to merge the master branch of eCSStender into the path <code>vendors/ecsstender</code> within another project.</p>\n<ol>\n<li><code class=\"shell\">git remote add -f eCSStender git://github.com/easy-designs/eCSStender.js.git</code></li>\n<li><code class=\"shell\">git merge -s ours --no-commit eCSStender/master</code></li>\n<li><code class=\"shell\">git read-tree --prefix=vendors/ecsstender/ -u eCSStender/master</code></li>\n<li><code class=\"shell\">git commit -m \"Merge of eCSStender into the vendors directory\"</code></li>\n<li><code class=\"shell\">git pull -s subtree eCSStender master</code></li>\n</ol>\n<p>The beauty of this is that you can use that last line to pull in the latest version of the external project and then all you have to do is <code class=\"shell\">dcommit</code> the changes to get them into Subversion. Problem solved.</p>\n","url":"https://www.aaron-gustafson.com/notebook/subtree-merge-as-an-alternative-to-submodules-with-git-svn/","tags":["developer tools","software development"],"date_published":"2010-04-05T10:45:21Z"},{"id":"https://www.aaron-gustafson.com/notebook/now-thats-what-i-love-to-hear/","title":"✍🏻 Now that’s what I love to hear","summary":"I got an email the other day from Steven Mading, a developer at the BioMagnetic Resonance Bank at the University of Wisconsin . In it, he shared his experience using jsTrace and, with his permission, I’m sharing it with all of you:","content_html":"<p>I got an email the other day from Steven Mading, a developer at the <a href=\"http://www.bmrb.wisc.edu\">BioMagnetic Resonance Bank at the University of Wisconsin</a>. In it, he shared his experience using <a href=\"http://www.easy-designs.net/code/jsTrace/\">jsTrace</a> and, with his permission, I’m sharing it with all of you:</p>\n<blockquote>\n<p>I just thought I’d give a quick thank you to you for the little jsTrace JavaScript utility you made available online. I found it from a Google search and it was exactly what I needed.</p>\n<p>It really helped me a lot.  I had a problem with some widgets on an <abbr title=\"HyperText Markup Language\">HTML</abbr> form that had a lot of JavaScript hooks (things like <code>onblur</code>, <code>onclick</code>, <code>onfocus</code>, etc). The events were occurring in a weird order and I couldn’t trace what was happening. Using the standard <code>alert()</code> function was useless because making an alert window <abbr title=\"Short for POP3, the Post Office Protocol for email\">POP</abbr> up caused the events to be different and changed the relevant behavior (since <code>onfocus</code> and <code>onblur</code> were a relevant part of the behavior, popping up a window changes the focus and invalidates the debugging information when what I’m trying to do is figure out why the focus changes aren’t happening the way I expect.)</p>\n<p>Your jsTrace allowed me to figure out the problem (which, as it turns out, was that when I clicked on Widget B, I was calling BOTH the <code>onclick</code> for Widget B and the <code>onblur</code> for Widget A, but not always in a predictable order). So once I knew that was happening, I was able to redesign my code to work either way and thus fix the bug.</p>\n<p>Again, thank you for making this tool publicly available.</p>\n</blockquote>\n<p>I love it when things work out like that. It makes it all worthwhile.</p>\n<p>Have you had an experience with using <a href=\"http://www.easy-designs.net/code/jsTrace/\">jsTrace</a> that you’d like to share? Do you use it or  any <a href=\"http://www.easy-designs.net/code/\">other scripts we’ve built</a> often? Are any of the user enhancement scripts in use on production websites? Let us know your thoughts, good or bad.</p>\n","url":"https://www.aaron-gustafson.com/notebook/now-thats-what-i-love-to-hear/","tags":["JavaScript","developer tools"],"date_published":"2006-01-18T18:07:40Z"},{"id":"https://www.aaron-gustafson.com/notebook/more-developments-in-jstrace/","title":"✍🏻 More developments in jsTrace","summary":"As I mentioned to Ian earlier today, Dave and I were discussing having the jsTrace window keep pace with whatever the most current line is spit out to it. A few hours later, here it is: jsTrace 1.3 . I have some other stuff (read…","content_html":"<p>As I mentioned to <a href=\"http://www.accessify.com\">Ian</a> earlier today, Dave and I were discussing having the jsTrace window keep pace with whatever the most current line is spit out to it. A few hours later, here it is: <a href=\"http://www.easy-designs.net/code/jsTrace/\">jsTrace 1.3</a>. I have some other stuff (read: paying projects) that need my attention, so I am putting jsTrace down for a bit. Dave & I will be posting a few more demos of its use in different situations, but as far as further development goes, I’m gonna be hands-off for a bit to let you all get a chance to participate.</p>\n<p>And if you’re in the participatory mood, check out <a href=\"http://www.participate.net\">this site</a> I built with <a href=\"http://www.adaptivepath.com\">Adaptive Path</a>. I will be posting some details about the project and how I accomplished certain design features once <a href=\"https://blog.easy-designs.net/archives/behind-my-great-woman/\">Kel’s campaign</a>’s over and life gets a little less hectic.</p>\n","url":"https://www.aaron-gustafson.com/notebook/more-developments-in-jstrace/","tags":["JavaScript","developer tools","web development"],"date_published":"2005-11-02T04:31:24Z"},{"id":"https://www.aaron-gustafson.com/notebook/jstrace-two-days-on/","title":"✍🏻 jsTrace two days on","summary":"The reception for our latest script release , jsTrace , has been fantastic. From the write-up on the DOM Scripting Task Force blog to all of the emails and comments, it’s been great.","content_html":"<p>The reception for our <a href=\"/notebook/debugging-javascript-just-got-a-little-bit-easier/\">latest script release</a>, <a href=\"http://www.easy-designs.net/code/jsTrace/\"><code>jsTrace</code></a>, has been fantastic. From <a href=\"http://domscripting.webstandards.org/?p=28\">the write-up on the DOM Scripting Task Force blog</a> to all of the emails and comments, it’s been great.</p>\n<p>The past few days have seen many ideas, requests and enhancements sent my way. Some have been rolled into <a href=\"http://www.easy-designs.net/code/jsTrace/\">the jsTrace 1.1 release</a> which I made public today. One such enhancement (brought to us by <a href=\"http://web.archive.org/web/20070205045737/www.io.com/~acroyear/\">Joe Shelby</a>) I have dubbed “memory,” as it allows the debugging window to remember both its position and size the next time it is opened (via cookies). Further enhancements have been made to the underlying code to streamline development of additional tools for the bottom toolbar and the font size of the bottom toolbar has also been increased (per several requests).</p>\n<p>I hope you all enjoy the improvements. Keep ‘em coming.</p>\n<p><ins datetime=\"2005-10-31T9:42:55+00:00\"><strong>Update:</strong> We’ve also been mentioned in <a href=\"http://www.domscripting.com/blog/display/30\">DOMScripting.com</a>.</ins></p>\n<p><ins datetime=\"2005-10-31T01:36:48+00:00\"><strong>Another update (to 1.2):</strong> I added a buffer to handle traces executed prior to the <code>jsTrace</code> window being generated. The buffer is written to the viewport once it is generated.</ins></p>\n","url":"https://www.aaron-gustafson.com/notebook/jstrace-two-days-on/","tags":["JavaScript","developer tools","web development"],"date_published":"2005-10-30T01:04:04Z"},{"id":"https://www.aaron-gustafson.com/notebook/debugging-javascript-just-got-a-little-bit-easier/","title":"✍🏻 Debugging JavaScript just got a little bit easier","summary":"Like many of you, I’m sure, I hate debugging JavaScript. Really, it’s not the debugging, per se , as much as it’s using alert() to echo stuff out to the screen. It’s stupid and distracting and takes for ever if you’re debugging a lot of…","content_html":"<p>Like many of you, I’m sure, I hate debugging JavaScript. Really, it’s not the debugging, <dfn lang=\"la\" title=\"in itself\">per se</dfn>, as much as it’s using <code>alert()</code> to echo stuff out to the screen. It’s stupid and distracting and takes for ever if you’re debugging a lot of stuff.</p>\n<p>For the last few months, I’ve been toying with a few different means of error reporting and echoing out debugging information, but hadn’t been really satisfied with anything I’d come up with. I used to do quite a bit of Flash work back in the day (before Dave came along and put my best efforts to shame) and always loved the Trace window. I liked that you could just echo stuff out to it and it acted as a running tally of pretty much anything you wanted to track: variable values, messages, etc. Two days ago I decided that was what I wanted for JavaScript.</p>\n<p>I toyed with the idea of spawning a popup and tracing the info to that, but I don’t like popups. They are possibly more annoying than alert messages (well… maybe not). I decided to echo the messages out to a <code>div</code> on the page instead. Then feature creep set in. Before I knew it, it was a draggable, scalable window with some nifty features. Never one to be selfish, I thought other people could find a use for it too, so I’ve released it for anyone who wants it: <a href=\"http://www.easy-designs.net/code/jsTrace/\">here it is</a>. Use it, play with it and improve on it as you see fit.</p>\n<p>The script currently has the following features:</p>\n<ul>\n<li>the window drags & scales,</li>\n<li>you can output a delimeter quickly to help further organize your tracing,</li>\n<li>you can quickly clear the window,</li>\n<li>the system is <em>very</em> easy to implement (even for a novice DOM scripter), and</li>\n<li>it’s easily removable once your debugging is complete.</li>\n</ul>\n<p>Special thanks go out to <a href=\"http://www.youngpup.net/\">Aaron Boodman</a>, whose <a href=\"http://www.youngpup.net/2001/domdrag\">DOM Drag</a> was perfect for the dragging <em>and</em> enabled me to hook up a window stretcher pretty easily, <a href=\"http://www.clagnut.com\">Richard Rutter</a>, whose <a href=\"http://www.clagnut.com/blog/1405/\">Browser Stickies</a> were also somewhat of an inspiration, and Dave, for helping me debug the scaling code.</p>\n<p>Aside: one nice feature of the script is that, once it was operational, I was able to use it to debug itself… how cool is that?</p>\n","url":"https://www.aaron-gustafson.com/notebook/debugging-javascript-just-got-a-little-bit-easier/","tags":["JavaScript","developer tools","web development"],"date_published":"2005-10-27T01:59:39Z"}]}