<?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>Forem: Sang</title>
    <description>The latest articles on Forem by Sang (@sang0424).</description>
    <link>https://forem.com/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%2F067932b7-2bc5-4073-9d76-236e6a606004.png</url>
      <title>Forem: Sang</title>
      <link>https://forem.com/sang0424</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sang0424"/>
    <language>en</language>
    <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://forem.com/sang0424/building-an-ai-chatbot-that-learns-from-human-edits-not-just-feedback-4n76</link>
      <guid>https://forem.com/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://forem.com/sang0424/eas-update-not-downloading-on-production-build-despite-matching-channels-and-successful-publish-1i66</link>
      <guid>https://forem.com/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>
