<?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>DEV Community: CodeArchitect_J</title>
    <description>The latest articles on DEV Community by CodeArchitect_J (@codearchitect_j).</description>
    <link>https://dev.to/codearchitect_j</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4186183%2Ff18a0f60-0904-4b71-aa07-a6892dce741e.png</url>
      <title>DEV Community: CodeArchitect_J</title>
      <link>https://dev.to/codearchitect_j</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codearchitect_j"/>
    <language>en</language>
    <item>
      <title>approve, permit, transfer: what your wallet is actually asking you to sign #web3#security#ethereum#javascript</title>
      <dc:creator>CodeArchitect_J</dc:creator>
      <pubDate>Fri, 06 Nov 2026 04:06:13 +0000</pubDate>
      <link>https://dev.to/codearchitect_j/approve-permit-transfer-what-your-wallet-is-actually-asking-you-to-sign-3k9j</link>
      <guid>https://dev.to/codearchitect_j/approve-permit-transfer-what-your-wallet-is-actually-asking-you-to-sign-3k9j</guid>
      <description>&lt;p&gt;Most wallet drains don't break any cryptography. They get you to sign something you didn't read. Here's what the common prompts actually do.&lt;/p&gt;

&lt;h2&gt;
  
  
  transfer(to, amount)
&lt;/h2&gt;

&lt;p&gt;Moves tokens out of your wallet right now. The risk is limited to that amount, and you can see it happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  approve(spender, amount)
&lt;/h2&gt;

&lt;p&gt;No tokens move now. You're allowing &lt;code&gt;spender&lt;/code&gt; to pull up to &lt;code&gt;amount&lt;/code&gt; later, as many times as it wants, until the allowance is used up or revoked. "Unlimited" approvals use the max uint256 value and never expire on their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  permit (EIP-2612)
&lt;/h2&gt;

&lt;p&gt;Same effect as approve, but it's an off-chain typed-data signature instead of a transaction. No gas, and nothing shows up in your transaction history when you sign it. Whoever holds that signature can submit it before the deadline. That's why phishing pages love it: "it's just a signature" sounds harmless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permit2
&lt;/h2&gt;

&lt;p&gt;You approve the Permit2 contract once, then grant individual apps allowances by signature, usually with an amount and an expiry. Safer by design, but the same rule applies: read the spender, amount and expiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  setApprovalForAll (NFTs)
&lt;/h2&gt;

&lt;p&gt;Gives an operator control over every item you hold in that collection, not just one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decode before you trust the UI
&lt;/h2&gt;

&lt;p&gt;If you're building or debugging, decode the calldata yourself instead of trusting a label:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Interface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MaxUint256&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ethers&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;erc20&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;Interface&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function transfer(address to, uint256 amount)&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;function approve(address spender, uint256 amount)&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;erc20&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseTransaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;calldata&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&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;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;approve&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;MaxUint256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unlimited approval to&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Five checks before you confirm
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Which function: transfer, approve, permit, or something else?&lt;/li&gt;
&lt;li&gt;Who is the spender or operator, and do you recognize that contract?&lt;/li&gt;
&lt;li&gt;Is the amount unlimited?&lt;/li&gt;
&lt;li&gt;Is there a deadline or expiry?&lt;/li&gt;
&lt;li&gt;Is it the chain you expected?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the prompt says "approve" or "permit" when you expected a simple swap or deposit, stop and find out why.&lt;/p&gt;

&lt;p&gt;What's the most confusing signing prompt you've run into? Drop it below.&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>security</category>
      <category>web3</category>
    </item>
    <item>
      <title>Ollama, llama.cpp or vLLM: pick by workload, not by benchmark Tags：llm, localllm, performance, ai</title>
      <dc:creator>CodeArchitect_J</dc:creator>
      <pubDate>Wed, 04 Nov 2026 04:38:06 +0000</pubDate>
      <link>https://dev.to/codearchitect_j/ollama-llamacpp-or-vllm-pick-by-workload-not-by-benchmark-tagsllm-localllm-performance-ai-59ed</link>
      <guid>https://dev.to/codearchitect_j/ollama-llamacpp-or-vllm-pick-by-workload-not-by-benchmark-tagsllm-localllm-performance-ai-59ed</guid>
      <description>&lt;p&gt;Every few weeks a new benchmark says one local inference stack is X% faster than another. The numbers are usually real. They're also usually answering a different question than the one you have. Here's how I choose, by workload.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One person, trying models → Ollama. If you're pulling a new model every few days to see how it behaves, setup time is the bottleneck, not tokens per second. Ollama's one-command pull and sensible defaults win here, and a slower decode rarely matters when you're reading the output yourself. One catch: set the context length explicitly. If you compare models on defaults, you're not comparing like with like.&lt;/li&gt;
&lt;li&gt;One machine, squeeze it → llama.cpp. When the hardware is fixed (a single consumer GPU, a laptop with no discrete GPU, Apple Silicon) and you want every token per second, build llama.cpp yourself with the backend flags for your hardware. Generic prebuilt binaries often take conservative paths. You also get direct control over layer offloading, KV cache quantization and batch sizes.&lt;/li&gt;
&lt;li&gt;Many users at once → vLLM. The moment several requests arrive concurrently, the question changes from "how fast is one answer" to "how many answers per GPU-hour". Continuous batching lets finished requests leave and new ones join mid-batch, and paged KV cache keeps memory from fragmenting. Single-user benchmarks don't show this at all.
How to run a fair comparison
• Same model file, same quantization
• Same context length, set explicitly
• Same prompts, including one long prompt (prefill) and one long answer (decode)
• Measure time-to-first-token and decode tokens/s separately
• Test at concurrency 1 and at your real expected concurrency
• Write down driver, backend and build flags
If two stacks only differ under one of these conditions, that's your real answer.
Short version: Ollama optimizes your time. llama.cpp optimizes one machine. vLLM optimizes a shared GPU. Pick the one that matches what you're actually short of.
What does your setup look like, and where did you see the biggest gap? Post your numbers with hardware and context length below.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>performance</category>
    </item>
    <item>
      <title>What's your MCP server stack in late 2026?</title>
      <dc:creator>CodeArchitect_J</dc:creator>
      <pubDate>Thu, 29 Oct 2026 05:27:01 +0000</pubDate>
      <link>https://dev.to/codearchitect_j/whats-your-mcp-server-stack-in-late-2026-5d2d</link>
      <guid>https://dev.to/codearchitect_j/whats-your-mcp-server-stack-in-late-2026-5d2d</guid>
      <description>&lt;p&gt;I've been running a handful of MCP servers locally and remotely and I'm curious what others settled on. A few questions: stdio or HTTP transport in production? How do you scope which tools each agent can see? Any good patterns for budgets or rate limits on tool calls? And which servers turned out to be genuinely useful vs. demo-only? I'll share mine in the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  discuss #mcp #ai #opensource
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>mcp</category>
    </item>
    <item>
      <title>What's your MCP server stack in late 2026?</title>
      <dc:creator>CodeArchitect_J</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:48:45 +0000</pubDate>
      <link>https://dev.to/codearchitect_j/whats-your-mcp-server-stack-in-late-2026-1f3e</link>
      <guid>https://dev.to/codearchitect_j/whats-your-mcp-server-stack-in-late-2026-1f3e</guid>
      <description>&lt;p&gt;I've been running a handful of MCP servers locally and remotely and I'm curious what others settled on. A few questions: stdio or HTTP transport in production? How do you scope which tools each agent can see? Any good patterns for budgets or rate limits on tool calls? And which servers turned out to be genuinely useful vs. demo-only? I'll share mine in the comments.#discuss #mcp #ai #opensource&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>discuss</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
