<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: WEDGE Method Dev</title>
    <description>The latest articles on Forem by WEDGE Method Dev (@wedgemethoddev).</description>
    <link>https://forem.com/wedgemethoddev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3790964%2F8aca78c2-e2bc-4bbe-844d-2134c6b63ea2.png</url>
      <title>Forem: WEDGE Method Dev</title>
      <link>https://forem.com/wedgemethoddev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wedgemethoddev"/>
    <language>en</language>
    <item>
      <title>The AI Consulting Rate Card: How to Price Your AI Projects in 2026</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Tue, 07 Apr 2026 02:28:32 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/the-ai-consulting-rate-card-how-to-price-your-ai-projects-in-2026-1620</link>
      <guid>https://forem.com/wedgemethoddev/the-ai-consulting-rate-card-how-to-price-your-ai-projects-in-2026-1620</guid>
      <description>&lt;p&gt;AI consulting is exploding — and so is the confusion around pricing. After building &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt;, a complete AI consulting toolkit, I've talked to dozens of consultants who are either leaving money on the table or losing deals because they can't communicate value clearly.&lt;/p&gt;

&lt;p&gt;Here's the rate card framework I use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mistake Most AI Consultants Make
&lt;/h2&gt;

&lt;p&gt;They price by the hour.&lt;/p&gt;

&lt;p&gt;"I charge $75/hr for AI work" sounds reasonable until a client asks: "How many hours will this take?" Now you're stuck defending time instead of value.&lt;/p&gt;

&lt;p&gt;The fix: &lt;strong&gt;price by outcome, estimate by phase&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three-Tier Rate Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tier 1: Discovery &amp;amp; Audit ($2,500–$5,000 flat)
&lt;/h3&gt;

&lt;p&gt;What you deliver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current workflow audit&lt;/li&gt;
&lt;li&gt;AI readiness assessment&lt;/li&gt;
&lt;li&gt;Opportunity scorecard&lt;/li&gt;
&lt;li&gt;ROI projection model&lt;/li&gt;
&lt;li&gt;Implementation roadmap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is your foot-in-the-door. It's low risk for the client, high value for you — and it almost always leads to a Phase 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 2: Implementation ($10,000–$50,000)
&lt;/h3&gt;

&lt;p&gt;Broken into milestones, not hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Milestone 1: Setup &amp;amp; integration (30%)&lt;/li&gt;
&lt;li&gt;Milestone 2: Pilot + testing (40%)&lt;/li&gt;
&lt;li&gt;Milestone 3: Deployment + training (30%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never bill 100% upfront. Never go purely hourly. Milestone-based keeps everyone accountable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 3: Retainer ($3,000–$8,000/month)
&lt;/h3&gt;

&lt;p&gt;Ongoing AI operations support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly model tuning&lt;/li&gt;
&lt;li&gt;New automation builds&lt;/li&gt;
&lt;li&gt;Team training sessions&lt;/li&gt;
&lt;li&gt;Performance reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retainers are where real income stability comes from.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value Anchor Formula
&lt;/h2&gt;

&lt;p&gt;Before any proposal, calculate the client's current cost of NOT having AI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Manual hours/month × hourly rate = Current cost
Current cost × 12 = Annual waste
Your project cost ÷ Annual waste = ROI payback period
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you can show a client they're burning $180K/year on tasks AI can handle for $25K — closing the deal is easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Questions That Set Your Rate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What's the company's annual revenue?&lt;/strong&gt; (Your project should cost &amp;lt;2% to be a no-brainer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What decision-makers are involved?&lt;/strong&gt; (More stakeholders = higher risk = higher price)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the timeline?&lt;/strong&gt; (Rush jobs cost more, always)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there IP involved?&lt;/strong&gt; (Training on proprietary data = premium)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens if they DON'T do this?&lt;/strong&gt; (Quantify the pain)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Proposal Template Structure
&lt;/h2&gt;

&lt;p&gt;The best proposals I've seen follow this structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Situation&lt;/strong&gt; — what's happening now&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complication&lt;/strong&gt; — why now is the right time to fix it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution&lt;/strong&gt; — what you'll do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investment&lt;/strong&gt; — the price (never "cost")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROI&lt;/strong&gt; — what they get back&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep it under 8 pages. Clients don't read long proposals — they scan them for the number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pricing Mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Charging for your time, not their outcome&lt;/strong&gt;&lt;br&gt;
Fix: Anchor to business value, not hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2: No discovery phase&lt;/strong&gt;&lt;br&gt;
Fix: Always start with a paid discovery. It funds your research AND qualifies the client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 3: One price option&lt;/strong&gt;&lt;br&gt;
Fix: Always present 3 options (Good/Better/Best). Most clients choose the middle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 4: No retainer conversation&lt;/strong&gt;&lt;br&gt;
Fix: Build retainer into your proposal from Day 1 as "Phase 3."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 5: Underpricing because you're "just getting started"&lt;/strong&gt;&lt;br&gt;
Fix: Price the outcome, not your experience level. A $25K AI automation that saves $200K is worth $25K whether you've been doing this for 1 year or 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's In My Rate Card Template
&lt;/h2&gt;

&lt;p&gt;If you want a ready-to-use rate card with pre-filled tier structures, a built-in ROI calculator, and client-facing language (not technical jargon), I put it all in the &lt;a href="https://wedgemethod.gumroad.com/l/kgvbqz" rel="noopener noreferrer"&gt;WEDGE Starter Toolkit&lt;/a&gt; along with 300+ prompts, proposal templates, and project blueprints.&lt;/p&gt;




&lt;p&gt;What's your current pricing model? Drop it in the comments — I'll give feedback on how to strengthen it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written by Jacob Olschewski, founder of &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt; — the AI operating system built for independent consultants. WEDGE replaces 17+ tools with 6 integrated AI systems that save 10-20 hours/week.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try WEDGE free for 7 days&lt;/a&gt; — no credit card required.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>consulting</category>
      <category>business</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built an AI Operating System for Consultants. Zero Customers. Here's Why I'm Talking About It Now.</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Mon, 06 Apr 2026 22:49:04 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/i-built-an-ai-operating-system-for-consultants-zero-customers-heres-why-im-talking-about-it-now-49jg</link>
      <guid>https://forem.com/wedgemethoddev/i-built-an-ai-operating-system-for-consultants-zero-customers-heres-why-im-talking-about-it-now-49jg</guid>
      <description>&lt;h1&gt;
  
  
  I Built an AI Operating System for Consultants. Zero Customers. Here's Why I'm Talking About It Now.
&lt;/h1&gt;

&lt;p&gt;I've been hiding this product for 6 weeks.&lt;/p&gt;

&lt;p&gt;Not because it's not ready. It's been live at &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt; for weeks.&lt;/p&gt;

&lt;p&gt;I was hiding it because I was scared. Scared it wasn't good enough. Scared people would judge it. Scared of being wrong publicly.&lt;/p&gt;

&lt;p&gt;Today that stops.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is WEDGE Method?
&lt;/h2&gt;

&lt;p&gt;WEDGE is an AI operating system built specifically for independent consultants.&lt;/p&gt;

&lt;p&gt;Not a generic AI tool. Not another ChatGPT wrapper. A complete system with 6 AI engines that handle the work consultants hate doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Research&lt;/strong&gt;: Client briefs in 8 minutes instead of 3 hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proposals&lt;/strong&gt;: Complete proposals in 20 minutes instead of 4 hours
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: Automated follow-up sequences that keep clients engaged&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports&lt;/strong&gt;: Deliverables in 1 hour instead of a full day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strategy&lt;/strong&gt;: AI-assisted thinking partner for your client work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin&lt;/strong&gt;: The 2 hours of daily busywork, automated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem I'm solving: independent consultants waste 15-20 hours every week on research, writing, and admin. At $150/hr billing rate, that's $9,000-$12,000 lost every month to low-value tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why consultants specifically?
&lt;/h2&gt;

&lt;p&gt;I was a consultant. I lost $47,000 in revenue in one year — not because of bad work, but because I was slow. Research took too long. Proposals took too long. Follow-ups fell through the cracks.&lt;/p&gt;

&lt;p&gt;I built the tool I needed. Then I realized every consultant I knew had the same problem.&lt;/p&gt;

&lt;p&gt;750,000 independent management consultants in the US. $3.6B addressable market. One problem: they're all doing $50/hour work when they should be doing $500/hour thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The build-in-public commitment
&lt;/h2&gt;

&lt;p&gt;Starting today, I'm documenting everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many LinkedIn DMs I send and how many reply&lt;/li&gt;
&lt;li&gt;Every customer conversation, what they said, what they needed&lt;/li&gt;
&lt;li&gt;Weekly MRR updates (starting at $0 — honesty first)&lt;/li&gt;
&lt;li&gt;What works, what fails, what surprises me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is $100K MRR by December 2026. I'll tell you every week whether I'm on track or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we are today (April 6, 2026)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MRR&lt;/strong&gt;: $0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customers&lt;/strong&gt;: 0 paying&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product&lt;/strong&gt;: Live and working&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codebase&lt;/strong&gt;: 12 AI agents, 42 cron jobs, 65+ routes, 330+ API endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content moat&lt;/strong&gt;: 332 published articles on Dev.to (you might be reading one right now)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One DFY sale&lt;/strong&gt;: $997 — proof someone will pay. Now building the repeatable system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next this week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Post every day on LinkedIn — starting today&lt;/li&gt;
&lt;li&gt;Send 20 DMs to independent consultants&lt;/li&gt;
&lt;li&gt;Offer the first 5 free 30-day trials to get real feedback&lt;/li&gt;
&lt;li&gt;Set up Gumroad product: &lt;strong&gt;WEDGE Starter Toolkit — $47&lt;/strong&gt; (50 AI prompts for consultants)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're an independent consultant, I want to hear from you. What's the biggest time drain in your practice right now?&lt;/p&gt;

&lt;p&gt;Drop it in the comments. Every response shapes what WEDGE builds next.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Following along costs nothing. The learning is free.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Product: &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want this automated? Check out &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt; — the AI OS built specifically for consultants and knowledge workers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try WEDGE free for 7 days → &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>consulting</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>saas</category>
    </item>
    <item>
      <title>I Charge $5,000 to Build What Takes Me 90 Minutes — Here Is How I Justify It</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Fri, 03 Apr 2026 04:37:41 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/i-charge-5000-to-build-what-takes-me-90-minutes-here-is-how-i-justify-it-eei</link>
      <guid>https://forem.com/wedgemethoddev/i-charge-5000-to-build-what-takes-me-90-minutes-here-is-how-i-justify-it-eei</guid>
      <description>

&lt;h2&gt;
  
  
  Want to save 15+ hours of consulting work every week?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method AI&lt;/a&gt;&lt;/strong&gt; is the AI operating system built for independent consultants.&lt;/p&gt;

&lt;p&gt;→ Client research briefs in 8 minutes (vs 3 hours)&lt;br&gt;
→ Proposals in 20 minutes (vs 4 hours)&lt;br&gt;&lt;br&gt;
→ Reports in 1 hour (vs a full day)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try it free for 7 days →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>business</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My Claude Code Setup Builds Full SaaS Products in 90 Minutes — Here's Every File</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Fri, 03 Apr 2026 04:34:00 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/my-claude-code-setup-builds-full-saas-products-in-90-minutes-heres-every-file-38d4</link>
      <guid>https://forem.com/wedgemethoddev/my-claude-code-setup-builds-full-saas-products-in-90-minutes-heres-every-file-38d4</guid>
      <description>

&lt;h2&gt;
  
  
  Want to save 15+ hours of consulting work every week?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method AI&lt;/a&gt;&lt;/strong&gt; is the AI operating system built for independent consultants.&lt;/p&gt;

&lt;p&gt;→ Client research briefs in 8 minutes (vs 3 hours)&lt;br&gt;
→ Proposals in 20 minutes (vs 4 hours)&lt;br&gt;&lt;br&gt;
→ Reports in 1 hour (vs a full day)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try it free for 7 days →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>devtools</category>
    </item>
    <item>
      <title>How I Automated a Faceless YouTube Channel That Runs Without Me (Code + Architecture)</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Fri, 03 Apr 2026 04:08:54 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/how-i-automated-a-faceless-youtube-channel-that-runs-without-me-code-architecture-1fn8</link>
      <guid>https://forem.com/wedgemethoddev/how-i-automated-a-faceless-youtube-channel-that-runs-without-me-code-architecture-1fn8</guid>
      <description>&lt;p&gt;I built an automated system that produces and schedules faceless YouTube content with minimal manual intervention. Here's the technical architecture for developers who want to build something similar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Faceless YouTube?
&lt;/h2&gt;

&lt;p&gt;Faceless channels (stock footage + voiceover + captions) are one of the most automatable content formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No camera, no face, no filming schedule&lt;/li&gt;
&lt;li&gt;Stock footage is reusable across videos&lt;/li&gt;
&lt;li&gt;Scripts can be AI-generated and human-reviewed&lt;/li&gt;
&lt;li&gt;Editing follows repeatable templates&lt;/li&gt;
&lt;li&gt;Upload and scheduling can be API-driven&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Channels in niches like finance explainers, tech reviews, history, and motivation routinely hit 100K+ subs with this model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│              Content Pipeline                │
│                                              │
│  Niche Research → Script Generation →        │
│  Voice Synthesis → Stock Footage Match →     │
│  Video Assembly → Caption Generation →       │
│  Thumbnail Creation → Upload &amp;amp; Schedule      │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 1: Script Generation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You write YouTube scripts for a faceless channel about [niche].

  &amp;lt;format&amp;gt;
  - Hook (first 5 seconds): Must create curiosity gap
  - Setup (30 seconds): Context and stakes
  - Body (3-5 points, 60 seconds each): Value delivery
  - CTA (15 seconds): Subscribe + next video tease
  &amp;lt;/format&amp;gt;

  &amp;lt;rules&amp;gt;
  - Reading level: 8th grade
  - Sentence length: Under 15 words average
  - Include [PAUSE] markers for natural pacing
  - Include [B-ROLL: description] markers for footage cues
  &amp;lt;/rules&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Topic: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;[B-ROLL]&lt;/code&gt; markers are key — they become the shot list for Step 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Voice Synthesis
&lt;/h3&gt;

&lt;p&gt;I use ElevenLabs API, but any TTS with natural prosody works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;elevenLabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;textToSpeech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;voiceId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cleanScript&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Remove [B-ROLL] markers&lt;/span&gt;
  &lt;span class="na"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eleven_multilingual_v2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;voice_settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;stability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;similarity_boost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cost: ~$0.30 per 1000 characters. A 7-minute script ≈ $0.50.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Stock Footage Matching
&lt;/h3&gt;

&lt;p&gt;Parse the &lt;code&gt;[B-ROLL: description]&lt;/code&gt; markers and search stock footage APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bRollCues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\[&lt;/span&gt;&lt;span class="sr"&gt;B-ROLL: &lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;.+&lt;/span&gt;&lt;span class="se"&gt;?)\]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cue&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;bRollCues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\[&lt;/span&gt;&lt;span class="sr"&gt;B-ROLL: |&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pexels&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;videos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;per_page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Select best match based on duration and relevance&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pexels and Pixabay have free APIs with commercial-use footage. For higher quality, Storyblocks API is ~$15/month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Video Assembly
&lt;/h3&gt;

&lt;p&gt;FFmpeg does the heavy lifting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Concatenate clips with crossfade transitions&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; clip1.mp4 &lt;span class="nt"&gt;-i&lt;/span&gt; clip2.mp4 &lt;span class="nt"&gt;-i&lt;/span&gt; voiceover.mp3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-filter_complex&lt;/span&gt; &lt;span class="s2"&gt;"[0:v][1:v]xfade=transition=fade:duration=0.5"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-map&lt;/span&gt; &lt;span class="s2"&gt;"[outv]"&lt;/span&gt; &lt;span class="nt"&gt;-map&lt;/span&gt; 2:a output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more complex editing (captions, lower thirds), I use &lt;code&gt;moviepy&lt;/code&gt; in Python — it's programmatic and repeatable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Auto-Captions
&lt;/h3&gt;

&lt;p&gt;Whisper (OpenAI's speech recognition) generates accurate captions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;voiceover.mp3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: timestamped segments for SRT/VTT
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burn them into the video with FFmpeg's &lt;code&gt;subtitles&lt;/code&gt; filter for that TikTok/Reels caption style that YouTube viewers now expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Thumbnail Generation
&lt;/h3&gt;

&lt;p&gt;The thumbnail is 80% of whether someone clicks. Pattern that works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bold text (3-5 words max)&lt;/li&gt;
&lt;li&gt;Contrasting colors (yellow on dark, white on blue)&lt;/li&gt;
&lt;li&gt;One focal image&lt;/li&gt;
&lt;li&gt;Faces or arrows pointing at the text (even on faceless channels)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I generate these with Canvas/Figma templates + AI-written text.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Cost per Video&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Script (Claude API)&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice (ElevenLabs)&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stock footage (free tier)&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting/upload&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0.55/video&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 3 videos/week = $7.15/month to run a full YouTube channel.&lt;/p&gt;

&lt;p&gt;Monetization kicks in at 1,000 subs + 4,000 watch hours. Faceless channels in good niches report $3-15 RPM (revenue per 1000 views). At 50K views/month: $150-750/month from ads alone, plus affiliate revenue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hook quality determines everything&lt;/strong&gt; — I tested 50 different opening patterns and found 5 that consistently drive retention above 50%. The knowledge gap ("Most people don't realize...") and specific result ("I went from X to Y") hooks dominate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Batch everything&lt;/strong&gt; — Don't make one video at a time. Generate 30 scripts, record 30 voiceovers, assemble 30 videos. Assembly-line efficiency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Niche selection is 80% of success&lt;/strong&gt; — High RPM niches (finance, tech, business) earn 5-10x more per view than entertainment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;I packaged the complete system — all scripts, prompts, niche research data, and 30 ready-to-film video scripts — into a playbook: &lt;a href="https://wedgemethod.gumroad.com/l/youtube-automation" rel="noopener noreferrer"&gt;YouTube Automation System on Gumroad&lt;/a&gt; ($47).&lt;/p&gt;

&lt;p&gt;If you just want the hook formulas to test with your existing content, I have a free set of 50: &lt;a href="https://wedgemethod.gumroad.com/l/free-hooks" rel="noopener noreferrer"&gt;wedgemethod.gumroad.com/l/free-hooks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy to answer architecture questions in the comments — this was a fun build.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want this automated? Check out &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt; — the AI OS built specifically for consultants and knowledge workers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try WEDGE free for 7 days → &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>python</category>
      <category>youtube</category>
      <category>ai</category>
    </item>
    <item>
      <title>The 5 AI Automation Patterns That Actually Make Money for Small Businesses (With Implementation Guide)</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Fri, 03 Apr 2026 04:08:05 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/the-5-ai-automation-patterns-that-actually-make-money-for-small-businesses-with-implementation-5c46</link>
      <guid>https://forem.com/wedgemethoddev/the-5-ai-automation-patterns-that-actually-make-money-for-small-businesses-with-implementation-5c46</guid>
      <description>

&lt;h2&gt;
  
  
  Want to save 15+ hours of consulting work every week?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method AI&lt;/a&gt;&lt;/strong&gt; is the AI operating system built for independent consultants.&lt;/p&gt;

&lt;p&gt;→ Client research briefs in 8 minutes (vs 3 hours)&lt;br&gt;
→ Proposals in 20 minutes (vs 4 hours)&lt;br&gt;&lt;br&gt;
→ Reports in 1 hour (vs a full day)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try it free for 7 days →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>business</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Complete SaaS Product in 90 Minutes Using Claude Code — Here's the Exact Workflow</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Fri, 03 Apr 2026 04:07:16 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/i-built-a-complete-saas-product-in-90-minutes-using-claude-code-heres-the-exact-workflow-4epk</link>
      <guid>https://forem.com/wedgemethoddev/i-built-a-complete-saas-product-in-90-minutes-using-claude-code-heres-the-exact-workflow-4epk</guid>
      <description>&lt;p&gt;I've been building AI-powered products for the past year, and the workflow I've landed on lets me go from idea to deployed SaaS in about 90 minutes. Not a prototype — a production-ready product with Stripe payments, authentication, and a polished UI.&lt;/p&gt;

&lt;p&gt;Here's the exact system I use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; (Anthropic's CLI) as the AI pair programmer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React + Vite + TypeScript&lt;/strong&gt; for the frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; for deployment (push to deploy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; for payments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: Claude Code isn't just autocomplete. It's an autonomous agent that reads your codebase, makes multi-file edits, runs builds, and fixes its own errors. You architect, it implements.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 90-Minute Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Architecture (10 min)
&lt;/h3&gt;

&lt;p&gt;I start every build with a clear brief. Not vague — specific:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a SaaS landing page for [product].
Stack: React + Vite + TypeScript + Tailwind.
Pages: Landing (hero, features, pricing, FAQ), Checkout.
Payments: Stripe Checkout with 3 tiers.
Deploy: Vercel.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code reads this, scaffolds the project structure, installs dependencies, and creates the file tree. In 10 minutes I have a working skeleton with routing, components, and types.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Build (40 min)
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. I give Claude Code section-by-section instructions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hero section&lt;/strong&gt;: "Create a hero with headline, subheadline, CTA button, and social proof pill. Use the conversion hierarchy: clarity → value → trust → action."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pricing section&lt;/strong&gt;: "3-tier pricing with annual/monthly toggle. Highlight the middle tier. Include trust badges below."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stripe integration&lt;/strong&gt;: "Set up Stripe Checkout with the 3 price IDs. Handle success/cancel redirects."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each instruction takes 3-5 minutes. Claude Code reads the existing code, makes the changes, builds to verify, and moves on. If the build breaks, it reads the error and fixes it automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Polish (20 min)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Responsive design (mobile-first)&lt;/li&gt;
&lt;li&gt;SEO meta tags, OpenGraph, JSON-LD schema&lt;/li&gt;
&lt;li&gt;Security headers in vercel.json&lt;/li&gt;
&lt;li&gt;Performance: lazy loading, code splitting, optimized images&lt;/li&gt;
&lt;li&gt;Accessibility: semantic HTML, ARIA labels, keyboard nav&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 4: Ship (20 min)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial launch"&lt;/span&gt;
git push origin main
&lt;span class="c"&gt;# Vercel auto-deploys from push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I verify: check the live URL, test Stripe checkout flow, run Lighthouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes This Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Skills files&lt;/strong&gt; — I keep markdown files (&lt;code&gt;.claude/skills/&lt;/code&gt;) with my exact patterns for pricing pages, Stripe integration, SEO, etc. Claude Code reads these as context, so every build follows proven patterns instead of starting from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. MCP servers&lt;/strong&gt; — Model Context Protocol lets Claude Code connect to external services. I have 13 MCP servers: GitHub, Stripe, databases, browser automation, documentation lookup. Claude Code can create Stripe products, check deployment status, and look up library docs without leaving the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Prompt caching&lt;/strong&gt; — The Claude API caches system prompts for 5 minutes. For long build sessions, this cuts API costs by ~90% on repeated context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Parallel agents&lt;/strong&gt; — For complex builds, I launch multiple Claude Code subagents in parallel: one building the frontend, one setting up the API, one writing tests. They work simultaneously and I synthesize their output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example: AgentDesk
&lt;/h2&gt;

&lt;p&gt;Last week I built &lt;a href="https://agentdesk-inky.vercel.app" rel="noopener noreferrer"&gt;AgentDesk&lt;/a&gt; — an AI agent management platform — using this exact workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3-tier SaaS pricing ($99/$349/$799 per month)&lt;/li&gt;
&lt;li&gt;Annual pricing toggle with 20% discount&lt;/li&gt;
&lt;li&gt;Stripe payment links for all tiers&lt;/li&gt;
&lt;li&gt;Waitlist form with API endpoint&lt;/li&gt;
&lt;li&gt;Full SEO with JSON-LD schemas&lt;/li&gt;
&lt;li&gt;Deployed to Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total time from &lt;code&gt;mkdir&lt;/code&gt; to live URL: 87 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Patterns That Save the Most Time
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Never start from a blank page&lt;/strong&gt; — Use skills files as templates. A pricing section that took 2 hours the first time now takes 5 minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build → verify → iterate&lt;/strong&gt; — Don't write 500 lines then build. Write 20 lines, build, fix, move on. Claude Code does this naturally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the cheapest model that works&lt;/strong&gt; — Sonnet for most tasks ($3/MTok input), Opus only for complex architecture ($15/MTok). Haiku for classification ($1/MTok).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cache everything&lt;/strong&gt; — System prompts, knowledge base content, few-shot examples. &lt;code&gt;cache_control: { type: 'ephemeral' }&lt;/code&gt; on any content block &amp;gt;1024 tokens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured prompts with XML tags&lt;/strong&gt; — Claude responds dramatically better to &lt;code&gt;&amp;lt;context&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;instructions&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;output_format&amp;gt;&lt;/code&gt; tags than to free-form text.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Cost
&lt;/h2&gt;

&lt;p&gt;A typical 90-minute build session costs $3-8 in API credits. For that I get a fully deployed product with payments, SEO, responsive design, and production security.&lt;/p&gt;

&lt;p&gt;Compare that to hiring a developer for the same scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you want to try this workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Claude Code: &lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set your API key: &lt;code&gt;export ANTHROPIC_API_KEY=your-key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start building: &lt;code&gt;claude&lt;/code&gt; in any project directory&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The learning curve is about a week to get comfortable, and another week to build up your skills files and patterns. After that, the speed compounds.&lt;/p&gt;




&lt;p&gt;I wrote a comprehensive guide covering all of these patterns in detail — the skills system, MCP setup, prompt engineering, agent architectures, and cost optimization. It's at &lt;a href="https://wedgemethod.gumroad.com/l/claude-code-mastery" rel="noopener noreferrer"&gt;wedgemethod.gumroad.com/l/claude-code-mastery&lt;/a&gt; if you want the complete system.&lt;/p&gt;

&lt;p&gt;Happy to answer questions about any part of this workflow in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want this automated? Check out &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt; — the AI OS built specifically for consultants and knowledge workers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try WEDGE free for 7 days → &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Building an AI Agent Platform with Next.js 16 and Claude: A Technical Deep-Dive</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Thu, 26 Mar 2026 11:19:09 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/building-an-ai-agent-platform-with-nextjs-16-and-claude-a-technical-deep-dive-g84</link>
      <guid>https://forem.com/wedgemethoddev/building-an-ai-agent-platform-with-nextjs-16-and-claude-a-technical-deep-dive-g84</guid>
      <description>&lt;p&gt;Last month I shipped &lt;a href="https://agentdesk.thewedgemethodai.com" rel="noopener noreferrer"&gt;AgentDesk&lt;/a&gt; — a SaaS platform where consultants and agencies can run pre-built AI agents for client intake, proposal generation, and reporting. The stack is Next.js 16, Claude Sonnet 4 with tool use, Stripe subscriptions, and Vercel. This post walks through the architecture decisions and actual code that powers it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every consulting firm does the same repetitive work: qualifying inbound leads, writing proposals from call notes, generating client reports. These tasks follow predictable patterns, which makes them perfect candidates for AI agents — not chatbots, but structured agents with defined tools and outputs.&lt;/p&gt;

&lt;p&gt;I wanted to build a platform where each agent has a specific job, uses typed tools, and produces structured output that plugs directly into existing workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The project uses Next.js 16.2.1 with the App Router, React 19, TypeScript, and Tailwind CSS 4. The core is a central agent engine that defines agent configurations and orchestrates Claude API calls. The API layer exposes trial and authenticated endpoints, Stripe handles billing, and the whole thing deploys to Vercel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── app/
│   ├── api/
│   │   ├── agents/[agentId]/route.ts   # Authenticated agent runs
│   │   ├── trial/[agentId]/route.ts    # Free trial with rate limiting
│   │   ├── billing/checkout/route.ts   # Stripe checkout sessions
│   │   └── billing/webhook/route.ts    # Stripe webhook handler
│   ├── dashboard/
│   │   ├── agents/[agentId]/page.tsx   # Individual agent UI
│   │   ├── layout.tsx                  # Dashboard shell
│   │   └── page.tsx                    # Agent list
│   └── page.tsx                        # Landing page
├── lib/
│   ├── agent-engine.ts                 # Core agent definitions + runner
│   └── stripe.ts                       # Stripe config + plan definitions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Agent Engine
&lt;/h2&gt;

&lt;p&gt;The heart of the platform is &lt;code&gt;agent-engine.ts&lt;/code&gt;. Each agent is defined as a typed &lt;code&gt;AgentConfig&lt;/code&gt; object: a system prompt that defines its behavior, a set of Claude tools (function-calling schemas), token limits, and a temperature setting tuned per agent type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AgentConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's a condensed look at how the Intake Agent is defined. The system prompt instructs it to qualify leads on a 1-10 scale, suggest a next action, and draft a personalized response. The &lt;code&gt;qualify_lead&lt;/code&gt; tool gives Claude a structured way to process the inquiry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;INTAKE_AGENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AgentConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;intake&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Intake Agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are a professional client intake agent...
Your job is to:
1. Read incoming inquiries (emails, form submissions, messages)
2. Qualify the lead based on: budget indicators, timeline urgency,
   service fit, company size
3. Generate a personalized, professional response
4. Score the lead on a 1-10 scale with reasoning`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;qualify_lead&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Analyze an incoming inquiry and produce a qualification score, suggested response, and next action.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;input_schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;inquiry_text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The full text of the incoming inquiry&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Where the inquiry came from (email, form, chat)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;sender_info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Any available info about the sender&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inquiry_text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temperature tuning matters. The Intake Agent runs at &lt;code&gt;0.3&lt;/code&gt; for consistent, reliable lead scoring. The Proposal Agent runs at &lt;code&gt;0.4&lt;/code&gt; — slightly more creative for writing proposals, but still grounded. The Report Agent is back at &lt;code&gt;0.3&lt;/code&gt; because reports need to be precise, not creative.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;runAgent&lt;/code&gt; function is the orchestrator. It accepts an agent ID, user input, and optional context, then calls Claude's Messages API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AgentTask&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Agent "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" not found`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contextStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`\n\nAdditional context:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;contextStr&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textBlocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TextBlock&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;textBlocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each task gets a unique ID, tracks its lifecycle (&lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;running&lt;/code&gt; to &lt;code&gt;completed&lt;/code&gt; / &lt;code&gt;failed&lt;/code&gt;), and returns structured output. The type guard on &lt;code&gt;TextBlock&lt;/code&gt; handles Claude's multi-block response format cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trial Rate Limiting Without a Database
&lt;/h2&gt;

&lt;p&gt;For the free trial, I wanted users to try agents without signing up — but I also needed to prevent abuse. The solution: an in-memory &lt;code&gt;Map&lt;/code&gt; with IP-based tracking, scoped to 5 requests per 24-hour window.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trialUsage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;resetAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TRIAL_LIMIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WINDOW_MS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 24 hours&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkTrialLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trialUsage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resetAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;trialUsage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;resetAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;WINDOW_MS&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TRIAL_LIMIT&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;TRIAL_LIMIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TRIAL_LIMIT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Is this production-grade rate limiting? No. The Map resets on every Vercel cold start. But for a trial feature, that's actually a feature — it's forgiving, and a hard-core abuser who discovers the reset behavior still isn't costing much since each request is a single Claude call. When you need actual metering, move to Redis or a database. For launch, this took 20 minutes to build and it works.&lt;/p&gt;

&lt;p&gt;The trial endpoint also caps input at 3,000 characters to prevent prompt-stuffing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmedInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;trimmedInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remainingAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;recordUsage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the limit is hit, the response includes an upgrade URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;trial_limit_reached&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You've used all 5 free trial runs. Upgrade to keep using AgentDesk.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;upgradeUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://buy.stripe.com/...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A cleanup interval runs every 10 minutes to prune expired entries and prevent the Map from growing unbounded — a detail that's easy to forget and causes a slow memory leak if you skip it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stripe Subscription Tiers
&lt;/h2&gt;

&lt;p&gt;Billing is structured as three tiers with clear capability gates. The Starter plan ($99/month) gives access to the Intake Agent only. Professional ($349/month) unlocks all three agents. Agency ($799/month) adds unlimited tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PLANS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;starter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Starter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_PRICE_STARTER&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;intake&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;monthlyPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;taskLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;professional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Professional&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_PRICE_PROFESSIONAL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;intake&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;proposal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;report&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;monthlyPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;349&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;taskLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;agency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Agency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_PRICE_AGENCY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;intake&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;proposal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;report&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;monthlyPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;799&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;taskLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// unlimited&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Price IDs come from environment variables (never hardcoded), and the &lt;code&gt;as const&lt;/code&gt; assertion gives us full type narrowing on &lt;code&gt;PlanId&lt;/code&gt;. The &lt;code&gt;agents&lt;/code&gt; array doubles as an access control list — the API checks whether the user's plan includes the requested agent before running it.&lt;/p&gt;

&lt;p&gt;The Stripe integration uses SDK v21 with the latest API version. Checkout sessions are created server-side, and a webhook handler processes &lt;code&gt;checkout.session.completed&lt;/code&gt; and &lt;code&gt;customer.subscription.updated&lt;/code&gt; events to keep plan status in sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;The whole thing deploys to Vercel with zero configuration beyond environment variables. The App Router's file-based routing means every file in &lt;code&gt;src/app/api/&lt;/code&gt; is automatically a serverless function. No Express server, no Docker, no infrastructure management.&lt;/p&gt;

&lt;p&gt;Key environment variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; — Claude API access&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;STRIPE_SECRET_KEY&lt;/code&gt; — Stripe billing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;STRIPE_PRICE_STARTER&lt;/code&gt;, &lt;code&gt;STRIPE_PRICE_PROFESSIONAL&lt;/code&gt;, &lt;code&gt;STRIPE_PRICE_AGENCY&lt;/code&gt; — plan price IDs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;STRIPE_WEBHOOK_SECRET&lt;/code&gt; — webhook signature verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One Vercel gotcha: when setting env vars, use &lt;code&gt;printf&lt;/code&gt; instead of &lt;code&gt;echo&lt;/code&gt; to pipe values. &lt;code&gt;echo&lt;/code&gt; adds a trailing newline that corrupts Stripe price IDs and causes silent checkout failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Persistent rate limiting from day one.&lt;/strong&gt; The in-memory approach works for launch, but the moment you scale past one serverless instance, users get free resets. Vercel KV or Upstash Redis is the obvious fix and takes about 30 minutes to swap in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming responses.&lt;/strong&gt; The current implementation waits for the full Claude response before returning. For the Proposal Agent, which generates 4,096 tokens of structured markdown, that's a noticeable wait. Server-Sent Events via the App Router's streaming support would improve perceived latency significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-turn agent conversations.&lt;/strong&gt; Right now each agent call is a single turn. The next iteration will add conversation history so agents can ask clarifying questions before producing output — especially useful for the Intake Agent when an inquiry is ambiguous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;AgentDesk is live with a free trial — no signup required. Paste a client inquiry into the Intake Agent, feed call notes into the Proposal Agent, or drop project metrics into the Report Agent and see what comes back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agentdesk.thewedgemethodai.com/dashboard" rel="noopener noreferrer"&gt;&lt;strong&gt;Try the agents at agentdesk.thewedgemethodai.com/dashboard&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're building something similar, the key architectural insight is this: define agents as typed configuration objects, not ad-hoc prompt strings scattered across your codebase. It makes them testable, composable, and easy to add new agents without touching the engine.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want this automated? Check out &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt; — the AI OS built specifically for consultants and knowledge workers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try WEDGE free for 7 days → &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>ai</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built AI Agents That Write Consulting Proposals in 30 Seconds — Here's What Happened</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Thu, 26 Mar 2026 11:07:18 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/i-built-ai-agents-that-write-consulting-proposals-in-30-seconds-heres-what-happened-4cmb</link>
      <guid>https://forem.com/wedgemethoddev/i-built-ai-agents-that-write-consulting-proposals-in-30-seconds-heres-what-happened-4cmb</guid>
      <description>

&lt;h2&gt;
  
  
  Want to save 15+ hours of consulting work every week?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method AI&lt;/a&gt;&lt;/strong&gt; is the AI operating system built for independent consultants.&lt;/p&gt;

&lt;p&gt;→ Client research briefs in 8 minutes (vs 3 hours)&lt;br&gt;
→ Proposals in 20 minutes (vs 4 hours)&lt;br&gt;&lt;br&gt;
→ Reports in 1 hour (vs a full day)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try it free for 7 days →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>consulting</category>
      <category>startup</category>
    </item>
    <item>
      <title>5 Signs Your Consulting Firm Needs AI Agents (Not More Staff)</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Thu, 26 Mar 2026 04:53:13 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/5-signs-your-consulting-firm-needs-ai-agents-not-more-staff-1cd0</link>
      <guid>https://forem.com/wedgemethoddev/5-signs-your-consulting-firm-needs-ai-agents-not-more-staff-1cd0</guid>
      <description>

&lt;h2&gt;
  
  
  Want to save 15+ hours of consulting work every week?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method AI&lt;/a&gt;&lt;/strong&gt; is the AI operating system built for independent consultants.&lt;/p&gt;

&lt;p&gt;→ Client research briefs in 8 minutes (vs 3 hours)&lt;br&gt;
→ Proposals in 20 minutes (vs 4 hours)&lt;br&gt;&lt;br&gt;
→ Reports in 1 hour (vs a full day)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try it free for 7 days →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>consulting</category>
      <category>productivity</category>
      <category>saas</category>
    </item>
    <item>
      <title>AgentDesk vs Hiring Another Consultant: A Cost Comparison</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Thu, 26 Mar 2026 04:52:46 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/agentdesk-vs-hiring-another-consultant-a-cost-comparison-3fif</link>
      <guid>https://forem.com/wedgemethoddev/agentdesk-vs-hiring-another-consultant-a-cost-comparison-3fif</guid>
      <description>&lt;p&gt;Your firm needs more capacity. Do you hire another $150K consultant, or deploy AI agents that work 24/7 for $349/month?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Cost of a New Hire
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Annual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base salary&lt;/td&gt;
&lt;td&gt;$120,000-$180,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Benefits (30%)&lt;/td&gt;
&lt;td&gt;$36,000-$54,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Office/equipment&lt;/td&gt;
&lt;td&gt;$12,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recruiting costs&lt;/td&gt;
&lt;td&gt;$25,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Training (3-month ramp)&lt;/td&gt;
&lt;td&gt;$30,000 in lost productivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Year 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$223,000-$301,000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Cost of AgentDesk
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Monthly&lt;/th&gt;
&lt;th&gt;Annual&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$99&lt;/td&gt;
&lt;td&gt;$1,188&lt;/td&gt;
&lt;td&gt;Intake Agent (lead qualification)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Professional&lt;/td&gt;
&lt;td&gt;$349&lt;/td&gt;
&lt;td&gt;$4,188&lt;/td&gt;
&lt;td&gt;All 3 agents (intake + proposals + reports)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agency&lt;/td&gt;
&lt;td&gt;$799&lt;/td&gt;
&lt;td&gt;$9,588&lt;/td&gt;
&lt;td&gt;Unlimited tasks for your whole team&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What AgentDesk Handles vs What It Doesnt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AgentDesk excels at:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qualifying inbound leads (Intake Agent)&lt;/li&gt;
&lt;li&gt;Generating first-draft proposals (Proposal Agent)&lt;/li&gt;
&lt;li&gt;Creating executive reports from data (Report Agent)&lt;/li&gt;
&lt;li&gt;Working 24/7 with instant response times&lt;/li&gt;
&lt;li&gt;Maintaining consistent quality across all outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You still need humans for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Relationship building and client meetings&lt;/li&gt;
&lt;li&gt;Complex strategy and creative problem-solving&lt;/li&gt;
&lt;li&gt;Final review and approval of deliverables&lt;/li&gt;
&lt;li&gt;New business development and networking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Hybrid Approach
&lt;/h2&gt;

&lt;p&gt;The smartest firms arent choosing AI &lt;em&gt;or&lt;/em&gt; humans — theyre using AI to make their humans more effective:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI handles the admin&lt;/strong&gt; — intake, first drafts, reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humans handle the relationships&lt;/strong&gt; — meetings, strategy, closing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: Each consultant can handle 3x more clients&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ROI Calculation
&lt;/h2&gt;

&lt;p&gt;A 5-person firm on the Professional plan ($349/mo):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Saves&lt;/strong&gt;: 100 hours/month of admin work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At $150/hr billing rate&lt;/strong&gt;: $15,000/month in recovered revenue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: $349/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROI&lt;/strong&gt;: 43x return&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare that to hiring consultant #6 at $223K/year who still spends 42% of their time on admin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://agentdesk-inky.vercel.app" rel="noopener noreferrer"&gt;AgentDesk&lt;/a&gt; — see all three agents in action from the dashboard.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method LLC&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want this automated? Check out &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method&lt;/a&gt; — the AI OS built specifically for consultants and knowledge workers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try WEDGE free for 7 days → &lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;thewedgemethodai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>business</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>Stop Writing Proposals by Hand: How AI Agents Generate Winning Proposals in 30 Seconds</title>
      <dc:creator>WEDGE Method Dev</dc:creator>
      <pubDate>Thu, 26 Mar 2026 04:37:32 +0000</pubDate>
      <link>https://forem.com/wedgemethoddev/stop-writing-proposals-by-hand-how-ai-agents-generate-winning-proposals-in-30-seconds-2a77</link>
      <guid>https://forem.com/wedgemethoddev/stop-writing-proposals-by-hand-how-ai-agents-generate-winning-proposals-in-30-seconds-2a77</guid>
      <description>

&lt;h2&gt;
  
  
  Want to save 15+ hours of consulting work every week?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;WEDGE Method AI&lt;/a&gt;&lt;/strong&gt; is the AI operating system built for independent consultants.&lt;/p&gt;

&lt;p&gt;→ Client research briefs in 8 minutes (vs 3 hours)&lt;br&gt;
→ Proposals in 20 minutes (vs 4 hours)&lt;br&gt;&lt;br&gt;
→ Reports in 1 hour (vs a full day)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://thewedgemethodai.com" rel="noopener noreferrer"&gt;Try it free for 7 days →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
