<?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: Alex Chaplinsky</title>
    <description>The latest articles on DEV Community by Alex Chaplinsky (@alchaplinsky).</description>
    <link>https://dev.to/alchaplinsky</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%2F268804%2F4904acd0-adfd-4aa7-b62d-ccb7b2a8e0e8.jpeg</url>
      <title>DEV Community: Alex Chaplinsky</title>
      <link>https://dev.to/alchaplinsky</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alchaplinsky"/>
    <language>en</language>
    <item>
      <title>Postman for AI – a tool that has been missing for a while</title>
      <dc:creator>Alex Chaplinsky</dc:creator>
      <pubDate>Thu, 19 Mar 2026 07:54:12 +0000</pubDate>
      <link>https://dev.to/alchaplinsky/postman-for-ai-a-tool-that-has-been-missing-for-a-while-56l6</link>
      <guid>https://dev.to/alchaplinsky/postman-for-ai-a-tool-that-has-been-missing-for-a-while-56l6</guid>
      <description>&lt;p&gt;Everyone’s building AI agents nowadays. I have also been building AI agents for several years now. At some point, I got tired of the same friction: vendor playgrounds that don’t support variables or multi-provider comparisons, cloud SaaS tools that are great at one thing (logging, evals, tracing) but force you to stitch four of them together, and all of it routing your prompts and API keys through someone else’s servers.&lt;/p&gt;

&lt;p&gt;So I (with the help of AI and other humans) built Reticle — a local desktop app for designing, running, and evaluating LLM scenarios and agents.&lt;/p&gt;

&lt;p&gt;Yes, you could do all of this with code. Just like you can test APIs with curl. But Postman exists for a reason — the right GUI collapses the feedback loop, makes iteration faster, and catches issues you'd only find after shipping. That's what Reticle is trying to be for AI development.&lt;/p&gt;

&lt;p&gt;Here’s how I built it, and the key decisions behind each part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack: Tauri + React + Rust + SQLite
&lt;/h2&gt;

&lt;p&gt;Reticle is a Tauri app — a React frontend with a Rust backend, packaged as a native desktop binary. Everything lives locally: all scenarios, agents, test cases, run history, and API keys are stored in a SQLite database on your machine. No account, no sync, no cloud.&lt;/p&gt;

&lt;p&gt;The Local-first approach was the main idea for this app. Your keys never leave your machine. Your prompts and traces are yours alone. There’s no subscription standing between you and your own development environment — and no vendor lock-in on your iteration history.&lt;/p&gt;

&lt;p&gt;There’s also a practical performance angle: a local SQLite database with no network round-trips is fast in a way that cloud-backed tools simply can’t match for tight iteration loops. When you’re running evals across 50 test cases, that difference is noticeable.&lt;/p&gt;

&lt;p&gt;This wasn’t just a privacy checkbox for me — it was a first-class design constraint. Everything else in Reticle’s architecture follows from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenarios and Agents: the two first-class citizens
&lt;/h2&gt;

&lt;p&gt;Reticle is built around two core primitives. Scenarios are single-shot LLM calls — a system prompt, conversation history, model config, and variables. Agents are ReAct loops where the model reasons, calls tools, gets results, and iterates until it reaches a final answer.&lt;/p&gt;

&lt;p&gt;Scenarios are where you work out what the model should say and how it should say it. The {{variable}} syntax lets you define a prompt template once and fill in values per test run, because in production, prompts are always templates, and testing them with hardcoded strings doesn't reflect real behavior. The same scenario can be run across OpenAI, Anthropic, and Google in one click, with outputs, latency, and cost landing side by side for a direct comparison.&lt;/p&gt;

&lt;p&gt;Agents are where things get more complex and more interesting. The hard part of building agents isn’t getting them to work; it’s debugging them when they don’t. Every agent run streams a structured event log in real time: loop iterations, LLM requests with exact messages, tool calls with arguments and results, token usage and latency per step. When the model passes a wrong argument to a tool or gets stuck in a loop, you see exactly where and why.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k360megp87sj0bma0em.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k360megp87sj0bma0em.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Runs history and built-in usage tracking
&lt;/h2&gt;

&lt;p&gt;Every run also records token usage and calculates an estimated cost based on each model’s published per-token pricing. It’s an approximation, not your exact cloud invoice. But it’s accurate enough to answer the questions that actually matter during development: which model is cheapest for this use case, how much does a full eval suite cost to run, and why did that last agent run cost 10× the previous one. That last question usually has an answer — a runaway loop, an unexpectedly long context, a model being used where a smaller one would’ve been fine. Token-level visibility makes it findable instead of mysterious.&lt;/p&gt;

&lt;p&gt;All runs are stored and fully inspectable after the fact. You can go back to any previous execution, see exactly what the model received and returned, and compare behavior across runs. This matters more than it sounds: the number of times I’ve made a change, gotten a worse result, and had nothing to compare against used to be embarrassing. Now the history is just there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evals: text matching, schema validation, and LLM-as-judge
&lt;/h2&gt;

&lt;p&gt;The eval system is what helps an engineer sleep at night. Prompt changes, model upgrades, and tool updates are all silent regressions waiting to happen. Unless you have assertions in place.&lt;/p&gt;

&lt;p&gt;Reticle supports five assertion types: contains/equals/not_contains for text, json_schema for structured output validation via AJV, tool_called/tool_sequence for verifying agent behavior, and llm_judge for anything subjective.&lt;/p&gt;

&lt;p&gt;The llm_judge type is the one that is useful for non-deterministic outputs. You write a criteria statement in plain English — "the response should be empathetic and avoid technical jargon" — and delegate evaluation to a configurable model (default: gpt-4o-mini) at temperature 0. It returns PASS or FAIL with a reason. For a huge category of real-world outputs that can't be rule-checked, this makes testing practical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01ca4ov4qkk8ra4p7dxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01ca4ov4qkk8ra4p7dxl.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it / tear it apart
&lt;/h2&gt;

&lt;p&gt;Reticle is open source and in public beta. If you’re building agents and the current tooling landscape feels as fragmented to you as it did to me, give it a try.&lt;/p&gt;

&lt;p&gt;Download: &lt;a href="https://reticle.run" rel="noopener noreferrer"&gt;reticle.run&lt;/a&gt;&lt;br&gt;
Source: &lt;a href="https://github.com/fwdai/reticle" rel="noopener noreferrer"&gt;github.com/fwdai/reticle&lt;/a&gt;&lt;br&gt;
I’d genuinely love feedback — what’s missing, what’s wrong, what you’d prioritize. And I’m curious: how are you building and testing your agents today? What does your workflow look like? Drop it in the comments — I’m always looking to learn how others are approaching this.&lt;/p&gt;

&lt;p&gt;If you made it till the end, give this project a ⭐ on GitHub, this helps a lot!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>software</category>
      <category>llm</category>
    </item>
    <item>
      <title>Online Security 101 or why you Should use a Password Manager</title>
      <dc:creator>Alex Chaplinsky</dc:creator>
      <pubDate>Wed, 13 Nov 2019 21:49:12 +0000</pubDate>
      <link>https://dev.to/alchaplinsky/online-security-101-or-why-you-should-use-a-password-manager-3h0p</link>
      <guid>https://dev.to/alchaplinsky/online-security-101-or-why-you-should-use-a-password-manager-3h0p</guid>
      <description>&lt;p&gt;Passwords are part of our daily life whether you log in on any website or enter a passphrase for your ssh key. Every person who works with a computer enters at least one password a day.&lt;/p&gt;

&lt;p&gt;The majority of people use very weak passwords and reuse them on different websites and rarely change them. Mostly because they don't fully realize how dangerous it might be to use an easily-guessable password or even worse use the same password for every single website. Those are anti-patterns of personal cybersecurity.&lt;/p&gt;

&lt;p&gt;Nobody likes remembering long and complex passwords, especially when you need to change them frequently and memorize a new one again. But in order to be sure that your accounts are not an easy target for hackers it is better to follow a couple of simple rules with passwords.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use long and hard to guess passwords
&lt;/h3&gt;

&lt;p&gt;It is definitely not a good idea to use your pet name as a password. Well, actually any name or commonly used words. Attacker already has a couple of giant &lt;em&gt;dictionaries&lt;/em&gt; with commonly used words to iterate over and try to match your password. &lt;/p&gt;

&lt;p&gt;Combining a couple of words together would also not help. The best solution is to come up with more than 10 characters of letters, numbers and special symbols jumbled together. Something that would be definitely hard to find in a dictionary :)&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use a unique password for every website (or service)
&lt;/h3&gt;

&lt;p&gt;Using one password for all your accounts definitely makes it easier to remember credentials for all websites and services. And nobody will ever know, right? &lt;/p&gt;

&lt;p&gt;Not really, if an attacker hacks a website and steals all passwords from the database. He now has an ability to log in with your credentials to all other services that you're using. Even though passwords in the database are probably encrypted (well, in fact, they should be!), a hacker can also run your encrypted passwords against a couple of &lt;strong&gt;rainbow tables&lt;/strong&gt; and find a match. And voila, he knows your real password!&lt;/p&gt;

&lt;p&gt;So please, never use the same password for multiple different services.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Change passwords every once in a while
&lt;/h3&gt;

&lt;p&gt;It is a good habit to change passwords every 3-6 months. This reduces the risk of being &lt;strong&gt;pwned&lt;/strong&gt;. If your password gets leaked into some database that hackers sell to interested parties, it would be useless for them if you change your passwords frequently enough.&lt;/p&gt;

&lt;p&gt;So that being said, we have to admit that it is hard to come up with a password complex enough and memorize it when you are creating a new account on some website. But fortunately, you don't have to. A &lt;a href="https://getswifty.pro" rel="noopener noreferrer"&gt;Password Manager&lt;/a&gt; can help you with this!&lt;/p&gt;

&lt;p&gt;Password Manager is basically a piece of software that helps you to generate strong and unique passwords for every account, store them securely on your device and rotate them as frequently as you want. All those credentials are kept encrypted and secured with one master password that you need to remember.&lt;/p&gt;

&lt;p&gt;There are of course a lot of different password managers out there. Some of them can work offline and store data on your computer and some of them sync your encrypted data to their web servers. Which is ok, since data is encrypted and can only be decrypted with a master password that only you know.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getswifty.pro" rel="noopener noreferrer"&gt;Swifty&lt;/a&gt; is a Free Password Manager which works offline by default and keeps all your sensitive data encrypted on your computer. It is a simple tool like a notepad where you can write all your passwords and keep them for yourself but a lot more secure than regular notepad :)&lt;/p&gt;

&lt;p&gt;Swifty also helps you to easily generate passwords containing letters, numbers and special characters with length up to 50 characters. It also tells you if you have duplicate passwords or passwords older than 6 months (since they were added to Swifty). &lt;/p&gt;

&lt;p&gt;If you want to feel a bit safer and not be afraid of losing all your credentials in case your hard drive dies you can sync your encrypted vault file to your personal Google Drive. And then later you can restore your data with Swifty on another computer. Still, no data is sent to third-party web services. Just to your personal GDrive.&lt;/p&gt;

&lt;p&gt;And also Swifty is FREE and &lt;a href="https://github.com/swiftyapp/swifty" rel="noopener noreferrer"&gt;Open Source&lt;/a&gt;! So you can easily check out its code and maybe contribute ;)&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>passwordmanager</category>
    </item>
  </channel>
</rss>
