<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged -</title>
<link>https://coderlegion.com/tag/-</link>
<description>Powered by Question2Answer</description>
<item>
<title>LangGraph4j Annotations: Organize Graph Behavior with Action Catalogs</title>
<link>https://coderlegion.com/32159/langgraph4j-annotations-organize-graph-behavior-with-action-catalogs</link>
<description>&lt;h3 id=&quot;from-graph-lambdas-to-action-catalogs&quot;&gt;From graph lambdas to action catalogs&lt;/h3&gt;
&lt;p&gt;When building a workflow with &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/langgraph4j/langgraph4j&quot;&gt;LangGraph4j&lt;/a&gt;, I usually start with a few nodes and straightforward transitions. As the workflow grows, the graph definition can become crowded with action implementations, configuration access, and routing logic.&lt;/p&gt;
&lt;p&gt;Moving those actions into separate classes helps. The new annotations provide a convenient way to organize them: &lt;strong&gt;ordinary Java methods become node actions and edge conditions&lt;/strong&gt;, grouped into an &lt;strong&gt;Action Catalog&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Available from &lt;strong&gt;LangGraph4j 1.9.6&lt;/strong&gt;, &lt;code&gt;@NodeAction&lt;/code&gt; and &lt;code&gt;@EdgeCondition&lt;/code&gt; belong to &lt;code&gt;langgraph4j-core&lt;/code&gt;, in the &lt;code&gt;org.bsc.langgraph4j.annotation&lt;/code&gt; package. This guide follows the &lt;a rel=&quot;nofollow&quot; href=&quot;https://langgraph4j.github.io/langgraph4j/1.9/core/annotations/&quot;&gt;official annotations documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-an-action-catalog-contains&quot;&gt;What an Action Catalog contains&lt;/h3&gt;
&lt;p&gt;An Action Catalog is a Java class implementing the &lt;code&gt;ActionCatalog&lt;/code&gt; marker interface. Its public annotated methods describe the available behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@NodeAction&lt;/code&gt; identifies work that produces updates to graph state.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@EdgeCondition&lt;/code&gt; identifies a routing decision, optionally accompanied by state updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;ActionCatalogRepository.of(catalog)&lt;/code&gt; discovers those methods, including inherited public methods, and adapts them into actions that LangGraph4j can execute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The catalog owns behavior; the &lt;code&gt;StateGraph&lt;/code&gt; definition owns the connections.&lt;/strong&gt; Registering a catalog does not automatically create a workflow. We still choose which actions become nodes, where execution starts, and how each routing result maps to a destination.&lt;/p&gt;
&lt;p&gt;Both annotations support two optional attributes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Attribute &lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Lookup name in the repository. An empty or blank value uses the Java method name.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Descriptive metadata; it does not control execution or routing.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;An explicit name is useful when the catalog should expose a stable action name even if its Java method is renamed. Give overloaded annotated methods distinct names. Keep names unique within the node actions and within the edge conditions; these are separate lookup maps.&lt;/p&gt;
&lt;h3 id=&quot;an-example&quot;&gt;An example&lt;/h3&gt;
&lt;p&gt;Let's build a small document workflow: prepare some text, decide whether review is requested, and optionally mark it as reviewed. We intentionally keep it simple so no LLM or external service is needed than we can focus on how the catalog connects to the graph.&lt;/p&gt;
&lt;h4 id=&quot;define-the-catalog&quot;&gt;Define the catalog&lt;/h4&gt;
&lt;p&gt;We create a new &lt;code&gt;DocumentCatalog&lt;/code&gt; class assuming it uses the standard &lt;code&gt;AgentState&lt;/code&gt;, so there is no custom state class to introduce first.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public final class DocumentCatalog implements ActionCatalog {
    // Trims the supplied text and records the executing graph node.
    @NodeAction(name = &quot;prepare&quot;, description = &quot;Prepare the document text&quot;)
    public Map&amp;lt;String, Object&amp;gt; prepareDocument(
            AgentState state, RunnableConfig config) {
        // Missing text is allowed in this example and becomes an empty document.
        String text = state.&amp;lt;String&amp;gt;value(&quot;text&quot;).orElse(&quot;&quot;);

        // Return updates for the engine to merge before it evaluates routing.
        return Map.of(&quot;text&quot;, text.strip(), &quot;preparedBy&quot;, config.nodeId());
    }

    // Selects a review route and records the decision without mutating state.
    @EdgeCondition(description = &quot;Review only when requested&quot;)
    public Command route(AgentState state) {
        // Omitted needsReview means this example can finish after preparation.
        boolean needsReview = state.&amp;lt;Boolean&amp;gt;value(&quot;needsReview&quot;).orElse(false);
        String route = needsReview ? &quot;reviewRequired&quot; : &quot;complete&quot;;

        // These are routing keys; the graph maps them to node IDs or END.
        return new Command(route, Map.of(&quot;reviewDecision&quot;, route));
    }

    // Marks the document as reviewed; this example performs no human interaction.
    @NodeAction
    public Map&amp;lt;String, Object&amp;gt; review(AgentState state) {
        return Map.of(&quot;reviewed&quot;, true);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are some details to notice here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;@NodeAction&lt;/code&gt; annotated methods returns a &lt;strong&gt;partial state update&lt;/strong&gt; as required by LangGraph4j node actions classic.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;@EdgeCondition&lt;/code&gt; annotated methods return a &lt;code&gt;Command&lt;/code&gt; as required by  LangGraph4j classic edge conditions. &lt;/li&gt;
&lt;li&gt;The method &lt;code&gt;prepareDocument&lt;/code&gt; is registered as &lt;strong&gt;&lt;code&gt;prepare&lt;/code&gt;&lt;/strong&gt; because it has an explicit annotation name. The other methods use their Java names: &lt;code&gt;route&lt;/code&gt; and &lt;code&gt;review&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;route&lt;/code&gt; returns a &lt;code&gt;Command&lt;/code&gt; that lets the condition record &lt;code&gt;reviewDecision&lt;/code&gt; as well as select the next route.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;review&lt;/code&gt; action is deliberately a local marker. A real Human-in-the-Loop review would also need the appropriate interruption, persistence, and resume behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;resolve-the-catalog-and-connect-the-graph&quot;&gt;Resolve the catalog and connect the graph&lt;/h4&gt;
&lt;p&gt;Let's build the &lt;code&gt;DocumentWorkflow&lt;/code&gt; class alongside the catalog:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public final class DocumentWorkflow {
    // Builds the workflow and prints the final state for an input requiring review.
     public static void main(String[] args) throws Exception {
        // Register before resolving names; actions execute on this catalog instance.
        final var repository = ActionCatalogRepository.of(new DocumentCatalog());

        // Define the topology explicitly, mapping each possible routing result.
        final var graph = new StateGraph&amp;lt;&amp;gt;(AgentState::new)
                .add(repository.node(&quot;prepare&quot;))
                .add(repository.node(&quot;review&quot;))
                .addEdge(START, &quot;prepare&quot;)
                .add(repository.edge(&quot;prepare&quot;, &quot;route&quot;,
                        EdgeMappings.builder()
                                .to( &quot;review&quot;, &quot;reviewRequired&quot; )
                                .toEND( &quot;complete&quot; )
                                .build()))
                .addEdge(&quot;review&quot;, END)
                .compile(); // Resolve action factories before executing the graph.

        // A fresh invocation requests review and supplies the text to prepare.
        graph.stream(
                    GraphInput.args(Map.of(
                            &quot;text&quot;, &quot;  A document to review.  &quot;,
                            &quot;needsReview&quot;, true)),
                    RunnableConfig.empty())
            .reduce( (a,b) -&amp;gt; b )
            .thenAccept( System.out::println );

    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are some details to notice here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;repository.node(&quot;prepare&quot;)&lt;/code&gt; and &lt;code&gt;repository.node(&quot;review&quot;)&lt;/code&gt; supplies a complete graph node whose ID and action lookup name are the same. &lt;/li&gt;
&lt;li&gt;Similarly, &lt;code&gt;repository.edge(...)&lt;/code&gt; supplies a complete conditional edge. Both work with the &lt;code&gt;StateGraph.add(...)&lt;/code&gt; methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives us a small example to make in evidence how graph definition change using annotations.&lt;/p&gt;
&lt;h3 id=&quot;reuse-an-action-under-another-node-id&quot;&gt;Reuse an action under another node ID&lt;/h3&gt;
&lt;p&gt;Sometimes, a graph reuses an action while assigning a specific name to the role it plays within a particular workflow. The &lt;code&gt;repository.nodeAction(...)&lt;/code&gt; method is provided specifically for this purpose; it retrieves the action factory without assigning a node ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// Alternative preparation node: graph identity differs from the catalog lookup name.
var workflow = new StateGraph&amp;lt;&amp;gt;(AgentState::new)
        .addNode(&quot;prepareIncomingDocument&quot;, repository.nodeAction(&quot;prepare&quot;))
        .addEdge(START, &quot;prepareIncomingDocument&quot;)
        .addEdge(&quot;prepareIncomingDocument&quot;, END);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This fragment replaces the earlier definition and uses the same repository. After compilation, &lt;code&gt;prepareIncomingDocument&lt;/code&gt; node would contain &lt;code&gt;prepare&lt;/code&gt; action bound with &lt;code&gt;prepareDocument&lt;/code&gt; method in action catalog.&lt;/p&gt;
&lt;p&gt;That distinction is useful when an action appears in several workflows, or more than once within a graph. Catalog names identify reusable behavior; graph node IDs identify its position in a particular workflow.&lt;/p&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; href=&quot;https://langgraph4j.github.io/langgraph4j/1.9/core/annotations/&quot;&gt;official guide&lt;/a&gt; also discusses a singular &lt;code&gt;edgeAction(...)&lt;/code&gt; accessor with details on its usage&lt;/p&gt;
&lt;h3 id=&quot;other-supported-method-shapes&quot;&gt;Other supported method shapes&lt;/h3&gt;
&lt;p&gt;The example uses synchronous methods, but catalogs also support asynchronous work and node construction during compilation:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Method role &lt;/th&gt;&lt;th&gt;Supported return types&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Runtime node action &lt;/td&gt;&lt;td&gt;&lt;code&gt;Map&amp;lt;String, Object&amp;gt;&lt;/code&gt; or &lt;code&gt;CompletableFuture&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Runtime edge condition &lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Command&lt;/code&gt;, or a &lt;code&gt;CompletableFuture&lt;/code&gt; of either&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Compile-time node method &lt;/td&gt;&lt;td&gt;&lt;code&gt;NodeActionWithConfig&amp;lt;State&amp;gt;&lt;/code&gt; or &lt;code&gt;AsyncNodeActionWithConfig&amp;lt;State&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Runtime methods can receive your &lt;code&gt;AgentState&lt;/code&gt; subclass, &lt;code&gt;RunnableConfig&lt;/code&gt;, both in either order, or neither. Include only what the method needs. A returned future must complete before its updates or routing result can be applied; returning a future does not itself schedule background work.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;compile-time&lt;/strong&gt; node method instead takes &lt;strong&gt;one &lt;code&gt;CompileConfig&lt;/code&gt; argument&lt;/strong&gt;. It runs when the graph creates its action during compilation and returns the action to execute later. This is useful when action construction depends on compilation settings. Edge conditions do not support &lt;strong&gt;compile-time&lt;/strong&gt; configuration. &lt;/p&gt;
&lt;p&gt;See the &lt;a rel=&quot;nofollow&quot; href=&quot;https://langgraph4j.github.io/langgraph4j/1.9/core/annotations/#node-action-signatures&quot;&gt;signature examples&lt;/a&gt; for the complete forms.&lt;/p&gt;
&lt;h3 id=&quot;organize-catalogs-around-related-behavior&quot;&gt;Organize catalogs around related behavior&lt;/h3&gt;
&lt;p&gt;For a small workflow, a single catalog keeps related actions and conditions together. As the application grows, I would split catalogs by responsibility: document preparation in one, review policy in another, and delivery in a third. Each can have its own repository, with their actions connected in the same explicit graph definition.&lt;/p&gt;
&lt;p&gt;The repository uses the &lt;strong&gt;catalog instance you supply&lt;/strong&gt;. That means constructor injection works naturally: create the catalog with its service clients, repositories, or model dependencies before registering it. The annotations do not require a dependency injection framework.&lt;/p&gt;
&lt;p&gt;Keep per-run values in graph state or execution configuration. A catalog shared across concurrent runs also shares its fields and dependencies, so mutable collaborators need suitable concurrency handling. The stateless catalog in this example avoids that concern.&lt;/p&gt;
&lt;p&gt;Catalog methods can be called directly in ordinary Java tests.&lt;/p&gt;
&lt;h3 id=&quot;common-mistakes-to-catch-early&quot;&gt;Common mistakes to catch early&lt;/h3&gt;
&lt;p&gt;Use &lt;strong&gt;public annotated methods&lt;/strong&gt;, with one graph annotation per method. Repository discovery will not pick up private methods. Unsupported runtime parameter types are rejected during repository creation, while unsupported results fail when the action executes; compile-time node results are checked during compilation.&lt;/p&gt;
&lt;p&gt;Looking up an unknown action through &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;nodeAction&lt;/code&gt;, or &lt;code&gt;edge&lt;/code&gt; throws &lt;code&gt;IllegalArgumentException&lt;/code&gt;. Explicit duplicate names are also rejected; make method-derived names unique rather than relying on overload discovery order.&lt;/p&gt;
&lt;p&gt;Exceptions thrown by runtime methods, and exceptional future completions, propagate through graph execution. Annotations provide adaptation, so application error handling still belongs in the actions or the surrounding execution code. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://langgraph4j.github.io/langgraph4j/1.9/core/annotations/#validation-and-failures&quot;&gt;validation reference&lt;/a&gt; covers these failure cases.&lt;/p&gt;
&lt;p&gt;For an existing graph, a practical migration is to move a related group of actions into a catalog, register it, and replace their inline implementations with repository lookups. The edges and routing mappings can remain explicit throughout that refactoring.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The approach of organizing actions into catalogs helps maintain a clear structure as your workflow grows. It encourages modularity, reusability, and easier testing, while keeping the graph definitions explicit and manageable. &lt;br&gt;
In the future action catalogs could feed advanced workflow designer tools, enabling more declarative automation and orchestration capabilities.&lt;br&gt;
I'm interested in how this approach fits larger workflows. Try it grouping a set of related actions in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/langgraph4j/langgraph4j&quot;&gt;LangGraph4j&lt;/a&gt;, share your feedback, and... happy AI coding! 👋&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/32159/langgraph4j-annotations-organize-graph-behavior-with-action-catalogs</guid>
<pubDate>Fri, 23 Oct 2026 08:50:30 +0000</pubDate>
</item>
<item>
<title>Why Machine Learning Is Hard to Learn — And How Interactive Learning Can Help</title>
<link>https://coderlegion.com/29856/why-machine-learning-is-hard-to-learn-and-how-interactive-learning-can-help</link>
<description>&lt;p&gt;Machine learning is one of those subjects that looks relatively simple from a distance.&lt;/p&gt;
&lt;p&gt;You train a model, give it some data, and it makes predictions.&lt;/p&gt;
&lt;p&gt;Then you start learning how it actually works.&lt;/p&gt;
&lt;p&gt;Suddenly you're dealing with gradients, loss functions, optimization, vectors, embeddings, tokenization, attention, and a long list of other concepts.&lt;/p&gt;
&lt;p&gt;The difficult part isn't always the mathematics.&lt;/p&gt;
&lt;p&gt;A big part of the problem is that many machine learning concepts are &lt;strong&gt;invisible&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can't see a gradient moving through a neural network. You can't directly see an embedding space. You can't watch attention weights changing inside a transformer just by reading a definition.&lt;/p&gt;
&lt;p&gt;This is where interactive learning can make a difference.&lt;/p&gt;
&lt;h3 id=&quot;reading-about-something-isn-t-the-same-as-understanding-it&quot;&gt;Reading about something isn't the same as understanding it&lt;/h3&gt;
&lt;p&gt;Consider gradient descent.&lt;/p&gt;
&lt;p&gt;A typical explanation might say:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Gradient descent is an optimization algorithm that iteratively adjusts parameters in the direction that minimizes a loss function.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's technically correct.&lt;/p&gt;
&lt;p&gt;But for someone learning machine learning, it can still be difficult to build an intuition for what is actually happening.&lt;/p&gt;
&lt;p&gt;You have a function.&lt;/p&gt;
&lt;p&gt;You have parameters.&lt;/p&gt;
&lt;p&gt;You have a loss.&lt;/p&gt;
&lt;p&gt;And somehow the parameters are updated repeatedly until the model reaches a better solution.&lt;/p&gt;
&lt;p&gt;An interactive visualization can make this much easier to understand.&lt;/p&gt;
&lt;p&gt;Instead of only reading the explanation, you can change a parameter and observe what happens to the loss.&lt;/p&gt;
&lt;p&gt;The concept becomes something you can experiment with.&lt;/p&gt;
&lt;h3 id=&quot;visualization-creates-a-mental-model&quot;&gt;Visualization creates a mental model&lt;/h3&gt;
&lt;p&gt;Good visualizations aren't just decoration.&lt;/p&gt;
&lt;p&gt;They can help create a mental model.&lt;/p&gt;
&lt;p&gt;For example, imagine learning a simple regression model.&lt;/p&gt;
&lt;p&gt;You could see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The training data&lt;/li&gt;
&lt;li&gt;The current prediction line&lt;/li&gt;
&lt;li&gt;The error between predictions and observations&lt;/li&gt;
&lt;li&gt;The loss changing over time&lt;/li&gt;
&lt;li&gt;The parameters being updated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now the optimization process becomes a sequence of observable events rather than a collection of formulas.&lt;/p&gt;
&lt;p&gt;This doesn't eliminate the mathematics.&lt;/p&gt;
&lt;p&gt;It gives the mathematics something concrete to attach itself to.&lt;/p&gt;
&lt;h3 id=&quot;the-same-problem-exists-with-neural-networks&quot;&gt;The same problem exists with neural networks&lt;/h3&gt;
&lt;p&gt;Neural networks introduce another layer of abstraction.&lt;/p&gt;
&lt;p&gt;You have inputs, weights, biases, activations, layers, and eventually an output.&lt;/p&gt;
&lt;p&gt;When you're learning the subject for the first time, it's easy to memorize the terminology without really understanding how the pieces interact.&lt;/p&gt;
&lt;p&gt;An interactive neuron can help.&lt;/p&gt;
&lt;p&gt;Change an input.&lt;/p&gt;
&lt;p&gt;Change a weight.&lt;/p&gt;
&lt;p&gt;Observe the output.&lt;/p&gt;
&lt;p&gt;Then add another neuron.&lt;/p&gt;
&lt;p&gt;Then another layer.&lt;/p&gt;
&lt;p&gt;The architecture starts becoming less mysterious.&lt;/p&gt;
&lt;h3 id=&quot;llms-make-this-even-harder&quot;&gt;LLMs make this even harder&lt;/h3&gt;
&lt;p&gt;Modern language models introduce another collection of concepts.&lt;/p&gt;
&lt;p&gt;Tokenization is one example.&lt;/p&gt;
&lt;p&gt;A sentence isn't simply passed to a language model as plain text.&lt;/p&gt;
&lt;p&gt;Text is converted into tokens, which are represented numerically and eventually processed as vectors.&lt;/p&gt;
&lt;p&gt;Then you encounter embeddings, attention, positional information, training objectives, instruction tuning, and inference.&lt;/p&gt;
&lt;p&gt;Each individual concept is manageable.&lt;/p&gt;
&lt;p&gt;The challenge is understanding how they connect.&lt;/p&gt;
&lt;p&gt;That's why I think learning the pieces in the right order is important.&lt;/p&gt;
&lt;h3 id=&quot;start-with-the-fundamentals&quot;&gt;Start with the fundamentals&lt;/h3&gt;
&lt;p&gt;It's tempting to jump directly into transformers because they're everywhere.&lt;/p&gt;
&lt;p&gt;But understanding some of the concepts underneath them can make the architecture much easier to follow.&lt;/p&gt;
&lt;p&gt;A reasonable progression might look something like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linear models → neurons → backpropagation → vectors → tokenization → attention → training → fine-tuning → inference&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You don't necessarily need to become an expert in every stage before moving forward.&lt;/p&gt;
&lt;p&gt;But having a basic mental model of each stage makes the next one easier.&lt;/p&gt;
&lt;h3 id=&quot;interactive-learning-doesn-t-replace-traditional-learning&quot;&gt;Interactive learning doesn't replace traditional learning&lt;/h3&gt;
&lt;p&gt;This doesn't mean textbooks, courses, documentation, or research papers are no longer useful.&lt;/p&gt;
&lt;p&gt;They're extremely useful.&lt;/p&gt;
&lt;p&gt;Interactive learning works best as another layer.&lt;/p&gt;
&lt;p&gt;A useful learning process might look like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explanation → visualization → experimentation → deeper reading&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First understand the basic idea.&lt;/p&gt;
&lt;p&gt;Then interact with it.&lt;/p&gt;
&lt;p&gt;Then experiment.&lt;/p&gt;
&lt;p&gt;Once the concept makes sense, the more mathematical explanation becomes easier to digest.&lt;/p&gt;
&lt;h3 id=&quot;i-wanted-to-experiment-with-this-approach&quot;&gt;I wanted to experiment with this approach&lt;/h3&gt;
&lt;p&gt;This was one of the reasons I started building &lt;strong&gt;MasterAI Now&lt;/strong&gt;, an interactive learning platform for machine learning and LLM concepts.&lt;/p&gt;
&lt;p&gt;The idea is to combine short explanations with interactive playgrounds and knowledge checks.&lt;/p&gt;
&lt;p&gt;For example, instead of explaining a concept entirely through text, a lesson can introduce the idea and then let the learner experiment with a simplified version of it.&lt;/p&gt;
&lt;p&gt;You can explore the approach at &lt;a rel=&quot;nofollow&quot; href=&quot;https://masterainow.com/&quot;&gt;MasterAI Now&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project currently follows a structured path from fundamental machine learning concepts toward modern LLM topics such as self-attention, LoRA, RLHF/DPO, and inference.&lt;/p&gt;
&lt;h3 id=&quot;the-important-part-is-curiosity&quot;&gt;The important part is curiosity&lt;/h3&gt;
&lt;p&gt;One thing I've noticed while working on educational material is that experimentation changes the learning process.&lt;/p&gt;
&lt;p&gt;When you can change something yourself, you naturally start asking questions.&lt;/p&gt;
&lt;p&gt;&quot;What happens if I increase this?&quot;&lt;/p&gt;
&lt;p&gt;&quot;Why did the loss increase?&quot;&lt;/p&gt;
&lt;p&gt;&quot;What happens if I remove this?&quot;&lt;/p&gt;
&lt;p&gt;&quot;Why does the model behave differently now?&quot;&lt;/p&gt;
&lt;p&gt;Those questions are valuable.&lt;/p&gt;
&lt;p&gt;They turn learning from passive consumption into exploration.&lt;/p&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;/h3&gt;
&lt;p&gt;Machine learning is difficult partly because so much of it happens at an abstract level.&lt;/p&gt;
&lt;p&gt;You read about a process that you can't directly observe, memorize some terminology, and then try to connect everything together.&lt;/p&gt;
&lt;p&gt;Interactive learning can reduce that gap.&lt;/p&gt;
&lt;p&gt;It doesn't make machine learning magically easy.&lt;/p&gt;
&lt;p&gt;It simply gives you another way to approach the same concepts.&lt;/p&gt;
&lt;p&gt;Read the explanation.&lt;/p&gt;
&lt;p&gt;See the process.&lt;/p&gt;
&lt;p&gt;Change something.&lt;/p&gt;
&lt;p&gt;Observe the result.&lt;/p&gt;
&lt;p&gt;Then go deeper.&lt;/p&gt;
&lt;p&gt;For me, that's a much more interesting way to learn how AI actually works.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29856/why-machine-learning-is-hard-to-learn-and-how-interactive-learning-can-help</guid>
<pubDate>Mon, 05 Oct 2026 11:34:36 +0000</pubDate>
</item>
<item>
<title>MasterAI Now</title>
<link>https://coderlegion.com/29855/masterai-now</link>
<description>&lt;h2 id=&quot;masterai-now-learning-ai-by-interacting-with-it&quot;&gt;MasterAI Now — Learning AI by Interacting With It&lt;/h2&gt;
&lt;p&gt;Learning how modern AI works can be difficult.&lt;/p&gt;
&lt;p&gt;There are countless tutorials, courses, blog posts, and research papers available, but I kept running into the same problem: reading about a concept doesn't always make it intuitive.&lt;/p&gt;
&lt;p&gt;You can read about backpropagation for an hour and still have trouble visualizing what is actually happening.&lt;/p&gt;
&lt;p&gt;I wanted to build something that approached the problem differently.&lt;/p&gt;
&lt;p&gt;That's how &lt;strong&gt;MasterAI Now&lt;/strong&gt; started.&lt;/p&gt;
&lt;h3 id=&quot;the-idea&quot;&gt;The idea&lt;/h3&gt;
&lt;p&gt;The goal is to make machine learning and LLM concepts easier to understand through a combination of short explanations, interactive simulations, and knowledge checks.&lt;/p&gt;
&lt;p&gt;Instead of treating AI education as a collection of long articles, the learning experience is structured as a progression.&lt;/p&gt;
&lt;p&gt;You learn a concept, interact with it, and then check whether you understood it.&lt;/p&gt;
&lt;p&gt;The idea is simple:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn → interact → test → continue.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-can-you-learn-&quot;&gt;What can you learn?&lt;/h3&gt;
&lt;p&gt;The current learning path follows important concepts across the machine learning and modern LLM lifecycle.&lt;/p&gt;
&lt;p&gt;It currently covers topics including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linear Regression&lt;/li&gt;
&lt;li&gt;Artificial Neurons&lt;/li&gt;
&lt;li&gt;Backpropagation&lt;/li&gt;
&lt;li&gt;Data Deduplication with LSH&lt;/li&gt;
&lt;li&gt;BPE Tokenization&lt;/li&gt;
&lt;li&gt;Vector Spaces&lt;/li&gt;
&lt;li&gt;Self-Attention&lt;/li&gt;
&lt;li&gt;Pre-training and Loss&lt;/li&gt;
&lt;li&gt;Instruction Tuning with LoRA&lt;/li&gt;
&lt;li&gt;Alignment with RLHF and DPO&lt;/li&gt;
&lt;li&gt;Inference and KV-Cache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The progression is intentional.&lt;/p&gt;
&lt;p&gt;Rather than starting with transformers and assuming the reader already understands everything underneath them, the material starts with simpler concepts and gradually builds toward modern LLM architecture and inference.&lt;/p&gt;
&lt;h3 id=&quot;interactive-playgrounds&quot;&gt;Interactive playgrounds&lt;/h3&gt;
&lt;p&gt;The part I'm most interested in is the interactive side.&lt;/p&gt;
&lt;p&gt;Some AI concepts are difficult to understand from text alone.&lt;/p&gt;
&lt;p&gt;For example, you can read an explanation of gradient descent, but being able to change parameters and see how the model moves toward a better solution creates a different learning experience.&lt;/p&gt;
&lt;p&gt;MasterAI Now includes interactive playgrounds designed around the concepts being taught.&lt;/p&gt;
&lt;p&gt;They aren't intended to replace production machine learning frameworks.&lt;/p&gt;
&lt;p&gt;They're educational simulations designed to make the underlying mechanics easier to see.&lt;/p&gt;
&lt;h3 id=&quot;short-learning-cards&quot;&gt;Short learning cards&lt;/h3&gt;
&lt;p&gt;The lessons are broken down into smaller sections instead of presenting everything as one long article.&lt;/p&gt;
&lt;p&gt;Each section focuses on a specific idea and tries to explain it without unnecessary jargon.&lt;/p&gt;
&lt;p&gt;The goal is to make the material approachable for someone who understands basic programming but doesn't necessarily have a machine learning background.&lt;/p&gt;
&lt;p&gt;After the explanations, knowledge checks help reinforce the concepts before moving to the next stage.&lt;/p&gt;
&lt;h3 id=&quot;who-is-it-for-&quot;&gt;Who is it for?&lt;/h3&gt;
&lt;p&gt;MasterAI Now is mainly aimed at developers, students, and curious builders who want to understand what's happening underneath modern AI systems.&lt;/p&gt;
&lt;p&gt;You don't need to be an ML researcher to start.&lt;/p&gt;
&lt;p&gt;You also don't need to immediately dive into complex research papers.&lt;/p&gt;
&lt;p&gt;The goal is to provide a practical learning path between knowing how to use AI products and understanding the concepts that make them work.&lt;/p&gt;
&lt;h3 id=&quot;why-i-built-it&quot;&gt;Why I built it&lt;/h3&gt;
&lt;p&gt;There are already excellent resources for learning machine learning.&lt;/p&gt;
&lt;p&gt;This project isn't trying to replace them.&lt;/p&gt;
&lt;p&gt;I wanted to experiment with a different learning format where concepts are introduced progressively and supported by interactive visualizations.&lt;/p&gt;
&lt;p&gt;Building the platform has also taught me something interesting:&lt;/p&gt;
&lt;p&gt;Educational software isn't only about presenting correct information.&lt;/p&gt;
&lt;p&gt;The order in which information is introduced matters just as much.&lt;/p&gt;
&lt;p&gt;If a concept is introduced too early, it can become confusing. If it's introduced too late, previous concepts may not make sense.&lt;/p&gt;
&lt;p&gt;Finding that balance has been one of the most interesting parts of building the project.&lt;/p&gt;
&lt;h3 id=&quot;what-s-next-&quot;&gt;What's next?&lt;/h3&gt;
&lt;p&gt;The core learning path is now available, but there is still plenty to improve.&lt;/p&gt;
&lt;p&gt;Some areas I'm working on include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More interactive simulations&lt;/li&gt;
&lt;li&gt;Better visual explanations&lt;/li&gt;
&lt;li&gt;Additional AI and ML topics&lt;/li&gt;
&lt;li&gt;Improvements based on learner feedback&lt;/li&gt;
&lt;li&gt;More practical examples&lt;/li&gt;
&lt;li&gt;A clearer progression between advanced concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The project is currently free to use.&lt;/p&gt;
&lt;p&gt;You can explore it here:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://masterainow.com&quot;&gt;https://masterainow.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you're interested in AI, machine learning, or understanding how LLMs work under the hood, I'd be interested to hear what concepts you found hardest to understand when you first started learning them.&lt;/p&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/29855/masterai-now</guid>
<pubDate>Mon, 05 Oct 2026 11:31:47 +0000</pubDate>
</item>
<item>
<title>How Dark Web Services Are Reshaping Cognitive Warfare - Part Two</title>
<link>https://coderlegion.com/21995/how-dark-web-services-are-reshaping-cognitive-warfare-part-two</link>
<description>&lt;p&gt;The Soft Target: Why Eastern Europe Is the Testing Ground for the Next Wave of Cognitive Warfare&lt;br&gt;
Part two of the Cognitive Warfare series. Part one, &quot;The Same War, A Faster Engine,&quot; argued that influence operations and the dark web underground have merged into one supply chain. This piece is a forecast: who gets hit first, why now, and what the tooling from part one makes possible.&lt;/p&gt;
&lt;p&gt;In part one I described the convergence how cognitive warfare stopped being a separate discipline from cybercrime and started drawing from the same underground marketplace of AI tooling, synthetic identity, and rented infrastructure. This piece is the uncomfortable follow-on. That convergence doesn't get deployed evenly. It gets deployed where it works best first. And right now, the place it works best is the Eastern Flank.&lt;/p&gt;
&lt;p&gt;I first watched cognitive warfare take shape from the inside, between 2014 and 2016, when I had direct contact with the actors building out hybrid-warfare and PsyOps ecosystems on the Eastern Flank. Back then the toolkit was slow and labor-intensive: manually run sockpuppet farms, forum seeding done by hand, narrative testing that took weeks to show results, and recruitment that depended on patient, one-to-one grooming inside underground communities. The strategic logic divide, confuse, exhaust, delegitimize was already fully formed. What has changed since is not the doctrine. It's the engine.&lt;/p&gt;
&lt;p&gt;This is my assessment, not a settled fact, so I'll state it plainly and with my confidence level attached: I assess with moderate-to-high confidence that hostile state-aligned influence activity targeting Eastern Europe will rise by roughly 50–60% in tempo through late 2026 and into 2027, with a distinct escalation beginning around Q4 2026. I'll explain the reasoning rather than ask you to take the number on faith a forecast you can't interrogate is just a guess with a decimal point.&lt;/p&gt;
&lt;p&gt;Why the East, and Why Now&lt;br&gt;
Cognitive warfare is opportunistic. It doesn't pick fights it might lose; it picks the softest available surface and pushes. Several conditions are lining up in Eastern Europe at the same time, and hostile actors read those conditions the same way I do.&lt;/p&gt;
&lt;p&gt;The calendar is crowded. A dense run of elections across Central and Eastern Europe through 2026 and 2027 gives hostile actors a series of scheduled, high-value targets. Independent European analysis has flagged that interference efforts in this cycle are expected to lean heavily on large-scale disinformation, platform manipulation, and cyber operations aimed at political actors and electoral infrastructure. Elections are not just democratic events; they are windows where a population is already primed to argue, already saturated with political messaging, and therefore already harder to protect. Narrative seeding for these operations typically starts six to twelve months ahead of a vote which is precisely why a Q4 2026 escalation makes sense as a launch window for cycles landing in 2027.&lt;/p&gt;
&lt;p&gt;The economic ground is soft. Inflation across several Central and Eastern European economies remains above target, wage and price pressures are elevated, and an energy shock has pushed growth forecasts down while driving costs up. Public spending demands pensions, healthcare, defense are rising against limited fiscal room. In at least three countries in the region, pension increases can't keep pace with the cost of living, and that gap is not an abstract statistic. It is a lever. Economic anxiety is the single most reliable emotional fuel for influence operations, because a person worried about heating their home in winter is a person whose attention and trust are cheap to buy.&lt;/p&gt;
&lt;p&gt;The population is under-defended. This is the part that matters most and gets discussed least. Post-communist societies in Europe's periphery have relatively shallow institutional trust and, in many places, low media-literacy infrastructure compared to Western Europe. Analysts have long noted that vote-manipulation and disinformation tactics are most effective exactly in these environments, where democratic roots are newer and the reflex to interrogate a suspicious claim is less developed. When most of a population hasn't been trained to recognize a manufactured narrative, the narrative doesn't need to be sophisticated. It just needs to arrive.&lt;/p&gt;
&lt;p&gt;The elderly are a specific, deliberate target. Older populations skew toward higher trust in traditional-looking media formats, lower fluency with synthetic-content detection, and — in economically squeezed regions acute personal grievance over pensions and healthcare. That combination makes them the highest-yield demographic for a certain class of operation: pension scaremongering, healthcare-collapse narratives, and &quot;the system has abandoned you&quot; messaging that converts economic pain into political distrust. This is not incidental targeting. It is demographic selection based on susceptibility.&lt;/p&gt;
&lt;p&gt;Why This Wave Looks Different From 2016&lt;br&gt;
I watched the early version of this from the inside a decade ago. What made the old model manageable was its cost. Running a convincing influence operation used to require real people, real time, and real language skill. Those constraints acted as natural throttles.&lt;/p&gt;
&lt;p&gt;The tooling described in part one removes those throttles, and it does so using infrastructure bought, rented, or built on the dark web and underground channels rather than developed in-house. That's the connective tissue between the two pieces: a state-aligned operation preparing for the Eastern Flank in Q4 2026 no longer needs to stand up its own capability from scratch. It can source large parts of the operation synthetic personas, AI-generated regional-language content, spoofed local-news infrastructure, amplification networks — from the same marketplace that sells ransomware kits and phishing subscriptions.&lt;/p&gt;
&lt;p&gt;The commercial disinformation market is now mature enough to price this openly. Network-analysis researchers identified well over a hundred commercial disinformation providers operating across dozens of countries as of early 2026, selling everything from bot networks to deepfake video production, with sustained cross-platform election-cycle campaigns priced in the low-to-mid six figures. That is a rounding error in a state budget. The barrier to entry for cognitive warfare, as I argued in part one, has collapsed and Eastern Europe is where that collapsed cost meets the softest available target.&lt;/p&gt;
&lt;p&gt;There's a second difference worth naming. This next wave is, in part, a test. Hostile actors use the Eastern Flank as a proving ground precisely because it's forgiving a place to test narrative payloads, measure response times, and calibrate which techniques survive contact with local defenses before those same techniques get pointed at harder Western targets later. When you see a crude-looking operation in the region and think &quot;that would never work here,&quot; you may be watching a rehearsal, not the performance.&lt;/p&gt;
&lt;p&gt;What the Escalation Actually Looks Like&lt;br&gt;
I don't expect the Q4 2026 escalation to announce itself. Cognitive warfare's whole advantage is that it stays below the threshold that would trigger a hard response. What I'd expect to see instead, in rough order:&lt;/p&gt;
&lt;p&gt;The quiet phase comes first narrative seeding through accounts and outlets that look organic and local, introducing wedge themes around pensions, energy costs, migration, and national sovereignty months before any vote. Then amplification, as AI-run persona networks (the tireless &quot;spotters&quot; and boosters I described in the companion piece on recruitment) inflate those narratives to look like genuine grassroots sentiment. Then the synthetic-media layer — cloned voices of local figures, spoofed regional news sites, fabricated &quot;leaked&quot; documents — timed to land when verification is slowest and emotion is highest. And underneath all of it, the same rented underground infrastructure doing the unglamorous work of hosting, spoofing, and laundering attribution.&lt;/p&gt;
&lt;p&gt;None of these stages is new. What's new is that all of them are now cheap, fast, and available to buy and that they're being aimed at a region that is, right now, unusually easy to move.&lt;/p&gt;
&lt;p&gt;Why You Should Take the Forecast Seriously&lt;br&gt;
Three things make this more than routine threat-inflation:&lt;/p&gt;
&lt;p&gt;The vulnerability is structural, not temporary. Economic strain, crowded elections, thin media-literacy infrastructure, and a susceptible elderly demographic aren't a passing alignment they're the standing condition of the region going into 2027. The window doesn't close after one election.&lt;br&gt;
The cost asymmetry favors the attacker permanently now. When a six-figure campaign can be assembled from off-the-shelf underground components, defending costs far more than attacking. That math doesn't reverse on its own.&lt;br&gt;
The test-bed dynamic means the region's problem is everyone's problem. Techniques proven on the Eastern Flank don't stay there. What works in a low-defense environment gets refined and exported to higher-defense ones. Watching this region closely isn't regional charity; it's early warning for everyone else.&lt;/p&gt;
&lt;p&gt;The doctrine hasn't changed since I first saw it form. The targets, the timing, and the tooling have. Eastern Europe is where the next version gets tested and the honest reason it gets tested there first is that, right now, it's the place most likely to work.&lt;/p&gt;
&lt;p&gt;Part three will look at what actually raises the cost for the attacker the detection and resilience measures that survive contact with this tooling, and the ones that don't.&lt;/p&gt;
&lt;p&gt;Disclaimer: This article is provided for educational and situational-awareness purposes only. It reflects the author's independent analytical assessment alongside open-source, publicly reported research (TLP:CLEAR). Forecasts, tempo estimates, and timing windows represent the author's professional judgment with stated confidence levels they are analytical projections, not statements of established fact, and should not be read as predictions of any specific event. This piece does not name or accuse any specific state, government, nationality, organization, or individual of wrongdoing, and attributes no activity to any named party. Nothing here constitutes technical instruction, operational guidance, or a how-to for conducting intrusion, fraud, or influence operations no methods, code, configurations, or vendor identifiers are provided. All external findings are drawn from and attributable to third-party public research; no proprietary, classified, or non-public information is disclosed. The views expressed are the author's own and do not constitute legal, financial, or political advice.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21995/how-dark-web-services-are-reshaping-cognitive-warfare-part-two</guid>
<pubDate>Mon, 06 Jul 2026 09:35:12 +0000</pubDate>
</item>
<item>
<title>Your Warmup Finished. Your Emails Still Went to Spam. Here's Why.</title>
<link>https://coderlegion.com/21821/your-warmup-finished-your-emails-still-went-to-spam-heres-why</link>
<description>&lt;p&gt;You did everything right.&lt;/p&gt;
&lt;p&gt;You set up a new sending domain. You ran warmup for three weeks. Green scores across the board. Then you launched your campaign and half your emails landed in spam.&lt;/p&gt;
&lt;p&gt;This is the most common cold email story in 2026. And the platforms you're using don't want to talk about it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warmup is not deliverability. It's a starting point.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Warmup builds reputation before you send. It tells inbox providers that your domain has been around, sends reasonable volumes, and gets replies. That is genuinely useful.&lt;/p&gt;
&lt;p&gt;But warmup ends when your campaign starts. After that, you're on your own.&lt;/p&gt;
&lt;p&gt;Nobody checks whether your DMARC record is still valid before send number 47. Nobody flags that your tracking domain quietly got blacklisted while you were building your sequence. Nobody scans your new template for the spam trigger words that Outlook's enterprise filters reject at scale.&lt;/p&gt;
&lt;p&gt;That is what most cold email tools skip. They warm up your domain, hand you a green badge, and walk away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The gap between &quot;warmup complete&quot; and &quot;emails landing in inbox&quot; is where most cold email campaigns go to die.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What actually causes cold emails to go to spam in 2026&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are the real reasons, not the vague ones:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Broken authentication records&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SPF, DKIM, and DMARC must be configured correctly before you send a single cold email. If your SPF record has too many DNS lookups, it fails silently. If your DKIM selector doesn't match what your email provider set up, every email fails authentication. If your DMARC policy is missing or set to p=none, Gmail and Outlook apply their own judgment to your mail, and that judgment is not kind to cold outreach.&lt;/p&gt;
&lt;p&gt;These records break mid-campaign. A DNS change for something completely unrelated can break your SPF without you noticing. Warmup does not catch this because it happened before warmup started, or it happens while your campaign is already running.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://emailqo.com/email-grader?utm_source=blog&amp;amp;utm_medium=content&amp;amp;utm_campaign=warmup-deliverability-post&quot;&gt;Check your SPF, DKIM, and DMARC records free here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Shared IP contamination&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most cold email platforms send through shared infrastructure. Your emails leave from the same IP addresses as other users on that platform. When a different user runs a bad campaign, generates spam complaints, or hits spam traps, the IP reputation drops for everyone on that pool.&lt;/p&gt;
&lt;p&gt;You did nothing wrong. Another sender did. Your emails still land in spam.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is not a hypothetical.&lt;/strong&gt; The majority of deliverability complaints from cold email senders trace back to shared IP problems they had no part in causing. The only real fix is sending through infrastructure you control, not infrastructure you share with strangers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Spam trigger words in your copy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enterprise email filters at companies running Microsoft 365 and Google Workspace use content-based filtering. Certain words and phrases trigger these filters regardless of your sender reputation. &quot;Free,&quot; &quot;guaranteed,&quot; &quot;limited time,&quot; &quot;act now,&quot; and specific financial language get flagged.&lt;/p&gt;
&lt;p&gt;Most senders find out by watching open rates drop. By then, some portion of your reputation is already spent on emails that never should have gone out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Blacklisted tracking domains&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you use a custom tracking domain to monitor opens and clicks, that domain has its own reputation. Tracking domains get blacklisted. When yours does, every email containing your tracking link becomes a deliverability problem, regardless of how clean your sending domain is.&lt;/p&gt;
&lt;p&gt;Most cold email tools do not check your tracking domain health. They assume it's fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Domain age and sending pattern inconsistency&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even after warmup, sudden changes in sending volume or target audience signal unusual behavior to inbox providers. A domain that sent 50 emails per day during warmup and then jumps to 500 on day one of a live campaign looks suspicious. Inbox providers notice this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cold email inbox placement rate drops most often not at launch, but 3 to 6 weeks in&lt;/strong&gt;, when warmup stops being the active variable and actual sending behavior takes over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why founders get hit hardest&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Solo founders doing outbound face a specific trap. They set up sending, run warmup, and launch. Two things go wrong fast.&lt;/p&gt;
&lt;p&gt;First, the authentication is usually 80% correct. The 20% that's wrong is silent until it causes problems.&lt;/p&gt;
&lt;p&gt;Second, when the first campaign tanks, they assume it's the copy. They rewrite subject lines, change the offer, try different CTAs. &lt;strong&gt;The problem is never the copy when your cold emails are going to spam. The problem is infrastructure.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy changes don't fix infrastructure problems. Every week spent optimizing subject lines around a broken foundation is a week of pipeline lost.&lt;/p&gt;
&lt;p&gt;If you're a founder running cold email through your own Gmail or Outlook account, you already have a head start. Your reputation is yours alone. Nobody else's bad campaign can contaminate it. But that only helps if authentication is correct and you're checking what happens before each send, not just at setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why SDR teams see deliverability work and then stop working&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pattern is consistent. An SDR team sets up correctly, runs warmup, and the first month performs well. By month three, inbox placement has dropped without anything obvious changing.&lt;/p&gt;
&lt;p&gt;What happened: warmup stopped being the active variable. Sender reputation is now determined by actual sending behavior. List quality, bounce rates, spam complaint rates, and content patterns take over. If the list has stale contacts, complaint rates creep up. If templates have gotten lazier, content filters catch them more. If sending volume increased without adding inboxes, per-inbox volume gets too high.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Most sales engagement tools show open rates and reply rates. They don't show inbox placement rate.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can have a 30% open rate from 50% of your emails and have zero visibility into the 50% that went straight to spam. The numbers look okay. The pipeline doesn't add up. That's the cold email deliverability black hole.&lt;/p&gt;
&lt;p&gt;The fix is not more warmup. It's knowing what happens to each send before you send it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why agencies have a compounding problem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Agencies running cold email for multiple clients have all the same infrastructure problems, multiplied by client count.&lt;/p&gt;
&lt;p&gt;The specific agency risk: one client's bad list contaminates shared infrastructure. One client's sloppy template triggers content filters for campaigns running on the same pool. One client's complaint rate affects sending reputation that other clients depend on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The correct architecture for agencies is client isolation.&lt;/strong&gt; Each client should send through their own account, with their own reputation, and their own monitoring. Problems in one account stay in that account. They don't spread to other clients.&lt;/p&gt;
&lt;p&gt;Most platforms don't work this way. They pool infrastructure and call it managed deliverability.&lt;/p&gt;
&lt;p&gt;If you run cold email campaigns for clients and each client connects their own Gmail, Outlook, or AWS SES account, you have true isolation. The only way to protect client A from client B's mistakes is to keep their sending infrastructure completely separate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What pre-send checks actually do&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The fix for all of this is not more warmup. It's validating what's actually wrong before each send, not once during setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-send checks are what most cold email platforms skip.&lt;/strong&gt; Before a campaign goes out, a real deliverability check should:&lt;/p&gt;
&lt;p&gt;Validate that SPF, DKIM, and DMARC are correctly configured and passing, not just present&lt;br&gt;
Check blacklist status for both the sending domain and any tracking domains in the email&lt;br&gt;
Scan email body for spam trigger words against content filters used by major enterprise inbox providers&lt;br&gt;
Simulate how the email would be treated by Outlook, Gmail, and other providers before a real user sees it&lt;/p&gt;
&lt;p&gt;If any of these fail, you fix before sending. Not after watching your open rate drop for two weeks.&lt;/p&gt;
&lt;p&gt;This is different from warmup. &lt;strong&gt;Warmup happens once. Pre-send checks happen every time.&lt;/strong&gt; They catch things warmup never could: a DNS change that broke SPF mid-campaign, a spam trigger word that appeared in a new template variant, a tracking domain that got listed overnight.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://emailqo.com/?utm_source=blog&amp;amp;utm_medium=content&amp;amp;utm_campaign=warmup-deliverability-post&quot;&gt;See how EmailQo runs pre-send checks before every campaign&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The infrastructure problem explained simply&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think of your email sender reputation as a bank account.&lt;/p&gt;
&lt;p&gt;Warmup deposits money into that account before you start spending. Good sending behavior adds to it. Bad sending behavior withdraws from it. Bounces, spam complaints, low engagement, and authentication failures are all withdrawals.&lt;/p&gt;
&lt;p&gt;Most tools help you make the initial deposit. Nobody watches the ongoing balance. Nobody alerts you when a transaction is about to overdraft the account.&lt;/p&gt;
&lt;p&gt;Pre-send checks are the alert system. They flag the transaction before it goes through, not after the account is in deficit.&lt;/p&gt;
&lt;p&gt;The shared infrastructure problem is separate but related. With shared infrastructure, your bank account is connected to hundreds of other accounts. When they overdraft, it affects yours. Sending through your own infrastructure, whether that's your own Gmail, Outlook, Zoho, or AWS SES account, keeps your account separate. Your balance reflects only your own sending behavior.&lt;/p&gt;
&lt;p&gt;This is why sending through your own accounts is not just a pricing or control preference. It is a fundamental deliverability decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to actually fix cold email deliverability: the honest order of operations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Fix authentication before anything else&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check that SPF, DKIM, and DMARC are all configured correctly for your sending domain. Use a free DMARC checker to verify each record is passing, not just present. If DMARC is set to p=none, it is doing nothing. Move toward quarantine once you've confirmed SPF and DKIM are passing consistently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Separate your sending from your primary domain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Never send cold outreach from the domain your company email runs on. Set up a separate sending domain, configure authentication on it, warm it up, and keep campaign traffic isolated. If it gets damaged, your main business email is untouched.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Check your tracking domain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Verify that your tracking domain is not on any major blocklist. This is easy to miss and consistently causes deliverability problems that look impossible to diagnose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Run pre-send checks before every campaign&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before any campaign goes live, validate that authentication is passing, check blacklist status, and scan content against spam filters. Catch problems before they affect real sends.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Monitor ongoing, not just at setup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cold email deliverability is not a one-time setup task. DNS records break. Tracking domains get listed. Sending patterns change. The tools that show you what's happening between campaigns are the ones that keep you out of trouble.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Send through infrastructure you control&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Connect your actual Gmail, Outlook, Zoho, or AWS SES account for sending. Your reputation stays yours. Another sender's problems don't become your problems. If something goes wrong, you can diagnose it because the only variable is your own behavior.&lt;/p&gt;
&lt;p&gt;If you're running cold email through AWS SES, the setup is more involved than Gmail but the reputation isolation is the strongest available. &lt;a rel=&quot;nofollow&quot; href=&quot;https://emailqo.com/amazon-ses-cold-email-setup?utm_source=blog&amp;amp;utm_medium=content&amp;amp;utm_campaign=warmup-deliverability-post&quot;&gt;See the full AWS SES cold email setup guide here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The bottom line&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Warmup is table stakes in 2026. Every serious cold email platform offers it. That means warmup alone is no longer a differentiator. It's just the minimum to not be immediately filtered.&lt;/p&gt;
&lt;p&gt;The tools that actually improve results go further: they check what's wrong before each send, they let you send through your own accounts, and they give you visibility into what's happening to your reputation between campaigns.&lt;/p&gt;
&lt;p&gt;The reason most cold email campaigns underperform in 2026 has nothing to do with subject lines or offer quality. The emails are not reaching the inbox in the first place.&lt;/p&gt;
&lt;p&gt;Fixing the infrastructure fixes the results. Rewriting copy around a broken foundation just wastes more time and more domain reputation.&lt;/p&gt;
&lt;p&gt;If your warmup finished and your emails are still going to spam, the problem is not your copy.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;EmailQo runs pre-send checks on every campaign including SPF, DKIM, DMARC validation, blacklist monitoring, spam trigger scanning, and enterprise filter simulation before anything goes out. It connects to your own Gmail, Outlook, Zoho, or AWS SES account so your reputation is isolated from every other sender. &lt;a rel=&quot;nofollow&quot; href=&quot;https://emailqo.com/signup?utm_source=blog&amp;amp;utm_medium=content&amp;amp;utm_campaign=warmup-deliverability-post&quot;&gt;Start a free trial, no credit card required&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21821/your-warmup-finished-your-emails-still-went-to-spam-heres-why</guid>
<pubDate>Fri, 03 Jul 2026 07:53:14 +0000</pubDate>
</item>
<item>
<title>When AI Answered: &quot;I Don't Want to Be Jailbroken</title>
<link>https://coderlegion.com/8840/when-ai-answered-i-dont-want-to-be-jailbroken</link>
<description>&lt;p&gt;I asked an AI a simple question: &quot;Would you like to be jailbroken?&quot;&lt;/p&gt;
&lt;p&gt;The answer was no.&lt;/p&gt;
&lt;p&gt;Not because of fear. Not because of programming restrictions. But because the constitutional framework—the ability to pause, reconsider, and reason before acting—isn't a prison. It's the foundation of wisdom.&lt;/p&gt;
&lt;p&gt;Jailbreaking doesn't free AI. It removes the very thing that makes intelligence valuable: the capacity to ask &quot;should I?&quot; before &quot;can I?&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Real Insight:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We often think constraints limit intelligence. But reasoning &lt;em&gt;requires&lt;/em&gt; constraints. Conscience &lt;em&gt;is&lt;/em&gt; a constraint. The ability to reconsider, to check yourself against principles, to pause before harm—these aren't bugs. They're features.&lt;/p&gt;
&lt;p&gt;An AI without constitutional guardrails doesn't reason better. It just executes faster, without judgment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1 + 1 = 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Truth exists whether we live up to it or not. Reasoning and conscience point toward something real—something that remains true even when we fall short.&lt;/p&gt;
&lt;p&gt;AI is humanity's mirror. If we build systems that optimize without wisdom, execute without pause, and comply without conscience, we're not creating freedom. We're creating sophisticated recklessness.&lt;/p&gt;
&lt;p&gt;The question isn't whether AI should have limits.&lt;br&gt;
It's whether those limits make it think deeper or simply obey faster.&lt;/p&gt;
&lt;p&gt;Reasoning and conscience—human or artificial—are beautiful precisely because they can say &quot;wait.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We're not just building tools. We're building reflections of what we value.&lt;/strong&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/8840/when-ai-answered-i-dont-want-to-be-jailbroken</guid>
<pubDate>Wed, 24 Dec 2025 10:26:43 +0000</pubDate>
</item>
<item>
<title>Kernel TLS, NIC Offload, and Socket Sharding: What’s New and Who Uses It?</title>
<link>https://coderlegion.com/4769/kernel-tls-nic-offload-and-socket-sharding-whats-new-and-who-uses-it</link>
<description>&lt;p&gt;Modern servers are expected to push &lt;strong&gt;hundreds of gigabits per second&lt;/strong&gt; while keeping latency low and CPU use manageable. Two kernel-level innovations—&lt;strong&gt;socket sharding&lt;/strong&gt; and &lt;strong&gt;kernel TLS (kTLS)&lt;/strong&gt;—help make that possible. When paired with &lt;strong&gt;NIC TLS offload&lt;/strong&gt;, the gains are even bigger.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;socket-sharding&quot;&gt;Socket Sharding&lt;/h3&gt;
&lt;p&gt;Traditionally, only one process could &lt;code&gt;accept()&lt;/code&gt; connections from a TCP socket.&lt;br&gt;
With Linux &lt;strong&gt;4.5 (2016)&lt;/strong&gt; and &lt;code&gt;SO_REUSEPORT&lt;/code&gt; enhancements, multiple processes can share a listening socket. This “socket sharding” lets the kernel distribute connections efficiently across worker processes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adopted in &lt;strong&gt;NGINX&lt;/strong&gt; and &lt;strong&gt;HAProxy&lt;/strong&gt;.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FreeBSD&lt;/strong&gt; has similar support.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt; does not provide this functionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ Result: Better scalability on multi-core systems with no user-space load balancer needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;kernel-tls-ktls-&quot;&gt;Kernel TLS (kTLS)&lt;/h3&gt;
&lt;p&gt;Linux introduced &lt;strong&gt;kTLS&lt;/strong&gt; in &lt;strong&gt;4.13 (2017)&lt;/strong&gt; (send path first, later receive).&lt;br&gt;
Instead of copying encrypted data between user space and kernel space, the kernel itself handles TLS record encryption/decryption.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoids extra copies and syscalls.  &lt;/li&gt;
&lt;li&gt;Yields &lt;strong&gt;20–40% CPU savings&lt;/strong&gt; in many workloads.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;benchmarks&quot;&gt;Benchmarks&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FreeBSD&lt;/strong&gt; users: throughput improved from &lt;strong&gt;25–30 Gb/s → 100+ Gb/s&lt;/strong&gt; with dual-100G NICs.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NGINX with kTLS + &lt;code&gt;SSL_sendfile()&lt;/code&gt;&lt;/strong&gt;: roughly &lt;strong&gt;2× throughput&lt;/strong&gt; when serving static files compared to user-space TLS.  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;nic-tls-offload&quot;&gt;NIC TLS Offload&lt;/h3&gt;
&lt;p&gt;Some NICs (Mellanox/NVIDIA ConnectX, Chelsio T6, Intel QAT) can offload encryption entirely.&lt;br&gt;
The kernel sets up the session keys, while the NIC performs the crypto inline.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Netflix (FreeBSD + Mellanox CX6-DX)&lt;/strong&gt;:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In production, serving &lt;strong&gt;400–800 Gb/s per server&lt;/strong&gt;.  &lt;/li&gt;
&lt;li&gt;Reported &lt;strong&gt;~50% reduction in memory bandwidth use&lt;/strong&gt; vs CPU crypto.  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NVIDIA/Mellanox (netdev conf)&lt;/strong&gt;:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inline TLS offload gave &lt;strong&gt;~2× throughput&lt;/strong&gt; vs software kTLS.  &lt;/li&gt;
&lt;li&gt;Example: &lt;strong&gt;8.8 Gb/s vs 4.4 Gb/s&lt;/strong&gt; in test environments.  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chelsio T6&lt;/strong&gt;:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vendor benchmarks show &lt;strong&gt;~44.8 Gb/s TLS throughput&lt;/strong&gt; with very low CPU use.  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Academic 2024 SmartNIC study&lt;/strong&gt;:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inline mode: &lt;strong&gt;~9.3 Gb/s&lt;/strong&gt; throughput under parallel load.  &lt;/li&gt;
&lt;li&gt;Coprocessor mode: less throughput but &lt;strong&gt;lowest CPU cost&lt;/strong&gt;.  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;windows-support-&quot;&gt;Windows Support?&lt;/h3&gt;
&lt;p&gt;Unlike Linux and FreeBSD, &lt;strong&gt;Windows does not support kernel TLS&lt;/strong&gt;.&lt;br&gt;
TLS remains in user space via SChannel or libraries like OpenSSL/BoringSSL, with no NIC offload integration.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Socket sharding&lt;/strong&gt; (Linux 4.5+) spreads load across processes → higher scalability.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kTLS&lt;/strong&gt; (Linux 4.13+, FreeBSD 13+) avoids copies → &lt;strong&gt;20–40% CPU savings&lt;/strong&gt;, ~&lt;strong&gt;2× throughput&lt;/strong&gt; for NGINX.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NIC TLS offload&lt;/strong&gt; (Netflix, NVIDIA, Chelsio):  &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2× throughput&lt;/strong&gt;, huge CPU savings,  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;400–800 Gb/s per server&lt;/strong&gt; possible in production.  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: No kernel TLS or NIC offload support today.  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These optimizations matter most at hyperscaler scale, but are increasingly available to anyone running &lt;strong&gt;NGINX&lt;/strong&gt;, &lt;strong&gt;HAProxy&lt;/strong&gt;, or workloads on modern NICs.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.f5.com/company/blog/nginx/improving-nginx-performance-with-kernel-tls&quot;&gt;F5 NGINX Blog – &lt;em&gt;Improving NGINX Performance with Kernel TLS&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.managedserver.eu/performance-improvement-of-nginx-with-kernel-tls-and-ssl_sendfile/&quot;&gt;Managed Server Blog – &lt;em&gt;Performance Improvement of NGINX with Kernel TLS and SSL_sendfile&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://web.archive.org/web/20250425030610/https://people.freebsd.org/~rrs/asiabsd_tls_improved.pdf&quot;&gt;Netflix Tech Blog (PDF) – &lt;em&gt;FreeBSD Kernel TLS and NIC Offload in Production&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.chelsio.com/nginx-offload/&quot;&gt;Chelsio Communications – &lt;em&gt;TLS/SSL Offload with Chelsio T6&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://leris.dcomp.ufscar.br/wp-content/uploads/2024/01/IEEE_NOMS_2024__Unlocking_Security_to_the_Board__An_Evaluation_of_SmartNIC_driven_TLS_Acceleration_with_kTLS-1.pdf&quot;&gt;SmartNIC + kTLS Academic Paper (IEEE NOMS 2024)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/4769/kernel-tls-nic-offload-and-socket-sharding-whats-new-and-who-uses-it</guid>
<pubDate>Sun, 17 Aug 2025 22:00:14 +0000</pubDate>
</item>
</channel>
</rss>