HNHacker News
TopNewBestAskShowJobs

tanin

706 karma · joined October 22, 2014

https://superintendent.app, SQL spreadsheet app

https://programmabletooltip.com, Programmable Tooltip for Mac

https://bookofrevenue.com, open-source revenue recognition and analytics for Stripe and Metronome

submissionscomments
tanin··on Private rooms, apartments, and sublets extracted from Facebook Groups for SF
Facebook Groups has tons of private room and sublet listings which are difficult to find elsewhere.

We support various useful filters like nearby train stations, locations, female only, price, furnishing. We also supports sorting e.g. sorting by the distance to the nearest BART station.

This might save you many hours from painfully scrolling through 10+ FB groups.

tanin··on Amazon’s “digital pacifier” for toddlers
I wish people should just avoid talking about using tablets on flights altogether.

It's a non-issue. Toddlers/kids maybe fly once a month max. Using tablets during that time is negligible.

tanin··on UUIDv7: Timestamps aren’t time-ordered and other oddities
I generally avoid using UUID unless there's a strong reason for it.

I know the conventional wisdom says that the collisions are extremely rare <<insert some sort of cosmis analogy>>. Then, some reddit users reported encountering a collision: https://www.reddit.com/r/webdev/comments/1kvkxte/comment/mud...

Ultimately, we'd have to design the system to handle collision anyway. Might as well design a system to avoid collision in the first place. Then, if we have a system that avoids collision, then whether UUID is used is irrelevant.

tanin··on <input type="password" maxlength="20"> prevents me from logging into Vanguard
At least not 20 characters. My generated password isn't insane. It is 4 words with delimiters, so the length varies between 20-28 characters.
tanin··on <input type="password" maxlength="20"> prevents me from logging into Vanguard
My 1password actually generates 4 random words with symbols and numbers as delimiters. A generated password is often ~24 characters.
tanin··on Footguns with Postgres “at time zone 'UTC'”
I didn't know trailing slash didn't on my website. I'll fix this. Thank you for pointing it out.
tanin··on Footguns with Postgres “at time zone 'UTC'”
Author here

Wow, thank you for testing it. I did test it on my own laptop (Seattle).

> date_add(b.month_start, interval '1 month', 'UTC')

I didn't know this. Thank you.

tanin··on Ask HN: What are you working on? (September 2026)
I'm working on an open-source, self-hosted revenue recognition and analytics for Stripe.

Here: https://bookofrevenue.com

To my surprise, I think it's the first open-source revenue analytics for Stripe.

I worked at Stripe building both revenue recognition and analytics, and I always wanted to build an open-source version of those. Finally, I had the time to do it.

Bonus: Revenue is not MRR nor payments: https://medium.com/@tanin47/revenue-is-not-mrr-nor-payments-...

tanin··on Ask HN: Who wants to be hired? (August 2026)
I'm offering a consulting service for integrating with Stripe Revenue Recognition.

I'll help set it up correctly including improving your billing integration that will work well for both revenue recognition and tax integration.

Email: tanin (at) nanakorn.com

tanin··on Study suggests most Americans would be healthier without daylight saving time (2025)
With DST, there are actually 2 new concepts: ambiguous time (if the clock rolls back) and invalid time (if the clock jumps forward).

Java and Ruby work differently. Java would simply round the invalid time to the closest valid time IIRC. Ruby would accurately raise the InvalidTime exception. Same behaviors for an ambiguous time.

Chile is actually the country that will cause tricky issue in a system because they adjust DST at midnight... so there is one day a year where its midnight is considered invalid time. If we are building a system that depends on a day's boundary, then we will encounter this nightmarish issue where one of the days must start at 1am instead of midnight.

I really hope DST is going away soon.

tanin··on Show HN: Cowork/Codex DOCX plugin. Uses 2x fewer tokens than the docx skill
Thank you!
tanin··on Show HN: Cowork/Codex DOCX plugin. Uses 2x fewer tokens than the docx skill
Please let me know if you have questions or suggestions.
tanin··on Midjourney Medical
I had to check whether this was some kind of an april fool joke.

It looks like a legit attempt. Wow. This is insanely innovative.

tanin··on Show HN: Cowork/Codex DOCX plugin. Uses 2x fewer tokens than the docx skill
Thank you!

My thesis is that an intermediate layer would eventually end up being equivalent to the docx format, so I've decided not to have any intermediate representation.

We convert docx to html and send it AI. When AI rewrites the HTML and it back, we diff the rewritten HTML against the docx's document.xml and make the modification. This is a simplistic explanation of it. There are a bunch of validations and processing going on.

Regarding the tracked changes/comments, we simply invent new HTML tags for those things e.g. <ins>, <del>, <commentRangeStart> and etc.

tanin··on Ask HN: What are you working on? (June 2026)
I'm working on a Cowork/Codex plugin for reading and manipulating docx files. It uses 2-5x fewer tokens compared to the Anthropic's docx skill and is much faster.

The main target users are lawyers who redlines and drafts legal documents, and they almost always use docx.

It can be used together with Claude For Legal; The combination is pretty magical.

Here's the plugin: https://github.com/LegalRabbit-AI/legalrabbit-docx-claude-pl...

tanin··on MCP is dead?
The AI probably can figure out. However, Claude Code and other tools are built to support MCP. This means MCP is probably more reliable than using REST API + llms.txt.
tanin··on MCP is dead?
If you build connectors for yourself or your team, you probably can skip MCP because you can tell your friends to install CLI or whatever and provide extra prompts for your CLI.

If you have external users, then you have to use MCP, which comes with how to use each endpoint and etc. MCP is what their current apps e.g. Cowork, Cursor support out-of-the-box.

In that sense, MCP is very much not dead

tanin··on Ruby vs. Java vs. TypeScript: my experience on building a Cowork DOCX plugin
DOCX or OOXML takes it to another level.

Instead of making something an attribute, they make it a child element...

tanin··on Ruby vs. Java vs. TypeScript: my experience on building a Cowork DOCX plugin
Yeah, I try to avoid 3rd party libraries unless it comes from credible sources/companies or vetted by famous frameworks e.g. Rails uses it.

Not just for NPM but for Intellij plugin, VSCode extension, and etc.

If Node has officially pre-vetted libraries, that would be really awesome.

tanin··on Ruby vs. Java vs. TypeScript: my experience on building a Cowork DOCX plugin
I forgot to provide the link in the tldr at the top. I'll do that. Thank you for the feedback.
tanin··on Ruby vs. Java vs. TypeScript: my experience on building a Cowork DOCX plugin
(The author of the blog here)

To clarify this: we don't intend to open-source it. There's no source code.

The only reason we need a github repo is because Claude Code/Cowork requires a plugin to be a github repo, which contains the plugin configuration.

Moreover, our users are lawyers. They don't have Node/Python runtime i.e. unable to run code. They need a single-file executable.

tanin··on Today I've made the difficult decision to reduce the size of Coinbase by ~14%
It's a nice spin. The AI is so productive that we can cut people. Not "revenue is down, so we have to cut people"
tanin··on Ask HN: Who wants to be hired? (May 2026)
Location: Remote

Remote: Yes

Willing to relocate: No

Technologies: anything works.

Resume: https://www.linkedin.com/in/taninnanakorn

I'm an ex-Stripe engineer with extensive knowledge in technical accounting, revenue recognition, and financial analytics.

I'm looking for a consulting gig where I can help your company integrate with Stripe from end-to-end (from payment to reporting to closing the book), so you can get accurate financial reports, and your accountant/controller can be happy.

Please contact me on LinkedIn if you are interested.

tanin··on Ask HN: What Are You Working On? (April 2026)
I've recently found the best way to find an apartment to rent in Bangkok. It's the Facebook Groups. Tons of owners post their listings there.

So, I've built a scraper that scrapes posts from Facebook Groups and made those posts filterable/sortable.

Now I'm looking to launch the same thing for US cities. Their Facebook Groups have tons of posts around subleasing/looking for accommodations.

If you are interested, here's the site for Bangkok: https://bangkokprop.com

tanin··on Bangkok rentals extracted from Facebook Groups
Yes, Facebook Groups is the go-to place, especially if you want to interact with the owners directly. It has become a major player in real estate listing.
tanin··on Pebble Production: February Update
Yup, I want to set a destination, walk, and only look at my watch for direction.
tanin··on Pebble Production: February Update
Is there a watch that looks like Pebble or Garmin Venu (e.g. small and square) that is good for navigation? I want to walk and look at the watch to see which direction to go next. It would be great for traveling in a foreign city.
tanin··on Java desktop apps with web front end (Angular, react)
I've built a similar framework called Java Electron (https://github.com/tanin47/java-electron).

Java as the backend, and JS as the frontend.

It actually uses WebView, not Chromium.

The most important feature is: Java Electron can be published on Apple App Store and Microsoft Store. This requires proper code-signing and etc.

Backdoor, a modern database tool, is a showcase for it: https://github.com/tanin47/backdoor

tanin··on Ask HN: What are you working on? (January 2026)
It seems there are at least 2 users who need it ;)
tanin··on Ask HN: What are you working on? (January 2026)
They are similar except that Netlify's Form transforms your forms into its own thing. This makes it more difficult to customize the after actions because you don't control the final code. Note that Netlify does offer limited customization of the after actions as you can see here: https://docs.netlify.com/manage/forms/setup/#success-message...

Any alternative that is hosted or uses iframe will encounter this kind of frictions.

In comparison, with Wait, you'd just call `fetch(...)` and do whatever you need after `fetch(..)` succeeds or fails. For example, one landing page might say thank you afterward. Another landing might show the installation instructions after the user submits their emails. The whole code is controlled by you.

It's like you call your own backend except it's hosted in a different domain, and your landing page can be hosted as a static site with no backend.

If you are interested in trying it out, I'd love to work with you to make it successful for you. Thank you!

Page 1 of 9Next →