<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://hashcott.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://hashcott.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-10-11T03:42:07+07:00</updated><id>https://hashcott.github.io/feed.xml</id><title type="html">Nguyễn Đức Hạnh</title><subtitle>I build small tools that make life easier. Full-stack dev, Go and TypeScript.</subtitle><author><name>Nguyễn Đức Hạnh</name><email>duchanhstyle@gmail.com</email></author><entry><title type="html">Ghostline 0.7.0, one-click updates</title><link href="https://hashcott.github.io/2026-10-11-ghostline-0-7-0/" rel="alternate" type="text/html" title="Ghostline 0.7.0, one-click updates" /><published>2026-10-11T00:00:00+07:00</published><updated>2026-10-11T00:00:00+07:00</updated><id>https://hashcott.github.io/ghostline-0-7-0</id><content type="html" xml:base="https://hashcott.github.io/2026-10-11-ghostline-0-7-0/"><![CDATA[<p><a href="https://github.com/hashcott/ghostline">Ghostline</a> 0.7.0 is out. Highlights:</p>

<ul>
  <li><strong>One-click updates (Windows installer).</strong> When a new version is available, click <strong>update to vX</strong> on the main screen, in Settings or in the system tray. Ghostline downloads the installer, checks it against the release’s signed <code class="language-plaintext highlighter-rouge">SHA256SUMS</code>, installs over the current version and reopens, reconnecting if you were connected. No uninstall needed, and your settings are kept.</li>
  <li><strong>Coming from 0.6.3 or older:</strong> run the new installer over your current install once. From 0.7.0 on, the update button does this for you.</li>
  <li><strong>Beta builds.</strong> Turn on <em>Receive beta versions</em> in Settings to get pre-release builds earlier (off by default).</li>
  <li><strong>Download page:</strong> <a href="https://hashcott.github.io/ghostline/">hashcott.github.io/ghostline</a> picks the right file for your machine, with a guide, FAQ and changelog.</li>
</ul>

<p>Full details are in the <a href="https://github.com/hashcott/ghostline/releases/tag/v0.7.0">release notes</a>.</p>]]></content><author><name>Nguyễn Đức Hạnh</name><email>duchanhstyle@gmail.com</email></author><summary type="html"><![CDATA[Ghostline 0.7.0 is out. Highlights:]]></summary></entry><entry><title type="html">Ghostline 0.8.0, terms of use</title><link href="https://hashcott.github.io/2026-10-11-ghostline-0-8-0/" rel="alternate" type="text/html" title="Ghostline 0.8.0, terms of use" /><published>2026-10-11T00:00:00+07:00</published><updated>2026-10-11T00:00:00+07:00</updated><id>https://hashcott.github.io/ghostline-0-8-0</id><content type="html" xml:base="https://hashcott.github.io/2026-10-11-ghostline-0-8-0/"><![CDATA[<p><a href="https://github.com/hashcott/ghostline">Ghostline</a> 0.8.0 is out. Highlights:</p>

<ul>
  <li><strong>Terms of use, accepted once.</strong> The first time you open 0.8.0 (also right after updating), Ghostline shows its terms of use instead of the interface. Read them to the end, tick the box and choose <em>agree and continue</em>, or <em>disagree, quit</em>. Your answer stays on your computer and is not copied by settings backups.</li>
  <li><strong>What Ghostline is for.</strong> The app, the download page and the guides now describe it plainly: encrypted DNS your network cannot read or spoof, and protection against DPI interference with connections to lawful sites. A few labels changed to match, for example <em>auto when blocked</em> is now <em>auto on interference</em>.</li>
  <li><strong>Use it within the law.</strong> The terms and the <a href="https://github.com/hashcott/ghostline#disclaimer">disclaimer</a> ask you to follow the law where you live. That includes not reaching sites blocked under the law, and not showing others how to.</li>
  <li><strong>Updating:</strong> from 0.7.0 on, click <strong>update to v0.8.0</strong> in the app. Otherwise get it from the <a href="https://hashcott.github.io/ghostline/">download page</a>.</li>
</ul>

<p>Full details are in the <a href="https://github.com/hashcott/ghostline/releases/tag/v0.8.0">release notes</a>.</p>]]></content><author><name>Nguyễn Đức Hạnh</name><email>duchanhstyle@gmail.com</email></author><summary type="html"><![CDATA[Ghostline 0.8.0 is out. Highlights:]]></summary></entry><entry><title type="html">Hello, world</title><link href="https://hashcott.github.io/2026-10-11-hello-world/" rel="alternate" type="text/html" title="Hello, world" /><published>2026-10-11T00:00:00+07:00</published><updated>2026-10-11T00:00:00+07:00</updated><id>https://hashcott.github.io/hello-world</id><content type="html" xml:base="https://hashcott.github.io/2026-10-11-hello-world/"><![CDATA[<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="s">"fmt"</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Hello, world"</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Every programmer’s first program says the same thing. It’s a strange tradition when you think about it: before we know how to do anything useful, we teach the machine to wave.</p>

<p>So, hello. I’m Hạnh.</p>

<h2 id="the-first-edit">The first edit</h2>

<p>I didn’t come to code through a class or a book. I came to it through a borrowed phone.</p>

<p>My dad owned a Nokia 3110C, and I used it, without asking, to play games. Downloads crawled in over 2G, and more than once a “free” game turned out to be a trap that quietly charged an SMS fee. Somewhere in that world of cheap WAP pages I found a forum post that showed how to open a game’s <code class="language-plaintext highlighter-rouge">.jar</code> file and change what was inside.</p>

<p>I changed some text in Ninja School, repackaged it, and it ran. Nothing I’ve shipped since has felt quite as magical as seeing my own words appear inside someone else’s game.</p>

<h2 id="learning-by-breaking-things">Learning by breaking things</h2>

<p>What followed was years of tinkering with no plan. I rewrote dialogue and weapon names in games to impress my friends. I built WAP sites on Xtgem and WapSeo by uploading code I didn’t understand, watching it fail, and trying again until it didn’t. HTML and CSS sank in by repetition rather than study. Pascal and C showed up in high school. Then the platforms I’d been playing on shut down, and I drifted away from it for a while.</p>

<h2 id="a-second-start">A second start</h2>

<p>University began with a disappointment: I missed my first choices and landed in the IT program at Thuyloi University. It turned out to be the right place.</p>

<p>In my first year I joined the Student Informatics Contest with almost nothing to my name but loops and conditionals. My teacher, Mr. Trương Xuân Nam, took a chance on me anyway. A month of daily practice later I was competing at the National Student Olympiad in Informatics, and I left with third prize. That result taught me something I still rely on: starting behind is not the same as staying behind.</p>

<p>From there I went through Python, Node.js and PHP, built things with Laravel, and started working as a web developer.</p>

<h2 id="what-i-do-now">What I do now</h2>

<p>Today I’m a full-stack developer in Hanoi, mostly writing Go and TypeScript. What I enjoy most is the same thing that hooked me on that Nokia: taking something that bothers me and making it behave. Lately that has meant encrypted DNS that just works, steadier ping for games, a better webcam on Linux, and MCP servers that let AI agents talk to real tools. They’re all on the <a href="/#projects">home page</a>.</p>

<p>I also spend a lot of my day working alongside AI agents such as Claude Code, Codex and Cursor, and I expect to write about that here.</p>

<p>This site is where I’ll announce new releases and share what I learn along the way. Thanks for reading the first post.</p>]]></content><author><name>Nguyễn Đức Hạnh</name><email>duchanhstyle@gmail.com</email></author><category term="misc" /><summary type="html"><![CDATA[```go package main]]></summary></entry></feed>