Show HN: Browsh – A modern, text-based browser - <AUTHOR> https://www.brow.sh <comment><AUTHOR> Some of you may have seen this before under its previous incarnation of "Texttop". Then it was just a hack, but I got some great feedback, so I've spent most of the last 12 months turning it into something serious. It's morphed into more than a mere TTY gimmick. That UNIX philosophy of text being the "universal interface" has somewhat unexpectedly risen to the forefront, such that Browsh is now essentially a text browser _engine_ , serving to both TTY clients and, somewhat ironically, other browsers - <USER2> [https://html.brow.sh](https://html.brow.sh) Being able to render any modern site (even WebGL for example) to text seems like an appropriate return to the web's origins. The obvious benefit being to those less fortunate that have slow and/or expensive bandwidth.

Also, I'd be interested in any opinions here about how to financially support this project. At the very least I'd just love to somehow make this my job.

<comment><USER5> actually one problem you have here, and you're probably realizing from the responses, is a problem I had with a personal project that could be used to build lots of things that people wanted, but in itself was not a thing people want. In order to monetize you need to build one of the things people want, but in doing so you put focus into one area and stop improving the generic base of everything, as well as not producing many little toy examples of the possibilities of your technology.

<comment><USER6> This is typical for infrastructure and foundation libraries. Nobody made money on jpeg, but jpeg powered entire industries.

<comment><USER7> While your point stands, you may be interested to know that a company actually successfully sold a patent for jpeg at some point, and made about $100M doing so. So I wouldn't say nobody made money on jpeg !

But it's also interesting for the OP, maybe there's something patentable in there ?

<comment><USER6> If you're referring to Forgent: they were patent trolls and their patent was invalidated due to prior art. Unfortunately not before a bunch of companies paid up.

Fraunhofer is a better example of an institute that made good money on tech patents with merit, as well as 3M and lots of other tech companies.

But as a rule these things are hard to monetize and while I'm not happy that it will be hard to monetize the work that went into this particular project at the same time I think it is good that patents are most likely a closed avenue.

Patents are - in my opinion - a net negative and the sooner they are abolished the better.

</comment></comment></comment></comment></comment><comment><USER8> > Browsh consists of a minimal Golang CLI client and a browser webextension. > Most of the work is done by the webextension. When the CLI starts, it looks > for a compatible browser (currently only Firefox) and starts it in headless > mode. Once the browser has started it opens a remote debugging connection > and installs the extension.

So a browser _wrapper_.

<comment><USER9> I was wondering about this. If everything goes through an already installed browser, then what is the advantage that browsh has over a minimalistic fork of Firefox with e.g., lower bandwith features?

<comment><USER10> I guess the point is to install this on some random server somewhere that you can then SSH to. It really does seem like a good way to have a speedy browser experience over even insanely slow network connections.

<comment><USER9> Does one then need a Firefox installation on the server, or can it be through a local Firefox installation?

Edit: according to comments below the headless browser (i.e., the Firefox installation) runs on the server. After this, the smaller bandwith data gets sent directly over SSH.

</comment></comment></comment></comment><comment><USER11> Can it be made _not_ to show WebGL, embedded video, and so forth? I enjoy a very serene internet using w3m set to monochrome, with mouse and images turned off. Every now and then it's necessary to use a graphical browser, and it's the sensory equivalent of being woken up by a toddler at 5:30 on Christmas morning.

<comment><USER12> What you call "serene," I would call "austere." That's not meant as a denigration, mind you: I'm very curious as to your viewpoint here. What do you enjoy about such an experience?

<comment><USER13> I use elinks--

I like it for reading. I like how all the text is displayed the same, in a fixed width font I'm used to looking at. There's nothing to distract me or get in the way.

</comment></comment></comment><comment><USER14> Seeing as images are so pixelated as to be near-indistiguishable, I think it would be nice for browsh to have a status line where it shows accessibility metadata (e.g. alt="" attributes) of whatever element is currently in focus.

It might also be nice to have a mode where images are just replaced by filled boxes that are more visually distinguished from the surrounding content.

<comment><AUTHOR> That's a great idea about the `alt` metadata, thank you.

Have you got an example URL for a page that would benefit from those filled boxes you mention?

</comment></comment><comment><USER15> > Its main purpose is to significantly reduce bandwidth and thus both increase > browsing speeds and decrease bandwidth costs.

How does it reduce bandwidth exactly? It still has to grab all the html/css/js for the site being rendered.

<comment><USER16> I think the use-case is that the user is running their headless browser on a remote server with a good internet connection. Then they open an SSH tunnel to that server from their local machine which has low bandwidth--and the only thing that needs to be received by the local machine is the browsh rendering of the webpage.

<comment><AUTHOR> Exactly.

As well SSH/Mosh access there's a HTTP service, that currently only outputs static, noninteractive HTML and basic graphics. For example: [https://html.brow.sh/https://news.ycombinator.com/item?id=17...](https://html.brow.sh/https://news.ycombinator.com/item?id=17487552)

<comment><USER17> This sounds like your ticket to making money then. Have a hosted option.

<comment><USER18> I'd be wary to use a hosted option because a browser in a remote server will then contain my credentials and browsing history.

So if OP goes down this road then I think he should allow users to access machines.

<comment><AUTHOR> What do you mean by access to machines? Like SSH access?

Do you think such a service would be significantly different to an email service in terms of privacy concerns?

<comment><USER19> Yes, I do think it's pretty different.

If you weren't the fine upstanding person you are, you'd have all the web traffic of users at your disposal: banking, secure interactions with healthcare providers, credentials to Hacker News, the whole nine yards.

With access to my email, you could probably reset a handful of my passwords to various services that don't support dual factor auth, and you could probably discover what services I subscribe to.

I mean, I wouldn't want you to have access to my email, but I would much rather that than a permanent man-in-the-middle web client.

<comment><USER20> It should be quite doable to spin up a container/VM on demand. I'd probably look at lxd/lxc or bsd jails for this (both with zfs for storage) - or if there now are any real ways to run containers under hw virtualization - <USER3> that.

Maybe something like:

[https://github.com/rkt/rkt/blob/master/Documentation/running...](https://github.com/rkt/rkt/blob/master/Documentation/running- kvm-stage1.md)

for VM backed containers - but I'm not sure if it's considered stable and/or secure.

<comment><AUTHOR> Thanks for the suggestion. I'm already using Kubernetes/Docker for the `ssh brow.sh` service. What advantages would your approach have?

<comment><USER20> I don't think I'd look too hard at lxd or freebsd as you already have a docker setup.

But hw isolation might be worth investigating - as others are saying - <USER4> access to a web browser, including webmail etc - is pretty dangerous. And plain docker never had a good story wrt secure isolation.

Apparently there was "hypernetes", now stackube - for combining VM runtime and kubernetes:

[https://kubernetes.io/blog/2016/05/hypernetes-security- and-m...](https://kubernetes.io/blog/2016/05/hypernetes-security-and-multi- tenancy-in-kubernetes/)

[https://github.com/openstack/stackube](https://github.com/openstack/stackube)

As far as I can tell, this allows the mix of k8 style pod/container management and VM level isolation:

[https://stackube.readthedocs.io/en/latest/stackube_scope_cla...](https://stackube.readthedocs.io/en/latest/stackube_scope_clarification.html)

As for lxd/freebsd jails and zfs - both offer very nice and easy to grasp environment for isolated services - and both should end a little more isolated than a _typical_ docker setup (some services running as root in container, no additional lxc restrictions).

But all things considered, if you already have k8/docker set up to give every user a separate, possibly ephemeral container... Infrastructure is probably not where I'd devote most time. It should work well enough as is.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER21> Very cool! I find the pixelated images to be quite charming. One thing I noticed, when I go to [https://text.brow.sh](https://text.brow.sh) it reads: `Welcome to the Browsh plain text client. You can use it by appending URLs like this; [https://html.brow.sh/https://www.brow.sh`](https://html.brow.sh/https://www.brow.sh`). Should it be `[https://text.brow.sh/https://www.brow.sh`](https://text.brow.sh/https://www.brow.sh`) instead?

<comment><AUTHOR> Thanks. Yes it's like the retro 8-bit style, it has a certain charm I agree.

Damn, I can't believe I missed that! I fixed it in the code and will deploy soon with some other fixes.

<comment><USER22> Note your donate link [https://html.brow.sh/https://www.brow.sh/donate/](https://html.brow.sh/https://www.brow.sh/donate/) 'broke' the QR code. Amazing work!

<comment><AUTHOR> Thanks. It does break the code doesn't it, but I'm planning on implementing a magnifying glass: [https://github.com/browsh- org/browsh/issues/33](https://github.com/browsh-org/browsh/issues/33)

</comment></comment></comment></comment><comment><USER23> I'm not sure what the desired outcome should be but successive iterations has strange results: [https://html.brow.sh/https://html.brow.sh/https://html.brow....](https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh) [https://html.brow.sh/https://html.brow.sh/https://html.brow....](https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://google.com)

<comment> g-harel why do you say it's strange? The image is being compressed over and over and the content of the demo page is being added each iteration.

[https://html.brow.sh/https://html.brow.sh/https://html.brow....](https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://html.brow.sh/https://google.com)

</comment></comment><comment><USER24> Sadly it doesn't seem like it can render even basic HTML forms, which other text browsers can do. Otherwise it'd be very useful.

[1] [https://html.brow.sh/https://ichi.moe/](https://html.brow.sh/https://ichi.moe/)

<comment><AUTHOR> The html.brow.sh service is quite far behind the terminal client in terms of features. Besides there's big hurdles over privacy if html.brow.sh starts letting users log into sites.

</comment></comment><comment><USER25> Also check out: Emacs eww. Handy when you are reading through a manual with lots of code examples, and copy pasting from a web page becomes work by itself.

Just in case you're put off by the thought of Emacs keychords, note that you can also use mouse to move backward and forward through history (it has icons for those), and of course you can click links.

But more importantly, it's Emacs. So if you wanted, you can press a key have the code copy-pasted to a temp file, run the compiler on that, display the result in a new window and file away both the code and the result to an org file for further studying.

</comment><comment><USER26> Pretty sweet!

Curious: why headless firefox and not headless chrome? Also: 'its main purpose is...to reduce bandwidth.' How does this reduce bandwidth? Is the assumption that you would deploy browsh on a server and ssh/mosh against that, and the bandwidth savings are to the client? (But full bandwidth usage to the server)?

<comment><USER27> Because Firefox is open source, in the same vein as this project? Just a guess.

<comment><USER28> Chromium is also open source

<comment><USER27> He said Chrome, though. Or is there no headless Chrome but only Chromium? Can't say I've ever heard of headless Chrome, though, so I guess that's why I'm being downvoted.

</comment></comment></comment></comment><comment><USER29> Reminds me a bit of reading about (I don't recall actually using one) web accelerators, or proxies that would retrieve and strip down content requested by a low powered/bandwidth client. I think these have pretty much disappeared over the last 10 years as bandwidth increased and mobile devices became more powerful.

Added: I guess [https://www.opera.com/turbo](https://www.opera.com/turbo) still provides this feature. Is there anything comparable that can be self- hosted?

</comment><comment><USER30> The algorithm used in chafa for img→unicode would improve the image quality: [https://github.com/hpjansson/chafa/](https://github.com/hpjansson/chafa/)

<comment><USER31> Or this one: [https://github.com/daleroberts/tv](https://github.com/daleroberts/tv)

<comment><USER32> There really just needs to be a terminal API for true pixel graphics. Something like sixel but modernized and cleaned up. There's no need to hack in graphics on top of Unicode block characters, which negates backwards compatibility anyway.

<comment><USER33> iTerm2 has a escape codes for viewing images, but I haven't seen any other terminals picking it up: [https://www.iterm2.com/documentation- images.html](https://www.iterm2.com/documentation-images.html)

<comment><USER32> This is nearly what I'm talking about but it requires the terminal emulator to understand the image format. I guess that makes sense for transfer efficiency, and if you want a pixel-level API you could just transfer BMPs.

<comment><USER31> If you have iTerm2, you might like:

[https://github.com/daleroberts/bv](https://github.com/daleroberts/bv)

[https://github.com/daleroberts/itermplot](https://github.com/daleroberts/itermplot)

</comment></comment></comment></comment></comment></comment><comment><USER34> Is there a way to point it to a different Firefox installation path? It only looks at Program Files{x86} and then quits as it doesn't find the FF installation at Program Files.

<comment><AUTHOR> Use the `-firefox` flag. However the Windows binary has other problems.

You can use the free live demos though: `ssh brow.sh` and [https://html.brow.sh](https://html.brow.sh)

</comment></comment><comment><USER35> This kind of stuff helps restore my faith in humanity. It makes me feel like a hacker again. Life starts and ends with the command line.

<comment><AUTHOR> Wow, thanks!

</comment></comment><comment><USER36>
        $ ssh brow.sh
        All of Browsh's servers are currently busy. Please try again soon.
        Connection to brow.sh closed.

Seems like a cool way to do a demo for something that's a bit painful to install on macOS (would love to see $ brew install browsh). I'll have to give it another look once the HN effect has died down.

<comment><USER37> In my case it generated SIGSEGV and the "Connection to brow.sh" was closed.

The more interesting that my gnome-terminal still receives/prints some codes. When I hit enter, it tries to execute them!

[https://ibb.co/buhqE8](https://ibb.co/buhqE8) and (ENTER) [https://ibb.co/itFz7T](https://ibb.co/itFz7T)

Does anyone of you know the mechanism behind it?

EDIT: Does anyone of you know how to use it to type into terminal "sudo su -"?

<comment><AUTHOR> This should be fixed in v1.3.2

</comment></comment></comment><comment><USER38> Can someone explain the usecase for Text-based browsers? While they're fun to show off to my non-tech friends when running without X11 and looking like a hacker, I've never needed one.

<comment><USER39> When X is fucked and I need to look up online documentation or download a driver.

When Internet is bad: packet loss at home, or travelling.

When I am fed up with bloated Web sites and don't have Opera 12 installed.

When setting a big font preference renders the Web page unusable.

When I need to browse something on my computer, but I am away and only have my phone with me. I can use ssh, but I cannot use vnc.

</comment></comment><comment><USER6> Mind blown how accurate this is, I've sent you some BTC as token of appreciation even though I do not have any application for what you've built right now. A _lot_ of work has gone into this and it shows.

edit: it's _so_ good that I got confused about which window I was looking at and tried to click links with the mouse :)

<comment><AUTHOR> Thank you very much indeed.

</comment></comment><comment><USER40> Neat project. It seems to have trouble rendering text from some text heavy pages. For instance, see the missing characters in the posts here: [https://html.brow.sh/https://old.reddit.com/](https://html.brow.sh/https://old.reddit.com/)

<comment><AUTHOR> Yes, I know :/ I'm pretty sure it's related to the issues the terminal client has here: [https://github.com/browsh- org/browsh/issues/42](https://github.com/browsh-org/browsh/issues/42)

At least with the terminal client successive frame updates eventually render the text - a luxury we don't have yet with html.brow.sh

</comment></comment><comment><USER41> Just a heads up: enter [https://www.brow.sh:443/](https://www.brow.sh:443/) url here [http://sitereview.bluecoat.com/lookup](http://sitereview.bluecoat.com/lookup)

<comment><USER42> That just means that someone rated it that way.

The owner ought to dispute that.

<comment><USER41> Yes. My point is that people are blocked to access the website because that list is used by some firewalls to allow or block access.

<comment><USER42> Because Symantec classifies it as a proxy?

Edit: And I see that [https://www.startpage.com/](https://www.startpage.com/) isn't banned, and it includes a proxy option.

</comment></comment></comment></comment><comment><USER43> "As of writing in 2018, the average website requires downloading around 3MB and making over 100 individual HTTP requests. Browsh will turn this into around 15kb and 2 HTTP requests - 1 for the HTML/text and the other for the favicon."

Does "100 individual HTTP requests" mean 100 _TCP connections_?

As far as I know, according to RFC 2616, connection keep-alive was intended to _promote making numerous HTTP requests_. In fact, IME, most web servers default to setting max-requests at _100_. Some are higher.

Following the guidance of the RFCs, for decades I have been using this HTTP feature to make 100 requests to a site in a single connection. That is 100 pages of HTML in one quick TCP connection. If I retrieve 3MB, it is 3MB of HTML from the website and zero from third parties. (Further, I have written filters to remove junk from the HTML and print only the content I want, e.g. for reading or to import into database. If I need to split into separate files, which is rare, csplit works nicely.)

In order to achieve this efficiency I could not and do not use a popular browser authored by ad-supported entities. I am an avid text-based web user who has no need for ads, graphics, and other external resources, e.g. Javascript. As such, I can use clients that can support http pipelining according to the RFCs. It works very well; no complaints.

Best of luck with this project.

<comment><AUTHOR> Oh! I didn't know that, I'm sure you're right. What do you think a better wording would be?

</comment></comment><comment><USER44> For someone stuck in the ssh demo, as myself. Ctrl+Q will exit the browser and end the ssh connection.

</comment><comment><USER45> What I really love is that (when the server is working) you can

        ssh brow.sh

And then have a graphical browser from anywhere :D.

<comment><USER46> That failed massively for me in Terminal.app on OS X. The browser showed garbled text and horizontal half-height lines.

Is there a reason why Terminal.app might not work?

<comment><AUTHOR> Terminal.app doesn't support true colour :( So it can't properly take advantage of the UTF-8 half block trick to get 2 pixels of colour from each cell - thus creating the banding effect you see.

</comment></comment></comment><comment><USER47>
      $ ssh brow.sh

(It starts, prints "Waiting for Firefox to connect")

Then...

      panic: runtime error: invalid memory address or nil pointer dereference
      [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x6de976]

      goroutine 11 [running]:
      browsh/interfacer/src/browsh.handleMouseEvent(0xc4203d3b00)
              /home/travis/gopath/src/browsh/interfacer/src/browsh/tty.go:151 +0x36
      browsh/interfacer/src/browsh.readStdin()
              /home/travis/gopath/src/browsh/interfacer/src/browsh/tty.go:46 +0xd3
      created by browsh/interfacer/src/browsh.TTYStart
              /home/travis/gopath/src/browsh/interfacer/src/browsh/browsh.go:185 +0xf2
      Connection to brow.sh closed.

<comment><AUTHOR> This should be fix, let me know if you try again and it works.

</comment></comment><comment><USER48> What happens if do this:

[https://text.brow.sh/http://text.brow.sh/http://text.brow.sh...](https://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/http://text.brow.sh/)

</comment><comment><USER49> Well, it works as expected [https://html.brow.sh/http://motherfuckingwebsite.com/](https://html.brow.sh/http://motherfuckingwebsite.com/)

<comment><USER50> I don't think randomly truncated sentences were expected:

      This is a motherfuc
      And it's fuckin

<comment><AUTHOR> Yeah, there's still some improvements to made for sure. I actually pushed a little fix in v1.3.2 that should address this.

</comment></comment></comment><comment><USER51> This is cool. Had you not considered using a pixellated Sean Connery as the logo?

<comment><USER52> This likely has copyright/trademark implications. :)

</comment></comment><comment><USER53> Really cool to see how far this has come since it was Texttop.

It reminds me of the txt-web app I created based on my html2text golang pkg. It takes a different (simpler and less sophisticated) approach- bottom up, no fancy rendering:

[https://txt.gigawatt.io/jaytaylor.com](https://txt.gigawatt.io/jaytaylor.com)

(Site source code: [https://jaytaylor.com/txt-web](https://jaytaylor.com/txt- web))

Powered by the go html2text pkg: [https://jaytaylor.com/html2text](https://jaytaylor.com/html2text)

<comment><AUTHOR> Nice! Very much in the same spirit :)

</comment></comment><comment><USER54> Requiring a full version of WebExtensions Firefox is a real deal-breaker in terms of memory hogging (that and only having an x64 Windows binary). Why not do what Pale Moon, SRWare Iron, Chrome-Opera, Vivaldi (i.e. Opera-Chrome 2), and others have done, and create a full browser based on the FF code instead of requiring a separate install?

Still, I think for all the major benefits of text-based browsing, Lynx, Links, and eLinks are still far preferable as lightweight solutions.

<comment><AUTHOR> Browsh's raison d'etre is really about saving bandwidth. I first had the problem of bandwidth whilst living in Ladakh in Northern India, where I simply could not use the modern web. I expect Browsh not to be run on the same machine as the user, instead it runs somewhere where there is good internet and the user then accesses its output via either SSH/Mosh or the HTML service.

Linking to FF/Chrome's libs is certainly an option and I agree a better approach, it's just a learning curve I wasn't willing to invest in.

<comment><USER54> Did Links/eLinks/Lynx not provide a better benefit in terms of bandwidth? It seems like trying to process it the way you're doing would lead to more overall load, rather than less.

<comment><AUTHOR> Well bandwidth and load are irrelevant when lynx/browsh are being run on a remote VM.

</comment></comment></comment></comment><comment><USER55> The nice thing about text based browsers is that you can use them at work and everyone thinks you're cranking code but you're really just on HN

<comment><USER56> Except the network admin that makes the hush-hush employee website usage reports for the boss.

<comment><USER20> Not if all they see is an ssh connection...

</comment></comment></comment><comment><USER57> Tom, RE that Kubernetes Slack artifacts in the video (4:45), this doesn't look like Browsh bug - it's just a new weird trend that happens on Slack/Discord, of people spamming with emoji reactions, often making them spell out something obscene. Browsh handled this very well, IMO (to be honest, it looked _better_ than on a normal browser, because the actual spam content was pixelized).

<comment><AUTHOR> Hey thanks! :)) Ha ok, then I should have just not mentioned, but its good to know Browsh actually coped well.

</comment></comment><comment><USER58> I love text-based browsers, and this is the one whose display looks best (but i would like to disable images/animations). This being a work in progress, the most important feature needed immediately is a boost in performance. I have a very powerful workstation, and just following a link and rendering the next page takes almost a second. (In lynx, w3m and in elinks it is instantaneous.)

<comment><AUTHOR> Browsh is really aimed at people with slow and/or expensive Internet that would benefit with having the main browser engine running remotely. You then access the output of Browsh via either SSH/Mosh or HTML serivice.

But nevertheless you might like Browsh's monochrome toggle: `ALT+m`

<comment><USER58> I like colors, my problem is mostly the sluggishness. I follow a link and I have to wait a while, without any feedback, until the new page is ready. There is no reason for these delays (from the point of view of the user). If I am interested in text-only browsing, the other browsers offer a much more user- friendly experience.

<comment><AUTHOR> I'd be interested to know if Browsh really is more sluggish than other text- based browsers, in my experience it's certainly on par. Also Browsh does provide feedback in the bottom left, just like most browser do, when a link is clicked.

But Browsh isn't designed to give faster browsing for people that already have good internet, it's designed to offer complete access to the modern web for users on slow and/or expensive internet.

</comment></comment></comment></comment><comment><USER59> Awesome software, this is totally something I could see myself use regularly.

Heads up: on my Mac, browsh isn't properly resetting the tty when it crashes.

<comment><AUTHOR> Yes, sorry about that. I'm still getting used to Golang. So I need to consistently catch panics and I ensure the right ANSI escape sequence gets sent to the terminal before it finally exits.

</comment></comment><comment><USER60> You might want to either increase the quality of your JPEG encoding or switch to a different format (GIF might work well at the sizes you're rendering). The compression artifacts from JPEG are very visible on solid-coloured areas: [https://i.imgur.com/CcS7gL6.png](https://i.imgur.com/CcS7gL6.png)

<comment><AUTHOR> Yeah, I agree, I need to play with that. The trouble is, those last few percentages of improved quality often double the Kb weight of a page!

</comment></comment><comment><USER61> You might want to consider adding support for displaying proper terminal graphics, instead of using pixelated ones (which I assume are done using unicode block drawing symbols?).

See [https://sw.kovidgoyal.net/kitty/graphics- protocol.html](https://sw.kovidgoyal.net/kitty/graphics-protocol.html)

<comment><AUTHOR> I'm actually already pretty decided against this. Simply because I won't the basic engine to be as text-focused as possible, as then we have a universal source of the modern web in pure text format, that multiple other clients (terminals being only one) can make use of. And besides graphics are orders of magnitude more bandwidth heavy than text, which somewhat defeats the purpose of Browsh.

<comment><USER61> Rendering images using unicode block symbols does not make them text, it just makes them pixelated. And you can always down sample images to reduce the bandwidth cost and still get a much better rendering than you achieve currently. For example you can convert the images to indexed 256 color compressed PNG and transmit that, which would reduce bandwidth by a factor of ~4x while still giving you much better rendering.

But anyway, it was just a suggestion, it's your project, you should feel free to do what you think is best for it.

</comment></comment></comment><comment><USER62> Awesome work! Great stuff! Love from an terminal nerd here. Hope you succeed with this project.

Question: how will it work with CAPTCHAs?

<comment><AUTHOR> I'm planning to add a 'magnifying glass' feature: [https://github.com/browsh- org/browsh/issues/33](https://github.com/browsh-org/browsh/issues/33)

</comment></comment><comment><USER63> Suggestion: Make the Debian depend on _firefox | firefox-esr_. Currently, it's not possible to install on Debian stable due to that distribution not shipping a package named _firefox_ , only one called _firefox-esr_.

[edit]: Ah, I notice now that the firefox in stable is too old anyway. Oh, well, never mind then :-)

<comment><AUTHOR> Ah yeah, thanks for pointing that out. I've added `firefox-esr` anyway, for the day that it gets upgraded past 57.

</comment></comment><comment><USER64> It's a bit broken on my blog, I'd like to know why so I can fix it...

[https://html.brow.sh/https://milankragujevic.com/vip- drop-i-...](https://html.brow.sh/https://milankragujevic.com/vip-drop-i- lekcije-u-odnosu-sa-korisnicima)

<comment><AUTHOR> I can see that Browsh's injected JS isn't able to hide your text to take the screenshot, which in turn means that Browsh can't parse the text. There could be a number of reasons for this, but it's very much Browsh's responsibility here, not yours. I've added your site as an issue on the repo: [https://github.com/browsh-org/browsh/issues/75](https://github.com/browsh- org/browsh/issues/75)

</comment></comment><comment><USER65> Just wonder what kind of experience one should expect with 2400 bps? (Iridium go unlimited global satellite connection that costs around 135 USD per month. I think Go has some limitations so I do not know how much one would need to hack things around to get ssh terminal working properly)?

<comment><AUTHOR> This is really the perfect use case for Browsh. I first had the idea for it when I was in the deserts of Ladakh where you'd get around 3kb/s speeds.

So what you need to do is install Browsh on a remote server along with Mosh. Then from your own personal computer you can use the Mosh client to get Browsh working, albeit, quite slowly, in your terminal.

So you don't need to touch Go at all.

Let me know if you want any help, I'd love to get you setup as, like I say, this is precisely what I made Browsh for.

<comment><USER65> I do not have currently the hardware (nor immediate need for it) it is just something I have been wondering how much it would cost to get properly global intrnet connection. I think Iridium Go does not allow connections from other than selected apps, you can't make a generic internet connection from a laptop through go. But this is just based on what I have read, I have no first hand experience.

</comment></comment></comment><comment><USER66> What's with the Virus warning with the windows binary?

Comes up with BrowserModifier Win32/Unwaders.B!ml detected.

<comment><AUTHOR> This is related to: [https://html.brow.sh/https://chocolatkey.com/blog/mathletics...](https://html.brow.sh/https://chocolatkey.com/blog/mathletics- weak-client-side-security)

Do you still get the warning with the latest v1.2.3? [https://www.brow.sh/downloads/](https://www.brow.sh/downloads/)

<comment><USER67> Windows Defender says:

Trojan:Win32/Fuery.B!cl | Severe

</comment></comment></comment><comment><USER68> Got rickrolled in 2018 _gnarf_ :(

<comment><USER69> they are getting more complicated these day, the guy invented a whole browser frontend in order to rickroll us! :)

</comment></comment><comment><USER70> Amazing work. Well done.

(I looked at repurposing Firefox's renderer for Lynx back in the late 90s - primarily for the JS support - but marrying a mountain of complex C++ implementing a dynamic page to crufty old C with bake-at-parse pages was far beyond my abilities or motivation.)

</comment><comment><USER71> Absolutely love the project! Also, this is probably the first time I felt happy being Rick-rolled!

</comment><comment><USER72> that's pretty awesome. Anyone here knows how I could install this in termux on my android?

<comment><USER73> I tried it this morning (lineageOS). Got the arm binary from github, `chmod +x`-ed it on my computer and scp:ed it over to my phone. Ran the binary and got a quick flash of the screen and a `exit status 1`.

Have not looked into it more than that. Since `browsh` depends on headless firefox, which is not in the termux default repository (it seems), I guess it won't work because termux does not have access to the firefox system app, if that even shits with the headless-functionality. (but here I'm just guessing, a work around may be available)

Would be cool to see working though.

<comment><USER72> thanks for the details. they saved me some troubles. too bad it (apparently) doesn't work. At least they do have good 'ol lynx in their repository :)

</comment></comment></comment><comment><USER74> The MacOS "binary" version:

\--isn't a disk image \--isn't an app \--isn't source code

So what is it?

<comment><USER75> An executable? Haven't had a chance to check it myself yet, but that'd probably mean you have to chmod +x it, and the run it in a terminal.

</comment></comment><comment><USER76> For those who are interested in how it actually works: [https://www.brow.sh/docs/introduction/#design](https://www.brow.sh/docs/introduction/#design)

</comment><comment><USER77> There's something absolutely British about this 1 min segment of the showcase demo: [https://youtu.be/zqAoBD62gvo?t=235](https://youtu.be/zqAoBD62gvo?t=235)

<comment><AUTHOR> Ha :D

</comment></comment><comment><USER78> Seems great, but although it is unable to load HTML properly on few of the websites I tried. It overlaps the text content on each other. Although, is there any way we at draftss.com could contribute to the project?

<comment><AUTHOR> Yeah, there's a lot of improvements to be made to the rendering engine.

Sure what sort of contribution were you thinking?

</comment></comment><comment> ryan-allen Really cool! I couldn't figure out if I could enter values in inputs (e.g. go to google, perform a search). Might be out of scope or I might have missed something? It's super cool. I really like it!

<comment><AUTHOR> You can! It can just be hard sometimes to find where to click the mouse :/ I need to find a better way to provide visual cues for input boxes.

Thanks :)

</comment></comment><comment><USER79> Seems like it only looks for the 32bit FF binaries on windows so I can't run it sadly. Even tried copying over the 64 bit to the location, but I guess as expected got a reference pointer error.

<comment><AUTHOR> Follow this issue: [https://github.com/browsh- org/browsh/issues/32](https://github.com/browsh-org/browsh/issues/32)

</comment></comment><comment><USER80> Not sure if it's just me but the page is down currently.

<comment><AUTHOR> By down, do you mean this? [https://github.com/browsh- org/browsh/issues/58](https://github.com/browsh-org/browsh/issues/58)

</comment></comment><comment><USER81> Getting an invalid certificate error on [https://html.brow.sh/](https://html.brow.sh/)

Sounds great, will bookmark for later.

<comment><AUTHOR> Does that look related to this? [https://github.com/browsh- org/browsh/issues/58](https://github.com/browsh-org/browsh/issues/58)

<comment><USER81> Not at all. Here's the error in firefox, check your intermediate certificates:

html.brow.sh uses an invalid security certificate. The certificate is not trusted because the issuer certificate is unknown. The server might not be sending the appropriate intermediate certificates. An additional root certificate may need to be imported. Error code: SEC_ERROR_UNKNOWN_ISSUER

<comment><AUTHOR> Oh! I'm using Let's Encrypt. Any idea how I can reproduce this error for myself? Thanks for letting me know.

</comment></comment></comment></comment><comment><USER82> I have been wanting a way to launch a web browser with url from a remote server without a major security problem for a while. This could be even better!

</comment><comment><USER83> Got a segfault the first time I ran it, but after it ran swimmingly. It would be awesome to have more keyboard shortcuts for terminal use.

<comment><AUTHOR> Follow this issue to follow Vim-keys integration: [https://github.com/browsh- org/browsh/issues/31](https://github.com/browsh-org/browsh/issues/31)

</comment></comment><comment><USER84> I gave it a try with debian x64 binary, got a nil pointer on a path error /home/travis/gppath etc

<comment><AUTHOR> Does it look related to this? [https://github.com/browsh- org/browsh/issues/73](https://github.com/browsh-org/browsh/issues/73)

<comment><USER84> Yup

</comment></comment></comment><comment><USER85> Feedback:

For some reason, it maxes out my CPU usage, all 4 cores full speed, on a simple webpage with some light javascript.

<comment><AUTHOR> Can you identify the process that was causing it? What size was your terminal window. And if possible the `./debug.log` file from having run `browsh -debug` could be useful. Thanks.

</comment></comment><comment><USER86> Hyper on macOS struggles quite a bit with this. It ran fine in Terminal.

</comment><comment><USER87> no alternative to links2 which is downloading much less (airplane etc.)

<comment><AUTHOR> I don't understand your point

<comment><USER87> Don't get me wrong. Appreciate the project and effort. Well done and amazing. But the only time I use a text based browser is when I have very very bad connection (which happened once or twice e.g. in an airplane). But would be better for comparing links2 vs. mosh+remote browsh. Nevertheless I don't want to keep running some vm (even when it's small) just for my very seldom text browser sessions ;)

I will keep browsh in mind when I'm again on some remote island. Could be a no brainer to install adhoc on a remote vm then.

<comment><AUTHOR> For sure, I totally agree with this. The fact is I don't even use Browsh that much as I have the luxury of fast and cheap Internet.

But I have certainly experienced bad internet and felt that craving to be connected to the modern web, which is so hard when all you have is a 3kb/s connection.

So that is what Browsh is for, those people of the world, and there millions, who have slow and/or expensive internet.

</comment></comment></comment></comment><comment><USER37> The idea is super cool, but unfortunately it SIGSEGVts a lot.

<comment><AUTHOR> This should be fixed in version 1.3.2

</comment></comment><comment><USER88> Where do I file a bug? Pornhub doesn't render properly.

<comment><USER89> Japanese videos still render correctly, at least the relevant parts...

</comment></comment><comment><USER90> are there any working examples of WebGL? i can't seem to get any on threejs.org to run in Chrome 67 or Firefox 62.0b6

<comment><AUTHOR> Embarrassingly, I need to remove WebGL from Browsh's features, as WebGL doesn't work in Firefox's headless mode. I certainly saw it working in the early days when I wasn't using Firefox headless in order to debug the injected CSS Browsh uses to render pages.

Sigh, so I best remove 'WebGL' from the homepage :(

<comment><AUTHOR> Actually it does work if you run Browsh with `browsh -with-gui`

</comment></comment></comment><comment><USER91> I can't fully articulate why but I love this!

</comment><comment><USER92> Which of the ARM downloads work on android?

<comment><USER93> I also would find an Android version really helpful. Will save a ton of data when roaming and will probably perform better in poor connectivity regions (only 2G and no 3G/4G). Would be great to know how to get this on an Android device.

<comment><USER73> As I said elsewhere in this discussion thread:

I tried it this morning (lineageOS). Got the arm binary from github, `chmod +x`-ed it on my computer and scp:ed it over to my phone. Ran the binary and got a quick flash of the screen and a `exit status 1` [in termux].

Have not looked into it more than that. Since `browsh` depends on headless firefox, which is not in the termux default repository (it seems), I guess it won't work because termux does not have access to the firefox system app, if that even shits with the headless-functionality. (but here I'm just guessing, a work around may be available)

Would be cool to see working though.

<comment><AUTHOR> I haven't made it clear enough on the homepage or the docs, but Browsh isn't designed to run on your own local device, be it a laptop or smartphone. Browsh is best run remotely and then connected to through either SSH/Mosh or the HTTP in-browser service.

</comment></comment></comment></comment><comment><USER94> This is a text automation dream coming true

</comment><comment><USER95> running the docker over ssh got me "Failed to connect to Firefox's Marionette within 30 seconds"

<comment><AUTHOR> If you leave an issue on the Github repo with some debug logs and some info about the server I can look into it.

</comment></comment><comment><USER96> Amazing.

Is this relying on an external server to work?

<comment><USER97> From the GH readme, it seems like it runs a full Firefox locally in the background and then consolifies what that renders.

<comment><AUTHOR> Exactly

</comment></comment></comment><comment><USER98> Awesome work, fellow textpunk!

</comment><comment><USER99> links is the best text based browser because it has mouse support.

<comment><USER100> Browsh also has mouse support judging by the showcase video.

</comment></comment><comment><USER101> so this needs firefox installed? what about other text-mode browsers such as lynx, elink2 etc? or even the light-weight GUI browsers such as midori etc?

</comment><comment><USER102> amazing, great job!!!

</comment><comment><USER103> how does it know how to convert a webpage to a ascii?

<comment><AUTHOR> Ha, that's a very long story. The gist though is that some custom CSS forces a given webpage into a strict, monospaced, mono-sized grid. Then JS queries DOM text nodes for their contents and precise positions. Then using the standard rules of text flow the exact position of every character can be fairly reliably derived.

<comment><USER58> that's beautiful, where can we find this cool CSS file?

<comment><USER97> from a quick peek at the GH repo, [https://github.com/browsh- org/browsh/blob/master/webext/asse...](https://github.com/browsh- org/browsh/blob/master/webext/assets/styles.css) and the JS in the surrounding extension code?

<comment><USER58> thanks! I couldn't find it

</comment></comment></comment></comment></comment><comment><USER104> Browsh: My new way to browsh the Internet

\- Sean Connery

</comment><comment><USER105> If it doesn't have a script/cookie manager (similar to umatrix) then it's worthless. I had the same issue with qutebrowser.

<comment><USER106> Please don't be dismissive of someone's work like this, even if you do want a script/cookie manager.

[https://news.ycombinator.com/showhn.html](https://news.ycombinator.com/showhn.html)

[https://news.ycombinator.com/newsguidelines.html](https://news.ycombinator.com/newsguidelines.html)

</comment></comment><comment><USER107> ...aaand it's written in Go...

So it's modern in that it won't run on anything but popular platforms, and text-based in that it shows you text using a huge, multi-gigabyte program. Looks like links / lynx aren't going to be replaced any time soon.

<comment><AUTHOR> Links doesn't even support modern SSL :/

The modern age requires a multi-gigabyte program to use the Internet, that's just our reality. So the whole point of Browsh is that you can now offload this from your local machine (eg. to a remote VM) and re-experience the net as pure text, how it used to be.

<comment><USER108> I am fairly sure that both linx and lynx work with modern SSL.

In fact, just checked on Ubuntu 16.04 -- both links (2.12) and lynx (2.8.9...) work fine with [https://google.com](https://google.com) and [https://news.ycombinator.com](https://news.ycombinator.com) for example.

<comment><AUTHOR> Do they support SNI?

[https://bugzilla.redhat.com/show_bug.cgi?id=1527856](https://bugzilla.redhat.com/show_bug.cgi?id=1527856)

<comment><USER43> The latest version of links does support SNI.

I use several clients that do not support SNI and one workaround is to connect through a program that does support it, e.g. haproxy, socat, etc.

Privacy/censorship conscious users may dislike SNI, SSL/TLS implementors are now trying to "fix" it, and in fact most SSL/TLS-enabled websites do not require SNI to be sent (popular browsers send it anyway). If requested, I can post stats on whether SNI is required for any list of websites. I have already done this a couple of times with the list all sites currently posted on HN: only a minority require SNI.

<comment><USER50> According the changelog, SNI support was added in links 2.10:

       === RELEASE 2.10 ===

       […]

       Sat Jan 17 06:44:01 CET 2015 mikulas:

       	Enable SSL SNI, some servers need it

       […]

</comment></comment></comment></comment></comment></comment><comment><USER109> Super</comment>


Your vs. My Pattern - Design Pattern Library - YDN - <AUTHOR> http://developer.yahoo.com/ypatterns/social/core/yourvmy.html <comment><USER2> I especially hate "My Documents", "My Pictures", "My Videos", and every other folder Windows feels it necessary to create and constantly try to save things to even though I've _never_ used them. If I _wanted_ my stuff saved in a folder in an obscure location with tons of spaces in the filename, I would put it there.

Don't call it mine if it isn't.</comment>


Putting the Interest on the National Debt in Perspective - <AUTHOR> http://thesoundingline.com/putting-the-interest-on-the-national-debt-in-perspective/ <comment><USER2> Something I never understood, and have never seen anyone ask: who had that much money to lend?</comment>


GNU Readline for Better Productivity on the Command Line - <AUTHOR> https://spin.atomicobject.com/2017/11/10/readline-productivity/#.WgW8UVUY8bA.hackernews <comment><USER2> My favorite unsung readline default is ctrl-o, for "operate-and-get-next". If you've gone back and found a command from your history, ctrl-o will run it and then tee up the next command. And, if you hit the end of your history, it will cycle back to the point you initially searched to. So if you have a set of a few commands (e.g., foreground your editor, run make, test the results) that you tend to keep repeating, it will replace "up up up enter" with just "ctrl-o".

<comment><USER3> Once a year or so I read one of these articles and figure out how much time I can save (like this Ctrl-O). But I rarely do, I think I need to print out the cheatlist and put it on the wall behind my monitor so I can use them enough to get them into my patterns.

</comment></comment><comment><USER4> Heh, I tend to go all in and run shells in Emacs :)

There are (at least) 3 ways to do this:

\- `term` and `ansi-term` act as terminal emulators; they run a normal shell, like bash, and act much like e.g. `xterm`. You can even use curses-based programs. I don't use this as I find it quite clunky, since normal Emacs navigation and editing doesn't work (since the key combos would conflict with those used by the shell and applications).

\- `eshell` is the opposite extreme: it's a shell which you use instead of bash and friends. It has nice features like piping to a buffer, running Elisp (if that's what you're into) and (my favourite) using TRAMP to invoke SSH and sudo. I tend not to use it much other than for TRAMP. The most obvious problem is the limited support for piping.

\- `shell` is half way between. It runs a normal shell like bash, but Emacs keeps control over the buffer. This means we can't use things like curses, but we can navigate and edit the buffer contents just like any other.

Emacs `shell` is my "default" terminal; I currently have 24 shell buffers open. For things like curses, I use a separate `st` window running DVTM.

As a bonus, we can actually use `shell` and TRAMP together: we first use TRAMP to connect somewhere, e.g. `/ssh:me@remote:/home/me` (we can do this using `cd` in `eshell`, or using `dired` mode, or whatever), then from there we invoke `shell`. We'll be dropped into a remote shell, just as if we'd run `ssh`, but Emacs will be able to do things like tab-completion for the remote system.

<comment><USER5> Also when you just want to run a single command, `M-&` (`async-shell-command`) is always handy. Or in Dired mode `&` for operating on files. At least for me those two work for majority of shell usage.

</comment></comment><comment><USER6> I put "set editing-mode vi" in my ~/.inputrc to enable basic vi keyboard shortcuts in readline-based programs like bash.

If I'm using bash on a machine I don't control, I can type "set -o vi" at the bash prompt to get the same thing temporarily, and that's usually the first thing I type.

I also like to use rlwrap[1] to get readline editing and command history on terminal apps that aren't readline aware and don't have history of their own.

Most of the time, though I spend in zsh, which is not readline-based but has its own readline-like capabilities. There I have ^R bound to reverse history search, and ^E to edit the current line in my $EDITOR.

In addition to this, I use fzy[2] (which I prefer over fzf[3]) to do fuzzy searches over my shell history with something like:

      history 0 | perl -p -E's/^\s*\S+\s*//' | sort -u | fzy --lines=$LINES

[1] - [http://utopia.knoware.nl/~hlub/uck/rlwrap/](http://utopia.knoware.nl/~hlub/uck/rlwrap/)

[2] - [https://github.com/jhawthorn/fzy/](https://github.com/jhawthorn/fzy/)

[3] - [https://github.com/junegunn/fzf](https://github.com/junegunn/fzf)

</comment><comment><USER7> As an alternative, the fish shell has been a huge boon to my productivity. The drawbacks are that some shell syntax you've become familiar with from bash, won't work.

<comment><USER8> tread carefully in combination with other software. Trying to install opam for Ocaml completely broke my fish shell config, the bug seems to remain unfixed for two years now.

[https://github.com/ocaml/opam/issues/2255](https://github.com/ocaml/opam/issues/2255)

This is one of the reasons I'm reluctant to use fish again, these edge cases just aren't tolerable for everyday work.

</comment></comment><comment><USER9> for those that don't know it, rlwrap[0] is a neat tool that allows you to use a lot of the readline goodness with tools that don't support it natively (e.g. a repl for your newly written language).

[0] [https://github.com/hanslub42/rlwrap](https://github.com/hanslub42/rlwrap)

<comment><USER10> Makes Oracle's sqlplus command line usable... ;)

</comment></comment><comment><USER11> Reverse search with CTRL-r is a handy time saver that few of my technical colleagues seem to know.

<comment><USER12> And combine it with FZF it is even better :)

[https://github.com/junegunn/fzf](https://github.com/junegunn/fzf)

[http://owen.cymru/fzf-ripgrep-navigate-with-bash-faster- than...](http://owen.cymru/fzf-ripgrep-navigate-with-bash-faster-than-ever- before/)

<comment><USER13> Everything becomes better with fzf. I use it to parse git logs, checkout branches, select and download files from s3... Fzf is the single tool that vastly improved my command line productivity.

</comment></comment></comment><comment><USER14> Most of those emacs shortcuts work in Cocoa text fields, including TextEdit, your location bar, file dialogs, etc... Some, like ^W, are missing though, but, likewise to .inputrc, they can be added back via:

        ~/Library/KeyBindings/DefaultKeyBinding.dict

Some people went overboard[0] with it, but hey, whatever floats your boat. At least it makes for some kind of example/demo/documentation for the thing.

As an aside, personal opinion: the separation of Control and Command on macOS is the one thing I love as it makes for a very consistent interface whether I'm in a terminal or in an application.

[0]: [https://github.com/ttscoff/KeyBindings](https://github.com/ttscoff/KeyBindings)

<comment><USER15> > the separation of Control and Command on macOS is the one thing I love

I became a reluctant Mac user (work gave me a Mac laptop).

Being able to use ^D, ^N and so on in this text edit box is very useful, especially on a laptop keyboard, and it's something I miss back in KDE. Does anyone know a way to bring the same feature to KDE, Firefox etc?

<comment><USER14> Last time I tried it was in the KDE 3 days and there were mappings that you could set up but it required so much tedious work, often per app. the end result was terrible and inconsistent.

I've also explored the Ctrl/Cmd separation in GNOME/GTK3 but it's deep into the code, guess what there's actually a constant or two dedicated for that and it could magically work but they're entirely unavailabe to configuration, probably pertain to some build time thing for macOS, gated by auto #define'd per platform values. Turns out nobody cares and it requires quite an involvement to get into the thing, build a proper patch, submit it, have it reviewed and accepted.

In the end I stuck for a while in tiled WM land (awesome, i3) with deft configuration, and minimal desktop apps that wouldn't require such shortcuts, but you always end up needing a browser or something and things become leaky and inconsistent again. So I moved back to macOS.

</comment></comment></comment><comment><USER16> If you want Readline in Windows CMD, there's CLink: [https://mridgers.github.io/clink/](https://mridgers.github.io/clink/)

One of the first things I install on Windows.

<comment><USER17> I just use Take Command instead.

* [https://jpsoft.com/](https://jpsoft.com/)

</comment></comment><comment><USER18> Already discussed on HN: GNU readline, BSD editline, rlwrap and linenoise. I suspect enhance and libtecla have been discussed too (alternatives to rlwrap and readline).

For example: [https://news.ycombinator.com/item?id=5086837](https://news.ycombinator.com/item?id=5086837)

Both editline and readline are large, too large to be compiled into every program that could benefit from REPL.

The answer to the bloat is linenoise. Great project.

But then there are all the programs that already have the readline bloat compiled in. How to replace it with something smaller? Can this be done?

There is another editline, not NetBSD's editline. It may predate the web, as it was originally distributed via Usenet. I do not recall it ever being discussed on HN. I suspect the original author probably has an HN account.

From Github:

       *call compatible with GNU readline*

       small size (<30K)

       originally developed for older UNIX and Plan 9

       forked from Minix 3, not related to NetBSD editline

       does not rely on libtermcap/curses

source: [https://github.com/troglobit/editline](https://github.com/troglobit/editline)

socat can function as a replacement for rlwrap, something like:

       socat -t0 readline exec:q

where "q" is a program that could benefit from a REPL.

Perceptually I find socat readline exits faster than rlwrap. The later always feels a bit sluggish. Same for libtecla's enhance.

Is there a linenoise-based replacement for rlwrap?

</comment><comment><USER19> GNU Readline definitely makes it faster to work on the command line. I find it a real frustration I log into a system that is only running Busybox, which lacks all the Readline goodness, and I can't use Alt-F to move forward word by word.

</comment><comment><USER20> _I will start writing a command, decide I'm not ready for it, CTRL-u to kill it and store it in the clipboard, run another command, and CTRL-a to put back the command I just deleted._

That should read CTRL-y to put back the command I just deleted.

</comment><comment><USER20> _CTRL-k: kill the line after the cursor, add to clipboard CTRL-u: kill the line before the cursor, add to clipboard_

The more emacsian way of saying that you removed a line segment from a buffer and put it on the clip-board is to say that you yank the line rather than you kill the line.

<comment><USER21> Now I'm just confused. I thought that C-k stood for kill, and C-y stood for yank. So you kill the text, which... puts it into the dead buffer? And then yank it from the dead buffer? I've never really understood this.

<comment><USER22> Or C-y is just yank, where C-k is kill AND yank (so like copy vs cut).

</comment></comment></comment><comment><USER23> The part I liked most is the first (and only) comment:

> Hello, the first line of my .inputrc is: > # this file can be reloaded by > bash using shortcut C-x C-r

So practical!

</comment><comment><USER24> Note that readline is GPL, not LGPL. Alternatives with less restrictive licenses include editline and linenoise.

<comment><USER25> s/less restrictive/less respecting of their user's freedom/

<comment><USER26> Readline's has an important history, resulting in CLISP being licensed under the GPL:

[http://clisp.cvs.sourceforge.net/viewvc/clisp/clisp/doc/Why-...](http://clisp.cvs.sourceforge.net/viewvc/clisp/clisp/doc/Why- CLISP-is-under-GPL)

<comment><USER27> >"The direct result of this is that we now have an Objective C front end. They had wanted to distribute the Objective C parser as a separate proprietary package to link with the GCC back end, but since I didn't agree this was allowed, they made it free."

The direct result of this is half-a-trillion dollar company that wrote its own toolchain from scratch and released it to the public for free, giving birth to thousands of modern language projects, while GNU Objective-C is still a dead crap with no demand.</comment></comment></comment></comment>


Just-In-Time Static Type Checking for Dynamic Languages - <AUTHOR> https://arxiv.org/abs/1604.03641 <comment><USER2> Fine, but there is surprisingly no mention of Lisp in the related work, which defines a COMPILE function in its specification. In a language where the compiler is part in your runtime, type checking is equally available at different execution times. I mean, when I connect to a running instance of SBCL (Common Lisp) to compile my programs, that's exactly what happens: static-type analysis at runtime. Let's say I define a function which builds a function and compiles it:

          CL-USER> (defun foo (x) (compile () `(lambda (u) (aref ,x u))))
          FOO

Call it with an array:

          CL-USER> (foo #(2 3 2))
          #<FUNCTION (LAMBDA (U)) {100B3C610B}>
          NIL
          NIL

The resulting closure allows to access elements of that array:

          CL-USER> (funcall * 0)
          2

Call FOO again, with a bad input:

          CL-USER> (foo 332)
          ; in: LAMBDA (U)
          ;     (AREF 332 U)
          ;
          ; note: deleting unreachable code
          ;
          ; caught WARNING:
          ;   Constant 332 conflicts with its asserted type ARRAY.
          ;   See also:
          ;     The SBCL Manual, Node "Handling of Types"
          ;
          ; compilation unit finished
          ;   caught 1 WARNING condition
          ;   printed 1 note
          #<FUNCTION (LAMBDA (U)) {100B41E16B}>
          T
          T

COMPILE reports a type error (an exception that I could handle if needed).

<comment><USER3> Common LISP is a bit weird because its type system was originally designed primarily as a way to speed up the executables (by letting the compiler aggressively optimize memory representation and remove runtime checks).

Nowadays that kind of efficiency isn't as big of a deal as it used to be and people tend to go more towards the angle of using the type system for error detection but I still can't shake that feeling that CL's type system feels a bit off when you compare it to other modern type systems.

(this is no excuse to not at least cite Common LISP though)

<comment><USER4> No it's not. That's exactly the same use-case those slow dynamic languages have now. This kind of efficiency is a big deal, in languages designed by people with the same mindset.

Getting errors is the same if at compile-time or in the test-suite or at the customer, though having them at compile-time is of course preferred. In LISP you have all 3 cases. In static languages only the first.

These guys here solve their type-checking performance problem by deferring the check to dynamic code. Checks are expensive if your type checking code is slow, or the source code is a dynamic mess. We are talking about ruby on rails here, which is the biggest dynamic mess one can think of. It's the similar problem the JIT guys have, deferring compilation to only actually invoked code and skipping dead branches.

</comment></comment></comment><comment><USER5> This isn't static type checking though, if it happens at run time then it is by definition dynamic. And these languages already do that. What problem is this solving? I'll already get a runtime error now, how is this runtime error better?

<comment><USER6> It's somewhere between the two. Consider this program (in C-ish pseudocode):

        main() {
          foo();
        }

        foo() {
          if (false) {
            int i = "not an int";
          }
        }

        bar() {
          int j = "not an int";
        }

A statically typed language would report two type errors. A dynamically checked language would report none. Hummingbird would report one.

It gives a some of the benefits of static typing: it reports errors in code paths not hit through imperative branching. But it doesn't give all of it since it doesn't report errors in uncalled functions.

However, what it gives you in return is the ability to handle functions that don't even exist at program startup and are instead defined at runtime later in the program's execution through metaprogramming.

<comment><USER5> >Hummingbird would report one.

When?

>However, what it gives you in return is the ability to handle functions that don't even exist at program startup and are instead defined at runtime later in the program's execution through metaprogramming.

Those are already dynamically "type checked", how is this adding anything?

<comment><USER6> > When?

It would report the error in foo() when foo() is invoked, even though the code path containing the error is never executed.

> Those are already dynamically "type checked", how is this adding anything?

Only code paths that actually get executed are dynamically checked. This checks all code paths in the method.

<comment><USER5> >It would report the error in foo() when foo() is invoked

That's "dynamic typing".

>Only code paths that actually get executed are dynamically checked. This checks all code paths in the method.

Ok, so it is extended dynamic typing. Why on earth is it being described as having anything to do with static typing?

<comment><USER2> Because it uses static analysis techniques, that's all. You type variables and consider all execution paths at once, instead of executing code and checking the types of values.

In particular, the code that was generated won't get executed if it can be proved beforehand that there is a type error.

I agree that in effect you won't get an error message until execution, but that does not mean that this is dynamic typing. Execution time and compile time are generally interleaved with metaprogramming so it can make sense to consider static-analysis for code at runtime.

What I found strange is the fact that it happens "Just-In-Time", which for me means at the last possible moment. This is counter-intuitive with what static typing aims to do. I would prefer "ASAP static-typing" (the code could be analyzed long before it is run).

That's why I still find the COMPILE approach of Lisp better, since we have precise control over when analysis is done.

</comment></comment></comment></comment></comment></comment><comment><USER7> vs. "¿How can a dynamically typed language not actively prevent static checking?" [http://lambda-the-ultimate.org/node/5320](http://lambda-the- ultimate.org/node/5320)

</comment><comment><USER8> Just reading the abstract it's not entirely clear what's going on. My impression is that it instruments the app at runtime to gather type signatures for methods, and then.. it saves those type signatures somewhere that can be used to statically type-check the program later?

Two things come to mind when considering this approach:

1\. How does it handle the type signatures changing as the code is modified? Either it must detect when the code is modified and invalidate its saved signatures for that (although dynamic metaprogramming would make that hard), or you'll just have to live with static type-checking temporarily failing until you've run the program again to let it gather a new type signature.

2\. This can only be accurate if you've actually tested all of your code paths, because any code path you don't test may call some method using a type signature that Hummingbird hasn't seen before. Granted, the scripting language community already focuses heavily on 100% code coverage (though 100% code coverage doesn't necessarily mean all the code paths have been tested), but it still seems like an important limitation to be aware of.

<comment><USER9> Point 1 is explained, at a high level, in the introduction:

"In Hummingbird, user-provided type annotations actually execute at _run-time_ , adding types to an environment that is maintained during execution. As metaprogramming code creates new methods, it, too, executes type annotations to assign types to dynamically created methods. Then whenever a method m is called, Hummingbird _statically_ type checks m's body in the current dynamic type environment. More precisely, Hummingbird checks that m calls methods at their types as annotated, and that m itself matches its annotated type. Moreover, Hummingbird caches the type check so that it need not recheck m at the next call unless the dynamic type environment has changed in a way that affects m."

Personally, I think they're pushing the bounds of what "statically" means, but hey, they do say it's "just-in-time static". It does indeed do the checking before executing the function, it just happens to be _immediately_ before executing the function. A paragraph later:

"To ensure our approach to type checking is correct, we formalize Hummingbird using a core, Ruby-like language in which method creation and method type annotation can occur at arbitrary points during execution. We provide a flowsensitive type checking system and a dynamic semantics that invokes the type system at method entry, caching the resulting typing proof. Portions of the cache may be invalidated as new methods are defined or type annotations are changed. We prove soundness for our type system."

Based on how their approach works, I don't think Point 2 stands.

<comment><USER8> Oh ok. So it's not really static at all, they're just calling it that because it sounds better. It's simply dynamic type-checking that checks the types immediately prior to calling the function instead of checking them at the top of the function body. Offhand, it seems that the only benefit to this approach (checking prior to calling the function instead of checking inside the function) is the ability to cache the results and skip checking the same callsite in the future if nothing's changed.

Being able to significantly optimize type-checking for scripting languages like this to the point where you can actually run this in production seems quite valuable. But calling it "static type-checking" is simply wrong. Granted, they're calling it "just-in-time static", but that phrase is contradictory, it would be like saying "dynamic static type checking".

</comment></comment></comment><comment><USER10> Doesn't sound like it solves my main objections to dynamic typing:

1\. No compile-time type checking.

2\. No autocomplete / intellisense in IDEs (you can try but it's never very good).

<comment><USER11> My main objection is always readability. Sure, it is nice when I am writing code and on top of my head I know the type of each variable, but when I am reading code, this becomes nightmare for lack of type information.

<comment><USER12> > My main objection is always readability.

Strange, that's my objection to type declarations.

<comment><USER3> I'm nor sure I would use the word "readability" there. I'd prefer saying that types aid in documentation.</comment></comment></comment></comment>


Ask HN: Where do you find/filter/read the latest research publications? - <AUTHOR>

Ranging from personal interest in a broad area, to wanting to know which recent research has been most popular or stirred the pot the most, I always find myself wanting to read 2-3 of the latest journal articles.
The common question / thread I'm always looking to answer is "whats currently at the bleeding edge", and I've found it hard to do this efficiently without guidance from someone in the field.
A quick google search turned up a few resources, but would love to know what HN uses, or what you guys think about this.
http://www.myjournals.org/ http://www.tripdatabase.com/ http://www.alphagalileo.org/ <comment><USER2> Note depending on the field, published research is 6-18 months old by the time its printed, and depending how specific of field you are talking, stuff that is as much as five or even 10 years old may be just as relevant as what has just been published.

Second the Google Scholar alert system, its pretty decent. I believe you can set an RSS off of it as well for your research keywords?

</comment><comment><USER3> I tend to keep track of the popular publications in my field and skim abstracts to see what I find most interesting. Fairly time consuming, but it's the most effective method I've found. Google Scholar also has alerts on new papers that I occasionally find interesting.

</comment><comment><USER4> MIT's technology review is a pretty good magazine for the newer research that is "stirring" the pot. They also review the latest papers on "ArXiV".. a service for researchers to put up pre-prints of their working papers.

www.technologyreview.com

</comment><comment><USER5> If you want to sample a few, University libraries tend to have the major ones on the shelf. But journals tend to be tuned to a topic. So depends what topic you want to know about.</comment>


The U.S. Forgot What Antitrust Is For - <AUTHOR> https://www.theatlantic.com/ideas/archive/2019/09/how-antitrust-became-pro-pollution-tool/597712/ <comment><USER2> For a detailed and insightful treatment of the evolution of antitrust law in the US, I recommend "Cornered" by Barry Lynn.

The key point is that the interpretation of the law changed in the 80s to a very narrow test of monopoly - whether a company's dominant position in an industry hurt consumers (ie created higher prices). This ignores, for example, monopolistic behavior that makes it impossible for startups to compete.

The current administration is shaking things up by not limiting itself to this historical definition (though what definition it is using instead is unclear). For the last 40 years, Google would never have been challenged as a monopoly because its products were free to consumers, hence there could be no harm to them, hence no monopoly. Same for Facebook.

<comment><USER3> There's a really good Planet Money podcast on this topic.

Did you know that pre-1980s, antitrust law was used _very_ liberally? There were many documented cases of the book being thrown at tiny companies looking to merge - the book that changed everyone's mind ( The Antitrust Paradox ) lists examples such as a merger between local groceries being denied as one of many great examples of antitrust law getting in the way of healthy competition instead of promoting it.

It seems that for most of the 10th century, antitrust law usage was on one side of the bar being used far too much, and as a reaction it's far too much on the other side - seldom used to the point where most industries are dominated by one or two giants.

It's just bad luck this transition seemed to have happened during a boom period of new industries and extreme growth.

<comment><USER4> > examples such as a merger between local groceries being denied as one of > many great examples of antitrust law getting in the way of healthy > competition instead of promoting it.

Maybe I need to read the book but I don't see it. Consolidation of supermarkets has clearly reduced competition in the US. A small handful of companies have cornered the market because the US government stopped using antitrust laws liberally.

I'm not sure what popularity has to do at all with economic issues.

<comment><USER5> Groceries are like the pinnacle example of capitalism and competition working well. Everyone loves grocery stores, and we have a wonderful product selection for very cheap prices!

I don't know if we have just "a small handful of companies" or not, but it certainly doesn't work as a compelling example for me of an anti-trust problem.

<comment><USER4> Everybody loves Amazon, doesn't mean they aren't horribly monopolistic and don't have widespread economic/social impact on certain classes of people.

<comment><USER6> What exactly does Amazon have a monopoly on?

They are big and the easiest and most obvious to use and their prices are frequently good, but none of those are exclusively Amazon.

</comment></comment></comment></comment></comment></comment><comment><USER7> It's not so much that the US forgot what antitrust is for, it's that the current powers that be disagree with it, and have a tendency to pervert anything they disagree with, rather than being honest about their opposition to it.

Same thing with health care and other measures that are meant to benefit the general public. Opposing things that benefit the general public doesn't win them votes, so they need to put a clever spin on their opposition to it. But ultimately, they want things that benefit rich people, particularly party donors.

<comment><USER8> Who are the "current powers?" The current view of antitrust law has been operative since the 1980s, and has encompassed administrations on both sides of the fence. It's rooted in a large body of academic scholarship that has withstood the test of time.

Your comparison to health care is telling. You make it seem like it's "rich" "party donors" who are opposed to single-payer healthcare. In reality, just 21% of the public supports abolishing private insurance (which single-payer healthcare necessarily would require): [https://www.mrctv.org/blog/cnn-poll- only-21-favor-getting-ri...](https://www.mrctv.org/blog/cnn-poll- only-21-favor-getting-rid-private-insurance-majority-oppose-giving- healthcare).

There is a rhetorical tendency to blame American public policy on conspiracies rather than honestly attempting to figure out why people vote the way they do. In the context of healthcare, for example, isn't it possible that people (1) reasonably believe that single payer won't be a magic bullet that lowers our healthcare costs to European levels; and (2) don't want to pay the additional taxes required to pay for universal coverage, when most people who aren't on Medicare receive healthcare from their employers?

There is, in fact, good evidence that those factors, rather than "rich people" and "party donors" are responsible. You'll notice that no Democrat that supports Medicare for All has offered a serious health care proposal, _i.e._ one that raises taxes sufficiently to pay for it. That gives you a remarkable insight into voter dynamics! Even Sanders is afraid to propose the $30 trillion in new taxes that will be required to pay for Medicare for All. (His menu would raise just $10-12 trillion, even if all options were adopted.) And while he is quite happy to propose tax rates on the wealthy *higher than those in France—51% versus 45%—he is unwilling to propose raising taxes even on people making up to $250,000 to anywhere near French levels. What does that tell you about what people want? Who is he afraid of? The rich? Or the suburban married couple making $125,000?

Maybe Americans aren't irrational. Maybe they like having 50% higher disposable income compared to Germany or France. Maybe they don't want to pay a 20% VAT, the OECD average. Maybe they don't want their FICA contributions to double or triple, bringing those in line with social insurance taxes in Germany or France. Maybe they don't want 40%+ tax brackets to kick in well under $100,000, like in Germany, France, Sweden, etc. With respect to antitrust, maybe they like the rock-bottom prices enabled by the scale of companies like Wal-Mart and Amazon. Maybe they don't support carbon taxes because they like $3 gas, road trips, and SUVs? Maybe they are voting for the "powers" that give them what they want?

It's interesting to note that at the time the Microsoft antitrust decision came down, polls showed that people were opposed to breaking up Microsoft 54-35. That was the case even though a majority of people thought it was a monopoly! I don't think people usually can articulate a specific opinion on antitrust issues, save for high profile cases like that, but people don't vote for specific policies, they vote for an ideology. And for decades, they've been voting for a deregulatory ideology that features less government intervention in the economy.

<comment><USER9> _Of course_ only 21% of the public favours abolishing private insurance. There's been a huge and incredibly well-funded PR campaign to persuade them of that.

[https://theintercept.com/2018/11/20/medicare-for-all- healthc...](https://theintercept.com/2018/11/20/medicare-for-all-healthcare- industry/)

Americans don't need to be irrational - they just need to be misled about the relative benefits of taxes vs the personal security and relief that could be provided by paying higher taxes.

The reality is that the private medical insurance industry in the US is the single biggest cause of personal bankruptcy, and is responsible for incredible emotional and financial suffering. It takes a lot of spin - not to mention outright dishonesty - to paint that as a good thing.

But when the industry makes as much money as it does, the costs of generating that spin are relatively cheap compared to the profits it secures.

Meanwhile in those countries groaning under the yoke of oppressive taxation, there is absolutely no popular support for moving to the "benefits" of a US system.

Because there are no benefits. And that's a straightforward, simple, unarguable fact. Not only are higher taxes absolutely worth the value they buy - guaranteed health care, with no worries about bankruptcy or "competitive" price gouging - but the total cost over a lifetime, inclusive of taxes, is _vastly lower than the equivalent cost in the US system._

<comment><USER10> The other reason only 21% of people are against abolishing private insurance is that lots of people are insured through their employer, and thus the true cost of their healthcare coverage is hidden from them. If they really knew how much it was costing them (because benefits are part of "total compensation"), they would sing a different tune.

<comment><USER11> Yet we're not going to see a big raise because we switch over to a single payer system. It's not unreasonable for people to be skeptical of such a massive change when their current situation works fine (for them.) A change like this would be far more beneficial to the under/uninsured than those of us with existing, comprehensive plans.

I'm not making an argument either way. Personally I'm for single payer, but that's largely due to the issues my mother had when she became ill.

<comment><USER12> > Yet we're not going to see a big raise because we switch over to a single > payer system.

Californian legislators released a study last year about the costs of moving to single-payer healthcare in the state. In total it would be $400 billion, requiring $200 billion in new tax revenues after accounting for the existing $200 billion in federal, state, and local expenditures. Diverting existing employer and individual premium payments would still leave anywhere from a $50 billion to $150 billion gap. California's existing budget is ~$200 billion, so covering that gap would require significant new taxes.

Anybody telling you that you can get single-payer for free is lying to you. That would only be possible if we could significantly reduce costs, but we _don 't_ _know_ _how_ _to_ _reduce_ _costs_. Any suggestion you've heard is almost certainly part of the ACA/Obamacare in some form or fashion, and the strategies aren't working as well as originally believed. But this was predicted. The ACA was always intended to be a process of experimenting with cost reducing strategies, which is why there were supposed to be panels that could rewrite the rules as new information came in. But nobody is interested in the hard work of figuring out what those solutions are; all the electorate on both sides is interested in voting for are feel-good solutions. And they'll believe whatever they need to believe in order to support their political tribe.

<comment><USER13> > we don't know how to reduce costs

I am pretty sure administrators of health systems that are cheaper could tell us. Like just directly to our face.

<comment><USER12> If you could magically wave a wand and instantly replace a multi-trillion industry, _maybe_. But you can't. And so even the most radical of possible reforms will necessarily be incremental.

The other part of it is that Americans want mutually exclusive things--low prices and end-of-life services that will spare no expense. In the end any equitable system will have to choose the former, just as every other national system has. However, the people in those systems were never given the choice; their healthcare systems just evolved in that direction decades before modern revolutions in incomprehensibly expensive medical care. So Americans are being forced (by partisan politics) to make a decision no democracy can be reasonably expected to make.

The ACA was largely based on Hillary Clinton's 15+ years of footwork. The ACA is based on extensive examinations of foreign healthcare systems. If Democrats can't make the ACA work--because they can't overcome Republican opposition, because they're fickle and have turned their backs on it--then what hope is there of even more radical reforms?

I'm not saying single-payer isn't possible in the U.S. It's just not possible _now_. We'd have to wind our way there. But that's too much of an ask from our modern politics. The ACA could have been a stepping stone, instead leftist and populist Democrats just want to chuck it and start over, ignoring the fact that they'd be facing all the same impediments and problems of the ACA and a whole lot more, yet without any better answers.

"Other people do it" isn't an answer. Can I expect you to become a Warren Buffet or Bill Gates merely because they and you both exist? It's a non sequitur. You can't simply ignore path dependencies.

<comment><USER13> A young man is walking down a dusty country road, putting out his thumb for each passing vehicle. None stop.

An hour goes by and a old red truck rolls past him, ineffectually coming to a soft halt, front brakes obviously worn out years ago.

The old guy in the truck asks him where he is going. The kid points to a location on the map. And the old guy says, "oh they blew the bridge up years ago. You can't get there from here, at least not anymore."

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER14> Antitrust agencies are more often than not a bad joke.

They are usually lobbied for by the big players in the market in spite of the consumers and smaller competitors.

They create a legal nightmare scenario that you have to navigate to make anything happen in your business, that is hard for anyone small to comply with, but more manageable to them - going all against any free market principles.

</comment><comment><USER15> Agree antitrust regulation is screwed up, and agree self regulation against pollution is good for the environment.

but, the particular case here isn't entirely about industry cartels and antitrust - it is also about a single state's political influence over national policy, with antitrust being (mis)used as a proxy for the fight.

This same publication has no qualms complaining about undue influence of a single state nationally when it comes to terrible texas history books (and so, extrapolating, when it aligns with editorial policy):

[https://www.theatlantic.com/education/archive/2015/10/the- hi...](https://www.theatlantic.com/education/archive/2015/10/the-history- class-dilemma/411601/)

[https://www.theatlantic.com/news/archive/2016/09/mexican- ame...](https://www.theatlantic.com/news/archive/2016/09/mexican-american- studies-texas/498947/)

and, unsurprisingly, it conveniently ignores this dimension in this article, and similarly doesn't speak to the also current topic of antitrust investigations into the undue influence of (editorially-aligned) tech giants.

<comment><USER16> I don't understand your point.

If the issue is state influence, anti-trust is the wrong tool. It's the wrong tool AND the wrong target if the investigation into anti-trust is aimed at auto-makers.

If the issue is misuse of anti-trust laws to achieve clear political pursuits (and I'd argue it is) then both of your links are irrelevant. At no point did either of those articles imply that we should use anti-trust laws against book publishers in response to the undue influence Texas has on the market.

I'd follow that by saying your comment is incredibly disingenuous on this point.

\--

Now - I actually agree with you in regards to article quality. I'd have loved to see some attempt at putting together the costs associated with moving to cleaner vehicles to the average consumer. I'm not actually sure there is any long term impact on cost, although sticker price may be higher and maintenance cost is almost certainly going to be lower - That said, data is key and this article provides none.

I'd also have loved to see attempts to quantify cost with regards to saved medical expenses over time as air quality improves. Saved costs due to electrical spending on cooling increasing less rapidly if we're better able to meet emissions targets -- Basically, I want to know what the externalities of my policy choices are. I thought this article actually did a fair point categorizing current anti-trust law as broken in regards to handling externalities.

<comment><USER15> > I don't understand your point.

That the article's premise "the US forgot what antitrust is for" is skewed, because it ignores 'healthy' investigations into problems in the internet space, and uses an editorially inconsistent presentation of a mechanism of state vs federal influence to support its claims.

you are correct this is at an editorial level and not problematic in the article as (selectively) presented.

I'm thinking you're coming at this 'economically', and I'm coming at this 'politically'.

> At no point did either of those articles imply that we should use anti-trust > laws against book publishers in response to the undue influence Texas has on > the market.

No, but it certainly complains about the _mechanism_ of one state's purchasing power / legislation having influence over national policy, while making this _mechanism_ a 'noble cause' in the case of california cars by comparing it to civil rights activism.

As a mechanism, either states and businesses should have national influence, or they shouldn't - if we are speaking of government 'function', this mechanism is not selectively good depending on ones own political agenda. It is either a good tool for balancing local/federal powers, or it isn't.

If Texas is misbehaving by issuing crappy schoolbooks, then California is misbehaving by organizing automakers in such a way that they build cars nationally according to its own requirements, and vice versa. One or the other, depending on our view of the desirability of the overall 'mechanism'.

If we pick one case and not the other we are being partisan.

If we are highlighting one case to make this claim and not others (internet), we are being partisan.

Which is exactly the complaint being levied against regulators here.

So, at base, this is really saying "running cartels and using antitrust to break them is fine for me but not for you", which is the real 'argument', and not nearly as compelling a supporting argument to make when ones article title is "The U.S. Forgot What Antitrust Is For", since we might just be doing it ourselves if we make that case.

Omitting ongoing tech investigations very conveniently avoids making this even more overt, and so, in my view, is suspect.

Again, this was (carefully, via sidestepping?) not done within the article, but on publication level; and, Getting into the actual economic issues / externalities / etc. for this issue itself, I did not attempt do.

</comment></comment></comment><comment><USER17> > Thankfully, the laws themselves don't need to be amended. We simply need > judges who will apply antitrust law as it was intended to be applied.

The problem is that in the US judges on all levels get appointed by politicians/presidents or, worse, _elected_ instead of being on a career track like in Germany.

To fix antitrust (and a whole host of other issues) the US first needs to fix its judicial and election systems.

</comment><comment><USER18> > Their supposed offense? Agreeing with one another, and with the state of > California, to develop vehicles that are more fuel-efficient and have lower > emissions than federal standards require.

Sounds like collusion and price fixing, which are anti-competitive behaviors covered by antitrust legislation.

You can't have your cake and eat it too!

In a free market there would be nothing wrong with companies forming an agreement to compete, but antitrust law sees that as a cartel. Even if the cartel is selling electric vehicles.

</comment><comment><USER19> I didn't see Google or Facebook mentioned in this article. There seems to be a lot of talk about looking into their respective strangleholds.

</comment><comment><USER20> surprised they didn't mention bork at all...

[1] [https://www.washingtonpost.com/news/wonk/wp/2012/12/20/antit...](https://www.washingtonpost.com/news/wonk/wp/2012/12/20/antitrust- was-defined-by-robert-bork-i-cannot-overstate-his-influence/)

</comment><comment><USER21> "lavish rewards programme" yeah I don't think so

</comment><comment><USER22> The U.S spend so much money and effort on cyber security experts

I wonder if everything goes on talks Or there are some serious actions behind the scene

</comment><comment><USER23> Some conservatives (if you didn't know, we're not all the same, we're not all pro-Trump) argue that when government is given a new power, it will use it in ways that were unexpected. I don't know the particulars raised in this article well, but it looks like a good example of this - it is unwise to pass laws assuming your team will always be in power. You shouldn't cheer a president who threatens to "use his pen and phone" to get what he wants regardless of process, because someday someone else will be holding that same pen. It is entirely predictable that a law allowing you to target companies you don't like will be used by someone else to target companies you do.

I hold out hope that the Trump administration serves to the left as a demonstration of the merits of limited government, but this author's we-just- need-our-judges approach makes me skeptical this lesson will be learned.

<comment><USER7> > _" Some conservatives (if you didn't know, we're not all the same, we're not > all pro-Trump) argue that when government is given a new power, it will use > it in ways that were unexpected."_

And they demonstrate it as soon as they are in power. If a government is determined to abuse its power in ways that were never intended, laws aren't going to stop that. You need elections to stop that. The problem is that people keep voting for politicians who abuse that power and use it in ways that it was never meant for.

> _" I hold out hope that the Trump administration serves to the left as a > demonstration of the merits of limited government"_

It mostly serves as a demonstration of the dangers of governmental overreach, and the dangers of voting for the party that put this government in power.

It's a bit weird to suggest that the party behind it is innocent of their own overreach or abuse of power and blame it all on the laws, when it's the government that makes the laws, executes them, and in this case twists them into the opposite of what they're meant for.

<comment><USER24> > The problem is that people keep voting for politicians who abuse that power > and use it in ways that it was never meant for.

How can we not when all of our options are going to do that, just in different ways?

<comment><USER7> What the US really needs is more than two options. The problem is that the first-past-the-post district system ensures you can't really have more than two viable parties. A different electoral system would give voters more options.

Sadly, changing the electoral system has to be done by the parties that benefit from the current system, or the voters have to miraculously all decide to vote for the same third-party option.

<comment><USER24> Absolutely. It's made worse by the two anointed parties being enshrined in state laws that provide special privileges and benefits to them and their candidates.

</comment></comment></comment></comment></comment><comment><USER25> The problems americans have with antitrust (which is one of the greatest advancements they've added to the economic theory), is that any anti-trust ruling will both destroy the influence of this company inside _and outside_ the USA.

For example, the reason Microsoft wasn't dismantled despite losing their antitrust trial, is in the wake of 9/11, USA wanted to avoid weakening their economy by dismantling their biggest pitential.

Today, USA is certainly afraid of dividing Google because it is a major influence for domination of the world. Same for Facebook. And that is perfectly logical.

USA needs to find a way to forbid the bad side-effects of trusts, while keeping their domination outside the US...

<comment><USER26> Microsoft's donation of $4.3 million to both parties as well as think tanks like Cato and Americans for Tax Reform might also have had something to do with the weak ass settlement.

<comment><USER27> $4.3M? That doesn't buy power. That buys a consultation.

<comment><USER28> You can look up how much ISPs give to politicians to see how cheap it really is. 4.3M is a royal sum.</comment></comment></comment></comment>


Palm WebOS 1.1 Restores iTunes Syncing - <AUTHOR> http://blog.palm.com/palm/2009/07/palm-webos-11-enhances-support-for-enterprise-and-beyond.html

<comment><USER2> Well lets hope they did the right thing and are trawling the iTunes library xml file instead of tricking iTunes into syncing with the Pre-I have the feeling Apple will only take so much of Palm masquerading as an iPod before smacking them down.

<comment><USER3> I just hope Apple doesn't decide to encrypt that xml file just for the sake of keeping its garden walled...

</comment></comment><comment><USER4> What a nice cat & mouse game to watch ... :-) Who wants to bet on an iTunes 8.2.2 update within a week or two? :-)

<comment><USER5> I think this is going to quickly turn into a game of chicken. Who can afford to annoy their users more with software updates?</comment></comment>


Ask HN: What legal precautions to take launching an ICO? - <AUTHOR> It seems ICO to Ether to USD = Ponzi Scheme. What precautions should be taken before and after launching an ICO? <comment><USER2> Make sure you have a strong team and an actual product or service to offer in the near future, and make sure that your token offers users the chance to prepay for that product or service and don't pitch your token as an investment vehicle, security, share in the company, etc.</comment>