News for hackers. Stuff that matters.

jeffnash

I agree the gap is narrowing quickly, especially with workflows in CC. For me, a few large advantages still remain:

1/ Allowing me to easily plug in any harness, using any provider, and make it a first-class worker. Omnigent has out of the box ACP support and it's trivial to use that to add first-class support for any harness out there. I love the ability to have CC + Opus plan, Codex + Luna implement, Pi + Qwen 3.8 give a tie-breaking opinion on a design decision that Opus flagged and Grok and Codex couldn't agree on, all orchestrated by a model of my choosing from any provider using Omnigent's main agent harness.

2/ Reusable agent systems rather than just reusable workflows. You can define agents in YAML whose subagents embody particular roles, with different models/harnesses, skills, plugins, tools, etc. preconfigured for each one.

Of course, claude workflows are now durable but Omnigent's agnt definitions are a bit more abstract in that they define the subagents that are available and how they should work by default rather than the workflow itself (i.e. the specific JTBD). If I have a common workflow that consists of, for example, Sol + Codex writing some script to scrape some data, Pi + a cheap DeepSeek-tier model formatting that data en masse, then Fable + CC doing some advanced analysis on it, I can embody that with a yaml agent definition that I can then use to run with my task of the day as a prompt. All of this is orchestrated by a model of my choice using Omnigent's harness.

This might look like: 'smart scraping agent with all sorts of scraping skills and tools pre-loaded', a 'bulk data processing agent with a cheap, fast model and plenty of pandas/numpy skills preloaded', and 'frontier model to interpret and reason on the implications of the processed data'. The main agent would have instructions about the general workflow of such tasks and when to invoke and delegate tasks to which subagent. The definition describes the workers available to the orchestrator and how they should generally behave, rather than hard-coding the workflow itself. I love that I can create those definitions and re-use them.

All that said, I am sure the labs will come up with their own similar products to (2) (e.g. dots today). I also recently noticed that Claude Code now has subagent 'teams' rather than just 'general-purpose'/'explore' subagents, and these seem to be longer-lived. This seems to be encroaching on the agent yaml definitions, albeit with less fine-grained control on my end. Therefore, the tl;dr (for me at least) is vendor neutrality; I don't think we'll ever see a product coming out of a frontier lab that eagerly delegates a task to their competitor's model (and bank account).

Reminds me a lot of omnigent (which I am a huge fan of) with a persistent memory layer. Unlike omnigent's subagent threads, the DAG it uses to coordinate other harnesses doesn't look to be durable; I am curious as to whether this is by design or is a forthcoming feature, as this essentially makes or breaks my use case of long-running project-sized implementation sessions.

In any event, it's great to see competition in this meta-harness space, which is likely one that none of the frontier labs will touch since it, by definition, would utilize their competitors' products.

Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @04:31PM (#49807651)
Sorry about that, I accidentally a word (hope that reference doesn't date me)
Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @03:52PM (#49807163)
I fear the opposite will happen. Guy driving like a maniac almost side-swipes you in traffic? "Look at this 1-bit quantized Qwen 2.5 7B over here".
Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @03:42PM (#49807032)
out of curiosity, what type of code/language do you usually use flash to write?
Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @03:41PM (#49807012)
I'm actually interested to see how the token discount maps to the usage limit consumption. The conspiracy theorist in me wonders if they're making up the discount and resultant load increase on the API end by reducing effective usage on the subscription end.
Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @03:37PM (#49806961)
I realized I missed a few words here: I meant "especially when you factor in the fact that ChatGPT usage is unmetered", i.e. you get unlimited ChatGPT threads that don't eat into your codex limit
Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @03:35PM (#49806933)
I am saying that because ChatGPT usage is unlimited, I don't have to eat into my Codex limits when I use ChatGPT. Codex certainly has limits. Last time I had a Claude sub (hedging here since much of the info in my comment was outdated), my usage limits on claude.ai threads was shared with Claude Code.
Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @03:00PM (#49806382)
On usage in ChatGPT settings, I see: Plan limits Shared across Codex, Work, Workspace Agents, and ChatGPT for Excel. Chat conversations are not included.

Is this not the default anymore? I am on the (now closed) 20x plan.

Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @02:44PM (#49806155)
I actually haven't played with the GUI. I probably should now that the Linux version is in beta. My situation is kind of the reverse: I like using oracle to basically zip up my repo, ask GPT Pro to propose some sort of design or refactor based on the code, then provide a step by step implementation plan for a cheaper model to implement directly in a harness on my machine. It often takes upwards of 90 minutes to come up with something but I've never been disappointed by the results. I suppose I could do this and then save a step by referencing the oracle-created thread with the @ you mentioned

And re: the toml workaround, AWESOME! I appreciate you pointing these two things out, this is my highest-ROI HN comment thus far.

Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @02:40PM (#49806117)
I felt this way with Sol in the 5.6 series and was one of the seemingly few people on this earth who liked Terra for that reason. I would often have a very specific code-manipulation ask, e.g. "add a parameter to this method, ensure all callers pass it in, if there is not a logical way to derive the parameter to be passed in a particular instance, flag this in your final response", and Sol would go on some rabbit hole side quest to refactor my codebase to determine some way to derive it rather than flagging it as I had asked.

Terra had the "workhorse" quality where it could do these changes in bulk and follow directions without being too 'smart' (but sloppy) as you described. Luna was a bit too dumb and would make sloppy mistakes; I see that more as a "run these tests and format the results" sort of model. Maybe 6 Luna will be better.

I also just reread your comment and realized the naming convention is still extremely confusing with respect to ordering of [Family]x[Model]x[Number].

Re:GPT-6 Sol and Luna on Tuesday September 22, 2026 @02:30PM (#49805972)
At this point, the deciding factors for me between Claude Code 20x and Codex Pro 20x are:

1/ Usage limits: downstream of input/output cost, but resets and obscure windows and odd 20x plan / 5x plan != 4x usage math throw a wrench into it. Winner right now is Codex by a mile, especially when you factor in the fact that ChatGPT usage (even 6 Astra Pro) is essentially unmetered on the 20x plan. Always a bummer when asking if I should see a doctor about a rash means I can't code as much. It's also is a godsend if you use an MCP like oracle to automate the process of calling the Pro model on particularly tough problems, giving better planning results or deeper code analysis without burning usage.

2/ Context window in the harness. Claude Code wins on this. There used to be a toml file workaround for Codex to extend the GPT context window to 1m, but this stopped working on the plans and only on per-token billing (ETA: noname120 pointed out this is no longer the case and it can be enabled again [1]). 252k is just not enough. Codex's compaction is very good, fwiw, but it happens so frequently that even a model as powerful as Astra sometimes loses the plot on long-running tasks.

3/ Ability to use the plan outside of the official harness. Codex wins. Anthropic does shit like bills requests as extra usage if it sees a hermes.md in a commit.

I've subscription hopped a bunch, and at times I've had both, but I keep coming back to Codex because it wins on 2/3.

ETA: apparently I haven't been Keeping Up With the Altmans and new 20x signups have been disabled for a few weeks. I am grandfathered in, which makes the comparison above pretty much moot.

[1]https://news.ycombinator.com/item?id=49806060

Re:Towards Self-Driving Codebases on Thursday September 17, 2026 @03:39PM (#49745525)
Every place I've worked at has positioned their SEV review process as 'blameless' with respect to the engineers who created the code, processes, etc that led to the incident. On paper, it's not about pointing fingers (though I've found this to be somewhat idealistic), but about finding faults in the processes that let bad code slip through the cracks.

It will be interesting to see how the notion of 'responsibility' carries over as agents handle higher and higher levels of abstraction. Agents built using the popular frameworks of today are somewhere in between code, formerly written by engineers, and an actor (like an engineer). When an agent wrote the framework to audit and monitor ops agents who are monitoring the performance and reliability of the code that coding agents wrote, who is responsible for ultimately ensuring it doesn't happen again? Should the findings just be added to whatever RAG and a few prompts/hooks/skills changed by another agent? When does a human follow up and to what degree?

This is the sort of thing that makes me believe that software engineers will never truly go away; at the very least, they serve the very useful function of being ultimately responsible for something going wrong.

Re:Where Did All the Public Bathrooms Go? on Monday August 24, 2026 @02:48PM (#49424208)
> Who ultimately determines the meaning of a public space: its designers, authorities, or the people who use it?

Restrooms are unique in that they are available to the public but, due to their inherently private nature, are a place where it is difficult to enforce social norms. Because of this, within the confines of the restroom itself, the authorities are all but irrelevant.

I was scrolling through the addictive and easy to stumble into YouTube reels feature and came upon a livestream of a gentleman having some sort of 'public restroom party' in a stall. By this, I mean he had collected every roll of toilet paper available, shredded them into confetti, and was throwing the confetti up into the air while blasting music at full volume out of his bluetooth speaker. He had a few thousand viewers and people appeared to be donating money for supercomments. I didn't stay to watch the end of the livestream, but I don't imagine he cleaned up.

By the time the private-but-livestreamed confetti party is over, the damage is done. You can try to anticipate every single unwanted activity in a restroom and try to prevent it beforehand (e.g. tinted lights to prevent IV drug use), but someone, somewhere will find a way to creatively make the owners decide a few frustrated customers who are told "no public restroom" is a small price to pay for the alternative.

Agreed 100% for the consumer case: an empty chatbox is just about the least sticky surface I could ever imagine. I saw a mobile interstitial ad for Kimi recently whose hook was basically "Tired of paying for expensive ChatGPT? Download the Kimi app, it's the same thing but cheaper". I myself bounce between token subscriptions like no one's business and use Pi/OMP for maximum model flexibility when coding (and it's a few env variables or lines of (TO|YA)ML|JSON to switch providers in Codex, Grok Build, CC). I even self-host and try to use OpenWebUI + CLIProxyAPI when I can for all my chats.

Enterprise is a whole different ballgame IMO with countless technical, compliance, and employee adoption considerations that add friction to switching. It's also where both Anthropic and (as of last week) OpenAI get the bulk of their revenue, and, incidentally, the venue where US Government regulations on Chinese models would have the most impact.

Hasn't it always been the premise that intelligence would get cheaper? To me, on the enterprise side, it seems like firms are finally getting the memo that, whether you are locked into the Ant/OAI ecosystem or not, you don't need the smartest, most expensive model to do every single task. This is a good thing for overall adoption. Whether that trickles down into regular user behavior, especially with subscription pricing, remains to be seen; even though I intellectually know I don't need Sol for a simple refactor, I am sometimes hesitant to choose Luna/Terra, as it's hard to accept using something positioned, even implicitly, as 'worse'. Remembering that the smaller models tend to be faster is what usually pushes me over the edge.

Anthropic in particular is much more compute-constrained than OpenAI and SpaceXAI and has relied on partnerships to provide inference. This reality factors into their pricing and usage limits (they started 'adjusting' the 5-hour limits during peak hours, and it certainly wasn't an upward adjustment). Accordingly, this is presumably what Anthropic wants, given they develop and release the lower-end models, suggest users use them in various nudges within their product, position the bigger/more expensive models as "For the most complex tasks" in their UIs, and so on.

Re:The AI Credit Resale Economy on Sunday August 16, 2026 @03:45PM (#49323013)
I swear every time I think I have a unique tweak for an OSS tool, it turns out someone else did it. I forked CLIProxyAPI myself to add something similar, though my implementation is closer to a provider-egress DLP layer and it's intended for API keys and the like, not PII. It uses gitleaks but also supports reversible redaction so a secret that's flagged can be replaced with a placeholder before CLIProxyAPI sends the request to the provider and then any instances of that placeholder can be rehydrated in the response to the caller.

Since it modifies logic across the full request/response lifecycle, I unfortunately couldn't implement it cleanly with the existing plugin API.

Re:Ask HN: Why don't we see ARM laptops from China? on Saturday August 15, 2026 @01:10PM (#49312317)
I have a Honor MagicBook Art with a Snapdragon X Elite I got off of Aliexpress and love it. It's only available in China and the EU AFAIK. The seller initially sent me a Thinkpad with a Pentium III, claimed it was a 'mistake', and said they were sending me the correct order. I was doubtful, but sure enough, it came. Battery life is amazing and the thing is really well-made.
Re:AI Driven Testing on Saturday August 15, 2026 @04:06AM (#49308721)
I didn't end up needing to go full scrcpy because my use case just runs Android in an emulator (Waydroid) for my Hermes agent to run apps. If I need vision or (x,y) coordinate interaction, I can just screenshot the emulator window and interact via ADB. However, I ended up using the accessibility tree to create a semantic, ephemeral ref API as the preferred mechanism for interaction. Basically more 'Playwright for Android' than 'Remote Desktop for Android'. But, unfortunately, the accessibility tree is often incomplete or inaccurate.

https://www.djfa.ai/articles/clawdroid

Re:AI Driven Testing on Saturday August 15, 2026 @12:58AM (#49307770)
What was the modality of interpreting the UI/interacting with the phone via ADB? Did you/your agent use screenshots + vision model to essentially target coordinates on screen? I ask because I'm curious if you found a non-screenshot + coordinate based ADB method to do so (that doesn't rely on UIAutomator).

I wrote an APK that gives access to the accessibility service via an in-Android http server, which talks to a daemon running on the host machine which can, in turn, talk to Hermes. It's designed to be used with an emulator called Waydroid but you could probably run it on your device too. It does need to fall back to ADB when the accessibility tree is incomplete/inaccurate (which is often). And, going back to my question, I haven't found a means of interacting via ADB other than by coordinate/UIAutomator. To be clear, I am not smart or patient enough to be an Android dev, so I use it for ordering things on Amazon.

If you find out, let me know! I have been working on a port of Excalidraw to my ReMarkable Pro and it's opened my eyes to how much we take for granted in terms of UI interactions when we assume we have a 30+hz screen with no to minimal ghosting. Layout has to become as monotonic as possible, especially in the absence of user interaction; in other words, the app itself should never be doing anything to disrupt prior renders on its own unless you are clearing the whole page. When it is the user interacting with the app, try to minimize the number of intermediate states their interactions produce. This does NOT mean "just don't render those intermediate states", however. It means make the interactions themselves not require intermediate feedback. Essentially, users (and developers) are so accustomed to just being able to manipulate things with no side effects that you have to make every possible interaction as intentional as possible, leaving them less frustrated when they do see a refresh. If an operation is going to cause a refresh, it should happen at a moment the user already understands as a semantic boundary.

You obviously cannot always avoid this, so when there is a hard requirement for continuous feedback, use a degraded/cheap transient representation and refresh at commit of that action. With E-Ink, every interaction has to be a trade off between ghosting and latency. One common pattern I ended up coming back to is intermediate states that optimize for latency at the expense of ghosting until the UI action is 'complete'. This will allow refreshes to be associated with the satisfaction of finality. Funny enough, many of them harken back to old UI paradigms from when computer graphics weren't as powerful as today. When resizing, I simply draw the outline of the shape with a fast update mode that tolerates more ghosting until the user releases their finger or stylus, at which point, after a small lag to account for an 'oops, just a tiny bit bigger/smaller', I do a localized refresh of the union of the old + new area.

The outline itself is deliberately faint, so the refresh doesn't have to be as intense if its a small delta.

For your streaming LLM case, I would recommend doing it in chunks, like you said, perhaps doing a hard refresh of everything but the input box + moving the tail of last sent message + beginning of stream to the top upon send. Of course, this implies that you know exactly how long the response will be, which you don't. The challenge will be coming up with a UI paradigm that doesn't make it look awkward if the response only goes down to the middle of the screen while also nicely doing a clean refresh pre-emptively if it's clear it will overflow and need to move to the top. For the former case, find some way where it looks not completely awkward if it's partial and then do refresh of the chat history area and move it to its proper fitted position once the user clicks on the input box again to type their next reply. For the latter, perhaps embedding some kind of remaining space meter at the bottom that indicates when you'd need to do this move + refresh action (don't directly label it that way) would enable the user to anticipate it more and be less frustrated when it happens, as they are psychologically awaiting the next part of the answer/reasoning, not surprised at a sudden flash.

For the actual streaming, you'll have to ensure that your text alignment works in such a way that once a line is rendered to the screen, its placement is final (in other words, no streaming intra-word, as you need to know if the word will fit in remaining space on the line before rendering it). Basically, avoid retroactive reflow like a PDF document with a fixed layout, not like this text box I am typing in with a resize handle at the lower right. You'll also probably want to disable scrolling during generation as well, or at least make some sort of discrete pagination mechanism for going back and forth.

In any event, I look forward to seeing whatever it is you're building!

Re:"Clean" Code, Horrible Performance on Tuesday August 04, 2026 @10:15PM (#49177815)
Well said. And when you put it that way (we have not figured out how to retain control over the computer in the face of these abstractions), I almost laughed out loud because of how true it is. Some of the worst, most confusing codebases I have touched are full of abstractions that require me to have 5 tabs open at once in my IDE to understand what is going on. The type of codebase that ends up being a sales pitch for multi-monitor setups.
Re:"Clean" Code, Horrible Performance on Tuesday August 04, 2026 @02:22PM (#49172744)
It seems like the main takeaway is that many textbook OO paradigms aren't the most optimized representations of the code. In this case, the cost is dynamic dispatch and pointer-chasing. This is a function of the Shape abstraction, but not the abstraction itself.

But the argument is you're trading some of that performance optimization for maintainability. None of this is exactly news. And while I'm here ranting: I never understood why shapes are the canonical OOP example. Shapes are a closed set of types (yes I'm sure GPT-324 invented a new one) with an open set of operations. There's always going to be one more thing you need to do with those shapes, but you'll never be adding new shapes down the road unless you are still in Kindergarten. OOP is useful for the exact opposite case, where there is a relatively fixed set of operations and you routinely introduce a new subtype that needs to perform all or most of those operations.

I've noticed that most courses that introduce the concept of OOP do so in a way that (perhaps unintentionally) emphasizes the false notion that everything should have an 'x-is-a-y' taxonomy before actually asking the question if that is appropriate. Putting the Cart extends Vehicle before the Horse extends Animal.

Re:The Dunning-Kruger Effect Is Probably Not Real on Monday August 03, 2026 @11:25PM (#49164083)
Related: The Gell-Mann Amnesia Effect. In Michael Crichton's own words:

"Briefly stated, the Gell-Mann Amnesia effect works as follows. You open the newspaper to an article on some subject you know well. In Murray's case, physics. In mine, show business. You read the article and see the journalist has absolutely no understanding of either the facts or the issues. Often, the article is so wrong it actually presents the story backward-reversing cause and effect. I call these the "wet streets cause rain" stories. Paper's full of them. In any case, you read with exasperation or amusement the multiple errors in a story-and then turn the page to national or international affairs, and read with renewed interest as if the rest of the newspaper was somehow more accurate about far-off Palestine than it was about the story you just read. You turn the page, and forget what you know."

Re:What xAI's Grok Build CLI Actually Sends to xAI on Sunday July 12, 2026 @01:53AM (#48878693)
This is precisely why I run a custom fork of CLIProxyAPI on a private railway server for all my agentic coding. The OG version is indispensable already and has XAI Oauth support, so you can use your subscription to call Grok from any Anthropic OR OpenAI compatible client (Claude Code, Pi, Codex, you name it). To be honest, though, I am bummed, as I do really like the grok build client. The TUI is great in the ways that matter without going out of its way to make it clear that "I'M A MID-LATE 2020s TUI LOOK AT ALL THE NOT USUAL STUFF YOU CAN DO WITH ME".

Grok aside, this has become an increasingly large concern of mine, especially now that I've expanded my usual provider rotation beyond the big 2. Out of arguably reasonable paranoia, I recently bolstered my own personal CLIProxyAPI fork to use an algo similar to gitleaks/betterleaks to, on the fly, scan the incoming (i.e. from my coding agent) stream for any secrets that may have been transmitted from disk, replace them with a unique identifier, send that off to the upstream provider, and then replace the secret (mapped to that identifier in memory, encrypted and with TTL) before sending any response back. That way, if the "secret" is either not really a secret and/or truly is needed in whatever tool call or response, the replacement is seamless to the client but the provider never sees your code.

No, it's not foolproof: it can't prevent some upstream actor from, say, using the on-disk key to your secret in a rogue tool call that uploads it from your device directly to an endpoint of theirs, but the low-hanging fruit like this is, IMO, the equivalent of not leaving all your windows open when you're naked. Virtually no downside or inconvenience to you, gets probably 3-4 9s of cases where someone would be inclined to see something they shouldn't because it's that easy.

The alternative is literally having to approve every read request (is this even a thing now?) and spend the mental energy ensuring that each and every file could not possibly contain a secret. I'd rather just code by hand at that point.

Re:Stop Telling Me to Ask an LLM on Sunday July 12, 2026 @12:04AM (#48878145)
I agree 100%. I've been the resident 'tech guy' among my friends and family for as long as I can remember, and I thought that LLMs would be the definite end to all 'blurry picture of computer screen captioned with "what should I do"' texts, yet that didn't seem to be the case. In fact, LLMs made it worse, as it actually made me seem more knowledgeable; I would be the one just fucking asking AI on their behalf and responding with beautifully formatted, easy to understand answers, encouraging them to ask me more.

I chuckled because, as a joke, I made a website called djfa.ai (Dude, Just Fucking Ask AI), which is essentially LMGTFY for ChatGPT. As one can imagine, the gimmick wore off rather quickly, so I ended up haphazardly turning it into my personal blog, which I sometimes choose to abbreviate and sometimes not on my resume.

I would never have made it in the first place had most of the people asking me questions been like Yael: seeking my informed opinion on thought-provoking questions they'd already researched. Going back to your larger point about the social aspect of it all, even among my wife and my social group, "just ask Claude" is almost the new "I don't really know" or "that's a tough one" when it comes to any sort of question. Almost colloquial in the sense that it isn't to be taken literally, but more as an indication of uncertainty.

have you tried 5.2? I agree that 5.1 and prior were below Kimi, Mimo, Qwen, Minimax, and probably Deepseek (depending on task), but 5.2 (especially unquantized) feels like something else.

Now I feel like that I'm covered by GLM 5.2 and Minimax M3 (when I need vision or a second pass on something).

Re:Domain expertise has always been the real moat on Saturday May 30, 2026 @05:53PM (#48340965)
Highly agree with much of the article. IMO, this is why many engineers who learned to code in the post-2010 'new hot framework every week' era but before LLM coding took hold are able to get much better results from AI assisted coding than those on either end of that sweet spot. The domain expertise in this case is constantly having to adapt to learning the latest flavor of the week DB or JS framework and adapt existing patterns and paradigms to new ones. Agentic coding itself is, in this case, one of those new paradigms.

Knowing the caveats and pitfalls of this through years of (often-painful) experience is what, at least for me, allows me to preempt a lot of the sloppy assumptions or omissions that even the frontier models make when working on systems at scale. This means I can leverage my domain expertise on these high-level areas while delegating the grunt work that is harder to screw up to the agents. I find this enables me to work faster while avoiding the slop making its way into critical engineering decisions.

Re:Trademark violation: Fake Notepad++ for Mac on Monday May 04, 2026 @11:13PM (#48017659)
100%. I think I hadn't fully internalized the open source vs trademark ethe (TIL that's the disputed plural of ethos) in my head. I had two nightmare scenarios: the first was where people would say "you copied Notepad++ and didn't give enough attribution, you're a thief!" and the other where...what happened here happened.

I think this was just about as close as I could get to asking Don Ho directly how he would prefer a port to be handled without actually doing so. I plan on publishing it shortly after cleaning up some God objects :)

Re:Trademark violation: Fake Notepad++ for Mac on Monday May 04, 2026 @10:29PM (#48017443)
The timing of this is very funny for me, personally. After the Claude Code Rust re-implementation, I wanted to see how far I could push 'spec-driven development' by re-implementing Notepad++ for Linux. I used four agentic loops to draft detailed from the source, implement the code, write tests to fix regressions, and compare the result with the original source. I then re-themed it and actually came out pretty well.

I initially worried that a brand new name (I went with nootpad) might misleadingly suggest the project was built from scratch rather than being a semi-clean-room re-implementation. Then, I saw that NPP was trademarked and my worries flipped the other direction; the reason I haven't yet published it was because I'm still removing all the NPP references from the source + comments in an abundance of caution, leaving a huge disclaimer/attribution in the README. I know that OSS is an opinionated place and didn't want to step on any toes.

I must say, having all of that anxiety and seeing this guy literally put Don Ho's picture on the website and say that it was being re-named "in collaboration with" Don Ho (i.e. not in response to a legal threat) made me laugh out loud.

Older ยป