
Show HN: Browsh – A modern, text-based browser - tombh
https://www.brow.sh
======
tombh
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 - see
[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.

~~~
bryanrasmussen
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.

~~~
jacquesm
This is typical for infrastructure and foundation libraries. Nobody made money
on jpeg, but jpeg powered entire industries.

~~~
C4stor
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 ?

~~~
jacquesm
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.

------
genpfault
> 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_.

~~~
mikorym
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?

~~~
pkulak
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.

~~~
mikorym
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.

------
sevensor
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.

~~~
bovermyer
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?

~~~
chaoticmass
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.

------
jhanschoo
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.

~~~
tombh
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?

------
bwag
> 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.

~~~
robrtsql
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.

~~~
tombh
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)

~~~
_dark_matter_
This sounds like your ticket to making money then. Have a hosted option.

~~~
stockkid
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.

~~~
tombh
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?

~~~
peatmoss
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.

~~~
e12e
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 - maybe
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.

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

~~~
e12e
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 - hostile
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.

------
max_likelihood
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?

~~~
tombh
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.

~~~
vinchuco
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!

~~~
tombh
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)

------
brian_
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)

~~~
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)

------
Grue3
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/)

~~~
tombh
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.

------
void_starer
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.

------
RSZC
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)?

~~~
lucb1e
Because Firefox is open source, in the same vein as this project? Just a
guess.

~~~
NikolaeVarius
Chromium is also open source

~~~
lucb1e
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.

------
mlinksva
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?

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

~~~
daleroberts
Or this one:
[https://github.com/daleroberts/tv](https://github.com/daleroberts/tv)

~~~
comesee
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.

~~~
judofyr
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)

~~~
comesee
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.

~~~
daleroberts
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)

------
alpaca128
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.

~~~
tombh
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)

------
hestefisk
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.

~~~
tombh
Wow, thanks!

------
tedmiston

        $ 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.

~~~
gbajson
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 -"?

~~~
tombh
This should be fixed in v1.3.2

------
mastrsushi
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.

~~~
bmn__
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.

------
jacquesm
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 :)

~~~
tombh
Thank you very much indeed.

------
joemi
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/)

~~~
tombh
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

------
GoToRO
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)

~~~
mirimir
That just means that someone rated it that way.

The owner ought to dispute that.

~~~
GoToRO
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.

~~~
mirimir
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.

------
textmode
"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.

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

------
drinchev
For someone stuck in the ssh demo, as myself. Ctrl+Q will exit the browser and
end the ssh connection.

------
Untit1ed
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.

~~~
WalterGR
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?

~~~
tombh
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.

------
exikyut

      $ 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.

~~~
tombh
This should be fix, let me know if you try again and it works.

------
kauegimenes
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/)

------
batat
Well, it works as expected
[https://html.brow.sh/http://motherfuckingwebsite.com/](https://html.brow.sh/http://motherfuckingwebsite.com/)

~~~
jwilk
I don't think randomly truncated sentences were expected:

    
    
      This is a motherfuc
      And it's fuckin

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

------
trepanne
This is cool. Had you not considered using a pixellated Sean Connery as the
logo?

~~~
alpb
This likely has copyright/trademark implications. :)

------
jaytaylor
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)

~~~
tombh
Nice! Very much in the same spirit :)

------
Endy
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.

~~~
tombh
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.

~~~
Endy
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.

~~~
tombh
Well bandwidth and load are irrelevant when lynx/browsh are being run on a
remote VM.

------
katzgrau
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

~~~
jasonkostempski
Except the network admin that makes the hush-hush employee website usage
reports for the boss.

~~~
e12e
Not if all they see is an ssh connection...

------
TeMPOraL
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).

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

------
enriquto
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.)

~~~
tombh
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`

~~~
enriquto
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.

~~~
tombh
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.

------
madmax96
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.

~~~
tombh
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.

------
pixelbath
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)

~~~
tombh
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!

------
aumerle
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)

~~~
tombh
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.

~~~
aumerle
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.

------
hexadecimal7e
Awesome work! Great stuff! Love from an terminal nerd here. Hope you succeed
with this project.

Question: how will it work with CAPTCHAs?

~~~
tombh
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)

------
scbrg
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 :-)

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

------
milankragujevic
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)

~~~
tombh
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)

------
beefield
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)?

~~~
tombh
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.

~~~
beefield
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.

------
davewasthere
What's with the Virus warning with the windows binary?

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

~~~
tombh
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/)

~~~
wowtip
Windows Defender says:

Trojan:Win32/Fuery.B!cl | Severe

------
stiGGG
Got rickrolled in 2018 _gnarf_ :(

~~~
keithnz
they are getting more complicated these day, the guy invented a whole browser
frontend in order to rickroll us! :)

------
zimpenfish
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.)

------
shripadk
Absolutely love the project! Also, this is probably the first time I felt
happy being Rick-rolled!

------
cJ0th
that's pretty awesome. Anyone here knows how I could install this in termux on
my android?

~~~
rotorblade
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.

~~~
cJ0th
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 :)

------
pseingatl
The MacOS "binary" version:

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

So what is it?

~~~
Tehnix
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.

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

------
degenerate
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)

~~~
tombh
Ha :D

------
aminmemon
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?

~~~
tombh
Yeah, there's a lot of improvements to be made to the rendering engine.

Sure what sort of contribution were you thinking?

------
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!

~~~
tombh
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 :)

------
path411
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.

~~~
tombh
Follow this issue: [https://github.com/browsh-
org/browsh/issues/32](https://github.com/browsh-org/browsh/issues/32)

------
raffleslodge
Not sure if it's just me but the page is down currently.

~~~
tombh
By down, do you mean this? [https://github.com/browsh-
org/browsh/issues/58](https://github.com/browsh-org/browsh/issues/58)

------
crtasm
Getting an invalid certificate error on
[https://html.brow.sh/](https://html.brow.sh/)

Sounds great, will bookmark for later.

~~~
tombh
Does that look related to this? [https://github.com/browsh-
org/browsh/issues/58](https://github.com/browsh-org/browsh/issues/58)

~~~
crtasm
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

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

------
ohiovr
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!

------
michaelmior
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.

~~~
tombh
Follow this issue to follow Vim-keys integration: [https://github.com/browsh-
org/browsh/issues/31](https://github.com/browsh-org/browsh/issues/31)

------
peter_retief
I gave it a try with debian x64 binary, got a nil pointer on a path error
/home/travis/gppath etc

~~~
tombh
Does it look related to this? [https://github.com/browsh-
org/browsh/issues/73](https://github.com/browsh-org/browsh/issues/73)

~~~
peter_retief
Yup

------
shp0ngle
Feedback:

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

~~~
tombh
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.

------
fubase
Hyper on macOS struggles quite a bit with this. It ran fine in Terminal.

------
therealmarv
no alternative to links2 which is downloading much less (airplane etc.)

~~~
tombh
I don't understand your point

~~~
therealmarv
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.

~~~
tombh
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.

------
gbajson
The idea is super cool, but unfortunately it SIGSEGVts a lot.

~~~
tombh
This should be fixed in version 1.3.2

------
ninjakeyboard
Where do I file a bug? Pornhub doesn't render properly.

~~~
hobbes78
Japanese videos still render correctly, at least the relevant parts...

------
datalus
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

~~~
tombh
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 :(

~~~
tombh
Actually it does work if you run Browsh with `browsh -with-gui`

------
rudolph9
I can’t fully articulate why but I love this!

------
hyperpallium
Which of the ARM downloads work on android?

~~~
astatine
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.

~~~
rotorblade
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.

~~~
tombh
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.

------
mullikine
This is a text automation dream coming true

------
tramtrist
running the docker over ssh got me "Failed to connect to Firefox's Marionette
within 30 seconds"

~~~
tombh
If you leave an issue on the Github repo with some debug logs and some info
about the server I can look into it.

------
fiatjaf
Amazing.

Is this relying on an external server to work?

~~~
detaro
From the GH readme, it seems like it runs a full Firefox locally in the
background and then consolifies what that renders.

~~~
tombh
Exactly

------
rabidrat
Awesome work, fellow textpunk!

------
waivek
links is the best text based browser because it has mouse support.

~~~
pininja
Browsh also has mouse support judging by the showcase video.

------
ausjke
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?

------
gfalcao
amazing, great job!!!

------
pwaai
how does it know how to convert a webpage to a ascii?

~~~
tombh
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.

~~~
enriquto
that's beautiful, where can we find this cool CSS file?

~~~
detaro
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?

~~~
enriquto
thanks! I couldn't find it

------
DidISayTooMuch
Browsh: My new way to browsh the Internet

\- Sean Connery

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

~~~
dang
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)

------
johnklos
...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.

~~~
tombh
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.

~~~
theamk
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.

~~~
tombh
Do they support SNI?

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

~~~
textmode
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.

~~~
jwilk
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
       
       […]

------
nagarc
Super

