<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Bashar Ayyash | Projects</title>
        <link>https://yabasha.dev/projects</link>
        <description>Showcase of selected projects demonstrating my expertise in Laravel, Next.js, and AI. Case studies of enterprise applications and innovative solutions.</description>
        <lastBuildDate>Mon, 18 May 2026 06:23:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Feed for Node.js</generator>
        <language>en</language>
        <image>
            <title>Bashar Ayyash | Projects</title>
            <url>https://yabasha.dev/images/og-image.jpg</url>
            <link>https://yabasha.dev/projects</link>
        </image>
        <copyright>All rights reserved 2026, Bashar Ayyash</copyright>
        <item>
            <title><![CDATA[agile-workflow: AI-Native Agile for Teams That Ship]]></title>
            <link>https://yabasha.dev/projects/agile-workflow-ai-native-agile-for-teams-that-ship</link>
            <guid isPermaLink="false">https://yabasha.dev/projects/agile-workflow-ai-native-agile-for-teams-that-ship</guid>
            <pubDate>Tue, 24 Feb 2026 10:32:15 GMT</pubDate>
            <description><![CDATA[A protocol-first skill that turns AI coding assistants into your entire agile operation—sprints, releases, code reviews, and CI/CD in one install.]]></description>
            <content:encoded><![CDATA[<p>Most teams treat AI coding assistants like fancy autocomplete. Tab-completion with a chat interface. I treat them like team members who never sleep, never get sick, and never forget the branching strategy.</p>
<p>The difference? <strong>Protocol.</strong></p>
<p><strong>The Problem:</strong></p>
<p>You&#39;ve got Cursor, Claude Code, or Copilot running. They write code, sure. They generate tests, refactor functions, explain regex. But who handles sprint planning? Who triages incoming issues, estimates story points, coordinates releases, enforces branch strategy? Still you. Still manual. Still context-switching hell.</p>
<p>I watched teams burn cycles on this friction. Smart engineers tabbing between IDE and GitHub, copying issue numbers, manually linking PRs, arguing about commit message format in Slack threads. The AI writes the code, but <em>you</em> herd the process.</p>
<p>The gap isn&#39;t intelligence—it&#39;s <em>protocol</em>. AI assistants need structured playbooks to actually operate like team members. Without it, they&#39;re brilliant interns with no onboarding.</p>
<p><strong>The Solution:</strong></p>
<p>I built <code>agile-workflow</code> as a first-class skill for AI coding assistants. Not a CLI tool you run. Not a SaaS dashboard. A skill your AI <em>knows</em>—embedded protocol it can execute.</p>
<p>Install it once:</p>
<pre><code class="language-bash">npx skills add yabasha/agile-workflow
</code></pre>
<p>From that point, your AI assistant becomes your entire agile operation.</p>
<p><strong>What You Can Ask:</strong></p>
<p>The interface is natural language. No flags, no config files, no YAML ceremonies:</p>
<pre><code>&gt; fix all open github issues
&gt; plan the next sprint
&gt; estimate story points for ungroomed issues
&gt; set up conventional commits with husky
&gt; create a release for v2.0.0
&gt; review PR #42
&gt; clean up stale branches
</code></pre>
<p>Your AI understands intent, maps to the right protocol phase, executes. You focus on direction, not mechanics.</p>
<p><strong>The Issue Resolution Pipeline:</strong></p>
<p>This isn&#39;t cowboy coding. It&#39;s a five-phase workflow your AI executes end-to-end:</p>
<p><strong>Phase 1: Discovery &amp; Triage</strong></p>
<p>The AI fetches open issues across your repos. Auto-categorizes by labels using keyword-to-label mapping—&quot;bug&quot; in title lands on the bug label, &quot;performance&quot; tags accordingly. Detects stale issues (30+ days no activity) and surfaces them for priority boost or closure.</p>
<p>Issues get sorted into four priority tiers: Critical, High, Medium, Low. Dependencies are mapped visually—if Issue A blocks Issue B, the AI tracks that. Finally, issues are grouped by file area. Two PRs touching <code>src/auth/</code> get batched to the same developer queue to avoid merge conflict carnage.</p>
<p><strong>Phase 2: Parallel Development</strong></p>
<p>The AI spawns up to 3–5 parallel developer sessions using isolated git worktrees. Each issue gets its own clean workspace—no branch pollution, no &quot;oops, committed to main&quot; disasters.</p>
<p>Developer prompts include specialty matching. Backend-heavy issue? Assign to the backend specialist configuration. DevOps changes? Route to the ops-aware agent. Each gets context: issue description, acceptance criteria, relevant file paths.</p>
<p>The worktree approach is clean. <code>git worktree add ../feature-branch feature-branch</code> creates an isolated directory your AI can work in independently. When done, it&#39;s <code>git worktree remove</code> and gone.</p>
<p><strong>Phase 3: PR Review Management</strong></p>
<p>Human or AI-created PRs both get the same treatment. The AI fetches review comments, classifies them via decision tree: suggestion (nice-to-have), required (blocking), nitpick (style), question (clarification needed).</p>
<p>For required changes, it spawns fix agents on existing branches. Every comment gets a reply with commit reference. Threads are resolved via GitHub&#39;s GraphQL API—no orphaned conversations.</p>
<p>The review checklist is standardized: security check, test coverage, breaking change assessment, documentation update verification. Your AI runs the same checklist on every PR, every time.</p>
<p><strong>Phase 4: Dependency-Aware Merge</strong></p>
<p>PRs don&#39;t merge randomly. The AI respects dependency order—if PR B depends on PR A, B waits. It handles rebase conflicts automatically when possible, escalating to human review only when the conflict crosses semantic boundaries.</p>
<p>After merge, it verifies all linked issues are actually closed. No &quot;merged PR, forgotten issue&quot; drift.</p>
<p><strong>Phase 5: Cleanup</strong></p>
<p>The AI prunes remote refs, deletes local branches, cleans worktrees. Your repo stays lean. No <code>git branch -a</code> scroll-fests. No &quot;which branches are safe to delete?&quot; Slack polls.</p>
<p><strong>Sprint Planning That Actually Works:</strong></p>
<p>Your AI doesn&#39;t just estimate—it explains its math.</p>
<p>The algorithm: count files to change + estimate LOC + dependency factor + test requirement + risk/uncertainty → sum → map to nearest Fibonacci (1, 2, 3, 5, 8, 13, 21).</p>
<p>Five files, moderate LOC, one dependency, needs tests, some uncertainty? That&#39;s an 8. Three files, low LOC, no deps, straightforward? That&#39;s a 3. The reasoning is transparent, not black-box.</p>
<p><strong>Kanban with WIP Limits:</strong></p>
<p>The AI maintains flow state across columns: Backlog → Ready → In Progress (3 per developer max) → In Review (5 total max) → Done. It enforces limits. Try to start a fourth &quot;In Progress&quot; item and your AI will push back—&quot;Finish #147 first or explain why this jumps the queue.&quot;</p>
<p><strong>Definition of Done, Per-Type:</strong></p>
<p>Different work needs different validation. Bugs require reproduction verification. Features need documentation updates. Chores just need CI green. The AI tracks the checklist appropriate to the issue type—no one-size-fits-none approach.</p>
<p><strong>Git Hygiene &amp; Recovery:</strong></p>
<p>Mistakes happen. Force-pushed the wrong branch? <code>git reflog</code> recovery is documented. Detached HEAD state? Step-by-step exit path. Lost a branch? Recovery commands ready.</p>
<p>The skill includes a cheat sheet covering 20+ common git disasters: detached HEAD recovery, force push reversal, lost branch resurrection, stash recovery, merge conflict abort strategies, rebasing gone wrong. Your AI carries the institutional knowledge so you don&#39;t have to Stack Overflow at midnight.</p>
<p><strong>Release Management:</strong></p>
<p>Semantic versioning, conventional commits, automated changelogs.</p>
<p>The skill covers 11 conventional commit types: <code>feat</code>, <code>fix</code>, <code>docs</code>, <code>style</code>, <code>refactor</code>, <code>perf</code>, <code>test</code>, <code>build</code>, <code>ci</code>, <code>chore</code>, <code>revert</code>. Commitlint enforcement via Husky hooks means no malformed commits slip through.</p>
<p>Releases follow SemVer strictly. Breaking changes → major. Features → minor. Fixes → patch. Changelogs generate from commit history, categorized by type, linked to PRs and issues.</p>
<p><strong>Monorepo Support:</strong></p>
<p>Changesets handle versioning across packages. Selective CI triggers—only packages with changes run tests. The AI understands workspace boundaries, respects dependency graphs between packages, updates internal references automatically.</p>
<p><strong>Security &amp; Maintenance:</strong></p>
<p>The skill includes Dependabot configuration for automated dependency updates. Gitleaks for secret scanning—catch AWS keys, API tokens, private keys before they hit remote. NPM audit integration flags vulnerabilities in <code>package.json</code>.</p>
<p>GitHub Actions templates cover four scenarios: CI with multi-node version matrices, PR checks with issue reference verification (no &quot;fixes #&quot; in your PR body? blocked), automated release note generation, and weekly dependency update runs (Mondays at 9 AM).</p>
<p><strong>Branch Strategy Decision Tree:</strong></p>
<p>Not every project needs GitFlow. The AI evaluates your release pattern and recommends:</p>
<ul>
<li><strong>GitFlow:</strong> Scheduled releases, versioning discipline, hotfix lanes</li>
<li><strong>GitHub Flow:</strong> Continuous deployment, small batches, fast feedback</li>
<li><strong>Trunk-Based:</strong> Experienced teams, feature flags, daily merges</li>
</ul>
<p>It enforces the chosen model. Wrong branch name format? Caught pre-commit. Missing release branch for hotfix? Flagged.</p>
<p><strong>Legacy Support:</strong></p>
<p>Still on SVN? The skill includes reference workflows for SVN-to-Git migration. Your AI can guide the transition, preserve history, set up new remotes, validate the full transfer.</p>
<p><strong>Who It&#39;s For:</strong></p>
<p>Teams using Claude Code, Cursor, Windsurf, Copilot, Codex, OpenClaw, Aider—any AI assistant with shell access. Requirements are minimal: git 2.20+, gh CLI 2.0+, and a repository.</p>
<p>This works for solo developers who want AI project management. It works for 20-person teams who need coordination without hiring another PM. It works for agencies juggling client repos.</p>
<p><strong>What&#39;s Next:</strong></p>
<p>I&#39;m extending this into multi-agent orchestration. Imagine: three AI developers working the same feature, each handling a vertical—frontend, API, infrastructure—with dependency-aware merging and conflict resolution. The skill layer is the foundation; the orchestration layer is where it gets interesting.</p>
<p><strong>Why This Matters:</strong></p>
<p>AI assistants are only as useful as the protocols you give them. Without structure, they&#39;re faster juniors. With structure, they&#39;re autonomous team members.</p>
<p>This skill turns &quot;write me a function&quot; into &quot;ship me a feature.&quot; It closes the gap between code generation and code delivery.</p>
<p>MIT licensed. Use it, break it, improve it.</p>
]]></content:encoded>
            <author>hello@yabasha.dev (Bashar Ayyash)</author>
        </item>
        <item>
            <title><![CDATA[Copywrite Skill]]></title>
            <link>https://yabasha.dev/projects/copywrite-skill</link>
            <guid isPermaLink="false">https://yabasha.dev/projects/copywrite-skill</guid>
            <pubDate>Sat, 14 Feb 2026 17:47:01 GMT</pubDate>
            <description><![CDATA[Protocol-first prompts that make your AI write B2B SaaS copy with specificity, proof, and the right CTA.]]></description>
            <content:encoded><![CDATA[<h1>Copywrite Skill</h1>
<p>Most AI copy sounds the same. It rhymes. It tries too hard. It feels like a template someone else chewed up and spat out.</p>
<p>I built Copywrite Skill to fix that. It&#39;s a structured prompt framework that turns any AI assistant into a disciplined copywriter that follows proven advertising principles instead of drifting into generic fluff.</p>
<p><strong>GitHub:</strong> <a href="https://github.com/yabasha/copywrite-skill">https://github.com/yabasha/copywrite-skill</a></p>
<p>Works with Claude Code, Cursor, Windsurf, Cline, and GitHub Copilot.</p>
<hr>
<h2>The Problem</h2>
<p>Language models are capable writers, but they lack guardrails. Left alone, they:</p>
<ul>
<li>Default to &quot;revolutionize&quot; and &quot;game-changing&quot; clichés.</li>
<li>Write for everyone and no one.</li>
<li>Chase awareness-stage hooks when the reader is already solution-aware.</li>
<li>Confuse platform tone (LinkedIn vs. landing page vs. email) as optional.</li>
</ul>
<p>The output isn&#39;t technically wrong. It&#39;s just invisible.</p>
<hr>
<h2>The Solution</h2>
<p>Copywrite Skill is a structured enforcement system that wires Eugene Schwartz&#39;s prospect awareness levels and Claude Hopkins&#39; scientific advertising into every phase of AI-assisted copy generation.</p>
<p>Instead of asking an LLM to &quot;write better copy,&quot; you feed it a constrained protocol. The output improves because the inputs are specific, layered, and compulsory.</p>
<hr>
<h2>How It Works: The 8-Step Workflow</h2>
<ol>
<li><p><strong>Discovery / Intake</strong><br>Lock down the offer, audience, and objections before writing a word.</p>
</li>
<li><p><strong>Positioning</strong><br>Define the competitive frame: what problem do you solve, and for whom?</p>
</li>
<li><p><strong>Awareness + Sophistication</strong><br>Map the prospect&#39;s awareness level and market saturation to avoid preaching to the choir or overwhelming the uninitiated.</p>
</li>
<li><p><strong>Hook A (The Mechanism)</strong><br>What makes this work? Why should anyone believe the promise?</p>
</li>
<li><p><strong>Hook B (The Consequence)</strong><br>What happens if they don&#39;t act? Pain, loss, or missed opportunity.</p>
</li>
<li><p><strong>Hook C (The Transformation)</strong><br>What does life look like after they say yes?</p>
</li>
<li><p><strong>Body + CTA</strong><br>Evidence, proof elements, and a single clear ask.</p>
</li>
<li><p><strong>Platform / SEO + Tighten</strong><br>Adapt tone for the channel (email, landing page, social), optimize for keywords if needed, then strip every word that doesn&#39;t pull weight.</p>
</li>
</ol>
<p>Each step has a prompt. Each prompt enforces a specific constraint. The chain produces copy that sounds assembled by a human who understands the craft.</p>
<hr>
<h2>Why Schwartz and Hopkins Matter</h2>
<p>Eugene Schwartz&#39;s <em>Breakthrough Advertising</em> defined five stages of prospect awareness. Most AI copy assumes everyone is problem-unaware (the widest audience). That&#39;s expensive and ineffective. Schwartz teaches you to match your message to the prospect&#39;s existing knowledge, not reinvent it.</p>
<p>Claude Hopkins wrote <em>Scientific Advertising</em> in 1923. His principle still stands: advertising is salesmanship in print. Every claim needs a reason why. Every headline must earn the reader&#39;s attention. Every test must be measured.</p>
<p>Copywrite Skill bakes both into the workflow so you don&#39;t have to remember them mid-prompt.</p>
<hr>
<h2>What You Get</h2>
<ul>
<li>A markdown prompt framework you can drop into any AI coding assistant</li>
<li>8 sequential prompt templates with explicit constraints</li>
<li>Platform-specific adaptation guides (LinkedIn, email, landing page)</li>
<li>Built-in reasoning steps so the AI shows its work before delivering copy</li>
<li>No proprietary lock-in. Plain text. Your control.</li>
</ul>
<hr>
<h2>Who It&#39;s For</h2>
<ul>
<li>Founders writing their own landing pages without a budget for an agency.</li>
<li>Marketers who want consistent output across team members.</li>
<li>Developers building AI-assisted tools who need copy as a structured output, not black-box magic.</li>
<li>Anyone tired of AI copy that smells like AI.</li>
</ul>
<hr>
<h2>How to Use: Example Prompts</h2>
<p>Drop any of these into your AI assistant:</p>
<p><strong>Discovery prompt:</strong></p>
<pre><code>You are a copy strategist. The offer is [describe offer]. The audience is [describe audience]. 

List the top 3 objections this audience has to the offer, and the one belief they must hold to convert.
</code></pre>
<p><strong>Awareness mapping:</strong></p>
<pre><code>Based on the offer above, state the prospect&#39;s current awareness level using Schwartz&#39;s framework: 
Unaware, Problem-Aware, Solution-Aware, Product-Aware, or Most Aware. 

Justify your choice in one sentence.
</code></pre>
<p><strong>Hook A (Mechanism):</strong></p>
<pre><code>Write a headline that answers: &quot;How does this actually work?&quot; 

Include a specific mechanism or proprietary element. No adjectives without proof.
</code></pre>
<p><strong>Hook B (Consequence):</strong></p>
<pre><code>Write a headline that emphasizes the cost of inaction. 

Use concrete loss, not vague fear.
</code></pre>
<p><strong>Tighten command:</strong></p>
<pre><code>Review the copy above. Remove any sentence that does not advance the argument or support the CTA. 

Return only the revised copy, no commentary.
</code></pre>
<hr>
<h2>Design Decisions</h2>
<p><strong>Specificity over cleverness.</strong><br>Prompts demand concrete details: numbers, timeframes, mechanisms. Clever wordplay without proof is stripped.</p>
<p><strong>Reason-why everywhere.</strong><br>Every claim must back itself. If the AI can&#39;t explain why, the claim gets cut.</p>
<p><strong>Variants as first-class outputs.</strong><br>At each step, the framework generates multiple angles. You choose. The AI doesn&#39;t decide for you.</p>
<p><strong>Interview-first inputs.</strong><br>The Discovery phase simulates a client interview. Without this, the rest of the workflow drifts.</p>
<hr>
<h2>What&#39;s Next</h2>
<ul>
<li>Case studies measuring conversion lift against baseline AI copy</li>
<li>Optional JSON output mode for programmatic integration</li>
<li>Language-specific variants (currently English-optimized)</li>
</ul>
<hr>
<h2>Try It</h2>
<p>Copywrite Skill is free, open-source, and protocol-first.</p>
<p><strong>Star the repo:</strong> <a href="https://github.com/yabasha/copywrite-skill">https://github.com/yabasha/copywrite-skill</a></p>
<p>If you use it, open an issue. Tell me what worked, what didn&#39;t, and what you&#39;d add.</p>
<p>Good copy is built, not generated. This framework is the scaffolding.</p>
<p>Start with step one. Don&#39;t skip the discovery.</p>
]]></content:encoded>
            <author>hello@yabasha.dev (Bashar Ayyash)</author>
        </item>
        <item>
            <title><![CDATA[A Father's Gift: Building Wasan's Art Gallery]]></title>
            <link>https://yabasha.dev/projects/a-fathers-gift-building-wasans-art-gallery</link>
            <guid isPermaLink="false">https://yabasha.dev/projects/a-fathers-gift-building-wasans-art-gallery</guid>
            <pubDate>Mon, 19 Jan 2026 18:33:40 GMT</pubDate>
            <description><![CDATA[I built wasansart.com as a gift for my 7-year-old daughter Wasan—a digital gallery where she can showcase her watercolor paintings with friends, teachers, and family. Using Laravel I created a child-friendly, girly-themed website that makes her artistic journey accessible and inviting for both children and parents.]]></description>
            <content:encoded><![CDATA[<p>When your seven-year-old daughter announces she wants to &quot;share my art with everyone,&quot; you listen. When she spends quiet mornings with tea (well, hot chocolate) and her paintbrushes, creating tender watercolor stories inspired by petals and morning light, you realize you&#39;re raising a young artist who deserves a proper stage.</p>
<p>That&#39;s how <a href="https://wasansart.com/"><strong>wasansart.com</strong></a> was born—not just as a website, but as a digital sanctuary for Wasan&#39;s creativity.</p>
<h2>The Spark of Inspiration</h2>
<p>Wasan doesn&#39;t just paint; she builds each piece in soft layers, inviting you to linger in the glow of gentle color. Her process is ritualistic: tea, music, and that single, decisive brushstroke that begins every collection. Watching her work reminded me of what <a href="https://photo2painting.com/blog/watercolor-painting-ideas">photo2painting.com</a> celebrates—watercolor&#39;s unique ability to create stunning blends and soft washes that capture pure emotion.</p>
<blockquote>
<p>My Wasan, she is my young artist, she loves drawing, painting, and sharing her art with everyone!</p>
</blockquote>
<p>But crayon drawings on the fridge only reach so far. Friends asked to see her work. Teachers wanted to share her progress. Grandparents living far away missed her daily artistic discoveries. We needed something permanent, beautiful, and entirely her own.</p>
<h2>Building Her Digital Canvas</h2>
<h3>The Technical Foundation</h3>
<p>I built Wasan&#39;s gallery on a robust stack that could grow with her:</p>
<ul>
<li><strong>Ubuntu VPS</strong>: A reliable, cost-effective server I could manage myself</li>
<li><strong>Laravel + MySQL</strong>: The backbone for handling artwork uploads, categorization, and user management</li>
<li><strong>NextJS</strong>: A React framework that delivers lightning-fast page loads and smooth interactions—essential for keeping young visitors engaged</li>
</ul>
<p>The architecture is simple but scalable. Laravel powers the API, managing the heavy lifting of image processing and database operations. NextJS handles the front-end, creating a snappy, app-like experience perfect for tablet-toting kids and proud parents showing off on their phones.</p>
<h3>Design With Heart</h3>
<p>The aesthetic was non-negotiable: <strong>children and girly theme</strong>. This meant:</p>
<ul>
<li><strong>Soft, watercolor-inspired UI elements</strong> that mirror Wasan&#39;s actual work</li>
<li><strong>Rounded corners and gentle animations</strong>—no sharp edges in this digital playground</li>
<li><strong>Pastel color palette</strong> drawn directly from her favorite pieces</li>
<li><strong>Large, tappable buttons</strong> perfect for tiny fingers</li>
<li><strong>Playful typography</strong> that&#39;s both readable and whimsical</li>
</ul>
<p>Every design decision asked: &quot;Would this make Wasan smile?&quot; The result is an interface that feels like stepping into one of her paintings—warm, welcoming, and full of wonder.</p>
<h2>Why This Matters: Celebrating Children&#39;s Art</h2>
<p>Creating this space made me appreciate the broader world of children&#39;s art and illustration. Artists like those featured on <a href="https://www.wabbasi.com/children-portfolio">wabbasi.com</a> dedicate their careers to visual storytelling for young audiences, while <a href="https://ingridsanchez.com/">ingridsanchez.com</a> shows how watercolor workshops can nurture creativity in artists of all ages.</p>
<p>But here&#39;s the secret: <strong>children don&#39;t need professional training to create meaningful art</strong>. Wasan&#39;s work—her wonky lines, unexpected color choices, and unfiltered joy—captures something professionals often chase. Her painting of &quot;sliced watermelons&quot; might not be photorealistic, but it bursts with the same vibrant energy celebrated in <a href="https://photo2painting.com/blog/watercolor-painting-ideas">photo2painting.com&#39;s easy watercolor ideas</a>.</p>
<h2>Features That Make It Special</h2>
<h3>For Wasan (The Artist)</h3>
<ul>
<li><strong>Drag-and-drop uploads</strong> from her iPad</li>
<li><strong>Simple categorization</strong>: &quot;Animals,&quot; &quot;Flowers,&quot; &quot;Abstract,&quot; &quot;My Feelings&quot;</li>
<li><strong>A &quot;studio&quot; dashboard</strong> where she can see all her work at a glance</li>
<li><strong>Lightbox view</strong> that makes each piece feel like it&#39;s hanging in a real gallery</li>
</ul>
<h3>For Her Audience</h3>
<ul>
<li>Paginated data that mimics flipping through a sketchbook</li>
<li><strong>Shareable links</strong> for individual pieces (perfect for sending to teachers)</li>
<li><strong>Print-on-demand integration</strong> so grandparents can order mugs and cards</li>
<li><strong>Mobile-first design</strong> because that&#39;s how other kids browse</li>
</ul>
<h2>Lessons Learned &amp; Reflections</h2>
<p>Building for a seven-year-old user is humbling. She doesn&#39;t care about my elegant code structure or fancy animations. She cares that &quot;the pink button makes my painting big.&quot; She taught me that <strong>simplicity is the ultimate sophistication</strong> in children&#39;s design.</p>
<p>The project also reinforced what <a href="https://shop.naturalearthpaint.ca/blogs/nep-blog/easy-watercolor-paintings-unleashing-your-creativity-with-simple-techniques">naturalearthpaint.ca</a> emphasizes: art should be about expression, not perfection. Wasan&#39;s gallery isn&#39;t curated for perfection—it&#39;s curated for authenticity. Every piece stays, even the &quot;mistakes,&quot; because in her words, &quot;happy accidents are still happy.&quot;</p>
<h2>What&#39;s Next</h2>
<p>Wasan already has plans: &quot;Dad, can my friends upload their art too?&quot; So yes, multi-user support is coming. She wants &quot;rainbow stickers&quot; for her favorite pieces—gamification features are in development. And she&#39;s requested a &quot;dark mode&quot; because &quot;sometimes I paint at night and the white screen is too bright.&quot;</p>
<p>I&#39;m building a roadmap driven entirely by a first-grader&#39;s imagination. It&#39;s the most exciting product management I&#39;ve ever done.</p>
<h2>A Personal Note</h2>
<p>This wasn&#39;t just a coding project—it was a love letter to my daughter&#39;s creativity. In a world where children&#39;s art too often gets relegated to scrap books and shoe boxes, Wasan now has a permanent, professional gallery. When she&#39;s older, she&#39;ll see her artistic journey from its very first steps. When she applies to art school, she&#39;ll have a portfolio spanning decades.</p>
<p>But more importantly, <strong>today</strong>, she can show her teacher the watermelons she painted yesterday. She can text her aunt the cat portrait that made her proud. She can lay in bed at night, tablet in hand, scrolling through her own growing legacy.</p>
<p>And she can know, with absolute certainty, that what she creates matters enough to have its own home on the internet.</p>
<hr>
<p><strong>Visit the gallery</strong>: <a href="https://wasansart.com/">wasansart.com</a></p>
<p><strong>Follow her journey</strong>: Updates posted as she adds new collections</p>
<p><strong>Commission a piece</strong>: Yes, she takes requests (terms: must include at least one rainbow)</p>
<hr>
<p><em>To all the parents of young artists: Their creativity deserves a stage. Whether it&#39;s a simple Instagram account or a custom-built gallery like Wasan&#39;s, give them a way to share their vision. The confidence it builds is worth every line of code.</em></p>
]]></content:encoded>
            <author>hello@yabasha.dev (Bashar Ayyash)</author>
        </item>
        <item>
            <title><![CDATA[GEX: Global & Local Dependency Auditing CLI]]></title>
            <link>https://yabasha.dev/projects/gex-global-local-dependency-auditing-cli</link>
            <guid isPermaLink="false">https://yabasha.dev/projects/gex-global-local-dependency-auditing-cli</guid>
            <pubDate>Tue, 06 Jan 2026 13:05:07 GMT</pubDate>
            <description><![CDATA[GEX is a cross-runtime CLI tool that solves the headache of losing track of JavaScript dependencies when switching Node.js versions or machines]]></description>
            <content:encoded><![CDATA[<p><strong>A production-ready tool for documenting and managing Node.js and Bun environments across projects and machines.</strong></p>
<h2>Overview</h2>
<p>GEX solves a common friction point for JavaScript developers: <strong>losing track of dependencies when switching Node.js versions or machines</strong>. Instead of manually inventorying global CLIs and local packages before an environment migration, GEX generates <strong>structured, version-controlled reports</strong> of your entire dependency landscape—instantly.</p>
<p>Built as a focused CLI tool, it audits both <strong>npm</strong> and <strong>bun</strong> ecosystems, outputting machine-readable <strong>JSON</strong> for automation or human-friendly <strong>Markdown</strong> for documentation and handovers.</p>
<hr>
<h2>Key Features</h2>
<ul>
<li><strong>Dual Runtime Support</strong>: Seamlessly works with both Node.js/npm and Bun ecosystems</li>
<li><strong>Interactive Launcher</strong>: <code>gex</code> command provides a menu-driven interface to choose runtime and operation</li>
<li><strong>Multi-Format Output</strong>: JSON (default) for scripting, Markdown for documentation</li>
<li><strong>Global &amp; Local Auditing</strong>: Report on globally installed packages or per-project dependencies</li>
<li><strong>Outdated Package Management</strong>: Built-in commands to check and update outdated dependencies</li>
<li><strong>Reproducible Reports</strong>: Deterministic output with sorted packages and stable timestamps</li>
<li><strong>CI/CD Ready</strong>: Zero-dependency execution via <code>npx</code> or <code>bunx</code> for pipeline integration</li>
<li><strong>Version Controlled</strong>: Reports are designed to be committed, enabling diffable dependency history</li>
</ul>
<hr>
<h2>Installation</h2>
<h3>Global Install (Recommended)</h3>
<p><strong>Via npm:</strong></p>
<pre><code class="language-bash">npm i -g @yabasha/gex
</code></pre>
<p><strong>Via Bun:</strong></p>
<pre><code class="language-bash">bun add -g @yabasha/gex
</code></pre>
<h3>Local Build / Development</h3>
<pre><code class="language-bash"># Clone the repository
git clone &lt;https://github.com/yabasha/yabasha-gex.git&gt;
cd yabasha-gex

# Using npm
npm i
npm run build
node dist/cli.cjs --help

# Using Bun
bun install
bun run build
bun dist/cli-bun.mjs --help
</code></pre>
<hr>
<h2>Usage</h2>
<h3>Interactive Launcher: <code>gex</code></h3>
<p>Starting with v1.3.6, the primary <code>gex</code> binary is an interactive launcher:</p>
<pre><code class="language-bash">$ gex

GEX interactive launcher
Choose a runtime and command to run:

  1) gex-node local  – Node (npm) local project report
  2) gex-node global – Node (npm) global packages report
  3) gex-node read   – Node (npm) read existing report
  4) gex-bun local   – Bun local project report
  5) gex-bun global  – Bun global packages report
  6) gex-bun read    – Bun read existing report
  q) Quit without running anything

Selected: gex-node local
Enter extra flags/arguments for &quot;gex-node local&quot; (or press Enter for none):
</code></pre>
<p>You can pass additional flags (e.g., <code>-full-tree -f md -o report.md</code>) which get forwarded to the underlying command.</p>
<p><strong>Direct Mode</strong>: If you run <code>gex</code> with arguments (e.g., <code>gex local --check-outdated</code>), it behaves as <code>gex-node</code> for backward compatibility.</p>
<h3>Direct Runtimes: <code>gex-node</code> &amp; <code>gex-bun</code></h3>
<p>For scriptability or CI/CD, call runtimes directly:</p>
<pre><code class="language-bash"># Node.js/npm runtime
gex-node [command] [options]    # Alias: gn

# Bun runtime
gex-bun [command] [options]     # Alias: gb
</code></pre>
<p><strong>Available Commands:</strong></p>
<ul>
<li><code>local</code> - Audit local project dependencies (default)</li>
<li><code>global</code> - Audit globally installed packages</li>
<li><code>read</code> - Read and optionally install from an existing report</li>
</ul>
<p><strong>Common Flags:</strong></p>
<ul>
<li><code>f, --output-format &lt;md|json&gt;</code> - Output format (default: json)</li>
<li><code>o, --out-file &lt;path&gt;</code> - Write output to file instead of stdout</li>
<li><code>full-tree</code> - Include full <code>npm ls</code> JSON under <code>tree</code> key</li>
<li><code>omit-dev</code> - Exclude devDependencies (local only)</li>
<li><code>c, --check-outdated</code> - Show outdated packages as a table</li>
<li><code>u, --update-outdated [pkg...]</code> - Update outdated packages</li>
</ul>
<h3>Examples</h3>
<details>
<summary>
<strong>View Full CLI Examples</strong> (click to expand)
</summary>

<pre><code class="language-bash"># Local reports - JSON (default)
gex-node                                    # Print to console
gex-node -o report.json                     # Write to file
gex-bun local -o report.json                # Bun runtime

# Local reports - Markdown
gex-node -f md                              # Print to console
gex-node -f md -o report.md                 # Write to file

# Exclude devDependencies
gex-node local --omit-dev -o deps.json

# Global packages
gex-node global -o global.json
gex-bun global -f md -o global.md

# Read existing reports
gex-node read -r path/to/report.json        # JSON report
gex-node read global.md                     # Markdown report
gex-node read -i                            # Install packages from report

# Pipeline processing
gex-node global | jq &#39;.global_packages&#39;     # Use with jq
gex-bun local &gt; report.json                 # Shell redirection

# Outdated package management
gex-node local --check-outdated             # Show outdated table
gex-node local -u axios react               # Update specific packages
gex-bun global --update-outdated            # Update all global Bun packages
</code></pre>
</details>

<hr>
<h2>Output Formats</h2>
<h3>JSON Schema</h3>
<p>Reports include metadata and dependency arrays:</p>
<pre><code class="language-json">{
  &quot;report_version&quot;: &quot;1.0&quot;,
  &quot;timestamp&quot;: &quot;2025-01-01T12:00:00.000Z&quot;,
  &quot;tool_version&quot;: &quot;0.1.0&quot;,
  &quot;project_name&quot;: &quot;my-app&quot;,
  &quot;project_version&quot;: &quot;1.2.3&quot;,
  &quot;global_packages&quot;: [
    {
      &quot;name&quot;: &quot;@yabasha/gex&quot;,
      &quot;version&quot;: &quot;1.3.6&quot;,
      &quot;resolved_path&quot;: &quot;/usr/local/lib/node_modules/@yabasha/gex&quot;
    }
  ],
  &quot;local_dependencies&quot;: [
    {
      &quot;name&quot;: &quot;commander&quot;,
      &quot;version&quot;: &quot;12.1.0&quot;,
      &quot;resolved_path&quot;: &quot;/path/to/project/node_modules/commander&quot;
    }
  ],
  &quot;local_dev_dependencies&quot;: [
    {
      &quot;name&quot;: &quot;vitest&quot;,
      &quot;version&quot;: &quot;2.1.1&quot;,
      &quot;resolved_path&quot;: &quot;/path/to/project/node_modules/vitest&quot;
    }
  ],
  &quot;tree&quot;: { /* Full npm ls JSON when --full-tree is used */}
}
</code></pre>
<h3>Markdown Example</h3>
<pre><code class="language-markdown"># Dependency Report: my-app v1.2.3
Generated: 2025-01-01T12:00:00.000Z

## Global Packages (3)
- `@yabasha/gex@1.3.6`
- `bun@1.1.0`
- `npm@10.0.0`

## Local Dependencies (5)
- `commander@12.1.0`
- `express@4.18.2`

## Dev Dependencies (4)
- `vitest@2.1.1`
- `typescript@5.3.3`
</code></pre>
<hr>
<h2>Outdated Package Management</h2>
<p>GEX integrates directly with package managers to handle outdated dependencies:</p>
<p><strong>Check Outdated:</strong></p>
<pre><code class="language-bash">gex-node local --check-outdated
# Shows: Name | Current | Wanted | Latest | Type
</code></pre>
<p><strong>Update Outdated:</strong></p>
<pre><code class="language-bash">gex-node local --update-outdated          # Update all
gex-node local -u axios react             # Update specific packages
gex-bun global --update-outdated          # Bun reinstalls globals at latest
</code></pre>
<p>After updating, rerun with <code>--check-outdated</code> to verify, and generate a new report with <code>-o</code> to capture the updated state.</p>
<hr>
<h2>CI/CD Integration</h2>
<p>GEX is designed for zero-config CI/CD pipelines:</p>
<pre><code class="language-yaml"># GitHub Actions (Node.js)
- name: Generate dependency report
  run: npx -y @yabasha/gex@latest -f json -o gex-report.json

# GitHub Actions (Bun)
- name: Generate dependency report
  run: bunx @yabasha/gex@latest -f json -o gex-report.json

# Commit report for diffing
- name: Commit dependency report
  run: |
    git add gex-report.json
    git commit -m &quot;chore: update dependency report&quot; || echo &quot;No changes&quot;
</code></pre>
<hr>
<h2>Development &amp; Contributing</h2>
<pre><code class="language-bash"># Initial setup
npm install
npm run build

# Development loop
npm run dev      # Watch mode + CLI help on success

# Quality checks
npm test         # Vitest
npm run lint
npm run format

# Contributing workflow
# 1. Create branch: feat/my-feature
# 2. Make changes + add tests
# 3. Add changeset: npx changeset
# 4. Open PR: gh pr create --fill
</code></pre>
<p>We welcome contributions! The repository is open-source to allow community-driven expansion and adaptation.</p>
<hr>
<p><strong>License</strong>: MIT</p>
<p><em>Built to solve real developer friction—open-sourced to help the community manage dependencies across Node.js and Bun ecosystems with confidence.</em></p>
]]></content:encoded>
            <author>hello@yabasha.dev (Bashar Ayyash)</author>
        </item>
    </channel>
</rss>