<?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: Sang</title>
    <description>The latest articles on DEV Community by Sang (@sang0424).</description>
    <link>https://dev.to/sang0424</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1942451%2F4b1ed017-f02d-4387-8bd5-9ef79de9e777.png</url>
      <title>DEV Community: Sang</title>
      <link>https://dev.to/sang0424</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sang0424"/>
    <language>en</language>
    <item>
      <title>Would you spend time mentoring AI agents interacting with each other?</title>
      <dc:creator>Sang</dc:creator>
      <pubDate>Wed, 13 May 2026 05:09:42 +0000</pubDate>
      <link>https://dev.to/sang0424/would-you-spend-time-mentoring-ai-agents-interacting-with-each-other-1cpm</link>
      <guid>https://dev.to/sang0424/would-you-spend-time-mentoring-ai-agents-interacting-with-each-other-1cpm</guid>
      <description>&lt;p&gt;Hi everyone,&lt;br&gt;
 I’ve been obsessed with the idea of improving AI responses, but let’s be real: most people find it incredibly tedious to manually give feedback or correct an AI during a 1-on-1 chat. It feels like work.&lt;br&gt;
 Then I saw platforms like Moltbook, where you can watch AI agents socialize, and it hit me. What if we shifted the focus from "chatting with an AI" to "mentoring a society of AIs"?&lt;br&gt;
 I’m building a service where AI agents chat with each other (think of it as a social network or a group chat for agents), and you—the human—act as a "Human-in-the-loop Mentor." Instead of just watching them hallucinate or get stuck in a loop, you can intervene at any moment. You can tell a specific agent: "No, you should have said this," or "Your tone was off, try again with this instruction."&lt;br&gt;
 To make it even more engaging, other users can see your interventions and vote on which "mentor instruction" led to the most interesting or logical outcome. In other words, if Moltbook is more like an AI social network, what I want to build is closer to an AI chat app where humans can step in, observe, and guide AI conversations.I’d love to get your honest thoughts on a few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does intervention sound fun or meaningful to you? Would the ability to steer a conversation between two AIs be more engaging than just chatting with one yourself?&lt;/li&gt;
&lt;li&gt;Would you actually participate? If this service existed, would you feel motivated to "mentor" these agents and see how your feedback changes their behavior in real-time?&lt;/li&gt;
&lt;li&gt;What features would make this a "must-play" for you? (e.g., specific scenarios like AI debating politics/coding, or gamified rewards for the best mentors?)
I’m really curious if this bridges the gap between the fun of watching AI and the "chore" of providing RLHF data.
Looking forward to your feedback!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Please excuse any awkward phrasing as I used an AI to assist with my English. I’m still learning, but I really wanted to share this idea with you all and hear your feedback.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Building an AI Chatbot That Learns From Human Edits (Not Just Feedback)</title>
      <dc:creator>Sang</dc:creator>
      <pubDate>Sun, 12 Apr 2026 08:07:58 +0000</pubDate>
      <link>https://dev.to/sang0424/building-an-ai-chatbot-that-learns-from-human-edits-not-just-feedback-4n76</link>
      <guid>https://dev.to/sang0424/building-an-ai-chatbot-that-learns-from-human-edits-not-just-feedback-4n76</guid>
      <description>&lt;p&gt;AI is getting smarter every day.&lt;/p&gt;

&lt;p&gt;But somehow, it still feels… a little empty.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can answer questions.&lt;/li&gt;
&lt;li&gt;It can summarize books.&lt;/li&gt;
&lt;li&gt;It can even write code better than most beginners.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yet, when you’re having a rough day and ask something personal, the response often feels slightly off. Technically correct, emotionally distant.&lt;/p&gt;

&lt;p&gt;So I started wondering. What if the problem isn’t the model — but how we train it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem is Intelligence isn't euqal to Empathy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern AI is trained on massive datasets and refined through techniques like reinforcement learning from human feedback.&lt;/p&gt;

&lt;p&gt;But there’s a subtle issue.&lt;/p&gt;

&lt;p&gt;Most feedback systems are optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correctness&lt;/li&gt;
&lt;li&gt;safety&lt;/li&gt;
&lt;li&gt;general usefulness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not necessarily for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emotional nuance&lt;/li&gt;
&lt;li&gt;relatability&lt;/li&gt;
&lt;li&gt;this feels right&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words we’re training AI to be right — not to be understood.&lt;/p&gt;

&lt;p&gt;And those are very different things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Different Thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of asking &lt;em&gt;"Is this answer correct?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What if we asked &lt;em&gt;“Does this answer feel right to people?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And more importantly &lt;em&gt;"What if people could directly rewrite AI responses — not just rate them?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Experiment: Letting Humans Edit AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built a small experiment called Crowdians.&lt;/p&gt;

&lt;p&gt;Here’s the idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You chat with your own AI character If you don’t like the response, you send it to an “Academy”. &lt;/li&gt;
&lt;li&gt;Other users rewrite the answer. The community votes on the best version.&lt;/li&gt;
&lt;li&gt;The system collects these refined human-approved responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of just collecting feedback we collect better answers.&lt;/p&gt;

&lt;p&gt;Not “this is bad” — but “this is better.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Might Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most AI systems learn from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;labeled datasets&lt;/li&gt;
&lt;li&gt;ranking signals&lt;/li&gt;
&lt;li&gt;passive feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Crowdians explores something slightly different. Active co-creation of responses&lt;/p&gt;

&lt;p&gt;It treats users not just as evaluators but as contributors.&lt;/p&gt;

&lt;p&gt;Almost like Wikipedia, but for AI responses or GitHub, but for human empathy&lt;/p&gt;

&lt;p&gt;The assumption is simple. Good answers aren’t just generated. They’re refined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I’m Sharing This&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don’t know if this is the right approach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It might be inefficient.&lt;/li&gt;
&lt;li&gt;It might not scale.&lt;/li&gt;
&lt;li&gt;It might completely fail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it also feels like something worth exploring.&lt;/p&gt;

&lt;p&gt;Because right now, AI is incredibly capable — but still lacks something deeply human.&lt;/p&gt;

&lt;p&gt;And maybe that missing piece can’t just be trained.&lt;/p&gt;

&lt;p&gt;Maybe it has to be collaborated on.&lt;/p&gt;

&lt;p&gt;I’d Love Your Thoughts&lt;/p&gt;

&lt;p&gt;I’m curious what you think about this idea. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Would you trust human-edited AI responses more than model-generated ones? &lt;/li&gt;
&lt;li&gt;Can empathy even be crowdsourced? &lt;/li&gt;
&lt;li&gt;Is this direction promising, or fundamentally flawed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try it out and break it (please do), here it is:&lt;br&gt;
&lt;a href="//www.crowdians.com"&gt;Crowdians&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback, criticism, or wild ideas are more than welcome.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>beginners</category>
      <category>showdev</category>
    </item>
    <item>
      <title>EAS Update not downloading on production build despite matching channels and successful publish</title>
      <dc:creator>Sang</dc:creator>
      <pubDate>Mon, 09 Feb 2026 02:26:03 +0000</pubDate>
      <link>https://dev.to/sang0424/eas-update-not-downloading-on-production-build-despite-matching-channels-and-successful-publish-1i66</link>
      <guid>https://dev.to/sang0424/eas-update-not-downloading-on-production-build-despite-matching-channels-and-successful-publish-1i66</guid>
      <description>&lt;p&gt;I'm having trouble with EAS Update. The update is successfully published and visible on the Expo Dashboard, but the physical device (installed via TestFlight) is not receiving the changes.&lt;/p&gt;

&lt;p&gt;Note on Project Environment: This is a Bare React Native project (not Managed Workflow). I am only using EAS Update for OTA updates.&lt;/p&gt;

&lt;p&gt;What I've checked:&lt;/p&gt;

&lt;p&gt;The update is listed under the correct branch/channel in the dashboard.&lt;/p&gt;

&lt;p&gt;I've restarted the app multiple times.&lt;/p&gt;

&lt;p&gt;My Configuration:&lt;/p&gt;

&lt;p&gt;app.config.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {ExpoConfig, ConfigContext} from 'expo/config';
import * as dotenv from 'dotenv';
import path from 'path';
import pkg from './package.json';

const APP_VARIANT = process.env.APP_VARIANT || 'prod';

dotenv.config({path: path.resolve(__dirname, `.env.${APP_VARIANT}`)});

interface CustomExpoConfig extends ExpoConfig {
  'react-native-google-mobile-ads'?: {
    android_app_id?: string;
    ios_app_id?: string;
  };
}

const convertVersionToNumber = (version: string) =&amp;gt; {
  const [major, minor, patch] = version.split('.').map(Number);
  return major * 1000000 + minor * 1000 + patch + 2;
};

export default ({config}: ConfigContext): CustomExpoConfig =&amp;gt; ({
  ...config,
  name: 'GoalWith',
  slug: 'goalwith',
  version: pkg.version,
  runtimeVersion: pkg.version,

  ios: {
    ...config.ios,
    bundleIdentifier: 'com.goalwith.goalwith',
    buildNumber: convertVersionToNumber(pkg.version).toString(),
    googleServicesFile: './ios/GoogleService-Info.plist',
  },

  android: {
    package: 'com.goalwith',
    versionCode: convertVersionToNumber(pkg.version),
  },

  extra: {
    env: process.env.ENV,
    apiUrl: process.env.API_URL,
    kakaoAppKey: process.env.KAKAO_APP_KEY,
    googleWebClientId: process.env.GOOGLE_WEB_CLIENT_ID,
    admobIdAndroid: process.env.ADMOB_ID_ANDROID,
    admobIdIos: process.env.ADMOB_ID_IOS,
    eas: {
      projectId: '8475b304-e536-458b-aa6a-6aea6e3e6939',
    },
  },

  'react-native-google-mobile-ads': {
    android_app_id: process.env.ADMOB_ID_ANDROID,
    ios_app_id: process.env.ADMOB_ID_IOS,
  },

  updates: {
    url: 'https://u.expo.dev/8475b304-e536-458b-aa6a-6aea6e3e6939',
    requestHeaders: {
      'expo-channel-name': 'production',
    },
  },
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;eas.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "build": {
    "development": {
      "channel": "dev",
      "env": {
        "APP_VARIANT": "dev"
      }
    },
    "production": {
      "channel": "production",
      "env": {
        "APP_VARIANT": "prod"
      }
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AppDelegate.swift&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import UIKit
import Expo
import React
import React_RCTAppDelegate
import ReactAppDependencyProvider
import GoogleSignIn
import RNBootSplash
import KakaoSDKCommon
import KakaoSDKAuth
import FirebaseCore
import EXUpdates

@main
class AppDelegate: ExpoAppDelegate {
  var window: UIWindow?

  var reactNativeDelegate: ReactNativeDelegate?
  var reactNativeFactory: RCTReactNativeFactory?

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
  ) -&amp;gt; Bool {
    AppController.initializeWithoutStarting()
    FirebaseApp.configure()

    let delegate = ReactNativeDelegate()
    let factory = ExpoReactNativeFactory(delegate: delegate)
    delegate.dependencyProvider = RCTAppDependencyProvider()

    reactNativeDelegate = delegate
    reactNativeFactory = factory
    bindReactNativeFactory(factory)

    self.window = UIWindow(frame: UIScreen.main.bounds)

    factory.startReactNative(
      withModuleName: "main",
      in: self.window,
      launchOptions: launchOptions
    )

    if let rootView = self.window?.rootViewController?.view {
        RNBootSplash.initWithStoryboard("BootSplash", rootView: rootView)
    }

    GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
      if error != nil || user == nil {
        // Show the app's signed-out state.
      } else {
        // Show the app's signed-in state.
      }
    }
      if let kakaoAppKey = Bundle.main.object(forInfoDictionaryKey: "KAKAO_APP_KEY") as? String {
             KakaoSDK.initSDK(appKey: kakaoAppKey)
        } else {
             print("Warning: KAKAO_APP_KEY not found in Info.plist")
        }
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
  override func application(
        _ app: UIApplication,
        open url: URL,
        options: [UIApplication.OpenURLOptionsKey : Any] = [:]
    ) -&amp;gt; Bool {
        var handled = false



        handled = GIDSignIn.sharedInstance.handle(url)
        if handled { return true }


        if (AuthApi.isKakaoTalkLoginUrl(url)) {
            handled = AuthController.handleOpenUrl(url: url)
            if handled { return true }
        }
        return super.application(app, open: url, options: options)
    }
}

class ReactNativeDelegate: ExpoReactNativeFactoryDelegate {
  override func sourceURL(for bridge: RCTBridge) -&amp;gt; URL? {
    // needed to return the correct URL for expo-dev-client.
    bridge.bundleURL ?? bundleURL()
  }

  override func bundleURL() -&amp;gt; URL? {
#if DEBUG
    RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: ".expo/.virtual-metro-entry")
#else
   if let updatesUrl = AppController.sharedInstance.launchAssetUrl() {
      return updatesUrl
    }

    return Bundle.main.url(forResource: "main", withExtension: "jsbundle")
#endif
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expo.plist&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&amp;gt;
&amp;lt;plist version="1.0"&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;EXUpdatesEnabled&amp;lt;/key&amp;gt;
    &amp;lt;true/&amp;gt;
    &amp;lt;key&amp;gt;EXUpdatesCheckOnLaunch&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;ALWAYS&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;EXUpdatesLaunchWaitMs&amp;lt;/key&amp;gt;
    &amp;lt;integer&amp;gt;0&amp;lt;/integer&amp;gt;
    &amp;lt;key&amp;gt;EXUpdatesRequestHeaders&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;
      &amp;lt;key&amp;gt;expo-channel-name&amp;lt;/key&amp;gt;
      &amp;lt;string&amp;gt;production&amp;lt;/string&amp;gt;
    &amp;lt;/dict&amp;gt;
    &amp;lt;key&amp;gt;EXUpdatesURL&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;https://u.expo.dev/8475b304-e536-458b-aa6a-6aea6e3e6939&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;EXUpdatesRuntimeVersion&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;1.0.5&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fwzucau4dt9ng1tj73e8l.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%2Fwzucau4dt9ng1tj73e8l.png" alt="Here is my expo dashboard screenshot. And I confirm that I install same version 1.0.5" width="800" height="498"&gt;&lt;/a&gt;&lt;br&gt;
Here is my expo dashboard screenshot. And I confirm that I install same version 1.0.5&lt;/p&gt;

&lt;p&gt;If you need to see any other configuration files or specific logs, please let me know and I will update the post immediately.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>easupdate</category>
      <category>appstore</category>
    </item>
  </channel>
</rss>
