<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>App on Ted Factory</title><link>https://tedfactory.com/en/tags/app/</link><description>Recent content in App on Ted Factory</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 02 May 2026 09:57:07 +0900</lastBuildDate><atom:link href="https://tedfactory.com/en/tags/app/index.xml" rel="self" type="application/rss+xml"/><item><title>Ladder Pick Development Plan</title><link>https://tedfactory.com/en/apps/ladder-pick/plan/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/ladder-pick/plan/</guid><description>&lt;h1 id="ladder-pick--chatgpt-app-development-plan"&gt;Ladder Pick — ChatGPT App Development Plan&lt;a class="anchor" href="#ladder-pick--chatgpt-app-development-plan"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project name&lt;/strong&gt;: &lt;code&gt;ted-mcp-servers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App name (App Directory display)&lt;/strong&gt;: Ladder Pick&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App language&lt;/strong&gt;: English first (UI / tool description / privacy policy all in English; only the plan document is in Korean)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="official-developer-documentation-reference-links"&gt;Official Developer Documentation Reference Links&lt;a class="anchor" href="#official-developer-documentation-reference-links"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="core-documents-must-read"&gt;Core Documents (Must-Read)&lt;a class="anchor" href="#core-documents-must-read"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apps SDK Home&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk"&gt;https://developers.openai.com/apps-sdk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quickstart (includes Todo example)&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/quickstart"&gt;https://developers.openai.com/apps-sdk/quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP Server Concepts&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/concepts/mcp-server"&gt;https://developers.openai.com/apps-sdk/concepts/mcp-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP Apps in ChatGPT&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/mcp-apps-in-chatgpt"&gt;https://developers.openai.com/apps-sdk/mcp-apps-in-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="design"&gt;Design&lt;a class="anchor" href="#design"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UX Principles&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/concepts/ux-principles"&gt;https://developers.openai.com/apps-sdk/concepts/ux-principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI Guidelines&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/concepts/ui-guidelines"&gt;https://developers.openai.com/apps-sdk/concepts/ui-guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design Components&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/plan/components"&gt;https://developers.openai.com/apps-sdk/plan/components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Definitions&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/plan/tools"&gt;https://developers.openai.com/apps-sdk/plan/tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case Research&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/plan/use-case"&gt;https://developers.openai.com/apps-sdk/plan/use-case&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="build"&gt;Build&lt;a class="anchor" href="#build"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP Server Setup&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/build/mcp-server"&gt;https://developers.openai.com/apps-sdk/build/mcp-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT UI Build&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/build/chatgpt-ui"&gt;https://developers.openai.com/apps-sdk/build/chatgpt-ui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Management&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/build/state-management"&gt;https://developers.openai.com/apps-sdk/build/state-management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/build/auth"&gt;https://developers.openai.com/apps-sdk/build/auth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Example Apps (GitHub)&lt;/strong&gt;: &lt;a href="https://github.com/openai/openai-apps-sdk-examples"&gt;https://github.com/openai/openai-apps-sdk-examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI Library (GitHub)&lt;/strong&gt;: &lt;a href="https://github.com/openai/apps-sdk-ui"&gt;https://github.com/openai/apps-sdk-ui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="deployment--testing--submission"&gt;Deployment / Testing / Submission&lt;a class="anchor" href="#deployment--testing--submission"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deployment Guide&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/deploy"&gt;https://developers.openai.com/apps-sdk/deploy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing Guide&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/deploy/testing"&gt;https://developers.openai.com/apps-sdk/deploy/testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT Connection&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/deploy/connect-chatgpt"&gt;https://developers.openai.com/apps-sdk/deploy/connect-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Submission &amp;amp; Maintenance&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/deploy/submission"&gt;https://developers.openai.com/apps-sdk/deploy/submission&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Submission Guidelines (Policies / Rules)&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/app-submission-guidelines"&gt;https://developers.openai.com/apps-sdk/app-submission-guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Mode Setup&lt;/strong&gt;: &lt;a href="https://platform.openai.com/docs/guides/developer-mode"&gt;https://platform.openai.com/docs/guides/developer-mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="guides--references"&gt;Guides / References&lt;a class="anchor" href="#guides--references"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security &amp;amp; Privacy&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/guides/security-privacy"&gt;https://developers.openai.com/apps-sdk/guides/security-privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata Optimization&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/guides/optimize-metadata"&gt;https://developers.openai.com/apps-sdk/guides/optimize-metadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/deploy/troubleshooting"&gt;https://developers.openai.com/apps-sdk/deploy/troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Reference&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/reference"&gt;https://developers.openai.com/apps-sdk/reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changelog&lt;/strong&gt;: &lt;a href="https://developers.openai.com/apps-sdk/changelog"&gt;https://developers.openai.com/apps-sdk/changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="general-references"&gt;General References&lt;a class="anchor" href="#general-references"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apps in ChatGPT (Help Center)&lt;/strong&gt;: &lt;a href="https://help.openai.com/en/articles/12503483-apps-in-chatgpt-and-the-apps-sdk"&gt;https://help.openai.com/en/articles/12503483-apps-in-chatgpt-and-the-apps-sdk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Directory Submission (Help Center)&lt;/strong&gt;: &lt;a href="https://help.openai.com/en/articles/20001040"&gt;https://help.openai.com/en/articles/20001040&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Directory Browsing&lt;/strong&gt;: &lt;a href="https://chatgpt.com/apps"&gt;https://chatgpt.com/apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="goals"&gt;Goals&lt;a class="anchor" href="#goals"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Build a &lt;strong&gt;&amp;ldquo;Ladder Pick&amp;rdquo;&lt;/strong&gt; app that can be listed on the ChatGPT App Directory.&lt;/li&gt;
&lt;li&gt;Enable the complete flow — entering participants / items → generating a ladder (random matching) → revealing results — through an &lt;strong&gt;interactive widget (iframe)&lt;/strong&gt; within a chat.&lt;/li&gt;
&lt;li&gt;After testing with ChatGPT Developer Mode, the ultimate goal is &lt;strong&gt;App Directory submission / approval / Publish&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="assumptions--scope"&gt;Assumptions / Scope&lt;a class="anchor" href="#assumptions--scope"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MVP&lt;/strong&gt;: Interactive widget (iframe UI) + MCP tool-based. The widget provides core interactions such as entering participants / items, displaying results, and reshuffling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Out of scope (initial)&lt;/strong&gt;: Login / payments, real-time multiplayer, complex animations, external data integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No authentication required&lt;/strong&gt;: Since there is no external service integration, we start without OAuth / authentication flows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safety / Policy&lt;/strong&gt;: No write operations to external systems. Tool hint annotations:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;readOnlyHint: false&lt;/code&gt; — Not true because internal state is created / modified&lt;/li&gt;
&lt;li&gt;&lt;code&gt;destructiveHint: false&lt;/code&gt; — No irreversible external impact&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openWorldHint: false&lt;/code&gt; — No public internet state changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="user-experience-ux-scenarios"&gt;User Experience (UX) Scenarios&lt;a class="anchor" href="#user-experience-ux-scenarios"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="basic-flow-interactive-widget"&gt;Basic Flow (Interactive Widget)&lt;a class="anchor" href="#basic-flow-interactive-widget"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;The user types &lt;code&gt;@Ladder Pick&lt;/code&gt; or something like &amp;ldquo;play a ladder game.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;ChatGPT calls the &lt;code&gt;create_game&lt;/code&gt; tool, and the &lt;strong&gt;Ladder Pick widget&lt;/strong&gt; is displayed in an iframe.&lt;/li&gt;
&lt;li&gt;Within the widget:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Players&lt;/strong&gt; list: Add / remove participant names (default 4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Items&lt;/strong&gt; list: Add / remove result items (prizes / roles)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Options&lt;/strong&gt;: Reveal mode (All at once / One by one), Seed (auto / custom)&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;&amp;ldquo;Pick!&amp;rdquo;&lt;/strong&gt; button → Generate matching results&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Results area:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;All at once&lt;/strong&gt;: Display the full matching table immediately&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One by one&lt;/strong&gt;: Reveal one person at a time with the &amp;ldquo;Reveal Next&amp;rdquo; button&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;Reshuffle&amp;rdquo;&lt;/strong&gt; button: Reshuffle with a new seed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;Export&amp;rdquo;&lt;/strong&gt; button: Copy results as text&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="text-fallback"&gt;Text Fallback&lt;a class="anchor" href="#text-fallback"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Even without the widget, ChatGPT can display tool call results as text (table).&lt;/li&gt;
&lt;li&gt;Example: &amp;ldquo;Ladder Pick, match A,B,C,D with 1st,2nd,3rd,4th&amp;rdquo; → Text table response&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="error-cases"&gt;Error Cases&lt;a class="anchor" href="#error-cases"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fewer than 2 participants → Error message: &amp;ldquo;At least 2 players are required.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Item count ≠ participant count → Error message: &amp;ldquo;Number of items must match number of players. You have {n} players and {m} items.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Items list empty → Error message: &amp;ldquo;Items list cannot be empty.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="functional-requirements"&gt;Functional Requirements&lt;a class="anchor" href="#functional-requirements"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="input"&gt;Input&lt;a class="anchor" href="#input"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Participant list (Players)&lt;/strong&gt;: 2–20 people&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result items (Items)&lt;/strong&gt;: Must be &lt;strong&gt;exactly the same count&lt;/strong&gt; as participants (error returned on mismatch)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Options&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Reveal mode: &lt;code&gt;all&lt;/code&gt; | &lt;code&gt;one-by-one&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Seed: Auto-generated or user-specified (for reproducibility)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="output"&gt;Output&lt;a class="anchor" href="#output"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Matching results&lt;/strong&gt;: Player ↔ Item 1:1 mapping&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ladder visualization&lt;/strong&gt;: Canvas-based visual ladder (vertical lines + horizontal rungs + color-coded path animations)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="state--storage"&gt;State / Storage&lt;a class="anchor" href="#state--storage"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Module-level &lt;code&gt;Map&amp;lt;gameId, GameState&amp;gt;&lt;/code&gt; for in-process in-memory management&lt;/li&gt;
&lt;li&gt;Unique ID issued on game creation; subsequent reshuffle / reveal_next lookups use that ID&lt;/li&gt;
&lt;li&gt;No persistent storage (resets on server restart; this is sufficient for the initial version)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="technical-design"&gt;Technical Design&lt;a class="anchor" href="#technical-design"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="architecture-based-on-official-structure"&gt;Architecture (Based on Official Structure)&lt;a class="anchor" href="#architecture-based-on-official-structure"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ChatGPT Apps consist of two components:&lt;/p&gt;</description></item><item><title>Development History</title><link>https://tedfactory.com/en/apps/codebattle/history/</link><pubDate>Sat, 31 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/codebattle/history/</guid><description>&lt;h1 id="development-history"&gt;Development History&lt;a class="anchor" href="#development-history"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Code Battle grew by shipping an MVP first, fixing the slow and painful parts, and expanding along the way as it was used to support real events. In the early days, progress was often made in small pockets of time between work and study, and keeping a written history helped maintain context and momentum.&lt;/p&gt;
&lt;h2 id="may-21-2017--launch-the-site-with-a-rock-scissors-paper-mvp"&gt;May 21, 2017 — Launch the site with a Rock Scissors Paper MVP&lt;a class="anchor" href="#may-21-2017--launch-the-site-with-a-rock-scissors-paper-mvp"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first MVP of Code Battle was &lt;strong&gt;Rock Scissors Paper&lt;/strong&gt;. It started with a single web page and a single API, and users could inject “their strategy” by implementing callback functions like &lt;code&gt;onGameStart()&lt;/code&gt; and &lt;code&gt;onRoundStart()&lt;/code&gt; in the code area.&lt;/p&gt;</description></item><item><title>Green Swagger</title><link>https://tedfactory.com/en/apps/archive/green-swagger/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/green-swagger/</guid><description>&lt;h1 id="green-swagger"&gt;Green Swagger&lt;a class="anchor" href="#green-swagger"&gt;#&lt;/a&gt;&lt;/h1&gt;

&lt;img
 src="https://tedfactory.com/images/apps/green_swagger/green-swagger-icon-big.png"
 alt="Green Swagger icon"
 style="display: block; width: 240px; margin-top: 20px;" /&gt;
&lt;img
 src="https://tedfactory.com/images/apps/green_swagger/green-swagger-promotion-img.png"
 alt="Green Swagger promotion image"
 style="display: block; width: 520px; margin-top: 12px; margin-bottom: 20px;" /&gt;

&lt;p&gt;Green Swagger is an Android/iOS app built with &lt;strong&gt;Flutter&lt;/strong&gt; for the &lt;strong&gt;2024 Gemini API Developer Competition&lt;/strong&gt;. While it was developed with release in mind, after considering multiple factors, I decided &lt;strong&gt;not to launch it&lt;/strong&gt;, and the project is currently paused.&lt;/p&gt;
&lt;h2 id="why-i-jumped-into-the-competition"&gt;Why I jumped into the competition&lt;a class="anchor" href="#why-i-jumped-into-the-competition"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first prize was a massive &lt;strong&gt;$300,000&lt;/strong&gt;, and there was even a &lt;strong&gt;car&lt;/strong&gt; as a giveaway prize that looked like it belonged in &lt;em&gt;Back to the Future&lt;/em&gt;. From my perspective, it was hard to find a reason &lt;em&gt;not&lt;/em&gt; to participate—so I committed to building a submission.&lt;/p&gt;</description></item><item><title>Apps</title><link>https://tedfactory.com/en/apps/</link><pubDate>Sun, 28 Dec 2025 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/</guid><description>&lt;h1 id="apps"&gt;Apps&lt;a class="anchor" href="#apps"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://tedfactory.com/images/apps/apps-hero.png" alt="Apps" /&gt;&lt;/p&gt;
&lt;p&gt;I build, launch, and operate apps on my own.&lt;/p&gt;
&lt;p&gt;This section brings together projects in many forms—mobile apps, web services, and Chrome extensions. Here, I share what I learned while handling the full lifecycle myself: planning, design, development, deployment, and ongoing operations.&lt;/p&gt;
&lt;p&gt;I don’t only write about “launched apps.” I also document apps I decided not to ship and projects I’ve sunset—because there were clear lessons in those journeys too, and I want to preserve them.&lt;/p&gt;</description></item><item><title>Ladder Pick in ChatGPT</title><link>https://tedfactory.com/en/apps/ladder-pick/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/ladder-pick/</guid><description>&lt;h1 id="ladder-pick-in-chatgpt"&gt;Ladder Pick in ChatGPT&lt;a class="anchor" href="#ladder-pick-in-chatgpt"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-are-chatgpt-apps"&gt;What Are ChatGPT Apps?&lt;a class="anchor" href="#what-are-chatgpt-apps"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://openai.com/index/introducing-apps-in-chatgpt/"&gt;&lt;strong&gt;ChatGPT Apps&lt;/strong&gt;&lt;/a&gt; is a feature introduced by OpenAI in October 2025 that allows external service providers to integrate their services into ChatGPT. It is built on &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;, which provides a standard for LLMs to invoke external tools. ChatGPT Apps takes this a step further by extending the standard so that &lt;strong&gt;interactive UI and logic&lt;/strong&gt; from external services can be embedded directly within the ChatGPT chat interface. In other words, MCP established the standard for &amp;ldquo;LLMs using external capabilities,&amp;rdquo; and the scope of those capabilities has expanded beyond simple data retrieval and execution to include user-facing interactive UI. On top of this, OpenAI launched the &lt;a href="https://chatgpt.com/apps"&gt;App Directory&lt;/a&gt;, a marketplace where users can discover and try a wide variety of apps. For developers, this creates an opportunity to expose their apps to ChatGPT&amp;rsquo;s massive user base and potentially monetize them.&lt;/p&gt;</description></item><item><title>Walkholic</title><link>https://tedfactory.com/en/apps/archive/walkholic/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/walkholic/</guid><description>&lt;h1 id="walkholic"&gt;Walkholic&lt;a class="anchor" href="#walkholic"&gt;#&lt;/a&gt;&lt;/h1&gt;

&lt;img
 src="https://tedfactory.com/images/apps/walkholic/walkholic-icon-big.png"
 alt="Walkholic icon"
 style="display: block; width: 240px; margin-top: 20px;" /&gt;
&lt;img
 src="https://tedfactory.com/images/apps/walkholic/walkholic-promotion-img.png"
 alt="Walkholic promotion image"
 style="display: block; width: 520px; margin-top: 12px; margin-bottom: 20px;" /&gt;

&lt;p&gt;Walkholic is an &lt;strong&gt;Android app&lt;/strong&gt; that I released on &lt;strong&gt;Google Play around 2015&lt;/strong&gt;. It has since been removed from Google Play for maintenance reasons.&lt;/p&gt;
&lt;p&gt;Back then, fitness apps that tracked basic activities—like walking, running, and cycling—and recorded metrics such as activity volume and heart rate were just starting to become popular. Around the same time, Google launched the &lt;strong&gt;Google Fit API&lt;/strong&gt; to grow an ecosystem, and a developer contest called the &lt;strong&gt;Google Fit Challenge&lt;/strong&gt; was held. As you might expect, I joined the challenge and started building an app.&lt;/p&gt;</description></item><item><title>I am your AI</title><link>https://tedfactory.com/en/apps/iamyourai/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/iamyourai/</guid><description>&lt;h1 id="i-am-your-ai--an-ai-assistant-for-web-learning-note-taking-and-task-automation"&gt;I am your AI — An AI Assistant for Web Learning, Note-Taking, and Task Automation&lt;a class="anchor" href="#i-am-your-ai--an-ai-assistant-for-web-learning-note-taking-and-task-automation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Read, ask, organize, and automate — AI is with you at every moment of web browsing.&lt;/p&gt;
&lt;p&gt;Quickly summarize webpages, ask questions about anything you don&amp;rsquo;t understand, take notes with AI, and build up your knowledge. You can even automate repetitive web tasks. Customize your prompts and create your own AI assistant.&lt;/p&gt;

&lt;p style="margin-top: 8px; margin-bottom: 20px;"&gt;
 &lt;a href="https://chromewebstore.google.com/detail/i-am-your-ai/dajfnkohhomckmeakoikehhojpphmaej" target="_blank" rel="noopener noreferrer"&gt;Chrome Web Store — I am your AI (listing)&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Mission Omok (TAKE FIVE)</title><link>https://tedfactory.com/en/apps/archive/take-five/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/take-five/</guid><description>&lt;h1 id="mission-omok-take-five"&gt;Mission Omok (TAKE FIVE)&lt;a class="anchor" href="#mission-omok-take-five"&gt;#&lt;/a&gt;&lt;/h1&gt;

&lt;img
 src="https://tedfactory.com/images/apps/take_five/take_five_icon_big.png"
 alt="Mission Omok (TAKE FIVE) icon"
 style="display: block; width: 240px; margin-top: 20px;" /&gt;
&lt;img
 src="https://tedfactory.com/images/apps/take_five/take_five_promotion_img.png"
 alt="Mission Omok (TAKE FIVE) promotion image"
 style="display: block; width: 520px; margin-top: 12px; margin-bottom: 20px;" /&gt;

&lt;p&gt;Mission Omok (TAKE FIVE) is an &lt;strong&gt;Android game&lt;/strong&gt; that I released on &lt;strong&gt;Google Play around 2014&lt;/strong&gt;. It has since been removed from Google Play for maintenance reasons.&lt;/p&gt;
&lt;p&gt;Back then, puzzle games like Candy Crush were booming. I remember thinking, “Gomoku/Omok is a familiar rule set, but maybe no one has really ‘claimed’ it with a standout concept yet.” So instead of building a plain Gomoku clone, I decided to create a version with a &lt;strong&gt;fresh theme&lt;/strong&gt; and a &lt;strong&gt;mission-based structure&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Code Battle</title><link>https://tedfactory.com/en/apps/codebattle/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/codebattle/</guid><description>&lt;h1 id="code-battle"&gt;Code Battle&lt;a class="anchor" href="#code-battle"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Code Battle is a website operated by the author where &lt;strong&gt;your code&lt;/strong&gt; and &lt;strong&gt;your opponent’s code&lt;/strong&gt; fight &lt;strong&gt;one turn (TURN) at a time&lt;/strong&gt;. A GAME consists of multiple ROUNDs, and each ROUND consists of multiple TURNs. In each TURN, “my choice” and “the opponent’s choice” determine win/lose and score, and the accumulated results determine ROUND win/lose and GAME win/lose.&lt;/p&gt;

&lt;p style="margin-top: 8px; margin-bottom: 20px;"&gt;
 &lt;a href="https://codebattle.online/" target="_blank" rel="noopener noreferrer"&gt;Code Battle site (https://codebattle.online/)&lt;/a&gt;
&lt;/p&gt;

&lt;h2 id="what-is-code-battle"&gt;What is Code Battle?&lt;a class="anchor" href="#what-is-code-battle"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The core of Code Battle isn’t “solving a problem with a single correct answer.” Instead, it’s a structure where you &lt;strong&gt;implement a strategy in code to beat the opponent&lt;/strong&gt;. You don’t just finish after solving something—you analyze the opponent’s patterns, predict the next turns, and reflect those predictions in code to &lt;strong&gt;shape the flow of a match&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Smart Browser</title><link>https://tedfactory.com/en/apps/archive/smart-browser/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/smart-browser/</guid><description>&lt;h1 id="smart-browser"&gt;Smart Browser&lt;a class="anchor" href="#smart-browser"&gt;#&lt;/a&gt;&lt;/h1&gt;

&lt;img
 src="https://tedfactory.com/images/apps/smart_browser/smart_browser_icon_big.png"
 alt="Smart Browser icon"
 style="display: block; width: 240px; margin-top: 20px;" /&gt;
&lt;img
 src="https://tedfactory.com/images/apps/smart_browser/smart_browser_promotion_img.jpg"
 alt="Smart Browser promotion image"
 style="display: block; width: 520px; margin-top: 12px; margin-bottom: 20px;" /&gt;

&lt;p&gt;Smart Browser is an &lt;strong&gt;Android browser app&lt;/strong&gt; that I released on &lt;strong&gt;Google Play around 2012&lt;/strong&gt;. It has since been removed from Google Play for maintenance reasons.&lt;/p&gt;
&lt;p&gt;I built this app to submit it to an event in 2012 called &lt;strong&gt;“Google Hackfair.”&lt;/strong&gt; Back then, the mobile market was a battlefield, and at the same time it still wasn’t as mature as it is today. I personally had a few pain points while using &lt;strong&gt;Chrome on Android&lt;/strong&gt;, and when I decided to participate in Hackfair, I thought: “Then why not build the browser I want myself?”—and started the project.&lt;/p&gt;</description></item><item><title>Piano Keyboard</title><link>https://tedfactory.com/en/apps/archive/piano-keyboard/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/piano-keyboard/</guid><description>&lt;h1 id="piano-keyboard"&gt;Piano Keyboard&lt;a class="anchor" href="#piano-keyboard"&gt;#&lt;/a&gt;&lt;/h1&gt;

&lt;img
 src="https://tedfactory.com/images/apps/piano_keyboard/piano_keyboard_icon.png"
 alt="Piano Keyboard icon"
 style="display: block; width: 240px; margin-top: 20px;" /&gt;
&lt;img
 src="https://tedfactory.com/images/apps/piano_keyboard/piano_keyboard_promotion_image.png"
 alt="Piano Keyboard promotion image"
 style="display: block; width: 520px; margin-top: 12px; margin-bottom: 20px;" /&gt;

&lt;p&gt;Piano Keyboard is an &lt;strong&gt;Android keyboard app&lt;/strong&gt; that I released on &lt;strong&gt;Google Play around 2011&lt;/strong&gt;. It has since been removed from Google Play for maintenance reasons.&lt;/p&gt;
&lt;p&gt;This app started as a direct follow-up to my experience with No Look Keyboard. No Look Keyboard was an interesting idea, but in practice it was simply &lt;strong&gt;too difficult to use&lt;/strong&gt;. So this time I wanted to build a keyboard with a lower learning curve—something you could try and immediately feel was fun. That’s how I ended up designing and building a keyboard concept based on &lt;strong&gt;piano keys&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Archive</title><link>https://tedfactory.com/en/apps/archive/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/</guid><description>&lt;h1 id="archive"&gt;Archive&lt;a class="anchor" href="#archive"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This is where I collect &lt;strong&gt;projects I once launched via an app store (e.g., Google Play / the App Store) or on the web, but later took down or shut down&lt;/strong&gt;, as well as &lt;strong&gt;projects I built with the intention of launching, but ultimately decided not to ship or put on hold&lt;/strong&gt;. It’s not limited to Android apps for Google Play—this can also include iOS apps, web services, and other formats. Rather than keeping only “success stories” as a portfolio, I wanted a more honest place to preserve the trial-and-error and the decisions behind building.&lt;/p&gt;</description></item><item><title>No Look Keyboard</title><link>https://tedfactory.com/en/apps/archive/nolook-keyboard/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0900</pubDate><guid>https://tedfactory.com/en/apps/archive/nolook-keyboard/</guid><description>&lt;h1 id="no-look-keyboard"&gt;No Look Keyboard&lt;a class="anchor" href="#no-look-keyboard"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;img src="https://tedfactory.com/images/apps/nolook_keyboard/nolook_keyboard_icon_big.png" alt="No Look Keyboard icon" width="320" style="display: block;" /&gt;
&lt;p&gt;No Look Keyboard is an &lt;strong&gt;Android keyboard app&lt;/strong&gt; that I released on &lt;strong&gt;Google Play around 2011&lt;/strong&gt;. It has since been removed from Google Play for maintenance reasons. For me, though, it’s not just “an old app”—it was my &lt;strong&gt;first experience building and actually shipping a side project&lt;/strong&gt;, which is why I wanted to preserve it here in the archive.&lt;/p&gt;
&lt;p&gt;The idea started from a very personal moment. One day, I felt motion sick while typing something on my phone on a bus, and I wondered: “Wouldn’t it be nice if I could type on a smartphone keyboard without looking at the screen?” With that, I began building a keyboard concept designed to let you keep your eyes forward (or on something far away) and rely more on finger sensation than visual feedback.&lt;/p&gt;</description></item></channel></rss>