<?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: Sanghun Kang</title>
    <description>The latest articles on DEV Community by Sanghun Kang (@sanghunkang).</description>
    <link>https://dev.to/sanghunkang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4144229%2Fe34183f6-86d3-4a94-aa15-7b4860cdb4e8.png</url>
      <title>DEV Community: Sanghun Kang</title>
      <link>https://dev.to/sanghunkang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanghunkang"/>
    <language>en</language>
    <item>
      <title>Multilingual Ghost CMS Blog: 0. Why I Chose Ghost</title>
      <dc:creator>Sanghun Kang</dc:creator>
      <pubDate>Sat, 26 Sep 2026 14:51:34 +0000</pubDate>
      <link>https://dev.to/sanghunkang/multilingual-ghost-cms-blog-0-why-i-chose-ghost-4o84</link>
      <guid>https://dev.to/sanghunkang/multilingual-ghost-cms-blog-0-why-i-chose-ghost-4o84</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;💡 I wanted to run my English blog and Korean blog in one place&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Why I Chose Ghost
&lt;/h1&gt;

&lt;p&gt;The requirements I wanted were as follows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It had to have a CMS. GitHub Pages was far too cumbersome for writing and editing posts.&lt;/li&gt;
&lt;li&gt;It had to be easy to back up in case I moved the blog later.&lt;/li&gt;
&lt;li&gt;It had to be customizable to some extent according to my preferences.&lt;/li&gt;
&lt;li&gt;It had to support multiple languages. I wanted to post in both Korean and English.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ps7ci9fnmgtdjyh43ni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ps7ci9fnmgtdjyh43ni.png" alt="Ghost Logos" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There were several candidates, such as Naver Blog, Tistory, and Velog, but the only one that satisfied all of these was &lt;a href="https://ghost.org/?ref=sanghunkang.com" rel="noopener noreferrer"&gt;Ghost CMS&lt;/a&gt;. With Ghost, you can either host it yourself or use a managed hosting service. In the case of self-hosting, I confirmed that it runs well even at $5/month. For managed hosting, the price varies by service, but it is around $10/month and convenient.&lt;/p&gt;

&lt;p&gt;In fact, this is my third Ghost blog.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First. I wanted to use it for free, so I tried deploying it on the &lt;a href="https://fly.io/?ref=sanghunkang.com" rel="noopener noreferrer"&gt;fly.io&lt;/a&gt; free tier. Since the storage was 1GB, it was not sustainable. If it is for a profile or landing page, this method might still be fine. If you want to try deploying on fly.io, &lt;a href="https://blixtdev.com/how-to-host-a-ghost-blog-for-free-on-fly-io/?ref=sanghunkang.com" rel="noopener noreferrer"&gt;this post&lt;/a&gt; explains the process in detail.&lt;/li&gt;
&lt;li&gt;Second. I self-hosted it on a &lt;a href="https://www.vultr.com/?ref=9607023-8H" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt; $5/month instance. Self-hosting itself is not difficult. If you use &lt;a href="https://m.do.co/c/8ed4f19a5bde?ref=sanghunkang.com" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;'s &lt;a href="https://marketplace.digitalocean.com/apps/ghost?refcode=8ed4f19a5bde&amp;amp;ref=sanghunkang.com" rel="noopener noreferrer"&gt;Official Ghost Droplet&lt;/a&gt;, you can deploy it right away even if you do not know anything. Self-hosting was not difficult, but to use the newsletter feature I had to configure &lt;a href="https://www.mailgun.com/?ref=sanghunkang.com" rel="noopener noreferrer"&gt;Mailgun&lt;/a&gt; myself, and various small issues kept coming up, such as certificate expiration. None of it was particularly hard, and I could deal with it, but a lot of my time was wasted on these minor things.&lt;/li&gt;
&lt;li&gt;Third. This blog. In the end, I paid for a managed hosting service. Why do I run a blog? To write. So the key is to focus on writing, and for that, a managed hosting service was the best option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Money talks
&lt;/h2&gt;

&lt;p&gt;After learning a bit of coding, I planned to host everything myself and try attaching all sorts of plugins, but the resources required for operations were greater than I expected, and for me, a managed service was the right answer.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building a Multilingual Ghost Blog
&lt;/h1&gt;

&lt;p&gt;However, Ghost itself does not natively support multilingual features. I bought several paid themes that claimed to support multiple languages, but they only offered half-baked functionality. Their approach was to create two Ghost blogs, set each one to a different language, and then tie them together under a single domain (in other words, making a separate English blog and Korean blog and combining them under one domain). But then you have to use two CMSs as well, right? I really did not like that approach. In the end, I decided to build it myself. It is not particularly difficult.&lt;/p&gt;

&lt;p&gt;The approach I chose is as follows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I solve everything in the theme without touching Ghost Core. In other words, it can be applied even if you are not self-hosting.&lt;/li&gt;
&lt;li&gt;You only need one Ghost blog. This is not a method that uses multiple Ghost blogs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I figured someone out there might have the same needs as me, so I decided to organize the trial-and-error process I went through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next post&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sanghunkang.com/multilingual-ghost-cms-1-post-page-en/" rel="noopener noreferrer"&gt;Multilingual Ghost CMS Blog: 1. Making Posts and Pages Multilingual&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ghost can create a Collection of specific posts. Let's create tags for each language we want to support and make a Collection for each one to build a multilingual blog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sanghunkang.com/multilingual-ghost-cms-1-post-page-en/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe8wb3fp165yn2uh893vj.png" alt="Multilingual Ghost CMS Blog: 1. Making Posts and Pages Multilingual" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published by &lt;a href="https://sanghunkang.com/author/sanghun/" rel="noopener noreferrer"&gt;Sanghun Kang&lt;/a&gt; on &lt;a href="https://sanghunkang.com/multilingual-ghost-cms-0-en/" rel="noopener noreferrer"&gt;Sanghun's Blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>software</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Running Uniswap Frontend Locally for Testnet Environment</title>
      <dc:creator>Sanghun Kang</dc:creator>
      <pubDate>Sat, 26 Sep 2026 11:57:18 +0000</pubDate>
      <link>https://dev.to/sanghunkang/running-uniswap-frontend-locally-for-testnet-environment-192l</link>
      <guid>https://dev.to/sanghunkang/running-uniswap-frontend-locally-for-testnet-environment-192l</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focd24usr4lpwdkr5t2t2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focd24usr4lpwdkr5t2t2.png" alt="Running Uniswap Frontend Locally for Testnet Environment" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Uniswap in a testnet environment is simple. You can change the network of the connected wallet to a testnet or specify the chain in the query string. For example, if you want to use Uniswap on the Ethereum Sepolia testnet, you can use the following URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.uniswap.org/swap?chain=sepolia&amp;amp;ref=sanghunkang.com" rel="noopener noreferrer"&gt;https://app.uniswap.org/swap?chain=sepolia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, the current Uniswap web interface does not work properly in the Sepolia testnet environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9uv3by1t3kmk0m1xgbml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9uv3by1t3kmk0m1xgbml.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uniswap Sepolia issues
We do have Sepolia v3 setup, although the Sepolia testnet is currently having issues in the Uniswap app. The developers are aware, and a fix is planned. Currently, there is no estimation for this completion.

Here is an older version without the bug. (two links are the same version, just different types of IPFS routing as some browsers will only use one) 
The v2 setup here is broken, please don’t use the v2. v2 is currently not available.
Verify these are official here.
Version 1 link 1
Version 1 link 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This issue first occurred earlier this year, and I have been waiting for it to be resolved, but it has been neglected for almost half a year. I tried to access an older version of Uniswap that was provided in the official Discord, but it also doesn't work. The URL listed as 'Official here' is &lt;a href="https://github.com/Uniswap/interface/releases?page=3&amp;amp;ref=sanghunkang.com" rel="noopener noreferrer"&gt;https://github.com/Uniswap/interface/releases?page=3&lt;/a&gt;, but it is unclear which version it refers to due to the passage of time. Which version on page 3?🧐&lt;/p&gt;

&lt;p&gt;The Uniswap Interface is open source and available on GitHub. However, even following the guide, it still does not work properly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Uniswap/interface?ref=sanghunkang.com" rel="noopener noreferrer"&gt;GitHub - Uniswap/interface: 🦄 Open source interfaces for the Uniswap protocol&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have documented the process of running the Uniswap Interface locally and confirming that it works well in the testnet environment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Issues and Solutions:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;.env.defaults does not exist&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Solution: Create .env.defaults in the root folder&lt;/li&gt;
&lt;li&gt;Reference: &lt;a href="https://github.com/Uniswap/interface/issues/7678?ref=sanghunkang.com" rel="noopener noreferrer"&gt;https://github.com/Uniswap/interface/issues/7678&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;apps/web/src/utils/generated does not exist&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Solution: Create it manually&lt;/li&gt;
&lt;li&gt;Reference: &lt;a href="https://github.com/Uniswap/interface/issues/7631?ref=sanghunkang.com" rel="noopener noreferrer"&gt;https://github.com/Uniswap/interface/issues/7631&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There are versions that work well in the testnet environment and versions that have issues. Below are the versions I have tested. I am currently using version 5.19.3.

&lt;ul&gt;
&lt;li&gt;Works well in testnet&lt;/li&gt;
&lt;li&gt;5.17.0&lt;/li&gt;
&lt;li&gt;5.19.1&lt;/li&gt;
&lt;li&gt;5.19.3&lt;/li&gt;
&lt;li&gt;Does not work in testnet&lt;/li&gt;
&lt;li&gt;5.27.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Below is the script I used.
&lt;/h3&gt;

&lt;p&gt;Copy and paste this as it is, and it should work fine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/Uniswap/interface
cd interface
git fetch --all --tags
git checkout tags/web/5.19.3
mkdir apps/web/src/utils/__generated__  # https://github.com/Uniswap/interface/issues/7631
# create .env.defaults file under project root.
# https://github.com/Uniswap/interface/issues/7678
cat &amp;lt;&amp;lt;EOL &amp;gt; .env.defaults
ALCHEMY_API_KEY='key'
AMPLITUDE_EXPERIMENTS_DEPLOYMENT_KEY='key'
APPSFLYER_API_KEY='key'
APPSFLYER_APP_ID="123"
FIAT_ON_RAMP_API_URL='https://api.uniswap.org'
MOONPAY_API_KEY='key'
MOONPAY_API_URL='https://api.moonpay.com'
MOONPAY_WIDGET_API_URL='https://api.moonpay.com'
INFURA_PROJECT_ID="123"
ONESIGNAL_APP_ID="123"
QUICKNODE_BNB_RPC_URL='https://api.uniswap.org'
SENTRY_DSN='http://sentry.com'
SHAKE_CLIENT_ID="123"
SHAKE_CLIENT_SECRET="123"
SIMPLEHASH_API_KEY='key'
SIMPLEHASH_API_URL='https://api.simplehash.com'
STATSIG_PROXY_URL='https://api.statsig.com'
TEMP_SCANTASTIC_URL='https://api.uniswap.org'
TRADING_API_KEY='key'
TRADING_API_URL='https://api.uniswap.org'
UNISWAP_API_KEY='key'
UNISWAP_API_BASE_URL='https://api.uniswap.org'
UNISWAP_APP_URL='https://app.uniswap.org'
WALLETCONNECT_PROJECT_ID="123"
UNITAGS_API_URL='https://api.uniswap.org/unitags'
FIREBASE_APP_CHECK_DEBUG_TOKEN='token'
EOL

yarn
yarn web start
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff072z87monj2xh17sg7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff072z87monj2xh17sg7q.png" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://sanghunkang.com/running-uniswap-frontend-locally-for-testnet-environment-en/" rel="noopener noreferrer"&gt;Sanghun Kang’s blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>webdev</category>
      <category>blockchain</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
