{
  "version": "https://jsonfeed.org/version/1",
  "title": "habiting the net on Softly developing about software development",
  "icon": "https://avatars.micro.blog/avatars/2026/14/62453.jpg",
  "home_page_url": "https://softlydeveloping.micro.blog/",
  "feed_url": "https://softlydeveloping.micro.blog/feed.json",
  "items": [
      {
        "id": "http://softlydeveloping.micro.blog/2025/10/22/a-detailed-summary-of-technical.html",
        "title": "A detailed summary of technical work I delivered for HistoryPin.org, a project of Shift Collective",
        "content_html": "<p>At the start of 2025 I embarked on a rewrite of HistoryPin.org for Shift Collective, an Exygy Client and important place on the web where communities self-determine their stories. After being impressed with Cursor&rsquo;s ability to create a meaningful contribution <a href=\"https://internetross.space/2025/10/22/a-detailed-summary-of-technical.html\">summary</a> gleaned from the git commit history for SF&rsquo;s Our415.org code, I let Cursor loose again. Strung together, these terse paragraphs form a pretty reasonable narrativization of my work on the rewrite. Although some categories of features are bundled a little funky &ndash; like &ldquo;Development Workflow &amp; Maintenance.&rdquo; PR descriptions collapse together to the point of omission, spurred by my instruction to &ldquo;briefly summarize.&rdquo; Then there&rsquo;s hardly mention of the test harnessing I established with pytest, FactoryBoy, and playwright. That said, the breadth and depth of my impression on the project still feels substantial. In 9 months I drove the rewrite from greenfield to the wholesome organized entropy of near feature parity, and am proud of what I achieved with no (significant) previous experience in greenfield projects of this scope, the Django framework, or python programming. Infra, schema, frontend, backend, test harness, devx &ndash; these parts were me and I was these parts.</p>\n<h2 id=\"collection-management-amp-customization-features\">Collection Management &amp; Customization Features</h2>\n<p>You&rsquo;ve been instrumental in building out a comprehensive <strong>collection customization system</strong>. You added support for <strong>nested collections</strong> with an <code>is_nestable</code> field and updated forms to create collections within existing ones, leveraging query parameters for navigation. You implemented <strong>collection banner functionality</strong> including video URLs and image uploads using Django&rsquo;s form utilities, along with <strong>sponsor logos</strong> with ManyToMany relationships and dropzone file uploads. You also added <strong>background color customization</strong> and <strong>visibility toggling</strong> for various collection fields, with proper permissions management for paid features.</p>\n<h2 id=\"user-account-management-amp-security\">User Account Management &amp; Security</h2>\n<p>You implemented a complete <strong>account deletion system</strong> with proper cascade deletion starting from the user level, including form templating and view logic to handle both self-deletion and superuser deletion scenarios. You also worked on <strong>username logic</strong> for members, ensuring proper username creation through Google social login adapters and migrating routes to use member primary keys instead of usernames.</p>\n<h2 id=\"search-amp-discovery-functionality\">Search &amp; Discovery Functionality</h2>\n<p>You built out <strong>member search capabilities</strong> by refactoring code to support a <code>MembersDiscovery</code> view with query parameter handling similar to collection searching. You implemented <strong>collection theme searching</strong> with support for multiple theme selections using comma-separated query parameters, including proper database indexing with Gin indexes for array operations. You also added <strong>location searching support</strong> to the <code>DiscoverCollectionView</code> with Google Place ID integration and location autocomplete functionality.</p>\n<h2 id=\"form-architecture-amp-data-handling\">Form Architecture &amp; Data Handling</h2>\n<p>You made significant improvements to <strong>form handling patterns</strong> by refactoring complex relationship management during form submission, moving more logic to model form handlers to avoid overlapping operations between views and forms. You implemented <strong>tag support for collections</strong> using Django Taggit, enabling thematic tag filters and creating reusable <code>TagCombobox</code> components. You also added proper <strong>permissions management</strong> for paid features, ensuring correct access controls for members and collection owners.</p>\n<h2 id=\"database-amp-performance-optimization\">Database &amp; Performance Optimization</h2>\n<p>Your work included several <strong>database optimizations</strong> including adding indexes on <code>featured</code> columns for Collections and Members, implementing Gin indexes for array searching, and optimizing deletion queries using cascades. You also worked on <strong>image handling improvements</strong>, fixing conditions that allowed setting empty pin images and implementing proper image optimization.</p>\n<h2 id=\"uiux-enhancements\">UI/UX Enhancements</h2>\n<p>You implemented <strong>responsive design patterns</strong> using CSS queries and inline JavaScript to manage UI state, particularly for collection customization forms. You created <strong>reusable components</strong> like the <code>TagCombobox</code> that can be used for both Pins and Collections. You also worked on <strong>template refactoring</strong> to separate page containers from list rendering logic, making the codebase more maintainable.</p>\n<h2 id=\"development-workflow-amp-maintenance\">Development Workflow &amp; Maintenance</h2>\n<p>You contributed to <strong>development experience improvements</strong> by adding seeds to database reset processes, creating new ADRs (Architecture Decision Records) addressing testing and form logic, and implementing script loading optimizations with <code>defer</code> and <code>DOMContentLoaded</code> to prevent blocking the critical path.</p>\n<h2 id=\"paid-features-amp-monetization\">Paid Features &amp; Monetization</h2>\n<p>You worked on <strong>paid feature integration</strong> by refactoring the Donation Block toggling to use generic relationships, removing confusing admin configurations in favor of seed scripts, and implementing CSS-based show/hide functionality for donation input fields based on toggle states.</p>\n<h2 id=\"code-quality-amp-architecture\">Code Quality &amp; Architecture</h2>\n<p>Your contributions emphasized <strong>better separation of concerns</strong> and <strong>reusable component design</strong>. You refactored paid features to use generic relations, created more maintainable form handling patterns, and implemented proper permission checks by comparing evaluated object IDs. You also worked on <strong>template organization</strong> to make paginated lists more flexible and reusable.</p>\n<p>Overall, your contributions demonstrate a strong focus on <strong>user experience</strong>, <strong>data management</strong>, <strong>search functionality</strong>, and <strong>maintainable architecture</strong>. You&rsquo;ve been particularly effective at building complex features like collection customization and search/discovery systems while maintaining code quality and implementing proper security measures.</p>\n",
        "date_published": "2025-10-22T15:25:25-07:00",
        "url": "https://softlydeveloping.micro.blog/2025/10/22/a-detailed-summary-of-technical.html",
        "tags": ["habiting the net"]
      },
      {
        "id": "http://softlydeveloping.micro.blog/2025/10/22/142146.html",
        "title": "A detailed summary of technical work I delivered for San Francisco's public benefits portal Our415.org",
        "content_html": "<p>In the fall of 2024 I joined the Consulting division of Exygy, an agency that delivers web tech solutions for civic and non-profit organizations. My very first assignment was getting a project of the Deparment of Youth and Families &ndash;  Our415.org &ndash; launch-ready. Having a direct impact on families in SF was a very rad proposition, being a resident myself. Bringing a project home that&rsquo;s close to home.</p>\n<p>In short time I completed a gaggle of technical work on Our415.org&rsquo;s legacy React codebase, which had been forked from a similar benefits portal called the SF Service Guide. While pondering how I might proudly tell the tale of my work for the city to would-be interested parties like my mom or recruiters, I realized I might enlist the help of an LLM. Might Claude be able to make sense of all those commits? I don&rsquo;t remember the exact instructions I put in the prompt, something like &ldquo;go to <the repo link> and briefly summarize all the commits by author @rosschapman&rdquo;. Cursor did not disappoint. It output the well-organized summations you see below, clearly extrapolating from my own characterizations of the work gleaned from commit messages and PR descriptions. And then enhancing with brand-marketing expletives.</p>\n<p>What surprised me most about these commits-cum-words, is the volume of accumulated work that is reflected back. It&rsquo;s a lesson in the sheer mass of meaningful impressions a senior software engineer can have on a project&rsquo;s formation in short time. And, perhaps, equally revelatory of how much we downplay our steady stream of achievements  during a project&rsquo;s speed-run to launch. To me this feels like a valuable narrativization of the private lives and material impact of senior engineers that is often relegated to archive, work diaries, 1:1 notes, as stakeholders and end-users merely avail themselves to the gestalt of these parts in production. To shouting the minutiae from the rooftops!</p>\n<h2 id=\"development-infrastructure-amp-workflow-improvements\">Development Infrastructure &amp; Workflow Improvements</h2>\n<p>You were a key contributor to modernizing the development process. You implemented <strong>pre-commit hooks</strong> using Husky and lint-staged to catch lint errors before CI, significantly reducing build failures. You established <strong>Jest testing infrastructure</strong> with React Testing Library, migrating existing tests and setting up a proper testing foundation. You also configured <strong>Dependabot</strong> for automated dependency management and updated the target branch to <code>development</code> for better workflow integration.</p>\n<h2 id=\"performance-optimization-amp-bundle-management\">Performance Optimization &amp; Bundle Management</h2>\n<p>Your work focused heavily on <strong>bundle size reduction</strong> and <strong>dependency optimization</strong>. You reduced the lodash dependency burden by approximately 50% by switching to modular lodash functions instead of loading the entire bundle. You used tools like <code>npx knip</code> to identify and remove unused dependencies and components, including ShelterTech auth code, unused Homepage components, and WeGlot translation service code that wasn&rsquo;t being used.</p>\n<h2 id=\"search-amp-map-functionality-fixes\">Search &amp; Map Functionality Fixes</h2>\n<p>You addressed several critical bugs in the search and mapping functionality. You fixed <strong>incorrect marker location labels</strong> by properly moving marker label computation logic into the new transform. You resolved <strong>incorrect map markers on pages &gt; 1</strong> by establishing a new <code>TransformedSearchHit</code> view type/model that provides a canonical representation of search data with proper typing. You also removed algorithmic sorting of search results by urgency that was specific to SF Service Guide and not needed for the MVP.</p>\n<h2 id=\"uiux-enhancements-amp-navigation\">UI/UX Enhancements &amp; Navigation</h2>\n<p>You implemented significant <strong>navigation improvements</strong> including a new header navigation system and secondary navigation bar for listing pages. You created a <code>SecondaryNavigationLayout</code> component with <code>BackNavigation</code> functionality that uses smart routing. You also decoupled <code>SiteSearch</code> from <code>Navigation</code> and established conventions for wrapping route-level page components with secondary nav bars, including distinct mobile and desktop layouts.</p>\n<h2 id=\"data-handling-amp-error-resilience\">Data Handling &amp; Error Resilience</h2>\n<p>You improved <strong>data handling</strong> by adding proper null case handling for <code>service.long_description</code> and implementing optional lookups for missing image data to prevent page failures. You updated the homepage query to fetch <code>calendar_event</code> data and fixed date/time rendering issues. You also refactored Event/Opp card components to accommodate new <code>calendar_event</code> data from Strapi.</p>\n<h2 id=\"code-quality-amp-architecture\">Code Quality &amp; Architecture</h2>\n<p>Your contributions emphasized <strong>better component architecture</strong> and <strong>separation of concerns</strong>. You extracted the <code>SearchResult</code> component from <code>SearchResults</code> to reduce complexity and colliding terminology. You removed whitelabeling and tenant code, renaming <code>whiteLabel</code> to <code>websiteConfig</code> for clearer naming conventions. You also cleaned up old test cruft and established better naming conventions for search and map-related variables.</p>\n<h2 id=\"internationalization-amp-translation\">Internationalization &amp; Translation</h2>\n<p>You worked on <strong>translation functionality</strong> by fixing Google Translate language switching issues and removing unused WeGlot translation service code. You also removed algorithmic sorting that was specific to certain tenants and not needed for the current implementation.</p>\n<h2 id=\"development-experience\">Development Experience</h2>\n<p>You contributed to <strong>developer experience improvements</strong> by adding VSCode gitignore directives and creating pull request templates. You also worked on removing technical debt and unused code that was causing confusion and maintenance overhead.</p>\n<h2 id=\"production-amp-deployment\">Production &amp; Deployment</h2>\n<p>You updated the <strong>production build workflow</strong> with Strapi keys and worked on various fixes that required backend coordination, such as updating frontend queries to match deployed backend changes.</p>\n<p>Overall, your contributions demonstrate a strong focus on <strong>code quality</strong>, <strong>performance optimization</strong>, <strong>user experience improvements</strong>, and <strong>maintainable architecture</strong>. You&rsquo;ve been particularly effective at identifying and addressing technical debt while implementing modern development practices and fixing complex bugs in the search and mapping functionality.</the></p>\n",
        "date_published": "2025-10-22T14:21:46-07:00",
        "url": "https://softlydeveloping.micro.blog/2025/10/22/142146.html",
        "tags": ["habiting the net"]
      },
      {
        "id": "http://softlydeveloping.micro.blog/2023/10/25/language-ergonomic-studies-brevity-fetish.html",
        "title": "Language ergonomic studies: Brevity fetish with Ruby",
        "content_html": "<p>Matz giving us many ways to do things.</p>\n<p>&gt; I want to make Ruby users free. I want to give them the freedom to choose. People are different.</p>\n<p>From:</p>\n<p>🔗 <a href=\"https://www.artima.com/articles/the-philosophy-of-ruby\">The Philosophy of Ruby: A Conversation with Yukihiro Matsumoto, Part I</a></p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-ruby\" data-lang=\"ruby\"><span style=\"color:#66d9ef\">def</span> <span style=\"color:#a6e22e\">two_lowest</span>(numbers)\n  numbers<span style=\"color:#f92672\">.</span>min(<span style=\"color:#ae81ff\">2</span>)<span style=\"color:#f92672\">.</span>sum\n<span style=\"color:#66d9ef\">end</span>\n</code></pre></div><p>Enumerable methods that can receive an operator as symbol. Glacial autumn breeze whipped up from the 101. I don&rsquo;t have a brevity fetish, like I know many of you do. Or the tendency to place the one-liner upon the highest of pedestal. It&rsquo;s the obvious natural-language-style readability of the Ruby here that is simply remarkable.</p>\n<p>Achieving this is possible in JavaScript with more fanfare. But, alas, the maintenance cost of dressing up our array in Ruby&rsquo;s fast casual couture.</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-js\" data-lang=\"js\"><span style=\"color:#66d9ef\">class</span> <span style=\"color:#a6e22e\">NumberArray</span> {\n  <span style=\"color:#a6e22e\">constructor</span>(<span style=\"color:#a6e22e\">numbers</span>) {\n    <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#a6e22e\">numbers</span>;\n  }\n\n  <span style=\"color:#a6e22e\">min</span>(<span style=\"color:#a6e22e\">n</span>) {\n\t<span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">compareNumbers</span>(<span style=\"color:#a6e22e\">a</span>, <span style=\"color:#a6e22e\">b</span>) {\n\t  <span style=\"color:#66d9ef\">return</span> <span style=\"color:#a6e22e\">a</span> <span style=\"color:#f92672\">-</span> <span style=\"color:#a6e22e\">b</span>\n   }\n   <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span> <span style=\"color:#f92672\">=</span> <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span>.<span style=\"color:#a6e22e\">sort</span>(<span style=\"color:#a6e22e\">compareNumbers</span>).<span style=\"color:#a6e22e\">slice</span>(<span style=\"color:#ae81ff\">0</span>, <span style=\"color:#a6e22e\">n</span>);\n   <span style=\"color:#66d9ef\">return</span> <span style=\"color:#66d9ef\">this</span>;\n  }\n\n  <span style=\"color:#a6e22e\">sum</span>() {\n\t<span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">add</span>(<span style=\"color:#a6e22e\">a</span>, <span style=\"color:#a6e22e\">b</span>) {\n     <span style=\"color:#66d9ef\">return</span> <span style=\"color:#a6e22e\">a</span> <span style=\"color:#f92672\">+</span> <span style=\"color:#a6e22e\">b</span>\n\t}\n    <span style=\"color:#66d9ef\">return</span> <span style=\"color:#66d9ef\">this</span>.<span style=\"color:#a6e22e\">value</span>.<span style=\"color:#a6e22e\">reduce</span>(<span style=\"color:#a6e22e\">add</span>, <span style=\"color:#ae81ff\">0</span>);\n  }\n}\n\n<span style=\"color:#66d9ef\">function</span> <span style=\"color:#a6e22e\">twoLowest</span>(<span style=\"color:#a6e22e\">numbers</span>) {\n  <span style=\"color:#66d9ef\">return</span> <span style=\"color:#66d9ef\">new</span> <span style=\"color:#a6e22e\">NumberArray</span>(<span style=\"color:#a6e22e\">numbers</span>).<span style=\"color:#a6e22e\">min</span>(<span style=\"color:#ae81ff\">2</span>).<span style=\"color:#a6e22e\">sum</span>();\n}\n\n</code></pre></div>",
        "date_published": "2023-10-25T13:54:02-07:00",
        "url": "https://softlydeveloping.micro.blog/2023/10/25/language-ergonomic-studies-brevity-fetish.html",
        "tags": ["habiting the net"]
      },
      {
        "id": "http://softlydeveloping.micro.blog/2020/10/18/language-ergonomic-studies-card-deck.html",
        "title": "Language ergonomic studies: 52 card deck",
        "content_html": "<p>Javascript:</p>\n<pre tabindex=\"0\"><code>const cards = () =&amp;gt; ['♥','♠','♣','♦']\n  .map((suite) =&amp;gt; (['2','3','4','5','6','7','8','9','10','J','Q','K','A'].map((card) =&amp;gt; suite + card)))\n</code></pre><p>Clojure:</p>\n<pre tabindex=\"0\"><code>(defn new-deck []\n   (for [r [\\♥ \\♠ \\♣ \\♦]\n         s [:2 :3 :4 :5 :6 :7 :8 :9 :10 :J :Q :K :A]] \n      [r s]))\n</code></pre>",
        "date_published": "2020-10-18T21:36:00-07:00",
        "url": "https://softlydeveloping.micro.blog/2020/10/18/language-ergonomic-studies-card-deck.html",
        "tags": ["habiting the net"]
      }
  ]
}
