<?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: Muhammad Tayyab</title>
    <description>The latest articles on DEV Community by Muhammad Tayyab (@itxtayab).</description>
    <link>https://dev.to/itxtayab</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%2F3855074%2F43b65b8c-4ad5-4203-9519-1ff6eb56a481.jpeg</url>
      <title>DEV Community: Muhammad Tayyab</title>
      <link>https://dev.to/itxtayab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itxtayab"/>
    <language>en</language>
    <item>
      <title>The most valuable part of an agent prompt is the list of things it refuses to do</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Tue, 22 Sep 2026 13:54:47 +0000</pubDate>
      <link>https://dev.to/itxtayab/the-most-valuable-part-of-an-agent-prompt-is-the-list-of-things-it-refuses-to-do-163j</link>
      <guid>https://dev.to/itxtayab/the-most-valuable-part-of-an-agent-prompt-is-the-list-of-things-it-refuses-to-do-163j</guid>
      <description>&lt;p&gt;Anthropic open sourced its reference agents for investment banking, equity research and fund administration. Ten of them, Apache-2.0, sitting at 36,000 stars.&lt;/p&gt;

&lt;p&gt;The agents are interesting. The thing I would actually steal is five lines near the top of the README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capability is the easy half
&lt;/h2&gt;

&lt;p&gt;Anyone can write an agent prompt that says what to do. "You are an expert financial analyst. Build a DCF model." That takes a minute, and it is the part every agent repo shows you.&lt;/p&gt;

&lt;p&gt;Here is what these prompts also say, verbatim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;They do not make investment recommendations, execute transactions, bind risk, post to a ledger, or approve onboarding; every output is staged for human sign-off.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Five refusals. Read them again and notice they are not generic safety hedging. Each one names a specific action in a specific workflow, and each one is the exact point where drafting becomes deciding.&lt;/p&gt;

&lt;p&gt;The KYC agent parses onboarding documents and flags gaps. It does not approve onboarding. The reconciliation agent traces a break to its root cause. It does not post to the ledger. The model builder builds the DCF. It does not tell you the company is undervalued.&lt;/p&gt;

&lt;h2&gt;
  
  
  Each of those lines is a conversation somebody had
&lt;/h2&gt;

&lt;p&gt;That list did not come from a prompt engineer being careful. It came from compliance officers at regulated firms drawing a line, and somebody writing the line down where the model can see it.&lt;/p&gt;

&lt;p&gt;That is why it is worth reading even if you will never open a comps table. Most of us write agent prompts by accumulating capabilities until the demo works. Almost nobody writes the boundary first, because the boundary is invisible until the agent crosses it, and by then you are explaining an incident rather than a design.&lt;/p&gt;

&lt;p&gt;The pattern generalises cleanly. A support agent that drafts refunds but does not issue them. A deploy agent that prepares the release but does not promote to production. An HR agent that screens applications but does not reject candidates. In every case the valuable sentence is the second half, and in every case it is the half that gets left out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on something you already built
&lt;/h2&gt;

&lt;p&gt;Take an agent prompt you have shipped. Write down the five actions it must never take, phrased as concretely as the list above. Not "be careful with user data" but "does not delete records" and "does not send email to customers".&lt;/p&gt;

&lt;p&gt;If that list is hard to write, that is the finding. It usually means the boundary was never decided, only assumed, and an assumed boundary is one the model has no way to respect.&lt;/p&gt;

&lt;p&gt;Then keep the list under version control and diff it when you change the prompt, because refusals get quietly dropped during a rewrite far more often than capabilities do. A plain &lt;a href="https://www.devpik.com/text-tools/text-diff" rel="noopener noreferrer"&gt;text diff&lt;/a&gt; between prompt versions catches it in seconds.&lt;/p&gt;

&lt;p&gt;Fuller write-up of the repo, including what running these agents actually costs once you count the data subscriptions: &lt;a href="https://www.devpik.com/open-source/financial-services" rel="noopener noreferrer"&gt;Claude for Financial Services&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>career</category>
    </item>
    <item>
      <title>Free market data is not free, it is delayed by fifteen minutes</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Mon, 21 Sep 2026 14:25:53 +0000</pubDate>
      <link>https://dev.to/itxtayab/free-market-data-is-not-free-it-is-delayed-by-fifteen-minutes-17pf</link>
      <guid>https://dev.to/itxtayab/free-market-data-is-not-free-it-is-delayed-by-fifteen-minutes-17pf</guid>
      <description>&lt;p&gt;Every developer builds a stock tracker eventually. It is the perfect side project: a clean API, obvious features, and a result you actually use.&lt;/p&gt;

&lt;p&gt;Then you ship it, compare a number against your broker, and find you are fifteen minutes behind.&lt;/p&gt;

&lt;p&gt;This trips up almost everyone the first time, because nothing about "free tier" prepares you for it. The tier is not rate-limited into uselessness. It is time-shifted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exchange owns the price, and it sells it
&lt;/h2&gt;

&lt;p&gt;A stock price is not a public fact like the weather. It is proprietary data produced by an exchange, and exchanges license it. NYSE, Nasdaq and the rest run market data as a real revenue line, with per-user fees, redistribution agreements and audits attached.&lt;/p&gt;

&lt;p&gt;So when an API offers a free tier, it cannot give you what it does not have the right to give you for free. What it can do is wait. Delay the quote past the licensing threshold, typically fifteen minutes, and it stops being the licensed real-time product.&lt;/p&gt;

&lt;p&gt;That single constraint explains a pattern you have probably noticed without naming it: free finance APIs converge on the same shape. Delayed quotes, generous historical data, thin real-time. Historical data is cheap to license because it is no longer tradeable. The present is the expensive part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which is why the honest projects say so
&lt;/h2&gt;

&lt;p&gt;I spent some time in OpenStock, a 17,000-star self-hosted market dashboard built on Next.js. What made it worth writing about is not the feature list. It is that the README says this out loud:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Market data may be delayed based on provider rules and your configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And in the market support docs: non-US symbols delayed by fifteen minutes or more on free tiers, with some emerging markets unavailable on the free chart tier at all.&lt;/p&gt;

&lt;p&gt;Compare that to the usual framing, where "real-time prices" sits in the headline and the asterisk lives somewhere you will find after you deploy it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can still build
&lt;/h2&gt;

&lt;p&gt;None of this makes the project pointless, and it should not stop you building yours. It just means being clear about which application you are building.&lt;/p&gt;

&lt;p&gt;Delayed data is completely fine for a watchlist, for research, for fundamentals, for end-of-day summaries, for alerting on moves you are going to act on over days rather than seconds. That is most private investors, most of the time.&lt;/p&gt;

&lt;p&gt;Delayed data is useless for anything where the fifteen minutes is the whole point. If your idea only works with live quotes, the software was never the hard part. The data licence is, and it is priced accordingly.&lt;/p&gt;

&lt;p&gt;The practical move when you are evaluating any market API: pull one symbol, write down the timestamp the payload carries, and compare it to the wall clock. Dumping a few responses through a &lt;a href="https://www.devpik.com/json-tools/json-to-csv" rel="noopener noreferrer"&gt;JSON to CSV converter&lt;/a&gt; and eyeballing the timestamp column tells you in about two minutes what the pricing page will not.&lt;/p&gt;

&lt;p&gt;Fuller write-up of OpenStock, including why AGPL-3.0 matters much more for a web app than a desktop one: &lt;a href="https://www.devpik.com/open-source/openstock" rel="noopener noreferrer"&gt;OpenStock&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Your agent should not be clicking buttons in an app you wrote</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Sun, 20 Sep 2026 12:39:33 +0000</pubDate>
      <link>https://dev.to/itxtayab/your-agent-should-not-be-clicking-buttons-in-an-app-you-wrote-1l13</link>
      <guid>https://dev.to/itxtayab/your-agent-should-not-be-clicking-buttons-in-an-app-you-wrote-1l13</guid>
      <description>&lt;p&gt;A few days ago I wrote about a tool that lets agents drive your real browser. It is a good tool. Browser automation exists because most software does not expose an API you are allowed to use, so teaching an agent to click is the only way in.&lt;/p&gt;

&lt;p&gt;Then people take that pattern and point it at their own application. That is where it stops making sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  You are making the agent reverse-engineer your own server
&lt;/h2&gt;

&lt;p&gt;Think about what happens when an agent clicks a button in an app you built.&lt;/p&gt;

&lt;p&gt;Your server has the record. Structured, typed, validated. It serialises it to JSON, ships it to the browser, React turns it into DOM nodes, and then the agent reads those DOM nodes and tries to reconstruct the object your server had in the first place.&lt;/p&gt;

&lt;p&gt;Every layout change breaks it. Every loading state is a race. You pay tokens for a screenshot or an accessibility tree to recover data you already had in the right shape one hop earlier.&lt;/p&gt;

&lt;p&gt;You did not need an agent that can use your interface. You needed an interface and an agent that call the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  One schema, six callers
&lt;/h2&gt;

&lt;p&gt;Builder.io's Agent-Native is built on that. You define a capability once as an action: a zod schema and a &lt;code&gt;run&lt;/code&gt; function. Then the agent gets it as a tool, React calls it with a hook, and it is simultaneously an HTTP endpoint, an MCP tool, an A2A endpoint and a CLI command.&lt;/p&gt;

&lt;p&gt;The detail I like most is where the prompt engineering lives. The action's &lt;code&gt;description&lt;/code&gt;, and &lt;code&gt;.describe()&lt;/code&gt; on each schema field, become the tool description and parameter docs the model reads. They sit in the same file as the implementation, so they cannot drift from it. Anyone who has maintained a tool manifest in a second file knows exactly how that drift goes.&lt;/p&gt;

&lt;p&gt;The schema is doing triple duty: generating the JSON Schema the model sees, validating what the UI sends, and validating what the agent sends. If you are hand-writing tool definitions today, a &lt;a href="https://www.devpik.com/json-tools/json-schema-generator" rel="noopener noreferrer"&gt;JSON Schema generator&lt;/a&gt; makes it obvious how much boilerplate that single declaration is replacing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this does not apply
&lt;/h2&gt;

&lt;p&gt;Say the limit plainly. This only works for software you build this way. It has nothing to offer for the SaaS tools you do not control, and there the browser-driving approach is still correct.&lt;/p&gt;

&lt;p&gt;It is also not generative UI, which is a different thing that keeps getting conflated with it. Generative UI means the model produces the interface at runtime. Here the interface is hand-authored and the agent gets the same actions, not the ability to invent screens.&lt;/p&gt;

&lt;p&gt;The rule I would take away: &lt;strong&gt;drive the browser for other people's software, share the action layer for your own.&lt;/strong&gt; If you are doing the first for the second, you built an API and then decided to consume it through a picture of itself.&lt;/p&gt;

&lt;p&gt;Fuller write-up, including the nine open-source reference apps and a licensing footnote worth knowing: &lt;a href="https://www.devpik.com/open-source/agent-native" rel="noopener noreferrer"&gt;Agent-Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Your self-hosted AI stack probably needs one process, not six</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Sat, 19 Sep 2026 12:03:01 +0000</pubDate>
      <link>https://dev.to/itxtayab/your-self-hosted-ai-stack-probably-needs-one-process-not-six-3h53</link>
      <guid>https://dev.to/itxtayab/your-self-hosted-ai-stack-probably-needs-one-process-not-six-3h53</guid>
      <description>&lt;p&gt;Open the compose file for almost any self-hosted AI assistant. You will find an app container, Redis for the queue, Postgres for state, a worker, usually a vector database, often a reverse proxy.&lt;/p&gt;

&lt;p&gt;Six services. For a household of five.&lt;/p&gt;

&lt;p&gt;Then ask what that architecture is actually buying you at that scale. The queue exists so work survives a restart and so you can scale workers horizontally. You are not scaling workers horizontally. You have one box under a desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The queue is solving a problem you do not have
&lt;/h2&gt;

&lt;p&gt;A broker earns its place when producers and consumers scale independently, when work must survive the process that accepted it, or when several services need the same event. Those are real problems at real scale.&lt;/p&gt;

&lt;p&gt;At five users, none of them apply, and you have paid for all of them anyway. Six services is six things that can fail, six sets of logs, six version upgrades, and a debugging experience where a symptom in the UI has its cause three hops away in a container you were not looking at.&lt;/p&gt;

&lt;p&gt;TencentCloud's Octop takes the other branch. One process serves the web dashboard, the CLI backend, every chat channel and the cron scheduler. No broker. Every surface routes through one in-process handler, and the entire runtime state is rebuilt from a SQLite control-plane database on boot.&lt;/p&gt;

&lt;p&gt;That last clause is the part doing the work. Restart-safety usually comes from durable queues plus careful shutdown handling. Here it comes from the process holding no authoritative state at all. Kill it however you like. On boot it reads the database and reconstructs itself. There is nothing in memory worth preserving, which is a much stronger property than preserving it well.&lt;/p&gt;

&lt;h2&gt;
  
  
  SQLite in WAL mode is not the compromise here
&lt;/h2&gt;

&lt;p&gt;The reflex is that SQLite is the starter option you outgrow. For a concurrent-reader, low-concurrent-writer workload on one machine, it is simply the correct choice. No connection pool, no second daemon, no tuning, and your backup is a file copy.&lt;/p&gt;

&lt;p&gt;Octop offers Postgres as an option rather than an assumption. That ordering is the tell that someone thought about the actual workload instead of copying a reference architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this breaks
&lt;/h2&gt;

&lt;p&gt;Say the limits out loud, because they are real. One process is one failure domain. You cannot put the chat gateway on one box and the agent runtime on another. There is a user count past which this stops being clever and starts being a bottleneck.&lt;/p&gt;

&lt;p&gt;For a household or a team of five, that ceiling is theoretical and the operational simplicity is banked every single day. For fifty concurrent users it is the wrong shape.&lt;/p&gt;

&lt;p&gt;The practical version: before you self-host anything with remote access, your upload bandwidth decides whether it is usable at all, and a &lt;a href="https://www.devpik.com/network-tools/speed-test" rel="noopener noreferrer"&gt;speed test&lt;/a&gt; answers that faster than finding out later.&lt;/p&gt;

&lt;p&gt;Fuller write-up, including two caveats worth knowing before you run the installer: &lt;a href="https://www.devpik.com/open-source/octop" rel="noopener noreferrer"&gt;Octop&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>selfhosted</category>
      <category>ai</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your experiment tracker records metrics precisely and code approximately</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Fri, 18 Sep 2026 12:57:09 +0000</pubDate>
      <link>https://dev.to/itxtayab/your-experiment-tracker-records-metrics-precisely-and-code-approximately-5dkb</link>
      <guid>https://dev.to/itxtayab/your-experiment-tracker-records-metrics-precisely-and-code-approximately-5dkb</guid>
      <description>&lt;p&gt;Try to reproduce a result you got six months ago. Not someone else's result. Yours.&lt;/p&gt;

&lt;p&gt;The metrics are fine. Your tracker has the loss curve to four decimal places, the hyperparameters, the wall-clock time, a chart. What it has for the code is a commit hash. You paste it into &lt;code&gt;git show&lt;/code&gt; and get &lt;code&gt;unknown revision&lt;/code&gt;, because that branch was rebased in March.&lt;/p&gt;

&lt;p&gt;This asymmetry is everywhere and almost nobody names it. Experiment trackers are precise about outputs and vague about inputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A commit hash is a pointer, not an archive
&lt;/h2&gt;

&lt;p&gt;A hash only resolves if the object is still reachable. Rebase the branch, squash the PR, delete the fork, garbage-collect the repo, and the number in your tracker becomes a string that used to mean something.&lt;/p&gt;

&lt;p&gt;Worse, it fails silently and asymmetrically. The metrics still render. The chart still draws. Nothing in the UI tells you the other half of the record has evaporated. You find out at the exact moment you need it, which is the moment you are trying to defend a number to someone.&lt;/p&gt;

&lt;p&gt;And that is the happy path, where the code was committed at all. The real one is a tracker row pointing at a dirty working tree from a Tuesday afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  alphaXiv's OpenResearch inverts the relationship
&lt;/h2&gt;

&lt;p&gt;Most tools bolt a tracker alongside version control and have the tracker reference git. OpenResearch makes git the tracker. Experiment variants live in a git-native tree, and every run gets an immutable archive of the commit it was recorded against, not a pointer to one.&lt;/p&gt;

&lt;p&gt;The consequence is small to state and large in practice: the lineage of an idea and the lineage of the code become the same graph. You stop maintaining two systems that agree with each other only as long as nobody rebases.&lt;/p&gt;

&lt;p&gt;It pairs with the other thing it does, which is giving each research direction its own agent session and its own git worktree instead of its own clone. Isolation without duplication, and the worktree lives as long as the hypothesis rather than as long as the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question worth stealing
&lt;/h2&gt;

&lt;p&gt;You do not have to adopt anything to use this. Go to your tracker, pick a run from more than three months ago, and try to check out the code that produced it.&lt;/p&gt;

&lt;p&gt;If the hash resolves, good, you have more discipline than most teams. If it does not, you have just learned that half of what you thought was recorded was never recorded, only referenced.&lt;/p&gt;

&lt;p&gt;One small adjacent habit: the loss values and learning rates in these runs are far easier to compare as exponents than as long decimals, and a &lt;a href="https://www.devpik.com/math-tools/scientific-notation-converter" rel="noopener noreferrer"&gt;scientific notation converter&lt;/a&gt; beats counting zeros in a terminal.&lt;/p&gt;

&lt;p&gt;Full write-up on how OpenResearch handles worktrees, parallel agents and a loopback caveat worth knowing before you run it on a shared cluster: &lt;a href="https://www.devpik.com/open-source/openresearch" rel="noopener noreferrer"&gt;OpenResearch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>git</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A CLI flag is not a security boundary, and one browser tool just proved it</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Thu, 17 Sep 2026 13:03:27 +0000</pubDate>
      <link>https://dev.to/itxtayab/a-cli-flag-is-not-a-security-boundary-and-one-browser-tool-just-proved-it-31np</link>
      <guid>https://dev.to/itxtayab/a-cli-flag-is-not-a-security-boundary-and-one-browser-tool-just-proved-it-31np</guid>
      <description>&lt;p&gt;Tencent released BrowserSkill, a tool that lets AI agents drive the browser you are already logged into. The obvious story is the capability. The interesting story is a breaking change buried in version 0.3.0.&lt;/p&gt;

&lt;p&gt;Before 0.3.0 you could run an agent's browser session unattended by passing &lt;code&gt;--unattended&lt;/code&gt;, or &lt;code&gt;tab borrow --no-confirm&lt;/code&gt;, or setting &lt;code&gt;BSK_REQUEST_HELP=off&lt;/code&gt;. Each one skipped the confirmation prompt that normally asks before the agent takes control of one of your tabs.&lt;/p&gt;

&lt;p&gt;In 0.3.0, none of them work any more. They are still accepted, they are deprecated, and they cannot override anything. The only way to disable confirmation now is a toggle in the browser extension's popup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flag was being set by the wrong party
&lt;/h2&gt;

&lt;p&gt;Think about who actually writes that flag.&lt;/p&gt;

&lt;p&gt;You are not typing &lt;code&gt;bsk tab borrow --no-confirm&lt;/code&gt; yourself. An autonomous agent is composing that command, because composing shell commands is the entire interface. So the safety check and the thing being checked were arriving from the same source. The agent asks for permission and, in the same breath, supplies the argument that waives it.&lt;/p&gt;

&lt;p&gt;That is not a security boundary. That is a suggestion with extra steps.&lt;/p&gt;

&lt;p&gt;Prompt injection makes it concrete. A page your agent reads can contain text aimed at the agent. If a flag can waive confirmation, then the payload only has to convince the model to add six characters to a command it was already going to run. No exploit, no privilege escalation, just a string in a command line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authority has to live where the attacker cannot reach
&lt;/h2&gt;

&lt;p&gt;The fix is not a better flag. It is moving the decision out of the channel the attacker can influence.&lt;/p&gt;

&lt;p&gt;A browser extension setting is a decision a human made once, deliberately, in a UI no agent can type into. The agent can request; it cannot grant. The asymmetry is the whole point, and it is the same reason &lt;code&gt;sudo&lt;/code&gt; prompts on a terminal rather than reading a variable your script set.&lt;/p&gt;

&lt;p&gt;The docs are blunt about the cost, too: scripts that relied on those flags alone will now sit waiting for a confirmation nobody answers. They broke working setups on purpose rather than leave a bypass that looked like a feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question to ask of your own agent tooling
&lt;/h2&gt;

&lt;p&gt;Every agent integration eventually grows a "skip the prompt" path, because somebody needs it for CI. Worth asking: can the agent itself set that flag? If yes, it is decoration.&lt;/p&gt;

&lt;p&gt;There is a related habit worth keeping. Before pointing an agent at a browser profile, check what that profile actually exposes to a site with the &lt;a href="https://www.devpik.com/network-tools/ip-check" rel="noopener noreferrer"&gt;IP checker&lt;/a&gt; and decide whether you want an autonomous process acting from it. Most people should use a second profile.&lt;/p&gt;

&lt;p&gt;I wrote up the rest of BrowserSkill, including the architecture and how it differs from browser-use and Claude in Chrome, here: &lt;a href="https://www.devpik.com/open-source/browserskill" rel="noopener noreferrer"&gt;BrowserSkill: letting agents use your real browser&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <item>
      <title>A local ElevenLabs alternative with 30k stars, and the licence trap in its default engine</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Thu, 17 Sep 2026 07:49:48 +0000</pubDate>
      <link>https://dev.to/itxtayab/a-local-elevenlabs-alternative-with-30k-stars-and-the-licence-trap-in-its-default-engine-3jno</link>
      <guid>https://dev.to/itxtayab/a-local-elevenlabs-alternative-with-30k-stars-and-the-licence-trap-in-its-default-engine-3jno</guid>
      <description>&lt;p&gt;VoiceStudio does voice cloning, video dubbing, dictation, transcription and audiobook production, all on hardware you already own. No account, no API key, no usage meter. Tauri v2 shell, React interface, FastAPI backend, past &lt;strong&gt;30,000 stars&lt;/strong&gt; since April 2026.&lt;/p&gt;

&lt;p&gt;It is good. The part most coverage skips is the part that can actually bite you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two licences, and the permissive one is not the one that matters
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;application&lt;/strong&gt; is AGPL-3.0. Run it, modify it, use it internally, all fine. Offer a modified version as a network service and you owe your source under the same licence.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;default engine&lt;/strong&gt; is the one to watch. OmniVoice ships as Apache-2.0 &lt;strong&gt;code&lt;/strong&gt; with &lt;strong&gt;CC-BY-NC weights&lt;/strong&gt;. Non-commercial. So the out-of-the-box configuration, the one you get if you install it and start generating, produces audio from non-commercially-licensed weights.&lt;/p&gt;

&lt;p&gt;If you are making anything commercial, switch engines deliberately. Several are Apache-2.0 end to end:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;Languages&lt;/th&gt;
&lt;th&gt;Clones&lt;/th&gt;
&lt;th&gt;Licence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OmniVoice (default)&lt;/td&gt;
&lt;td&gt;600+&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Apache-2.0 code, &lt;strong&gt;CC-BY-NC weights&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CosyVoice 3&lt;/td&gt;
&lt;td&gt;9 + 18 dialects&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VoxCPM2&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MOSS-TTS-v1.5&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The project documents this. The write-ups are what gloss over it.&lt;/p&gt;

&lt;h2&gt;
  
  
  646 languages is a catalogue size, not a promise
&lt;/h2&gt;

&lt;p&gt;The headline number comes from the default engine covering 600 or more. The other fifteen engines are nowhere near it: CosyVoice 3 handles 9 plus 18 dialects, VoxCPM2 covers 30, dots.tts 24, Supertonic 31.&lt;/p&gt;

&lt;p&gt;So "646 languages" really means one engine has a very large catalogue. Pick the engine for your language and check that one specifically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloning is zero-shot, which saves you effort
&lt;/h2&gt;

&lt;p&gt;The reference clip is a &lt;strong&gt;prompt, not training data&lt;/strong&gt;. Nothing is fine-tuned on your voice. The model listens to a short sample and conditions on the timbre it hears, which is why it finishes in seconds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Three seconds of audio is enough to work&lt;/li&gt;
&lt;li&gt;Five to fifteen seconds sounds noticeably better&lt;/li&gt;
&lt;li&gt;A cleaner clip beats a longer one, every time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you were planning to record twenty minutes of reference audio, you do not need to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bit developers will care about
&lt;/h2&gt;

&lt;p&gt;The backend exposes an &lt;strong&gt;OpenAI-compatible audio API&lt;/strong&gt;. Migrating is one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- base_url="https://api.openai.com/v1"
&lt;/span&gt;&lt;span class="gi"&gt;+ base_url="http://localhost:3900/v1"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything written against OpenAI's speech endpoints keeps working, now against local compute at no per-request cost.&lt;/p&gt;

&lt;p&gt;One ask: it embeds AudioSeal watermarking by default. Leaving it on costs you nothing, so leave it on, and clone a voice only with the consent of the person it belongs to.&lt;/p&gt;




&lt;p&gt;Full write-up with all sixteen engines, the dubbing pipeline, hardware requirements and the hosted comparison: &lt;strong&gt;&lt;a href="https://www.devpik.com/open-source/voicestudio" rel="noopener noreferrer"&gt;VoiceStudio: local voice cloning and dubbing in 646 languages&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For audiobook work I run scripts through a &lt;a href="https://www.devpik.com/text-tools/word-counter" rel="noopener noreferrer"&gt;word counter&lt;/a&gt; to estimate runtime first, and an &lt;a href="https://www.devpik.com/ai-writing-tools/ai-proofreader" rel="noopener noreferrer"&gt;AI proofreader&lt;/a&gt; to catch typos that TTS will otherwise read aloud with total confidence.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Anthropic publishes Claude's system prompt. The captured version is 13 times longer.</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Thu, 17 Sep 2026 07:48:39 +0000</pubDate>
      <link>https://dev.to/itxtayab/anthropic-publishes-claudes-system-prompt-the-captured-version-is-13-times-longer-2bak</link>
      <guid>https://dev.to/itxtayab/anthropic-publishes-claudes-system-prompt-the-captured-version-is-13-times-longer-2bak</guid>
      <description>&lt;p&gt;Every AI product reads a block of instructions before it ever sees your message. Who it is, what it refuses, how it formats answers, what it must never say. You do not write it and you are not shown it.&lt;/p&gt;

&lt;p&gt;One repo has captured &lt;strong&gt;430 of them&lt;/strong&gt;, organised by vendor. The leak angle is the boring part. Here is what is actually useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 13x gap
&lt;/h2&gt;

&lt;p&gt;Anthropic &lt;strong&gt;publishes&lt;/strong&gt; its Claude system prompts. Openly, on purpose, in the release notes. The repo stores those too, so you can put the published version next to the captured one.&lt;/p&gt;

&lt;p&gt;They are not the same size:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official, published by Anthropic:&lt;/strong&gt; 4,269 words&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Captured from the running product:&lt;/strong&gt; 56,148 words&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Roughly &lt;strong&gt;13 times larger&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That gap is not a scandal. Published prompts legitimately exclude tool definitions, per-surface instructions and operational scaffolding. But if you were studying the published version to learn how a frontier team writes prompts, you were reading a summary and did not know it.&lt;/p&gt;

&lt;p&gt;Dropping both into a &lt;a href="https://www.devpik.com/text-tools/text-diff" rel="noopener noreferrer"&gt;text diff&lt;/a&gt; is the fastest way to see what the published version leaves out. That is the exercise I would actually recommend from this repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the prompts reveal
&lt;/h2&gt;

&lt;p&gt;Read enough and patterns show up that no marketing page would state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enormous effort goes into tone, not capability.&lt;/strong&gt; Large fractions of every prompt are spent on how to &lt;em&gt;sound&lt;/em&gt;. Do not open with flattery. Do not pad with caveats. Do not moralise. Vary sentence length. Providers clearly treat default LLM voice as a serious product problem and spend real prompt budget on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refusals are far more specific than public policy.&lt;/strong&gt; Published safety policies are broad and principled. The prompts contain concrete enumerated categories. If a model ever refused something oddly specific, this is where that lives.&lt;/p&gt;

&lt;p&gt;If you write system prompts for your own product, this is the closest thing to watching how the best-funded teams in the industry solve your exact problem. The formatting rules alone will improve your output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay sceptical
&lt;/h2&gt;

&lt;p&gt;The repo says prompts are captured verbatim. Treat that carefully.&lt;/p&gt;

&lt;p&gt;These are extracted by asking the model to repeat its instructions. It works because the prompt genuinely is in context and the model can read it back. But &lt;strong&gt;a model reproducing text from its context is not a guaranteed faithful copy.&lt;/strong&gt; It can paraphrase, skip, smooth a section, or in the worst case confabulate something plausible.&lt;/p&gt;

&lt;p&gt;Treat them as high quality evidence, not primary source documents. Patterns across many files are trustworthy. Any single exact sentence is less so.&lt;/p&gt;




&lt;p&gt;Longer version covering what a system prompt is from scratch, the full vendor breakdown, and whether any of this is legal: &lt;strong&gt;&lt;a href="https://www.devpik.com/open-source/system-prompts-leaks" rel="noopener noreferrer"&gt;What is a system prompt? 430 real ones, captured from every major AI&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>promptengineering</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why there are almost no open source WhatsApp CRMs</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Thu, 17 Sep 2026 07:47:06 +0000</pubDate>
      <link>https://dev.to/itxtayab/why-there-are-almost-no-open-source-whatsapp-crms-4kgd</link>
      <guid>https://dev.to/itxtayab/why-there-are-almost-no-open-source-whatsapp-crms-4kgd</guid>
      <description>&lt;p&gt;Search for a self-hosted WhatsApp CRM and you find almost nothing. Plenty of email CRMs, plenty of open source helpdesks, close to zero for the channel a huge share of the world actually sells on.&lt;/p&gt;

&lt;p&gt;That is not an accident, and the reason explains every design decision in DeskcommCRM, the most complete attempt I have seen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structural problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WhatsApp has no open protocol.&lt;/strong&gt; There are exactly two ways to send a message programmatically, and both are uncomfortable for an open source project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The official Meta Cloud API.&lt;/strong&gt; Legitimate, stable, what Meta wants you to use. It also requires business verification, charges per conversation, and restricts you to pre-approved templates outside a 24-hour service window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Unofficial libraries&lt;/strong&gt; driving a real WhatsApp Web session. No verification, no per-conversation fee, full freedom. Also against WhatsApp's terms, and the account can be banned.&lt;/p&gt;

&lt;p&gt;Now think like a maintainer. Option one means every user needs a verified Meta business account and a billing relationship before your software does anything, which kills casual adoption. Option two means shipping something that can get your users banned.&lt;/p&gt;

&lt;p&gt;Most projects look at that fork and go build an email CRM. That is why the category is empty.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes this one different
&lt;/h2&gt;

&lt;p&gt;MIT licensed, TypeScript on Next.js 16, self-hosted, database on your own infrastructure. Pitched as the open alternative to Kommo, Octadesk and Intercom.&lt;/p&gt;

&lt;p&gt;Plenty of CRMs bolted an AI panel on in the last two years. The distinction here is that &lt;strong&gt;the agent has hands&lt;/strong&gt;. It can operate the CRM, not just draft replies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-tenant RAG.&lt;/strong&gt; Each organisation gets its own knowledge base, embedded with pgvector in Postgres. The agent answers from your documents, your pricing, your policies, rather than a general model's guesses about your business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills it runs on its own.&lt;/strong&gt; Mid-conversation it can execute a defined action instead of asking a human to go do it. That is the line between a chatbot that suggests and an agent that acts, and it is the part to evaluate carefully before letting it near real customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are signing up to operate
&lt;/h2&gt;

&lt;p&gt;A Next.js app, Postgres with pgvector, a WhatsApp connection that must stay authenticated, and an LLM provider with per-token billing.&lt;/p&gt;

&lt;p&gt;The WhatsApp session is the piece that will page you. Sessions drop, and a dropped session means your sales channel is silently down. The costs not in the README are the tokens and your own time keeping that connection alive. Neither is huge, both are non-zero, and per-seat SaaS pricing starts looking reasonable after the second page.&lt;/p&gt;

&lt;p&gt;Worth it if you sell over WhatsApp at real volume and someone on the team can own a Postgres app. Not worth it if WhatsApp is a side channel.&lt;/p&gt;




&lt;p&gt;Full breakdown with the stack, install path, the real costs and the comparison against Chatwoot and Kommo: &lt;strong&gt;&lt;a href="https://www.devpik.com/open-source/deskcommcrm" rel="noopener noreferrer"&gt;DeskcommCRM: an open source WhatsApp CRM with AI agents built in&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Migrating contacts in? Exports almost always arrive as spreadsheets, so &lt;a href="https://www.devpik.com/json-tools/csv-to-json" rel="noopener noreferrer"&gt;CSV to JSON&lt;/a&gt; and &lt;a href="https://www.devpik.com/json-tools/json-to-csv" rel="noopener noreferrer"&gt;JSON to CSV&lt;/a&gt; cover most of the reshaping before import.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>typescript</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Running a 744B parameter model on a desktop, and why the trick is placement rather than compression</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Thu, 17 Sep 2026 07:46:02 +0000</pubDate>
      <link>https://dev.to/itxtayab/running-a-744b-parameter-model-on-a-desktop-and-why-the-trick-is-placement-rather-than-compression-445o</link>
      <guid>https://dev.to/itxtayab/running-a-744b-parameter-model-on-a-desktop-and-why-the-trick-is-placement-rather-than-compression-445o</guid>
      <description>&lt;p&gt;Most "run a big model at home" projects are really compression projects. Quantize harder, prune, distill, and eventually a smaller model wearing a big model's name fits in your VRAM.&lt;/p&gt;

&lt;p&gt;Colibri does something else, and the idea is worth understanding even if you never run it. It is an inference engine in &lt;strong&gt;pure C&lt;/strong&gt;. One file. No BLAS, no Python at runtime, no GPU required. It runs Mixture-of-Experts models from 744 billion to 2.8 trillion parameters on hardware you already own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't fit the model, place it
&lt;/h2&gt;

&lt;p&gt;A 744B MoE model does not use 744B parameters per token. It activates roughly &lt;strong&gt;40B&lt;/strong&gt;, about 5.4%, and of those only around &lt;strong&gt;11 GB&lt;/strong&gt; actually change from one token to the next.&lt;/p&gt;

&lt;p&gt;So the model never needed to &lt;em&gt;fit&lt;/em&gt; in fast memory. It needed to be placed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;dense part&lt;/strong&gt;, attention and shared experts and embeddings, about 17B parameters, stays resident in RAM at int4. Roughly 9.9 GB.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;19,456 routed experts&lt;/strong&gt;, about 19 MB each, live on disk at around 372 GB and get streamed on demand, with a per-layer LRU cache and a learned hot-store of pinned experts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project's own analogy is the one that makes it click: &lt;strong&gt;a JIT, but for weights.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A compiler JIT never compiles the whole program. It watches what actually runs and compiles hot paths just in time. Colibri makes the same bet about a 744B parameter space. Parameters are not resident state to be held, they are data to be staged, exactly when needed. The router runs a layer ahead so prefetch hides the latency, and routing heat decides which experts earn which tier.&lt;/p&gt;

&lt;p&gt;It works because expert routing has measurable structure, and structure is cacheable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers, which are the honest part
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;Decode speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6x RTX 5090, full residency&lt;/td&gt;
&lt;td&gt;5.8 to 6.8 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;128 GB CPU-only desktop&lt;/td&gt;
&lt;td&gt;~1.8 tok/s warm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single RTX 5070 Ti, laptop class&lt;/td&gt;
&lt;td&gt;1.07 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 GB dev box&lt;/td&gt;
&lt;td&gt;0.05 to 0.1 tok/s cold&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the real answer to "can I run a 744B model at home?" Yes, at roughly one to two tokens per second.&lt;/p&gt;

&lt;p&gt;Not a gotcha, just the trade. Interactive chat, unusable. Batch analysis, overnight jobs, or privacy-critical work where the alternative is shipping data to an API, entirely fine.&lt;/p&gt;

&lt;p&gt;The barrier most people hit is not the GPU, which is optional. It is &lt;strong&gt;372 GB of fast NVMe&lt;/strong&gt;, because expert streaming is read-bound.&lt;/p&gt;




&lt;p&gt;Full breakdown with the placement mechanics, the comparison against llama.cpp and Ollama, and the caveats worth knowing before you clear that much disk: &lt;strong&gt;&lt;a href="https://www.devpik.com/open-source/colibri" rel="noopener noreferrer"&gt;Colibri: self-host a 744B LLM on hardware you already own&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are cleaning up model output afterwards, a &lt;a href="https://www.devpik.com/text-tools/markdown-converter" rel="noopener noreferrer"&gt;Markdown converter&lt;/a&gt; saves hand-fixing every code fence.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>performance</category>
    </item>
    <item>
      <title>Cloudflare open sourced a security auditor, and its best idea has nothing to do with security</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Thu, 17 Sep 2026 07:41:45 +0000</pubDate>
      <link>https://dev.to/itxtayab/cloudflare-open-sourced-a-security-auditor-and-its-best-idea-has-nothing-to-do-with-security-55jp</link>
      <guid>https://dev.to/itxtayab/cloudflare-open-sourced-a-security-auditor-and-its-best-idea-has-nothing-to-do-with-security-55jp</guid>
      <description>&lt;p&gt;Cloudflare has open sourced the security audit skill that seeded its internal vulnerability discovery harness. MIT licensed, past 5,500 stars in about three months.&lt;/p&gt;

&lt;p&gt;It is not a scanner. It is a &lt;em&gt;skill&lt;/em&gt;, a folder of structured instructions a coding agent loads and follows. You point Claude Code, Codex or Cursor at a repo, ask for a security audit, and it runs a fleet of isolated sub-agents through six phases.&lt;/p&gt;

&lt;p&gt;The security part is good. The part worth stealing is one line in the design principles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent that checks is never the agent that found it
&lt;/h2&gt;

&lt;p&gt;Anyone who has asked a model to review its own output knows why this matters.&lt;/p&gt;

&lt;p&gt;A model that just spent 4,000 tokens arguing a piece of code is vulnerable is primed to keep agreeing with itself. Ask it to double check and it checks in a way that confirms. You do not get verification, you get a second draft of the same opinion, written with more confidence because now it has "checked".&lt;/p&gt;

&lt;p&gt;Most projects paper over this with a prompt that says "be critical". This one removes the option. The verifier is a &lt;strong&gt;separate agent, spawned fresh, with no memory of the hunt that produced the candidate.&lt;/strong&gt; It cannot be primed by reasoning it never saw.&lt;/p&gt;

&lt;p&gt;That is architecture instead of instruction, and it is the difference between hoping for rigour and enforcing it. If you build agent pipelines of any kind, copy this. Whenever one agent produces a judgement and another validates it, the validator should start cold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three verdicts, and the middle one earns its place
&lt;/h2&gt;

&lt;p&gt;Most scanners give you a finding or silence. This gives three states:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirmed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complete source trace, bounded observed result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;needs_validation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real lead, one exact unresolved fact, no severity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rejected&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disproved by a verifier, kept on the record&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;needs_validation&lt;/code&gt; is where an honest system puts work it could not finish. A tool that only emits confirmed or nothing has to make a silent call on every borderline case, and you never learn which ones it dropped. Here the unfinished work is visible and carries no severity, so it cannot inflate a report beyond what the evidence supports.&lt;/p&gt;

&lt;p&gt;Keeping &lt;code&gt;rejected&lt;/code&gt; matters too. Re-runs do not burn another fleet of agents rediscovering the same dead end.&lt;/p&gt;




&lt;p&gt;I wrote up the full thing, all six phases, the coverage ledger, the attack class library, and the OS-level sandbox requirement most people will skip: &lt;strong&gt;&lt;a href="https://www.devpik.com/open-source/security-audit-skill" rel="noopener noreferrer"&gt;Cloudflare's Security Audit Skill: an AI auditor built to disprove itself&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two things I keep open while reading agent output: a &lt;a href="https://www.devpik.com/developer-tools/jwt-decoder" rel="noopener noreferrer"&gt;JWT decoder&lt;/a&gt; for auth findings, and &lt;a href="https://www.devpik.com/json-tools/json-compare" rel="noopener noreferrer"&gt;JSON compare&lt;/a&gt; for diffing findings between runs, which is how you see what a second audit actually added.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built a Free Code Sharing Tool Because Pastebin Has Too Many Ads</title>
      <dc:creator>Muhammad Tayyab</dc:creator>
      <pubDate>Wed, 01 Apr 2026 17:03:28 +0000</pubDate>
      <link>https://dev.to/itxtayab/i-built-a-free-code-sharing-tool-because-pastebin-has-too-many-ads-ce</link>
      <guid>https://dev.to/itxtayab/i-built-a-free-code-sharing-tool-because-pastebin-has-too-many-ads-ce</guid>
      <description>&lt;p&gt;Every developer shares code snippets. Daily.&lt;/p&gt;

&lt;p&gt;During code reviews, pair programming, debugging sessions, Slack conversations, Stack Overflow questions — we're constantly copying and pasting code between places.&lt;/p&gt;

&lt;p&gt;And yet the tools we have for this are either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Gist&lt;/strong&gt; — great, but requires login. Too much friction for a 15-line snippet you'll forget about tomorrow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pastebin&lt;/strong&gt; — been around forever, but the ads have gotten unbearable. Also no real syntax highlighting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hastebin&lt;/strong&gt; — was perfect. Minimalist, fast. But it's been unreliable lately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pasting into Slack/Discord&lt;/strong&gt; — formatting gets destroyed. Anything over 10 lines becomes unreadable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built my own: &lt;strong&gt;&lt;a href="https://devpik.com/developer-tools/code-share" rel="noopener noreferrer"&gt;Code Share on DevPik&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Exactly what you'd expect, nothing more:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste your code&lt;/li&gt;
&lt;li&gt;Pick a language (20+ supported)&lt;/li&gt;
&lt;li&gt;Optionally add a title and expiry time&lt;/li&gt;
&lt;li&gt;Click "Share Code"&lt;/li&gt;
&lt;li&gt;Get a short URL — send it to anyone&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The person who opens the link sees your code with syntax highlighting, a copy button, and the language badge. No login wall. No ads. No cookie banners.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Expiry Feature
&lt;/h2&gt;

&lt;p&gt;This is the one thing I wanted that most paste tools don't offer well. Not every snippet needs to live forever.&lt;/p&gt;

&lt;p&gt;You can set expiry to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 hour&lt;/strong&gt; — for "hey look at this real quick" moments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;24 hours&lt;/strong&gt; — for code review discussions that'll be done by tomorrow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7 days&lt;/strong&gt; — for sprint-length collaboration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30 days&lt;/strong&gt; — for longer projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never&lt;/strong&gt; — for permanent reference snippets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expired links return a clean 404 instead of stale code floating around forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js (App Router) + TypeScript + Tailwind CSS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Supabase (PostgreSQL)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you click "Share Code", the frontend sends a POST request to a Next.js API route. The route generates a random 8-character alphanumeric short code, inserts the snippet into a &lt;code&gt;pastes&lt;/code&gt; table in Supabase, and returns the shareable URL.&lt;/p&gt;

&lt;p&gt;When someone opens a shared link (&lt;code&gt;devpik.com/p/abc12345&lt;/code&gt;), a server component fetches the paste by short code, checks if it's expired, increments the view count, and renders the code with syntax highlighting.&lt;/p&gt;

&lt;p&gt;The database schema is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;pastes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;gen_random_uuid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;short_code&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'Untitled'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;language&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'plaintext'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;view_count&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;expires_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Row Level Security is enabled — anyone can insert and read pastes, but nobody can update or delete them (except through the admin dashboard).&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Languages
&lt;/h2&gt;

&lt;p&gt;JavaScript, TypeScript, Python, HTML, CSS, JSON, SQL, Bash, Go, Rust, Java, C, C++, PHP, Ruby, Swift, Kotlin, YAML, XML, Markdown, and Plaintext.&lt;/p&gt;

&lt;p&gt;Syntax highlighting is handled client-side so the code never needs to be processed by any external service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Like to Add Next
&lt;/h2&gt;

&lt;p&gt;A few things I'm considering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password-protected snippets&lt;/strong&gt; — for sharing sensitive code privately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fork/edit&lt;/strong&gt; — click a button to create a new snippet based on an existing one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raw text endpoint&lt;/strong&gt; — &lt;code&gt;devpik.com/p/abc12345/raw&lt;/code&gt; for piping into &lt;code&gt;curl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI tool&lt;/strong&gt; — &lt;code&gt;cat file.js | dpk&lt;/code&gt; to create a paste from terminal&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://devpik.com/developer-tools/code-share" rel="noopener noreferrer"&gt;devpik.com/developer-tools/code-share&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No login. No ads. No tracking. Just paste code, get a link.&lt;/p&gt;

&lt;p&gt;If you share code snippets regularly, give it a try and let me know what's missing. I'm building this based on what developers actually need, so feedback goes directly into the next update.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Tayyab — I build free developer tools at &lt;a href="https://devpik.com" rel="noopener noreferrer"&gt;devpik.com&lt;/a&gt;. This is one of 24 tools on the site, all free, most running 100% in the browser. Follow me for more.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
