<?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: Mikoshiba Kyu</title>
    <description>The latest articles on Forem by Mikoshiba Kyu (@mikoshiba-kyu).</description>
    <link>https://forem.com/mikoshiba-kyu</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%2F1175520%2F89c76bbf-0e33-442c-80a8-97f0161ae3c1.jpeg</url>
      <title>Forem: Mikoshiba Kyu</title>
      <link>https://forem.com/mikoshiba-kyu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mikoshiba-kyu"/>
    <language>en</language>
    <item>
      <title>Managing GitHub Copilot CLI MCP Server Configuration in Your Repository</title>
      <dc:creator>Mikoshiba Kyu</dc:creator>
      <pubDate>Sat, 20 Dec 2025 09:58:55 +0000</pubDate>
      <link>https://forem.com/mikoshiba-kyu/managing-github-copilot-cli-mcp-server-configuration-in-your-repository-58i6</link>
      <guid>https://forem.com/mikoshiba-kyu/managing-github-copilot-cli-mcp-server-configuration-in-your-repository-58i6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When developing with GitHub Copilot CLI, MCP server configuration typically depends on each developer's individual environment.&lt;br&gt;
However, in team development, there's a need to "standardize the MCP servers used within the repository."&lt;/p&gt;

&lt;p&gt;This article explains how to include GitHub Copilot CLI MCP configuration in your repository using VSCode + WSL2 + DevContainers environment.&lt;/p&gt;
&lt;h2&gt;
  
  
  Background and Challenges
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Environment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VSCode&lt;/li&gt;
&lt;li&gt;WSL2 + DevContainers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why Include MCP Configuration in the Repository?
&lt;/h3&gt;

&lt;p&gt;Required MCP servers differ based on project characteristics.&lt;br&gt;
For example, Chrome DevTools MCP is useful for web application development, but unnecessary for other types of projects.&lt;br&gt;
On the other hand, code analysis tools like Serena might be desired across all repositories.&lt;/p&gt;

&lt;p&gt;Currently, you need to document "Please install this MCP server" in the README's development environment setup section.&lt;br&gt;
This requires each developer to manually install, leading to version differences or some people skipping installation due to inconvenience.&lt;br&gt;
As a result, discrepancies in development environments within the team tend to arise.&lt;/p&gt;

&lt;p&gt;Claude Code allows you to load MCP configuration by placing a &lt;code&gt;.mcp.json&lt;/code&gt; file,&lt;br&gt;
and also provides a mechanism called &lt;strong&gt;Claude Code Plugin&lt;/strong&gt; for creating and sharing plugin store repositories.&lt;/p&gt;

&lt;p&gt;Both of these features would be incredibly desirable for GitHub Copilot...&lt;br&gt;
However, the current GitHub Copilot CLI requires workarounds.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Challenge
&lt;/h3&gt;

&lt;p&gt;In GitHub Copilot CLI, when you add configuration using the &lt;code&gt;/mcp add&lt;/code&gt; command, it's saved by default in the &lt;code&gt;~/.copilot&lt;/code&gt; directory.&lt;br&gt;
GitHub Copilot CLI then references this configuration in the home directory to operate.&lt;/p&gt;

&lt;p&gt;In other words, MCP configuration sits outside the repository as a personal user setting.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Place MCP Configuration File in Repository
&lt;/h3&gt;

&lt;p&gt;First, place &lt;code&gt;.copilot/mcp-config.json&lt;/code&gt; in the project root directory.&lt;br&gt;
Here's an example with Serena configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serena"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"git+https://github.com/oraios/serena"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"serena"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"start-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--context"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ide-assistant"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Exclude Unnecessary Files in .gitignore
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;.copilot&lt;/code&gt; directory generates files specific to individual environments, such as &lt;code&gt;logs&lt;/code&gt; and &lt;code&gt;config.json&lt;/code&gt;.&lt;br&gt;
Since only the MCP configuration file should be committed, exclude them in &lt;code&gt;.gitignore&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ .copilot/logs/
+ .copilot/config.json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Change GitHub Copilot CLI Configuration Directory in DevContainers
&lt;/h3&gt;

&lt;p&gt;Configure DevContainers' &lt;code&gt;postCreateCommand&lt;/code&gt; to execute &lt;code&gt;postCreateCommand.sh&lt;/code&gt;,&lt;br&gt;
where you change the GitHub Copilot CLI configuration directory.&lt;br&gt;
Below is an example for zsh, specifying the project root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ GH_CLI_CONFIG_DIR="/workspaces/your-repo"
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+ if ! grep -q 'export XDG_CONFIG_HOME=' ~/.zshrc; then
+     echo "export XDG_CONFIG_HOME=\"$GH_CLI_CONFIG_DIR\"" &amp;gt;&amp;gt; ~/.zshrc
+ fi
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Verification
&lt;/h3&gt;

&lt;p&gt;Rebuild the DevContainer and launch GitHub Copilot CLI.&lt;br&gt;
With the &lt;code&gt;/mcp show&lt;/code&gt; command, you can confirm that Serena is loaded as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● MCP Server Configuration:

  • serena (local): Command: uvx

  Total servers: 1
  Config file: /workspaces/your-repo/.copilot/mcp-config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Config file path points to &lt;code&gt;.copilot/mcp-config.json&lt;/code&gt; within the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Now we can handle MCP servers at the same level as Claude Code's &lt;code&gt;.mcp.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Looking at &lt;a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer"&gt;Awesome Copilot&lt;/a&gt;, it seems the philosophy is that MCP server configuration is a personal setting.&lt;br&gt;
I hope MCP configuration will migrate to a similar structure, making this article obsolete.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#add-an-mcp-server" rel="noopener noreferrer"&gt;GitHub Documentation / Add an MCP server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer"&gt;Awesome Copilot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devcontainers</category>
      <category>mcp</category>
      <category>githubcopilot</category>
      <category>githubcopilotcli</category>
    </item>
    <item>
      <title>I created a Boiler Plate for creating Web Apps with Google Apps Script.</title>
      <dc:creator>Mikoshiba Kyu</dc:creator>
      <pubDate>Tue, 02 Jul 2024 02:24:13 +0000</pubDate>
      <link>https://forem.com/mikoshiba-kyu/i-created-a-boiler-plate-for-creating-web-apps-with-google-apps-script-4gn2</link>
      <guid>https://forem.com/mikoshiba-kyu/i-created-a-boiler-plate-for-creating-web-apps-with-google-apps-script-4gn2</guid>
      <description>&lt;h2&gt;
  
  
  GAS-WebApp-BoilerPlate
&lt;/h2&gt;

&lt;p&gt;Boilerplate for creating web apps with Google Apps Script.&lt;br&gt;&lt;br&gt;
We expect to develop in TypeScript and React.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Mikoshiba-Kyu" rel="noopener noreferrer"&gt;
        Mikoshiba-Kyu
      &lt;/a&gt; / &lt;a href="https://github.com/Mikoshiba-Kyu/gas-webapp-boilerplate" rel="noopener noreferrer"&gt;
        gas-webapp-boilerplate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Template for creating web apps with Google Apps Script
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/015d20ec96cfe1909c34cf4b5a4bb655975f7cc70a2d8cb324a970c689819db7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f4d696b6f73686962612d4b79752f6761732d7765626170702d626f696c6572706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/015d20ec96cfe1909c34cf4b5a4bb655975f7cc70a2d8cb324a970c689819db7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f4d696b6f73686962612d4b79752f6761732d7765626170702d626f696c6572706c617465" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2a7b87850832c86aed6e4258db617976ed407ce2001ef3c804d9d82257717cd5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f4d696b6f73686962612d4b79752f6761732d7765626170702d626f696c6572706c6174652f746f74616c"&gt;&lt;img src="https://camo.githubusercontent.com/2a7b87850832c86aed6e4258db617976ed407ce2001ef3c804d9d82257717cd5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f4d696b6f73686962612d4b79752f6761732d7765626170702d626f696c6572706c6174652f746f74616c" alt="Downloads"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/35e65c7f94a91f3ae84489440ae4e839334235486cc400dbad3aed440a1e7bdc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f64652d73697a652f4d696b6f73686962612d4b79752f6761732d7765626170702d626f696c6572706c617465"&gt;&lt;img src="https://camo.githubusercontent.com/35e65c7f94a91f3ae84489440ae4e839334235486cc400dbad3aed440a1e7bdc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f64652d73697a652f4d696b6f73686962612d4b79752f6761732d7765626170702d626f696c6572706c617465" alt="Size"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/google/clasp" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bb9db24b4ce597d1327d1c9d5692455b8f35c0a4bf0f3e336b5cebd2d1857d91/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d636c6173702d3432383566342e737667" alt="clasp"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e2110d9b58a246c92114856e88de1f1301483e62aa8e75112abad5b34a74a32d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566974652d3536353635363f6c6f676f3d76697465267374796c653d666c6174253232"&gt;&lt;img src="https://camo.githubusercontent.com/e2110d9b58a246c92114856e88de1f1301483e62aa8e75112abad5b34a74a32d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566974652d3536353635363f6c6f676f3d76697465267374796c653d666c6174253232" alt="Vite"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2e1154857f21b2134545c548324363ba551821c23c5f07db64355c8a599d44c1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d3536353635363f6c6f676f3d74797065736372697074267374796c653d666c6174253232"&gt;&lt;img src="https://camo.githubusercontent.com/2e1154857f21b2134545c548324363ba551821c23c5f07db64355c8a599d44c1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d3536353635363f6c6f676f3d74797065736372697074267374796c653d666c6174253232" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0548d7417c27f0f1c0a7db86af0859f5d9aa4c6f3a62b0a6f38015386d7a8fb2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d3536353635363f6c6f676f3d7265616374267374796c653d666c6174253232"&gt;&lt;img src="https://camo.githubusercontent.com/0548d7417c27f0f1c0a7db86af0859f5d9aa4c6f3a62b0a6f38015386d7a8fb2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d3536353635363f6c6f676f3d7265616374267374796c653d666c6174253232" alt="React"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/09bda36e11a5409c8ea4ac2fc417c301f2780e81369a3521b970aa30b3029941/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5669746573742d3536353635363f6c6f676f3d766974657374267374796c653d666c6174253232"&gt;&lt;img src="https://camo.githubusercontent.com/09bda36e11a5409c8ea4ac2fc417c301f2780e81369a3521b970aa30b3029941/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5669746573742d3536353635363f6c6f676f3d766974657374267374796c653d666c6174253232" alt="Vitest"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/859e5fa8379b85b71500301658c39c04b84a5c3807e842924b1ae607c4701af0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506c61797772696768742d3536353635363f6c6f676f3d706c6179777269676874267374796c653d666c6174253232"&gt;&lt;img src="https://camo.githubusercontent.com/859e5fa8379b85b71500301658c39c04b84a5c3807e842924b1ae607c4701af0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506c61797772696768742d3536353635363f6c6f676f3d706c6179777269676874267374796c653d666c6174253232" alt="Playwright"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a346d90bc5e0222a2658cbe168ece73b5fe1fbf61cbf282fc65f78e842800a47/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476974687562416374696f6e732d3536353635363f6c6f676f3d676974687562616374696f6e73267374796c653d666c6174253232"&gt;&lt;img src="https://camo.githubusercontent.com/a346d90bc5e0222a2658cbe168ece73b5fe1fbf61cbf282fc65f78e842800a47/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476974687562416374696f6e732d3536353635363f6c6f676f3d676974687562616374696f6e73267374796c653d666c6174253232" alt="Github Actions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;GAS-WebApp-BoilerPlate&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/Mikoshiba-Kyu/gas-webapp-boilerplate/blob/main/README.md" rel="noopener noreferrer"&gt;English&lt;/a&gt; / &lt;a href="https://github.com/Mikoshiba-Kyu/gas-webapp-boilerplate/blob/main/README_ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Boilerplate for creating web apps with Google Apps Script.&lt;br&gt;
We expect to develop in TypeScript and React.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Feature&lt;/h1&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DevContainer&lt;/strong&gt; is used&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; and &lt;strong&gt;clasp&lt;/strong&gt; generate files for eventual deployment in Google Apps Script&lt;/li&gt;
&lt;li&gt;Unit tests can be created with &lt;strong&gt;Vitest&lt;/strong&gt; and E2E tests with &lt;strong&gt;Playwright&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Quick Start&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;git clone https://github.com/Mikoshiba-Kyu/gas-webapp-boilerplate.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Overview of Project Structure&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;The core development code is placed under the &lt;code&gt;src&lt;/code&gt; folder for the front end and back end, respectively.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;📁 src
├── 📁 backend
│   ├── 📁 serverFunctions
│   │   ├── 📄 index.ts
│   │   └── 📄 and more...
│   └── 📄 main.ts
└── 📁 frontend
    ├── 📄 main.tsx
    └── 📄 and more...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;yarn build&lt;/code&gt; creates files for Google Apps Script in the &lt;code&gt;gas/dist&lt;/code&gt; folder.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;📁 gas
├── 📁 dist
│   ├── 📄 index.html
│   └── 📄 main.js
└── 📄 appsscript.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Other folders are described below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.github&lt;/code&gt;
Preset Github Actions for E2E…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Mikoshiba-Kyu/gas-webapp-boilerplate" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Feature
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DevContainer&lt;/strong&gt; is used&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; and &lt;strong&gt;clasp&lt;/strong&gt; generate files for eventual deployment in Google Apps Script&lt;/li&gt;
&lt;li&gt;Unit tests can be created with &lt;strong&gt;Vitest&lt;/strong&gt; and E2E tests with &lt;strong&gt;Playwright&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/Mikoshiba-Kyu/gas-webapp-boilerplate.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Overview of Project Structure
&lt;/h2&gt;

&lt;p&gt;The core development code is placed under the &lt;code&gt;src&lt;/code&gt; folder for the front end and back end, respectively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📁 src
├── 📁 backend
│   ├── 📁 serverFunctions
│   │   ├── 📄 index.ts
│   │   └── 📄 and more...
│   └── 📄 main.ts
└── 📁 frontend
    ├── 📄 main.tsx
    └── 📄 and more...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;yarn build&lt;/code&gt; creates files for Google Apps Script in the &lt;code&gt;gas/dist&lt;/code&gt; folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📁 gas
├── 📁 dist
│   ├── 📄 index.html
│   └── 📄 main.js
└── 📄 appsscript.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other folders are described below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.github&lt;/code&gt;
Preset Github Actions for E2E test execution.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.husky&lt;/code&gt;
Preset lint at pre commit time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e2e&lt;/code&gt;
Stores Playwright test files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Launch DecContainer
&lt;/h3&gt;

&lt;p&gt;Clone the repository and start DevContainer in any way you wish.&lt;/p&gt;

&lt;h3&gt;
  
  
  Front-end implementation
&lt;/h3&gt;

&lt;p&gt;Implement the front-end side in &lt;code&gt;src/frontend&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Common UI frameworks, state management libraries, etc. can be used.&lt;/p&gt;
&lt;h3&gt;
  
  
  Back-end implementation
&lt;/h3&gt;

&lt;p&gt;Google Apps specific classes such as &lt;code&gt;SpreadsheetApp&lt;/code&gt; cannot be used directly from the front end.&lt;br&gt;&lt;br&gt;
You must call the function exposed to global in &lt;code&gt;backend/main.ts&lt;/code&gt; via &lt;a href="https://github.com/enuchi/gas-client" rel="noopener noreferrer"&gt;gas-client&lt;/a&gt; from the front end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// backend/main.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sampleFunction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./serverFunctions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// This function is required to run as a webApp&lt;/span&gt;
&lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;doGet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;GoogleAppsScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTML&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HtmlOutput&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;HtmlService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHtmlOutputFromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Create the necessary functions below.&lt;/span&gt;
&lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sampleFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sampleFunction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// frontend/App.tsx&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GASClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gas-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;serverFunctions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GASClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;serverFunctions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sampleFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🗒️Notes&lt;br&gt;&lt;br&gt;
In the above example, &lt;code&gt;import.meta.env.PROD&lt;/code&gt; is used to branch by environment.&lt;br&gt;&lt;br&gt;
If created by &lt;code&gt;yarn build&lt;/code&gt; and deployed in GAS, the environment uses &lt;code&gt;serverFunction&lt;/code&gt;,&lt;br&gt;
And if it is running locally by &lt;code&gt;yarn dev&lt;/code&gt;, it will work in an alternative way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Creating and running tests
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Unit testing
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yarn &lt;span class="nb"&gt;test&lt;/span&gt;:unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For front-end and unit testing, use Vitest.&lt;br&gt;&lt;br&gt;
If you want to test Google Apps specific functions created in &lt;code&gt;serverFunctions&lt;/code&gt;, you need to mock them.&lt;/p&gt;
&lt;h4&gt;
  
  
  E2E testing
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yarn &lt;span class="nb"&gt;test&lt;/span&gt;:e2e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Playwright is used for E2E testing.&lt;br&gt;&lt;br&gt;
The URL of an already running GAS web app must be specified as &lt;code&gt;baseURL&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// playwright.config.ts&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* Base URL to use in actions like `await page.goto('/')`. */&lt;/span&gt;
    &lt;span class="nl"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PLAYWRIGHT_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your apps url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Important&lt;br&gt;
When conducting E2E testing, the target application must be made available to &lt;code&gt;everyone&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;p&gt;First, compile with Vite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yarn build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are not logged in to clasp, log in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;clasp login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new project if one has not already been created.&lt;br&gt;&lt;br&gt;
When you create a project as follows, a new file &lt;code&gt;appsscript.json&lt;/code&gt; will be created in the root.&lt;br&gt;&lt;br&gt;
If you want to use the one already placed in the &lt;code&gt;gas&lt;/code&gt; folder, you can delete it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;clasp create

? Create which script?
  standalone
  docs
  sheets
  slides
  forms
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; webapp
  api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🗒️Notes&lt;br&gt;&lt;br&gt;
If you are using a project that has already been created,&lt;br&gt;&lt;br&gt;
manually create &lt;code&gt;.clasp.json&lt;/code&gt; in the root and specify the &lt;code&gt;scriptId&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;🗒️Notes&lt;br&gt;&lt;br&gt;
Set "timeZone" in &lt;code&gt;gas/appscript.json&lt;/code&gt; according to your situation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Replace the &lt;code&gt;rootDir&lt;/code&gt; in the created &lt;code&gt;.clasp.json&lt;/code&gt; with the path to the &lt;code&gt;gas&lt;/code&gt; folder of the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scriptId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"********"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rootDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/workspaces/gas-webapp-boilerplate/gas"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute deployment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;clasp push
&lt;span class="nv"&gt;$ &lt;/span&gt;clasp deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To open the deployed project page in a browser, use the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;clasp open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vite</category>
      <category>react</category>
      <category>clasp</category>
      <category>gas</category>
    </item>
    <item>
      <title>Released a Desktop Client App "itos" for ChatGPT</title>
      <dc:creator>Mikoshiba Kyu</dc:creator>
      <pubDate>Tue, 10 Oct 2023 05:53:07 +0000</pubDate>
      <link>https://forem.com/mikoshiba-kyu/released-a-desktop-client-app-itos-for-chatgpt-2k2m</link>
      <guid>https://forem.com/mikoshiba-kyu/released-a-desktop-client-app-itos-for-chatgpt-2k2m</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;We have released a desktop app called itos for conversing with ChatGPT.&lt;br&gt;
It is compatible with Windows, MacOS, and Linux.&lt;/p&gt;

&lt;p&gt;The release page is available &lt;a href="https://github.com/Mikoshiba-Kyu/Tauri-itos/releases"&gt;here&lt;/a&gt;.&lt;br&gt;
Please download the installer compatible with your OS and use it.&lt;/p&gt;

&lt;p&gt;A ChatGPT API KEY is required to use it.&lt;br&gt;
The available models are &lt;code&gt;gpt-4&lt;/code&gt; and &lt;code&gt;gpt-3.5-turbo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GaYEVZsQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qsqh530gfbolf1joj1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GaYEVZsQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qsqh530gfbolf1joj1l.png" alt="App Overview" width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It is possible to display multiple conversations side by side. Each conversation can be rearranged, and you can toggle between visibility and non-visibility.&lt;br&gt;
This makes it easy to handle applications such as having discussions on related topics with ChatGPT.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can specify a prompt for the entire conversation (&lt;code&gt;role: "system"&lt;/code&gt; in the ChatGPT API).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can set your own avatar icon and an avatar icon for ChatGPT for each conversation.&lt;br&gt;
Together with the previously mentioned prompt setting, you can play games such as having simulated conversations with specific characters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The app supports both English and Japanese display languages, and it also supports two theme settings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Development
&lt;/h2&gt;

&lt;p&gt;We used Tauri as the application framework.&lt;br&gt;
At this point, all implementations were done only in TypeScript, and there was no need for Rust.&lt;br&gt;
The front-end uses React and MUI. We developed freely using only what we like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Afterword
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;If my product could be a great experience for you, Please buy me a hot cup of coffee. Thank you.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.buymeacoffee.com/mikoshibakyu"&gt;buymeacoffee.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Mikoshiba-Kyu/Tauri-itos"&gt;Repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tauri.app/"&gt;Tauri&lt;/a&gt;&lt;br&gt;
&lt;a href="https://openai.com/"&gt;OpenAI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>tauri</category>
      <category>chatgpt</category>
    </item>
  </channel>
</rss>
