<?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: Jirawat Boonkumnerd</title>
    <description>The latest articles on DEV Community by Jirawat Boonkumnerd (@ntsd).</description>
    <link>https://dev.to/ntsd</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%2F363628%2F0701b6fb-0547-4073-bc9f-ae29ffe84c5a.jpeg</url>
      <title>DEV Community: Jirawat Boonkumnerd</title>
      <link>https://dev.to/ntsd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ntsd"/>
    <language>en</language>
    <item>
      <title>Zero Market Radar: A Stock-News Dashboard and Voice Alerts for a Friend</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:33:30 +0000</pubDate>
      <link>https://dev.to/ntsd/building-a-sub-second-stock-news-alert-bot-for-a-friend-with-typesafe-ai-elevenlabs-and-render-21hk</link>
      <guid>https://dev.to/ntsd/building-a-sub-second-stock-news-alert-bot-for-a-friend-with-typesafe-ai-elevenlabs-and-render-21hk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;My friend Alex follows a small stock watchlist, but financial news makes even a small watchlist feel like a full-time job. Earnings announcements sit beside speculative listicles. Yesterday's recap looks as urgent as today's material business update. More articles do not necessarily mean more useful information.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Zero Market Radar&lt;/strong&gt; to answer a narrower question: &lt;strong&gt;what happened to the companies Alex follows, and which headlines deserve his attention?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It combines a browsable news dashboard with optional Telegram notifications and short spoken alerts. TypeSafe AI's Jev evaluates an article's directional sentiment and materiality; ordinary TypeScript decides how to store, rank, display, and deliver that result. It is a news-triage tool, not an automated trading system or a promise of investment returns.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://zeromarketradar.com" rel="noopener noreferrer"&gt;zeromarketradar.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;MIT-licensed source:&lt;/strong&gt; &lt;a href="https://github.com/ntsd/zero-market-radar" rel="noopener noreferrer"&gt;ntsd/zero-market-radar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The current default watchlist is &lt;strong&gt;AAPL, MSFT, NVDA, GOOGL, AMZN, META, TSLA, AMD, TSM, and BABA&lt;/strong&gt;. I reduced the original broader list to keep the product focused and removed the China/HK preset; BABA remains an individually selectable ticker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A dashboard for browsing, not another notification feed
&lt;/h3&gt;

&lt;p&gt;Open the &lt;a href="https://zeromarketradar.com" rel="noopener noreferrer"&gt;public dashboard&lt;/a&gt; and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select individual tickers or the &lt;strong&gt;Mega Tech&lt;/strong&gt; and &lt;strong&gt;Semis&lt;/strong&gt; presets. Choices persist in the browser.&lt;/li&gt;
&lt;li&gt;Browse the top four impact-ranked headlines for your selected companies.&lt;/li&gt;
&lt;li&gt;Switch between &lt;strong&gt;24H&lt;/strong&gt;, &lt;strong&gt;3D&lt;/strong&gt;, &lt;strong&gt;7D&lt;/strong&gt;, or a custom date range within the recent seven-day window.&lt;/li&gt;
&lt;li&gt;Filter the feed by breaking signals, notable catalysts, bullish sentiment, or bearish sentiment; sort by impact, date, or confidence.&lt;/li&gt;
&lt;li&gt;Click a ticker badge to open its dedicated quote, price chart, and paginated news view.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The symbol chart offers &lt;strong&gt;24-hour and seven-day views&lt;/strong&gt; using real Yahoo price candles. Breaking and catalyst articles appear as chart dots; selecting a dot jumps to the corresponding article. The dots show news timing alongside prices—not proof that an article caused a price movement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Voice where it is useful
&lt;/h3&gt;

&lt;p&gt;For Alex's commute, &lt;strong&gt;breaking-critical articles&lt;/strong&gt; can become ElevenLabs voice dispatches, delivered through Telegram or played from the dashboard. Notable catalysts use text notifications rather than voice. Routine commentary stays available to browse without automatically becoming a spoken alert.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fridl9b24m1vujwuxq9t1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fridl9b24m1vujwuxq9t1.png" alt="Telegram text and voice alert example" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Telegram is optional. Finnhub and TypeSafe API keys are the two required keys for dashboard-only operation; MongoDB, ElevenLabs, Telegram, and Sentry add persistence, speech, notifications, and tracing. The repository includes an &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/API_KEYS.md" rel="noopener noreferrer"&gt;API key setup guide&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Two typed AI judgments, one request
&lt;/h3&gt;

&lt;p&gt;I did not need a model to write an investment essay. I needed two structured judgments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment:&lt;/strong&gt; bullish or bearish, with confidence and choice probabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority:&lt;/strong&gt; breaking-critical, notable catalyst, or routine noise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/src/services/jev.ts" rel="noopener noreferrer"&gt;Jev service&lt;/a&gt; sends the ticker, headline, summary, source, and publication time through a single &lt;code&gt;systemOne&lt;/code&gt; request containing both choice questions. It validates the returned answer types before persisting a prediction.&lt;/p&gt;

&lt;p&gt;Impact ranking uses this explicit weighting of the priority probabilities:&lt;/p&gt;

&lt;p&gt;$$&lt;br&gt;
\text{urgencyScore} = P(\text{breaking critical}) + 0.5\,P(\text{notable catalyst})&lt;br&gt;
$$&lt;/p&gt;

&lt;p&gt;This is a ranking heuristic, not a calibrated probability of a future price move. The service retains the source headline and link so Alex can read the underlying report instead of relying on a generated explanation.&lt;/p&gt;

&lt;p&gt;Jev is a hosted System 1 decision-model API. Fast inference is useful, but &lt;strong&gt;I am not claiming sub-second end-to-end alerts&lt;/strong&gt;: provider publication delays, round-robin polling, retries, and optional speech generation all contribute to delivery time.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Persistence without fake historical predictions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; stores article evaluations, per-symbol sync ranges, quotes, price candles, and generated audio. Verified predictions carry &lt;code&gt;evaluatedBy: 'jev'&lt;/code&gt;; a redeploy warms the in-memory deduplicator from those verified records for the active watchlist.&lt;/p&gt;

&lt;p&gt;The news history setting defaults to &lt;strong&gt;seven days&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HISTORY_SYNC_DAYS=1..7&lt;/code&gt; bounds historical fetching and downtime catch-up.&lt;/li&gt;
&lt;li&gt;On a symbol's first turn after startup, stored unverified articles inside that window are evaluated through the same Jev path, silently.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HISTORY_SYNC_DAYS=0&lt;/code&gt; skips historical reevaluation and fetches today's live news only.&lt;/li&gt;
&lt;li&gt;Failed evaluation or storage does not advance the successful sync checkpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Older archive records are preserved, not silently relabeled as genuine model decisions. Historical processing is notification-silent; articles older than 24 hours also avoid Telegram pushes.&lt;/p&gt;

&lt;p&gt;This reduces repeated work, but it is &lt;strong&gt;not an exactly-once notification guarantee&lt;/strong&gt;. Coordinating multiple workers and atomically recording delivery are separate problems.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Cache per ticker; filter in the browser
&lt;/h3&gt;

&lt;p&gt;The most useful dashboard optimization was changing what the browser asks for.&lt;/p&gt;

&lt;p&gt;Instead of a Mongo query for every date change or pagination click, &lt;code&gt;/api/home-news?symbol=AAPL&lt;/code&gt; returns a complete bounded news snapshot for one watched symbol, without cached audio data. The server shares snapshots for &lt;strong&gt;30 seconds&lt;/strong&gt;, coalesces concurrent loads, and serves previous results during refresh. Failed refreshes preserve successful cached data and retry after five seconds.&lt;/p&gt;

&lt;p&gt;The browser shares each ticker's snapshot between the spotlight and feed. &lt;strong&gt;Date, signal, sort, and page controls operate locally.&lt;/strong&gt; Periodic refreshes revalidate the snapshots; a newly selected ticker or new UTC day loads the appropriate data.&lt;/p&gt;

&lt;p&gt;An isolated browser check confirmed that switching &lt;strong&gt;24H → 7D → next page generated zero API requests&lt;/strong&gt;. That verifies the filtering behavior, not production network latency.&lt;/p&gt;

&lt;p&gt;Equity summaries are aggregated inside MongoDB rather than transferring the historical article collection to Node.js. Audio is fetched separately for playback, and quote reads are scoped to the relevant symbols.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Speech is a delivery feature, not a second analyst
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/src/services/elevenlabs.ts" rel="noopener noreferrer"&gt;ElevenLabs integration&lt;/a&gt; uses &lt;code&gt;eleven_turbo_v2_5&lt;/code&gt; to read a deterministic script containing the ticker, original headline, directional label, and confidence. It does not invent extra market commentary.&lt;/p&gt;

&lt;p&gt;Generated audio is cached in MongoDB. Replay reuses the cached clip, and the audio endpoint enforces breaking-critical eligibility even if an older non-breaking article happens to have cached audio.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Deployment details that mattered
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Render&lt;/strong&gt; hosts the Node.js service and dashboard behind the custom domain. The &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/render.yaml" rel="noopener noreferrer"&gt;Blueprint&lt;/a&gt; defines the build, start command, environment, and &lt;code&gt;/health&lt;/code&gt; check.&lt;/p&gt;

&lt;p&gt;Operational safeguards include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;shared Finnhub request limiter&lt;/strong&gt;: at most 50 request starts per minute, at least 1.2 seconds apart, with a cooldown after HTTP 429. Quote and news calls use the same limiter.&lt;/li&gt;
&lt;li&gt;A sequential scheduler that waits two seconds &lt;strong&gt;after a symbol's work finishes&lt;/strong&gt;, rather than overlapping slow backfills.&lt;/li&gt;
&lt;li&gt;A 10,000-entry, 48-hour TTL deduplication cache.&lt;/li&gt;
&lt;li&gt;Fail-fast startup when a configured Mongo connection cannot initialize, rather than silently serving an empty in-memory dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry custom spans and exception capture&lt;/strong&gt; around inference, provider calls, storage, and audio. This implementation does not claim automatic token or cost reporting.&lt;/li&gt;
&lt;li&gt;Graceful shutdown when Render sends &lt;code&gt;SIGTERM&lt;/code&gt; during instance replacement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A free Render web service can sleep after 15 minutes without inbound traffic. Outbound polling does not prevent that, so continuous unattended alerts need an always-on deployment. In-memory response caches also reset when the process restarts; Mongo history does not.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Learned—and What Still Needs Work
&lt;/h2&gt;

&lt;p&gt;The latest local build passes &lt;strong&gt;95 tests&lt;/strong&gt;, including retry/checkpoint behavior, historical notification suppression, cached audio eligibility, pagination, UTC date boundaries, and browser-side cache filtering.&lt;/p&gt;

&lt;p&gt;Two data-model limitations are worth being explicit about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A successful sync range does not prove Finnhub returned every article in that range. Broad provider requests can miss items; per-day historical reconciliation is a future improvement.&lt;/li&gt;
&lt;li&gt;Predictions currently use a global article ID and one stored symbol. A story appearing under multiple tickers needs better association handling; counts should not be presented as exhaustive company-news coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson was to make a small, honest tool for Alex—not to describe a weekend prototype as an institutional trading terminal. The most valuable improvements were quieter alerts, readable source links, reliable state, and controls that do not keep hitting the database.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;The application code is &lt;strong&gt;MIT-licensed&lt;/strong&gt;, with TypeScript, native Node.js HTTP, reproducible configuration, and visible decision rules. Alex can inspect the filters, change the watchlist, self-host the service, or modify the delivery channels instead of depending on an opaque news app.&lt;/p&gt;

&lt;p&gt;There is an important boundary: &lt;strong&gt;this implementation calls hosted Jev, Finnhub, Yahoo, and ElevenLabs services; it does not run an open-weight AI model locally or work fully offline.&lt;/strong&gt; Open application code is not the same as open model weights. That distinction matters when evaluating the challenge's open-source-AI requirement, and I do not want to imply a model integration the project does not have.&lt;/p&gt;
&lt;h2&gt;
  
  
  Community Wisdom
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🌐 &lt;a href="https://dev.to/137foundry/idempotency-in-data-pipelines-how-to-prevent-duplicate-records-1ek2"&gt;Idempotency in Data Pipelines: How to Prevent Duplicate Records&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://dev.to/137foundry"&gt;137Foundry&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;programming&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;productivity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Stable record identities, upserts, and explicit checkpoints make overlapping retries safer. That supports the storage design here, without turning it into an exactly-once delivery claim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/137foundry/idempotency-in-data-pipelines-how-to-prevent-duplicate-records-1ek2"&gt;Read Full Discussion&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;The original scaffolding session is embedded below. It records the early build; the implementation has since evolved, including the reduced watchlist and caching changes described above.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Gemini CLI"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building stock-news-alert with TypeSafe AI Jev, Finnhub, and Render&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Build a production-ready Node.js backend service called "stock-news-alert" in TypeScript. It polls Finnhub company-news, deduplicates articles, classifies sentiment via TypeSafe AI Jev (System 1 Decision Model) into binary 0/1 with confidence, and sends Telegram alerts. Deploy to Render for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I will critique the setup as a Principal Engineer, address rate-limit distribution across N symbols without drift, implement a dual-eviction LRU cache to prevent memory leaks, solve the cold-start alert storm, and build a turnkey Render Blueprint deployment with native health checks.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The solution uses a drift-compensated self-scheduling tick at 1200ms (~50 req/min), an LRU cache with 48h TTL, strict HTML escaping for Telegram, TypeSafe Jev Choice primitive inference, and a render.yaml blueprint with /health monitoring. All 5 unit tests pass and live API calls succeeded.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        3 of 3 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Partner Integrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Render:&lt;/strong&gt; deployed Node.js backend, web dashboard, custom domain, Blueprint, and health endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs:&lt;/strong&gt; breaking-news narration, optional Telegram voice delivery, and cached browser playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas:&lt;/strong&gt; durable evaluations, sync coverage, quotes, candles, and audio storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry:&lt;/strong&gt; custom performance spans and exception capture; a trace screenshot would strengthen evidence for the Agent Tracing category.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;AI assistance disclosure: AI tools helped develop the project and revise this write-up. The implementation and limitations above are grounded in the current source and local checks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>render</category>
    </item>
    <item>
      <title>Auto Request Changes review when the job failed using Github Action</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Sun, 21 Nov 2021 17:19:00 +0000</pubDate>
      <link>https://dev.to/ntsd/auto-request-changes-review-when-the-job-failed-using-github-action-41cc</link>
      <guid>https://dev.to/ntsd/auto-request-changes-review-when-the-job-failed-using-github-action-41cc</guid>
      <description>&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;The Github Action is forked from &lt;a href="https://github.com/hmarr/auto-approve-action" rel="noopener noreferrer"&gt;hmarr/auto-approve-action&lt;/a&gt;. The action will automatically create a &lt;code&gt;Request Changes&lt;/code&gt; pull request review. A use case is to create a request changes review when a workflow job failed.&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%2Fthy53zlz4uvhuqljg3k2.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%2Fthy53zlz4uvhuqljg3k2.png" alt="auto-request-changes-action" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The action support 3 input parameters. You can use with &lt;a href="https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idstepswith" rel="noopener noreferrer"&gt;jobs..steps[*].with&lt;/a&gt; to add the input parameters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;github-token&lt;/code&gt;: The Github token. By default, it will using &lt;code&gt;${{ github.token }}&lt;/code&gt; to use the repo token.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;comment-body&lt;/code&gt;: The comment body to create a request changes review. The &lt;code&gt;comment-body&lt;/code&gt; also support markdown text by Github. The default is &lt;code&gt;Some actions are not successful, please fix it&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;pull-request-number&lt;/code&gt;: (optional) The ID of a pull request to auto-request-changes. By default, this action tries to use the pull_request event payload.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example use
&lt;/h3&gt;

&lt;p&gt;you can use with &lt;code&gt;if&lt;/code&gt; to avoid no pull request event and run only when the job failed. &lt;/p&gt;

&lt;p&gt;*for more &lt;a href="https://docs.github.com/en/actions/learn-github-actions/contexts" rel="noopener noreferrer"&gt;Github Action Context&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Auto request changes
on: pull_request_target

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: ntsd/auto-request-changes-action@v2
        if: ${{ github.event.pull_request &amp;amp;&amp;amp; failure() }}
        with:
          comment-body: "The job ran failed please fix it."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also use it with &lt;code&gt;auto-approve-action&lt;/code&gt; to make it auto approve when the job success.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Auto request changes
on: pull_request_target

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: ntsd/auto-request-changes-action@v2
        if: ${{ github.event.pull_request &amp;amp;&amp;amp; failure() }}
        with:
          comment-body: "The job ran failed please fix it."
      - uses: hmarr/auto-approve-action@v2
        if: ${{ github.event.pull_request &amp;amp;&amp;amp; success() }}
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Maintainer Must-Haves&lt;/p&gt;
&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ntsd" rel="noopener noreferrer"&gt;
        ntsd
      &lt;/a&gt; / &lt;a href="https://github.com/ntsd/auto-request-changes-action" rel="noopener noreferrer"&gt;
        auto-request-changes-action
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      👍 GitHub Action for automatically request changes GitHub pull requests
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Auto Request Changes GitHub Action&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This action is a fork from &lt;a href="https://github.com/hmarr/auto-approve-action" rel="noopener noreferrer"&gt;hmarr/auto-approve-action&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;ntsd/auto-request-changes-action&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Automatically request changes GitHub pull requests. The &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; secret will default provided as the &lt;code&gt;github-token&lt;/code&gt; input for the action to work. otherwise you can add a token to &lt;code&gt;github-token&lt;/code&gt; input.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Because sometimes you want to automate create request changes review. for example, create a request changes review when a lint or testing workflow is failed.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage instructions&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Create a workflow file (e.g. &lt;code&gt;.github/workflows/auto-request-changes.yml&lt;/code&gt;) that contains a step that &lt;code&gt;uses: ntsd/auto-request-changes-action@v3&lt;/code&gt;. Here's an example workflow file:&lt;/p&gt;

&lt;p&gt;for all github action contexts check &lt;a href="https://docs.github.com/en/actions/learn-github-actions/contexts" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions/learn-github-actions/contexts&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Auto request changes&lt;/span&gt;
&lt;span class="pl-ent"&gt;on&lt;/span&gt;: &lt;span class="pl-s"&gt;pull_request_target&lt;/span&gt;

&lt;span class="pl-ent"&gt;jobs&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;build&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;runs-on&lt;/span&gt;: &lt;span class="pl-s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="pl-ent"&gt;permissions&lt;/span&gt;:
      &lt;span class="pl-ent"&gt;pull-requests&lt;/span&gt;: &lt;span class="pl-s"&gt;write&lt;/span&gt;
    &lt;span class="pl-ent"&gt;steps&lt;/span&gt;:
      - &lt;span class="pl-ent"&gt;uses&lt;/span&gt;: &lt;span class="pl-s"&gt;ntsd/auto-request-changes-action@v3&lt;/span&gt;
        &lt;span class="pl-ent"&gt;with&lt;/span&gt;:
          &lt;span class="pl-ent"&gt;github-token&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;${{ secrets.GITHUB_TOKEN }}&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
          &lt;span class="pl-ent"&gt;review-message&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;custom review message body&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Combine with an &lt;code&gt;if&lt;/code&gt; can only auto-request-changes with…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ntsd/auto-request-changes-action" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ntsd/auto-request-changes-action" rel="noopener noreferrer"&gt;Auto Request Changes Action Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marketplace/actions/auto-request-changes" rel="noopener noreferrer"&gt;Auto Request Changes Action Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hmarr/auto-approve-action" rel="noopener noreferrer"&gt;Auto Approve Action Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/actions/learn-github-actions/contexts" rel="noopener noreferrer"&gt;Github Action Context&lt;/a&gt;&lt;/p&gt;

</description>
      <category>actionshackathon21</category>
      <category>github</category>
      <category>opensource</category>
      <category>action</category>
    </item>
  </channel>
</rss>
