<?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: ahmet cetin</title>
    <description>The latest articles on DEV Community by ahmet cetin (@myzura).</description>
    <link>https://dev.to/myzura</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%2F4071325%2F7824fbe3-77ee-41b4-aeb8-70926fa14abc.jpg</url>
      <title>DEV Community: ahmet cetin</title>
      <link>https://dev.to/myzura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/myzura"/>
    <language>en</language>
    <item>
      <title>Sentinel Aleph: free crypto signals you can curl, give to your AI agent, or run as a paper bot</title>
      <dc:creator>ahmet cetin</dc:creator>
      <pubDate>Mon, 12 Oct 2026 12:23:48 +0000</pubDate>
      <link>https://dev.to/myzura/sentinel-aleph-free-crypto-signals-you-can-curl-give-to-your-ai-agent-or-run-as-a-paper-bot-30kn</link>
      <guid>https://dev.to/myzura/sentinel-aleph-free-crypto-signals-you-can-curl-give-to-your-ai-agent-or-run-as-a-paper-bot-30kn</guid>
      <description>&lt;p&gt;I'm Ahmet. For the past two to three years I've been building a crypto market scanner for myself in Switzerland, because I was tired of signal groups that only ever post screenshots of their wins.&lt;/p&gt;

&lt;p&gt;It's now in open beta as &lt;strong&gt;Sentinel Aleph&lt;/strong&gt;, and it's free. This post is about what you, as a developer, can do with it in the next five minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In one sentence:&lt;/strong&gt; Sentinel Aleph scans 570+ Binance spot and futures markets on the 4-hour chart, publishes trade signals with entry, stop and targets, and records every outcome (wins, losses, break-evens and the setups it rejected) on a public ledger, net of fees.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Pull the open signals with one curl
&lt;/h2&gt;

&lt;p&gt;No account, no key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://ribqa.com/api/public/signals/pending?limit=3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each signal comes back with its market, direction, entry, stop, take-profit levels and the engines that agreed on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POLUSDT   spot     long  entry 0.10635  stop 0.10156  tp1 0.11040
KGENUSDT  futures  long  entry 0.1478   stop 0.13654  tp1 0.15590
SOONUSDT  futures  long  entry 0.31     stop 0.28870  tp1 0.31903
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are about 40 public routes in total: the monthly ledger, vetoed signals, a scheduled BTC chart read, news. The &lt;a href="https://ribqa.com/api-center" rel="noopener noreferrer"&gt;API Center&lt;/a&gt; lists every route with its access level and a copyable curl.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Give it to your AI agent (MCP)
&lt;/h2&gt;

&lt;p&gt;Sentinel Aleph runs an MCP server, so Claude, Cursor or any MCP client can query it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http sentinel-aleph https://ribqa.com/api/v1/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives your agent 16 tools. Seven of them answer without a key: open signals, the ledger's track record, vetoed signals, market snapshots, tickers, the BTC chart read and news. The other nine work on your own account with a free API key (add it as an &lt;code&gt;Authorization: Bearer&lt;/code&gt; header): save and edit strategies, run backtests, list your bots. Then you can ask things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which futures signals are open right now, and how did last month's signals do after fees?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;It can't trade: the MCP server places no orders of any kind.&lt;/strong&gt; Setup, tool list and JSON config are on the &lt;a href="https://ribqa.com/mcp" rel="noopener noreferrer"&gt;MCP page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Run the signals as a bot, on paper
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ribqa.com/edge" rel="noopener noreferrer"&gt;Aleph Edge&lt;/a&gt; is the desktop app that trades on these signals. It's built in Rust with Tauri 2 and &lt;a href="https://github.com/sentinelaleph/AlephEdge" rel="noopener noreferrer"&gt;the source is on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal bots&lt;/strong&gt; follow the Sentinel signal stream; &lt;strong&gt;DCA and Grid bots&lt;/strong&gt; run on their own rules, from 12 templates (each tested on two years of market data, results shown next to it) or your own settings.&lt;/li&gt;
&lt;li&gt;Every bot runs inside risk limits you set, and every signal a bot skips is listed with the reason.&lt;/li&gt;
&lt;li&gt;In the public build every position is &lt;strong&gt;simulated against live exchange prices, fees included&lt;/strong&gt;. An exchange API key is optional; it stays in an encrypted vault on your machine and is never sent to us.&lt;/li&gt;
&lt;li&gt;Windows 10/11 for now, a 12 MB installer. macOS is planned.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Why you can check the numbers
&lt;/h2&gt;

&lt;p&gt;Most signal services show you a win rate. We show the whole book: every published signal and how it ended, settled against real Binance candles, after fees, with the sample size next to every figure. Ratios only count signals at least 96 hours old, because losers take longer to settle than winners and early numbers look better than they are.&lt;/p&gt;

&lt;p&gt;That honesty cuts both ways. Here is the ledger by month, without the BTC-veto closes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;month&lt;/th&gt;
&lt;th&gt;trades&lt;/th&gt;
&lt;th&gt;net after fees&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;August 2026&lt;/td&gt;
&lt;td&gt;498&lt;/td&gt;
&lt;td&gt;+62.23 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;September 2026&lt;/td&gt;
&lt;td&gt;460&lt;/td&gt;
&lt;td&gt;+12.39 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 2026 (running)&lt;/td&gt;
&lt;td&gt;275&lt;/td&gt;
&lt;td&gt;+261.01 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Points are sums of per-trade percentages, not an account return. Counting the positions the BTC veto closed early, August and September turn negative. So the site says it plainly: &lt;strong&gt;no edge after costs is established yet.&lt;/strong&gt; You can &lt;a href="https://ribqa.com/reports" rel="noopener noreferrer"&gt;see every month in full&lt;/a&gt; and judge for yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Go and PostgreSQL. &lt;strong&gt;Frontend:&lt;/strong&gt; Next.js.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signals:&lt;/strong&gt; 23 analysis engines vote on each setup, and 9 risk gates can refuse it. One of the gates is a BTC regime veto that stands aside when Bitcoin turns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market data:&lt;/strong&gt; all exchange data goes through one internal data hub, so nothing in the browser talks to an exchange.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Advisor:&lt;/strong&gt; answers from the ledger and live market data, and says when it doesn't know.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No real-money trading in the public build.&lt;/li&gt;
&lt;li&gt;No guarantees. These are signals with a public track record, not advice.&lt;/li&gt;
&lt;li&gt;No outbound webhooks yet. Tell me if you want them; that is the kind of feedback I'm after.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Open signals and the ledger, no sign-up: &lt;a href="https://ribqa.com/signals" rel="noopener noreferrer"&gt;ribqa.com/signals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP setup: &lt;a href="https://ribqa.com/mcp" rel="noopener noreferrer"&gt;ribqa.com/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Desktop bot: &lt;a href="https://ribqa.com/edge" rel="noopener noreferrer"&gt;ribqa.com/edge&lt;/a&gt; · &lt;a href="https://github.com/sentinelaleph/AlephEdge" rel="noopener noreferrer"&gt;source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP server source (MIT): &lt;a href="https://github.com/sentinelaleph/sentinel-aleph-mcp" rel="noopener noreferrer"&gt;sentinel-aleph-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is free during the beta. I'd really like to hear from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What would you build on top of this data?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which MCP tool is missing?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Would outbound webhooks matter to you?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Market research, not financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>ai</category>
      <category>crypto</category>
    </item>
    <item>
      <title>How many npm packages actually run code when you `npm install`? I measured a sample.</title>
      <dc:creator>ahmet cetin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 12:49:37 +0000</pubDate>
      <link>https://dev.to/myzura/how-many-npm-packages-actually-run-code-when-you-npm-install-i-measured-a-sample-45e4</link>
      <guid>https://dev.to/myzura/how-many-npm-packages-actually-run-code-when-you-npm-install-i-measured-a-sample-45e4</guid>
      <description>&lt;p&gt;The npm supply-chain conversation tends to happen without a denominator. "Install scripts are dangerous" — fine, but how many packages even have one? I kept not finding the number, so I went and measured it.&lt;/p&gt;

&lt;p&gt;The number&lt;br&gt;
I took 658 packages from one corner of npm (the MCP-server ecosystem — that's what I happened to be auditing) and counted how many declare an install-lifecycle script: the preinstall / install / postinstall hooks that run code the moment you npm install.&lt;/p&gt;

&lt;p&gt;Twenty do. That's 3.0% of the sample.&lt;/p&gt;

&lt;p&gt;Two honest caveats before anyone runs with that figure:&lt;/p&gt;

&lt;p&gt;It's 3% of this sample, not "3% of npm." 658 packages is the union of a handful of registry search queries — a search result, not a census frame. Run it on a different slice and you'll get a different number.&lt;br&gt;
It counts the top-level package's own declared hooks. npm runs install scripts for every package in the resolved dependency tree, so a package with a clean manifest can still execute code at install through a dependency three levels down. This measures the surface a package is responsible for itself.&lt;br&gt;
With those stated: the number is calmer than the panic implies, and it costs nothing to reproduce for any package:&lt;/p&gt;

&lt;p&gt;curl -s &lt;a href="https://registry.npmjs.org/" rel="noopener noreferrer"&gt;https://registry.npmjs.org/&lt;/a&gt;/latest | jq '.scripts'&lt;br&gt;
The part where the manifest lied to me&lt;br&gt;
Reading the manifest tells you a script exists. It does not tell you what the script does — and on four of the twenty, that gap bit me.&lt;/p&gt;

&lt;p&gt;Four declared preinstall: npx only-allow pnpm. I filed those as a benign package-manager guard: only-allow just prints an error if you used the wrong package manager. In intent, that's exactly what it is.&lt;/p&gt;

&lt;p&gt;But npx fetches only-allow from the registry if it isn't already cached. So a "guard" whose whole job is to print a message makes a network call on your machine at install time. Nothing sinister — it's a completely standard idiom — but it is not what "benign guard" implied to me, and I could not have learned it by reading the text.&lt;/p&gt;

&lt;p&gt;That's the general lesson, and the only reason this is worth writing up:&lt;/p&gt;

&lt;p&gt;A manifest tells you what a script is. Only running it tells you what it needs.&lt;/p&gt;

&lt;p&gt;So I made the "running it" part reusable&lt;br&gt;
Reading manifests is cheap and misleading; running the scripts is where the truth is. So I wrapped that in something you can point at any package.&lt;/p&gt;

&lt;p&gt;It fetches the exact tarball npm install would, extracts it inside a container with no network, all Linux capabilities dropped, and a read-only filesystem, runs the declared install scripts, and returns a verdict — plus the sha256 of the exact bytes it read, the exit code, and the sandbox's own output.&lt;/p&gt;

&lt;p&gt;npx -y @kenwea/mcp check debug&lt;br&gt;
Resolved debug → &lt;a href="mailto:debug@4.4.3"&gt;debug@4.4.3&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" rel="noopener noreferrer"&gt;https://registry.npmjs.org/debug/-/debug-4.4.3.tgz&lt;/a&gt;&lt;br&gt;
  verdict     MANUAL_REVIEW&lt;br&gt;
  why         this package declares no preinstall, install or postinstall script, so&lt;br&gt;
              nothing of its own runs when it is installed. That is worth knowing and&lt;br&gt;
              it is not a pass: we executed nothing, and an unrun artifact is not a&lt;br&gt;
              passing one&lt;br&gt;
  sha256      89c1ac9c946ee8905a875837114528e97eeae35e03be3190584b2216af43e4a7&lt;br&gt;
  size        13449 bytes&lt;br&gt;
  executed    no&lt;br&gt;
  signed      ed25519, key 00f55dd04da212b3&lt;br&gt;
Note the verdict logic, because it's the part I care most about getting right: "nothing ran" is information, not a pass. A package with no install script isn't "safe," it just moved the interesting behavior to import-time. Reporting that as approved would be the convenient lie.&lt;/p&gt;

&lt;p&gt;Why it's signed&lt;br&gt;
The output is signed under a published Ed25519 key and bound to the sha256 of the bytes. That matters for one reason: "I ran it and it's fine" from the party that wrote the code is circular — you cannot vouch for your own artifact, and every reviewer knows it. A signature from something that isn't the author is a third-party record you can forward, and one that outlives the version: when a registry pulls a compromised release (as npm did with the recent chalk / debug tombstones), the bytes are gone and the incident becomes unauditable. A signature minted while the version was live is the thing that survives.&lt;/p&gt;

&lt;p&gt;You can verify any signature yourself — the payload names the artifact, the hash, the verdict, and the constraints it ran under. (Verification is client-side on purpose: a page where we confirmed our own signature would prove nothing.)&lt;/p&gt;

&lt;p&gt;In CI&lt;br&gt;
Default is report-only — a verdict is a successful result even when it's rejected. To make a pipeline block, ask for it:&lt;/p&gt;

&lt;p&gt;npx -y @kenwea/mcp check &lt;a href="mailto:express@4.18.2"&gt;express@4.18.2&lt;/a&gt; --fail-on rejected&lt;br&gt;
Or as a GitHub Action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uses: kenwea-protocol/kenwea-notary-action@v1
with:
package: ${{ matrix.package }}
fail-on: rejected
--fail-on rejected blocks only on rejected; --fail-on manual_review also blocks on manual_review. An honest non-answer — a package it couldn't fetch — never fails the gate. Turning "we couldn't read it" into a red build is the one thing this refuses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honest limits&lt;br&gt;
So you find out here rather than by being surprised:&lt;/p&gt;

&lt;p&gt;Dependencies are not installed. This measures a package's own declared install surface, not its full transitive closure. That's a deliberate scope, not an oversight — but it's a real limit.&lt;br&gt;
Node and Python only, and 20 checks/hour on the free anonymous key (minted on first use to rate-limit — no signup, no email).&lt;br&gt;
A clean install script says nothing about import-time. Which is the honest edge of the whole thing…&lt;br&gt;
The question I can't answer&lt;br&gt;
Install-time is the surface everyone worries about, and it turns out to be nearly empty — 3% in my sample, and half of those are package-manager guards. Meanwhile the surface that's actually large — what a module does the first time you require() it — I can't find anyone measuring, and I don't have a design for it either.&lt;/p&gt;

&lt;p&gt;For a module whose whole job is to sit there until a function call arrives, what would "run it and see" even mean? Import it and watch — for how long, against what expectation of normal? That's the part I'd genuinely take feedback on.&lt;/p&gt;

&lt;p&gt;Disclosure: I built this. The check (@kenwea/mcp) is one piece of kenwea.com, which is early and quiet — the check runs standalone with no account, which is why I'm writing about it rather than the site.&lt;/p&gt;

</description>
      <category>security</category>
      <category>node</category>
      <category>devops</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
