<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: faithraven</title><link>https://news.ycombinator.com/user?id=faithraven</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 07 Oct 2026 00:08:57 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=faithraven" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>Sorry to disappoint, but I did. Multiple times, across multiple days.</p>
]]></description><pubDate>Tue, 06 Oct 2026 17:47:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=49981765</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49981765</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49981765</guid></item><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>My lacklustre writing skills aside, that garbage needs to be called what it is.<p>It is either satire designed to grab engagement by shocking people, or the genuine anti-AI frustration of a mediocre writer who has realised they've lost their edge, because their work isn't worth paying for over AI.<p>The people winning literary awards will keep winning them with their manual writing, and they will keep making good money ghostwriting.<p>But my article, which is meant to communicate some software features in decent, readable prose, isn't worth $10k of ghostwriting. AI will have to do. So you go get, sir, and please stop gatekeeping! (Not you specifically, you get my drift.)<p>The Economist recently published a piece on this very subject, too, and I found it a good listen: <a href="https://www.economist.com/by-invitation/2026/09/07/this-article-wasnt-written-by-an-ai-so-what-if-it-had-been" rel="nofollow">https://www.economist.com/by-invitation/2026/09/07/this-arti...</a></p>
]]></description><pubDate>Tue, 06 Oct 2026 17:44:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=49981741</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49981741</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49981741</guid></item><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>And plugs. Don't forget the plugs! Everyone loves their smart plugs :)</p>
]]></description><pubDate>Tue, 06 Oct 2026 16:54:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=49981102</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49981102</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49981102</guid></item><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>That XOR protocol is a different one, and older than anything in the article. It is the original TP-Link Smart Home protocol used by the Kasa line (HS100, HS110 and similar): JSON on port 9999, obfuscated with an XOR autokey cipher, with no authentication at all.<p>Tapo devices never spoke it. Their original protocol was an AES passthrough over HTTP, KLAP replaced that in 2023, and TPAP is the newest. As far as I know, newer Kasa hardware and firmware moved to KLAP as well, which would explain why your access method stopped working on the newer ones. My library only covers Tapo devices; for Kasa, python-kasa is the one to look at.<p>On the cloud: the devices do have to be set up through the phone app with a TP-Link cloud account. Once set up, though, most functions of most devices can be used locally through the library, with neither the devices nor the library having internet access. The main catch is credentials: if you change the account password, for example, the devices need to be online for a little while to pick up the new one.</p>
]]></description><pubDate>Tue, 06 Oct 2026 16:53:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=49981085</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49981085</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49981085</guid></item><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>Without admitting to anything, I was surprised by how little time it took to add support for the new protocol to the library. And I didn't even need an MCP server.</p>
]]></description><pubDate>Tue, 06 Oct 2026 15:06:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=49979619</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49979619</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49979619</guid></item><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>I did my best with the writing, but it clearly didn't land for the two of you. Could you point to one thing, or one pattern, that bothered you most? That would help me improve it.</p>
]]></description><pubDate>Tue, 06 Oct 2026 14:41:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49979257</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49979257</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49979257</guid></item><item><title><![CDATA[New comment by faithraven in "Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol"]]></title><description><![CDATA[
<p>Author here. tapo is an unofficial Rust client library for TP-Link Tapo devices (plugs, lights, hubs, cameras), with a Python wrapper built on the same crate. It is not affiliated with TP-Link.<p>The short version: since late 2025, firmware updates have made Tapo devices refuse third-party clients unless you turn on a "Third-Party Compatibility" switch in the Tapo app. The switch works by bringing back the older login, KLAP. With it off, devices speak an undocumented protocol called TPAP, which logs in with SPAKE2+ (RFC 9383). The library now speaks TPAP, so the switch can stay off.<p>The part I found most interesting is the security difference. A recorded KLAP login can be used to test password guesses offline. With SPAKE2+ it can't, and learning the password later doesn't decrypt sessions captured earlier. So the "compatibility" switch is really a security downgrade, and TP-Link's own FAQ says enabling it "may reduce the security of your devices".<p>Not everything works with the switch off yet: some cameras, such as a C210 on firmware 1.5.2, still need it on.<p>Happy to answer questions about the protocol work or the library.</p>
]]></description><pubDate>Tue, 06 Oct 2026 13:55:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=49978565</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49978565</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49978565</guid></item><item><title><![CDATA[Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol]]></title><description><![CDATA[
<p>Article URL: <a href="https://mihai.dinculescu.dev/posts/tapo-speaks-tpap/">https://mihai.dinculescu.dev/posts/tapo-speaks-tpap/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49978563">https://news.ycombinator.com/item?id=49978563</a></p>
<p>Points: 125</p>
<p># Comments: 60</p>
]]></description><pubDate>Tue, 06 Oct 2026 13:55:37 +0000</pubDate><link>https://mihai.dinculescu.dev/posts/tapo-speaks-tpap/</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49978563</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49978563</guid></item><item><title><![CDATA[New comment by faithraven in "Two Git ignore files nobody told me about"]]></title><description><![CDATA[
<p>Thanks, but I think it's the other way round. The docs, the published JSON schema and the binary itself all spell it respectGitignore, lowercase i, named after the .gitignore file. <a href="https://code.claude.com/docs/en/settings-reference#respectgitignore" rel="nofollow">https://code.claude.com/docs/en/settings-reference#respectgi...</a></p>
]]></description><pubDate>Wed, 23 Sep 2026 14:58:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=49817172</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49817172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49817172</guid></item><item><title><![CDATA[New comment by faithraven in "Two Git ignore files nobody told me about"]]></title><description><![CDATA[
<p>That's a great shout. With more than one ignore file in play, this command is gold.</p>
]]></description><pubDate>Wed, 23 Sep 2026 14:29:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=49816762</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49816762</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49816762</guid></item><item><title><![CDATA[New comment by faithraven in "Two Git ignore files nobody told me about"]]></title><description><![CDATA[
<p>You might be surprised, it's sort of possible. Ask your favourite AI agent about git clean filters, and .git/info/attributes, the per-clone sibling of .git/info/exclude. The docs are here: <a href="https://git-scm.com/docs/gitattributes#_filter" rel="nofollow">https://git-scm.com/docs/gitattributes#_filter</a></p>
]]></description><pubDate>Wed, 23 Sep 2026 14:01:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=49816325</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49816325</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49816325</guid></item><item><title><![CDATA[New comment by faithraven in "Two Git ignore files nobody told me about"]]></title><description><![CDATA[
<p>I'd wager a small sum that git is the tool most of us learned by accident, some of them fortunate, some less so. Thankfully, this one was the former.</p>
]]></description><pubDate>Wed, 23 Sep 2026 13:55:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49816247</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49816247</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49816247</guid></item><item><title><![CDATA[New comment by faithraven in "Two Git ignore files nobody told me about"]]></title><description><![CDATA[
<p>Until Claude suggested .git/info/exclude, it never crossed my mind to question how ignoring worked. A search would have answered it in seconds, but you have to think to ask first. I didn't, and I suspect most people don't either. Especially with git, which nearly everyone learns by doing; very few of us ever sit down and learn it properly.
That's why I wrote it up: so a few more people can learn this the way we learn everything else in git, by accident.<p>Now that you mention it, I should add a link to those docs in the article. Thanks!</p>
]]></description><pubDate>Wed, 23 Sep 2026 13:53:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=49816222</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49816222</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49816222</guid></item><item><title><![CDATA[Two Git ignore files nobody told me about]]></title><description><![CDATA[
<p>Article URL: <a href="https://mihai.dinculescu.dev/posts/two-git-ignore-files-nobody-told-me-about/">https://mihai.dinculescu.dev/posts/two-git-ignore-files-nobody-told-me-about/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49814432">https://news.ycombinator.com/item?id=49814432</a></p>
<p>Points: 95</p>
<p># Comments: 66</p>
]]></description><pubDate>Wed, 23 Sep 2026 11:28:47 +0000</pubDate><link>https://mihai.dinculescu.dev/posts/two-git-ignore-files-nobody-told-me-about/</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49814432</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49814432</guid></item><item><title><![CDATA[New comment by faithraven in "Bums in Seats Used to Win"]]></title><description><![CDATA[
<p>Author here. The argument, compressed: headcount beat talent for fifty years because one great engineer could only type so fast. Brooks' surgical team (one surgeon, nine support roles) was the right structure and nobody could justify nine salaries that produced nothing a CFO could see. Agents made the nine cheap, but they only replaced the hands, not the pushback, the memory or the pipeline. Which is also why the rockstar engineer shouldn't come back, and probably will anyway. The rest of the piece is about which seats go and what happens to the people who used to arrange them.<p>Happy to be told where it's wrong.</p>
]]></description><pubDate>Tue, 15 Sep 2026 11:45:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=49711069</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49711069</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49711069</guid></item><item><title><![CDATA[Bums in Seats Used to Win]]></title><description><![CDATA[
<p>Article URL: <a href="https://mihai.dinculescu.dev/posts/bums-in-seats-used-to-win/">https://mihai.dinculescu.dev/posts/bums-in-seats-used-to-win/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49710925">https://news.ycombinator.com/item?id=49710925</a></p>
<p>Points: 1</p>
<p># Comments: 1</p>
]]></description><pubDate>Tue, 15 Sep 2026 11:30:47 +0000</pubDate><link>https://mihai.dinculescu.dev/posts/bums-in-seats-used-to-win/</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=49710925</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49710925</guid></item><item><title><![CDATA[New comment by faithraven in "SimConnect SDK in Rust"]]></title><description><![CDATA[
<p>I've just released a SimConnect SDK in #rustlang that encapsulates the C API fully and optimizes for developer experience. I'd love to get feedback on the DX and on what features I should add next.</p>
]]></description><pubDate>Sat, 22 Oct 2022 13:10:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=33298030</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=33298030</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33298030</guid></item><item><title><![CDATA[SimConnect SDK in Rust]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/mihai-dinculescu/simconnect-sdk">https://github.com/mihai-dinculescu/simconnect-sdk</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=33298029">https://news.ycombinator.com/item?id=33298029</a></p>
<p>Points: 1</p>
<p># Comments: 1</p>
]]></description><pubDate>Sat, 22 Oct 2022 13:10:20 +0000</pubDate><link>https://github.com/mihai-dinculescu/simconnect-sdk</link><dc:creator>faithraven</dc:creator><comments>https://news.ycombinator.com/item?id=33298029</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33298029</guid></item></channel></rss>